Make z int
[deliverable/binutils-gdb.git] / gas / dw2gencfi.h
CommitLineData
54cfded0 1/* dw2gencfi.h - Support for generating Dwarf2 CFI information.
b90efa5b 2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
54cfded0
AM
3 Contributed by Michal Ludvig <mludvig@suse.cz>
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
54cfded0
AM
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
54cfded0
AM
21
22#ifndef DW2GENCFI_H
23#define DW2GENCFI_H
24
fa8f86ff 25#include "dwarf2.h"
54cfded0 26
a4447b93 27struct symbol;
54cfded0
AM
28
29extern const pseudo_typeS cfi_pseudo_table[];
30
54cfded0
AM
31/* cfi_finish() is called at the end of file. It will complain if
32 the last CFI wasn't properly closed by .cfi_endproc. */
a4447b93
RH
33extern void cfi_finish (void);
34
35/* Entry points for backends to add unwind information. */
36extern void cfi_new_fde (struct symbol *);
37extern void cfi_end_fde (struct symbol *);
38extern void cfi_set_return_column (unsigned);
2f0c68f2 39extern void cfi_set_sections (void);
a4447b93 40extern void cfi_add_advance_loc (struct symbol *);
69602580 41extern void cfi_add_label (const char *);
2be24b54 42
a4447b93
RH
43extern void cfi_add_CFA_offset (unsigned, offsetT);
44extern void cfi_add_CFA_def_cfa (unsigned, offsetT);
45extern void cfi_add_CFA_register (unsigned, unsigned);
46extern void cfi_add_CFA_def_cfa_register (unsigned);
47extern void cfi_add_CFA_def_cfa_offset (offsetT);
2be24b54
ML
48extern void cfi_add_CFA_restore (unsigned);
49extern void cfi_add_CFA_undefined (unsigned);
50extern void cfi_add_CFA_same_value (unsigned);
51extern void cfi_add_CFA_remember_state (void);
52extern void cfi_add_CFA_restore_state (void);
54cfded0 53
1bce6bd8
PB
54/* Structures for md_cfi_end. */
55
56#if defined (TE_PE) || defined (TE_PEP)
57#define SUPPORT_FRAME_LINKONCE 1
58#else
59#define SUPPORT_FRAME_LINKONCE 0
60#endif
61
2f0c68f2
CM
62#ifdef tc_cfi_reloc_for_encoding
63#define SUPPORT_COMPACT_EH 1
64#else
65#define SUPPORT_COMPACT_EH 0
66#endif
67
68#define MULTIPLE_FRAME_SECTIONS (SUPPORT_FRAME_LINKONCE || SUPPORT_COMPACT_EH)
69
1bce6bd8
PB
70struct cfi_insn_data
71{
72 struct cfi_insn_data *next;
2f0c68f2 73#if MULTIPLE_FRAME_SECTIONS
1bce6bd8
PB
74 segT cur_seg;
75#endif
76 int insn;
77 union
78 {
79 struct
80 {
81 unsigned reg;
82 offsetT offset;
83 } ri;
84
85 struct
86 {
87 unsigned reg1;
88 unsigned reg2;
89 } rr;
90
91 unsigned r;
92 offsetT i;
93
94 struct
95 {
96 symbolS *lab1;
97 symbolS *lab2;
98 } ll;
99
100 struct cfi_escape_data *esc;
101
102 struct
103 {
104 unsigned reg, encoding;
105 expressionS exp;
106 } ea;
69602580
JB
107
108 const char *sym_name;
1bce6bd8
PB
109 } u;
110};
111
2f0c68f2
CM
112/* An enumeration describing the Compact EH header format. The least
113 significant bit is used to distinguish the entries.
114
115 Inline Compact: Function offset [0]
116 Four chars of unwind data.
117 Out-of-line Compact: Function offset [1]
118 Compact unwind data offset [0]
119 Legacy: Function offset [1]
120 Unwind data offset [1]
121
122 The header type is initialized to EH_COMPACT_UNKNOWN until the
123 format is discovered by encountering a .fde_data entry.
124 Failure to find a .fde_data entry will cause an EH_COMPACT_LEGACY
125 header to be generated. */
126
127enum {
128 EH_COMPACT_UNKNOWN,
129 EH_COMPACT_LEGACY,
130 EH_COMPACT_INLINE,
131 EH_COMPACT_OUTLINE,
132 EH_COMPACT_OUTLINE_DONE,
133 /* Outline if .cfi_inline_lsda used, otherwise legacy FDE. */
134 EH_COMPACT_HAS_LSDA
135};
136
1bce6bd8
PB
137struct fde_entry
138{
139 struct fde_entry *next;
2f0c68f2 140#if MULTIPLE_FRAME_SECTIONS
1bce6bd8
PB
141 segT cur_seg;
142#endif
143 symbolS *start_address;
144 symbolS *end_address;
145 struct cfi_insn_data *data;
146 struct cfi_insn_data **last;
147 unsigned char per_encoding;
148 unsigned char lsda_encoding;
2f0c68f2 149 int personality_id;
1bce6bd8
PB
150 expressionS personality;
151 expressionS lsda;
152 unsigned int return_column;
153 unsigned int signal_frame;
2f0c68f2 154#if MULTIPLE_FRAME_SECTIONS
1bce6bd8
PB
155 int handled;
156#endif
2f0c68f2
CM
157 int eh_header_type;
158 /* Compact unwinding opcodes, not including the PR byte or LSDA. */
159 int eh_data_size;
160 bfd_byte *eh_data;
161 /* For out of line tables and FDEs. */
162 symbolS *eh_loc;
163 int sections;
1bce6bd8
PB
164};
165
af385746
RH
166/* The list of all FDEs that have been collected. */
167extern struct fde_entry *all_fde_data;
168
1bce6bd8
PB
169/* Fake CFI type; outside the byte range of any real CFI insn. */
170#define CFI_adjust_cfa_offset 0x100
171#define CFI_return_column 0x101
172#define CFI_rel_offset 0x102
173#define CFI_escape 0x103
174#define CFI_signal_frame 0x104
175#define CFI_val_encoded_addr 0x105
69602580 176#define CFI_label 0x106
1bce6bd8 177
2f0c68f2
CM
178/* By default emit .eh_frame only, not .debug_frame. */
179#define CFI_EMIT_eh_frame (1 << 0)
180#define CFI_EMIT_debug_frame (1 << 1)
181#define CFI_EMIT_target (1 << 2)
182#define CFI_EMIT_eh_frame_compact (1 << 3)
183
54cfded0 184#endif /* DW2GENCFI_H */
This page took 0.587405 seconds and 4 git commands to generate.