1 |
38 |
julius |
/* Output Dwarf2 format symbol table information from GCC.
|
2 |
|
|
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
3 |
|
|
2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
4 |
|
|
Contributed by Gary Funck (gary@intrepid.com).
|
5 |
|
|
Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
|
6 |
|
|
Extensively modified by Jason Merrill (jason@cygnus.com).
|
7 |
|
|
|
8 |
|
|
This file is part of GCC.
|
9 |
|
|
|
10 |
|
|
GCC is free software; you can redistribute it and/or modify it under
|
11 |
|
|
the terms of the GNU General Public License as published by the Free
|
12 |
|
|
Software Foundation; either version 3, or (at your option) any later
|
13 |
|
|
version.
|
14 |
|
|
|
15 |
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
16 |
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
17 |
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
18 |
|
|
for more details.
|
19 |
|
|
|
20 |
|
|
You should have received a copy of the GNU General Public License
|
21 |
|
|
along with GCC; see the file COPYING3. If not see
|
22 |
|
|
<http://www.gnu.org/licenses/>. */
|
23 |
|
|
|
24 |
|
|
/* TODO: Emit .debug_line header even when there are no functions, since
|
25 |
|
|
the file numbers are used by .debug_info. Alternately, leave
|
26 |
|
|
out locations for types and decls.
|
27 |
|
|
Avoid talking about ctors and op= for PODs.
|
28 |
|
|
Factor out common prologue sequences into multiple CIEs. */
|
29 |
|
|
|
30 |
|
|
/* The first part of this file deals with the DWARF 2 frame unwind
|
31 |
|
|
information, which is also used by the GCC efficient exception handling
|
32 |
|
|
mechanism. The second part, controlled only by an #ifdef
|
33 |
|
|
DWARF2_DEBUGGING_INFO, deals with the other DWARF 2 debugging
|
34 |
|
|
information. */
|
35 |
|
|
|
36 |
|
|
#include "config.h"
|
37 |
|
|
#include "system.h"
|
38 |
|
|
#include "coretypes.h"
|
39 |
|
|
#include "tm.h"
|
40 |
|
|
#include "tree.h"
|
41 |
|
|
#include "version.h"
|
42 |
|
|
#include "flags.h"
|
43 |
|
|
#include "real.h"
|
44 |
|
|
#include "rtl.h"
|
45 |
|
|
#include "hard-reg-set.h"
|
46 |
|
|
#include "regs.h"
|
47 |
|
|
#include "insn-config.h"
|
48 |
|
|
#include "reload.h"
|
49 |
|
|
#include "function.h"
|
50 |
|
|
#include "output.h"
|
51 |
|
|
#include "expr.h"
|
52 |
|
|
#include "libfuncs.h"
|
53 |
|
|
#include "except.h"
|
54 |
|
|
#include "dwarf2.h"
|
55 |
|
|
#include "dwarf2out.h"
|
56 |
|
|
#include "dwarf2asm.h"
|
57 |
|
|
#include "toplev.h"
|
58 |
|
|
#include "varray.h"
|
59 |
|
|
#include "ggc.h"
|
60 |
|
|
#include "md5.h"
|
61 |
|
|
#include "tm_p.h"
|
62 |
|
|
#include "diagnostic.h"
|
63 |
|
|
#include "debug.h"
|
64 |
|
|
#include "target.h"
|
65 |
|
|
#include "langhooks.h"
|
66 |
|
|
#include "hashtab.h"
|
67 |
|
|
#include "cgraph.h"
|
68 |
|
|
#include "input.h"
|
69 |
|
|
|
70 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
71 |
|
|
static void dwarf2out_source_line (unsigned int, const char *);
|
72 |
|
|
#endif
|
73 |
|
|
|
74 |
|
|
/* DWARF2 Abbreviation Glossary:
|
75 |
|
|
CFA = Canonical Frame Address
|
76 |
|
|
a fixed address on the stack which identifies a call frame.
|
77 |
|
|
We define it to be the value of SP just before the call insn.
|
78 |
|
|
The CFA register and offset, which may change during the course
|
79 |
|
|
of the function, are used to calculate its value at runtime.
|
80 |
|
|
CFI = Call Frame Instruction
|
81 |
|
|
an instruction for the DWARF2 abstract machine
|
82 |
|
|
CIE = Common Information Entry
|
83 |
|
|
information describing information common to one or more FDEs
|
84 |
|
|
DIE = Debugging Information Entry
|
85 |
|
|
FDE = Frame Description Entry
|
86 |
|
|
information describing the stack call frame, in particular,
|
87 |
|
|
how to restore registers
|
88 |
|
|
|
89 |
|
|
DW_CFA_... = DWARF2 CFA call frame instruction
|
90 |
|
|
DW_TAG_... = DWARF2 DIE tag */
|
91 |
|
|
|
92 |
|
|
#ifndef DWARF2_FRAME_INFO
|
93 |
|
|
# ifdef DWARF2_DEBUGGING_INFO
|
94 |
|
|
# define DWARF2_FRAME_INFO \
|
95 |
|
|
(write_symbols == DWARF2_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG)
|
96 |
|
|
# else
|
97 |
|
|
# define DWARF2_FRAME_INFO 0
|
98 |
|
|
# endif
|
99 |
|
|
#endif
|
100 |
|
|
|
101 |
|
|
/* Map register numbers held in the call frame info that gcc has
|
102 |
|
|
collected using DWARF_FRAME_REGNUM to those that should be output in
|
103 |
|
|
.debug_frame and .eh_frame. */
|
104 |
|
|
#ifndef DWARF2_FRAME_REG_OUT
|
105 |
|
|
#define DWARF2_FRAME_REG_OUT(REGNO, FOR_EH) (REGNO)
|
106 |
|
|
#endif
|
107 |
|
|
|
108 |
|
|
/* Decide whether we want to emit frame unwind information for the current
|
109 |
|
|
translation unit. */
|
110 |
|
|
|
111 |
|
|
int
|
112 |
|
|
dwarf2out_do_frame (void)
|
113 |
|
|
{
|
114 |
|
|
/* We want to emit correct CFA location expressions or lists, so we
|
115 |
|
|
have to return true if we're going to output debug info, even if
|
116 |
|
|
we're not going to output frame or unwind info. */
|
117 |
|
|
return (write_symbols == DWARF2_DEBUG
|
118 |
|
|
|| write_symbols == VMS_AND_DWARF2_DEBUG
|
119 |
|
|
|| DWARF2_FRAME_INFO
|
120 |
|
|
#ifdef DWARF2_UNWIND_INFO
|
121 |
|
|
|| (DWARF2_UNWIND_INFO
|
122 |
|
|
&& (flag_unwind_tables
|
123 |
|
|
|| (flag_exceptions && ! USING_SJLJ_EXCEPTIONS)))
|
124 |
|
|
#endif
|
125 |
|
|
);
|
126 |
|
|
}
|
127 |
|
|
|
128 |
|
|
/* The size of the target's pointer type. */
|
129 |
|
|
#ifndef PTR_SIZE
|
130 |
|
|
#define PTR_SIZE (POINTER_SIZE / BITS_PER_UNIT)
|
131 |
|
|
#endif
|
132 |
|
|
|
133 |
|
|
/* Array of RTXes referenced by the debugging information, which therefore
|
134 |
|
|
must be kept around forever. */
|
135 |
|
|
static GTY(()) VEC(rtx,gc) *used_rtx_array;
|
136 |
|
|
|
137 |
|
|
/* A pointer to the base of a list of incomplete types which might be
|
138 |
|
|
completed at some later time. incomplete_types_list needs to be a
|
139 |
|
|
VEC(tree,gc) because we want to tell the garbage collector about
|
140 |
|
|
it. */
|
141 |
|
|
static GTY(()) VEC(tree,gc) *incomplete_types;
|
142 |
|
|
|
143 |
|
|
/* A pointer to the base of a table of references to declaration
|
144 |
|
|
scopes. This table is a display which tracks the nesting
|
145 |
|
|
of declaration scopes at the current scope and containing
|
146 |
|
|
scopes. This table is used to find the proper place to
|
147 |
|
|
define type declaration DIE's. */
|
148 |
|
|
static GTY(()) VEC(tree,gc) *decl_scope_table;
|
149 |
|
|
|
150 |
|
|
/* Pointers to various DWARF2 sections. */
|
151 |
|
|
static GTY(()) section *debug_info_section;
|
152 |
|
|
static GTY(()) section *debug_abbrev_section;
|
153 |
|
|
static GTY(()) section *debug_aranges_section;
|
154 |
|
|
static GTY(()) section *debug_macinfo_section;
|
155 |
|
|
static GTY(()) section *debug_line_section;
|
156 |
|
|
static GTY(()) section *debug_loc_section;
|
157 |
|
|
static GTY(()) section *debug_pubnames_section;
|
158 |
|
|
static GTY(()) section *debug_str_section;
|
159 |
|
|
static GTY(()) section *debug_ranges_section;
|
160 |
|
|
static GTY(()) section *debug_frame_section;
|
161 |
|
|
|
162 |
|
|
/* How to start an assembler comment. */
|
163 |
|
|
#ifndef ASM_COMMENT_START
|
164 |
|
|
#define ASM_COMMENT_START ";#"
|
165 |
|
|
#endif
|
166 |
|
|
|
167 |
|
|
typedef struct dw_cfi_struct *dw_cfi_ref;
|
168 |
|
|
typedef struct dw_fde_struct *dw_fde_ref;
|
169 |
|
|
typedef union dw_cfi_oprnd_struct *dw_cfi_oprnd_ref;
|
170 |
|
|
|
171 |
|
|
/* Call frames are described using a sequence of Call Frame
|
172 |
|
|
Information instructions. The register number, offset
|
173 |
|
|
and address fields are provided as possible operands;
|
174 |
|
|
their use is selected by the opcode field. */
|
175 |
|
|
|
176 |
|
|
enum dw_cfi_oprnd_type {
|
177 |
|
|
dw_cfi_oprnd_unused,
|
178 |
|
|
dw_cfi_oprnd_reg_num,
|
179 |
|
|
dw_cfi_oprnd_offset,
|
180 |
|
|
dw_cfi_oprnd_addr,
|
181 |
|
|
dw_cfi_oprnd_loc
|
182 |
|
|
};
|
183 |
|
|
|
184 |
|
|
typedef union dw_cfi_oprnd_struct GTY(())
|
185 |
|
|
{
|
186 |
|
|
unsigned int GTY ((tag ("dw_cfi_oprnd_reg_num"))) dw_cfi_reg_num;
|
187 |
|
|
HOST_WIDE_INT GTY ((tag ("dw_cfi_oprnd_offset"))) dw_cfi_offset;
|
188 |
|
|
const char * GTY ((tag ("dw_cfi_oprnd_addr"))) dw_cfi_addr;
|
189 |
|
|
struct dw_loc_descr_struct * GTY ((tag ("dw_cfi_oprnd_loc"))) dw_cfi_loc;
|
190 |
|
|
}
|
191 |
|
|
dw_cfi_oprnd;
|
192 |
|
|
|
193 |
|
|
typedef struct dw_cfi_struct GTY(())
|
194 |
|
|
{
|
195 |
|
|
dw_cfi_ref dw_cfi_next;
|
196 |
|
|
enum dwarf_call_frame_info dw_cfi_opc;
|
197 |
|
|
dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd1_desc (%1.dw_cfi_opc)")))
|
198 |
|
|
dw_cfi_oprnd1;
|
199 |
|
|
dw_cfi_oprnd GTY ((desc ("dw_cfi_oprnd2_desc (%1.dw_cfi_opc)")))
|
200 |
|
|
dw_cfi_oprnd2;
|
201 |
|
|
}
|
202 |
|
|
dw_cfi_node;
|
203 |
|
|
|
204 |
|
|
/* This is how we define the location of the CFA. We use to handle it
|
205 |
|
|
as REG + OFFSET all the time, but now it can be more complex.
|
206 |
|
|
It can now be either REG + CFA_OFFSET or *(REG + BASE_OFFSET) + CFA_OFFSET.
|
207 |
|
|
Instead of passing around REG and OFFSET, we pass a copy
|
208 |
|
|
of this structure. */
|
209 |
|
|
typedef struct cfa_loc GTY(())
|
210 |
|
|
{
|
211 |
|
|
HOST_WIDE_INT offset;
|
212 |
|
|
HOST_WIDE_INT base_offset;
|
213 |
|
|
unsigned int reg;
|
214 |
|
|
int indirect; /* 1 if CFA is accessed via a dereference. */
|
215 |
|
|
} dw_cfa_location;
|
216 |
|
|
|
217 |
|
|
/* All call frame descriptions (FDE's) in the GCC generated DWARF
|
218 |
|
|
refer to a single Common Information Entry (CIE), defined at
|
219 |
|
|
the beginning of the .debug_frame section. This use of a single
|
220 |
|
|
CIE obviates the need to keep track of multiple CIE's
|
221 |
|
|
in the DWARF generation routines below. */
|
222 |
|
|
|
223 |
|
|
typedef struct dw_fde_struct GTY(())
|
224 |
|
|
{
|
225 |
|
|
tree decl;
|
226 |
|
|
const char *dw_fde_begin;
|
227 |
|
|
const char *dw_fde_current_label;
|
228 |
|
|
const char *dw_fde_end;
|
229 |
|
|
const char *dw_fde_hot_section_label;
|
230 |
|
|
const char *dw_fde_hot_section_end_label;
|
231 |
|
|
const char *dw_fde_unlikely_section_label;
|
232 |
|
|
const char *dw_fde_unlikely_section_end_label;
|
233 |
|
|
bool dw_fde_switched_sections;
|
234 |
|
|
dw_cfi_ref dw_fde_cfi;
|
235 |
|
|
unsigned funcdef_number;
|
236 |
|
|
unsigned all_throwers_are_sibcalls : 1;
|
237 |
|
|
unsigned nothrow : 1;
|
238 |
|
|
unsigned uses_eh_lsda : 1;
|
239 |
|
|
}
|
240 |
|
|
dw_fde_node;
|
241 |
|
|
|
242 |
|
|
/* Maximum size (in bytes) of an artificially generated label. */
|
243 |
|
|
#define MAX_ARTIFICIAL_LABEL_BYTES 30
|
244 |
|
|
|
245 |
|
|
/* The size of addresses as they appear in the Dwarf 2 data.
|
246 |
|
|
Some architectures use word addresses to refer to code locations,
|
247 |
|
|
but Dwarf 2 info always uses byte addresses. On such machines,
|
248 |
|
|
Dwarf 2 addresses need to be larger than the architecture's
|
249 |
|
|
pointers. */
|
250 |
|
|
#ifndef DWARF2_ADDR_SIZE
|
251 |
|
|
#define DWARF2_ADDR_SIZE (POINTER_SIZE / BITS_PER_UNIT)
|
252 |
|
|
#endif
|
253 |
|
|
|
254 |
|
|
/* The size in bytes of a DWARF field indicating an offset or length
|
255 |
|
|
relative to a debug info section, specified to be 4 bytes in the
|
256 |
|
|
DWARF-2 specification. The SGI/MIPS ABI defines it to be the same
|
257 |
|
|
as PTR_SIZE. */
|
258 |
|
|
|
259 |
|
|
#ifndef DWARF_OFFSET_SIZE
|
260 |
|
|
#define DWARF_OFFSET_SIZE 4
|
261 |
|
|
#endif
|
262 |
|
|
|
263 |
|
|
/* According to the (draft) DWARF 3 specification, the initial length
|
264 |
|
|
should either be 4 or 12 bytes. When it's 12 bytes, the first 4
|
265 |
|
|
bytes are 0xffffffff, followed by the length stored in the next 8
|
266 |
|
|
bytes.
|
267 |
|
|
|
268 |
|
|
However, the SGI/MIPS ABI uses an initial length which is equal to
|
269 |
|
|
DWARF_OFFSET_SIZE. It is defined (elsewhere) accordingly. */
|
270 |
|
|
|
271 |
|
|
#ifndef DWARF_INITIAL_LENGTH_SIZE
|
272 |
|
|
#define DWARF_INITIAL_LENGTH_SIZE (DWARF_OFFSET_SIZE == 4 ? 4 : 12)
|
273 |
|
|
#endif
|
274 |
|
|
|
275 |
|
|
#define DWARF_VERSION 2
|
276 |
|
|
|
277 |
|
|
/* Round SIZE up to the nearest BOUNDARY. */
|
278 |
|
|
#define DWARF_ROUND(SIZE,BOUNDARY) \
|
279 |
|
|
((((SIZE) + (BOUNDARY) - 1) / (BOUNDARY)) * (BOUNDARY))
|
280 |
|
|
|
281 |
|
|
/* Offsets recorded in opcodes are a multiple of this alignment factor. */
|
282 |
|
|
#ifndef DWARF_CIE_DATA_ALIGNMENT
|
283 |
|
|
#ifdef STACK_GROWS_DOWNWARD
|
284 |
|
|
#define DWARF_CIE_DATA_ALIGNMENT (-((int) UNITS_PER_WORD))
|
285 |
|
|
#else
|
286 |
|
|
#define DWARF_CIE_DATA_ALIGNMENT ((int) UNITS_PER_WORD)
|
287 |
|
|
#endif
|
288 |
|
|
#endif
|
289 |
|
|
|
290 |
|
|
/* CIE identifier. */
|
291 |
|
|
#if HOST_BITS_PER_WIDE_INT >= 64
|
292 |
|
|
#define DWARF_CIE_ID \
|
293 |
|
|
(unsigned HOST_WIDE_INT) (DWARF_OFFSET_SIZE == 4 ? DW_CIE_ID : DW64_CIE_ID)
|
294 |
|
|
#else
|
295 |
|
|
#define DWARF_CIE_ID DW_CIE_ID
|
296 |
|
|
#endif
|
297 |
|
|
|
298 |
|
|
/* A pointer to the base of a table that contains frame description
|
299 |
|
|
information for each routine. */
|
300 |
|
|
static GTY((length ("fde_table_allocated"))) dw_fde_ref fde_table;
|
301 |
|
|
|
302 |
|
|
/* Number of elements currently allocated for fde_table. */
|
303 |
|
|
static GTY(()) unsigned fde_table_allocated;
|
304 |
|
|
|
305 |
|
|
/* Number of elements in fde_table currently in use. */
|
306 |
|
|
static GTY(()) unsigned fde_table_in_use;
|
307 |
|
|
|
308 |
|
|
/* Size (in elements) of increments by which we may expand the
|
309 |
|
|
fde_table. */
|
310 |
|
|
#define FDE_TABLE_INCREMENT 256
|
311 |
|
|
|
312 |
|
|
/* A list of call frame insns for the CIE. */
|
313 |
|
|
static GTY(()) dw_cfi_ref cie_cfi_head;
|
314 |
|
|
|
315 |
|
|
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
|
316 |
|
|
/* Some DWARF extensions (e.g., MIPS/SGI) implement a subprogram
|
317 |
|
|
attribute that accelerates the lookup of the FDE associated
|
318 |
|
|
with the subprogram. This variable holds the table index of the FDE
|
319 |
|
|
associated with the current function (body) definition. */
|
320 |
|
|
static unsigned current_funcdef_fde;
|
321 |
|
|
#endif
|
322 |
|
|
|
323 |
|
|
struct indirect_string_node GTY(())
|
324 |
|
|
{
|
325 |
|
|
const char *str;
|
326 |
|
|
unsigned int refcount;
|
327 |
|
|
unsigned int form;
|
328 |
|
|
char *label;
|
329 |
|
|
};
|
330 |
|
|
|
331 |
|
|
static GTY ((param_is (struct indirect_string_node))) htab_t debug_str_hash;
|
332 |
|
|
|
333 |
|
|
static GTY(()) int dw2_string_counter;
|
334 |
|
|
static GTY(()) unsigned long dwarf2out_cfi_label_num;
|
335 |
|
|
|
336 |
|
|
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
|
337 |
|
|
|
338 |
|
|
/* Forward declarations for functions defined in this file. */
|
339 |
|
|
|
340 |
|
|
static char *stripattributes (const char *);
|
341 |
|
|
static const char *dwarf_cfi_name (unsigned);
|
342 |
|
|
static dw_cfi_ref new_cfi (void);
|
343 |
|
|
static void add_cfi (dw_cfi_ref *, dw_cfi_ref);
|
344 |
|
|
static void add_fde_cfi (const char *, dw_cfi_ref);
|
345 |
|
|
static void lookup_cfa_1 (dw_cfi_ref, dw_cfa_location *);
|
346 |
|
|
static void lookup_cfa (dw_cfa_location *);
|
347 |
|
|
static void reg_save (const char *, unsigned, unsigned, HOST_WIDE_INT);
|
348 |
|
|
static void initial_return_save (rtx);
|
349 |
|
|
static HOST_WIDE_INT stack_adjust_offset (rtx);
|
350 |
|
|
static void output_cfi (dw_cfi_ref, dw_fde_ref, int);
|
351 |
|
|
static void output_call_frame_info (int);
|
352 |
|
|
static void dwarf2out_stack_adjust (rtx, bool);
|
353 |
|
|
static void flush_queued_reg_saves (void);
|
354 |
|
|
static bool clobbers_queued_reg_save (rtx);
|
355 |
|
|
static void dwarf2out_frame_debug_expr (rtx, const char *);
|
356 |
|
|
|
357 |
|
|
/* Support for complex CFA locations. */
|
358 |
|
|
static void output_cfa_loc (dw_cfi_ref);
|
359 |
|
|
static void get_cfa_from_loc_descr (dw_cfa_location *,
|
360 |
|
|
struct dw_loc_descr_struct *);
|
361 |
|
|
static struct dw_loc_descr_struct *build_cfa_loc
|
362 |
|
|
(dw_cfa_location *, HOST_WIDE_INT);
|
363 |
|
|
static void def_cfa_1 (const char *, dw_cfa_location *);
|
364 |
|
|
|
365 |
|
|
/* How to start an assembler comment. */
|
366 |
|
|
#ifndef ASM_COMMENT_START
|
367 |
|
|
#define ASM_COMMENT_START ";#"
|
368 |
|
|
#endif
|
369 |
|
|
|
370 |
|
|
/* Data and reference forms for relocatable data. */
|
371 |
|
|
#define DW_FORM_data (DWARF_OFFSET_SIZE == 8 ? DW_FORM_data8 : DW_FORM_data4)
|
372 |
|
|
#define DW_FORM_ref (DWARF_OFFSET_SIZE == 8 ? DW_FORM_ref8 : DW_FORM_ref4)
|
373 |
|
|
|
374 |
|
|
#ifndef DEBUG_FRAME_SECTION
|
375 |
|
|
#define DEBUG_FRAME_SECTION ".debug_frame"
|
376 |
|
|
#endif
|
377 |
|
|
|
378 |
|
|
#ifndef FUNC_BEGIN_LABEL
|
379 |
|
|
#define FUNC_BEGIN_LABEL "LFB"
|
380 |
|
|
#endif
|
381 |
|
|
|
382 |
|
|
#ifndef FUNC_END_LABEL
|
383 |
|
|
#define FUNC_END_LABEL "LFE"
|
384 |
|
|
#endif
|
385 |
|
|
|
386 |
|
|
#ifndef FRAME_BEGIN_LABEL
|
387 |
|
|
#define FRAME_BEGIN_LABEL "Lframe"
|
388 |
|
|
#endif
|
389 |
|
|
#define CIE_AFTER_SIZE_LABEL "LSCIE"
|
390 |
|
|
#define CIE_END_LABEL "LECIE"
|
391 |
|
|
#define FDE_LABEL "LSFDE"
|
392 |
|
|
#define FDE_AFTER_SIZE_LABEL "LASFDE"
|
393 |
|
|
#define FDE_END_LABEL "LEFDE"
|
394 |
|
|
#define LINE_NUMBER_BEGIN_LABEL "LSLT"
|
395 |
|
|
#define LINE_NUMBER_END_LABEL "LELT"
|
396 |
|
|
#define LN_PROLOG_AS_LABEL "LASLTP"
|
397 |
|
|
#define LN_PROLOG_END_LABEL "LELTP"
|
398 |
|
|
#define DIE_LABEL_PREFIX "DW"
|
399 |
|
|
|
400 |
|
|
/* The DWARF 2 CFA column which tracks the return address. Normally this
|
401 |
|
|
is the column for PC, or the first column after all of the hard
|
402 |
|
|
registers. */
|
403 |
|
|
#ifndef DWARF_FRAME_RETURN_COLUMN
|
404 |
|
|
#ifdef PC_REGNUM
|
405 |
|
|
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (PC_REGNUM)
|
406 |
|
|
#else
|
407 |
|
|
#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGISTERS
|
408 |
|
|
#endif
|
409 |
|
|
#endif
|
410 |
|
|
|
411 |
|
|
/* The mapping from gcc register number to DWARF 2 CFA column number. By
|
412 |
|
|
default, we just provide columns for all registers. */
|
413 |
|
|
#ifndef DWARF_FRAME_REGNUM
|
414 |
|
|
#define DWARF_FRAME_REGNUM(REG) DBX_REGISTER_NUMBER (REG)
|
415 |
|
|
#endif
|
416 |
|
|
|
417 |
|
|
/* Hook used by __throw. */
|
418 |
|
|
|
419 |
|
|
rtx
|
420 |
|
|
expand_builtin_dwarf_sp_column (void)
|
421 |
|
|
{
|
422 |
|
|
unsigned int dwarf_regnum = DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM);
|
423 |
|
|
return GEN_INT (DWARF2_FRAME_REG_OUT (dwarf_regnum, 1));
|
424 |
|
|
}
|
425 |
|
|
|
426 |
|
|
/* Return a pointer to a copy of the section string name S with all
|
427 |
|
|
attributes stripped off, and an asterisk prepended (for assemble_name). */
|
428 |
|
|
|
429 |
|
|
static inline char *
|
430 |
|
|
stripattributes (const char *s)
|
431 |
|
|
{
|
432 |
|
|
char *stripped = XNEWVEC (char, strlen (s) + 2);
|
433 |
|
|
char *p = stripped;
|
434 |
|
|
|
435 |
|
|
*p++ = '*';
|
436 |
|
|
|
437 |
|
|
while (*s && *s != ',')
|
438 |
|
|
*p++ = *s++;
|
439 |
|
|
|
440 |
|
|
*p = '\0';
|
441 |
|
|
return stripped;
|
442 |
|
|
}
|
443 |
|
|
|
444 |
|
|
/* Generate code to initialize the register size table. */
|
445 |
|
|
|
446 |
|
|
void
|
447 |
|
|
expand_builtin_init_dwarf_reg_sizes (tree address)
|
448 |
|
|
{
|
449 |
|
|
unsigned int i;
|
450 |
|
|
enum machine_mode mode = TYPE_MODE (char_type_node);
|
451 |
|
|
rtx addr = expand_normal (address);
|
452 |
|
|
rtx mem = gen_rtx_MEM (BLKmode, addr);
|
453 |
|
|
bool wrote_return_column = false;
|
454 |
|
|
|
455 |
|
|
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
|
456 |
|
|
{
|
457 |
|
|
int rnum = DWARF2_FRAME_REG_OUT (DWARF_FRAME_REGNUM (i), 1);
|
458 |
|
|
|
459 |
|
|
if (rnum < DWARF_FRAME_REGISTERS)
|
460 |
|
|
{
|
461 |
|
|
HOST_WIDE_INT offset = rnum * GET_MODE_SIZE (mode);
|
462 |
|
|
enum machine_mode save_mode = reg_raw_mode[i];
|
463 |
|
|
HOST_WIDE_INT size;
|
464 |
|
|
|
465 |
|
|
if (HARD_REGNO_CALL_PART_CLOBBERED (i, save_mode))
|
466 |
|
|
save_mode = choose_hard_reg_mode (i, 1, true);
|
467 |
|
|
if (DWARF_FRAME_REGNUM (i) == DWARF_FRAME_RETURN_COLUMN)
|
468 |
|
|
{
|
469 |
|
|
if (save_mode == VOIDmode)
|
470 |
|
|
continue;
|
471 |
|
|
wrote_return_column = true;
|
472 |
|
|
}
|
473 |
|
|
size = GET_MODE_SIZE (save_mode);
|
474 |
|
|
if (offset < 0)
|
475 |
|
|
continue;
|
476 |
|
|
|
477 |
|
|
emit_move_insn (adjust_address (mem, mode, offset),
|
478 |
|
|
gen_int_mode (size, mode));
|
479 |
|
|
}
|
480 |
|
|
}
|
481 |
|
|
|
482 |
|
|
#ifdef DWARF_ALT_FRAME_RETURN_COLUMN
|
483 |
|
|
gcc_assert (wrote_return_column);
|
484 |
|
|
i = DWARF_ALT_FRAME_RETURN_COLUMN;
|
485 |
|
|
wrote_return_column = false;
|
486 |
|
|
#else
|
487 |
|
|
i = DWARF_FRAME_RETURN_COLUMN;
|
488 |
|
|
#endif
|
489 |
|
|
|
490 |
|
|
if (! wrote_return_column)
|
491 |
|
|
{
|
492 |
|
|
enum machine_mode save_mode = Pmode;
|
493 |
|
|
HOST_WIDE_INT offset = i * GET_MODE_SIZE (mode);
|
494 |
|
|
HOST_WIDE_INT size = GET_MODE_SIZE (save_mode);
|
495 |
|
|
emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size));
|
496 |
|
|
}
|
497 |
|
|
}
|
498 |
|
|
|
499 |
|
|
/* Convert a DWARF call frame info. operation to its string name */
|
500 |
|
|
|
501 |
|
|
static const char *
|
502 |
|
|
dwarf_cfi_name (unsigned int cfi_opc)
|
503 |
|
|
{
|
504 |
|
|
switch (cfi_opc)
|
505 |
|
|
{
|
506 |
|
|
case DW_CFA_advance_loc:
|
507 |
|
|
return "DW_CFA_advance_loc";
|
508 |
|
|
case DW_CFA_offset:
|
509 |
|
|
return "DW_CFA_offset";
|
510 |
|
|
case DW_CFA_restore:
|
511 |
|
|
return "DW_CFA_restore";
|
512 |
|
|
case DW_CFA_nop:
|
513 |
|
|
return "DW_CFA_nop";
|
514 |
|
|
case DW_CFA_set_loc:
|
515 |
|
|
return "DW_CFA_set_loc";
|
516 |
|
|
case DW_CFA_advance_loc1:
|
517 |
|
|
return "DW_CFA_advance_loc1";
|
518 |
|
|
case DW_CFA_advance_loc2:
|
519 |
|
|
return "DW_CFA_advance_loc2";
|
520 |
|
|
case DW_CFA_advance_loc4:
|
521 |
|
|
return "DW_CFA_advance_loc4";
|
522 |
|
|
case DW_CFA_offset_extended:
|
523 |
|
|
return "DW_CFA_offset_extended";
|
524 |
|
|
case DW_CFA_restore_extended:
|
525 |
|
|
return "DW_CFA_restore_extended";
|
526 |
|
|
case DW_CFA_undefined:
|
527 |
|
|
return "DW_CFA_undefined";
|
528 |
|
|
case DW_CFA_same_value:
|
529 |
|
|
return "DW_CFA_same_value";
|
530 |
|
|
case DW_CFA_register:
|
531 |
|
|
return "DW_CFA_register";
|
532 |
|
|
case DW_CFA_remember_state:
|
533 |
|
|
return "DW_CFA_remember_state";
|
534 |
|
|
case DW_CFA_restore_state:
|
535 |
|
|
return "DW_CFA_restore_state";
|
536 |
|
|
case DW_CFA_def_cfa:
|
537 |
|
|
return "DW_CFA_def_cfa";
|
538 |
|
|
case DW_CFA_def_cfa_register:
|
539 |
|
|
return "DW_CFA_def_cfa_register";
|
540 |
|
|
case DW_CFA_def_cfa_offset:
|
541 |
|
|
return "DW_CFA_def_cfa_offset";
|
542 |
|
|
|
543 |
|
|
/* DWARF 3 */
|
544 |
|
|
case DW_CFA_def_cfa_expression:
|
545 |
|
|
return "DW_CFA_def_cfa_expression";
|
546 |
|
|
case DW_CFA_expression:
|
547 |
|
|
return "DW_CFA_expression";
|
548 |
|
|
case DW_CFA_offset_extended_sf:
|
549 |
|
|
return "DW_CFA_offset_extended_sf";
|
550 |
|
|
case DW_CFA_def_cfa_sf:
|
551 |
|
|
return "DW_CFA_def_cfa_sf";
|
552 |
|
|
case DW_CFA_def_cfa_offset_sf:
|
553 |
|
|
return "DW_CFA_def_cfa_offset_sf";
|
554 |
|
|
|
555 |
|
|
/* SGI/MIPS specific */
|
556 |
|
|
case DW_CFA_MIPS_advance_loc8:
|
557 |
|
|
return "DW_CFA_MIPS_advance_loc8";
|
558 |
|
|
|
559 |
|
|
/* GNU extensions */
|
560 |
|
|
case DW_CFA_GNU_window_save:
|
561 |
|
|
return "DW_CFA_GNU_window_save";
|
562 |
|
|
case DW_CFA_GNU_args_size:
|
563 |
|
|
return "DW_CFA_GNU_args_size";
|
564 |
|
|
case DW_CFA_GNU_negative_offset_extended:
|
565 |
|
|
return "DW_CFA_GNU_negative_offset_extended";
|
566 |
|
|
|
567 |
|
|
default:
|
568 |
|
|
return "DW_CFA_<unknown>";
|
569 |
|
|
}
|
570 |
|
|
}
|
571 |
|
|
|
572 |
|
|
/* Return a pointer to a newly allocated Call Frame Instruction. */
|
573 |
|
|
|
574 |
|
|
static inline dw_cfi_ref
|
575 |
|
|
new_cfi (void)
|
576 |
|
|
{
|
577 |
|
|
dw_cfi_ref cfi = ggc_alloc (sizeof (dw_cfi_node));
|
578 |
|
|
|
579 |
|
|
cfi->dw_cfi_next = NULL;
|
580 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_reg_num = 0;
|
581 |
|
|
cfi->dw_cfi_oprnd2.dw_cfi_reg_num = 0;
|
582 |
|
|
|
583 |
|
|
return cfi;
|
584 |
|
|
}
|
585 |
|
|
|
586 |
|
|
/* Add a Call Frame Instruction to list of instructions. */
|
587 |
|
|
|
588 |
|
|
static inline void
|
589 |
|
|
add_cfi (dw_cfi_ref *list_head, dw_cfi_ref cfi)
|
590 |
|
|
{
|
591 |
|
|
dw_cfi_ref *p;
|
592 |
|
|
|
593 |
|
|
/* Find the end of the chain. */
|
594 |
|
|
for (p = list_head; (*p) != NULL; p = &(*p)->dw_cfi_next)
|
595 |
|
|
;
|
596 |
|
|
|
597 |
|
|
*p = cfi;
|
598 |
|
|
}
|
599 |
|
|
|
600 |
|
|
/* Generate a new label for the CFI info to refer to. */
|
601 |
|
|
|
602 |
|
|
char *
|
603 |
|
|
dwarf2out_cfi_label (void)
|
604 |
|
|
{
|
605 |
|
|
static char label[20];
|
606 |
|
|
|
607 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, "LCFI", dwarf2out_cfi_label_num++);
|
608 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, label);
|
609 |
|
|
return label;
|
610 |
|
|
}
|
611 |
|
|
|
612 |
|
|
/* Add CFI to the current fde at the PC value indicated by LABEL if specified,
|
613 |
|
|
or to the CIE if LABEL is NULL. */
|
614 |
|
|
|
615 |
|
|
static void
|
616 |
|
|
add_fde_cfi (const char *label, dw_cfi_ref cfi)
|
617 |
|
|
{
|
618 |
|
|
if (label)
|
619 |
|
|
{
|
620 |
|
|
dw_fde_ref fde = &fde_table[fde_table_in_use - 1];
|
621 |
|
|
|
622 |
|
|
if (*label == 0)
|
623 |
|
|
label = dwarf2out_cfi_label ();
|
624 |
|
|
|
625 |
|
|
if (fde->dw_fde_current_label == NULL
|
626 |
|
|
|| strcmp (label, fde->dw_fde_current_label) != 0)
|
627 |
|
|
{
|
628 |
|
|
dw_cfi_ref xcfi;
|
629 |
|
|
|
630 |
|
|
label = xstrdup (label);
|
631 |
|
|
|
632 |
|
|
/* Set the location counter to the new label. */
|
633 |
|
|
xcfi = new_cfi ();
|
634 |
|
|
/* If we have a current label, advance from there, otherwise
|
635 |
|
|
set the location directly using set_loc. */
|
636 |
|
|
xcfi->dw_cfi_opc = fde->dw_fde_current_label
|
637 |
|
|
? DW_CFA_advance_loc4
|
638 |
|
|
: DW_CFA_set_loc;
|
639 |
|
|
xcfi->dw_cfi_oprnd1.dw_cfi_addr = label;
|
640 |
|
|
add_cfi (&fde->dw_fde_cfi, xcfi);
|
641 |
|
|
|
642 |
|
|
fde->dw_fde_current_label = label;
|
643 |
|
|
}
|
644 |
|
|
|
645 |
|
|
add_cfi (&fde->dw_fde_cfi, cfi);
|
646 |
|
|
}
|
647 |
|
|
|
648 |
|
|
else
|
649 |
|
|
add_cfi (&cie_cfi_head, cfi);
|
650 |
|
|
}
|
651 |
|
|
|
652 |
|
|
/* Subroutine of lookup_cfa. */
|
653 |
|
|
|
654 |
|
|
static void
|
655 |
|
|
lookup_cfa_1 (dw_cfi_ref cfi, dw_cfa_location *loc)
|
656 |
|
|
{
|
657 |
|
|
switch (cfi->dw_cfi_opc)
|
658 |
|
|
{
|
659 |
|
|
case DW_CFA_def_cfa_offset:
|
660 |
|
|
loc->offset = cfi->dw_cfi_oprnd1.dw_cfi_offset;
|
661 |
|
|
break;
|
662 |
|
|
case DW_CFA_def_cfa_offset_sf:
|
663 |
|
|
loc->offset
|
664 |
|
|
= cfi->dw_cfi_oprnd1.dw_cfi_offset * DWARF_CIE_DATA_ALIGNMENT;
|
665 |
|
|
break;
|
666 |
|
|
case DW_CFA_def_cfa_register:
|
667 |
|
|
loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
|
668 |
|
|
break;
|
669 |
|
|
case DW_CFA_def_cfa:
|
670 |
|
|
loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
|
671 |
|
|
loc->offset = cfi->dw_cfi_oprnd2.dw_cfi_offset;
|
672 |
|
|
break;
|
673 |
|
|
case DW_CFA_def_cfa_sf:
|
674 |
|
|
loc->reg = cfi->dw_cfi_oprnd1.dw_cfi_reg_num;
|
675 |
|
|
loc->offset
|
676 |
|
|
= cfi->dw_cfi_oprnd2.dw_cfi_offset * DWARF_CIE_DATA_ALIGNMENT;
|
677 |
|
|
break;
|
678 |
|
|
case DW_CFA_def_cfa_expression:
|
679 |
|
|
get_cfa_from_loc_descr (loc, cfi->dw_cfi_oprnd1.dw_cfi_loc);
|
680 |
|
|
break;
|
681 |
|
|
default:
|
682 |
|
|
break;
|
683 |
|
|
}
|
684 |
|
|
}
|
685 |
|
|
|
686 |
|
|
/* Find the previous value for the CFA. */
|
687 |
|
|
|
688 |
|
|
static void
|
689 |
|
|
lookup_cfa (dw_cfa_location *loc)
|
690 |
|
|
{
|
691 |
|
|
dw_cfi_ref cfi;
|
692 |
|
|
|
693 |
|
|
loc->reg = INVALID_REGNUM;
|
694 |
|
|
loc->offset = 0;
|
695 |
|
|
loc->indirect = 0;
|
696 |
|
|
loc->base_offset = 0;
|
697 |
|
|
|
698 |
|
|
for (cfi = cie_cfi_head; cfi; cfi = cfi->dw_cfi_next)
|
699 |
|
|
lookup_cfa_1 (cfi, loc);
|
700 |
|
|
|
701 |
|
|
if (fde_table_in_use)
|
702 |
|
|
{
|
703 |
|
|
dw_fde_ref fde = &fde_table[fde_table_in_use - 1];
|
704 |
|
|
for (cfi = fde->dw_fde_cfi; cfi; cfi = cfi->dw_cfi_next)
|
705 |
|
|
lookup_cfa_1 (cfi, loc);
|
706 |
|
|
}
|
707 |
|
|
}
|
708 |
|
|
|
709 |
|
|
/* The current rule for calculating the DWARF2 canonical frame address. */
|
710 |
|
|
static dw_cfa_location cfa;
|
711 |
|
|
|
712 |
|
|
/* The register used for saving registers to the stack, and its offset
|
713 |
|
|
from the CFA. */
|
714 |
|
|
static dw_cfa_location cfa_store;
|
715 |
|
|
|
716 |
|
|
/* The running total of the size of arguments pushed onto the stack. */
|
717 |
|
|
static HOST_WIDE_INT args_size;
|
718 |
|
|
|
719 |
|
|
/* The last args_size we actually output. */
|
720 |
|
|
static HOST_WIDE_INT old_args_size;
|
721 |
|
|
|
722 |
|
|
/* Entry point to update the canonical frame address (CFA).
|
723 |
|
|
LABEL is passed to add_fde_cfi. The value of CFA is now to be
|
724 |
|
|
calculated from REG+OFFSET. */
|
725 |
|
|
|
726 |
|
|
void
|
727 |
|
|
dwarf2out_def_cfa (const char *label, unsigned int reg, HOST_WIDE_INT offset)
|
728 |
|
|
{
|
729 |
|
|
dw_cfa_location loc;
|
730 |
|
|
loc.indirect = 0;
|
731 |
|
|
loc.base_offset = 0;
|
732 |
|
|
loc.reg = reg;
|
733 |
|
|
loc.offset = offset;
|
734 |
|
|
def_cfa_1 (label, &loc);
|
735 |
|
|
}
|
736 |
|
|
|
737 |
|
|
/* Determine if two dw_cfa_location structures define the same data. */
|
738 |
|
|
|
739 |
|
|
static bool
|
740 |
|
|
cfa_equal_p (const dw_cfa_location *loc1, const dw_cfa_location *loc2)
|
741 |
|
|
{
|
742 |
|
|
return (loc1->reg == loc2->reg
|
743 |
|
|
&& loc1->offset == loc2->offset
|
744 |
|
|
&& loc1->indirect == loc2->indirect
|
745 |
|
|
&& (loc1->indirect == 0
|
746 |
|
|
|| loc1->base_offset == loc2->base_offset));
|
747 |
|
|
}
|
748 |
|
|
|
749 |
|
|
/* This routine does the actual work. The CFA is now calculated from
|
750 |
|
|
the dw_cfa_location structure. */
|
751 |
|
|
|
752 |
|
|
static void
|
753 |
|
|
def_cfa_1 (const char *label, dw_cfa_location *loc_p)
|
754 |
|
|
{
|
755 |
|
|
dw_cfi_ref cfi;
|
756 |
|
|
dw_cfa_location old_cfa, loc;
|
757 |
|
|
|
758 |
|
|
cfa = *loc_p;
|
759 |
|
|
loc = *loc_p;
|
760 |
|
|
|
761 |
|
|
if (cfa_store.reg == loc.reg && loc.indirect == 0)
|
762 |
|
|
cfa_store.offset = loc.offset;
|
763 |
|
|
|
764 |
|
|
loc.reg = DWARF_FRAME_REGNUM (loc.reg);
|
765 |
|
|
lookup_cfa (&old_cfa);
|
766 |
|
|
|
767 |
|
|
/* If nothing changed, no need to issue any call frame instructions. */
|
768 |
|
|
if (cfa_equal_p (&loc, &old_cfa))
|
769 |
|
|
return;
|
770 |
|
|
|
771 |
|
|
cfi = new_cfi ();
|
772 |
|
|
|
773 |
|
|
if (loc.reg == old_cfa.reg && !loc.indirect)
|
774 |
|
|
{
|
775 |
|
|
/* Construct a "DW_CFA_def_cfa_offset <offset>" instruction, indicating
|
776 |
|
|
the CFA register did not change but the offset did. */
|
777 |
|
|
if (loc.offset < 0)
|
778 |
|
|
{
|
779 |
|
|
HOST_WIDE_INT f_offset = loc.offset / DWARF_CIE_DATA_ALIGNMENT;
|
780 |
|
|
gcc_assert (f_offset * DWARF_CIE_DATA_ALIGNMENT == loc.offset);
|
781 |
|
|
|
782 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa_offset_sf;
|
783 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_offset = f_offset;
|
784 |
|
|
}
|
785 |
|
|
else
|
786 |
|
|
{
|
787 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa_offset;
|
788 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_offset = loc.offset;
|
789 |
|
|
}
|
790 |
|
|
}
|
791 |
|
|
|
792 |
|
|
#ifndef MIPS_DEBUGGING_INFO /* SGI dbx thinks this means no offset. */
|
793 |
|
|
else if (loc.offset == old_cfa.offset
|
794 |
|
|
&& old_cfa.reg != INVALID_REGNUM
|
795 |
|
|
&& !loc.indirect)
|
796 |
|
|
{
|
797 |
|
|
/* Construct a "DW_CFA_def_cfa_register <register>" instruction,
|
798 |
|
|
indicating the CFA register has changed to <register> but the
|
799 |
|
|
offset has not changed. */
|
800 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa_register;
|
801 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg;
|
802 |
|
|
}
|
803 |
|
|
#endif
|
804 |
|
|
|
805 |
|
|
else if (loc.indirect == 0)
|
806 |
|
|
{
|
807 |
|
|
/* Construct a "DW_CFA_def_cfa <register> <offset>" instruction,
|
808 |
|
|
indicating the CFA register has changed to <register> with
|
809 |
|
|
the specified offset. */
|
810 |
|
|
if (loc.offset < 0)
|
811 |
|
|
{
|
812 |
|
|
HOST_WIDE_INT f_offset = loc.offset / DWARF_CIE_DATA_ALIGNMENT;
|
813 |
|
|
gcc_assert (f_offset * DWARF_CIE_DATA_ALIGNMENT == loc.offset);
|
814 |
|
|
|
815 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa_sf;
|
816 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg;
|
817 |
|
|
cfi->dw_cfi_oprnd2.dw_cfi_offset = f_offset;
|
818 |
|
|
}
|
819 |
|
|
else
|
820 |
|
|
{
|
821 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa;
|
822 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_reg_num = loc.reg;
|
823 |
|
|
cfi->dw_cfi_oprnd2.dw_cfi_offset = loc.offset;
|
824 |
|
|
}
|
825 |
|
|
}
|
826 |
|
|
else
|
827 |
|
|
{
|
828 |
|
|
/* Construct a DW_CFA_def_cfa_expression instruction to
|
829 |
|
|
calculate the CFA using a full location expression since no
|
830 |
|
|
register-offset pair is available. */
|
831 |
|
|
struct dw_loc_descr_struct *loc_list;
|
832 |
|
|
|
833 |
|
|
cfi->dw_cfi_opc = DW_CFA_def_cfa_expression;
|
834 |
|
|
loc_list = build_cfa_loc (&loc, 0);
|
835 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_loc = loc_list;
|
836 |
|
|
}
|
837 |
|
|
|
838 |
|
|
add_fde_cfi (label, cfi);
|
839 |
|
|
}
|
840 |
|
|
|
841 |
|
|
/* Add the CFI for saving a register. REG is the CFA column number.
|
842 |
|
|
LABEL is passed to add_fde_cfi.
|
843 |
|
|
If SREG is -1, the register is saved at OFFSET from the CFA;
|
844 |
|
|
otherwise it is saved in SREG. */
|
845 |
|
|
|
846 |
|
|
static void
|
847 |
|
|
reg_save (const char *label, unsigned int reg, unsigned int sreg, HOST_WIDE_INT offset)
|
848 |
|
|
{
|
849 |
|
|
dw_cfi_ref cfi = new_cfi ();
|
850 |
|
|
|
851 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_reg_num = reg;
|
852 |
|
|
|
853 |
|
|
if (sreg == INVALID_REGNUM)
|
854 |
|
|
{
|
855 |
|
|
if (reg & ~0x3f)
|
856 |
|
|
/* The register number won't fit in 6 bits, so we have to use
|
857 |
|
|
the long form. */
|
858 |
|
|
cfi->dw_cfi_opc = DW_CFA_offset_extended;
|
859 |
|
|
else
|
860 |
|
|
cfi->dw_cfi_opc = DW_CFA_offset;
|
861 |
|
|
|
862 |
|
|
#ifdef ENABLE_CHECKING
|
863 |
|
|
{
|
864 |
|
|
/* If we get an offset that is not a multiple of
|
865 |
|
|
DWARF_CIE_DATA_ALIGNMENT, there is either a bug in the
|
866 |
|
|
definition of DWARF_CIE_DATA_ALIGNMENT, or a bug in the machine
|
867 |
|
|
description. */
|
868 |
|
|
HOST_WIDE_INT check_offset = offset / DWARF_CIE_DATA_ALIGNMENT;
|
869 |
|
|
|
870 |
|
|
gcc_assert (check_offset * DWARF_CIE_DATA_ALIGNMENT == offset);
|
871 |
|
|
}
|
872 |
|
|
#endif
|
873 |
|
|
offset /= DWARF_CIE_DATA_ALIGNMENT;
|
874 |
|
|
if (offset < 0)
|
875 |
|
|
cfi->dw_cfi_opc = DW_CFA_offset_extended_sf;
|
876 |
|
|
|
877 |
|
|
cfi->dw_cfi_oprnd2.dw_cfi_offset = offset;
|
878 |
|
|
}
|
879 |
|
|
else if (sreg == reg)
|
880 |
|
|
cfi->dw_cfi_opc = DW_CFA_same_value;
|
881 |
|
|
else
|
882 |
|
|
{
|
883 |
|
|
cfi->dw_cfi_opc = DW_CFA_register;
|
884 |
|
|
cfi->dw_cfi_oprnd2.dw_cfi_reg_num = sreg;
|
885 |
|
|
}
|
886 |
|
|
|
887 |
|
|
add_fde_cfi (label, cfi);
|
888 |
|
|
}
|
889 |
|
|
|
890 |
|
|
/* Add the CFI for saving a register window. LABEL is passed to reg_save.
|
891 |
|
|
This CFI tells the unwinder that it needs to restore the window registers
|
892 |
|
|
from the previous frame's window save area.
|
893 |
|
|
|
894 |
|
|
??? Perhaps we should note in the CIE where windows are saved (instead of
|
895 |
|
|
assuming 0(cfa)) and what registers are in the window. */
|
896 |
|
|
|
897 |
|
|
void
|
898 |
|
|
dwarf2out_window_save (const char *label)
|
899 |
|
|
{
|
900 |
|
|
dw_cfi_ref cfi = new_cfi ();
|
901 |
|
|
|
902 |
|
|
cfi->dw_cfi_opc = DW_CFA_GNU_window_save;
|
903 |
|
|
add_fde_cfi (label, cfi);
|
904 |
|
|
}
|
905 |
|
|
|
906 |
|
|
/* Add a CFI to update the running total of the size of arguments
|
907 |
|
|
pushed onto the stack. */
|
908 |
|
|
|
909 |
|
|
void
|
910 |
|
|
dwarf2out_args_size (const char *label, HOST_WIDE_INT size)
|
911 |
|
|
{
|
912 |
|
|
dw_cfi_ref cfi;
|
913 |
|
|
|
914 |
|
|
if (size == old_args_size)
|
915 |
|
|
return;
|
916 |
|
|
|
917 |
|
|
old_args_size = size;
|
918 |
|
|
|
919 |
|
|
cfi = new_cfi ();
|
920 |
|
|
cfi->dw_cfi_opc = DW_CFA_GNU_args_size;
|
921 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_offset = size;
|
922 |
|
|
add_fde_cfi (label, cfi);
|
923 |
|
|
}
|
924 |
|
|
|
925 |
|
|
/* Entry point for saving a register to the stack. REG is the GCC register
|
926 |
|
|
number. LABEL and OFFSET are passed to reg_save. */
|
927 |
|
|
|
928 |
|
|
void
|
929 |
|
|
dwarf2out_reg_save (const char *label, unsigned int reg, HOST_WIDE_INT offset)
|
930 |
|
|
{
|
931 |
|
|
reg_save (label, DWARF_FRAME_REGNUM (reg), INVALID_REGNUM, offset);
|
932 |
|
|
}
|
933 |
|
|
|
934 |
|
|
/* Entry point for saving the return address in the stack.
|
935 |
|
|
LABEL and OFFSET are passed to reg_save. */
|
936 |
|
|
|
937 |
|
|
void
|
938 |
|
|
dwarf2out_return_save (const char *label, HOST_WIDE_INT offset)
|
939 |
|
|
{
|
940 |
|
|
reg_save (label, DWARF_FRAME_RETURN_COLUMN, INVALID_REGNUM, offset);
|
941 |
|
|
}
|
942 |
|
|
|
943 |
|
|
/* Entry point for saving the return address in a register.
|
944 |
|
|
LABEL and SREG are passed to reg_save. */
|
945 |
|
|
|
946 |
|
|
void
|
947 |
|
|
dwarf2out_return_reg (const char *label, unsigned int sreg)
|
948 |
|
|
{
|
949 |
|
|
reg_save (label, DWARF_FRAME_RETURN_COLUMN, DWARF_FRAME_REGNUM (sreg), 0);
|
950 |
|
|
}
|
951 |
|
|
|
952 |
|
|
/* Record the initial position of the return address. RTL is
|
953 |
|
|
INCOMING_RETURN_ADDR_RTX. */
|
954 |
|
|
|
955 |
|
|
static void
|
956 |
|
|
initial_return_save (rtx rtl)
|
957 |
|
|
{
|
958 |
|
|
unsigned int reg = INVALID_REGNUM;
|
959 |
|
|
HOST_WIDE_INT offset = 0;
|
960 |
|
|
|
961 |
|
|
switch (GET_CODE (rtl))
|
962 |
|
|
{
|
963 |
|
|
case REG:
|
964 |
|
|
/* RA is in a register. */
|
965 |
|
|
reg = DWARF_FRAME_REGNUM (REGNO (rtl));
|
966 |
|
|
break;
|
967 |
|
|
|
968 |
|
|
case MEM:
|
969 |
|
|
/* RA is on the stack. */
|
970 |
|
|
rtl = XEXP (rtl, 0);
|
971 |
|
|
switch (GET_CODE (rtl))
|
972 |
|
|
{
|
973 |
|
|
case REG:
|
974 |
|
|
gcc_assert (REGNO (rtl) == STACK_POINTER_REGNUM);
|
975 |
|
|
offset = 0;
|
976 |
|
|
break;
|
977 |
|
|
|
978 |
|
|
case PLUS:
|
979 |
|
|
gcc_assert (REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM);
|
980 |
|
|
offset = INTVAL (XEXP (rtl, 1));
|
981 |
|
|
break;
|
982 |
|
|
|
983 |
|
|
case MINUS:
|
984 |
|
|
gcc_assert (REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM);
|
985 |
|
|
offset = -INTVAL (XEXP (rtl, 1));
|
986 |
|
|
break;
|
987 |
|
|
|
988 |
|
|
default:
|
989 |
|
|
gcc_unreachable ();
|
990 |
|
|
}
|
991 |
|
|
|
992 |
|
|
break;
|
993 |
|
|
|
994 |
|
|
case PLUS:
|
995 |
|
|
/* The return address is at some offset from any value we can
|
996 |
|
|
actually load. For instance, on the SPARC it is in %i7+8. Just
|
997 |
|
|
ignore the offset for now; it doesn't matter for unwinding frames. */
|
998 |
|
|
gcc_assert (GET_CODE (XEXP (rtl, 1)) == CONST_INT);
|
999 |
|
|
initial_return_save (XEXP (rtl, 0));
|
1000 |
|
|
return;
|
1001 |
|
|
|
1002 |
|
|
default:
|
1003 |
|
|
gcc_unreachable ();
|
1004 |
|
|
}
|
1005 |
|
|
|
1006 |
|
|
if (reg != DWARF_FRAME_RETURN_COLUMN)
|
1007 |
|
|
reg_save (NULL, DWARF_FRAME_RETURN_COLUMN, reg, offset - cfa.offset);
|
1008 |
|
|
}
|
1009 |
|
|
|
1010 |
|
|
/* Given a SET, calculate the amount of stack adjustment it
|
1011 |
|
|
contains. */
|
1012 |
|
|
|
1013 |
|
|
static HOST_WIDE_INT
|
1014 |
|
|
stack_adjust_offset (rtx pattern)
|
1015 |
|
|
{
|
1016 |
|
|
rtx src = SET_SRC (pattern);
|
1017 |
|
|
rtx dest = SET_DEST (pattern);
|
1018 |
|
|
HOST_WIDE_INT offset = 0;
|
1019 |
|
|
enum rtx_code code;
|
1020 |
|
|
|
1021 |
|
|
if (dest == stack_pointer_rtx)
|
1022 |
|
|
{
|
1023 |
|
|
/* (set (reg sp) (plus (reg sp) (const_int))) */
|
1024 |
|
|
code = GET_CODE (src);
|
1025 |
|
|
if (! (code == PLUS || code == MINUS)
|
1026 |
|
|
|| XEXP (src, 0) != stack_pointer_rtx
|
1027 |
|
|
|| GET_CODE (XEXP (src, 1)) != CONST_INT)
|
1028 |
|
|
return 0;
|
1029 |
|
|
|
1030 |
|
|
offset = INTVAL (XEXP (src, 1));
|
1031 |
|
|
if (code == PLUS)
|
1032 |
|
|
offset = -offset;
|
1033 |
|
|
}
|
1034 |
|
|
else if (MEM_P (dest))
|
1035 |
|
|
{
|
1036 |
|
|
/* (set (mem (pre_dec (reg sp))) (foo)) */
|
1037 |
|
|
src = XEXP (dest, 0);
|
1038 |
|
|
code = GET_CODE (src);
|
1039 |
|
|
|
1040 |
|
|
switch (code)
|
1041 |
|
|
{
|
1042 |
|
|
case PRE_MODIFY:
|
1043 |
|
|
case POST_MODIFY:
|
1044 |
|
|
if (XEXP (src, 0) == stack_pointer_rtx)
|
1045 |
|
|
{
|
1046 |
|
|
rtx val = XEXP (XEXP (src, 1), 1);
|
1047 |
|
|
/* We handle only adjustments by constant amount. */
|
1048 |
|
|
gcc_assert (GET_CODE (XEXP (src, 1)) == PLUS
|
1049 |
|
|
&& GET_CODE (val) == CONST_INT);
|
1050 |
|
|
offset = -INTVAL (val);
|
1051 |
|
|
break;
|
1052 |
|
|
}
|
1053 |
|
|
return 0;
|
1054 |
|
|
|
1055 |
|
|
case PRE_DEC:
|
1056 |
|
|
case POST_DEC:
|
1057 |
|
|
if (XEXP (src, 0) == stack_pointer_rtx)
|
1058 |
|
|
{
|
1059 |
|
|
offset = GET_MODE_SIZE (GET_MODE (dest));
|
1060 |
|
|
break;
|
1061 |
|
|
}
|
1062 |
|
|
return 0;
|
1063 |
|
|
|
1064 |
|
|
case PRE_INC:
|
1065 |
|
|
case POST_INC:
|
1066 |
|
|
if (XEXP (src, 0) == stack_pointer_rtx)
|
1067 |
|
|
{
|
1068 |
|
|
offset = -GET_MODE_SIZE (GET_MODE (dest));
|
1069 |
|
|
break;
|
1070 |
|
|
}
|
1071 |
|
|
return 0;
|
1072 |
|
|
|
1073 |
|
|
default:
|
1074 |
|
|
return 0;
|
1075 |
|
|
}
|
1076 |
|
|
}
|
1077 |
|
|
else
|
1078 |
|
|
return 0;
|
1079 |
|
|
|
1080 |
|
|
return offset;
|
1081 |
|
|
}
|
1082 |
|
|
|
1083 |
|
|
/* Check INSN to see if it looks like a push or a stack adjustment, and
|
1084 |
|
|
make a note of it if it does. EH uses this information to find out how
|
1085 |
|
|
much extra space it needs to pop off the stack. */
|
1086 |
|
|
|
1087 |
|
|
static void
|
1088 |
|
|
dwarf2out_stack_adjust (rtx insn, bool after_p)
|
1089 |
|
|
{
|
1090 |
|
|
HOST_WIDE_INT offset;
|
1091 |
|
|
const char *label;
|
1092 |
|
|
int i;
|
1093 |
|
|
|
1094 |
|
|
/* Don't handle epilogues at all. Certainly it would be wrong to do so
|
1095 |
|
|
with this function. Proper support would require all frame-related
|
1096 |
|
|
insns to be marked, and to be able to handle saving state around
|
1097 |
|
|
epilogues textually in the middle of the function. */
|
1098 |
|
|
if (prologue_epilogue_contains (insn) || sibcall_epilogue_contains (insn))
|
1099 |
|
|
return;
|
1100 |
|
|
|
1101 |
|
|
/* If only calls can throw, and we have a frame pointer,
|
1102 |
|
|
save up adjustments until we see the CALL_INSN. */
|
1103 |
|
|
if (!flag_asynchronous_unwind_tables && cfa.reg != STACK_POINTER_REGNUM)
|
1104 |
|
|
{
|
1105 |
|
|
if (CALL_P (insn) && !after_p)
|
1106 |
|
|
{
|
1107 |
|
|
/* Extract the size of the args from the CALL rtx itself. */
|
1108 |
|
|
insn = PATTERN (insn);
|
1109 |
|
|
if (GET_CODE (insn) == PARALLEL)
|
1110 |
|
|
insn = XVECEXP (insn, 0, 0);
|
1111 |
|
|
if (GET_CODE (insn) == SET)
|
1112 |
|
|
insn = SET_SRC (insn);
|
1113 |
|
|
gcc_assert (GET_CODE (insn) == CALL);
|
1114 |
|
|
dwarf2out_args_size ("", INTVAL (XEXP (insn, 1)));
|
1115 |
|
|
}
|
1116 |
|
|
return;
|
1117 |
|
|
}
|
1118 |
|
|
|
1119 |
|
|
if (CALL_P (insn) && !after_p)
|
1120 |
|
|
{
|
1121 |
|
|
if (!flag_asynchronous_unwind_tables)
|
1122 |
|
|
dwarf2out_args_size ("", args_size);
|
1123 |
|
|
return;
|
1124 |
|
|
}
|
1125 |
|
|
else if (BARRIER_P (insn))
|
1126 |
|
|
{
|
1127 |
|
|
/* When we see a BARRIER, we know to reset args_size to 0. Usually
|
1128 |
|
|
the compiler will have already emitted a stack adjustment, but
|
1129 |
|
|
doesn't bother for calls to noreturn functions. */
|
1130 |
|
|
#ifdef STACK_GROWS_DOWNWARD
|
1131 |
|
|
offset = -args_size;
|
1132 |
|
|
#else
|
1133 |
|
|
offset = args_size;
|
1134 |
|
|
#endif
|
1135 |
|
|
}
|
1136 |
|
|
else if (GET_CODE (PATTERN (insn)) == SET)
|
1137 |
|
|
offset = stack_adjust_offset (PATTERN (insn));
|
1138 |
|
|
else if (GET_CODE (PATTERN (insn)) == PARALLEL
|
1139 |
|
|
|| GET_CODE (PATTERN (insn)) == SEQUENCE)
|
1140 |
|
|
{
|
1141 |
|
|
/* There may be stack adjustments inside compound insns. Search
|
1142 |
|
|
for them. */
|
1143 |
|
|
for (offset = 0, i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
|
1144 |
|
|
if (GET_CODE (XVECEXP (PATTERN (insn), 0, i)) == SET)
|
1145 |
|
|
offset += stack_adjust_offset (XVECEXP (PATTERN (insn), 0, i));
|
1146 |
|
|
}
|
1147 |
|
|
else
|
1148 |
|
|
return;
|
1149 |
|
|
|
1150 |
|
|
if (offset == 0)
|
1151 |
|
|
return;
|
1152 |
|
|
|
1153 |
|
|
if (cfa.reg == STACK_POINTER_REGNUM)
|
1154 |
|
|
cfa.offset += offset;
|
1155 |
|
|
|
1156 |
|
|
#ifndef STACK_GROWS_DOWNWARD
|
1157 |
|
|
offset = -offset;
|
1158 |
|
|
#endif
|
1159 |
|
|
|
1160 |
|
|
args_size += offset;
|
1161 |
|
|
if (args_size < 0)
|
1162 |
|
|
args_size = 0;
|
1163 |
|
|
|
1164 |
|
|
label = dwarf2out_cfi_label ();
|
1165 |
|
|
def_cfa_1 (label, &cfa);
|
1166 |
|
|
if (flag_asynchronous_unwind_tables)
|
1167 |
|
|
dwarf2out_args_size (label, args_size);
|
1168 |
|
|
}
|
1169 |
|
|
|
1170 |
|
|
#endif
|
1171 |
|
|
|
1172 |
|
|
/* We delay emitting a register save until either (a) we reach the end
|
1173 |
|
|
of the prologue or (b) the register is clobbered. This clusters
|
1174 |
|
|
register saves so that there are fewer pc advances. */
|
1175 |
|
|
|
1176 |
|
|
struct queued_reg_save GTY(())
|
1177 |
|
|
{
|
1178 |
|
|
struct queued_reg_save *next;
|
1179 |
|
|
rtx reg;
|
1180 |
|
|
HOST_WIDE_INT cfa_offset;
|
1181 |
|
|
rtx saved_reg;
|
1182 |
|
|
};
|
1183 |
|
|
|
1184 |
|
|
static GTY(()) struct queued_reg_save *queued_reg_saves;
|
1185 |
|
|
|
1186 |
|
|
/* The caller's ORIG_REG is saved in SAVED_IN_REG. */
|
1187 |
|
|
struct reg_saved_in_data GTY(()) {
|
1188 |
|
|
rtx orig_reg;
|
1189 |
|
|
rtx saved_in_reg;
|
1190 |
|
|
};
|
1191 |
|
|
|
1192 |
|
|
/* A list of registers saved in other registers.
|
1193 |
|
|
The list intentionally has a small maximum capacity of 4; if your
|
1194 |
|
|
port needs more than that, you might consider implementing a
|
1195 |
|
|
more efficient data structure. */
|
1196 |
|
|
static GTY(()) struct reg_saved_in_data regs_saved_in_regs[4];
|
1197 |
|
|
static GTY(()) size_t num_regs_saved_in_regs;
|
1198 |
|
|
|
1199 |
|
|
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
|
1200 |
|
|
static const char *last_reg_save_label;
|
1201 |
|
|
|
1202 |
|
|
/* Add an entry to QUEUED_REG_SAVES saying that REG is now saved at
|
1203 |
|
|
SREG, or if SREG is NULL then it is saved at OFFSET to the CFA. */
|
1204 |
|
|
|
1205 |
|
|
static void
|
1206 |
|
|
queue_reg_save (const char *label, rtx reg, rtx sreg, HOST_WIDE_INT offset)
|
1207 |
|
|
{
|
1208 |
|
|
struct queued_reg_save *q;
|
1209 |
|
|
|
1210 |
|
|
/* Duplicates waste space, but it's also necessary to remove them
|
1211 |
|
|
for correctness, since the queue gets output in reverse
|
1212 |
|
|
order. */
|
1213 |
|
|
for (q = queued_reg_saves; q != NULL; q = q->next)
|
1214 |
|
|
if (REGNO (q->reg) == REGNO (reg))
|
1215 |
|
|
break;
|
1216 |
|
|
|
1217 |
|
|
if (q == NULL)
|
1218 |
|
|
{
|
1219 |
|
|
q = ggc_alloc (sizeof (*q));
|
1220 |
|
|
q->next = queued_reg_saves;
|
1221 |
|
|
queued_reg_saves = q;
|
1222 |
|
|
}
|
1223 |
|
|
|
1224 |
|
|
q->reg = reg;
|
1225 |
|
|
q->cfa_offset = offset;
|
1226 |
|
|
q->saved_reg = sreg;
|
1227 |
|
|
|
1228 |
|
|
last_reg_save_label = label;
|
1229 |
|
|
}
|
1230 |
|
|
|
1231 |
|
|
/* Output all the entries in QUEUED_REG_SAVES. */
|
1232 |
|
|
|
1233 |
|
|
static void
|
1234 |
|
|
flush_queued_reg_saves (void)
|
1235 |
|
|
{
|
1236 |
|
|
struct queued_reg_save *q;
|
1237 |
|
|
|
1238 |
|
|
for (q = queued_reg_saves; q; q = q->next)
|
1239 |
|
|
{
|
1240 |
|
|
size_t i;
|
1241 |
|
|
unsigned int reg, sreg;
|
1242 |
|
|
|
1243 |
|
|
for (i = 0; i < num_regs_saved_in_regs; i++)
|
1244 |
|
|
if (REGNO (regs_saved_in_regs[i].orig_reg) == REGNO (q->reg))
|
1245 |
|
|
break;
|
1246 |
|
|
if (q->saved_reg && i == num_regs_saved_in_regs)
|
1247 |
|
|
{
|
1248 |
|
|
gcc_assert (i != ARRAY_SIZE (regs_saved_in_regs));
|
1249 |
|
|
num_regs_saved_in_regs++;
|
1250 |
|
|
}
|
1251 |
|
|
if (i != num_regs_saved_in_regs)
|
1252 |
|
|
{
|
1253 |
|
|
regs_saved_in_regs[i].orig_reg = q->reg;
|
1254 |
|
|
regs_saved_in_regs[i].saved_in_reg = q->saved_reg;
|
1255 |
|
|
}
|
1256 |
|
|
|
1257 |
|
|
reg = DWARF_FRAME_REGNUM (REGNO (q->reg));
|
1258 |
|
|
if (q->saved_reg)
|
1259 |
|
|
sreg = DWARF_FRAME_REGNUM (REGNO (q->saved_reg));
|
1260 |
|
|
else
|
1261 |
|
|
sreg = INVALID_REGNUM;
|
1262 |
|
|
reg_save (last_reg_save_label, reg, sreg, q->cfa_offset);
|
1263 |
|
|
}
|
1264 |
|
|
|
1265 |
|
|
queued_reg_saves = NULL;
|
1266 |
|
|
last_reg_save_label = NULL;
|
1267 |
|
|
}
|
1268 |
|
|
|
1269 |
|
|
/* Does INSN clobber any register which QUEUED_REG_SAVES lists a saved
|
1270 |
|
|
location for? Or, does it clobber a register which we've previously
|
1271 |
|
|
said that some other register is saved in, and for which we now
|
1272 |
|
|
have a new location for? */
|
1273 |
|
|
|
1274 |
|
|
static bool
|
1275 |
|
|
clobbers_queued_reg_save (rtx insn)
|
1276 |
|
|
{
|
1277 |
|
|
struct queued_reg_save *q;
|
1278 |
|
|
|
1279 |
|
|
for (q = queued_reg_saves; q; q = q->next)
|
1280 |
|
|
{
|
1281 |
|
|
size_t i;
|
1282 |
|
|
if (modified_in_p (q->reg, insn))
|
1283 |
|
|
return true;
|
1284 |
|
|
for (i = 0; i < num_regs_saved_in_regs; i++)
|
1285 |
|
|
if (REGNO (q->reg) == REGNO (regs_saved_in_regs[i].orig_reg)
|
1286 |
|
|
&& modified_in_p (regs_saved_in_regs[i].saved_in_reg, insn))
|
1287 |
|
|
return true;
|
1288 |
|
|
}
|
1289 |
|
|
|
1290 |
|
|
return false;
|
1291 |
|
|
}
|
1292 |
|
|
|
1293 |
|
|
/* Entry point for saving the first register into the second. */
|
1294 |
|
|
|
1295 |
|
|
void
|
1296 |
|
|
dwarf2out_reg_save_reg (const char *label, rtx reg, rtx sreg)
|
1297 |
|
|
{
|
1298 |
|
|
size_t i;
|
1299 |
|
|
unsigned int regno, sregno;
|
1300 |
|
|
|
1301 |
|
|
for (i = 0; i < num_regs_saved_in_regs; i++)
|
1302 |
|
|
if (REGNO (regs_saved_in_regs[i].orig_reg) == REGNO (reg))
|
1303 |
|
|
break;
|
1304 |
|
|
if (i == num_regs_saved_in_regs)
|
1305 |
|
|
{
|
1306 |
|
|
gcc_assert (i != ARRAY_SIZE (regs_saved_in_regs));
|
1307 |
|
|
num_regs_saved_in_regs++;
|
1308 |
|
|
}
|
1309 |
|
|
regs_saved_in_regs[i].orig_reg = reg;
|
1310 |
|
|
regs_saved_in_regs[i].saved_in_reg = sreg;
|
1311 |
|
|
|
1312 |
|
|
regno = DWARF_FRAME_REGNUM (REGNO (reg));
|
1313 |
|
|
sregno = DWARF_FRAME_REGNUM (REGNO (sreg));
|
1314 |
|
|
reg_save (label, regno, sregno, 0);
|
1315 |
|
|
}
|
1316 |
|
|
|
1317 |
|
|
/* What register, if any, is currently saved in REG? */
|
1318 |
|
|
|
1319 |
|
|
static rtx
|
1320 |
|
|
reg_saved_in (rtx reg)
|
1321 |
|
|
{
|
1322 |
|
|
unsigned int regn = REGNO (reg);
|
1323 |
|
|
size_t i;
|
1324 |
|
|
struct queued_reg_save *q;
|
1325 |
|
|
|
1326 |
|
|
for (q = queued_reg_saves; q; q = q->next)
|
1327 |
|
|
if (q->saved_reg && regn == REGNO (q->saved_reg))
|
1328 |
|
|
return q->reg;
|
1329 |
|
|
|
1330 |
|
|
for (i = 0; i < num_regs_saved_in_regs; i++)
|
1331 |
|
|
if (regs_saved_in_regs[i].saved_in_reg
|
1332 |
|
|
&& regn == REGNO (regs_saved_in_regs[i].saved_in_reg))
|
1333 |
|
|
return regs_saved_in_regs[i].orig_reg;
|
1334 |
|
|
|
1335 |
|
|
return NULL_RTX;
|
1336 |
|
|
}
|
1337 |
|
|
|
1338 |
|
|
|
1339 |
|
|
/* A temporary register holding an integral value used in adjusting SP
|
1340 |
|
|
or setting up the store_reg. The "offset" field holds the integer
|
1341 |
|
|
value, not an offset. */
|
1342 |
|
|
static dw_cfa_location cfa_temp;
|
1343 |
|
|
|
1344 |
|
|
/* Record call frame debugging information for an expression EXPR,
|
1345 |
|
|
which either sets SP or FP (adjusting how we calculate the frame
|
1346 |
|
|
address) or saves a register to the stack or another register.
|
1347 |
|
|
LABEL indicates the address of EXPR.
|
1348 |
|
|
|
1349 |
|
|
This function encodes a state machine mapping rtxes to actions on
|
1350 |
|
|
cfa, cfa_store, and cfa_temp.reg. We describe these rules so
|
1351 |
|
|
users need not read the source code.
|
1352 |
|
|
|
1353 |
|
|
The High-Level Picture
|
1354 |
|
|
|
1355 |
|
|
Changes in the register we use to calculate the CFA: Currently we
|
1356 |
|
|
assume that if you copy the CFA register into another register, we
|
1357 |
|
|
should take the other one as the new CFA register; this seems to
|
1358 |
|
|
work pretty well. If it's wrong for some target, it's simple
|
1359 |
|
|
enough not to set RTX_FRAME_RELATED_P on the insn in question.
|
1360 |
|
|
|
1361 |
|
|
Changes in the register we use for saving registers to the stack:
|
1362 |
|
|
This is usually SP, but not always. Again, we deduce that if you
|
1363 |
|
|
copy SP into another register (and SP is not the CFA register),
|
1364 |
|
|
then the new register is the one we will be using for register
|
1365 |
|
|
saves. This also seems to work.
|
1366 |
|
|
|
1367 |
|
|
Register saves: There's not much guesswork about this one; if
|
1368 |
|
|
RTX_FRAME_RELATED_P is set on an insn which modifies memory, it's a
|
1369 |
|
|
register save, and the register used to calculate the destination
|
1370 |
|
|
had better be the one we think we're using for this purpose.
|
1371 |
|
|
It's also assumed that a copy from a call-saved register to another
|
1372 |
|
|
register is saving that register if RTX_FRAME_RELATED_P is set on
|
1373 |
|
|
that instruction. If the copy is from a call-saved register to
|
1374 |
|
|
the *same* register, that means that the register is now the same
|
1375 |
|
|
value as in the caller.
|
1376 |
|
|
|
1377 |
|
|
Except: If the register being saved is the CFA register, and the
|
1378 |
|
|
offset is nonzero, we are saving the CFA, so we assume we have to
|
1379 |
|
|
use DW_CFA_def_cfa_expression. If the offset is 0, we assume that
|
1380 |
|
|
the intent is to save the value of SP from the previous frame.
|
1381 |
|
|
|
1382 |
|
|
In addition, if a register has previously been saved to a different
|
1383 |
|
|
register,
|
1384 |
|
|
|
1385 |
|
|
Invariants / Summaries of Rules
|
1386 |
|
|
|
1387 |
|
|
cfa current rule for calculating the CFA. It usually
|
1388 |
|
|
consists of a register and an offset.
|
1389 |
|
|
cfa_store register used by prologue code to save things to the stack
|
1390 |
|
|
cfa_store.offset is the offset from the value of
|
1391 |
|
|
cfa_store.reg to the actual CFA
|
1392 |
|
|
cfa_temp register holding an integral value. cfa_temp.offset
|
1393 |
|
|
stores the value, which will be used to adjust the
|
1394 |
|
|
stack pointer. cfa_temp is also used like cfa_store,
|
1395 |
|
|
to track stores to the stack via fp or a temp reg.
|
1396 |
|
|
|
1397 |
|
|
Rules 1- 4: Setting a register's value to cfa.reg or an expression
|
1398 |
|
|
with cfa.reg as the first operand changes the cfa.reg and its
|
1399 |
|
|
cfa.offset. Rule 1 and 4 also set cfa_temp.reg and
|
1400 |
|
|
cfa_temp.offset.
|
1401 |
|
|
|
1402 |
|
|
Rules 6- 9: Set a non-cfa.reg register value to a constant or an
|
1403 |
|
|
expression yielding a constant. This sets cfa_temp.reg
|
1404 |
|
|
and cfa_temp.offset.
|
1405 |
|
|
|
1406 |
|
|
Rule 5: Create a new register cfa_store used to save items to the
|
1407 |
|
|
stack.
|
1408 |
|
|
|
1409 |
|
|
Rules 10-14: Save a register to the stack. Define offset as the
|
1410 |
|
|
difference of the original location and cfa_store's
|
1411 |
|
|
location (or cfa_temp's location if cfa_temp is used).
|
1412 |
|
|
|
1413 |
|
|
The Rules
|
1414 |
|
|
|
1415 |
|
|
"{a,b}" indicates a choice of a xor b.
|
1416 |
|
|
"<reg>:cfa.reg" indicates that <reg> must equal cfa.reg.
|
1417 |
|
|
|
1418 |
|
|
Rule 1:
|
1419 |
|
|
(set <reg1> <reg2>:cfa.reg)
|
1420 |
|
|
effects: cfa.reg = <reg1>
|
1421 |
|
|
cfa.offset unchanged
|
1422 |
|
|
cfa_temp.reg = <reg1>
|
1423 |
|
|
cfa_temp.offset = cfa.offset
|
1424 |
|
|
|
1425 |
|
|
Rule 2:
|
1426 |
|
|
(set sp ({minus,plus,losum} {sp,fp}:cfa.reg
|
1427 |
|
|
{<const_int>,<reg>:cfa_temp.reg}))
|
1428 |
|
|
effects: cfa.reg = sp if fp used
|
1429 |
|
|
cfa.offset += {+/- <const_int>, cfa_temp.offset} if cfa.reg==sp
|
1430 |
|
|
cfa_store.offset += {+/- <const_int>, cfa_temp.offset}
|
1431 |
|
|
if cfa_store.reg==sp
|
1432 |
|
|
|
1433 |
|
|
Rule 3:
|
1434 |
|
|
(set fp ({minus,plus,losum} <reg>:cfa.reg <const_int>))
|
1435 |
|
|
effects: cfa.reg = fp
|
1436 |
|
|
cfa_offset += +/- <const_int>
|
1437 |
|
|
|
1438 |
|
|
Rule 4:
|
1439 |
|
|
(set <reg1> ({plus,losum} <reg2>:cfa.reg <const_int>))
|
1440 |
|
|
constraints: <reg1> != fp
|
1441 |
|
|
<reg1> != sp
|
1442 |
|
|
effects: cfa.reg = <reg1>
|
1443 |
|
|
cfa_temp.reg = <reg1>
|
1444 |
|
|
cfa_temp.offset = cfa.offset
|
1445 |
|
|
|
1446 |
|
|
Rule 5:
|
1447 |
|
|
(set <reg1> (plus <reg2>:cfa_temp.reg sp:cfa.reg))
|
1448 |
|
|
constraints: <reg1> != fp
|
1449 |
|
|
<reg1> != sp
|
1450 |
|
|
effects: cfa_store.reg = <reg1>
|
1451 |
|
|
cfa_store.offset = cfa.offset - cfa_temp.offset
|
1452 |
|
|
|
1453 |
|
|
Rule 6:
|
1454 |
|
|
(set <reg> <const_int>)
|
1455 |
|
|
effects: cfa_temp.reg = <reg>
|
1456 |
|
|
cfa_temp.offset = <const_int>
|
1457 |
|
|
|
1458 |
|
|
Rule 7:
|
1459 |
|
|
(set <reg1>:cfa_temp.reg (ior <reg2>:cfa_temp.reg <const_int>))
|
1460 |
|
|
effects: cfa_temp.reg = <reg1>
|
1461 |
|
|
cfa_temp.offset |= <const_int>
|
1462 |
|
|
|
1463 |
|
|
Rule 8:
|
1464 |
|
|
(set <reg> (high <exp>))
|
1465 |
|
|
effects: none
|
1466 |
|
|
|
1467 |
|
|
Rule 9:
|
1468 |
|
|
(set <reg> (lo_sum <exp> <const_int>))
|
1469 |
|
|
effects: cfa_temp.reg = <reg>
|
1470 |
|
|
cfa_temp.offset = <const_int>
|
1471 |
|
|
|
1472 |
|
|
Rule 10:
|
1473 |
|
|
(set (mem (pre_modify sp:cfa_store (???? <reg1> <const_int>))) <reg2>)
|
1474 |
|
|
effects: cfa_store.offset -= <const_int>
|
1475 |
|
|
cfa.offset = cfa_store.offset if cfa.reg == sp
|
1476 |
|
|
cfa.reg = sp
|
1477 |
|
|
cfa.base_offset = -cfa_store.offset
|
1478 |
|
|
|
1479 |
|
|
Rule 11:
|
1480 |
|
|
(set (mem ({pre_inc,pre_dec} sp:cfa_store.reg)) <reg>)
|
1481 |
|
|
effects: cfa_store.offset += -/+ mode_size(mem)
|
1482 |
|
|
cfa.offset = cfa_store.offset if cfa.reg == sp
|
1483 |
|
|
cfa.reg = sp
|
1484 |
|
|
cfa.base_offset = -cfa_store.offset
|
1485 |
|
|
|
1486 |
|
|
Rule 12:
|
1487 |
|
|
(set (mem ({minus,plus,losum} <reg1>:{cfa_store,cfa_temp} <const_int>))
|
1488 |
|
|
|
1489 |
|
|
<reg2>)
|
1490 |
|
|
effects: cfa.reg = <reg1>
|
1491 |
|
|
cfa.base_offset = -/+ <const_int> - {cfa_store,cfa_temp}.offset
|
1492 |
|
|
|
1493 |
|
|
Rule 13:
|
1494 |
|
|
(set (mem <reg1>:{cfa_store,cfa_temp}) <reg2>)
|
1495 |
|
|
effects: cfa.reg = <reg1>
|
1496 |
|
|
cfa.base_offset = -{cfa_store,cfa_temp}.offset
|
1497 |
|
|
|
1498 |
|
|
Rule 14:
|
1499 |
|
|
(set (mem (postinc <reg1>:cfa_temp <const_int>)) <reg2>)
|
1500 |
|
|
effects: cfa.reg = <reg1>
|
1501 |
|
|
cfa.base_offset = -cfa_temp.offset
|
1502 |
|
|
cfa_temp.offset -= mode_size(mem)
|
1503 |
|
|
|
1504 |
|
|
Rule 15:
|
1505 |
|
|
(set <reg> {unspec, unspec_volatile})
|
1506 |
|
|
effects: target-dependent */
|
1507 |
|
|
|
1508 |
|
|
static void
|
1509 |
|
|
dwarf2out_frame_debug_expr (rtx expr, const char *label)
|
1510 |
|
|
{
|
1511 |
|
|
rtx src, dest;
|
1512 |
|
|
HOST_WIDE_INT offset;
|
1513 |
|
|
|
1514 |
|
|
/* If RTX_FRAME_RELATED_P is set on a PARALLEL, process each member of
|
1515 |
|
|
the PARALLEL independently. The first element is always processed if
|
1516 |
|
|
it is a SET. This is for backward compatibility. Other elements
|
1517 |
|
|
are processed only if they are SETs and the RTX_FRAME_RELATED_P
|
1518 |
|
|
flag is set in them. */
|
1519 |
|
|
if (GET_CODE (expr) == PARALLEL || GET_CODE (expr) == SEQUENCE)
|
1520 |
|
|
{
|
1521 |
|
|
int par_index;
|
1522 |
|
|
int limit = XVECLEN (expr, 0);
|
1523 |
|
|
|
1524 |
|
|
for (par_index = 0; par_index < limit; par_index++)
|
1525 |
|
|
if (GET_CODE (XVECEXP (expr, 0, par_index)) == SET
|
1526 |
|
|
&& (RTX_FRAME_RELATED_P (XVECEXP (expr, 0, par_index))
|
1527 |
|
|
|| par_index == 0))
|
1528 |
|
|
dwarf2out_frame_debug_expr (XVECEXP (expr, 0, par_index), label);
|
1529 |
|
|
|
1530 |
|
|
return;
|
1531 |
|
|
}
|
1532 |
|
|
|
1533 |
|
|
gcc_assert (GET_CODE (expr) == SET);
|
1534 |
|
|
|
1535 |
|
|
src = SET_SRC (expr);
|
1536 |
|
|
dest = SET_DEST (expr);
|
1537 |
|
|
|
1538 |
|
|
if (REG_P (src))
|
1539 |
|
|
{
|
1540 |
|
|
rtx rsi = reg_saved_in (src);
|
1541 |
|
|
if (rsi)
|
1542 |
|
|
src = rsi;
|
1543 |
|
|
}
|
1544 |
|
|
|
1545 |
|
|
switch (GET_CODE (dest))
|
1546 |
|
|
{
|
1547 |
|
|
case REG:
|
1548 |
|
|
switch (GET_CODE (src))
|
1549 |
|
|
{
|
1550 |
|
|
/* Setting FP from SP. */
|
1551 |
|
|
case REG:
|
1552 |
|
|
if (cfa.reg == (unsigned) REGNO (src))
|
1553 |
|
|
{
|
1554 |
|
|
/* Rule 1 */
|
1555 |
|
|
/* Update the CFA rule wrt SP or FP. Make sure src is
|
1556 |
|
|
relative to the current CFA register.
|
1557 |
|
|
|
1558 |
|
|
We used to require that dest be either SP or FP, but the
|
1559 |
|
|
ARM copies SP to a temporary register, and from there to
|
1560 |
|
|
FP. So we just rely on the backends to only set
|
1561 |
|
|
RTX_FRAME_RELATED_P on appropriate insns. */
|
1562 |
|
|
cfa.reg = REGNO (dest);
|
1563 |
|
|
cfa_temp.reg = cfa.reg;
|
1564 |
|
|
cfa_temp.offset = cfa.offset;
|
1565 |
|
|
}
|
1566 |
|
|
else
|
1567 |
|
|
{
|
1568 |
|
|
/* Saving a register in a register. */
|
1569 |
|
|
gcc_assert (!fixed_regs [REGNO (dest)]
|
1570 |
|
|
/* For the SPARC and its register window. */
|
1571 |
|
|
|| (DWARF_FRAME_REGNUM (REGNO (src))
|
1572 |
|
|
== DWARF_FRAME_RETURN_COLUMN));
|
1573 |
|
|
queue_reg_save (label, src, dest, 0);
|
1574 |
|
|
}
|
1575 |
|
|
break;
|
1576 |
|
|
|
1577 |
|
|
case PLUS:
|
1578 |
|
|
case MINUS:
|
1579 |
|
|
case LO_SUM:
|
1580 |
|
|
if (dest == stack_pointer_rtx)
|
1581 |
|
|
{
|
1582 |
|
|
/* Rule 2 */
|
1583 |
|
|
/* Adjusting SP. */
|
1584 |
|
|
switch (GET_CODE (XEXP (src, 1)))
|
1585 |
|
|
{
|
1586 |
|
|
case CONST_INT:
|
1587 |
|
|
offset = INTVAL (XEXP (src, 1));
|
1588 |
|
|
break;
|
1589 |
|
|
case REG:
|
1590 |
|
|
gcc_assert ((unsigned) REGNO (XEXP (src, 1))
|
1591 |
|
|
== cfa_temp.reg);
|
1592 |
|
|
offset = cfa_temp.offset;
|
1593 |
|
|
break;
|
1594 |
|
|
default:
|
1595 |
|
|
gcc_unreachable ();
|
1596 |
|
|
}
|
1597 |
|
|
|
1598 |
|
|
if (XEXP (src, 0) == hard_frame_pointer_rtx)
|
1599 |
|
|
{
|
1600 |
|
|
/* Restoring SP from FP in the epilogue. */
|
1601 |
|
|
gcc_assert (cfa.reg == (unsigned) HARD_FRAME_POINTER_REGNUM);
|
1602 |
|
|
cfa.reg = STACK_POINTER_REGNUM;
|
1603 |
|
|
}
|
1604 |
|
|
else if (GET_CODE (src) == LO_SUM)
|
1605 |
|
|
/* Assume we've set the source reg of the LO_SUM from sp. */
|
1606 |
|
|
;
|
1607 |
|
|
else
|
1608 |
|
|
gcc_assert (XEXP (src, 0) == stack_pointer_rtx);
|
1609 |
|
|
|
1610 |
|
|
if (GET_CODE (src) != MINUS)
|
1611 |
|
|
offset = -offset;
|
1612 |
|
|
if (cfa.reg == STACK_POINTER_REGNUM)
|
1613 |
|
|
cfa.offset += offset;
|
1614 |
|
|
if (cfa_store.reg == STACK_POINTER_REGNUM)
|
1615 |
|
|
cfa_store.offset += offset;
|
1616 |
|
|
}
|
1617 |
|
|
else if (dest == hard_frame_pointer_rtx)
|
1618 |
|
|
{
|
1619 |
|
|
/* Rule 3 */
|
1620 |
|
|
/* Either setting the FP from an offset of the SP,
|
1621 |
|
|
or adjusting the FP */
|
1622 |
|
|
gcc_assert (frame_pointer_needed);
|
1623 |
|
|
|
1624 |
|
|
gcc_assert (REG_P (XEXP (src, 0))
|
1625 |
|
|
&& (unsigned) REGNO (XEXP (src, 0)) == cfa.reg
|
1626 |
|
|
&& GET_CODE (XEXP (src, 1)) == CONST_INT);
|
1627 |
|
|
offset = INTVAL (XEXP (src, 1));
|
1628 |
|
|
if (GET_CODE (src) != MINUS)
|
1629 |
|
|
offset = -offset;
|
1630 |
|
|
cfa.offset += offset;
|
1631 |
|
|
cfa.reg = HARD_FRAME_POINTER_REGNUM;
|
1632 |
|
|
}
|
1633 |
|
|
else
|
1634 |
|
|
{
|
1635 |
|
|
gcc_assert (GET_CODE (src) != MINUS);
|
1636 |
|
|
|
1637 |
|
|
/* Rule 4 */
|
1638 |
|
|
if (REG_P (XEXP (src, 0))
|
1639 |
|
|
&& REGNO (XEXP (src, 0)) == cfa.reg
|
1640 |
|
|
&& GET_CODE (XEXP (src, 1)) == CONST_INT)
|
1641 |
|
|
{
|
1642 |
|
|
/* Setting a temporary CFA register that will be copied
|
1643 |
|
|
into the FP later on. */
|
1644 |
|
|
offset = - INTVAL (XEXP (src, 1));
|
1645 |
|
|
cfa.offset += offset;
|
1646 |
|
|
cfa.reg = REGNO (dest);
|
1647 |
|
|
/* Or used to save regs to the stack. */
|
1648 |
|
|
cfa_temp.reg = cfa.reg;
|
1649 |
|
|
cfa_temp.offset = cfa.offset;
|
1650 |
|
|
}
|
1651 |
|
|
|
1652 |
|
|
/* Rule 5 */
|
1653 |
|
|
else if (REG_P (XEXP (src, 0))
|
1654 |
|
|
&& REGNO (XEXP (src, 0)) == cfa_temp.reg
|
1655 |
|
|
&& XEXP (src, 1) == stack_pointer_rtx)
|
1656 |
|
|
{
|
1657 |
|
|
/* Setting a scratch register that we will use instead
|
1658 |
|
|
of SP for saving registers to the stack. */
|
1659 |
|
|
gcc_assert (cfa.reg == STACK_POINTER_REGNUM);
|
1660 |
|
|
cfa_store.reg = REGNO (dest);
|
1661 |
|
|
cfa_store.offset = cfa.offset - cfa_temp.offset;
|
1662 |
|
|
}
|
1663 |
|
|
|
1664 |
|
|
/* Rule 9 */
|
1665 |
|
|
else if (GET_CODE (src) == LO_SUM
|
1666 |
|
|
&& GET_CODE (XEXP (src, 1)) == CONST_INT)
|
1667 |
|
|
{
|
1668 |
|
|
cfa_temp.reg = REGNO (dest);
|
1669 |
|
|
cfa_temp.offset = INTVAL (XEXP (src, 1));
|
1670 |
|
|
}
|
1671 |
|
|
else
|
1672 |
|
|
gcc_unreachable ();
|
1673 |
|
|
}
|
1674 |
|
|
break;
|
1675 |
|
|
|
1676 |
|
|
/* Rule 6 */
|
1677 |
|
|
case CONST_INT:
|
1678 |
|
|
cfa_temp.reg = REGNO (dest);
|
1679 |
|
|
cfa_temp.offset = INTVAL (src);
|
1680 |
|
|
break;
|
1681 |
|
|
|
1682 |
|
|
/* Rule 7 */
|
1683 |
|
|
case IOR:
|
1684 |
|
|
gcc_assert (REG_P (XEXP (src, 0))
|
1685 |
|
|
&& (unsigned) REGNO (XEXP (src, 0)) == cfa_temp.reg
|
1686 |
|
|
&& GET_CODE (XEXP (src, 1)) == CONST_INT);
|
1687 |
|
|
|
1688 |
|
|
if ((unsigned) REGNO (dest) != cfa_temp.reg)
|
1689 |
|
|
cfa_temp.reg = REGNO (dest);
|
1690 |
|
|
cfa_temp.offset |= INTVAL (XEXP (src, 1));
|
1691 |
|
|
break;
|
1692 |
|
|
|
1693 |
|
|
/* Skip over HIGH, assuming it will be followed by a LO_SUM,
|
1694 |
|
|
which will fill in all of the bits. */
|
1695 |
|
|
/* Rule 8 */
|
1696 |
|
|
case HIGH:
|
1697 |
|
|
break;
|
1698 |
|
|
|
1699 |
|
|
/* Rule 15 */
|
1700 |
|
|
case UNSPEC:
|
1701 |
|
|
case UNSPEC_VOLATILE:
|
1702 |
|
|
gcc_assert (targetm.dwarf_handle_frame_unspec);
|
1703 |
|
|
targetm.dwarf_handle_frame_unspec (label, expr, XINT (src, 1));
|
1704 |
|
|
return;
|
1705 |
|
|
|
1706 |
|
|
default:
|
1707 |
|
|
gcc_unreachable ();
|
1708 |
|
|
}
|
1709 |
|
|
|
1710 |
|
|
def_cfa_1 (label, &cfa);
|
1711 |
|
|
break;
|
1712 |
|
|
|
1713 |
|
|
case MEM:
|
1714 |
|
|
gcc_assert (REG_P (src));
|
1715 |
|
|
|
1716 |
|
|
/* Saving a register to the stack. Make sure dest is relative to the
|
1717 |
|
|
CFA register. */
|
1718 |
|
|
switch (GET_CODE (XEXP (dest, 0)))
|
1719 |
|
|
{
|
1720 |
|
|
/* Rule 10 */
|
1721 |
|
|
/* With a push. */
|
1722 |
|
|
case PRE_MODIFY:
|
1723 |
|
|
/* We can't handle variable size modifications. */
|
1724 |
|
|
gcc_assert (GET_CODE (XEXP (XEXP (XEXP (dest, 0), 1), 1))
|
1725 |
|
|
== CONST_INT);
|
1726 |
|
|
offset = -INTVAL (XEXP (XEXP (XEXP (dest, 0), 1), 1));
|
1727 |
|
|
|
1728 |
|
|
gcc_assert (REGNO (XEXP (XEXP (dest, 0), 0)) == STACK_POINTER_REGNUM
|
1729 |
|
|
&& cfa_store.reg == STACK_POINTER_REGNUM);
|
1730 |
|
|
|
1731 |
|
|
cfa_store.offset += offset;
|
1732 |
|
|
if (cfa.reg == STACK_POINTER_REGNUM)
|
1733 |
|
|
cfa.offset = cfa_store.offset;
|
1734 |
|
|
|
1735 |
|
|
offset = -cfa_store.offset;
|
1736 |
|
|
break;
|
1737 |
|
|
|
1738 |
|
|
/* Rule 11 */
|
1739 |
|
|
case PRE_INC:
|
1740 |
|
|
case PRE_DEC:
|
1741 |
|
|
offset = GET_MODE_SIZE (GET_MODE (dest));
|
1742 |
|
|
if (GET_CODE (XEXP (dest, 0)) == PRE_INC)
|
1743 |
|
|
offset = -offset;
|
1744 |
|
|
|
1745 |
|
|
gcc_assert (REGNO (XEXP (XEXP (dest, 0), 0)) == STACK_POINTER_REGNUM
|
1746 |
|
|
&& cfa_store.reg == STACK_POINTER_REGNUM);
|
1747 |
|
|
|
1748 |
|
|
cfa_store.offset += offset;
|
1749 |
|
|
if (cfa.reg == STACK_POINTER_REGNUM)
|
1750 |
|
|
cfa.offset = cfa_store.offset;
|
1751 |
|
|
|
1752 |
|
|
offset = -cfa_store.offset;
|
1753 |
|
|
break;
|
1754 |
|
|
|
1755 |
|
|
/* Rule 12 */
|
1756 |
|
|
/* With an offset. */
|
1757 |
|
|
case PLUS:
|
1758 |
|
|
case MINUS:
|
1759 |
|
|
case LO_SUM:
|
1760 |
|
|
{
|
1761 |
|
|
int regno;
|
1762 |
|
|
|
1763 |
|
|
gcc_assert (GET_CODE (XEXP (XEXP (dest, 0), 1)) == CONST_INT
|
1764 |
|
|
&& REG_P (XEXP (XEXP (dest, 0), 0)));
|
1765 |
|
|
offset = INTVAL (XEXP (XEXP (dest, 0), 1));
|
1766 |
|
|
if (GET_CODE (XEXP (dest, 0)) == MINUS)
|
1767 |
|
|
offset = -offset;
|
1768 |
|
|
|
1769 |
|
|
regno = REGNO (XEXP (XEXP (dest, 0), 0));
|
1770 |
|
|
|
1771 |
|
|
if (cfa_store.reg == (unsigned) regno)
|
1772 |
|
|
offset -= cfa_store.offset;
|
1773 |
|
|
else
|
1774 |
|
|
{
|
1775 |
|
|
gcc_assert (cfa_temp.reg == (unsigned) regno);
|
1776 |
|
|
offset -= cfa_temp.offset;
|
1777 |
|
|
}
|
1778 |
|
|
}
|
1779 |
|
|
break;
|
1780 |
|
|
|
1781 |
|
|
/* Rule 13 */
|
1782 |
|
|
/* Without an offset. */
|
1783 |
|
|
case REG:
|
1784 |
|
|
{
|
1785 |
|
|
int regno = REGNO (XEXP (dest, 0));
|
1786 |
|
|
|
1787 |
|
|
if (cfa_store.reg == (unsigned) regno)
|
1788 |
|
|
offset = -cfa_store.offset;
|
1789 |
|
|
else
|
1790 |
|
|
{
|
1791 |
|
|
gcc_assert (cfa_temp.reg == (unsigned) regno);
|
1792 |
|
|
offset = -cfa_temp.offset;
|
1793 |
|
|
}
|
1794 |
|
|
}
|
1795 |
|
|
break;
|
1796 |
|
|
|
1797 |
|
|
/* Rule 14 */
|
1798 |
|
|
case POST_INC:
|
1799 |
|
|
gcc_assert (cfa_temp.reg
|
1800 |
|
|
== (unsigned) REGNO (XEXP (XEXP (dest, 0), 0)));
|
1801 |
|
|
offset = -cfa_temp.offset;
|
1802 |
|
|
cfa_temp.offset -= GET_MODE_SIZE (GET_MODE (dest));
|
1803 |
|
|
break;
|
1804 |
|
|
|
1805 |
|
|
default:
|
1806 |
|
|
gcc_unreachable ();
|
1807 |
|
|
}
|
1808 |
|
|
|
1809 |
|
|
if (REGNO (src) != STACK_POINTER_REGNUM
|
1810 |
|
|
&& REGNO (src) != HARD_FRAME_POINTER_REGNUM
|
1811 |
|
|
&& (unsigned) REGNO (src) == cfa.reg)
|
1812 |
|
|
{
|
1813 |
|
|
/* We're storing the current CFA reg into the stack. */
|
1814 |
|
|
|
1815 |
|
|
if (cfa.offset == 0)
|
1816 |
|
|
{
|
1817 |
|
|
/* If the source register is exactly the CFA, assume
|
1818 |
|
|
we're saving SP like any other register; this happens
|
1819 |
|
|
on the ARM. */
|
1820 |
|
|
def_cfa_1 (label, &cfa);
|
1821 |
|
|
queue_reg_save (label, stack_pointer_rtx, NULL_RTX, offset);
|
1822 |
|
|
break;
|
1823 |
|
|
}
|
1824 |
|
|
else
|
1825 |
|
|
{
|
1826 |
|
|
/* Otherwise, we'll need to look in the stack to
|
1827 |
|
|
calculate the CFA. */
|
1828 |
|
|
rtx x = XEXP (dest, 0);
|
1829 |
|
|
|
1830 |
|
|
if (!REG_P (x))
|
1831 |
|
|
x = XEXP (x, 0);
|
1832 |
|
|
gcc_assert (REG_P (x));
|
1833 |
|
|
|
1834 |
|
|
cfa.reg = REGNO (x);
|
1835 |
|
|
cfa.base_offset = offset;
|
1836 |
|
|
cfa.indirect = 1;
|
1837 |
|
|
def_cfa_1 (label, &cfa);
|
1838 |
|
|
break;
|
1839 |
|
|
}
|
1840 |
|
|
}
|
1841 |
|
|
|
1842 |
|
|
def_cfa_1 (label, &cfa);
|
1843 |
|
|
queue_reg_save (label, src, NULL_RTX, offset);
|
1844 |
|
|
break;
|
1845 |
|
|
|
1846 |
|
|
default:
|
1847 |
|
|
gcc_unreachable ();
|
1848 |
|
|
}
|
1849 |
|
|
}
|
1850 |
|
|
|
1851 |
|
|
/* Record call frame debugging information for INSN, which either
|
1852 |
|
|
sets SP or FP (adjusting how we calculate the frame address) or saves a
|
1853 |
|
|
register to the stack. If INSN is NULL_RTX, initialize our state.
|
1854 |
|
|
|
1855 |
|
|
If AFTER_P is false, we're being called before the insn is emitted,
|
1856 |
|
|
otherwise after. Call instructions get invoked twice. */
|
1857 |
|
|
|
1858 |
|
|
void
|
1859 |
|
|
dwarf2out_frame_debug (rtx insn, bool after_p)
|
1860 |
|
|
{
|
1861 |
|
|
const char *label;
|
1862 |
|
|
rtx src;
|
1863 |
|
|
|
1864 |
|
|
if (insn == NULL_RTX)
|
1865 |
|
|
{
|
1866 |
|
|
size_t i;
|
1867 |
|
|
|
1868 |
|
|
/* Flush any queued register saves. */
|
1869 |
|
|
flush_queued_reg_saves ();
|
1870 |
|
|
|
1871 |
|
|
/* Set up state for generating call frame debug info. */
|
1872 |
|
|
lookup_cfa (&cfa);
|
1873 |
|
|
gcc_assert (cfa.reg
|
1874 |
|
|
== (unsigned long)DWARF_FRAME_REGNUM (STACK_POINTER_REGNUM));
|
1875 |
|
|
|
1876 |
|
|
cfa.reg = STACK_POINTER_REGNUM;
|
1877 |
|
|
cfa_store = cfa;
|
1878 |
|
|
cfa_temp.reg = -1;
|
1879 |
|
|
cfa_temp.offset = 0;
|
1880 |
|
|
|
1881 |
|
|
for (i = 0; i < num_regs_saved_in_regs; i++)
|
1882 |
|
|
{
|
1883 |
|
|
regs_saved_in_regs[i].orig_reg = NULL_RTX;
|
1884 |
|
|
regs_saved_in_regs[i].saved_in_reg = NULL_RTX;
|
1885 |
|
|
}
|
1886 |
|
|
num_regs_saved_in_regs = 0;
|
1887 |
|
|
return;
|
1888 |
|
|
}
|
1889 |
|
|
|
1890 |
|
|
if (!NONJUMP_INSN_P (insn) || clobbers_queued_reg_save (insn))
|
1891 |
|
|
flush_queued_reg_saves ();
|
1892 |
|
|
|
1893 |
|
|
if (! RTX_FRAME_RELATED_P (insn))
|
1894 |
|
|
{
|
1895 |
|
|
if (!ACCUMULATE_OUTGOING_ARGS)
|
1896 |
|
|
dwarf2out_stack_adjust (insn, after_p);
|
1897 |
|
|
return;
|
1898 |
|
|
}
|
1899 |
|
|
|
1900 |
|
|
label = dwarf2out_cfi_label ();
|
1901 |
|
|
src = find_reg_note (insn, REG_FRAME_RELATED_EXPR, NULL_RTX);
|
1902 |
|
|
if (src)
|
1903 |
|
|
insn = XEXP (src, 0);
|
1904 |
|
|
else
|
1905 |
|
|
insn = PATTERN (insn);
|
1906 |
|
|
|
1907 |
|
|
dwarf2out_frame_debug_expr (insn, label);
|
1908 |
|
|
}
|
1909 |
|
|
|
1910 |
|
|
#endif
|
1911 |
|
|
|
1912 |
|
|
/* Describe for the GTY machinery what parts of dw_cfi_oprnd1 are used. */
|
1913 |
|
|
static enum dw_cfi_oprnd_type dw_cfi_oprnd1_desc
|
1914 |
|
|
(enum dwarf_call_frame_info cfi);
|
1915 |
|
|
|
1916 |
|
|
static enum dw_cfi_oprnd_type
|
1917 |
|
|
dw_cfi_oprnd1_desc (enum dwarf_call_frame_info cfi)
|
1918 |
|
|
{
|
1919 |
|
|
switch (cfi)
|
1920 |
|
|
{
|
1921 |
|
|
case DW_CFA_nop:
|
1922 |
|
|
case DW_CFA_GNU_window_save:
|
1923 |
|
|
return dw_cfi_oprnd_unused;
|
1924 |
|
|
|
1925 |
|
|
case DW_CFA_set_loc:
|
1926 |
|
|
case DW_CFA_advance_loc1:
|
1927 |
|
|
case DW_CFA_advance_loc2:
|
1928 |
|
|
case DW_CFA_advance_loc4:
|
1929 |
|
|
case DW_CFA_MIPS_advance_loc8:
|
1930 |
|
|
return dw_cfi_oprnd_addr;
|
1931 |
|
|
|
1932 |
|
|
case DW_CFA_offset:
|
1933 |
|
|
case DW_CFA_offset_extended:
|
1934 |
|
|
case DW_CFA_def_cfa:
|
1935 |
|
|
case DW_CFA_offset_extended_sf:
|
1936 |
|
|
case DW_CFA_def_cfa_sf:
|
1937 |
|
|
case DW_CFA_restore_extended:
|
1938 |
|
|
case DW_CFA_undefined:
|
1939 |
|
|
case DW_CFA_same_value:
|
1940 |
|
|
case DW_CFA_def_cfa_register:
|
1941 |
|
|
case DW_CFA_register:
|
1942 |
|
|
return dw_cfi_oprnd_reg_num;
|
1943 |
|
|
|
1944 |
|
|
case DW_CFA_def_cfa_offset:
|
1945 |
|
|
case DW_CFA_GNU_args_size:
|
1946 |
|
|
case DW_CFA_def_cfa_offset_sf:
|
1947 |
|
|
return dw_cfi_oprnd_offset;
|
1948 |
|
|
|
1949 |
|
|
case DW_CFA_def_cfa_expression:
|
1950 |
|
|
case DW_CFA_expression:
|
1951 |
|
|
return dw_cfi_oprnd_loc;
|
1952 |
|
|
|
1953 |
|
|
default:
|
1954 |
|
|
gcc_unreachable ();
|
1955 |
|
|
}
|
1956 |
|
|
}
|
1957 |
|
|
|
1958 |
|
|
/* Describe for the GTY machinery what parts of dw_cfi_oprnd2 are used. */
|
1959 |
|
|
static enum dw_cfi_oprnd_type dw_cfi_oprnd2_desc
|
1960 |
|
|
(enum dwarf_call_frame_info cfi);
|
1961 |
|
|
|
1962 |
|
|
static enum dw_cfi_oprnd_type
|
1963 |
|
|
dw_cfi_oprnd2_desc (enum dwarf_call_frame_info cfi)
|
1964 |
|
|
{
|
1965 |
|
|
switch (cfi)
|
1966 |
|
|
{
|
1967 |
|
|
case DW_CFA_def_cfa:
|
1968 |
|
|
case DW_CFA_def_cfa_sf:
|
1969 |
|
|
case DW_CFA_offset:
|
1970 |
|
|
case DW_CFA_offset_extended_sf:
|
1971 |
|
|
case DW_CFA_offset_extended:
|
1972 |
|
|
return dw_cfi_oprnd_offset;
|
1973 |
|
|
|
1974 |
|
|
case DW_CFA_register:
|
1975 |
|
|
return dw_cfi_oprnd_reg_num;
|
1976 |
|
|
|
1977 |
|
|
default:
|
1978 |
|
|
return dw_cfi_oprnd_unused;
|
1979 |
|
|
}
|
1980 |
|
|
}
|
1981 |
|
|
|
1982 |
|
|
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
|
1983 |
|
|
|
1984 |
|
|
/* Switch to eh_frame_section. If we don't have an eh_frame_section,
|
1985 |
|
|
switch to the data section instead, and write out a synthetic label
|
1986 |
|
|
for collect2. */
|
1987 |
|
|
|
1988 |
|
|
static void
|
1989 |
|
|
switch_to_eh_frame_section (void)
|
1990 |
|
|
{
|
1991 |
|
|
tree label;
|
1992 |
|
|
|
1993 |
|
|
#ifdef EH_FRAME_SECTION_NAME
|
1994 |
|
|
if (eh_frame_section == 0)
|
1995 |
|
|
{
|
1996 |
|
|
int flags;
|
1997 |
|
|
|
1998 |
|
|
if (EH_TABLES_CAN_BE_READ_ONLY)
|
1999 |
|
|
{
|
2000 |
|
|
int fde_encoding;
|
2001 |
|
|
int per_encoding;
|
2002 |
|
|
int lsda_encoding;
|
2003 |
|
|
|
2004 |
|
|
fde_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1,
|
2005 |
|
|
/*global=*/0);
|
2006 |
|
|
per_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2,
|
2007 |
|
|
/*global=*/1);
|
2008 |
|
|
lsda_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0,
|
2009 |
|
|
/*global=*/0);
|
2010 |
|
|
flags = ((! flag_pic
|
2011 |
|
|
|| ((fde_encoding & 0x70) != DW_EH_PE_absptr
|
2012 |
|
|
&& (fde_encoding & 0x70) != DW_EH_PE_aligned
|
2013 |
|
|
&& (per_encoding & 0x70) != DW_EH_PE_absptr
|
2014 |
|
|
&& (per_encoding & 0x70) != DW_EH_PE_aligned
|
2015 |
|
|
&& (lsda_encoding & 0x70) != DW_EH_PE_absptr
|
2016 |
|
|
&& (lsda_encoding & 0x70) != DW_EH_PE_aligned))
|
2017 |
|
|
? 0 : SECTION_WRITE);
|
2018 |
|
|
}
|
2019 |
|
|
else
|
2020 |
|
|
flags = SECTION_WRITE;
|
2021 |
|
|
eh_frame_section = get_section (EH_FRAME_SECTION_NAME, flags, NULL);
|
2022 |
|
|
}
|
2023 |
|
|
#endif
|
2024 |
|
|
|
2025 |
|
|
if (eh_frame_section)
|
2026 |
|
|
switch_to_section (eh_frame_section);
|
2027 |
|
|
else
|
2028 |
|
|
{
|
2029 |
|
|
/* We have no special eh_frame section. Put the information in
|
2030 |
|
|
the data section and emit special labels to guide collect2. */
|
2031 |
|
|
switch_to_section (data_section);
|
2032 |
|
|
label = get_file_function_name ('F');
|
2033 |
|
|
ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
|
2034 |
|
|
targetm.asm_out.globalize_label (asm_out_file,
|
2035 |
|
|
IDENTIFIER_POINTER (label));
|
2036 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
|
2037 |
|
|
}
|
2038 |
|
|
}
|
2039 |
|
|
|
2040 |
|
|
/* Output a Call Frame Information opcode and its operand(s). */
|
2041 |
|
|
|
2042 |
|
|
static void
|
2043 |
|
|
output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh)
|
2044 |
|
|
{
|
2045 |
|
|
unsigned long r;
|
2046 |
|
|
if (cfi->dw_cfi_opc == DW_CFA_advance_loc)
|
2047 |
|
|
dw2_asm_output_data (1, (cfi->dw_cfi_opc
|
2048 |
|
|
| (cfi->dw_cfi_oprnd1.dw_cfi_offset & 0x3f)),
|
2049 |
|
|
"DW_CFA_advance_loc " HOST_WIDE_INT_PRINT_HEX,
|
2050 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_offset);
|
2051 |
|
|
else if (cfi->dw_cfi_opc == DW_CFA_offset)
|
2052 |
|
|
{
|
2053 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2054 |
|
|
dw2_asm_output_data (1, (cfi->dw_cfi_opc | (r & 0x3f)),
|
2055 |
|
|
"DW_CFA_offset, column 0x%lx", r);
|
2056 |
|
|
dw2_asm_output_data_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset, NULL);
|
2057 |
|
|
}
|
2058 |
|
|
else if (cfi->dw_cfi_opc == DW_CFA_restore)
|
2059 |
|
|
{
|
2060 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2061 |
|
|
dw2_asm_output_data (1, (cfi->dw_cfi_opc | (r & 0x3f)),
|
2062 |
|
|
"DW_CFA_restore, column 0x%lx", r);
|
2063 |
|
|
}
|
2064 |
|
|
else
|
2065 |
|
|
{
|
2066 |
|
|
dw2_asm_output_data (1, cfi->dw_cfi_opc,
|
2067 |
|
|
"%s", dwarf_cfi_name (cfi->dw_cfi_opc));
|
2068 |
|
|
|
2069 |
|
|
switch (cfi->dw_cfi_opc)
|
2070 |
|
|
{
|
2071 |
|
|
case DW_CFA_set_loc:
|
2072 |
|
|
if (for_eh)
|
2073 |
|
|
dw2_asm_output_encoded_addr_rtx (
|
2074 |
|
|
ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0),
|
2075 |
|
|
gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr),
|
2076 |
|
|
false, NULL);
|
2077 |
|
|
else
|
2078 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE,
|
2079 |
|
|
cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL);
|
2080 |
|
|
fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
2081 |
|
|
break;
|
2082 |
|
|
|
2083 |
|
|
case DW_CFA_advance_loc1:
|
2084 |
|
|
dw2_asm_output_delta (1, cfi->dw_cfi_oprnd1.dw_cfi_addr,
|
2085 |
|
|
fde->dw_fde_current_label, NULL);
|
2086 |
|
|
fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
2087 |
|
|
break;
|
2088 |
|
|
|
2089 |
|
|
case DW_CFA_advance_loc2:
|
2090 |
|
|
dw2_asm_output_delta (2, cfi->dw_cfi_oprnd1.dw_cfi_addr,
|
2091 |
|
|
fde->dw_fde_current_label, NULL);
|
2092 |
|
|
fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
2093 |
|
|
break;
|
2094 |
|
|
|
2095 |
|
|
case DW_CFA_advance_loc4:
|
2096 |
|
|
dw2_asm_output_delta (4, cfi->dw_cfi_oprnd1.dw_cfi_addr,
|
2097 |
|
|
fde->dw_fde_current_label, NULL);
|
2098 |
|
|
fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
2099 |
|
|
break;
|
2100 |
|
|
|
2101 |
|
|
case DW_CFA_MIPS_advance_loc8:
|
2102 |
|
|
dw2_asm_output_delta (8, cfi->dw_cfi_oprnd1.dw_cfi_addr,
|
2103 |
|
|
fde->dw_fde_current_label, NULL);
|
2104 |
|
|
fde->dw_fde_current_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
2105 |
|
|
break;
|
2106 |
|
|
|
2107 |
|
|
case DW_CFA_offset_extended:
|
2108 |
|
|
case DW_CFA_def_cfa:
|
2109 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2110 |
|
|
dw2_asm_output_data_uleb128 (r, NULL);
|
2111 |
|
|
dw2_asm_output_data_uleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset, NULL);
|
2112 |
|
|
break;
|
2113 |
|
|
|
2114 |
|
|
case DW_CFA_offset_extended_sf:
|
2115 |
|
|
case DW_CFA_def_cfa_sf:
|
2116 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2117 |
|
|
dw2_asm_output_data_uleb128 (r, NULL);
|
2118 |
|
|
dw2_asm_output_data_sleb128 (cfi->dw_cfi_oprnd2.dw_cfi_offset, NULL);
|
2119 |
|
|
break;
|
2120 |
|
|
|
2121 |
|
|
case DW_CFA_restore_extended:
|
2122 |
|
|
case DW_CFA_undefined:
|
2123 |
|
|
case DW_CFA_same_value:
|
2124 |
|
|
case DW_CFA_def_cfa_register:
|
2125 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2126 |
|
|
dw2_asm_output_data_uleb128 (r, NULL);
|
2127 |
|
|
break;
|
2128 |
|
|
|
2129 |
|
|
case DW_CFA_register:
|
2130 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd1.dw_cfi_reg_num, for_eh);
|
2131 |
|
|
dw2_asm_output_data_uleb128 (r, NULL);
|
2132 |
|
|
r = DWARF2_FRAME_REG_OUT (cfi->dw_cfi_oprnd2.dw_cfi_reg_num, for_eh);
|
2133 |
|
|
dw2_asm_output_data_uleb128 (r, NULL);
|
2134 |
|
|
break;
|
2135 |
|
|
|
2136 |
|
|
case DW_CFA_def_cfa_offset:
|
2137 |
|
|
case DW_CFA_GNU_args_size:
|
2138 |
|
|
dw2_asm_output_data_uleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset, NULL);
|
2139 |
|
|
break;
|
2140 |
|
|
|
2141 |
|
|
case DW_CFA_def_cfa_offset_sf:
|
2142 |
|
|
dw2_asm_output_data_sleb128 (cfi->dw_cfi_oprnd1.dw_cfi_offset, NULL);
|
2143 |
|
|
break;
|
2144 |
|
|
|
2145 |
|
|
case DW_CFA_GNU_window_save:
|
2146 |
|
|
break;
|
2147 |
|
|
|
2148 |
|
|
case DW_CFA_def_cfa_expression:
|
2149 |
|
|
case DW_CFA_expression:
|
2150 |
|
|
output_cfa_loc (cfi);
|
2151 |
|
|
break;
|
2152 |
|
|
|
2153 |
|
|
case DW_CFA_GNU_negative_offset_extended:
|
2154 |
|
|
/* Obsoleted by DW_CFA_offset_extended_sf. */
|
2155 |
|
|
gcc_unreachable ();
|
2156 |
|
|
|
2157 |
|
|
default:
|
2158 |
|
|
break;
|
2159 |
|
|
}
|
2160 |
|
|
}
|
2161 |
|
|
}
|
2162 |
|
|
|
2163 |
|
|
/* Output the call frame information used to record information
|
2164 |
|
|
that relates to calculating the frame pointer, and records the
|
2165 |
|
|
location of saved registers. */
|
2166 |
|
|
|
2167 |
|
|
static void
|
2168 |
|
|
output_call_frame_info (int for_eh)
|
2169 |
|
|
{
|
2170 |
|
|
unsigned int i;
|
2171 |
|
|
dw_fde_ref fde;
|
2172 |
|
|
dw_cfi_ref cfi;
|
2173 |
|
|
char l1[20], l2[20], section_start_label[20];
|
2174 |
|
|
bool any_lsda_needed = false;
|
2175 |
|
|
char augmentation[6];
|
2176 |
|
|
int augmentation_size;
|
2177 |
|
|
int fde_encoding = DW_EH_PE_absptr;
|
2178 |
|
|
int per_encoding = DW_EH_PE_absptr;
|
2179 |
|
|
int lsda_encoding = DW_EH_PE_absptr;
|
2180 |
|
|
int return_reg;
|
2181 |
|
|
|
2182 |
|
|
/* Don't emit a CIE if there won't be any FDEs. */
|
2183 |
|
|
if (fde_table_in_use == 0)
|
2184 |
|
|
return;
|
2185 |
|
|
|
2186 |
|
|
/* If we make FDEs linkonce, we may have to emit an empty label for
|
2187 |
|
|
an FDE that wouldn't otherwise be emitted. We want to avoid
|
2188 |
|
|
having an FDE kept around when the function it refers to is
|
2189 |
|
|
discarded. Example where this matters: a primary function
|
2190 |
|
|
template in C++ requires EH information, but an explicit
|
2191 |
|
|
specialization doesn't. */
|
2192 |
|
|
if (TARGET_USES_WEAK_UNWIND_INFO
|
2193 |
|
|
&& ! flag_asynchronous_unwind_tables
|
2194 |
|
|
&& for_eh)
|
2195 |
|
|
for (i = 0; i < fde_table_in_use; i++)
|
2196 |
|
|
if ((fde_table[i].nothrow || fde_table[i].all_throwers_are_sibcalls)
|
2197 |
|
|
&& !fde_table[i].uses_eh_lsda
|
2198 |
|
|
&& ! DECL_WEAK (fde_table[i].decl))
|
2199 |
|
|
targetm.asm_out.unwind_label (asm_out_file, fde_table[i].decl,
|
2200 |
|
|
for_eh, /* empty */ 1);
|
2201 |
|
|
|
2202 |
|
|
/* If we don't have any functions we'll want to unwind out of, don't
|
2203 |
|
|
emit any EH unwind information. Note that if exceptions aren't
|
2204 |
|
|
enabled, we won't have collected nothrow information, and if we
|
2205 |
|
|
asked for asynchronous tables, we always want this info. */
|
2206 |
|
|
if (for_eh)
|
2207 |
|
|
{
|
2208 |
|
|
bool any_eh_needed = !flag_exceptions || flag_asynchronous_unwind_tables;
|
2209 |
|
|
|
2210 |
|
|
for (i = 0; i < fde_table_in_use; i++)
|
2211 |
|
|
if (fde_table[i].uses_eh_lsda)
|
2212 |
|
|
any_eh_needed = any_lsda_needed = true;
|
2213 |
|
|
else if (TARGET_USES_WEAK_UNWIND_INFO && DECL_WEAK (fde_table[i].decl))
|
2214 |
|
|
any_eh_needed = true;
|
2215 |
|
|
else if (! fde_table[i].nothrow
|
2216 |
|
|
&& ! fde_table[i].all_throwers_are_sibcalls)
|
2217 |
|
|
any_eh_needed = true;
|
2218 |
|
|
|
2219 |
|
|
if (! any_eh_needed)
|
2220 |
|
|
return;
|
2221 |
|
|
}
|
2222 |
|
|
|
2223 |
|
|
/* We're going to be generating comments, so turn on app. */
|
2224 |
|
|
if (flag_debug_asm)
|
2225 |
|
|
app_enable ();
|
2226 |
|
|
|
2227 |
|
|
if (for_eh)
|
2228 |
|
|
switch_to_eh_frame_section ();
|
2229 |
|
|
else
|
2230 |
|
|
{
|
2231 |
|
|
if (!debug_frame_section)
|
2232 |
|
|
debug_frame_section = get_section (DEBUG_FRAME_SECTION,
|
2233 |
|
|
SECTION_DEBUG, NULL);
|
2234 |
|
|
switch_to_section (debug_frame_section);
|
2235 |
|
|
}
|
2236 |
|
|
|
2237 |
|
|
ASM_GENERATE_INTERNAL_LABEL (section_start_label, FRAME_BEGIN_LABEL, for_eh);
|
2238 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, section_start_label);
|
2239 |
|
|
|
2240 |
|
|
/* Output the CIE. */
|
2241 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh);
|
2242 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh);
|
2243 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
|
2244 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
2245 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
2246 |
|
|
dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
|
2247 |
|
|
"Length of Common Information Entry");
|
2248 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l1);
|
2249 |
|
|
|
2250 |
|
|
/* Now that the CIE pointer is PC-relative for EH,
|
2251 |
|
|
use 0 to identify the CIE. */
|
2252 |
|
|
dw2_asm_output_data ((for_eh ? 4 : DWARF_OFFSET_SIZE),
|
2253 |
|
|
(for_eh ? 0 : DWARF_CIE_ID),
|
2254 |
|
|
"CIE Identifier Tag");
|
2255 |
|
|
|
2256 |
|
|
dw2_asm_output_data (1, DW_CIE_VERSION, "CIE Version");
|
2257 |
|
|
|
2258 |
|
|
augmentation[0] = 0;
|
2259 |
|
|
augmentation_size = 0;
|
2260 |
|
|
if (for_eh)
|
2261 |
|
|
{
|
2262 |
|
|
char *p;
|
2263 |
|
|
|
2264 |
|
|
/* Augmentation:
|
2265 |
|
|
z Indicates that a uleb128 is present to size the
|
2266 |
|
|
augmentation section.
|
2267 |
|
|
L Indicates the encoding (and thus presence) of
|
2268 |
|
|
an LSDA pointer in the FDE augmentation.
|
2269 |
|
|
R Indicates a non-default pointer encoding for
|
2270 |
|
|
FDE code pointers.
|
2271 |
|
|
P Indicates the presence of an encoding + language
|
2272 |
|
|
personality routine in the CIE augmentation. */
|
2273 |
|
|
|
2274 |
|
|
fde_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0);
|
2275 |
|
|
per_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2, /*global=*/1);
|
2276 |
|
|
lsda_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/0);
|
2277 |
|
|
|
2278 |
|
|
p = augmentation + 1;
|
2279 |
|
|
if (eh_personality_libfunc)
|
2280 |
|
|
{
|
2281 |
|
|
*p++ = 'P';
|
2282 |
|
|
augmentation_size += 1 + size_of_encoded_value (per_encoding);
|
2283 |
|
|
}
|
2284 |
|
|
if (any_lsda_needed)
|
2285 |
|
|
{
|
2286 |
|
|
*p++ = 'L';
|
2287 |
|
|
augmentation_size += 1;
|
2288 |
|
|
}
|
2289 |
|
|
if (fde_encoding != DW_EH_PE_absptr)
|
2290 |
|
|
{
|
2291 |
|
|
*p++ = 'R';
|
2292 |
|
|
augmentation_size += 1;
|
2293 |
|
|
}
|
2294 |
|
|
if (p > augmentation + 1)
|
2295 |
|
|
{
|
2296 |
|
|
augmentation[0] = 'z';
|
2297 |
|
|
*p = '\0';
|
2298 |
|
|
}
|
2299 |
|
|
|
2300 |
|
|
/* Ug. Some platforms can't do unaligned dynamic relocations at all. */
|
2301 |
|
|
if (eh_personality_libfunc && per_encoding == DW_EH_PE_aligned)
|
2302 |
|
|
{
|
2303 |
|
|
int offset = ( 4 /* Length */
|
2304 |
|
|
+ 4 /* CIE Id */
|
2305 |
|
|
+ 1 /* CIE version */
|
2306 |
|
|
+ strlen (augmentation) + 1 /* Augmentation */
|
2307 |
|
|
+ size_of_uleb128 (1) /* Code alignment */
|
2308 |
|
|
+ size_of_sleb128 (DWARF_CIE_DATA_ALIGNMENT)
|
2309 |
|
|
+ 1 /* RA column */
|
2310 |
|
|
+ 1 /* Augmentation size */
|
2311 |
|
|
+ 1 /* Personality encoding */ );
|
2312 |
|
|
int pad = -offset & (PTR_SIZE - 1);
|
2313 |
|
|
|
2314 |
|
|
augmentation_size += pad;
|
2315 |
|
|
|
2316 |
|
|
/* Augmentations should be small, so there's scarce need to
|
2317 |
|
|
iterate for a solution. Die if we exceed one uleb128 byte. */
|
2318 |
|
|
gcc_assert (size_of_uleb128 (augmentation_size) == 1);
|
2319 |
|
|
}
|
2320 |
|
|
}
|
2321 |
|
|
|
2322 |
|
|
dw2_asm_output_nstring (augmentation, -1, "CIE Augmentation");
|
2323 |
|
|
dw2_asm_output_data_uleb128 (1, "CIE Code Alignment Factor");
|
2324 |
|
|
dw2_asm_output_data_sleb128 (DWARF_CIE_DATA_ALIGNMENT,
|
2325 |
|
|
"CIE Data Alignment Factor");
|
2326 |
|
|
|
2327 |
|
|
return_reg = DWARF2_FRAME_REG_OUT (DWARF_FRAME_RETURN_COLUMN, for_eh);
|
2328 |
|
|
if (DW_CIE_VERSION == 1)
|
2329 |
|
|
dw2_asm_output_data (1, return_reg, "CIE RA Column");
|
2330 |
|
|
else
|
2331 |
|
|
dw2_asm_output_data_uleb128 (return_reg, "CIE RA Column");
|
2332 |
|
|
|
2333 |
|
|
if (augmentation[0])
|
2334 |
|
|
{
|
2335 |
|
|
dw2_asm_output_data_uleb128 (augmentation_size, "Augmentation size");
|
2336 |
|
|
if (eh_personality_libfunc)
|
2337 |
|
|
{
|
2338 |
|
|
dw2_asm_output_data (1, per_encoding, "Personality (%s)",
|
2339 |
|
|
eh_data_format_name (per_encoding));
|
2340 |
|
|
dw2_asm_output_encoded_addr_rtx (per_encoding,
|
2341 |
|
|
eh_personality_libfunc,
|
2342 |
|
|
true, NULL);
|
2343 |
|
|
}
|
2344 |
|
|
|
2345 |
|
|
if (any_lsda_needed)
|
2346 |
|
|
dw2_asm_output_data (1, lsda_encoding, "LSDA Encoding (%s)",
|
2347 |
|
|
eh_data_format_name (lsda_encoding));
|
2348 |
|
|
|
2349 |
|
|
if (fde_encoding != DW_EH_PE_absptr)
|
2350 |
|
|
dw2_asm_output_data (1, fde_encoding, "FDE Encoding (%s)",
|
2351 |
|
|
eh_data_format_name (fde_encoding));
|
2352 |
|
|
}
|
2353 |
|
|
|
2354 |
|
|
for (cfi = cie_cfi_head; cfi != NULL; cfi = cfi->dw_cfi_next)
|
2355 |
|
|
output_cfi (cfi, NULL, for_eh);
|
2356 |
|
|
|
2357 |
|
|
/* Pad the CIE out to an address sized boundary. */
|
2358 |
|
|
ASM_OUTPUT_ALIGN (asm_out_file,
|
2359 |
|
|
floor_log2 (for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE));
|
2360 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l2);
|
2361 |
|
|
|
2362 |
|
|
/* Loop through all of the FDE's. */
|
2363 |
|
|
for (i = 0; i < fde_table_in_use; i++)
|
2364 |
|
|
{
|
2365 |
|
|
fde = &fde_table[i];
|
2366 |
|
|
|
2367 |
|
|
/* Don't emit EH unwind info for leaf functions that don't need it. */
|
2368 |
|
|
if (for_eh && !flag_asynchronous_unwind_tables && flag_exceptions
|
2369 |
|
|
&& (fde->nothrow || fde->all_throwers_are_sibcalls)
|
2370 |
|
|
&& ! (TARGET_USES_WEAK_UNWIND_INFO && DECL_WEAK (fde_table[i].decl))
|
2371 |
|
|
&& !fde->uses_eh_lsda)
|
2372 |
|
|
continue;
|
2373 |
|
|
|
2374 |
|
|
targetm.asm_out.unwind_label (asm_out_file, fde->decl, for_eh, /* empty */ 0);
|
2375 |
|
|
targetm.asm_out.internal_label (asm_out_file, FDE_LABEL, for_eh + i * 2);
|
2376 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + i * 2);
|
2377 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + i * 2);
|
2378 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
|
2379 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
2380 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
2381 |
|
|
dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
|
2382 |
|
|
"FDE Length");
|
2383 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l1);
|
2384 |
|
|
|
2385 |
|
|
if (for_eh)
|
2386 |
|
|
dw2_asm_output_delta (4, l1, section_start_label, "FDE CIE offset");
|
2387 |
|
|
else
|
2388 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, section_start_label,
|
2389 |
|
|
debug_frame_section, "FDE CIE offset");
|
2390 |
|
|
|
2391 |
|
|
if (for_eh)
|
2392 |
|
|
{
|
2393 |
|
|
rtx sym_ref = gen_rtx_SYMBOL_REF (Pmode, fde->dw_fde_begin);
|
2394 |
|
|
SYMBOL_REF_FLAGS (sym_ref) |= SYMBOL_FLAG_LOCAL;
|
2395 |
|
|
dw2_asm_output_encoded_addr_rtx (fde_encoding,
|
2396 |
|
|
sym_ref,
|
2397 |
|
|
false,
|
2398 |
|
|
"FDE initial location");
|
2399 |
|
|
if (fde->dw_fde_switched_sections)
|
2400 |
|
|
{
|
2401 |
|
|
rtx sym_ref2 = gen_rtx_SYMBOL_REF (Pmode,
|
2402 |
|
|
fde->dw_fde_unlikely_section_label);
|
2403 |
|
|
rtx sym_ref3= gen_rtx_SYMBOL_REF (Pmode,
|
2404 |
|
|
fde->dw_fde_hot_section_label);
|
2405 |
|
|
SYMBOL_REF_FLAGS (sym_ref2) |= SYMBOL_FLAG_LOCAL;
|
2406 |
|
|
SYMBOL_REF_FLAGS (sym_ref3) |= SYMBOL_FLAG_LOCAL;
|
2407 |
|
|
dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref3, false,
|
2408 |
|
|
"FDE initial location");
|
2409 |
|
|
dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
|
2410 |
|
|
fde->dw_fde_hot_section_end_label,
|
2411 |
|
|
fde->dw_fde_hot_section_label,
|
2412 |
|
|
"FDE address range");
|
2413 |
|
|
dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref2, false,
|
2414 |
|
|
"FDE initial location");
|
2415 |
|
|
dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
|
2416 |
|
|
fde->dw_fde_unlikely_section_end_label,
|
2417 |
|
|
fde->dw_fde_unlikely_section_label,
|
2418 |
|
|
"FDE address range");
|
2419 |
|
|
}
|
2420 |
|
|
else
|
2421 |
|
|
dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
|
2422 |
|
|
fde->dw_fde_end, fde->dw_fde_begin,
|
2423 |
|
|
"FDE address range");
|
2424 |
|
|
}
|
2425 |
|
|
else
|
2426 |
|
|
{
|
2427 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, fde->dw_fde_begin,
|
2428 |
|
|
"FDE initial location");
|
2429 |
|
|
if (fde->dw_fde_switched_sections)
|
2430 |
|
|
{
|
2431 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE,
|
2432 |
|
|
fde->dw_fde_hot_section_label,
|
2433 |
|
|
"FDE initial location");
|
2434 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE,
|
2435 |
|
|
fde->dw_fde_hot_section_end_label,
|
2436 |
|
|
fde->dw_fde_hot_section_label,
|
2437 |
|
|
"FDE address range");
|
2438 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE,
|
2439 |
|
|
fde->dw_fde_unlikely_section_label,
|
2440 |
|
|
"FDE initial location");
|
2441 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE,
|
2442 |
|
|
fde->dw_fde_unlikely_section_end_label,
|
2443 |
|
|
fde->dw_fde_unlikely_section_label,
|
2444 |
|
|
"FDE address range");
|
2445 |
|
|
}
|
2446 |
|
|
else
|
2447 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE,
|
2448 |
|
|
fde->dw_fde_end, fde->dw_fde_begin,
|
2449 |
|
|
"FDE address range");
|
2450 |
|
|
}
|
2451 |
|
|
|
2452 |
|
|
if (augmentation[0])
|
2453 |
|
|
{
|
2454 |
|
|
if (any_lsda_needed)
|
2455 |
|
|
{
|
2456 |
|
|
int size = size_of_encoded_value (lsda_encoding);
|
2457 |
|
|
|
2458 |
|
|
if (lsda_encoding == DW_EH_PE_aligned)
|
2459 |
|
|
{
|
2460 |
|
|
int offset = ( 4 /* Length */
|
2461 |
|
|
+ 4 /* CIE offset */
|
2462 |
|
|
+ 2 * size_of_encoded_value (fde_encoding)
|
2463 |
|
|
+ 1 /* Augmentation size */ );
|
2464 |
|
|
int pad = -offset & (PTR_SIZE - 1);
|
2465 |
|
|
|
2466 |
|
|
size += pad;
|
2467 |
|
|
gcc_assert (size_of_uleb128 (size) == 1);
|
2468 |
|
|
}
|
2469 |
|
|
|
2470 |
|
|
dw2_asm_output_data_uleb128 (size, "Augmentation size");
|
2471 |
|
|
|
2472 |
|
|
if (fde->uses_eh_lsda)
|
2473 |
|
|
{
|
2474 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l1, "LLSDA",
|
2475 |
|
|
fde->funcdef_number);
|
2476 |
|
|
dw2_asm_output_encoded_addr_rtx (
|
2477 |
|
|
lsda_encoding, gen_rtx_SYMBOL_REF (Pmode, l1),
|
2478 |
|
|
false, "Language Specific Data Area");
|
2479 |
|
|
}
|
2480 |
|
|
else
|
2481 |
|
|
{
|
2482 |
|
|
if (lsda_encoding == DW_EH_PE_aligned)
|
2483 |
|
|
ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
|
2484 |
|
|
dw2_asm_output_data
|
2485 |
|
|
(size_of_encoded_value (lsda_encoding), 0,
|
2486 |
|
|
"Language Specific Data Area (none)");
|
2487 |
|
|
}
|
2488 |
|
|
}
|
2489 |
|
|
else
|
2490 |
|
|
dw2_asm_output_data_uleb128 (0, "Augmentation size");
|
2491 |
|
|
}
|
2492 |
|
|
|
2493 |
|
|
/* Loop through the Call Frame Instructions associated with
|
2494 |
|
|
this FDE. */
|
2495 |
|
|
fde->dw_fde_current_label = fde->dw_fde_begin;
|
2496 |
|
|
for (cfi = fde->dw_fde_cfi; cfi != NULL; cfi = cfi->dw_cfi_next)
|
2497 |
|
|
output_cfi (cfi, fde, for_eh);
|
2498 |
|
|
|
2499 |
|
|
/* Pad the FDE out to an address sized boundary. */
|
2500 |
|
|
ASM_OUTPUT_ALIGN (asm_out_file,
|
2501 |
|
|
floor_log2 ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE)));
|
2502 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l2);
|
2503 |
|
|
}
|
2504 |
|
|
|
2505 |
|
|
if (for_eh && targetm.terminate_dw2_eh_frame_info)
|
2506 |
|
|
dw2_asm_output_data (4, 0, "End of Table");
|
2507 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
2508 |
|
|
/* Work around Irix 6 assembler bug whereby labels at the end of a section
|
2509 |
|
|
get a value of 0. Putting .align 0 after the label fixes it. */
|
2510 |
|
|
ASM_OUTPUT_ALIGN (asm_out_file, 0);
|
2511 |
|
|
#endif
|
2512 |
|
|
|
2513 |
|
|
/* Turn off app to make assembly quicker. */
|
2514 |
|
|
if (flag_debug_asm)
|
2515 |
|
|
app_disable ();
|
2516 |
|
|
}
|
2517 |
|
|
|
2518 |
|
|
/* Output a marker (i.e. a label) for the beginning of a function, before
|
2519 |
|
|
the prologue. */
|
2520 |
|
|
|
2521 |
|
|
void
|
2522 |
|
|
dwarf2out_begin_prologue (unsigned int line ATTRIBUTE_UNUSED,
|
2523 |
|
|
const char *file ATTRIBUTE_UNUSED)
|
2524 |
|
|
{
|
2525 |
|
|
char label[MAX_ARTIFICIAL_LABEL_BYTES];
|
2526 |
|
|
char * dup_label;
|
2527 |
|
|
dw_fde_ref fde;
|
2528 |
|
|
|
2529 |
|
|
current_function_func_begin_label = NULL;
|
2530 |
|
|
|
2531 |
|
|
#ifdef TARGET_UNWIND_INFO
|
2532 |
|
|
/* ??? current_function_func_begin_label is also used by except.c
|
2533 |
|
|
for call-site information. We must emit this label if it might
|
2534 |
|
|
be used. */
|
2535 |
|
|
if ((! flag_exceptions || USING_SJLJ_EXCEPTIONS)
|
2536 |
|
|
&& ! dwarf2out_do_frame ())
|
2537 |
|
|
return;
|
2538 |
|
|
#else
|
2539 |
|
|
if (! dwarf2out_do_frame ())
|
2540 |
|
|
return;
|
2541 |
|
|
#endif
|
2542 |
|
|
|
2543 |
|
|
switch_to_section (function_section (current_function_decl));
|
2544 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, FUNC_BEGIN_LABEL,
|
2545 |
|
|
current_function_funcdef_no);
|
2546 |
|
|
ASM_OUTPUT_DEBUG_LABEL (asm_out_file, FUNC_BEGIN_LABEL,
|
2547 |
|
|
current_function_funcdef_no);
|
2548 |
|
|
dup_label = xstrdup (label);
|
2549 |
|
|
current_function_func_begin_label = dup_label;
|
2550 |
|
|
|
2551 |
|
|
#ifdef TARGET_UNWIND_INFO
|
2552 |
|
|
/* We can elide the fde allocation if we're not emitting debug info. */
|
2553 |
|
|
if (! dwarf2out_do_frame ())
|
2554 |
|
|
return;
|
2555 |
|
|
#endif
|
2556 |
|
|
|
2557 |
|
|
/* Expand the fde table if necessary. */
|
2558 |
|
|
if (fde_table_in_use == fde_table_allocated)
|
2559 |
|
|
{
|
2560 |
|
|
fde_table_allocated += FDE_TABLE_INCREMENT;
|
2561 |
|
|
fde_table = ggc_realloc (fde_table,
|
2562 |
|
|
fde_table_allocated * sizeof (dw_fde_node));
|
2563 |
|
|
memset (fde_table + fde_table_in_use, 0,
|
2564 |
|
|
FDE_TABLE_INCREMENT * sizeof (dw_fde_node));
|
2565 |
|
|
}
|
2566 |
|
|
|
2567 |
|
|
/* Record the FDE associated with this function. */
|
2568 |
|
|
current_funcdef_fde = fde_table_in_use;
|
2569 |
|
|
|
2570 |
|
|
/* Add the new FDE at the end of the fde_table. */
|
2571 |
|
|
fde = &fde_table[fde_table_in_use++];
|
2572 |
|
|
fde->decl = current_function_decl;
|
2573 |
|
|
fde->dw_fde_begin = dup_label;
|
2574 |
|
|
fde->dw_fde_current_label = dup_label;
|
2575 |
|
|
fde->dw_fde_hot_section_label = NULL;
|
2576 |
|
|
fde->dw_fde_hot_section_end_label = NULL;
|
2577 |
|
|
fde->dw_fde_unlikely_section_label = NULL;
|
2578 |
|
|
fde->dw_fde_unlikely_section_end_label = NULL;
|
2579 |
|
|
fde->dw_fde_switched_sections = false;
|
2580 |
|
|
fde->dw_fde_end = NULL;
|
2581 |
|
|
fde->dw_fde_cfi = NULL;
|
2582 |
|
|
fde->funcdef_number = current_function_funcdef_no;
|
2583 |
|
|
fde->nothrow = TREE_NOTHROW (current_function_decl);
|
2584 |
|
|
fde->uses_eh_lsda = cfun->uses_eh_lsda;
|
2585 |
|
|
fde->all_throwers_are_sibcalls = cfun->all_throwers_are_sibcalls;
|
2586 |
|
|
|
2587 |
|
|
args_size = old_args_size = 0;
|
2588 |
|
|
|
2589 |
|
|
/* We only want to output line number information for the genuine dwarf2
|
2590 |
|
|
prologue case, not the eh frame case. */
|
2591 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
2592 |
|
|
if (file)
|
2593 |
|
|
dwarf2out_source_line (line, file);
|
2594 |
|
|
#endif
|
2595 |
|
|
}
|
2596 |
|
|
|
2597 |
|
|
/* Output a marker (i.e. a label) for the absolute end of the generated code
|
2598 |
|
|
for a function definition. This gets called *after* the epilogue code has
|
2599 |
|
|
been generated. */
|
2600 |
|
|
|
2601 |
|
|
void
|
2602 |
|
|
dwarf2out_end_epilogue (unsigned int line ATTRIBUTE_UNUSED,
|
2603 |
|
|
const char *file ATTRIBUTE_UNUSED)
|
2604 |
|
|
{
|
2605 |
|
|
dw_fde_ref fde;
|
2606 |
|
|
char label[MAX_ARTIFICIAL_LABEL_BYTES];
|
2607 |
|
|
|
2608 |
|
|
/* Output a label to mark the endpoint of the code generated for this
|
2609 |
|
|
function. */
|
2610 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL,
|
2611 |
|
|
current_function_funcdef_no);
|
2612 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, label);
|
2613 |
|
|
fde = &fde_table[fde_table_in_use - 1];
|
2614 |
|
|
fde->dw_fde_end = xstrdup (label);
|
2615 |
|
|
}
|
2616 |
|
|
|
2617 |
|
|
void
|
2618 |
|
|
dwarf2out_frame_init (void)
|
2619 |
|
|
{
|
2620 |
|
|
/* Allocate the initial hunk of the fde_table. */
|
2621 |
|
|
fde_table = ggc_alloc_cleared (FDE_TABLE_INCREMENT * sizeof (dw_fde_node));
|
2622 |
|
|
fde_table_allocated = FDE_TABLE_INCREMENT;
|
2623 |
|
|
fde_table_in_use = 0;
|
2624 |
|
|
|
2625 |
|
|
/* Generate the CFA instructions common to all FDE's. Do it now for the
|
2626 |
|
|
sake of lookup_cfa. */
|
2627 |
|
|
|
2628 |
|
|
/* On entry, the Canonical Frame Address is at SP. */
|
2629 |
|
|
dwarf2out_def_cfa (NULL, STACK_POINTER_REGNUM, INCOMING_FRAME_SP_OFFSET);
|
2630 |
|
|
|
2631 |
|
|
#ifdef DWARF2_UNWIND_INFO
|
2632 |
|
|
if (DWARF2_UNWIND_INFO)
|
2633 |
|
|
initial_return_save (INCOMING_RETURN_ADDR_RTX);
|
2634 |
|
|
#endif
|
2635 |
|
|
}
|
2636 |
|
|
|
2637 |
|
|
void
|
2638 |
|
|
dwarf2out_frame_finish (void)
|
2639 |
|
|
{
|
2640 |
|
|
/* Output call frame information. */
|
2641 |
|
|
if (DWARF2_FRAME_INFO)
|
2642 |
|
|
output_call_frame_info (0);
|
2643 |
|
|
|
2644 |
|
|
#ifndef TARGET_UNWIND_INFO
|
2645 |
|
|
/* Output another copy for the unwinder. */
|
2646 |
|
|
if (! USING_SJLJ_EXCEPTIONS && (flag_unwind_tables || flag_exceptions))
|
2647 |
|
|
output_call_frame_info (1);
|
2648 |
|
|
#endif
|
2649 |
|
|
}
|
2650 |
|
|
#endif
|
2651 |
|
|
|
2652 |
|
|
/* And now, the subset of the debugging information support code necessary
|
2653 |
|
|
for emitting location expressions. */
|
2654 |
|
|
|
2655 |
|
|
/* Data about a single source file. */
|
2656 |
|
|
struct dwarf_file_data GTY(())
|
2657 |
|
|
{
|
2658 |
|
|
const char * filename;
|
2659 |
|
|
int emitted_number;
|
2660 |
|
|
};
|
2661 |
|
|
|
2662 |
|
|
/* We need some way to distinguish DW_OP_addr with a direct symbol
|
2663 |
|
|
relocation from DW_OP_addr with a dtp-relative symbol relocation. */
|
2664 |
|
|
#define INTERNAL_DW_OP_tls_addr (0x100 + DW_OP_addr)
|
2665 |
|
|
|
2666 |
|
|
|
2667 |
|
|
typedef struct dw_val_struct *dw_val_ref;
|
2668 |
|
|
typedef struct die_struct *dw_die_ref;
|
2669 |
|
|
typedef struct dw_loc_descr_struct *dw_loc_descr_ref;
|
2670 |
|
|
typedef struct dw_loc_list_struct *dw_loc_list_ref;
|
2671 |
|
|
|
2672 |
|
|
/* Each DIE may have a series of attribute/value pairs. Values
|
2673 |
|
|
can take on several forms. The forms that are used in this
|
2674 |
|
|
implementation are listed below. */
|
2675 |
|
|
|
2676 |
|
|
enum dw_val_class
|
2677 |
|
|
{
|
2678 |
|
|
dw_val_class_addr,
|
2679 |
|
|
dw_val_class_offset,
|
2680 |
|
|
dw_val_class_loc,
|
2681 |
|
|
dw_val_class_loc_list,
|
2682 |
|
|
dw_val_class_range_list,
|
2683 |
|
|
dw_val_class_const,
|
2684 |
|
|
dw_val_class_unsigned_const,
|
2685 |
|
|
dw_val_class_long_long,
|
2686 |
|
|
dw_val_class_vec,
|
2687 |
|
|
dw_val_class_flag,
|
2688 |
|
|
dw_val_class_die_ref,
|
2689 |
|
|
dw_val_class_fde_ref,
|
2690 |
|
|
dw_val_class_lbl_id,
|
2691 |
|
|
dw_val_class_lineptr,
|
2692 |
|
|
dw_val_class_str,
|
2693 |
|
|
dw_val_class_macptr,
|
2694 |
|
|
dw_val_class_file
|
2695 |
|
|
};
|
2696 |
|
|
|
2697 |
|
|
/* Describe a double word constant value. */
|
2698 |
|
|
/* ??? Every instance of long_long in the code really means CONST_DOUBLE. */
|
2699 |
|
|
|
2700 |
|
|
typedef struct dw_long_long_struct GTY(())
|
2701 |
|
|
{
|
2702 |
|
|
unsigned long hi;
|
2703 |
|
|
unsigned long low;
|
2704 |
|
|
}
|
2705 |
|
|
dw_long_long_const;
|
2706 |
|
|
|
2707 |
|
|
/* Describe a floating point constant value, or a vector constant value. */
|
2708 |
|
|
|
2709 |
|
|
typedef struct dw_vec_struct GTY(())
|
2710 |
|
|
{
|
2711 |
|
|
unsigned char * GTY((length ("%h.length"))) array;
|
2712 |
|
|
unsigned length;
|
2713 |
|
|
unsigned elt_size;
|
2714 |
|
|
}
|
2715 |
|
|
dw_vec_const;
|
2716 |
|
|
|
2717 |
|
|
/* The dw_val_node describes an attribute's value, as it is
|
2718 |
|
|
represented internally. */
|
2719 |
|
|
|
2720 |
|
|
typedef struct dw_val_struct GTY(())
|
2721 |
|
|
{
|
2722 |
|
|
enum dw_val_class val_class;
|
2723 |
|
|
union dw_val_struct_union
|
2724 |
|
|
{
|
2725 |
|
|
rtx GTY ((tag ("dw_val_class_addr"))) val_addr;
|
2726 |
|
|
unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_offset"))) val_offset;
|
2727 |
|
|
dw_loc_list_ref GTY ((tag ("dw_val_class_loc_list"))) val_loc_list;
|
2728 |
|
|
dw_loc_descr_ref GTY ((tag ("dw_val_class_loc"))) val_loc;
|
2729 |
|
|
HOST_WIDE_INT GTY ((default)) val_int;
|
2730 |
|
|
unsigned HOST_WIDE_INT GTY ((tag ("dw_val_class_unsigned_const"))) val_unsigned;
|
2731 |
|
|
dw_long_long_const GTY ((tag ("dw_val_class_long_long"))) val_long_long;
|
2732 |
|
|
dw_vec_const GTY ((tag ("dw_val_class_vec"))) val_vec;
|
2733 |
|
|
struct dw_val_die_union
|
2734 |
|
|
{
|
2735 |
|
|
dw_die_ref die;
|
2736 |
|
|
int external;
|
2737 |
|
|
} GTY ((tag ("dw_val_class_die_ref"))) val_die_ref;
|
2738 |
|
|
unsigned GTY ((tag ("dw_val_class_fde_ref"))) val_fde_index;
|
2739 |
|
|
struct indirect_string_node * GTY ((tag ("dw_val_class_str"))) val_str;
|
2740 |
|
|
char * GTY ((tag ("dw_val_class_lbl_id"))) val_lbl_id;
|
2741 |
|
|
unsigned char GTY ((tag ("dw_val_class_flag"))) val_flag;
|
2742 |
|
|
struct dwarf_file_data * GTY ((tag ("dw_val_class_file"))) val_file;
|
2743 |
|
|
}
|
2744 |
|
|
GTY ((desc ("%1.val_class"))) v;
|
2745 |
|
|
}
|
2746 |
|
|
dw_val_node;
|
2747 |
|
|
|
2748 |
|
|
/* Locations in memory are described using a sequence of stack machine
|
2749 |
|
|
operations. */
|
2750 |
|
|
|
2751 |
|
|
typedef struct dw_loc_descr_struct GTY(())
|
2752 |
|
|
{
|
2753 |
|
|
dw_loc_descr_ref dw_loc_next;
|
2754 |
|
|
enum dwarf_location_atom dw_loc_opc;
|
2755 |
|
|
dw_val_node dw_loc_oprnd1;
|
2756 |
|
|
dw_val_node dw_loc_oprnd2;
|
2757 |
|
|
int dw_loc_addr;
|
2758 |
|
|
}
|
2759 |
|
|
dw_loc_descr_node;
|
2760 |
|
|
|
2761 |
|
|
/* Location lists are ranges + location descriptions for that range,
|
2762 |
|
|
so you can track variables that are in different places over
|
2763 |
|
|
their entire life. */
|
2764 |
|
|
typedef struct dw_loc_list_struct GTY(())
|
2765 |
|
|
{
|
2766 |
|
|
dw_loc_list_ref dw_loc_next;
|
2767 |
|
|
const char *begin; /* Label for begin address of range */
|
2768 |
|
|
const char *end; /* Label for end address of range */
|
2769 |
|
|
char *ll_symbol; /* Label for beginning of location list.
|
2770 |
|
|
Only on head of list */
|
2771 |
|
|
const char *section; /* Section this loclist is relative to */
|
2772 |
|
|
dw_loc_descr_ref expr;
|
2773 |
|
|
} dw_loc_list_node;
|
2774 |
|
|
|
2775 |
|
|
#if defined (DWARF2_DEBUGGING_INFO) || defined (DWARF2_UNWIND_INFO)
|
2776 |
|
|
|
2777 |
|
|
static const char *dwarf_stack_op_name (unsigned);
|
2778 |
|
|
static dw_loc_descr_ref new_loc_descr (enum dwarf_location_atom,
|
2779 |
|
|
unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
|
2780 |
|
|
static void add_loc_descr (dw_loc_descr_ref *, dw_loc_descr_ref);
|
2781 |
|
|
static unsigned long size_of_loc_descr (dw_loc_descr_ref);
|
2782 |
|
|
static unsigned long size_of_locs (dw_loc_descr_ref);
|
2783 |
|
|
static void output_loc_operands (dw_loc_descr_ref);
|
2784 |
|
|
static void output_loc_sequence (dw_loc_descr_ref);
|
2785 |
|
|
|
2786 |
|
|
/* Convert a DWARF stack opcode into its string name. */
|
2787 |
|
|
|
2788 |
|
|
static const char *
|
2789 |
|
|
dwarf_stack_op_name (unsigned int op)
|
2790 |
|
|
{
|
2791 |
|
|
switch (op)
|
2792 |
|
|
{
|
2793 |
|
|
case DW_OP_addr:
|
2794 |
|
|
case INTERNAL_DW_OP_tls_addr:
|
2795 |
|
|
return "DW_OP_addr";
|
2796 |
|
|
case DW_OP_deref:
|
2797 |
|
|
return "DW_OP_deref";
|
2798 |
|
|
case DW_OP_const1u:
|
2799 |
|
|
return "DW_OP_const1u";
|
2800 |
|
|
case DW_OP_const1s:
|
2801 |
|
|
return "DW_OP_const1s";
|
2802 |
|
|
case DW_OP_const2u:
|
2803 |
|
|
return "DW_OP_const2u";
|
2804 |
|
|
case DW_OP_const2s:
|
2805 |
|
|
return "DW_OP_const2s";
|
2806 |
|
|
case DW_OP_const4u:
|
2807 |
|
|
return "DW_OP_const4u";
|
2808 |
|
|
case DW_OP_const4s:
|
2809 |
|
|
return "DW_OP_const4s";
|
2810 |
|
|
case DW_OP_const8u:
|
2811 |
|
|
return "DW_OP_const8u";
|
2812 |
|
|
case DW_OP_const8s:
|
2813 |
|
|
return "DW_OP_const8s";
|
2814 |
|
|
case DW_OP_constu:
|
2815 |
|
|
return "DW_OP_constu";
|
2816 |
|
|
case DW_OP_consts:
|
2817 |
|
|
return "DW_OP_consts";
|
2818 |
|
|
case DW_OP_dup:
|
2819 |
|
|
return "DW_OP_dup";
|
2820 |
|
|
case DW_OP_drop:
|
2821 |
|
|
return "DW_OP_drop";
|
2822 |
|
|
case DW_OP_over:
|
2823 |
|
|
return "DW_OP_over";
|
2824 |
|
|
case DW_OP_pick:
|
2825 |
|
|
return "DW_OP_pick";
|
2826 |
|
|
case DW_OP_swap:
|
2827 |
|
|
return "DW_OP_swap";
|
2828 |
|
|
case DW_OP_rot:
|
2829 |
|
|
return "DW_OP_rot";
|
2830 |
|
|
case DW_OP_xderef:
|
2831 |
|
|
return "DW_OP_xderef";
|
2832 |
|
|
case DW_OP_abs:
|
2833 |
|
|
return "DW_OP_abs";
|
2834 |
|
|
case DW_OP_and:
|
2835 |
|
|
return "DW_OP_and";
|
2836 |
|
|
case DW_OP_div:
|
2837 |
|
|
return "DW_OP_div";
|
2838 |
|
|
case DW_OP_minus:
|
2839 |
|
|
return "DW_OP_minus";
|
2840 |
|
|
case DW_OP_mod:
|
2841 |
|
|
return "DW_OP_mod";
|
2842 |
|
|
case DW_OP_mul:
|
2843 |
|
|
return "DW_OP_mul";
|
2844 |
|
|
case DW_OP_neg:
|
2845 |
|
|
return "DW_OP_neg";
|
2846 |
|
|
case DW_OP_not:
|
2847 |
|
|
return "DW_OP_not";
|
2848 |
|
|
case DW_OP_or:
|
2849 |
|
|
return "DW_OP_or";
|
2850 |
|
|
case DW_OP_plus:
|
2851 |
|
|
return "DW_OP_plus";
|
2852 |
|
|
case DW_OP_plus_uconst:
|
2853 |
|
|
return "DW_OP_plus_uconst";
|
2854 |
|
|
case DW_OP_shl:
|
2855 |
|
|
return "DW_OP_shl";
|
2856 |
|
|
case DW_OP_shr:
|
2857 |
|
|
return "DW_OP_shr";
|
2858 |
|
|
case DW_OP_shra:
|
2859 |
|
|
return "DW_OP_shra";
|
2860 |
|
|
case DW_OP_xor:
|
2861 |
|
|
return "DW_OP_xor";
|
2862 |
|
|
case DW_OP_bra:
|
2863 |
|
|
return "DW_OP_bra";
|
2864 |
|
|
case DW_OP_eq:
|
2865 |
|
|
return "DW_OP_eq";
|
2866 |
|
|
case DW_OP_ge:
|
2867 |
|
|
return "DW_OP_ge";
|
2868 |
|
|
case DW_OP_gt:
|
2869 |
|
|
return "DW_OP_gt";
|
2870 |
|
|
case DW_OP_le:
|
2871 |
|
|
return "DW_OP_le";
|
2872 |
|
|
case DW_OP_lt:
|
2873 |
|
|
return "DW_OP_lt";
|
2874 |
|
|
case DW_OP_ne:
|
2875 |
|
|
return "DW_OP_ne";
|
2876 |
|
|
case DW_OP_skip:
|
2877 |
|
|
return "DW_OP_skip";
|
2878 |
|
|
case DW_OP_lit0:
|
2879 |
|
|
return "DW_OP_lit0";
|
2880 |
|
|
case DW_OP_lit1:
|
2881 |
|
|
return "DW_OP_lit1";
|
2882 |
|
|
case DW_OP_lit2:
|
2883 |
|
|
return "DW_OP_lit2";
|
2884 |
|
|
case DW_OP_lit3:
|
2885 |
|
|
return "DW_OP_lit3";
|
2886 |
|
|
case DW_OP_lit4:
|
2887 |
|
|
return "DW_OP_lit4";
|
2888 |
|
|
case DW_OP_lit5:
|
2889 |
|
|
return "DW_OP_lit5";
|
2890 |
|
|
case DW_OP_lit6:
|
2891 |
|
|
return "DW_OP_lit6";
|
2892 |
|
|
case DW_OP_lit7:
|
2893 |
|
|
return "DW_OP_lit7";
|
2894 |
|
|
case DW_OP_lit8:
|
2895 |
|
|
return "DW_OP_lit8";
|
2896 |
|
|
case DW_OP_lit9:
|
2897 |
|
|
return "DW_OP_lit9";
|
2898 |
|
|
case DW_OP_lit10:
|
2899 |
|
|
return "DW_OP_lit10";
|
2900 |
|
|
case DW_OP_lit11:
|
2901 |
|
|
return "DW_OP_lit11";
|
2902 |
|
|
case DW_OP_lit12:
|
2903 |
|
|
return "DW_OP_lit12";
|
2904 |
|
|
case DW_OP_lit13:
|
2905 |
|
|
return "DW_OP_lit13";
|
2906 |
|
|
case DW_OP_lit14:
|
2907 |
|
|
return "DW_OP_lit14";
|
2908 |
|
|
case DW_OP_lit15:
|
2909 |
|
|
return "DW_OP_lit15";
|
2910 |
|
|
case DW_OP_lit16:
|
2911 |
|
|
return "DW_OP_lit16";
|
2912 |
|
|
case DW_OP_lit17:
|
2913 |
|
|
return "DW_OP_lit17";
|
2914 |
|
|
case DW_OP_lit18:
|
2915 |
|
|
return "DW_OP_lit18";
|
2916 |
|
|
case DW_OP_lit19:
|
2917 |
|
|
return "DW_OP_lit19";
|
2918 |
|
|
case DW_OP_lit20:
|
2919 |
|
|
return "DW_OP_lit20";
|
2920 |
|
|
case DW_OP_lit21:
|
2921 |
|
|
return "DW_OP_lit21";
|
2922 |
|
|
case DW_OP_lit22:
|
2923 |
|
|
return "DW_OP_lit22";
|
2924 |
|
|
case DW_OP_lit23:
|
2925 |
|
|
return "DW_OP_lit23";
|
2926 |
|
|
case DW_OP_lit24:
|
2927 |
|
|
return "DW_OP_lit24";
|
2928 |
|
|
case DW_OP_lit25:
|
2929 |
|
|
return "DW_OP_lit25";
|
2930 |
|
|
case DW_OP_lit26:
|
2931 |
|
|
return "DW_OP_lit26";
|
2932 |
|
|
case DW_OP_lit27:
|
2933 |
|
|
return "DW_OP_lit27";
|
2934 |
|
|
case DW_OP_lit28:
|
2935 |
|
|
return "DW_OP_lit28";
|
2936 |
|
|
case DW_OP_lit29:
|
2937 |
|
|
return "DW_OP_lit29";
|
2938 |
|
|
case DW_OP_lit30:
|
2939 |
|
|
return "DW_OP_lit30";
|
2940 |
|
|
case DW_OP_lit31:
|
2941 |
|
|
return "DW_OP_lit31";
|
2942 |
|
|
case DW_OP_reg0:
|
2943 |
|
|
return "DW_OP_reg0";
|
2944 |
|
|
case DW_OP_reg1:
|
2945 |
|
|
return "DW_OP_reg1";
|
2946 |
|
|
case DW_OP_reg2:
|
2947 |
|
|
return "DW_OP_reg2";
|
2948 |
|
|
case DW_OP_reg3:
|
2949 |
|
|
return "DW_OP_reg3";
|
2950 |
|
|
case DW_OP_reg4:
|
2951 |
|
|
return "DW_OP_reg4";
|
2952 |
|
|
case DW_OP_reg5:
|
2953 |
|
|
return "DW_OP_reg5";
|
2954 |
|
|
case DW_OP_reg6:
|
2955 |
|
|
return "DW_OP_reg6";
|
2956 |
|
|
case DW_OP_reg7:
|
2957 |
|
|
return "DW_OP_reg7";
|
2958 |
|
|
case DW_OP_reg8:
|
2959 |
|
|
return "DW_OP_reg8";
|
2960 |
|
|
case DW_OP_reg9:
|
2961 |
|
|
return "DW_OP_reg9";
|
2962 |
|
|
case DW_OP_reg10:
|
2963 |
|
|
return "DW_OP_reg10";
|
2964 |
|
|
case DW_OP_reg11:
|
2965 |
|
|
return "DW_OP_reg11";
|
2966 |
|
|
case DW_OP_reg12:
|
2967 |
|
|
return "DW_OP_reg12";
|
2968 |
|
|
case DW_OP_reg13:
|
2969 |
|
|
return "DW_OP_reg13";
|
2970 |
|
|
case DW_OP_reg14:
|
2971 |
|
|
return "DW_OP_reg14";
|
2972 |
|
|
case DW_OP_reg15:
|
2973 |
|
|
return "DW_OP_reg15";
|
2974 |
|
|
case DW_OP_reg16:
|
2975 |
|
|
return "DW_OP_reg16";
|
2976 |
|
|
case DW_OP_reg17:
|
2977 |
|
|
return "DW_OP_reg17";
|
2978 |
|
|
case DW_OP_reg18:
|
2979 |
|
|
return "DW_OP_reg18";
|
2980 |
|
|
case DW_OP_reg19:
|
2981 |
|
|
return "DW_OP_reg19";
|
2982 |
|
|
case DW_OP_reg20:
|
2983 |
|
|
return "DW_OP_reg20";
|
2984 |
|
|
case DW_OP_reg21:
|
2985 |
|
|
return "DW_OP_reg21";
|
2986 |
|
|
case DW_OP_reg22:
|
2987 |
|
|
return "DW_OP_reg22";
|
2988 |
|
|
case DW_OP_reg23:
|
2989 |
|
|
return "DW_OP_reg23";
|
2990 |
|
|
case DW_OP_reg24:
|
2991 |
|
|
return "DW_OP_reg24";
|
2992 |
|
|
case DW_OP_reg25:
|
2993 |
|
|
return "DW_OP_reg25";
|
2994 |
|
|
case DW_OP_reg26:
|
2995 |
|
|
return "DW_OP_reg26";
|
2996 |
|
|
case DW_OP_reg27:
|
2997 |
|
|
return "DW_OP_reg27";
|
2998 |
|
|
case DW_OP_reg28:
|
2999 |
|
|
return "DW_OP_reg28";
|
3000 |
|
|
case DW_OP_reg29:
|
3001 |
|
|
return "DW_OP_reg29";
|
3002 |
|
|
case DW_OP_reg30:
|
3003 |
|
|
return "DW_OP_reg30";
|
3004 |
|
|
case DW_OP_reg31:
|
3005 |
|
|
return "DW_OP_reg31";
|
3006 |
|
|
case DW_OP_breg0:
|
3007 |
|
|
return "DW_OP_breg0";
|
3008 |
|
|
case DW_OP_breg1:
|
3009 |
|
|
return "DW_OP_breg1";
|
3010 |
|
|
case DW_OP_breg2:
|
3011 |
|
|
return "DW_OP_breg2";
|
3012 |
|
|
case DW_OP_breg3:
|
3013 |
|
|
return "DW_OP_breg3";
|
3014 |
|
|
case DW_OP_breg4:
|
3015 |
|
|
return "DW_OP_breg4";
|
3016 |
|
|
case DW_OP_breg5:
|
3017 |
|
|
return "DW_OP_breg5";
|
3018 |
|
|
case DW_OP_breg6:
|
3019 |
|
|
return "DW_OP_breg6";
|
3020 |
|
|
case DW_OP_breg7:
|
3021 |
|
|
return "DW_OP_breg7";
|
3022 |
|
|
case DW_OP_breg8:
|
3023 |
|
|
return "DW_OP_breg8";
|
3024 |
|
|
case DW_OP_breg9:
|
3025 |
|
|
return "DW_OP_breg9";
|
3026 |
|
|
case DW_OP_breg10:
|
3027 |
|
|
return "DW_OP_breg10";
|
3028 |
|
|
case DW_OP_breg11:
|
3029 |
|
|
return "DW_OP_breg11";
|
3030 |
|
|
case DW_OP_breg12:
|
3031 |
|
|
return "DW_OP_breg12";
|
3032 |
|
|
case DW_OP_breg13:
|
3033 |
|
|
return "DW_OP_breg13";
|
3034 |
|
|
case DW_OP_breg14:
|
3035 |
|
|
return "DW_OP_breg14";
|
3036 |
|
|
case DW_OP_breg15:
|
3037 |
|
|
return "DW_OP_breg15";
|
3038 |
|
|
case DW_OP_breg16:
|
3039 |
|
|
return "DW_OP_breg16";
|
3040 |
|
|
case DW_OP_breg17:
|
3041 |
|
|
return "DW_OP_breg17";
|
3042 |
|
|
case DW_OP_breg18:
|
3043 |
|
|
return "DW_OP_breg18";
|
3044 |
|
|
case DW_OP_breg19:
|
3045 |
|
|
return "DW_OP_breg19";
|
3046 |
|
|
case DW_OP_breg20:
|
3047 |
|
|
return "DW_OP_breg20";
|
3048 |
|
|
case DW_OP_breg21:
|
3049 |
|
|
return "DW_OP_breg21";
|
3050 |
|
|
case DW_OP_breg22:
|
3051 |
|
|
return "DW_OP_breg22";
|
3052 |
|
|
case DW_OP_breg23:
|
3053 |
|
|
return "DW_OP_breg23";
|
3054 |
|
|
case DW_OP_breg24:
|
3055 |
|
|
return "DW_OP_breg24";
|
3056 |
|
|
case DW_OP_breg25:
|
3057 |
|
|
return "DW_OP_breg25";
|
3058 |
|
|
case DW_OP_breg26:
|
3059 |
|
|
return "DW_OP_breg26";
|
3060 |
|
|
case DW_OP_breg27:
|
3061 |
|
|
return "DW_OP_breg27";
|
3062 |
|
|
case DW_OP_breg28:
|
3063 |
|
|
return "DW_OP_breg28";
|
3064 |
|
|
case DW_OP_breg29:
|
3065 |
|
|
return "DW_OP_breg29";
|
3066 |
|
|
case DW_OP_breg30:
|
3067 |
|
|
return "DW_OP_breg30";
|
3068 |
|
|
case DW_OP_breg31:
|
3069 |
|
|
return "DW_OP_breg31";
|
3070 |
|
|
case DW_OP_regx:
|
3071 |
|
|
return "DW_OP_regx";
|
3072 |
|
|
case DW_OP_fbreg:
|
3073 |
|
|
return "DW_OP_fbreg";
|
3074 |
|
|
case DW_OP_bregx:
|
3075 |
|
|
return "DW_OP_bregx";
|
3076 |
|
|
case DW_OP_piece:
|
3077 |
|
|
return "DW_OP_piece";
|
3078 |
|
|
case DW_OP_deref_size:
|
3079 |
|
|
return "DW_OP_deref_size";
|
3080 |
|
|
case DW_OP_xderef_size:
|
3081 |
|
|
return "DW_OP_xderef_size";
|
3082 |
|
|
case DW_OP_nop:
|
3083 |
|
|
return "DW_OP_nop";
|
3084 |
|
|
case DW_OP_push_object_address:
|
3085 |
|
|
return "DW_OP_push_object_address";
|
3086 |
|
|
case DW_OP_call2:
|
3087 |
|
|
return "DW_OP_call2";
|
3088 |
|
|
case DW_OP_call4:
|
3089 |
|
|
return "DW_OP_call4";
|
3090 |
|
|
case DW_OP_call_ref:
|
3091 |
|
|
return "DW_OP_call_ref";
|
3092 |
|
|
case DW_OP_GNU_push_tls_address:
|
3093 |
|
|
return "DW_OP_GNU_push_tls_address";
|
3094 |
|
|
default:
|
3095 |
|
|
return "OP_<unknown>";
|
3096 |
|
|
}
|
3097 |
|
|
}
|
3098 |
|
|
|
3099 |
|
|
/* Return a pointer to a newly allocated location description. Location
|
3100 |
|
|
descriptions are simple expression terms that can be strung
|
3101 |
|
|
together to form more complicated location (address) descriptions. */
|
3102 |
|
|
|
3103 |
|
|
static inline dw_loc_descr_ref
|
3104 |
|
|
new_loc_descr (enum dwarf_location_atom op, unsigned HOST_WIDE_INT oprnd1,
|
3105 |
|
|
unsigned HOST_WIDE_INT oprnd2)
|
3106 |
|
|
{
|
3107 |
|
|
dw_loc_descr_ref descr = ggc_alloc_cleared (sizeof (dw_loc_descr_node));
|
3108 |
|
|
|
3109 |
|
|
descr->dw_loc_opc = op;
|
3110 |
|
|
descr->dw_loc_oprnd1.val_class = dw_val_class_unsigned_const;
|
3111 |
|
|
descr->dw_loc_oprnd1.v.val_unsigned = oprnd1;
|
3112 |
|
|
descr->dw_loc_oprnd2.val_class = dw_val_class_unsigned_const;
|
3113 |
|
|
descr->dw_loc_oprnd2.v.val_unsigned = oprnd2;
|
3114 |
|
|
|
3115 |
|
|
return descr;
|
3116 |
|
|
}
|
3117 |
|
|
|
3118 |
|
|
/* Add a location description term to a location description expression. */
|
3119 |
|
|
|
3120 |
|
|
static inline void
|
3121 |
|
|
add_loc_descr (dw_loc_descr_ref *list_head, dw_loc_descr_ref descr)
|
3122 |
|
|
{
|
3123 |
|
|
dw_loc_descr_ref *d;
|
3124 |
|
|
|
3125 |
|
|
/* Find the end of the chain. */
|
3126 |
|
|
for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next)
|
3127 |
|
|
;
|
3128 |
|
|
|
3129 |
|
|
*d = descr;
|
3130 |
|
|
}
|
3131 |
|
|
|
3132 |
|
|
/* Return the size of a location descriptor. */
|
3133 |
|
|
|
3134 |
|
|
static unsigned long
|
3135 |
|
|
size_of_loc_descr (dw_loc_descr_ref loc)
|
3136 |
|
|
{
|
3137 |
|
|
unsigned long size = 1;
|
3138 |
|
|
|
3139 |
|
|
switch (loc->dw_loc_opc)
|
3140 |
|
|
{
|
3141 |
|
|
case DW_OP_addr:
|
3142 |
|
|
case INTERNAL_DW_OP_tls_addr:
|
3143 |
|
|
size += DWARF2_ADDR_SIZE;
|
3144 |
|
|
break;
|
3145 |
|
|
case DW_OP_const1u:
|
3146 |
|
|
case DW_OP_const1s:
|
3147 |
|
|
size += 1;
|
3148 |
|
|
break;
|
3149 |
|
|
case DW_OP_const2u:
|
3150 |
|
|
case DW_OP_const2s:
|
3151 |
|
|
size += 2;
|
3152 |
|
|
break;
|
3153 |
|
|
case DW_OP_const4u:
|
3154 |
|
|
case DW_OP_const4s:
|
3155 |
|
|
size += 4;
|
3156 |
|
|
break;
|
3157 |
|
|
case DW_OP_const8u:
|
3158 |
|
|
case DW_OP_const8s:
|
3159 |
|
|
size += 8;
|
3160 |
|
|
break;
|
3161 |
|
|
case DW_OP_constu:
|
3162 |
|
|
size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
|
3163 |
|
|
break;
|
3164 |
|
|
case DW_OP_consts:
|
3165 |
|
|
size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
|
3166 |
|
|
break;
|
3167 |
|
|
case DW_OP_pick:
|
3168 |
|
|
size += 1;
|
3169 |
|
|
break;
|
3170 |
|
|
case DW_OP_plus_uconst:
|
3171 |
|
|
size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
|
3172 |
|
|
break;
|
3173 |
|
|
case DW_OP_skip:
|
3174 |
|
|
case DW_OP_bra:
|
3175 |
|
|
size += 2;
|
3176 |
|
|
break;
|
3177 |
|
|
case DW_OP_breg0:
|
3178 |
|
|
case DW_OP_breg1:
|
3179 |
|
|
case DW_OP_breg2:
|
3180 |
|
|
case DW_OP_breg3:
|
3181 |
|
|
case DW_OP_breg4:
|
3182 |
|
|
case DW_OP_breg5:
|
3183 |
|
|
case DW_OP_breg6:
|
3184 |
|
|
case DW_OP_breg7:
|
3185 |
|
|
case DW_OP_breg8:
|
3186 |
|
|
case DW_OP_breg9:
|
3187 |
|
|
case DW_OP_breg10:
|
3188 |
|
|
case DW_OP_breg11:
|
3189 |
|
|
case DW_OP_breg12:
|
3190 |
|
|
case DW_OP_breg13:
|
3191 |
|
|
case DW_OP_breg14:
|
3192 |
|
|
case DW_OP_breg15:
|
3193 |
|
|
case DW_OP_breg16:
|
3194 |
|
|
case DW_OP_breg17:
|
3195 |
|
|
case DW_OP_breg18:
|
3196 |
|
|
case DW_OP_breg19:
|
3197 |
|
|
case DW_OP_breg20:
|
3198 |
|
|
case DW_OP_breg21:
|
3199 |
|
|
case DW_OP_breg22:
|
3200 |
|
|
case DW_OP_breg23:
|
3201 |
|
|
case DW_OP_breg24:
|
3202 |
|
|
case DW_OP_breg25:
|
3203 |
|
|
case DW_OP_breg26:
|
3204 |
|
|
case DW_OP_breg27:
|
3205 |
|
|
case DW_OP_breg28:
|
3206 |
|
|
case DW_OP_breg29:
|
3207 |
|
|
case DW_OP_breg30:
|
3208 |
|
|
case DW_OP_breg31:
|
3209 |
|
|
size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
|
3210 |
|
|
break;
|
3211 |
|
|
case DW_OP_regx:
|
3212 |
|
|
size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
|
3213 |
|
|
break;
|
3214 |
|
|
case DW_OP_fbreg:
|
3215 |
|
|
size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
|
3216 |
|
|
break;
|
3217 |
|
|
case DW_OP_bregx:
|
3218 |
|
|
size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
|
3219 |
|
|
size += size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int);
|
3220 |
|
|
break;
|
3221 |
|
|
case DW_OP_piece:
|
3222 |
|
|
size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
|
3223 |
|
|
break;
|
3224 |
|
|
case DW_OP_deref_size:
|
3225 |
|
|
case DW_OP_xderef_size:
|
3226 |
|
|
size += 1;
|
3227 |
|
|
break;
|
3228 |
|
|
case DW_OP_call2:
|
3229 |
|
|
size += 2;
|
3230 |
|
|
break;
|
3231 |
|
|
case DW_OP_call4:
|
3232 |
|
|
size += 4;
|
3233 |
|
|
break;
|
3234 |
|
|
case DW_OP_call_ref:
|
3235 |
|
|
size += DWARF2_ADDR_SIZE;
|
3236 |
|
|
break;
|
3237 |
|
|
default:
|
3238 |
|
|
break;
|
3239 |
|
|
}
|
3240 |
|
|
|
3241 |
|
|
return size;
|
3242 |
|
|
}
|
3243 |
|
|
|
3244 |
|
|
/* Return the size of a series of location descriptors. */
|
3245 |
|
|
|
3246 |
|
|
static unsigned long
|
3247 |
|
|
size_of_locs (dw_loc_descr_ref loc)
|
3248 |
|
|
{
|
3249 |
|
|
dw_loc_descr_ref l;
|
3250 |
|
|
unsigned long size;
|
3251 |
|
|
|
3252 |
|
|
/* If there are no skip or bra opcodes, don't fill in the dw_loc_addr
|
3253 |
|
|
field, to avoid writing to a PCH file. */
|
3254 |
|
|
for (size = 0, l = loc; l != NULL; l = l->dw_loc_next)
|
3255 |
|
|
{
|
3256 |
|
|
if (l->dw_loc_opc == DW_OP_skip || l->dw_loc_opc == DW_OP_bra)
|
3257 |
|
|
break;
|
3258 |
|
|
size += size_of_loc_descr (l);
|
3259 |
|
|
}
|
3260 |
|
|
if (! l)
|
3261 |
|
|
return size;
|
3262 |
|
|
|
3263 |
|
|
for (size = 0, l = loc; l != NULL; l = l->dw_loc_next)
|
3264 |
|
|
{
|
3265 |
|
|
l->dw_loc_addr = size;
|
3266 |
|
|
size += size_of_loc_descr (l);
|
3267 |
|
|
}
|
3268 |
|
|
|
3269 |
|
|
return size;
|
3270 |
|
|
}
|
3271 |
|
|
|
3272 |
|
|
/* Output location description stack opcode's operands (if any). */
|
3273 |
|
|
|
3274 |
|
|
static void
|
3275 |
|
|
output_loc_operands (dw_loc_descr_ref loc)
|
3276 |
|
|
{
|
3277 |
|
|
dw_val_ref val1 = &loc->dw_loc_oprnd1;
|
3278 |
|
|
dw_val_ref val2 = &loc->dw_loc_oprnd2;
|
3279 |
|
|
|
3280 |
|
|
switch (loc->dw_loc_opc)
|
3281 |
|
|
{
|
3282 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
3283 |
|
|
case DW_OP_addr:
|
3284 |
|
|
dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, val1->v.val_addr, NULL);
|
3285 |
|
|
break;
|
3286 |
|
|
case DW_OP_const2u:
|
3287 |
|
|
case DW_OP_const2s:
|
3288 |
|
|
dw2_asm_output_data (2, val1->v.val_int, NULL);
|
3289 |
|
|
break;
|
3290 |
|
|
case DW_OP_const4u:
|
3291 |
|
|
case DW_OP_const4s:
|
3292 |
|
|
dw2_asm_output_data (4, val1->v.val_int, NULL);
|
3293 |
|
|
break;
|
3294 |
|
|
case DW_OP_const8u:
|
3295 |
|
|
case DW_OP_const8s:
|
3296 |
|
|
gcc_assert (HOST_BITS_PER_LONG >= 64);
|
3297 |
|
|
dw2_asm_output_data (8, val1->v.val_int, NULL);
|
3298 |
|
|
break;
|
3299 |
|
|
case DW_OP_skip:
|
3300 |
|
|
case DW_OP_bra:
|
3301 |
|
|
{
|
3302 |
|
|
int offset;
|
3303 |
|
|
|
3304 |
|
|
gcc_assert (val1->val_class == dw_val_class_loc);
|
3305 |
|
|
offset = val1->v.val_loc->dw_loc_addr - (loc->dw_loc_addr + 3);
|
3306 |
|
|
|
3307 |
|
|
dw2_asm_output_data (2, offset, NULL);
|
3308 |
|
|
}
|
3309 |
|
|
break;
|
3310 |
|
|
#else
|
3311 |
|
|
case DW_OP_addr:
|
3312 |
|
|
case DW_OP_const2u:
|
3313 |
|
|
case DW_OP_const2s:
|
3314 |
|
|
case DW_OP_const4u:
|
3315 |
|
|
case DW_OP_const4s:
|
3316 |
|
|
case DW_OP_const8u:
|
3317 |
|
|
case DW_OP_const8s:
|
3318 |
|
|
case DW_OP_skip:
|
3319 |
|
|
case DW_OP_bra:
|
3320 |
|
|
/* We currently don't make any attempt to make sure these are
|
3321 |
|
|
aligned properly like we do for the main unwind info, so
|
3322 |
|
|
don't support emitting things larger than a byte if we're
|
3323 |
|
|
only doing unwinding. */
|
3324 |
|
|
gcc_unreachable ();
|
3325 |
|
|
#endif
|
3326 |
|
|
case DW_OP_const1u:
|
3327 |
|
|
case DW_OP_const1s:
|
3328 |
|
|
dw2_asm_output_data (1, val1->v.val_int, NULL);
|
3329 |
|
|
break;
|
3330 |
|
|
case DW_OP_constu:
|
3331 |
|
|
dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
|
3332 |
|
|
break;
|
3333 |
|
|
case DW_OP_consts:
|
3334 |
|
|
dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
|
3335 |
|
|
break;
|
3336 |
|
|
case DW_OP_pick:
|
3337 |
|
|
dw2_asm_output_data (1, val1->v.val_int, NULL);
|
3338 |
|
|
break;
|
3339 |
|
|
case DW_OP_plus_uconst:
|
3340 |
|
|
dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
|
3341 |
|
|
break;
|
3342 |
|
|
case DW_OP_breg0:
|
3343 |
|
|
case DW_OP_breg1:
|
3344 |
|
|
case DW_OP_breg2:
|
3345 |
|
|
case DW_OP_breg3:
|
3346 |
|
|
case DW_OP_breg4:
|
3347 |
|
|
case DW_OP_breg5:
|
3348 |
|
|
case DW_OP_breg6:
|
3349 |
|
|
case DW_OP_breg7:
|
3350 |
|
|
case DW_OP_breg8:
|
3351 |
|
|
case DW_OP_breg9:
|
3352 |
|
|
case DW_OP_breg10:
|
3353 |
|
|
case DW_OP_breg11:
|
3354 |
|
|
case DW_OP_breg12:
|
3355 |
|
|
case DW_OP_breg13:
|
3356 |
|
|
case DW_OP_breg14:
|
3357 |
|
|
case DW_OP_breg15:
|
3358 |
|
|
case DW_OP_breg16:
|
3359 |
|
|
case DW_OP_breg17:
|
3360 |
|
|
case DW_OP_breg18:
|
3361 |
|
|
case DW_OP_breg19:
|
3362 |
|
|
case DW_OP_breg20:
|
3363 |
|
|
case DW_OP_breg21:
|
3364 |
|
|
case DW_OP_breg22:
|
3365 |
|
|
case DW_OP_breg23:
|
3366 |
|
|
case DW_OP_breg24:
|
3367 |
|
|
case DW_OP_breg25:
|
3368 |
|
|
case DW_OP_breg26:
|
3369 |
|
|
case DW_OP_breg27:
|
3370 |
|
|
case DW_OP_breg28:
|
3371 |
|
|
case DW_OP_breg29:
|
3372 |
|
|
case DW_OP_breg30:
|
3373 |
|
|
case DW_OP_breg31:
|
3374 |
|
|
dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
|
3375 |
|
|
break;
|
3376 |
|
|
case DW_OP_regx:
|
3377 |
|
|
dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
|
3378 |
|
|
break;
|
3379 |
|
|
case DW_OP_fbreg:
|
3380 |
|
|
dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
|
3381 |
|
|
break;
|
3382 |
|
|
case DW_OP_bregx:
|
3383 |
|
|
dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
|
3384 |
|
|
dw2_asm_output_data_sleb128 (val2->v.val_int, NULL);
|
3385 |
|
|
break;
|
3386 |
|
|
case DW_OP_piece:
|
3387 |
|
|
dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
|
3388 |
|
|
break;
|
3389 |
|
|
case DW_OP_deref_size:
|
3390 |
|
|
case DW_OP_xderef_size:
|
3391 |
|
|
dw2_asm_output_data (1, val1->v.val_int, NULL);
|
3392 |
|
|
break;
|
3393 |
|
|
|
3394 |
|
|
case INTERNAL_DW_OP_tls_addr:
|
3395 |
|
|
if (targetm.asm_out.output_dwarf_dtprel)
|
3396 |
|
|
{
|
3397 |
|
|
targetm.asm_out.output_dwarf_dtprel (asm_out_file,
|
3398 |
|
|
DWARF2_ADDR_SIZE,
|
3399 |
|
|
val1->v.val_addr);
|
3400 |
|
|
fputc ('\n', asm_out_file);
|
3401 |
|
|
}
|
3402 |
|
|
else
|
3403 |
|
|
gcc_unreachable ();
|
3404 |
|
|
break;
|
3405 |
|
|
|
3406 |
|
|
default:
|
3407 |
|
|
/* Other codes have no operands. */
|
3408 |
|
|
break;
|
3409 |
|
|
}
|
3410 |
|
|
}
|
3411 |
|
|
|
3412 |
|
|
/* Output a sequence of location operations. */
|
3413 |
|
|
|
3414 |
|
|
static void
|
3415 |
|
|
output_loc_sequence (dw_loc_descr_ref loc)
|
3416 |
|
|
{
|
3417 |
|
|
for (; loc != NULL; loc = loc->dw_loc_next)
|
3418 |
|
|
{
|
3419 |
|
|
/* Output the opcode. */
|
3420 |
|
|
dw2_asm_output_data (1, loc->dw_loc_opc,
|
3421 |
|
|
"%s", dwarf_stack_op_name (loc->dw_loc_opc));
|
3422 |
|
|
|
3423 |
|
|
/* Output the operand(s) (if any). */
|
3424 |
|
|
output_loc_operands (loc);
|
3425 |
|
|
}
|
3426 |
|
|
}
|
3427 |
|
|
|
3428 |
|
|
/* This routine will generate the correct assembly data for a location
|
3429 |
|
|
description based on a cfi entry with a complex address. */
|
3430 |
|
|
|
3431 |
|
|
static void
|
3432 |
|
|
output_cfa_loc (dw_cfi_ref cfi)
|
3433 |
|
|
{
|
3434 |
|
|
dw_loc_descr_ref loc;
|
3435 |
|
|
unsigned long size;
|
3436 |
|
|
|
3437 |
|
|
/* Output the size of the block. */
|
3438 |
|
|
loc = cfi->dw_cfi_oprnd1.dw_cfi_loc;
|
3439 |
|
|
size = size_of_locs (loc);
|
3440 |
|
|
dw2_asm_output_data_uleb128 (size, NULL);
|
3441 |
|
|
|
3442 |
|
|
/* Now output the operations themselves. */
|
3443 |
|
|
output_loc_sequence (loc);
|
3444 |
|
|
}
|
3445 |
|
|
|
3446 |
|
|
/* This function builds a dwarf location descriptor sequence from a
|
3447 |
|
|
dw_cfa_location, adding the given OFFSET to the result of the
|
3448 |
|
|
expression. */
|
3449 |
|
|
|
3450 |
|
|
static struct dw_loc_descr_struct *
|
3451 |
|
|
build_cfa_loc (dw_cfa_location *cfa, HOST_WIDE_INT offset)
|
3452 |
|
|
{
|
3453 |
|
|
struct dw_loc_descr_struct *head, *tmp;
|
3454 |
|
|
|
3455 |
|
|
offset += cfa->offset;
|
3456 |
|
|
|
3457 |
|
|
if (cfa->indirect)
|
3458 |
|
|
{
|
3459 |
|
|
if (cfa->base_offset)
|
3460 |
|
|
{
|
3461 |
|
|
if (cfa->reg <= 31)
|
3462 |
|
|
head = new_loc_descr (DW_OP_breg0 + cfa->reg, cfa->base_offset, 0);
|
3463 |
|
|
else
|
3464 |
|
|
head = new_loc_descr (DW_OP_bregx, cfa->reg, cfa->base_offset);
|
3465 |
|
|
}
|
3466 |
|
|
else if (cfa->reg <= 31)
|
3467 |
|
|
head = new_loc_descr (DW_OP_reg0 + cfa->reg, 0, 0);
|
3468 |
|
|
else
|
3469 |
|
|
head = new_loc_descr (DW_OP_regx, cfa->reg, 0);
|
3470 |
|
|
|
3471 |
|
|
head->dw_loc_oprnd1.val_class = dw_val_class_const;
|
3472 |
|
|
tmp = new_loc_descr (DW_OP_deref, 0, 0);
|
3473 |
|
|
add_loc_descr (&head, tmp);
|
3474 |
|
|
if (offset != 0)
|
3475 |
|
|
{
|
3476 |
|
|
tmp = new_loc_descr (DW_OP_plus_uconst, offset, 0);
|
3477 |
|
|
add_loc_descr (&head, tmp);
|
3478 |
|
|
}
|
3479 |
|
|
}
|
3480 |
|
|
else
|
3481 |
|
|
{
|
3482 |
|
|
if (offset == 0)
|
3483 |
|
|
if (cfa->reg <= 31)
|
3484 |
|
|
head = new_loc_descr (DW_OP_reg0 + cfa->reg, 0, 0);
|
3485 |
|
|
else
|
3486 |
|
|
head = new_loc_descr (DW_OP_regx, cfa->reg, 0);
|
3487 |
|
|
else if (cfa->reg <= 31)
|
3488 |
|
|
head = new_loc_descr (DW_OP_breg0 + cfa->reg, offset, 0);
|
3489 |
|
|
else
|
3490 |
|
|
head = new_loc_descr (DW_OP_bregx, cfa->reg, offset);
|
3491 |
|
|
}
|
3492 |
|
|
|
3493 |
|
|
return head;
|
3494 |
|
|
}
|
3495 |
|
|
|
3496 |
|
|
/* This function fills in aa dw_cfa_location structure from a dwarf location
|
3497 |
|
|
descriptor sequence. */
|
3498 |
|
|
|
3499 |
|
|
static void
|
3500 |
|
|
get_cfa_from_loc_descr (dw_cfa_location *cfa, struct dw_loc_descr_struct *loc)
|
3501 |
|
|
{
|
3502 |
|
|
struct dw_loc_descr_struct *ptr;
|
3503 |
|
|
cfa->offset = 0;
|
3504 |
|
|
cfa->base_offset = 0;
|
3505 |
|
|
cfa->indirect = 0;
|
3506 |
|
|
cfa->reg = -1;
|
3507 |
|
|
|
3508 |
|
|
for (ptr = loc; ptr != NULL; ptr = ptr->dw_loc_next)
|
3509 |
|
|
{
|
3510 |
|
|
enum dwarf_location_atom op = ptr->dw_loc_opc;
|
3511 |
|
|
|
3512 |
|
|
switch (op)
|
3513 |
|
|
{
|
3514 |
|
|
case DW_OP_reg0:
|
3515 |
|
|
case DW_OP_reg1:
|
3516 |
|
|
case DW_OP_reg2:
|
3517 |
|
|
case DW_OP_reg3:
|
3518 |
|
|
case DW_OP_reg4:
|
3519 |
|
|
case DW_OP_reg5:
|
3520 |
|
|
case DW_OP_reg6:
|
3521 |
|
|
case DW_OP_reg7:
|
3522 |
|
|
case DW_OP_reg8:
|
3523 |
|
|
case DW_OP_reg9:
|
3524 |
|
|
case DW_OP_reg10:
|
3525 |
|
|
case DW_OP_reg11:
|
3526 |
|
|
case DW_OP_reg12:
|
3527 |
|
|
case DW_OP_reg13:
|
3528 |
|
|
case DW_OP_reg14:
|
3529 |
|
|
case DW_OP_reg15:
|
3530 |
|
|
case DW_OP_reg16:
|
3531 |
|
|
case DW_OP_reg17:
|
3532 |
|
|
case DW_OP_reg18:
|
3533 |
|
|
case DW_OP_reg19:
|
3534 |
|
|
case DW_OP_reg20:
|
3535 |
|
|
case DW_OP_reg21:
|
3536 |
|
|
case DW_OP_reg22:
|
3537 |
|
|
case DW_OP_reg23:
|
3538 |
|
|
case DW_OP_reg24:
|
3539 |
|
|
case DW_OP_reg25:
|
3540 |
|
|
case DW_OP_reg26:
|
3541 |
|
|
case DW_OP_reg27:
|
3542 |
|
|
case DW_OP_reg28:
|
3543 |
|
|
case DW_OP_reg29:
|
3544 |
|
|
case DW_OP_reg30:
|
3545 |
|
|
case DW_OP_reg31:
|
3546 |
|
|
cfa->reg = op - DW_OP_reg0;
|
3547 |
|
|
break;
|
3548 |
|
|
case DW_OP_regx:
|
3549 |
|
|
cfa->reg = ptr->dw_loc_oprnd1.v.val_int;
|
3550 |
|
|
break;
|
3551 |
|
|
case DW_OP_breg0:
|
3552 |
|
|
case DW_OP_breg1:
|
3553 |
|
|
case DW_OP_breg2:
|
3554 |
|
|
case DW_OP_breg3:
|
3555 |
|
|
case DW_OP_breg4:
|
3556 |
|
|
case DW_OP_breg5:
|
3557 |
|
|
case DW_OP_breg6:
|
3558 |
|
|
case DW_OP_breg7:
|
3559 |
|
|
case DW_OP_breg8:
|
3560 |
|
|
case DW_OP_breg9:
|
3561 |
|
|
case DW_OP_breg10:
|
3562 |
|
|
case DW_OP_breg11:
|
3563 |
|
|
case DW_OP_breg12:
|
3564 |
|
|
case DW_OP_breg13:
|
3565 |
|
|
case DW_OP_breg14:
|
3566 |
|
|
case DW_OP_breg15:
|
3567 |
|
|
case DW_OP_breg16:
|
3568 |
|
|
case DW_OP_breg17:
|
3569 |
|
|
case DW_OP_breg18:
|
3570 |
|
|
case DW_OP_breg19:
|
3571 |
|
|
case DW_OP_breg20:
|
3572 |
|
|
case DW_OP_breg21:
|
3573 |
|
|
case DW_OP_breg22:
|
3574 |
|
|
case DW_OP_breg23:
|
3575 |
|
|
case DW_OP_breg24:
|
3576 |
|
|
case DW_OP_breg25:
|
3577 |
|
|
case DW_OP_breg26:
|
3578 |
|
|
case DW_OP_breg27:
|
3579 |
|
|
case DW_OP_breg28:
|
3580 |
|
|
case DW_OP_breg29:
|
3581 |
|
|
case DW_OP_breg30:
|
3582 |
|
|
case DW_OP_breg31:
|
3583 |
|
|
cfa->reg = op - DW_OP_breg0;
|
3584 |
|
|
cfa->base_offset = ptr->dw_loc_oprnd1.v.val_int;
|
3585 |
|
|
break;
|
3586 |
|
|
case DW_OP_bregx:
|
3587 |
|
|
cfa->reg = ptr->dw_loc_oprnd1.v.val_int;
|
3588 |
|
|
cfa->base_offset = ptr->dw_loc_oprnd2.v.val_int;
|
3589 |
|
|
break;
|
3590 |
|
|
case DW_OP_deref:
|
3591 |
|
|
cfa->indirect = 1;
|
3592 |
|
|
break;
|
3593 |
|
|
case DW_OP_plus_uconst:
|
3594 |
|
|
cfa->offset = ptr->dw_loc_oprnd1.v.val_unsigned;
|
3595 |
|
|
break;
|
3596 |
|
|
default:
|
3597 |
|
|
internal_error ("DW_LOC_OP %s not implemented",
|
3598 |
|
|
dwarf_stack_op_name (ptr->dw_loc_opc));
|
3599 |
|
|
}
|
3600 |
|
|
}
|
3601 |
|
|
}
|
3602 |
|
|
#endif /* .debug_frame support */
|
3603 |
|
|
|
3604 |
|
|
/* And now, the support for symbolic debugging information. */
|
3605 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
3606 |
|
|
|
3607 |
|
|
/* .debug_str support. */
|
3608 |
|
|
static int output_indirect_string (void **, void *);
|
3609 |
|
|
|
3610 |
|
|
static void dwarf2out_init (const char *);
|
3611 |
|
|
static void dwarf2out_finish (const char *);
|
3612 |
|
|
static void dwarf2out_define (unsigned int, const char *);
|
3613 |
|
|
static void dwarf2out_undef (unsigned int, const char *);
|
3614 |
|
|
static void dwarf2out_start_source_file (unsigned, const char *);
|
3615 |
|
|
static void dwarf2out_end_source_file (unsigned);
|
3616 |
|
|
static void dwarf2out_begin_block (unsigned, unsigned);
|
3617 |
|
|
static void dwarf2out_end_block (unsigned, unsigned);
|
3618 |
|
|
static bool dwarf2out_ignore_block (tree);
|
3619 |
|
|
static void dwarf2out_global_decl (tree);
|
3620 |
|
|
static void dwarf2out_type_decl (tree, int);
|
3621 |
|
|
static void dwarf2out_imported_module_or_decl (tree, tree);
|
3622 |
|
|
static void dwarf2out_abstract_function (tree);
|
3623 |
|
|
static void dwarf2out_var_location (rtx);
|
3624 |
|
|
static void dwarf2out_begin_function (tree);
|
3625 |
|
|
static void dwarf2out_switch_text_section (void);
|
3626 |
|
|
|
3627 |
|
|
/* The debug hooks structure. */
|
3628 |
|
|
|
3629 |
|
|
const struct gcc_debug_hooks dwarf2_debug_hooks =
|
3630 |
|
|
{
|
3631 |
|
|
dwarf2out_init,
|
3632 |
|
|
dwarf2out_finish,
|
3633 |
|
|
dwarf2out_define,
|
3634 |
|
|
dwarf2out_undef,
|
3635 |
|
|
dwarf2out_start_source_file,
|
3636 |
|
|
dwarf2out_end_source_file,
|
3637 |
|
|
dwarf2out_begin_block,
|
3638 |
|
|
dwarf2out_end_block,
|
3639 |
|
|
dwarf2out_ignore_block,
|
3640 |
|
|
dwarf2out_source_line,
|
3641 |
|
|
dwarf2out_begin_prologue,
|
3642 |
|
|
debug_nothing_int_charstar, /* end_prologue */
|
3643 |
|
|
dwarf2out_end_epilogue,
|
3644 |
|
|
dwarf2out_begin_function,
|
3645 |
|
|
debug_nothing_int, /* end_function */
|
3646 |
|
|
dwarf2out_decl, /* function_decl */
|
3647 |
|
|
dwarf2out_global_decl,
|
3648 |
|
|
dwarf2out_type_decl, /* type_decl */
|
3649 |
|
|
dwarf2out_imported_module_or_decl,
|
3650 |
|
|
debug_nothing_tree, /* deferred_inline_function */
|
3651 |
|
|
/* The DWARF 2 backend tries to reduce debugging bloat by not
|
3652 |
|
|
emitting the abstract description of inline functions until
|
3653 |
|
|
something tries to reference them. */
|
3654 |
|
|
dwarf2out_abstract_function, /* outlining_inline_function */
|
3655 |
|
|
debug_nothing_rtx, /* label */
|
3656 |
|
|
debug_nothing_int, /* handle_pch */
|
3657 |
|
|
dwarf2out_var_location,
|
3658 |
|
|
dwarf2out_switch_text_section,
|
3659 |
|
|
1 /* start_end_main_source_file */
|
3660 |
|
|
};
|
3661 |
|
|
#endif
|
3662 |
|
|
|
3663 |
|
|
/* NOTE: In the comments in this file, many references are made to
|
3664 |
|
|
"Debugging Information Entries". This term is abbreviated as `DIE'
|
3665 |
|
|
throughout the remainder of this file. */
|
3666 |
|
|
|
3667 |
|
|
/* An internal representation of the DWARF output is built, and then
|
3668 |
|
|
walked to generate the DWARF debugging info. The walk of the internal
|
3669 |
|
|
representation is done after the entire program has been compiled.
|
3670 |
|
|
The types below are used to describe the internal representation. */
|
3671 |
|
|
|
3672 |
|
|
/* Various DIE's use offsets relative to the beginning of the
|
3673 |
|
|
.debug_info section to refer to each other. */
|
3674 |
|
|
|
3675 |
|
|
typedef long int dw_offset;
|
3676 |
|
|
|
3677 |
|
|
/* Define typedefs here to avoid circular dependencies. */
|
3678 |
|
|
|
3679 |
|
|
typedef struct dw_attr_struct *dw_attr_ref;
|
3680 |
|
|
typedef struct dw_line_info_struct *dw_line_info_ref;
|
3681 |
|
|
typedef struct dw_separate_line_info_struct *dw_separate_line_info_ref;
|
3682 |
|
|
typedef struct pubname_struct *pubname_ref;
|
3683 |
|
|
typedef struct dw_ranges_struct *dw_ranges_ref;
|
3684 |
|
|
|
3685 |
|
|
/* Each entry in the line_info_table maintains the file and
|
3686 |
|
|
line number associated with the label generated for that
|
3687 |
|
|
entry. The label gives the PC value associated with
|
3688 |
|
|
the line number entry. */
|
3689 |
|
|
|
3690 |
|
|
typedef struct dw_line_info_struct GTY(())
|
3691 |
|
|
{
|
3692 |
|
|
unsigned long dw_file_num;
|
3693 |
|
|
unsigned long dw_line_num;
|
3694 |
|
|
}
|
3695 |
|
|
dw_line_info_entry;
|
3696 |
|
|
|
3697 |
|
|
/* Line information for functions in separate sections; each one gets its
|
3698 |
|
|
own sequence. */
|
3699 |
|
|
typedef struct dw_separate_line_info_struct GTY(())
|
3700 |
|
|
{
|
3701 |
|
|
unsigned long dw_file_num;
|
3702 |
|
|
unsigned long dw_line_num;
|
3703 |
|
|
unsigned long function;
|
3704 |
|
|
}
|
3705 |
|
|
dw_separate_line_info_entry;
|
3706 |
|
|
|
3707 |
|
|
/* Each DIE attribute has a field specifying the attribute kind,
|
3708 |
|
|
a link to the next attribute in the chain, and an attribute value.
|
3709 |
|
|
Attributes are typically linked below the DIE they modify. */
|
3710 |
|
|
|
3711 |
|
|
typedef struct dw_attr_struct GTY(())
|
3712 |
|
|
{
|
3713 |
|
|
enum dwarf_attribute dw_attr;
|
3714 |
|
|
dw_val_node dw_attr_val;
|
3715 |
|
|
}
|
3716 |
|
|
dw_attr_node;
|
3717 |
|
|
|
3718 |
|
|
DEF_VEC_O(dw_attr_node);
|
3719 |
|
|
DEF_VEC_ALLOC_O(dw_attr_node,gc);
|
3720 |
|
|
|
3721 |
|
|
/* The Debugging Information Entry (DIE) structure. DIEs form a tree.
|
3722 |
|
|
The children of each node form a circular list linked by
|
3723 |
|
|
die_sib. die_child points to the node *before* the "first" child node. */
|
3724 |
|
|
|
3725 |
|
|
typedef struct die_struct GTY(())
|
3726 |
|
|
{
|
3727 |
|
|
enum dwarf_tag die_tag;
|
3728 |
|
|
char *die_symbol;
|
3729 |
|
|
VEC(dw_attr_node,gc) * die_attr;
|
3730 |
|
|
dw_die_ref die_parent;
|
3731 |
|
|
dw_die_ref die_child;
|
3732 |
|
|
dw_die_ref die_sib;
|
3733 |
|
|
dw_die_ref die_definition; /* ref from a specification to its definition */
|
3734 |
|
|
dw_offset die_offset;
|
3735 |
|
|
unsigned long die_abbrev;
|
3736 |
|
|
int die_mark;
|
3737 |
|
|
/* Die is used and must not be pruned as unused. */
|
3738 |
|
|
int die_perennial_p;
|
3739 |
|
|
unsigned int decl_id;
|
3740 |
|
|
}
|
3741 |
|
|
die_node;
|
3742 |
|
|
|
3743 |
|
|
/* Evaluate 'expr' while 'c' is set to each child of DIE in order. */
|
3744 |
|
|
#define FOR_EACH_CHILD(die, c, expr) do { \
|
3745 |
|
|
c = die->die_child; \
|
3746 |
|
|
if (c) do { \
|
3747 |
|
|
c = c->die_sib; \
|
3748 |
|
|
expr; \
|
3749 |
|
|
} while (c != die->die_child); \
|
3750 |
|
|
} while (0)
|
3751 |
|
|
|
3752 |
|
|
/* The pubname structure */
|
3753 |
|
|
|
3754 |
|
|
typedef struct pubname_struct GTY(())
|
3755 |
|
|
{
|
3756 |
|
|
dw_die_ref die;
|
3757 |
|
|
char *name;
|
3758 |
|
|
}
|
3759 |
|
|
pubname_entry;
|
3760 |
|
|
|
3761 |
|
|
struct dw_ranges_struct GTY(())
|
3762 |
|
|
{
|
3763 |
|
|
int block_num;
|
3764 |
|
|
};
|
3765 |
|
|
|
3766 |
|
|
/* The limbo die list structure. */
|
3767 |
|
|
typedef struct limbo_die_struct GTY(())
|
3768 |
|
|
{
|
3769 |
|
|
dw_die_ref die;
|
3770 |
|
|
tree created_for;
|
3771 |
|
|
struct limbo_die_struct *next;
|
3772 |
|
|
}
|
3773 |
|
|
limbo_die_node;
|
3774 |
|
|
|
3775 |
|
|
/* How to start an assembler comment. */
|
3776 |
|
|
#ifndef ASM_COMMENT_START
|
3777 |
|
|
#define ASM_COMMENT_START ";#"
|
3778 |
|
|
#endif
|
3779 |
|
|
|
3780 |
|
|
/* Define a macro which returns nonzero for a TYPE_DECL which was
|
3781 |
|
|
implicitly generated for a tagged type.
|
3782 |
|
|
|
3783 |
|
|
Note that unlike the gcc front end (which generates a NULL named
|
3784 |
|
|
TYPE_DECL node for each complete tagged type, each array type, and
|
3785 |
|
|
each function type node created) the g++ front end generates a
|
3786 |
|
|
_named_ TYPE_DECL node for each tagged type node created.
|
3787 |
|
|
These TYPE_DECLs have DECL_ARTIFICIAL set, so we know not to
|
3788 |
|
|
generate a DW_TAG_typedef DIE for them. */
|
3789 |
|
|
|
3790 |
|
|
#define TYPE_DECL_IS_STUB(decl) \
|
3791 |
|
|
(DECL_NAME (decl) == NULL_TREE \
|
3792 |
|
|
|| (DECL_ARTIFICIAL (decl) \
|
3793 |
|
|
&& is_tagged_type (TREE_TYPE (decl)) \
|
3794 |
|
|
&& ((decl == TYPE_STUB_DECL (TREE_TYPE (decl))) \
|
3795 |
|
|
/* This is necessary for stub decls that \
|
3796 |
|
|
appear in nested inline functions. */ \
|
3797 |
|
|
|| (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE \
|
3798 |
|
|
&& (decl_ultimate_origin (decl) \
|
3799 |
|
|
== TYPE_STUB_DECL (TREE_TYPE (decl)))))))
|
3800 |
|
|
|
3801 |
|
|
/* Information concerning the compilation unit's programming
|
3802 |
|
|
language, and compiler version. */
|
3803 |
|
|
|
3804 |
|
|
/* Fixed size portion of the DWARF compilation unit header. */
|
3805 |
|
|
#define DWARF_COMPILE_UNIT_HEADER_SIZE \
|
3806 |
|
|
(DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 3)
|
3807 |
|
|
|
3808 |
|
|
/* Fixed size portion of public names info. */
|
3809 |
|
|
#define DWARF_PUBNAMES_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 2)
|
3810 |
|
|
|
3811 |
|
|
/* Fixed size portion of the address range info. */
|
3812 |
|
|
#define DWARF_ARANGES_HEADER_SIZE \
|
3813 |
|
|
(DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \
|
3814 |
|
|
DWARF2_ADDR_SIZE * 2) \
|
3815 |
|
|
- DWARF_INITIAL_LENGTH_SIZE)
|
3816 |
|
|
|
3817 |
|
|
/* Size of padding portion in the address range info. It must be
|
3818 |
|
|
aligned to twice the pointer size. */
|
3819 |
|
|
#define DWARF_ARANGES_PAD_SIZE \
|
3820 |
|
|
(DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \
|
3821 |
|
|
DWARF2_ADDR_SIZE * 2) \
|
3822 |
|
|
- (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4))
|
3823 |
|
|
|
3824 |
|
|
/* Use assembler line directives if available. */
|
3825 |
|
|
#ifndef DWARF2_ASM_LINE_DEBUG_INFO
|
3826 |
|
|
#ifdef HAVE_AS_DWARF2_DEBUG_LINE
|
3827 |
|
|
#define DWARF2_ASM_LINE_DEBUG_INFO 1
|
3828 |
|
|
#else
|
3829 |
|
|
#define DWARF2_ASM_LINE_DEBUG_INFO 0
|
3830 |
|
|
#endif
|
3831 |
|
|
#endif
|
3832 |
|
|
|
3833 |
|
|
/* Minimum line offset in a special line info. opcode.
|
3834 |
|
|
This value was chosen to give a reasonable range of values. */
|
3835 |
|
|
#define DWARF_LINE_BASE -10
|
3836 |
|
|
|
3837 |
|
|
/* First special line opcode - leave room for the standard opcodes. */
|
3838 |
|
|
#define DWARF_LINE_OPCODE_BASE 10
|
3839 |
|
|
|
3840 |
|
|
/* Range of line offsets in a special line info. opcode. */
|
3841 |
|
|
#define DWARF_LINE_RANGE (254-DWARF_LINE_OPCODE_BASE+1)
|
3842 |
|
|
|
3843 |
|
|
/* Flag that indicates the initial value of the is_stmt_start flag.
|
3844 |
|
|
In the present implementation, we do not mark any lines as
|
3845 |
|
|
the beginning of a source statement, because that information
|
3846 |
|
|
is not made available by the GCC front-end. */
|
3847 |
|
|
#define DWARF_LINE_DEFAULT_IS_STMT_START 1
|
3848 |
|
|
|
3849 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
3850 |
|
|
/* This location is used by calc_die_sizes() to keep track
|
3851 |
|
|
the offset of each DIE within the .debug_info section. */
|
3852 |
|
|
static unsigned long next_die_offset;
|
3853 |
|
|
#endif
|
3854 |
|
|
|
3855 |
|
|
/* Record the root of the DIE's built for the current compilation unit. */
|
3856 |
|
|
static GTY(()) dw_die_ref comp_unit_die;
|
3857 |
|
|
|
3858 |
|
|
/* A list of DIEs with a NULL parent waiting to be relocated. */
|
3859 |
|
|
static GTY(()) limbo_die_node *limbo_die_list;
|
3860 |
|
|
|
3861 |
|
|
/* Filenames referenced by this compilation unit. */
|
3862 |
|
|
static GTY((param_is (struct dwarf_file_data))) htab_t file_table;
|
3863 |
|
|
|
3864 |
|
|
/* A hash table of references to DIE's that describe declarations.
|
3865 |
|
|
The key is a DECL_UID() which is a unique number identifying each decl. */
|
3866 |
|
|
static GTY ((param_is (struct die_struct))) htab_t decl_die_table;
|
3867 |
|
|
|
3868 |
|
|
/* Node of the variable location list. */
|
3869 |
|
|
struct var_loc_node GTY ((chain_next ("%h.next")))
|
3870 |
|
|
{
|
3871 |
|
|
rtx GTY (()) var_loc_note;
|
3872 |
|
|
const char * GTY (()) label;
|
3873 |
|
|
const char * GTY (()) section_label;
|
3874 |
|
|
struct var_loc_node * GTY (()) next;
|
3875 |
|
|
};
|
3876 |
|
|
|
3877 |
|
|
/* Variable location list. */
|
3878 |
|
|
struct var_loc_list_def GTY (())
|
3879 |
|
|
{
|
3880 |
|
|
struct var_loc_node * GTY (()) first;
|
3881 |
|
|
|
3882 |
|
|
/* Do not mark the last element of the chained list because
|
3883 |
|
|
it is marked through the chain. */
|
3884 |
|
|
struct var_loc_node * GTY ((skip ("%h"))) last;
|
3885 |
|
|
|
3886 |
|
|
/* DECL_UID of the variable decl. */
|
3887 |
|
|
unsigned int decl_id;
|
3888 |
|
|
};
|
3889 |
|
|
typedef struct var_loc_list_def var_loc_list;
|
3890 |
|
|
|
3891 |
|
|
|
3892 |
|
|
/* Table of decl location linked lists. */
|
3893 |
|
|
static GTY ((param_is (var_loc_list))) htab_t decl_loc_table;
|
3894 |
|
|
|
3895 |
|
|
/* A pointer to the base of a list of references to DIE's that
|
3896 |
|
|
are uniquely identified by their tag, presence/absence of
|
3897 |
|
|
children DIE's, and list of attribute/value pairs. */
|
3898 |
|
|
static GTY((length ("abbrev_die_table_allocated")))
|
3899 |
|
|
dw_die_ref *abbrev_die_table;
|
3900 |
|
|
|
3901 |
|
|
/* Number of elements currently allocated for abbrev_die_table. */
|
3902 |
|
|
static GTY(()) unsigned abbrev_die_table_allocated;
|
3903 |
|
|
|
3904 |
|
|
/* Number of elements in type_die_table currently in use. */
|
3905 |
|
|
static GTY(()) unsigned abbrev_die_table_in_use;
|
3906 |
|
|
|
3907 |
|
|
/* Size (in elements) of increments by which we may expand the
|
3908 |
|
|
abbrev_die_table. */
|
3909 |
|
|
#define ABBREV_DIE_TABLE_INCREMENT 256
|
3910 |
|
|
|
3911 |
|
|
/* A pointer to the base of a table that contains line information
|
3912 |
|
|
for each source code line in .text in the compilation unit. */
|
3913 |
|
|
static GTY((length ("line_info_table_allocated")))
|
3914 |
|
|
dw_line_info_ref line_info_table;
|
3915 |
|
|
|
3916 |
|
|
/* Number of elements currently allocated for line_info_table. */
|
3917 |
|
|
static GTY(()) unsigned line_info_table_allocated;
|
3918 |
|
|
|
3919 |
|
|
/* Number of elements in line_info_table currently in use. */
|
3920 |
|
|
static GTY(()) unsigned line_info_table_in_use;
|
3921 |
|
|
|
3922 |
|
|
/* True if the compilation unit places functions in more than one section. */
|
3923 |
|
|
static GTY(()) bool have_multiple_function_sections = false;
|
3924 |
|
|
|
3925 |
|
|
/* A pointer to the base of a table that contains line information
|
3926 |
|
|
for each source code line outside of .text in the compilation unit. */
|
3927 |
|
|
static GTY ((length ("separate_line_info_table_allocated")))
|
3928 |
|
|
dw_separate_line_info_ref separate_line_info_table;
|
3929 |
|
|
|
3930 |
|
|
/* Number of elements currently allocated for separate_line_info_table. */
|
3931 |
|
|
static GTY(()) unsigned separate_line_info_table_allocated;
|
3932 |
|
|
|
3933 |
|
|
/* Number of elements in separate_line_info_table currently in use. */
|
3934 |
|
|
static GTY(()) unsigned separate_line_info_table_in_use;
|
3935 |
|
|
|
3936 |
|
|
/* Size (in elements) of increments by which we may expand the
|
3937 |
|
|
line_info_table. */
|
3938 |
|
|
#define LINE_INFO_TABLE_INCREMENT 1024
|
3939 |
|
|
|
3940 |
|
|
/* A pointer to the base of a table that contains a list of publicly
|
3941 |
|
|
accessible names. */
|
3942 |
|
|
static GTY ((length ("pubname_table_allocated"))) pubname_ref pubname_table;
|
3943 |
|
|
|
3944 |
|
|
/* Number of elements currently allocated for pubname_table. */
|
3945 |
|
|
static GTY(()) unsigned pubname_table_allocated;
|
3946 |
|
|
|
3947 |
|
|
/* Number of elements in pubname_table currently in use. */
|
3948 |
|
|
static GTY(()) unsigned pubname_table_in_use;
|
3949 |
|
|
|
3950 |
|
|
/* Size (in elements) of increments by which we may expand the
|
3951 |
|
|
pubname_table. */
|
3952 |
|
|
#define PUBNAME_TABLE_INCREMENT 64
|
3953 |
|
|
|
3954 |
|
|
/* Array of dies for which we should generate .debug_arange info. */
|
3955 |
|
|
static GTY((length ("arange_table_allocated"))) dw_die_ref *arange_table;
|
3956 |
|
|
|
3957 |
|
|
/* Number of elements currently allocated for arange_table. */
|
3958 |
|
|
static GTY(()) unsigned arange_table_allocated;
|
3959 |
|
|
|
3960 |
|
|
/* Number of elements in arange_table currently in use. */
|
3961 |
|
|
static GTY(()) unsigned arange_table_in_use;
|
3962 |
|
|
|
3963 |
|
|
/* Size (in elements) of increments by which we may expand the
|
3964 |
|
|
arange_table. */
|
3965 |
|
|
#define ARANGE_TABLE_INCREMENT 64
|
3966 |
|
|
|
3967 |
|
|
/* Array of dies for which we should generate .debug_ranges info. */
|
3968 |
|
|
static GTY ((length ("ranges_table_allocated"))) dw_ranges_ref ranges_table;
|
3969 |
|
|
|
3970 |
|
|
/* Number of elements currently allocated for ranges_table. */
|
3971 |
|
|
static GTY(()) unsigned ranges_table_allocated;
|
3972 |
|
|
|
3973 |
|
|
/* Number of elements in ranges_table currently in use. */
|
3974 |
|
|
static GTY(()) unsigned ranges_table_in_use;
|
3975 |
|
|
|
3976 |
|
|
/* Size (in elements) of increments by which we may expand the
|
3977 |
|
|
ranges_table. */
|
3978 |
|
|
#define RANGES_TABLE_INCREMENT 64
|
3979 |
|
|
|
3980 |
|
|
/* Whether we have location lists that need outputting */
|
3981 |
|
|
static GTY(()) bool have_location_lists;
|
3982 |
|
|
|
3983 |
|
|
/* Unique label counter. */
|
3984 |
|
|
static GTY(()) unsigned int loclabel_num;
|
3985 |
|
|
|
3986 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
3987 |
|
|
/* Record whether the function being analyzed contains inlined functions. */
|
3988 |
|
|
static int current_function_has_inlines;
|
3989 |
|
|
#endif
|
3990 |
|
|
#if 0 && defined (MIPS_DEBUGGING_INFO)
|
3991 |
|
|
static int comp_unit_has_inlines;
|
3992 |
|
|
#endif
|
3993 |
|
|
|
3994 |
|
|
/* The last file entry emitted by maybe_emit_file(). */
|
3995 |
|
|
static GTY(()) struct dwarf_file_data * last_emitted_file;
|
3996 |
|
|
|
3997 |
|
|
/* Number of internal labels generated by gen_internal_sym(). */
|
3998 |
|
|
static GTY(()) int label_num;
|
3999 |
|
|
|
4000 |
|
|
/* Cached result of previous call to lookup_filename. */
|
4001 |
|
|
static GTY(()) struct dwarf_file_data * file_table_last_lookup;
|
4002 |
|
|
|
4003 |
|
|
#ifdef DWARF2_DEBUGGING_INFO
|
4004 |
|
|
|
4005 |
|
|
/* Offset from the "steady-state frame pointer" to the frame base,
|
4006 |
|
|
within the current function. */
|
4007 |
|
|
static HOST_WIDE_INT frame_pointer_fb_offset;
|
4008 |
|
|
|
4009 |
|
|
/* Forward declarations for functions defined in this file. */
|
4010 |
|
|
|
4011 |
|
|
static int is_pseudo_reg (rtx);
|
4012 |
|
|
static tree type_main_variant (tree);
|
4013 |
|
|
static int is_tagged_type (tree);
|
4014 |
|
|
static const char *dwarf_tag_name (unsigned);
|
4015 |
|
|
static const char *dwarf_attr_name (unsigned);
|
4016 |
|
|
static const char *dwarf_form_name (unsigned);
|
4017 |
|
|
static tree decl_ultimate_origin (tree);
|
4018 |
|
|
static tree block_ultimate_origin (tree);
|
4019 |
|
|
static tree decl_class_context (tree);
|
4020 |
|
|
static void add_dwarf_attr (dw_die_ref, dw_attr_ref);
|
4021 |
|
|
static inline enum dw_val_class AT_class (dw_attr_ref);
|
4022 |
|
|
static void add_AT_flag (dw_die_ref, enum dwarf_attribute, unsigned);
|
4023 |
|
|
static inline unsigned AT_flag (dw_attr_ref);
|
4024 |
|
|
static void add_AT_int (dw_die_ref, enum dwarf_attribute, HOST_WIDE_INT);
|
4025 |
|
|
static inline HOST_WIDE_INT AT_int (dw_attr_ref);
|
4026 |
|
|
static void add_AT_unsigned (dw_die_ref, enum dwarf_attribute, unsigned HOST_WIDE_INT);
|
4027 |
|
|
static inline unsigned HOST_WIDE_INT AT_unsigned (dw_attr_ref);
|
4028 |
|
|
static void add_AT_long_long (dw_die_ref, enum dwarf_attribute, unsigned long,
|
4029 |
|
|
unsigned long);
|
4030 |
|
|
static inline void add_AT_vec (dw_die_ref, enum dwarf_attribute, unsigned int,
|
4031 |
|
|
unsigned int, unsigned char *);
|
4032 |
|
|
static hashval_t debug_str_do_hash (const void *);
|
4033 |
|
|
static int debug_str_eq (const void *, const void *);
|
4034 |
|
|
static void add_AT_string (dw_die_ref, enum dwarf_attribute, const char *);
|
4035 |
|
|
static inline const char *AT_string (dw_attr_ref);
|
4036 |
|
|
static int AT_string_form (dw_attr_ref);
|
4037 |
|
|
static void add_AT_die_ref (dw_die_ref, enum dwarf_attribute, dw_die_ref);
|
4038 |
|
|
static void add_AT_specification (dw_die_ref, dw_die_ref);
|
4039 |
|
|
static inline dw_die_ref AT_ref (dw_attr_ref);
|
4040 |
|
|
static inline int AT_ref_external (dw_attr_ref);
|
4041 |
|
|
static inline void set_AT_ref_external (dw_attr_ref, int);
|
4042 |
|
|
static void add_AT_fde_ref (dw_die_ref, enum dwarf_attribute, unsigned);
|
4043 |
|
|
static void add_AT_loc (dw_die_ref, enum dwarf_attribute, dw_loc_descr_ref);
|
4044 |
|
|
static inline dw_loc_descr_ref AT_loc (dw_attr_ref);
|
4045 |
|
|
static void add_AT_loc_list (dw_die_ref, enum dwarf_attribute,
|
4046 |
|
|
dw_loc_list_ref);
|
4047 |
|
|
static inline dw_loc_list_ref AT_loc_list (dw_attr_ref);
|
4048 |
|
|
static void add_AT_addr (dw_die_ref, enum dwarf_attribute, rtx);
|
4049 |
|
|
static inline rtx AT_addr (dw_attr_ref);
|
4050 |
|
|
static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *);
|
4051 |
|
|
static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *);
|
4052 |
|
|
static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *);
|
4053 |
|
|
static void add_AT_offset (dw_die_ref, enum dwarf_attribute,
|
4054 |
|
|
unsigned HOST_WIDE_INT);
|
4055 |
|
|
static void add_AT_range_list (dw_die_ref, enum dwarf_attribute,
|
4056 |
|
|
unsigned long);
|
4057 |
|
|
static inline const char *AT_lbl (dw_attr_ref);
|
4058 |
|
|
static dw_attr_ref get_AT (dw_die_ref, enum dwarf_attribute);
|
4059 |
|
|
static const char *get_AT_low_pc (dw_die_ref);
|
4060 |
|
|
static const char *get_AT_hi_pc (dw_die_ref);
|
4061 |
|
|
static const char *get_AT_string (dw_die_ref, enum dwarf_attribute);
|
4062 |
|
|
static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
|
4063 |
|
|
static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
|
4064 |
|
|
static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
|
4065 |
|
|
static bool is_c_family (void);
|
4066 |
|
|
static bool is_cxx (void);
|
4067 |
|
|
static bool is_java (void);
|
4068 |
|
|
static bool is_fortran (void);
|
4069 |
|
|
static bool is_ada (void);
|
4070 |
|
|
static void remove_AT (dw_die_ref, enum dwarf_attribute);
|
4071 |
|
|
static void remove_child_TAG (dw_die_ref, enum dwarf_tag);
|
4072 |
|
|
static void add_child_die (dw_die_ref, dw_die_ref);
|
4073 |
|
|
static dw_die_ref new_die (enum dwarf_tag, dw_die_ref, tree);
|
4074 |
|
|
static dw_die_ref lookup_type_die (tree);
|
4075 |
|
|
static void equate_type_number_to_die (tree, dw_die_ref);
|
4076 |
|
|
static hashval_t decl_die_table_hash (const void *);
|
4077 |
|
|
static int decl_die_table_eq (const void *, const void *);
|
4078 |
|
|
static dw_die_ref lookup_decl_die (tree);
|
4079 |
|
|
static hashval_t decl_loc_table_hash (const void *);
|
4080 |
|
|
static int decl_loc_table_eq (const void *, const void *);
|
4081 |
|
|
static var_loc_list *lookup_decl_loc (tree);
|
4082 |
|
|
static void equate_decl_number_to_die (tree, dw_die_ref);
|
4083 |
|
|
static void add_var_loc_to_decl (tree, struct var_loc_node *);
|
4084 |
|
|
static void print_spaces (FILE *);
|
4085 |
|
|
static void print_die (dw_die_ref, FILE *);
|
4086 |
|
|
static void print_dwarf_line_table (FILE *);
|
4087 |
|
|
static dw_die_ref push_new_compile_unit (dw_die_ref, dw_die_ref);
|
4088 |
|
|
static dw_die_ref pop_compile_unit (dw_die_ref);
|
4089 |
|
|
static void loc_checksum (dw_loc_descr_ref, struct md5_ctx *);
|
4090 |
|
|
static void attr_checksum (dw_attr_ref, struct md5_ctx *, int *);
|
4091 |
|
|
static void die_checksum (dw_die_ref, struct md5_ctx *, int *);
|
4092 |
|
|
static int same_loc_p (dw_loc_descr_ref, dw_loc_descr_ref, int *);
|
4093 |
|
|
static int same_dw_val_p (dw_val_node *, dw_val_node *, int *);
|
4094 |
|
|
static int same_attr_p (dw_attr_ref, dw_attr_ref, int *);
|
4095 |
|
|
static int same_die_p (dw_die_ref, dw_die_ref, int *);
|
4096 |
|
|
static int same_die_p_wrap (dw_die_ref, dw_die_ref);
|
4097 |
|
|
static void compute_section_prefix (dw_die_ref);
|
4098 |
|
|
static int is_type_die (dw_die_ref);
|
4099 |
|
|
static int is_comdat_die (dw_die_ref);
|
4100 |
|
|
static int is_symbol_die (dw_die_ref);
|
4101 |
|
|
static void assign_symbol_names (dw_die_ref);
|
4102 |
|
|
static void break_out_includes (dw_die_ref);
|
4103 |
|
|
static hashval_t htab_cu_hash (const void *);
|
4104 |
|
|
static int htab_cu_eq (const void *, const void *);
|
4105 |
|
|
static void htab_cu_del (void *);
|
4106 |
|
|
static int check_duplicate_cu (dw_die_ref, htab_t, unsigned *);
|
4107 |
|
|
static void record_comdat_symbol_number (dw_die_ref, htab_t, unsigned);
|
4108 |
|
|
static void add_sibling_attributes (dw_die_ref);
|
4109 |
|
|
static void build_abbrev_table (dw_die_ref);
|
4110 |
|
|
static void output_location_lists (dw_die_ref);
|
4111 |
|
|
static int constant_size (long unsigned);
|
4112 |
|
|
static unsigned long size_of_die (dw_die_ref);
|
4113 |
|
|
static void calc_die_sizes (dw_die_ref);
|
4114 |
|
|
static void mark_dies (dw_die_ref);
|
4115 |
|
|
static void unmark_dies (dw_die_ref);
|
4116 |
|
|
static void unmark_all_dies (dw_die_ref);
|
4117 |
|
|
static unsigned long size_of_pubnames (void);
|
4118 |
|
|
static unsigned long size_of_aranges (void);
|
4119 |
|
|
static enum dwarf_form value_format (dw_attr_ref);
|
4120 |
|
|
static void output_value_format (dw_attr_ref);
|
4121 |
|
|
static void output_abbrev_section (void);
|
4122 |
|
|
static void output_die_symbol (dw_die_ref);
|
4123 |
|
|
static void output_die (dw_die_ref);
|
4124 |
|
|
static void output_compilation_unit_header (void);
|
4125 |
|
|
static void output_comp_unit (dw_die_ref, int);
|
4126 |
|
|
static const char *dwarf2_name (tree, int);
|
4127 |
|
|
static void add_pubname (tree, dw_die_ref);
|
4128 |
|
|
static void output_pubnames (void);
|
4129 |
|
|
static void add_arange (tree, dw_die_ref);
|
4130 |
|
|
static void output_aranges (void);
|
4131 |
|
|
static unsigned int add_ranges (tree);
|
4132 |
|
|
static void output_ranges (void);
|
4133 |
|
|
static void output_line_info (void);
|
4134 |
|
|
static void output_file_names (void);
|
4135 |
|
|
static dw_die_ref base_type_die (tree);
|
4136 |
|
|
static tree root_type (tree);
|
4137 |
|
|
static int is_base_type (tree);
|
4138 |
|
|
static bool is_subrange_type (tree);
|
4139 |
|
|
static dw_die_ref subrange_type_die (tree, dw_die_ref);
|
4140 |
|
|
static dw_die_ref modified_type_die (tree, int, int, dw_die_ref);
|
4141 |
|
|
static int type_is_enum (tree);
|
4142 |
|
|
static unsigned int dbx_reg_number (rtx);
|
4143 |
|
|
static void add_loc_descr_op_piece (dw_loc_descr_ref *, int);
|
4144 |
|
|
static dw_loc_descr_ref reg_loc_descriptor (rtx);
|
4145 |
|
|
static dw_loc_descr_ref one_reg_loc_descriptor (unsigned int);
|
4146 |
|
|
static dw_loc_descr_ref multiple_reg_loc_descriptor (rtx, rtx);
|
4147 |
|
|
static dw_loc_descr_ref int_loc_descriptor (HOST_WIDE_INT);
|
4148 |
|
|
static dw_loc_descr_ref based_loc_descr (rtx, HOST_WIDE_INT);
|
4149 |
|
|
static int is_based_loc (rtx);
|
4150 |
|
|
static dw_loc_descr_ref mem_loc_descriptor (rtx, enum machine_mode mode);
|
4151 |
|
|
static dw_loc_descr_ref concat_loc_descriptor (rtx, rtx);
|
4152 |
|
|
static dw_loc_descr_ref loc_descriptor (rtx);
|
4153 |
|
|
static dw_loc_descr_ref loc_descriptor_from_tree_1 (tree, int);
|
4154 |
|
|
static dw_loc_descr_ref loc_descriptor_from_tree (tree);
|
4155 |
|
|
static HOST_WIDE_INT ceiling (HOST_WIDE_INT, unsigned int);
|
4156 |
|
|
static tree field_type (tree);
|
4157 |
|
|
static unsigned int simple_type_align_in_bits (tree);
|
4158 |
|
|
static unsigned int simple_decl_align_in_bits (tree);
|
4159 |
|
|
static unsigned HOST_WIDE_INT simple_type_size_in_bits (tree);
|
4160 |
|
|
static HOST_WIDE_INT field_byte_offset (tree);
|
4161 |
|
|
static void add_AT_location_description (dw_die_ref, enum dwarf_attribute,
|
4162 |
|
|
dw_loc_descr_ref);
|
4163 |
|
|
static void add_data_member_location_attribute (dw_die_ref, tree);
|
4164 |
|
|
static void add_const_value_attribute (dw_die_ref, rtx);
|
4165 |
|
|
static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *);
|
4166 |
|
|
static HOST_WIDE_INT extract_int (const unsigned char *, unsigned);
|
4167 |
|
|
static void insert_float (rtx, unsigned char *);
|
4168 |
|
|
static rtx rtl_for_decl_location (tree);
|
4169 |
|
|
static void add_location_or_const_value_attribute (dw_die_ref, tree,
|
4170 |
|
|
enum dwarf_attribute);
|
4171 |
|
|
static void tree_add_const_value_attribute (dw_die_ref, tree);
|
4172 |
|
|
static void add_name_attribute (dw_die_ref, const char *);
|
4173 |
|
|
static void add_comp_dir_attribute (dw_die_ref);
|
4174 |
|
|
static void add_bound_info (dw_die_ref, enum dwarf_attribute, tree);
|
4175 |
|
|
static void add_subscript_info (dw_die_ref, tree);
|
4176 |
|
|
static void add_byte_size_attribute (dw_die_ref, tree);
|
4177 |
|
|
static void add_bit_offset_attribute (dw_die_ref, tree);
|
4178 |
|
|
static void add_bit_size_attribute (dw_die_ref, tree);
|
4179 |
|
|
static void add_prototyped_attribute (dw_die_ref, tree);
|
4180 |
|
|
static void add_abstract_origin_attribute (dw_die_ref, tree);
|
4181 |
|
|
static void add_pure_or_virtual_attribute (dw_die_ref, tree);
|
4182 |
|
|
static void add_src_coords_attributes (dw_die_ref, tree);
|
4183 |
|
|
static void add_name_and_src_coords_attributes (dw_die_ref, tree);
|
4184 |
|
|
static void push_decl_scope (tree);
|
4185 |
|
|
static void pop_decl_scope (void);
|
4186 |
|
|
static dw_die_ref scope_die_for (tree, dw_die_ref);
|
4187 |
|
|
static inline int local_scope_p (dw_die_ref);
|
4188 |
|
|
static inline int class_or_namespace_scope_p (dw_die_ref);
|
4189 |
|
|
static void add_type_attribute (dw_die_ref, tree, int, int, dw_die_ref);
|
4190 |
|
|
static void add_calling_convention_attribute (dw_die_ref, tree);
|
4191 |
|
|
static const char *type_tag (tree);
|
4192 |
|
|
static tree member_declared_type (tree);
|
4193 |
|
|
#if 0
|
4194 |
|
|
static const char *decl_start_label (tree);
|
4195 |
|
|
#endif
|
4196 |
|
|
static void gen_array_type_die (tree, dw_die_ref);
|
4197 |
|
|
#if 0
|
4198 |
|
|
static void gen_entry_point_die (tree, dw_die_ref);
|
4199 |
|
|
#endif
|
4200 |
|
|
static void gen_inlined_enumeration_type_die (tree, dw_die_ref);
|
4201 |
|
|
static void gen_inlined_structure_type_die (tree, dw_die_ref);
|
4202 |
|
|
static void gen_inlined_union_type_die (tree, dw_die_ref);
|
4203 |
|
|
static dw_die_ref gen_enumeration_type_die (tree, dw_die_ref);
|
4204 |
|
|
static dw_die_ref gen_formal_parameter_die (tree, dw_die_ref);
|
4205 |
|
|
static void gen_unspecified_parameters_die (tree, dw_die_ref);
|
4206 |
|
|
static void gen_formal_types_die (tree, dw_die_ref);
|
4207 |
|
|
static void gen_subprogram_die (tree, dw_die_ref);
|
4208 |
|
|
static void gen_variable_die (tree, dw_die_ref);
|
4209 |
|
|
static void gen_label_die (tree, dw_die_ref);
|
4210 |
|
|
static void gen_lexical_block_die (tree, dw_die_ref, int);
|
4211 |
|
|
static void gen_inlined_subroutine_die (tree, dw_die_ref, int);
|
4212 |
|
|
static void gen_field_die (tree, dw_die_ref);
|
4213 |
|
|
static void gen_ptr_to_mbr_type_die (tree, dw_die_ref);
|
4214 |
|
|
static dw_die_ref gen_compile_unit_die (const char *);
|
4215 |
|
|
static void gen_inheritance_die (tree, tree, dw_die_ref);
|
4216 |
|
|
static void gen_member_die (tree, dw_die_ref);
|
4217 |
|
|
static void gen_struct_or_union_type_die (tree, dw_die_ref);
|
4218 |
|
|
static void gen_subroutine_type_die (tree, dw_die_ref);
|
4219 |
|
|
static void gen_typedef_die (tree, dw_die_ref);
|
4220 |
|
|
static void gen_type_die (tree, dw_die_ref);
|
4221 |
|
|
static void gen_tagged_type_instantiation_die (tree, dw_die_ref);
|
4222 |
|
|
static void gen_block_die (tree, dw_die_ref, int);
|
4223 |
|
|
static void decls_for_scope (tree, dw_die_ref, int);
|
4224 |
|
|
static int is_redundant_typedef (tree);
|
4225 |
|
|
static void gen_namespace_die (tree);
|
4226 |
|
|
static void gen_decl_die (tree, dw_die_ref);
|
4227 |
|
|
static dw_die_ref force_decl_die (tree);
|
4228 |
|
|
static dw_die_ref force_type_die (tree);
|
4229 |
|
|
static dw_die_ref setup_namespace_context (tree, dw_die_ref);
|
4230 |
|
|
static void declare_in_namespace (tree, dw_die_ref);
|
4231 |
|
|
static struct dwarf_file_data * lookup_filename (const char *);
|
4232 |
|
|
static void retry_incomplete_types (void);
|
4233 |
|
|
static void gen_type_die_for_member (tree, tree, dw_die_ref);
|
4234 |
|
|
static void splice_child_die (dw_die_ref, dw_die_ref);
|
4235 |
|
|
static int file_info_cmp (const void *, const void *);
|
4236 |
|
|
static dw_loc_list_ref new_loc_list (dw_loc_descr_ref, const char *,
|
4237 |
|
|
const char *, const char *, unsigned);
|
4238 |
|
|
static void add_loc_descr_to_loc_list (dw_loc_list_ref *, dw_loc_descr_ref,
|
4239 |
|
|
const char *, const char *,
|
4240 |
|
|
const char *);
|
4241 |
|
|
static void output_loc_list (dw_loc_list_ref);
|
4242 |
|
|
static char *gen_internal_sym (const char *);
|
4243 |
|
|
|
4244 |
|
|
static void prune_unmark_dies (dw_die_ref);
|
4245 |
|
|
static void prune_unused_types_mark (dw_die_ref, int);
|
4246 |
|
|
static void prune_unused_types_walk (dw_die_ref);
|
4247 |
|
|
static void prune_unused_types_walk_attribs (dw_die_ref);
|
4248 |
|
|
static void prune_unused_types_prune (dw_die_ref);
|
4249 |
|
|
static void prune_unused_types (void);
|
4250 |
|
|
static int maybe_emit_file (struct dwarf_file_data *fd);
|
4251 |
|
|
|
4252 |
|
|
/* Section names used to hold DWARF debugging information. */
|
4253 |
|
|
#ifndef DEBUG_INFO_SECTION
|
4254 |
|
|
#define DEBUG_INFO_SECTION ".debug_info"
|
4255 |
|
|
#endif
|
4256 |
|
|
#ifndef DEBUG_ABBREV_SECTION
|
4257 |
|
|
#define DEBUG_ABBREV_SECTION ".debug_abbrev"
|
4258 |
|
|
#endif
|
4259 |
|
|
#ifndef DEBUG_ARANGES_SECTION
|
4260 |
|
|
#define DEBUG_ARANGES_SECTION ".debug_aranges"
|
4261 |
|
|
#endif
|
4262 |
|
|
#ifndef DEBUG_MACINFO_SECTION
|
4263 |
|
|
#define DEBUG_MACINFO_SECTION ".debug_macinfo"
|
4264 |
|
|
#endif
|
4265 |
|
|
#ifndef DEBUG_LINE_SECTION
|
4266 |
|
|
#define DEBUG_LINE_SECTION ".debug_line"
|
4267 |
|
|
#endif
|
4268 |
|
|
#ifndef DEBUG_LOC_SECTION
|
4269 |
|
|
#define DEBUG_LOC_SECTION ".debug_loc"
|
4270 |
|
|
#endif
|
4271 |
|
|
#ifndef DEBUG_PUBNAMES_SECTION
|
4272 |
|
|
#define DEBUG_PUBNAMES_SECTION ".debug_pubnames"
|
4273 |
|
|
#endif
|
4274 |
|
|
#ifndef DEBUG_STR_SECTION
|
4275 |
|
|
#define DEBUG_STR_SECTION ".debug_str"
|
4276 |
|
|
#endif
|
4277 |
|
|
#ifndef DEBUG_RANGES_SECTION
|
4278 |
|
|
#define DEBUG_RANGES_SECTION ".debug_ranges"
|
4279 |
|
|
#endif
|
4280 |
|
|
|
4281 |
|
|
/* Standard ELF section names for compiled code and data. */
|
4282 |
|
|
#ifndef TEXT_SECTION_NAME
|
4283 |
|
|
#define TEXT_SECTION_NAME ".text"
|
4284 |
|
|
#endif
|
4285 |
|
|
|
4286 |
|
|
/* Section flags for .debug_str section. */
|
4287 |
|
|
#define DEBUG_STR_SECTION_FLAGS \
|
4288 |
|
|
(HAVE_GAS_SHF_MERGE && flag_merge_constants \
|
4289 |
|
|
? SECTION_DEBUG | SECTION_MERGE | SECTION_STRINGS | 1 \
|
4290 |
|
|
: SECTION_DEBUG)
|
4291 |
|
|
|
4292 |
|
|
/* Labels we insert at beginning sections we can reference instead of
|
4293 |
|
|
the section names themselves. */
|
4294 |
|
|
|
4295 |
|
|
#ifndef TEXT_SECTION_LABEL
|
4296 |
|
|
#define TEXT_SECTION_LABEL "Ltext"
|
4297 |
|
|
#endif
|
4298 |
|
|
#ifndef COLD_TEXT_SECTION_LABEL
|
4299 |
|
|
#define COLD_TEXT_SECTION_LABEL "Ltext_cold"
|
4300 |
|
|
#endif
|
4301 |
|
|
#ifndef DEBUG_LINE_SECTION_LABEL
|
4302 |
|
|
#define DEBUG_LINE_SECTION_LABEL "Ldebug_line"
|
4303 |
|
|
#endif
|
4304 |
|
|
#ifndef DEBUG_INFO_SECTION_LABEL
|
4305 |
|
|
#define DEBUG_INFO_SECTION_LABEL "Ldebug_info"
|
4306 |
|
|
#endif
|
4307 |
|
|
#ifndef DEBUG_ABBREV_SECTION_LABEL
|
4308 |
|
|
#define DEBUG_ABBREV_SECTION_LABEL "Ldebug_abbrev"
|
4309 |
|
|
#endif
|
4310 |
|
|
#ifndef DEBUG_LOC_SECTION_LABEL
|
4311 |
|
|
#define DEBUG_LOC_SECTION_LABEL "Ldebug_loc"
|
4312 |
|
|
#endif
|
4313 |
|
|
#ifndef DEBUG_RANGES_SECTION_LABEL
|
4314 |
|
|
#define DEBUG_RANGES_SECTION_LABEL "Ldebug_ranges"
|
4315 |
|
|
#endif
|
4316 |
|
|
#ifndef DEBUG_MACINFO_SECTION_LABEL
|
4317 |
|
|
#define DEBUG_MACINFO_SECTION_LABEL "Ldebug_macinfo"
|
4318 |
|
|
#endif
|
4319 |
|
|
|
4320 |
|
|
/* Definitions of defaults for formats and names of various special
|
4321 |
|
|
(artificial) labels which may be generated within this file (when the -g
|
4322 |
|
|
options is used and DWARF2_DEBUGGING_INFO is in effect.
|
4323 |
|
|
If necessary, these may be overridden from within the tm.h file, but
|
4324 |
|
|
typically, overriding these defaults is unnecessary. */
|
4325 |
|
|
|
4326 |
|
|
static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4327 |
|
|
static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4328 |
|
|
static char cold_text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4329 |
|
|
static char cold_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4330 |
|
|
static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4331 |
|
|
static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4332 |
|
|
static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4333 |
|
|
static char macinfo_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4334 |
|
|
static char loc_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
4335 |
|
|
static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
|
4336 |
|
|
|
4337 |
|
|
#ifndef TEXT_END_LABEL
|
4338 |
|
|
#define TEXT_END_LABEL "Letext"
|
4339 |
|
|
#endif
|
4340 |
|
|
#ifndef COLD_END_LABEL
|
4341 |
|
|
#define COLD_END_LABEL "Letext_cold"
|
4342 |
|
|
#endif
|
4343 |
|
|
#ifndef BLOCK_BEGIN_LABEL
|
4344 |
|
|
#define BLOCK_BEGIN_LABEL "LBB"
|
4345 |
|
|
#endif
|
4346 |
|
|
#ifndef BLOCK_END_LABEL
|
4347 |
|
|
#define BLOCK_END_LABEL "LBE"
|
4348 |
|
|
#endif
|
4349 |
|
|
#ifndef LINE_CODE_LABEL
|
4350 |
|
|
#define LINE_CODE_LABEL "LM"
|
4351 |
|
|
#endif
|
4352 |
|
|
#ifndef SEPARATE_LINE_CODE_LABEL
|
4353 |
|
|
#define SEPARATE_LINE_CODE_LABEL "LSM"
|
4354 |
|
|
#endif
|
4355 |
|
|
|
4356 |
|
|
/* We allow a language front-end to designate a function that is to be
|
4357 |
|
|
called to "demangle" any name before it is put into a DIE. */
|
4358 |
|
|
|
4359 |
|
|
static const char *(*demangle_name_func) (const char *);
|
4360 |
|
|
|
4361 |
|
|
void
|
4362 |
|
|
dwarf2out_set_demangle_name_func (const char *(*func) (const char *))
|
4363 |
|
|
{
|
4364 |
|
|
demangle_name_func = func;
|
4365 |
|
|
}
|
4366 |
|
|
|
4367 |
|
|
/* Test if rtl node points to a pseudo register. */
|
4368 |
|
|
|
4369 |
|
|
static inline int
|
4370 |
|
|
is_pseudo_reg (rtx rtl)
|
4371 |
|
|
{
|
4372 |
|
|
return ((REG_P (rtl) && REGNO (rtl) >= FIRST_PSEUDO_REGISTER)
|
4373 |
|
|
|| (GET_CODE (rtl) == SUBREG
|
4374 |
|
|
&& REGNO (SUBREG_REG (rtl)) >= FIRST_PSEUDO_REGISTER));
|
4375 |
|
|
}
|
4376 |
|
|
|
4377 |
|
|
/* Return a reference to a type, with its const and volatile qualifiers
|
4378 |
|
|
removed. */
|
4379 |
|
|
|
4380 |
|
|
static inline tree
|
4381 |
|
|
type_main_variant (tree type)
|
4382 |
|
|
{
|
4383 |
|
|
type = TYPE_MAIN_VARIANT (type);
|
4384 |
|
|
|
4385 |
|
|
/* ??? There really should be only one main variant among any group of
|
4386 |
|
|
variants of a given type (and all of the MAIN_VARIANT values for all
|
4387 |
|
|
members of the group should point to that one type) but sometimes the C
|
4388 |
|
|
front-end messes this up for array types, so we work around that bug
|
4389 |
|
|
here. */
|
4390 |
|
|
if (TREE_CODE (type) == ARRAY_TYPE)
|
4391 |
|
|
while (type != TYPE_MAIN_VARIANT (type))
|
4392 |
|
|
type = TYPE_MAIN_VARIANT (type);
|
4393 |
|
|
|
4394 |
|
|
return type;
|
4395 |
|
|
}
|
4396 |
|
|
|
4397 |
|
|
/* Return nonzero if the given type node represents a tagged type. */
|
4398 |
|
|
|
4399 |
|
|
static inline int
|
4400 |
|
|
is_tagged_type (tree type)
|
4401 |
|
|
{
|
4402 |
|
|
enum tree_code code = TREE_CODE (type);
|
4403 |
|
|
|
4404 |
|
|
return (code == RECORD_TYPE || code == UNION_TYPE
|
4405 |
|
|
|| code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE);
|
4406 |
|
|
}
|
4407 |
|
|
|
4408 |
|
|
/* Convert a DIE tag into its string name. */
|
4409 |
|
|
|
4410 |
|
|
static const char *
|
4411 |
|
|
dwarf_tag_name (unsigned int tag)
|
4412 |
|
|
{
|
4413 |
|
|
switch (tag)
|
4414 |
|
|
{
|
4415 |
|
|
case DW_TAG_padding:
|
4416 |
|
|
return "DW_TAG_padding";
|
4417 |
|
|
case DW_TAG_array_type:
|
4418 |
|
|
return "DW_TAG_array_type";
|
4419 |
|
|
case DW_TAG_class_type:
|
4420 |
|
|
return "DW_TAG_class_type";
|
4421 |
|
|
case DW_TAG_entry_point:
|
4422 |
|
|
return "DW_TAG_entry_point";
|
4423 |
|
|
case DW_TAG_enumeration_type:
|
4424 |
|
|
return "DW_TAG_enumeration_type";
|
4425 |
|
|
case DW_TAG_formal_parameter:
|
4426 |
|
|
return "DW_TAG_formal_parameter";
|
4427 |
|
|
case DW_TAG_imported_declaration:
|
4428 |
|
|
return "DW_TAG_imported_declaration";
|
4429 |
|
|
case DW_TAG_label:
|
4430 |
|
|
return "DW_TAG_label";
|
4431 |
|
|
case DW_TAG_lexical_block:
|
4432 |
|
|
return "DW_TAG_lexical_block";
|
4433 |
|
|
case DW_TAG_member:
|
4434 |
|
|
return "DW_TAG_member";
|
4435 |
|
|
case DW_TAG_pointer_type:
|
4436 |
|
|
return "DW_TAG_pointer_type";
|
4437 |
|
|
case DW_TAG_reference_type:
|
4438 |
|
|
return "DW_TAG_reference_type";
|
4439 |
|
|
case DW_TAG_compile_unit:
|
4440 |
|
|
return "DW_TAG_compile_unit";
|
4441 |
|
|
case DW_TAG_string_type:
|
4442 |
|
|
return "DW_TAG_string_type";
|
4443 |
|
|
case DW_TAG_structure_type:
|
4444 |
|
|
return "DW_TAG_structure_type";
|
4445 |
|
|
case DW_TAG_subroutine_type:
|
4446 |
|
|
return "DW_TAG_subroutine_type";
|
4447 |
|
|
case DW_TAG_typedef:
|
4448 |
|
|
return "DW_TAG_typedef";
|
4449 |
|
|
case DW_TAG_union_type:
|
4450 |
|
|
return "DW_TAG_union_type";
|
4451 |
|
|
case DW_TAG_unspecified_parameters:
|
4452 |
|
|
return "DW_TAG_unspecified_parameters";
|
4453 |
|
|
case DW_TAG_variant:
|
4454 |
|
|
return "DW_TAG_variant";
|
4455 |
|
|
case DW_TAG_common_block:
|
4456 |
|
|
return "DW_TAG_common_block";
|
4457 |
|
|
case DW_TAG_common_inclusion:
|
4458 |
|
|
return "DW_TAG_common_inclusion";
|
4459 |
|
|
case DW_TAG_inheritance:
|
4460 |
|
|
return "DW_TAG_inheritance";
|
4461 |
|
|
case DW_TAG_inlined_subroutine:
|
4462 |
|
|
return "DW_TAG_inlined_subroutine";
|
4463 |
|
|
case DW_TAG_module:
|
4464 |
|
|
return "DW_TAG_module";
|
4465 |
|
|
case DW_TAG_ptr_to_member_type:
|
4466 |
|
|
return "DW_TAG_ptr_to_member_type";
|
4467 |
|
|
case DW_TAG_set_type:
|
4468 |
|
|
return "DW_TAG_set_type";
|
4469 |
|
|
case DW_TAG_subrange_type:
|
4470 |
|
|
return "DW_TAG_subrange_type";
|
4471 |
|
|
case DW_TAG_with_stmt:
|
4472 |
|
|
return "DW_TAG_with_stmt";
|
4473 |
|
|
case DW_TAG_access_declaration:
|
4474 |
|
|
return "DW_TAG_access_declaration";
|
4475 |
|
|
case DW_TAG_base_type:
|
4476 |
|
|
return "DW_TAG_base_type";
|
4477 |
|
|
case DW_TAG_catch_block:
|
4478 |
|
|
return "DW_TAG_catch_block";
|
4479 |
|
|
case DW_TAG_const_type:
|
4480 |
|
|
return "DW_TAG_const_type";
|
4481 |
|
|
case DW_TAG_constant:
|
4482 |
|
|
return "DW_TAG_constant";
|
4483 |
|
|
case DW_TAG_enumerator:
|
4484 |
|
|
return "DW_TAG_enumerator";
|
4485 |
|
|
case DW_TAG_file_type:
|
4486 |
|
|
return "DW_TAG_file_type";
|
4487 |
|
|
case DW_TAG_friend:
|
4488 |
|
|
return "DW_TAG_friend";
|
4489 |
|
|
case DW_TAG_namelist:
|
4490 |
|
|
return "DW_TAG_namelist";
|
4491 |
|
|
case DW_TAG_namelist_item:
|
4492 |
|
|
return "DW_TAG_namelist_item";
|
4493 |
|
|
case DW_TAG_namespace:
|
4494 |
|
|
return "DW_TAG_namespace";
|
4495 |
|
|
case DW_TAG_packed_type:
|
4496 |
|
|
return "DW_TAG_packed_type";
|
4497 |
|
|
case DW_TAG_subprogram:
|
4498 |
|
|
return "DW_TAG_subprogram";
|
4499 |
|
|
case DW_TAG_template_type_param:
|
4500 |
|
|
return "DW_TAG_template_type_param";
|
4501 |
|
|
case DW_TAG_template_value_param:
|
4502 |
|
|
return "DW_TAG_template_value_param";
|
4503 |
|
|
case DW_TAG_thrown_type:
|
4504 |
|
|
return "DW_TAG_thrown_type";
|
4505 |
|
|
case DW_TAG_try_block:
|
4506 |
|
|
return "DW_TAG_try_block";
|
4507 |
|
|
case DW_TAG_variant_part:
|
4508 |
|
|
return "DW_TAG_variant_part";
|
4509 |
|
|
case DW_TAG_variable:
|
4510 |
|
|
return "DW_TAG_variable";
|
4511 |
|
|
case DW_TAG_volatile_type:
|
4512 |
|
|
return "DW_TAG_volatile_type";
|
4513 |
|
|
case DW_TAG_imported_module:
|
4514 |
|
|
return "DW_TAG_imported_module";
|
4515 |
|
|
case DW_TAG_MIPS_loop:
|
4516 |
|
|
return "DW_TAG_MIPS_loop";
|
4517 |
|
|
case DW_TAG_format_label:
|
4518 |
|
|
return "DW_TAG_format_label";
|
4519 |
|
|
case DW_TAG_function_template:
|
4520 |
|
|
return "DW_TAG_function_template";
|
4521 |
|
|
case DW_TAG_class_template:
|
4522 |
|
|
return "DW_TAG_class_template";
|
4523 |
|
|
case DW_TAG_GNU_BINCL:
|
4524 |
|
|
return "DW_TAG_GNU_BINCL";
|
4525 |
|
|
case DW_TAG_GNU_EINCL:
|
4526 |
|
|
return "DW_TAG_GNU_EINCL";
|
4527 |
|
|
default:
|
4528 |
|
|
return "DW_TAG_<unknown>";
|
4529 |
|
|
}
|
4530 |
|
|
}
|
4531 |
|
|
|
4532 |
|
|
/* Convert a DWARF attribute code into its string name. */
|
4533 |
|
|
|
4534 |
|
|
static const char *
|
4535 |
|
|
dwarf_attr_name (unsigned int attr)
|
4536 |
|
|
{
|
4537 |
|
|
switch (attr)
|
4538 |
|
|
{
|
4539 |
|
|
case DW_AT_sibling:
|
4540 |
|
|
return "DW_AT_sibling";
|
4541 |
|
|
case DW_AT_location:
|
4542 |
|
|
return "DW_AT_location";
|
4543 |
|
|
case DW_AT_name:
|
4544 |
|
|
return "DW_AT_name";
|
4545 |
|
|
case DW_AT_ordering:
|
4546 |
|
|
return "DW_AT_ordering";
|
4547 |
|
|
case DW_AT_subscr_data:
|
4548 |
|
|
return "DW_AT_subscr_data";
|
4549 |
|
|
case DW_AT_byte_size:
|
4550 |
|
|
return "DW_AT_byte_size";
|
4551 |
|
|
case DW_AT_bit_offset:
|
4552 |
|
|
return "DW_AT_bit_offset";
|
4553 |
|
|
case DW_AT_bit_size:
|
4554 |
|
|
return "DW_AT_bit_size";
|
4555 |
|
|
case DW_AT_element_list:
|
4556 |
|
|
return "DW_AT_element_list";
|
4557 |
|
|
case DW_AT_stmt_list:
|
4558 |
|
|
return "DW_AT_stmt_list";
|
4559 |
|
|
case DW_AT_low_pc:
|
4560 |
|
|
return "DW_AT_low_pc";
|
4561 |
|
|
case DW_AT_high_pc:
|
4562 |
|
|
return "DW_AT_high_pc";
|
4563 |
|
|
case DW_AT_language:
|
4564 |
|
|
return "DW_AT_language";
|
4565 |
|
|
case DW_AT_member:
|
4566 |
|
|
return "DW_AT_member";
|
4567 |
|
|
case DW_AT_discr:
|
4568 |
|
|
return "DW_AT_discr";
|
4569 |
|
|
case DW_AT_discr_value:
|
4570 |
|
|
return "DW_AT_discr_value";
|
4571 |
|
|
case DW_AT_visibility:
|
4572 |
|
|
return "DW_AT_visibility";
|
4573 |
|
|
case DW_AT_import:
|
4574 |
|
|
return "DW_AT_import";
|
4575 |
|
|
case DW_AT_string_length:
|
4576 |
|
|
return "DW_AT_string_length";
|
4577 |
|
|
case DW_AT_common_reference:
|
4578 |
|
|
return "DW_AT_common_reference";
|
4579 |
|
|
case DW_AT_comp_dir:
|
4580 |
|
|
return "DW_AT_comp_dir";
|
4581 |
|
|
case DW_AT_const_value:
|
4582 |
|
|
return "DW_AT_const_value";
|
4583 |
|
|
case DW_AT_containing_type:
|
4584 |
|
|
return "DW_AT_containing_type";
|
4585 |
|
|
case DW_AT_default_value:
|
4586 |
|
|
return "DW_AT_default_value";
|
4587 |
|
|
case DW_AT_inline:
|
4588 |
|
|
return "DW_AT_inline";
|
4589 |
|
|
case DW_AT_is_optional:
|
4590 |
|
|
return "DW_AT_is_optional";
|
4591 |
|
|
case DW_AT_lower_bound:
|
4592 |
|
|
return "DW_AT_lower_bound";
|
4593 |
|
|
case DW_AT_producer:
|
4594 |
|
|
return "DW_AT_producer";
|
4595 |
|
|
case DW_AT_prototyped:
|
4596 |
|
|
return "DW_AT_prototyped";
|
4597 |
|
|
case DW_AT_return_addr:
|
4598 |
|
|
return "DW_AT_return_addr";
|
4599 |
|
|
case DW_AT_start_scope:
|
4600 |
|
|
return "DW_AT_start_scope";
|
4601 |
|
|
case DW_AT_stride_size:
|
4602 |
|
|
return "DW_AT_stride_size";
|
4603 |
|
|
case DW_AT_upper_bound:
|
4604 |
|
|
return "DW_AT_upper_bound";
|
4605 |
|
|
case DW_AT_abstract_origin:
|
4606 |
|
|
return "DW_AT_abstract_origin";
|
4607 |
|
|
case DW_AT_accessibility:
|
4608 |
|
|
return "DW_AT_accessibility";
|
4609 |
|
|
case DW_AT_address_class:
|
4610 |
|
|
return "DW_AT_address_class";
|
4611 |
|
|
case DW_AT_artificial:
|
4612 |
|
|
return "DW_AT_artificial";
|
4613 |
|
|
case DW_AT_base_types:
|
4614 |
|
|
return "DW_AT_base_types";
|
4615 |
|
|
case DW_AT_calling_convention:
|
4616 |
|
|
return "DW_AT_calling_convention";
|
4617 |
|
|
case DW_AT_count:
|
4618 |
|
|
return "DW_AT_count";
|
4619 |
|
|
case DW_AT_data_member_location:
|
4620 |
|
|
return "DW_AT_data_member_location";
|
4621 |
|
|
case DW_AT_decl_column:
|
4622 |
|
|
return "DW_AT_decl_column";
|
4623 |
|
|
case DW_AT_decl_file:
|
4624 |
|
|
return "DW_AT_decl_file";
|
4625 |
|
|
case DW_AT_decl_line:
|
4626 |
|
|
return "DW_AT_decl_line";
|
4627 |
|
|
case DW_AT_declaration:
|
4628 |
|
|
return "DW_AT_declaration";
|
4629 |
|
|
case DW_AT_discr_list:
|
4630 |
|
|
return "DW_AT_discr_list";
|
4631 |
|
|
case DW_AT_encoding:
|
4632 |
|
|
return "DW_AT_encoding";
|
4633 |
|
|
case DW_AT_external:
|
4634 |
|
|
return "DW_AT_external";
|
4635 |
|
|
case DW_AT_frame_base:
|
4636 |
|
|
return "DW_AT_frame_base";
|
4637 |
|
|
case DW_AT_friend:
|
4638 |
|
|
return "DW_AT_friend";
|
4639 |
|
|
case DW_AT_identifier_case:
|
4640 |
|
|
return "DW_AT_identifier_case";
|
4641 |
|
|
case DW_AT_macro_info:
|
4642 |
|
|
return "DW_AT_macro_info";
|
4643 |
|
|
case DW_AT_namelist_items:
|
4644 |
|
|
return "DW_AT_namelist_items";
|
4645 |
|
|
case DW_AT_priority:
|
4646 |
|
|
return "DW_AT_priority";
|
4647 |
|
|
case DW_AT_segment:
|
4648 |
|
|
return "DW_AT_segment";
|
4649 |
|
|
case DW_AT_specification:
|
4650 |
|
|
return "DW_AT_specification";
|
4651 |
|
|
case DW_AT_static_link:
|
4652 |
|
|
return "DW_AT_static_link";
|
4653 |
|
|
case DW_AT_type:
|
4654 |
|
|
return "DW_AT_type";
|
4655 |
|
|
case DW_AT_use_location:
|
4656 |
|
|
return "DW_AT_use_location";
|
4657 |
|
|
case DW_AT_variable_parameter:
|
4658 |
|
|
return "DW_AT_variable_parameter";
|
4659 |
|
|
case DW_AT_virtuality:
|
4660 |
|
|
return "DW_AT_virtuality";
|
4661 |
|
|
case DW_AT_vtable_elem_location:
|
4662 |
|
|
return "DW_AT_vtable_elem_location";
|
4663 |
|
|
|
4664 |
|
|
case DW_AT_allocated:
|
4665 |
|
|
return "DW_AT_allocated";
|
4666 |
|
|
case DW_AT_associated:
|
4667 |
|
|
return "DW_AT_associated";
|
4668 |
|
|
case DW_AT_data_location:
|
4669 |
|
|
return "DW_AT_data_location";
|
4670 |
|
|
case DW_AT_stride:
|
4671 |
|
|
return "DW_AT_stride";
|
4672 |
|
|
case DW_AT_entry_pc:
|
4673 |
|
|
return "DW_AT_entry_pc";
|
4674 |
|
|
case DW_AT_use_UTF8:
|
4675 |
|
|
return "DW_AT_use_UTF8";
|
4676 |
|
|
case DW_AT_extension:
|
4677 |
|
|
return "DW_AT_extension";
|
4678 |
|
|
case DW_AT_ranges:
|
4679 |
|
|
return "DW_AT_ranges";
|
4680 |
|
|
case DW_AT_trampoline:
|
4681 |
|
|
return "DW_AT_trampoline";
|
4682 |
|
|
case DW_AT_call_column:
|
4683 |
|
|
return "DW_AT_call_column";
|
4684 |
|
|
case DW_AT_call_file:
|
4685 |
|
|
return "DW_AT_call_file";
|
4686 |
|
|
case DW_AT_call_line:
|
4687 |
|
|
return "DW_AT_call_line";
|
4688 |
|
|
|
4689 |
|
|
case DW_AT_MIPS_fde:
|
4690 |
|
|
return "DW_AT_MIPS_fde";
|
4691 |
|
|
case DW_AT_MIPS_loop_begin:
|
4692 |
|
|
return "DW_AT_MIPS_loop_begin";
|
4693 |
|
|
case DW_AT_MIPS_tail_loop_begin:
|
4694 |
|
|
return "DW_AT_MIPS_tail_loop_begin";
|
4695 |
|
|
case DW_AT_MIPS_epilog_begin:
|
4696 |
|
|
return "DW_AT_MIPS_epilog_begin";
|
4697 |
|
|
case DW_AT_MIPS_loop_unroll_factor:
|
4698 |
|
|
return "DW_AT_MIPS_loop_unroll_factor";
|
4699 |
|
|
case DW_AT_MIPS_software_pipeline_depth:
|
4700 |
|
|
return "DW_AT_MIPS_software_pipeline_depth";
|
4701 |
|
|
case DW_AT_MIPS_linkage_name:
|
4702 |
|
|
return "DW_AT_MIPS_linkage_name";
|
4703 |
|
|
case DW_AT_MIPS_stride:
|
4704 |
|
|
return "DW_AT_MIPS_stride";
|
4705 |
|
|
case DW_AT_MIPS_abstract_name:
|
4706 |
|
|
return "DW_AT_MIPS_abstract_name";
|
4707 |
|
|
case DW_AT_MIPS_clone_origin:
|
4708 |
|
|
return "DW_AT_MIPS_clone_origin";
|
4709 |
|
|
case DW_AT_MIPS_has_inlines:
|
4710 |
|
|
return "DW_AT_MIPS_has_inlines";
|
4711 |
|
|
|
4712 |
|
|
case DW_AT_sf_names:
|
4713 |
|
|
return "DW_AT_sf_names";
|
4714 |
|
|
case DW_AT_src_info:
|
4715 |
|
|
return "DW_AT_src_info";
|
4716 |
|
|
case DW_AT_mac_info:
|
4717 |
|
|
return "DW_AT_mac_info";
|
4718 |
|
|
case DW_AT_src_coords:
|
4719 |
|
|
return "DW_AT_src_coords";
|
4720 |
|
|
case DW_AT_body_begin:
|
4721 |
|
|
return "DW_AT_body_begin";
|
4722 |
|
|
case DW_AT_body_end:
|
4723 |
|
|
return "DW_AT_body_end";
|
4724 |
|
|
case DW_AT_GNU_vector:
|
4725 |
|
|
return "DW_AT_GNU_vector";
|
4726 |
|
|
|
4727 |
|
|
case DW_AT_VMS_rtnbeg_pd_address:
|
4728 |
|
|
return "DW_AT_VMS_rtnbeg_pd_address";
|
4729 |
|
|
|
4730 |
|
|
default:
|
4731 |
|
|
return "DW_AT_<unknown>";
|
4732 |
|
|
}
|
4733 |
|
|
}
|
4734 |
|
|
|
4735 |
|
|
/* Convert a DWARF value form code into its string name. */
|
4736 |
|
|
|
4737 |
|
|
static const char *
|
4738 |
|
|
dwarf_form_name (unsigned int form)
|
4739 |
|
|
{
|
4740 |
|
|
switch (form)
|
4741 |
|
|
{
|
4742 |
|
|
case DW_FORM_addr:
|
4743 |
|
|
return "DW_FORM_addr";
|
4744 |
|
|
case DW_FORM_block2:
|
4745 |
|
|
return "DW_FORM_block2";
|
4746 |
|
|
case DW_FORM_block4:
|
4747 |
|
|
return "DW_FORM_block4";
|
4748 |
|
|
case DW_FORM_data2:
|
4749 |
|
|
return "DW_FORM_data2";
|
4750 |
|
|
case DW_FORM_data4:
|
4751 |
|
|
return "DW_FORM_data4";
|
4752 |
|
|
case DW_FORM_data8:
|
4753 |
|
|
return "DW_FORM_data8";
|
4754 |
|
|
case DW_FORM_string:
|
4755 |
|
|
return "DW_FORM_string";
|
4756 |
|
|
case DW_FORM_block:
|
4757 |
|
|
return "DW_FORM_block";
|
4758 |
|
|
case DW_FORM_block1:
|
4759 |
|
|
return "DW_FORM_block1";
|
4760 |
|
|
case DW_FORM_data1:
|
4761 |
|
|
return "DW_FORM_data1";
|
4762 |
|
|
case DW_FORM_flag:
|
4763 |
|
|
return "DW_FORM_flag";
|
4764 |
|
|
case DW_FORM_sdata:
|
4765 |
|
|
return "DW_FORM_sdata";
|
4766 |
|
|
case DW_FORM_strp:
|
4767 |
|
|
return "DW_FORM_strp";
|
4768 |
|
|
case DW_FORM_udata:
|
4769 |
|
|
return "DW_FORM_udata";
|
4770 |
|
|
case DW_FORM_ref_addr:
|
4771 |
|
|
return "DW_FORM_ref_addr";
|
4772 |
|
|
case DW_FORM_ref1:
|
4773 |
|
|
return "DW_FORM_ref1";
|
4774 |
|
|
case DW_FORM_ref2:
|
4775 |
|
|
return "DW_FORM_ref2";
|
4776 |
|
|
case DW_FORM_ref4:
|
4777 |
|
|
return "DW_FORM_ref4";
|
4778 |
|
|
case DW_FORM_ref8:
|
4779 |
|
|
return "DW_FORM_ref8";
|
4780 |
|
|
case DW_FORM_ref_udata:
|
4781 |
|
|
return "DW_FORM_ref_udata";
|
4782 |
|
|
case DW_FORM_indirect:
|
4783 |
|
|
return "DW_FORM_indirect";
|
4784 |
|
|
default:
|
4785 |
|
|
return "DW_FORM_<unknown>";
|
4786 |
|
|
}
|
4787 |
|
|
}
|
4788 |
|
|
|
4789 |
|
|
/* Determine the "ultimate origin" of a decl. The decl may be an inlined
|
4790 |
|
|
instance of an inlined instance of a decl which is local to an inline
|
4791 |
|
|
function, so we have to trace all of the way back through the origin chain
|
4792 |
|
|
to find out what sort of node actually served as the original seed for the
|
4793 |
|
|
given block. */
|
4794 |
|
|
|
4795 |
|
|
static tree
|
4796 |
|
|
decl_ultimate_origin (tree decl)
|
4797 |
|
|
{
|
4798 |
|
|
if (!CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_COMMON))
|
4799 |
|
|
return NULL_TREE;
|
4800 |
|
|
|
4801 |
|
|
/* output_inline_function sets DECL_ABSTRACT_ORIGIN for all the
|
4802 |
|
|
nodes in the function to point to themselves; ignore that if
|
4803 |
|
|
we're trying to output the abstract instance of this function. */
|
4804 |
|
|
if (DECL_ABSTRACT (decl) && DECL_ABSTRACT_ORIGIN (decl) == decl)
|
4805 |
|
|
return NULL_TREE;
|
4806 |
|
|
|
4807 |
|
|
/* Since the DECL_ABSTRACT_ORIGIN for a DECL is supposed to be the
|
4808 |
|
|
most distant ancestor, this should never happen. */
|
4809 |
|
|
gcc_assert (!DECL_FROM_INLINE (DECL_ORIGIN (decl)));
|
4810 |
|
|
|
4811 |
|
|
return DECL_ABSTRACT_ORIGIN (decl);
|
4812 |
|
|
}
|
4813 |
|
|
|
4814 |
|
|
/* Determine the "ultimate origin" of a block. The block may be an inlined
|
4815 |
|
|
instance of an inlined instance of a block which is local to an inline
|
4816 |
|
|
function, so we have to trace all of the way back through the origin chain
|
4817 |
|
|
to find out what sort of node actually served as the original seed for the
|
4818 |
|
|
given block. */
|
4819 |
|
|
|
4820 |
|
|
static tree
|
4821 |
|
|
block_ultimate_origin (tree block)
|
4822 |
|
|
{
|
4823 |
|
|
tree immediate_origin = BLOCK_ABSTRACT_ORIGIN (block);
|
4824 |
|
|
|
4825 |
|
|
/* output_inline_function sets BLOCK_ABSTRACT_ORIGIN for all the
|
4826 |
|
|
nodes in the function to point to themselves; ignore that if
|
4827 |
|
|
we're trying to output the abstract instance of this function. */
|
4828 |
|
|
if (BLOCK_ABSTRACT (block) && immediate_origin == block)
|
4829 |
|
|
return NULL_TREE;
|
4830 |
|
|
|
4831 |
|
|
if (immediate_origin == NULL_TREE)
|
4832 |
|
|
return NULL_TREE;
|
4833 |
|
|
else
|
4834 |
|
|
{
|
4835 |
|
|
tree ret_val;
|
4836 |
|
|
tree lookahead = immediate_origin;
|
4837 |
|
|
|
4838 |
|
|
do
|
4839 |
|
|
{
|
4840 |
|
|
ret_val = lookahead;
|
4841 |
|
|
lookahead = (TREE_CODE (ret_val) == BLOCK
|
4842 |
|
|
? BLOCK_ABSTRACT_ORIGIN (ret_val) : NULL);
|
4843 |
|
|
}
|
4844 |
|
|
while (lookahead != NULL && lookahead != ret_val);
|
4845 |
|
|
|
4846 |
|
|
/* The block's abstract origin chain may not be the *ultimate* origin of
|
4847 |
|
|
the block. It could lead to a DECL that has an abstract origin set.
|
4848 |
|
|
If so, we want that DECL's abstract origin (which is what DECL_ORIGIN
|
4849 |
|
|
will give us if it has one). Note that DECL's abstract origins are
|
4850 |
|
|
supposed to be the most distant ancestor (or so decl_ultimate_origin
|
4851 |
|
|
claims), so we don't need to loop following the DECL origins. */
|
4852 |
|
|
if (DECL_P (ret_val))
|
4853 |
|
|
return DECL_ORIGIN (ret_val);
|
4854 |
|
|
|
4855 |
|
|
return ret_val;
|
4856 |
|
|
}
|
4857 |
|
|
}
|
4858 |
|
|
|
4859 |
|
|
/* Get the class to which DECL belongs, if any. In g++, the DECL_CONTEXT
|
4860 |
|
|
of a virtual function may refer to a base class, so we check the 'this'
|
4861 |
|
|
parameter. */
|
4862 |
|
|
|
4863 |
|
|
static tree
|
4864 |
|
|
decl_class_context (tree decl)
|
4865 |
|
|
{
|
4866 |
|
|
tree context = NULL_TREE;
|
4867 |
|
|
|
4868 |
|
|
if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl))
|
4869 |
|
|
context = DECL_CONTEXT (decl);
|
4870 |
|
|
else
|
4871 |
|
|
context = TYPE_MAIN_VARIANT
|
4872 |
|
|
(TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
|
4873 |
|
|
|
4874 |
|
|
if (context && !TYPE_P (context))
|
4875 |
|
|
context = NULL_TREE;
|
4876 |
|
|
|
4877 |
|
|
return context;
|
4878 |
|
|
}
|
4879 |
|
|
|
4880 |
|
|
/* Add an attribute/value pair to a DIE. */
|
4881 |
|
|
|
4882 |
|
|
static inline void
|
4883 |
|
|
add_dwarf_attr (dw_die_ref die, dw_attr_ref attr)
|
4884 |
|
|
{
|
4885 |
|
|
/* Maybe this should be an assert? */
|
4886 |
|
|
if (die == NULL)
|
4887 |
|
|
return;
|
4888 |
|
|
|
4889 |
|
|
if (die->die_attr == NULL)
|
4890 |
|
|
die->die_attr = VEC_alloc (dw_attr_node, gc, 1);
|
4891 |
|
|
VEC_safe_push (dw_attr_node, gc, die->die_attr, attr);
|
4892 |
|
|
}
|
4893 |
|
|
|
4894 |
|
|
static inline enum dw_val_class
|
4895 |
|
|
AT_class (dw_attr_ref a)
|
4896 |
|
|
{
|
4897 |
|
|
return a->dw_attr_val.val_class;
|
4898 |
|
|
}
|
4899 |
|
|
|
4900 |
|
|
/* Add a flag value attribute to a DIE. */
|
4901 |
|
|
|
4902 |
|
|
static inline void
|
4903 |
|
|
add_AT_flag (dw_die_ref die, enum dwarf_attribute attr_kind, unsigned int flag)
|
4904 |
|
|
{
|
4905 |
|
|
dw_attr_node attr;
|
4906 |
|
|
|
4907 |
|
|
attr.dw_attr = attr_kind;
|
4908 |
|
|
attr.dw_attr_val.val_class = dw_val_class_flag;
|
4909 |
|
|
attr.dw_attr_val.v.val_flag = flag;
|
4910 |
|
|
add_dwarf_attr (die, &attr);
|
4911 |
|
|
}
|
4912 |
|
|
|
4913 |
|
|
static inline unsigned
|
4914 |
|
|
AT_flag (dw_attr_ref a)
|
4915 |
|
|
{
|
4916 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_flag);
|
4917 |
|
|
return a->dw_attr_val.v.val_flag;
|
4918 |
|
|
}
|
4919 |
|
|
|
4920 |
|
|
/* Add a signed integer attribute value to a DIE. */
|
4921 |
|
|
|
4922 |
|
|
static inline void
|
4923 |
|
|
add_AT_int (dw_die_ref die, enum dwarf_attribute attr_kind, HOST_WIDE_INT int_val)
|
4924 |
|
|
{
|
4925 |
|
|
dw_attr_node attr;
|
4926 |
|
|
|
4927 |
|
|
attr.dw_attr = attr_kind;
|
4928 |
|
|
attr.dw_attr_val.val_class = dw_val_class_const;
|
4929 |
|
|
attr.dw_attr_val.v.val_int = int_val;
|
4930 |
|
|
add_dwarf_attr (die, &attr);
|
4931 |
|
|
}
|
4932 |
|
|
|
4933 |
|
|
static inline HOST_WIDE_INT
|
4934 |
|
|
AT_int (dw_attr_ref a)
|
4935 |
|
|
{
|
4936 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_const);
|
4937 |
|
|
return a->dw_attr_val.v.val_int;
|
4938 |
|
|
}
|
4939 |
|
|
|
4940 |
|
|
/* Add an unsigned integer attribute value to a DIE. */
|
4941 |
|
|
|
4942 |
|
|
static inline void
|
4943 |
|
|
add_AT_unsigned (dw_die_ref die, enum dwarf_attribute attr_kind,
|
4944 |
|
|
unsigned HOST_WIDE_INT unsigned_val)
|
4945 |
|
|
{
|
4946 |
|
|
dw_attr_node attr;
|
4947 |
|
|
|
4948 |
|
|
attr.dw_attr = attr_kind;
|
4949 |
|
|
attr.dw_attr_val.val_class = dw_val_class_unsigned_const;
|
4950 |
|
|
attr.dw_attr_val.v.val_unsigned = unsigned_val;
|
4951 |
|
|
add_dwarf_attr (die, &attr);
|
4952 |
|
|
}
|
4953 |
|
|
|
4954 |
|
|
static inline unsigned HOST_WIDE_INT
|
4955 |
|
|
AT_unsigned (dw_attr_ref a)
|
4956 |
|
|
{
|
4957 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_unsigned_const);
|
4958 |
|
|
return a->dw_attr_val.v.val_unsigned;
|
4959 |
|
|
}
|
4960 |
|
|
|
4961 |
|
|
/* Add an unsigned double integer attribute value to a DIE. */
|
4962 |
|
|
|
4963 |
|
|
static inline void
|
4964 |
|
|
add_AT_long_long (dw_die_ref die, enum dwarf_attribute attr_kind,
|
4965 |
|
|
long unsigned int val_hi, long unsigned int val_low)
|
4966 |
|
|
{
|
4967 |
|
|
dw_attr_node attr;
|
4968 |
|
|
|
4969 |
|
|
attr.dw_attr = attr_kind;
|
4970 |
|
|
attr.dw_attr_val.val_class = dw_val_class_long_long;
|
4971 |
|
|
attr.dw_attr_val.v.val_long_long.hi = val_hi;
|
4972 |
|
|
attr.dw_attr_val.v.val_long_long.low = val_low;
|
4973 |
|
|
add_dwarf_attr (die, &attr);
|
4974 |
|
|
}
|
4975 |
|
|
|
4976 |
|
|
/* Add a floating point attribute value to a DIE and return it. */
|
4977 |
|
|
|
4978 |
|
|
static inline void
|
4979 |
|
|
add_AT_vec (dw_die_ref die, enum dwarf_attribute attr_kind,
|
4980 |
|
|
unsigned int length, unsigned int elt_size, unsigned char *array)
|
4981 |
|
|
{
|
4982 |
|
|
dw_attr_node attr;
|
4983 |
|
|
|
4984 |
|
|
attr.dw_attr = attr_kind;
|
4985 |
|
|
attr.dw_attr_val.val_class = dw_val_class_vec;
|
4986 |
|
|
attr.dw_attr_val.v.val_vec.length = length;
|
4987 |
|
|
attr.dw_attr_val.v.val_vec.elt_size = elt_size;
|
4988 |
|
|
attr.dw_attr_val.v.val_vec.array = array;
|
4989 |
|
|
add_dwarf_attr (die, &attr);
|
4990 |
|
|
}
|
4991 |
|
|
|
4992 |
|
|
/* Hash and equality functions for debug_str_hash. */
|
4993 |
|
|
|
4994 |
|
|
static hashval_t
|
4995 |
|
|
debug_str_do_hash (const void *x)
|
4996 |
|
|
{
|
4997 |
|
|
return htab_hash_string (((const struct indirect_string_node *)x)->str);
|
4998 |
|
|
}
|
4999 |
|
|
|
5000 |
|
|
static int
|
5001 |
|
|
debug_str_eq (const void *x1, const void *x2)
|
5002 |
|
|
{
|
5003 |
|
|
return strcmp ((((const struct indirect_string_node *)x1)->str),
|
5004 |
|
|
(const char *)x2) == 0;
|
5005 |
|
|
}
|
5006 |
|
|
|
5007 |
|
|
/* Add a string attribute value to a DIE. */
|
5008 |
|
|
|
5009 |
|
|
static inline void
|
5010 |
|
|
add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
|
5011 |
|
|
{
|
5012 |
|
|
dw_attr_node attr;
|
5013 |
|
|
struct indirect_string_node *node;
|
5014 |
|
|
void **slot;
|
5015 |
|
|
|
5016 |
|
|
if (! debug_str_hash)
|
5017 |
|
|
debug_str_hash = htab_create_ggc (10, debug_str_do_hash,
|
5018 |
|
|
debug_str_eq, NULL);
|
5019 |
|
|
|
5020 |
|
|
slot = htab_find_slot_with_hash (debug_str_hash, str,
|
5021 |
|
|
htab_hash_string (str), INSERT);
|
5022 |
|
|
if (*slot == NULL)
|
5023 |
|
|
*slot = ggc_alloc_cleared (sizeof (struct indirect_string_node));
|
5024 |
|
|
node = (struct indirect_string_node *) *slot;
|
5025 |
|
|
node->str = ggc_strdup (str);
|
5026 |
|
|
node->refcount++;
|
5027 |
|
|
|
5028 |
|
|
attr.dw_attr = attr_kind;
|
5029 |
|
|
attr.dw_attr_val.val_class = dw_val_class_str;
|
5030 |
|
|
attr.dw_attr_val.v.val_str = node;
|
5031 |
|
|
add_dwarf_attr (die, &attr);
|
5032 |
|
|
}
|
5033 |
|
|
|
5034 |
|
|
static inline const char *
|
5035 |
|
|
AT_string (dw_attr_ref a)
|
5036 |
|
|
{
|
5037 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_str);
|
5038 |
|
|
return a->dw_attr_val.v.val_str->str;
|
5039 |
|
|
}
|
5040 |
|
|
|
5041 |
|
|
/* Find out whether a string should be output inline in DIE
|
5042 |
|
|
or out-of-line in .debug_str section. */
|
5043 |
|
|
|
5044 |
|
|
static int
|
5045 |
|
|
AT_string_form (dw_attr_ref a)
|
5046 |
|
|
{
|
5047 |
|
|
struct indirect_string_node *node;
|
5048 |
|
|
unsigned int len;
|
5049 |
|
|
char label[32];
|
5050 |
|
|
|
5051 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_str);
|
5052 |
|
|
|
5053 |
|
|
node = a->dw_attr_val.v.val_str;
|
5054 |
|
|
if (node->form)
|
5055 |
|
|
return node->form;
|
5056 |
|
|
|
5057 |
|
|
len = strlen (node->str) + 1;
|
5058 |
|
|
|
5059 |
|
|
/* If the string is shorter or equal to the size of the reference, it is
|
5060 |
|
|
always better to put it inline. */
|
5061 |
|
|
if (len <= DWARF_OFFSET_SIZE || node->refcount == 0)
|
5062 |
|
|
return node->form = DW_FORM_string;
|
5063 |
|
|
|
5064 |
|
|
/* If we cannot expect the linker to merge strings in .debug_str
|
5065 |
|
|
section, only put it into .debug_str if it is worth even in this
|
5066 |
|
|
single module. */
|
5067 |
|
|
if ((debug_str_section->common.flags & SECTION_MERGE) == 0
|
5068 |
|
|
&& (len - DWARF_OFFSET_SIZE) * node->refcount <= len)
|
5069 |
|
|
return node->form = DW_FORM_string;
|
5070 |
|
|
|
5071 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, "LASF", dw2_string_counter);
|
5072 |
|
|
++dw2_string_counter;
|
5073 |
|
|
node->label = xstrdup (label);
|
5074 |
|
|
|
5075 |
|
|
return node->form = DW_FORM_strp;
|
5076 |
|
|
}
|
5077 |
|
|
|
5078 |
|
|
/* Add a DIE reference attribute value to a DIE. */
|
5079 |
|
|
|
5080 |
|
|
static inline void
|
5081 |
|
|
add_AT_die_ref (dw_die_ref die, enum dwarf_attribute attr_kind, dw_die_ref targ_die)
|
5082 |
|
|
{
|
5083 |
|
|
dw_attr_node attr;
|
5084 |
|
|
|
5085 |
|
|
attr.dw_attr = attr_kind;
|
5086 |
|
|
attr.dw_attr_val.val_class = dw_val_class_die_ref;
|
5087 |
|
|
attr.dw_attr_val.v.val_die_ref.die = targ_die;
|
5088 |
|
|
attr.dw_attr_val.v.val_die_ref.external = 0;
|
5089 |
|
|
add_dwarf_attr (die, &attr);
|
5090 |
|
|
}
|
5091 |
|
|
|
5092 |
|
|
/* Add an AT_specification attribute to a DIE, and also make the back
|
5093 |
|
|
pointer from the specification to the definition. */
|
5094 |
|
|
|
5095 |
|
|
static inline void
|
5096 |
|
|
add_AT_specification (dw_die_ref die, dw_die_ref targ_die)
|
5097 |
|
|
{
|
5098 |
|
|
add_AT_die_ref (die, DW_AT_specification, targ_die);
|
5099 |
|
|
gcc_assert (!targ_die->die_definition);
|
5100 |
|
|
targ_die->die_definition = die;
|
5101 |
|
|
}
|
5102 |
|
|
|
5103 |
|
|
static inline dw_die_ref
|
5104 |
|
|
AT_ref (dw_attr_ref a)
|
5105 |
|
|
{
|
5106 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_die_ref);
|
5107 |
|
|
return a->dw_attr_val.v.val_die_ref.die;
|
5108 |
|
|
}
|
5109 |
|
|
|
5110 |
|
|
static inline int
|
5111 |
|
|
AT_ref_external (dw_attr_ref a)
|
5112 |
|
|
{
|
5113 |
|
|
if (a && AT_class (a) == dw_val_class_die_ref)
|
5114 |
|
|
return a->dw_attr_val.v.val_die_ref.external;
|
5115 |
|
|
|
5116 |
|
|
return 0;
|
5117 |
|
|
}
|
5118 |
|
|
|
5119 |
|
|
static inline void
|
5120 |
|
|
set_AT_ref_external (dw_attr_ref a, int i)
|
5121 |
|
|
{
|
5122 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_die_ref);
|
5123 |
|
|
a->dw_attr_val.v.val_die_ref.external = i;
|
5124 |
|
|
}
|
5125 |
|
|
|
5126 |
|
|
/* Add an FDE reference attribute value to a DIE. */
|
5127 |
|
|
|
5128 |
|
|
static inline void
|
5129 |
|
|
add_AT_fde_ref (dw_die_ref die, enum dwarf_attribute attr_kind, unsigned int targ_fde)
|
5130 |
|
|
{
|
5131 |
|
|
dw_attr_node attr;
|
5132 |
|
|
|
5133 |
|
|
attr.dw_attr = attr_kind;
|
5134 |
|
|
attr.dw_attr_val.val_class = dw_val_class_fde_ref;
|
5135 |
|
|
attr.dw_attr_val.v.val_fde_index = targ_fde;
|
5136 |
|
|
add_dwarf_attr (die, &attr);
|
5137 |
|
|
}
|
5138 |
|
|
|
5139 |
|
|
/* Add a location description attribute value to a DIE. */
|
5140 |
|
|
|
5141 |
|
|
static inline void
|
5142 |
|
|
add_AT_loc (dw_die_ref die, enum dwarf_attribute attr_kind, dw_loc_descr_ref loc)
|
5143 |
|
|
{
|
5144 |
|
|
dw_attr_node attr;
|
5145 |
|
|
|
5146 |
|
|
attr.dw_attr = attr_kind;
|
5147 |
|
|
attr.dw_attr_val.val_class = dw_val_class_loc;
|
5148 |
|
|
attr.dw_attr_val.v.val_loc = loc;
|
5149 |
|
|
add_dwarf_attr (die, &attr);
|
5150 |
|
|
}
|
5151 |
|
|
|
5152 |
|
|
static inline dw_loc_descr_ref
|
5153 |
|
|
AT_loc (dw_attr_ref a)
|
5154 |
|
|
{
|
5155 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_loc);
|
5156 |
|
|
return a->dw_attr_val.v.val_loc;
|
5157 |
|
|
}
|
5158 |
|
|
|
5159 |
|
|
static inline void
|
5160 |
|
|
add_AT_loc_list (dw_die_ref die, enum dwarf_attribute attr_kind, dw_loc_list_ref loc_list)
|
5161 |
|
|
{
|
5162 |
|
|
dw_attr_node attr;
|
5163 |
|
|
|
5164 |
|
|
attr.dw_attr = attr_kind;
|
5165 |
|
|
attr.dw_attr_val.val_class = dw_val_class_loc_list;
|
5166 |
|
|
attr.dw_attr_val.v.val_loc_list = loc_list;
|
5167 |
|
|
add_dwarf_attr (die, &attr);
|
5168 |
|
|
have_location_lists = true;
|
5169 |
|
|
}
|
5170 |
|
|
|
5171 |
|
|
static inline dw_loc_list_ref
|
5172 |
|
|
AT_loc_list (dw_attr_ref a)
|
5173 |
|
|
{
|
5174 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_loc_list);
|
5175 |
|
|
return a->dw_attr_val.v.val_loc_list;
|
5176 |
|
|
}
|
5177 |
|
|
|
5178 |
|
|
/* Add an address constant attribute value to a DIE. */
|
5179 |
|
|
|
5180 |
|
|
static inline void
|
5181 |
|
|
add_AT_addr (dw_die_ref die, enum dwarf_attribute attr_kind, rtx addr)
|
5182 |
|
|
{
|
5183 |
|
|
dw_attr_node attr;
|
5184 |
|
|
|
5185 |
|
|
attr.dw_attr = attr_kind;
|
5186 |
|
|
attr.dw_attr_val.val_class = dw_val_class_addr;
|
5187 |
|
|
attr.dw_attr_val.v.val_addr = addr;
|
5188 |
|
|
add_dwarf_attr (die, &attr);
|
5189 |
|
|
}
|
5190 |
|
|
|
5191 |
|
|
/* Get the RTX from to an address DIE attribute. */
|
5192 |
|
|
|
5193 |
|
|
static inline rtx
|
5194 |
|
|
AT_addr (dw_attr_ref a)
|
5195 |
|
|
{
|
5196 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_addr);
|
5197 |
|
|
return a->dw_attr_val.v.val_addr;
|
5198 |
|
|
}
|
5199 |
|
|
|
5200 |
|
|
/* Add a file attribute value to a DIE. */
|
5201 |
|
|
|
5202 |
|
|
static inline void
|
5203 |
|
|
add_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind,
|
5204 |
|
|
struct dwarf_file_data *fd)
|
5205 |
|
|
{
|
5206 |
|
|
dw_attr_node attr;
|
5207 |
|
|
|
5208 |
|
|
attr.dw_attr = attr_kind;
|
5209 |
|
|
attr.dw_attr_val.val_class = dw_val_class_file;
|
5210 |
|
|
attr.dw_attr_val.v.val_file = fd;
|
5211 |
|
|
add_dwarf_attr (die, &attr);
|
5212 |
|
|
}
|
5213 |
|
|
|
5214 |
|
|
/* Get the dwarf_file_data from a file DIE attribute. */
|
5215 |
|
|
|
5216 |
|
|
static inline struct dwarf_file_data *
|
5217 |
|
|
AT_file (dw_attr_ref a)
|
5218 |
|
|
{
|
5219 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_file);
|
5220 |
|
|
return a->dw_attr_val.v.val_file;
|
5221 |
|
|
}
|
5222 |
|
|
|
5223 |
|
|
/* Add a label identifier attribute value to a DIE. */
|
5224 |
|
|
|
5225 |
|
|
static inline void
|
5226 |
|
|
add_AT_lbl_id (dw_die_ref die, enum dwarf_attribute attr_kind, const char *lbl_id)
|
5227 |
|
|
{
|
5228 |
|
|
dw_attr_node attr;
|
5229 |
|
|
|
5230 |
|
|
attr.dw_attr = attr_kind;
|
5231 |
|
|
attr.dw_attr_val.val_class = dw_val_class_lbl_id;
|
5232 |
|
|
attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_id);
|
5233 |
|
|
add_dwarf_attr (die, &attr);
|
5234 |
|
|
}
|
5235 |
|
|
|
5236 |
|
|
/* Add a section offset attribute value to a DIE, an offset into the
|
5237 |
|
|
debug_line section. */
|
5238 |
|
|
|
5239 |
|
|
static inline void
|
5240 |
|
|
add_AT_lineptr (dw_die_ref die, enum dwarf_attribute attr_kind,
|
5241 |
|
|
const char *label)
|
5242 |
|
|
{
|
5243 |
|
|
dw_attr_node attr;
|
5244 |
|
|
|
5245 |
|
|
attr.dw_attr = attr_kind;
|
5246 |
|
|
attr.dw_attr_val.val_class = dw_val_class_lineptr;
|
5247 |
|
|
attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
|
5248 |
|
|
add_dwarf_attr (die, &attr);
|
5249 |
|
|
}
|
5250 |
|
|
|
5251 |
|
|
/* Add a section offset attribute value to a DIE, an offset into the
|
5252 |
|
|
debug_macinfo section. */
|
5253 |
|
|
|
5254 |
|
|
static inline void
|
5255 |
|
|
add_AT_macptr (dw_die_ref die, enum dwarf_attribute attr_kind,
|
5256 |
|
|
const char *label)
|
5257 |
|
|
{
|
5258 |
|
|
dw_attr_node attr;
|
5259 |
|
|
|
5260 |
|
|
attr.dw_attr = attr_kind;
|
5261 |
|
|
attr.dw_attr_val.val_class = dw_val_class_macptr;
|
5262 |
|
|
attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
|
5263 |
|
|
add_dwarf_attr (die, &attr);
|
5264 |
|
|
}
|
5265 |
|
|
|
5266 |
|
|
/* Add an offset attribute value to a DIE. */
|
5267 |
|
|
|
5268 |
|
|
static inline void
|
5269 |
|
|
add_AT_offset (dw_die_ref die, enum dwarf_attribute attr_kind,
|
5270 |
|
|
unsigned HOST_WIDE_INT offset)
|
5271 |
|
|
{
|
5272 |
|
|
dw_attr_node attr;
|
5273 |
|
|
|
5274 |
|
|
attr.dw_attr = attr_kind;
|
5275 |
|
|
attr.dw_attr_val.val_class = dw_val_class_offset;
|
5276 |
|
|
attr.dw_attr_val.v.val_offset = offset;
|
5277 |
|
|
add_dwarf_attr (die, &attr);
|
5278 |
|
|
}
|
5279 |
|
|
|
5280 |
|
|
/* Add an range_list attribute value to a DIE. */
|
5281 |
|
|
|
5282 |
|
|
static void
|
5283 |
|
|
add_AT_range_list (dw_die_ref die, enum dwarf_attribute attr_kind,
|
5284 |
|
|
long unsigned int offset)
|
5285 |
|
|
{
|
5286 |
|
|
dw_attr_node attr;
|
5287 |
|
|
|
5288 |
|
|
attr.dw_attr = attr_kind;
|
5289 |
|
|
attr.dw_attr_val.val_class = dw_val_class_range_list;
|
5290 |
|
|
attr.dw_attr_val.v.val_offset = offset;
|
5291 |
|
|
add_dwarf_attr (die, &attr);
|
5292 |
|
|
}
|
5293 |
|
|
|
5294 |
|
|
static inline const char *
|
5295 |
|
|
AT_lbl (dw_attr_ref a)
|
5296 |
|
|
{
|
5297 |
|
|
gcc_assert (a && (AT_class (a) == dw_val_class_lbl_id
|
5298 |
|
|
|| AT_class (a) == dw_val_class_lineptr
|
5299 |
|
|
|| AT_class (a) == dw_val_class_macptr));
|
5300 |
|
|
return a->dw_attr_val.v.val_lbl_id;
|
5301 |
|
|
}
|
5302 |
|
|
|
5303 |
|
|
/* Get the attribute of type attr_kind. */
|
5304 |
|
|
|
5305 |
|
|
static dw_attr_ref
|
5306 |
|
|
get_AT (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5307 |
|
|
{
|
5308 |
|
|
dw_attr_ref a;
|
5309 |
|
|
unsigned ix;
|
5310 |
|
|
dw_die_ref spec = NULL;
|
5311 |
|
|
|
5312 |
|
|
if (! die)
|
5313 |
|
|
return NULL;
|
5314 |
|
|
|
5315 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
5316 |
|
|
if (a->dw_attr == attr_kind)
|
5317 |
|
|
return a;
|
5318 |
|
|
else if (a->dw_attr == DW_AT_specification
|
5319 |
|
|
|| a->dw_attr == DW_AT_abstract_origin)
|
5320 |
|
|
spec = AT_ref (a);
|
5321 |
|
|
|
5322 |
|
|
if (spec)
|
5323 |
|
|
return get_AT (spec, attr_kind);
|
5324 |
|
|
|
5325 |
|
|
return NULL;
|
5326 |
|
|
}
|
5327 |
|
|
|
5328 |
|
|
/* Return the "low pc" attribute value, typically associated with a subprogram
|
5329 |
|
|
DIE. Return null if the "low pc" attribute is either not present, or if it
|
5330 |
|
|
cannot be represented as an assembler label identifier. */
|
5331 |
|
|
|
5332 |
|
|
static inline const char *
|
5333 |
|
|
get_AT_low_pc (dw_die_ref die)
|
5334 |
|
|
{
|
5335 |
|
|
dw_attr_ref a = get_AT (die, DW_AT_low_pc);
|
5336 |
|
|
|
5337 |
|
|
return a ? AT_lbl (a) : NULL;
|
5338 |
|
|
}
|
5339 |
|
|
|
5340 |
|
|
/* Return the "high pc" attribute value, typically associated with a subprogram
|
5341 |
|
|
DIE. Return null if the "high pc" attribute is either not present, or if it
|
5342 |
|
|
cannot be represented as an assembler label identifier. */
|
5343 |
|
|
|
5344 |
|
|
static inline const char *
|
5345 |
|
|
get_AT_hi_pc (dw_die_ref die)
|
5346 |
|
|
{
|
5347 |
|
|
dw_attr_ref a = get_AT (die, DW_AT_high_pc);
|
5348 |
|
|
|
5349 |
|
|
return a ? AT_lbl (a) : NULL;
|
5350 |
|
|
}
|
5351 |
|
|
|
5352 |
|
|
/* Return the value of the string attribute designated by ATTR_KIND, or
|
5353 |
|
|
NULL if it is not present. */
|
5354 |
|
|
|
5355 |
|
|
static inline const char *
|
5356 |
|
|
get_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5357 |
|
|
{
|
5358 |
|
|
dw_attr_ref a = get_AT (die, attr_kind);
|
5359 |
|
|
|
5360 |
|
|
return a ? AT_string (a) : NULL;
|
5361 |
|
|
}
|
5362 |
|
|
|
5363 |
|
|
/* Return the value of the flag attribute designated by ATTR_KIND, or -1
|
5364 |
|
|
if it is not present. */
|
5365 |
|
|
|
5366 |
|
|
static inline int
|
5367 |
|
|
get_AT_flag (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5368 |
|
|
{
|
5369 |
|
|
dw_attr_ref a = get_AT (die, attr_kind);
|
5370 |
|
|
|
5371 |
|
|
return a ? AT_flag (a) : 0;
|
5372 |
|
|
}
|
5373 |
|
|
|
5374 |
|
|
/* Return the value of the unsigned attribute designated by ATTR_KIND, or 0
|
5375 |
|
|
if it is not present. */
|
5376 |
|
|
|
5377 |
|
|
static inline unsigned
|
5378 |
|
|
get_AT_unsigned (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5379 |
|
|
{
|
5380 |
|
|
dw_attr_ref a = get_AT (die, attr_kind);
|
5381 |
|
|
|
5382 |
|
|
return a ? AT_unsigned (a) : 0;
|
5383 |
|
|
}
|
5384 |
|
|
|
5385 |
|
|
static inline dw_die_ref
|
5386 |
|
|
get_AT_ref (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5387 |
|
|
{
|
5388 |
|
|
dw_attr_ref a = get_AT (die, attr_kind);
|
5389 |
|
|
|
5390 |
|
|
return a ? AT_ref (a) : NULL;
|
5391 |
|
|
}
|
5392 |
|
|
|
5393 |
|
|
static inline struct dwarf_file_data *
|
5394 |
|
|
get_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5395 |
|
|
{
|
5396 |
|
|
dw_attr_ref a = get_AT (die, attr_kind);
|
5397 |
|
|
|
5398 |
|
|
return a ? AT_file (a) : NULL;
|
5399 |
|
|
}
|
5400 |
|
|
|
5401 |
|
|
/* Return TRUE if the language is C or C++. */
|
5402 |
|
|
|
5403 |
|
|
static inline bool
|
5404 |
|
|
is_c_family (void)
|
5405 |
|
|
{
|
5406 |
|
|
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
|
5407 |
|
|
|
5408 |
|
|
return (lang == DW_LANG_C || lang == DW_LANG_C89 || lang == DW_LANG_ObjC
|
5409 |
|
|
|| lang == DW_LANG_C99
|
5410 |
|
|
|| lang == DW_LANG_C_plus_plus || lang == DW_LANG_ObjC_plus_plus);
|
5411 |
|
|
}
|
5412 |
|
|
|
5413 |
|
|
/* Return TRUE if the language is C++. */
|
5414 |
|
|
|
5415 |
|
|
static inline bool
|
5416 |
|
|
is_cxx (void)
|
5417 |
|
|
{
|
5418 |
|
|
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
|
5419 |
|
|
|
5420 |
|
|
return lang == DW_LANG_C_plus_plus || lang == DW_LANG_ObjC_plus_plus;
|
5421 |
|
|
}
|
5422 |
|
|
|
5423 |
|
|
/* Return TRUE if the language is Fortran. */
|
5424 |
|
|
|
5425 |
|
|
static inline bool
|
5426 |
|
|
is_fortran (void)
|
5427 |
|
|
{
|
5428 |
|
|
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
|
5429 |
|
|
|
5430 |
|
|
return (lang == DW_LANG_Fortran77
|
5431 |
|
|
|| lang == DW_LANG_Fortran90
|
5432 |
|
|
|| lang == DW_LANG_Fortran95);
|
5433 |
|
|
}
|
5434 |
|
|
|
5435 |
|
|
/* Return TRUE if the language is Java. */
|
5436 |
|
|
|
5437 |
|
|
static inline bool
|
5438 |
|
|
is_java (void)
|
5439 |
|
|
{
|
5440 |
|
|
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
|
5441 |
|
|
|
5442 |
|
|
return lang == DW_LANG_Java;
|
5443 |
|
|
}
|
5444 |
|
|
|
5445 |
|
|
/* Return TRUE if the language is Ada. */
|
5446 |
|
|
|
5447 |
|
|
static inline bool
|
5448 |
|
|
is_ada (void)
|
5449 |
|
|
{
|
5450 |
|
|
unsigned int lang = get_AT_unsigned (comp_unit_die, DW_AT_language);
|
5451 |
|
|
|
5452 |
|
|
return lang == DW_LANG_Ada95 || lang == DW_LANG_Ada83;
|
5453 |
|
|
}
|
5454 |
|
|
|
5455 |
|
|
/* Remove the specified attribute if present. */
|
5456 |
|
|
|
5457 |
|
|
static void
|
5458 |
|
|
remove_AT (dw_die_ref die, enum dwarf_attribute attr_kind)
|
5459 |
|
|
{
|
5460 |
|
|
dw_attr_ref a;
|
5461 |
|
|
unsigned ix;
|
5462 |
|
|
|
5463 |
|
|
if (! die)
|
5464 |
|
|
return;
|
5465 |
|
|
|
5466 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
5467 |
|
|
if (a->dw_attr == attr_kind)
|
5468 |
|
|
{
|
5469 |
|
|
if (AT_class (a) == dw_val_class_str)
|
5470 |
|
|
if (a->dw_attr_val.v.val_str->refcount)
|
5471 |
|
|
a->dw_attr_val.v.val_str->refcount--;
|
5472 |
|
|
|
5473 |
|
|
/* VEC_ordered_remove should help reduce the number of abbrevs
|
5474 |
|
|
that are needed. */
|
5475 |
|
|
VEC_ordered_remove (dw_attr_node, die->die_attr, ix);
|
5476 |
|
|
return;
|
5477 |
|
|
}
|
5478 |
|
|
}
|
5479 |
|
|
|
5480 |
|
|
/* Remove CHILD from its parent. PREV must have the property that
|
5481 |
|
|
PREV->DIE_SIB == CHILD. Does not alter CHILD. */
|
5482 |
|
|
|
5483 |
|
|
static void
|
5484 |
|
|
remove_child_with_prev (dw_die_ref child, dw_die_ref prev)
|
5485 |
|
|
{
|
5486 |
|
|
gcc_assert (child->die_parent == prev->die_parent);
|
5487 |
|
|
gcc_assert (prev->die_sib == child);
|
5488 |
|
|
if (prev == child)
|
5489 |
|
|
{
|
5490 |
|
|
gcc_assert (child->die_parent->die_child == child);
|
5491 |
|
|
prev = NULL;
|
5492 |
|
|
}
|
5493 |
|
|
else
|
5494 |
|
|
prev->die_sib = child->die_sib;
|
5495 |
|
|
if (child->die_parent->die_child == child)
|
5496 |
|
|
child->die_parent->die_child = prev;
|
5497 |
|
|
}
|
5498 |
|
|
|
5499 |
|
|
/* Remove child DIE whose die_tag is TAG. Do nothing if no child
|
5500 |
|
|
matches TAG. */
|
5501 |
|
|
|
5502 |
|
|
static void
|
5503 |
|
|
remove_child_TAG (dw_die_ref die, enum dwarf_tag tag)
|
5504 |
|
|
{
|
5505 |
|
|
dw_die_ref c;
|
5506 |
|
|
|
5507 |
|
|
c = die->die_child;
|
5508 |
|
|
if (c) do {
|
5509 |
|
|
dw_die_ref prev = c;
|
5510 |
|
|
c = c->die_sib;
|
5511 |
|
|
while (c->die_tag == tag)
|
5512 |
|
|
{
|
5513 |
|
|
remove_child_with_prev (c, prev);
|
5514 |
|
|
/* Might have removed every child. */
|
5515 |
|
|
if (c == c->die_sib)
|
5516 |
|
|
return;
|
5517 |
|
|
c = c->die_sib;
|
5518 |
|
|
}
|
5519 |
|
|
} while (c != die->die_child);
|
5520 |
|
|
}
|
5521 |
|
|
|
5522 |
|
|
/* Add a CHILD_DIE as the last child of DIE. */
|
5523 |
|
|
|
5524 |
|
|
static void
|
5525 |
|
|
add_child_die (dw_die_ref die, dw_die_ref child_die)
|
5526 |
|
|
{
|
5527 |
|
|
/* FIXME this should probably be an assert. */
|
5528 |
|
|
if (! die || ! child_die)
|
5529 |
|
|
return;
|
5530 |
|
|
gcc_assert (die != child_die);
|
5531 |
|
|
|
5532 |
|
|
child_die->die_parent = die;
|
5533 |
|
|
if (die->die_child)
|
5534 |
|
|
{
|
5535 |
|
|
child_die->die_sib = die->die_child->die_sib;
|
5536 |
|
|
die->die_child->die_sib = child_die;
|
5537 |
|
|
}
|
5538 |
|
|
else
|
5539 |
|
|
child_die->die_sib = child_die;
|
5540 |
|
|
die->die_child = child_die;
|
5541 |
|
|
}
|
5542 |
|
|
|
5543 |
|
|
/* Move CHILD, which must be a child of PARENT or the DIE for which PARENT
|
5544 |
|
|
is the specification, to the end of PARENT's list of children.
|
5545 |
|
|
This is done by removing and re-adding it. */
|
5546 |
|
|
|
5547 |
|
|
static void
|
5548 |
|
|
splice_child_die (dw_die_ref parent, dw_die_ref child)
|
5549 |
|
|
{
|
5550 |
|
|
dw_die_ref p;
|
5551 |
|
|
|
5552 |
|
|
/* We want the declaration DIE from inside the class, not the
|
5553 |
|
|
specification DIE at toplevel. */
|
5554 |
|
|
if (child->die_parent != parent)
|
5555 |
|
|
{
|
5556 |
|
|
dw_die_ref tmp = get_AT_ref (child, DW_AT_specification);
|
5557 |
|
|
|
5558 |
|
|
if (tmp)
|
5559 |
|
|
child = tmp;
|
5560 |
|
|
}
|
5561 |
|
|
|
5562 |
|
|
gcc_assert (child->die_parent == parent
|
5563 |
|
|
|| (child->die_parent
|
5564 |
|
|
== get_AT_ref (parent, DW_AT_specification)));
|
5565 |
|
|
|
5566 |
|
|
for (p = child->die_parent->die_child; ; p = p->die_sib)
|
5567 |
|
|
if (p->die_sib == child)
|
5568 |
|
|
{
|
5569 |
|
|
remove_child_with_prev (child, p);
|
5570 |
|
|
break;
|
5571 |
|
|
}
|
5572 |
|
|
|
5573 |
|
|
add_child_die (parent, child);
|
5574 |
|
|
}
|
5575 |
|
|
|
5576 |
|
|
/* Return a pointer to a newly created DIE node. */
|
5577 |
|
|
|
5578 |
|
|
static inline dw_die_ref
|
5579 |
|
|
new_die (enum dwarf_tag tag_value, dw_die_ref parent_die, tree t)
|
5580 |
|
|
{
|
5581 |
|
|
dw_die_ref die = ggc_alloc_cleared (sizeof (die_node));
|
5582 |
|
|
|
5583 |
|
|
die->die_tag = tag_value;
|
5584 |
|
|
|
5585 |
|
|
if (parent_die != NULL)
|
5586 |
|
|
add_child_die (parent_die, die);
|
5587 |
|
|
else
|
5588 |
|
|
{
|
5589 |
|
|
limbo_die_node *limbo_node;
|
5590 |
|
|
|
5591 |
|
|
limbo_node = ggc_alloc_cleared (sizeof (limbo_die_node));
|
5592 |
|
|
limbo_node->die = die;
|
5593 |
|
|
limbo_node->created_for = t;
|
5594 |
|
|
limbo_node->next = limbo_die_list;
|
5595 |
|
|
limbo_die_list = limbo_node;
|
5596 |
|
|
}
|
5597 |
|
|
|
5598 |
|
|
return die;
|
5599 |
|
|
}
|
5600 |
|
|
|
5601 |
|
|
/* Return the DIE associated with the given type specifier. */
|
5602 |
|
|
|
5603 |
|
|
static inline dw_die_ref
|
5604 |
|
|
lookup_type_die (tree type)
|
5605 |
|
|
{
|
5606 |
|
|
return TYPE_SYMTAB_DIE (type);
|
5607 |
|
|
}
|
5608 |
|
|
|
5609 |
|
|
/* Equate a DIE to a given type specifier. */
|
5610 |
|
|
|
5611 |
|
|
static inline void
|
5612 |
|
|
equate_type_number_to_die (tree type, dw_die_ref type_die)
|
5613 |
|
|
{
|
5614 |
|
|
TYPE_SYMTAB_DIE (type) = type_die;
|
5615 |
|
|
}
|
5616 |
|
|
|
5617 |
|
|
/* Returns a hash value for X (which really is a die_struct). */
|
5618 |
|
|
|
5619 |
|
|
static hashval_t
|
5620 |
|
|
decl_die_table_hash (const void *x)
|
5621 |
|
|
{
|
5622 |
|
|
return (hashval_t) ((const dw_die_ref) x)->decl_id;
|
5623 |
|
|
}
|
5624 |
|
|
|
5625 |
|
|
/* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y. */
|
5626 |
|
|
|
5627 |
|
|
static int
|
5628 |
|
|
decl_die_table_eq (const void *x, const void *y)
|
5629 |
|
|
{
|
5630 |
|
|
return (((const dw_die_ref) x)->decl_id == DECL_UID ((const tree) y));
|
5631 |
|
|
}
|
5632 |
|
|
|
5633 |
|
|
/* Return the DIE associated with a given declaration. */
|
5634 |
|
|
|
5635 |
|
|
static inline dw_die_ref
|
5636 |
|
|
lookup_decl_die (tree decl)
|
5637 |
|
|
{
|
5638 |
|
|
return htab_find_with_hash (decl_die_table, decl, DECL_UID (decl));
|
5639 |
|
|
}
|
5640 |
|
|
|
5641 |
|
|
/* Returns a hash value for X (which really is a var_loc_list). */
|
5642 |
|
|
|
5643 |
|
|
static hashval_t
|
5644 |
|
|
decl_loc_table_hash (const void *x)
|
5645 |
|
|
{
|
5646 |
|
|
return (hashval_t) ((const var_loc_list *) x)->decl_id;
|
5647 |
|
|
}
|
5648 |
|
|
|
5649 |
|
|
/* Return nonzero if decl_id of var_loc_list X is the same as
|
5650 |
|
|
UID of decl *Y. */
|
5651 |
|
|
|
5652 |
|
|
static int
|
5653 |
|
|
decl_loc_table_eq (const void *x, const void *y)
|
5654 |
|
|
{
|
5655 |
|
|
return (((const var_loc_list *) x)->decl_id == DECL_UID ((const tree) y));
|
5656 |
|
|
}
|
5657 |
|
|
|
5658 |
|
|
/* Return the var_loc list associated with a given declaration. */
|
5659 |
|
|
|
5660 |
|
|
static inline var_loc_list *
|
5661 |
|
|
lookup_decl_loc (tree decl)
|
5662 |
|
|
{
|
5663 |
|
|
return htab_find_with_hash (decl_loc_table, decl, DECL_UID (decl));
|
5664 |
|
|
}
|
5665 |
|
|
|
5666 |
|
|
/* Equate a DIE to a particular declaration. */
|
5667 |
|
|
|
5668 |
|
|
static void
|
5669 |
|
|
equate_decl_number_to_die (tree decl, dw_die_ref decl_die)
|
5670 |
|
|
{
|
5671 |
|
|
unsigned int decl_id = DECL_UID (decl);
|
5672 |
|
|
void **slot;
|
5673 |
|
|
|
5674 |
|
|
slot = htab_find_slot_with_hash (decl_die_table, decl, decl_id, INSERT);
|
5675 |
|
|
*slot = decl_die;
|
5676 |
|
|
decl_die->decl_id = decl_id;
|
5677 |
|
|
}
|
5678 |
|
|
|
5679 |
|
|
/* Add a variable location node to the linked list for DECL. */
|
5680 |
|
|
|
5681 |
|
|
static void
|
5682 |
|
|
add_var_loc_to_decl (tree decl, struct var_loc_node *loc)
|
5683 |
|
|
{
|
5684 |
|
|
unsigned int decl_id = DECL_UID (decl);
|
5685 |
|
|
var_loc_list *temp;
|
5686 |
|
|
void **slot;
|
5687 |
|
|
|
5688 |
|
|
slot = htab_find_slot_with_hash (decl_loc_table, decl, decl_id, INSERT);
|
5689 |
|
|
if (*slot == NULL)
|
5690 |
|
|
{
|
5691 |
|
|
temp = ggc_alloc_cleared (sizeof (var_loc_list));
|
5692 |
|
|
temp->decl_id = decl_id;
|
5693 |
|
|
*slot = temp;
|
5694 |
|
|
}
|
5695 |
|
|
else
|
5696 |
|
|
temp = *slot;
|
5697 |
|
|
|
5698 |
|
|
if (temp->last)
|
5699 |
|
|
{
|
5700 |
|
|
/* If the current location is the same as the end of the list,
|
5701 |
|
|
we have nothing to do. */
|
5702 |
|
|
if (!rtx_equal_p (NOTE_VAR_LOCATION_LOC (temp->last->var_loc_note),
|
5703 |
|
|
NOTE_VAR_LOCATION_LOC (loc->var_loc_note)))
|
5704 |
|
|
{
|
5705 |
|
|
/* Add LOC to the end of list and update LAST. */
|
5706 |
|
|
temp->last->next = loc;
|
5707 |
|
|
temp->last = loc;
|
5708 |
|
|
}
|
5709 |
|
|
}
|
5710 |
|
|
/* Do not add empty location to the beginning of the list. */
|
5711 |
|
|
else if (NOTE_VAR_LOCATION_LOC (loc->var_loc_note) != NULL_RTX)
|
5712 |
|
|
{
|
5713 |
|
|
temp->first = loc;
|
5714 |
|
|
temp->last = loc;
|
5715 |
|
|
}
|
5716 |
|
|
}
|
5717 |
|
|
|
5718 |
|
|
/* Keep track of the number of spaces used to indent the
|
5719 |
|
|
output of the debugging routines that print the structure of
|
5720 |
|
|
the DIE internal representation. */
|
5721 |
|
|
static int print_indent;
|
5722 |
|
|
|
5723 |
|
|
/* Indent the line the number of spaces given by print_indent. */
|
5724 |
|
|
|
5725 |
|
|
static inline void
|
5726 |
|
|
print_spaces (FILE *outfile)
|
5727 |
|
|
{
|
5728 |
|
|
fprintf (outfile, "%*s", print_indent, "");
|
5729 |
|
|
}
|
5730 |
|
|
|
5731 |
|
|
/* Print the information associated with a given DIE, and its children.
|
5732 |
|
|
This routine is a debugging aid only. */
|
5733 |
|
|
|
5734 |
|
|
static void
|
5735 |
|
|
print_die (dw_die_ref die, FILE *outfile)
|
5736 |
|
|
{
|
5737 |
|
|
dw_attr_ref a;
|
5738 |
|
|
dw_die_ref c;
|
5739 |
|
|
unsigned ix;
|
5740 |
|
|
|
5741 |
|
|
print_spaces (outfile);
|
5742 |
|
|
fprintf (outfile, "DIE %4lu: %s\n",
|
5743 |
|
|
die->die_offset, dwarf_tag_name (die->die_tag));
|
5744 |
|
|
print_spaces (outfile);
|
5745 |
|
|
fprintf (outfile, " abbrev id: %lu", die->die_abbrev);
|
5746 |
|
|
fprintf (outfile, " offset: %lu\n", die->die_offset);
|
5747 |
|
|
|
5748 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
5749 |
|
|
{
|
5750 |
|
|
print_spaces (outfile);
|
5751 |
|
|
fprintf (outfile, " %s: ", dwarf_attr_name (a->dw_attr));
|
5752 |
|
|
|
5753 |
|
|
switch (AT_class (a))
|
5754 |
|
|
{
|
5755 |
|
|
case dw_val_class_addr:
|
5756 |
|
|
fprintf (outfile, "address");
|
5757 |
|
|
break;
|
5758 |
|
|
case dw_val_class_offset:
|
5759 |
|
|
fprintf (outfile, "offset");
|
5760 |
|
|
break;
|
5761 |
|
|
case dw_val_class_loc:
|
5762 |
|
|
fprintf (outfile, "location descriptor");
|
5763 |
|
|
break;
|
5764 |
|
|
case dw_val_class_loc_list:
|
5765 |
|
|
fprintf (outfile, "location list -> label:%s",
|
5766 |
|
|
AT_loc_list (a)->ll_symbol);
|
5767 |
|
|
break;
|
5768 |
|
|
case dw_val_class_range_list:
|
5769 |
|
|
fprintf (outfile, "range list");
|
5770 |
|
|
break;
|
5771 |
|
|
case dw_val_class_const:
|
5772 |
|
|
fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, AT_int (a));
|
5773 |
|
|
break;
|
5774 |
|
|
case dw_val_class_unsigned_const:
|
5775 |
|
|
fprintf (outfile, HOST_WIDE_INT_PRINT_UNSIGNED, AT_unsigned (a));
|
5776 |
|
|
break;
|
5777 |
|
|
case dw_val_class_long_long:
|
5778 |
|
|
fprintf (outfile, "constant (%lu,%lu)",
|
5779 |
|
|
a->dw_attr_val.v.val_long_long.hi,
|
5780 |
|
|
a->dw_attr_val.v.val_long_long.low);
|
5781 |
|
|
break;
|
5782 |
|
|
case dw_val_class_vec:
|
5783 |
|
|
fprintf (outfile, "floating-point or vector constant");
|
5784 |
|
|
break;
|
5785 |
|
|
case dw_val_class_flag:
|
5786 |
|
|
fprintf (outfile, "%u", AT_flag (a));
|
5787 |
|
|
break;
|
5788 |
|
|
case dw_val_class_die_ref:
|
5789 |
|
|
if (AT_ref (a) != NULL)
|
5790 |
|
|
{
|
5791 |
|
|
if (AT_ref (a)->die_symbol)
|
5792 |
|
|
fprintf (outfile, "die -> label: %s", AT_ref (a)->die_symbol);
|
5793 |
|
|
else
|
5794 |
|
|
fprintf (outfile, "die -> %lu", AT_ref (a)->die_offset);
|
5795 |
|
|
}
|
5796 |
|
|
else
|
5797 |
|
|
fprintf (outfile, "die -> <null>");
|
5798 |
|
|
break;
|
5799 |
|
|
case dw_val_class_lbl_id:
|
5800 |
|
|
case dw_val_class_lineptr:
|
5801 |
|
|
case dw_val_class_macptr:
|
5802 |
|
|
fprintf (outfile, "label: %s", AT_lbl (a));
|
5803 |
|
|
break;
|
5804 |
|
|
case dw_val_class_str:
|
5805 |
|
|
if (AT_string (a) != NULL)
|
5806 |
|
|
fprintf (outfile, "\"%s\"", AT_string (a));
|
5807 |
|
|
else
|
5808 |
|
|
fprintf (outfile, "<null>");
|
5809 |
|
|
break;
|
5810 |
|
|
case dw_val_class_file:
|
5811 |
|
|
fprintf (outfile, "\"%s\" (%d)", AT_file (a)->filename,
|
5812 |
|
|
AT_file (a)->emitted_number);
|
5813 |
|
|
break;
|
5814 |
|
|
default:
|
5815 |
|
|
break;
|
5816 |
|
|
}
|
5817 |
|
|
|
5818 |
|
|
fprintf (outfile, "\n");
|
5819 |
|
|
}
|
5820 |
|
|
|
5821 |
|
|
if (die->die_child != NULL)
|
5822 |
|
|
{
|
5823 |
|
|
print_indent += 4;
|
5824 |
|
|
FOR_EACH_CHILD (die, c, print_die (c, outfile));
|
5825 |
|
|
print_indent -= 4;
|
5826 |
|
|
}
|
5827 |
|
|
if (print_indent == 0)
|
5828 |
|
|
fprintf (outfile, "\n");
|
5829 |
|
|
}
|
5830 |
|
|
|
5831 |
|
|
/* Print the contents of the source code line number correspondence table.
|
5832 |
|
|
This routine is a debugging aid only. */
|
5833 |
|
|
|
5834 |
|
|
static void
|
5835 |
|
|
print_dwarf_line_table (FILE *outfile)
|
5836 |
|
|
{
|
5837 |
|
|
unsigned i;
|
5838 |
|
|
dw_line_info_ref line_info;
|
5839 |
|
|
|
5840 |
|
|
fprintf (outfile, "\n\nDWARF source line information\n");
|
5841 |
|
|
for (i = 1; i < line_info_table_in_use; i++)
|
5842 |
|
|
{
|
5843 |
|
|
line_info = &line_info_table[i];
|
5844 |
|
|
fprintf (outfile, "%5d: %4ld %6ld\n", i,
|
5845 |
|
|
line_info->dw_file_num,
|
5846 |
|
|
line_info->dw_line_num);
|
5847 |
|
|
}
|
5848 |
|
|
|
5849 |
|
|
fprintf (outfile, "\n\n");
|
5850 |
|
|
}
|
5851 |
|
|
|
5852 |
|
|
/* Print the information collected for a given DIE. */
|
5853 |
|
|
|
5854 |
|
|
void
|
5855 |
|
|
debug_dwarf_die (dw_die_ref die)
|
5856 |
|
|
{
|
5857 |
|
|
print_die (die, stderr);
|
5858 |
|
|
}
|
5859 |
|
|
|
5860 |
|
|
/* Print all DWARF information collected for the compilation unit.
|
5861 |
|
|
This routine is a debugging aid only. */
|
5862 |
|
|
|
5863 |
|
|
void
|
5864 |
|
|
debug_dwarf (void)
|
5865 |
|
|
{
|
5866 |
|
|
print_indent = 0;
|
5867 |
|
|
print_die (comp_unit_die, stderr);
|
5868 |
|
|
if (! DWARF2_ASM_LINE_DEBUG_INFO)
|
5869 |
|
|
print_dwarf_line_table (stderr);
|
5870 |
|
|
}
|
5871 |
|
|
|
5872 |
|
|
/* Start a new compilation unit DIE for an include file. OLD_UNIT is the CU
|
5873 |
|
|
for the enclosing include file, if any. BINCL_DIE is the DW_TAG_GNU_BINCL
|
5874 |
|
|
DIE that marks the start of the DIEs for this include file. */
|
5875 |
|
|
|
5876 |
|
|
static dw_die_ref
|
5877 |
|
|
push_new_compile_unit (dw_die_ref old_unit, dw_die_ref bincl_die)
|
5878 |
|
|
{
|
5879 |
|
|
const char *filename = get_AT_string (bincl_die, DW_AT_name);
|
5880 |
|
|
dw_die_ref new_unit = gen_compile_unit_die (filename);
|
5881 |
|
|
|
5882 |
|
|
new_unit->die_sib = old_unit;
|
5883 |
|
|
return new_unit;
|
5884 |
|
|
}
|
5885 |
|
|
|
5886 |
|
|
/* Close an include-file CU and reopen the enclosing one. */
|
5887 |
|
|
|
5888 |
|
|
static dw_die_ref
|
5889 |
|
|
pop_compile_unit (dw_die_ref old_unit)
|
5890 |
|
|
{
|
5891 |
|
|
dw_die_ref new_unit = old_unit->die_sib;
|
5892 |
|
|
|
5893 |
|
|
old_unit->die_sib = NULL;
|
5894 |
|
|
return new_unit;
|
5895 |
|
|
}
|
5896 |
|
|
|
5897 |
|
|
#define CHECKSUM(FOO) md5_process_bytes (&(FOO), sizeof (FOO), ctx)
|
5898 |
|
|
#define CHECKSUM_STRING(FOO) md5_process_bytes ((FOO), strlen (FOO), ctx)
|
5899 |
|
|
|
5900 |
|
|
/* Calculate the checksum of a location expression. */
|
5901 |
|
|
|
5902 |
|
|
static inline void
|
5903 |
|
|
loc_checksum (dw_loc_descr_ref loc, struct md5_ctx *ctx)
|
5904 |
|
|
{
|
5905 |
|
|
CHECKSUM (loc->dw_loc_opc);
|
5906 |
|
|
CHECKSUM (loc->dw_loc_oprnd1);
|
5907 |
|
|
CHECKSUM (loc->dw_loc_oprnd2);
|
5908 |
|
|
}
|
5909 |
|
|
|
5910 |
|
|
/* Calculate the checksum of an attribute. */
|
5911 |
|
|
|
5912 |
|
|
static void
|
5913 |
|
|
attr_checksum (dw_attr_ref at, struct md5_ctx *ctx, int *mark)
|
5914 |
|
|
{
|
5915 |
|
|
dw_loc_descr_ref loc;
|
5916 |
|
|
rtx r;
|
5917 |
|
|
|
5918 |
|
|
CHECKSUM (at->dw_attr);
|
5919 |
|
|
|
5920 |
|
|
/* We don't care that this was compiled with a different compiler
|
5921 |
|
|
snapshot; if the output is the same, that's what matters. */
|
5922 |
|
|
if (at->dw_attr == DW_AT_producer)
|
5923 |
|
|
return;
|
5924 |
|
|
|
5925 |
|
|
switch (AT_class (at))
|
5926 |
|
|
{
|
5927 |
|
|
case dw_val_class_const:
|
5928 |
|
|
CHECKSUM (at->dw_attr_val.v.val_int);
|
5929 |
|
|
break;
|
5930 |
|
|
case dw_val_class_unsigned_const:
|
5931 |
|
|
CHECKSUM (at->dw_attr_val.v.val_unsigned);
|
5932 |
|
|
break;
|
5933 |
|
|
case dw_val_class_long_long:
|
5934 |
|
|
CHECKSUM (at->dw_attr_val.v.val_long_long);
|
5935 |
|
|
break;
|
5936 |
|
|
case dw_val_class_vec:
|
5937 |
|
|
CHECKSUM (at->dw_attr_val.v.val_vec);
|
5938 |
|
|
break;
|
5939 |
|
|
case dw_val_class_flag:
|
5940 |
|
|
CHECKSUM (at->dw_attr_val.v.val_flag);
|
5941 |
|
|
break;
|
5942 |
|
|
case dw_val_class_str:
|
5943 |
|
|
CHECKSUM_STRING (AT_string (at));
|
5944 |
|
|
break;
|
5945 |
|
|
|
5946 |
|
|
case dw_val_class_addr:
|
5947 |
|
|
r = AT_addr (at);
|
5948 |
|
|
gcc_assert (GET_CODE (r) == SYMBOL_REF);
|
5949 |
|
|
CHECKSUM_STRING (XSTR (r, 0));
|
5950 |
|
|
break;
|
5951 |
|
|
|
5952 |
|
|
case dw_val_class_offset:
|
5953 |
|
|
CHECKSUM (at->dw_attr_val.v.val_offset);
|
5954 |
|
|
break;
|
5955 |
|
|
|
5956 |
|
|
case dw_val_class_loc:
|
5957 |
|
|
for (loc = AT_loc (at); loc; loc = loc->dw_loc_next)
|
5958 |
|
|
loc_checksum (loc, ctx);
|
5959 |
|
|
break;
|
5960 |
|
|
|
5961 |
|
|
case dw_val_class_die_ref:
|
5962 |
|
|
die_checksum (AT_ref (at), ctx, mark);
|
5963 |
|
|
break;
|
5964 |
|
|
|
5965 |
|
|
case dw_val_class_fde_ref:
|
5966 |
|
|
case dw_val_class_lbl_id:
|
5967 |
|
|
case dw_val_class_lineptr:
|
5968 |
|
|
case dw_val_class_macptr:
|
5969 |
|
|
break;
|
5970 |
|
|
|
5971 |
|
|
case dw_val_class_file:
|
5972 |
|
|
CHECKSUM_STRING (AT_file (at)->filename);
|
5973 |
|
|
break;
|
5974 |
|
|
|
5975 |
|
|
default:
|
5976 |
|
|
break;
|
5977 |
|
|
}
|
5978 |
|
|
}
|
5979 |
|
|
|
5980 |
|
|
/* Calculate the checksum of a DIE. */
|
5981 |
|
|
|
5982 |
|
|
static void
|
5983 |
|
|
die_checksum (dw_die_ref die, struct md5_ctx *ctx, int *mark)
|
5984 |
|
|
{
|
5985 |
|
|
dw_die_ref c;
|
5986 |
|
|
dw_attr_ref a;
|
5987 |
|
|
unsigned ix;
|
5988 |
|
|
|
5989 |
|
|
/* To avoid infinite recursion. */
|
5990 |
|
|
if (die->die_mark)
|
5991 |
|
|
{
|
5992 |
|
|
CHECKSUM (die->die_mark);
|
5993 |
|
|
return;
|
5994 |
|
|
}
|
5995 |
|
|
die->die_mark = ++(*mark);
|
5996 |
|
|
|
5997 |
|
|
CHECKSUM (die->die_tag);
|
5998 |
|
|
|
5999 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
6000 |
|
|
attr_checksum (a, ctx, mark);
|
6001 |
|
|
|
6002 |
|
|
FOR_EACH_CHILD (die, c, die_checksum (c, ctx, mark));
|
6003 |
|
|
}
|
6004 |
|
|
|
6005 |
|
|
#undef CHECKSUM
|
6006 |
|
|
#undef CHECKSUM_STRING
|
6007 |
|
|
|
6008 |
|
|
/* Do the location expressions look same? */
|
6009 |
|
|
static inline int
|
6010 |
|
|
same_loc_p (dw_loc_descr_ref loc1, dw_loc_descr_ref loc2, int *mark)
|
6011 |
|
|
{
|
6012 |
|
|
return loc1->dw_loc_opc == loc2->dw_loc_opc
|
6013 |
|
|
&& same_dw_val_p (&loc1->dw_loc_oprnd1, &loc2->dw_loc_oprnd1, mark)
|
6014 |
|
|
&& same_dw_val_p (&loc1->dw_loc_oprnd2, &loc2->dw_loc_oprnd2, mark);
|
6015 |
|
|
}
|
6016 |
|
|
|
6017 |
|
|
/* Do the values look the same? */
|
6018 |
|
|
static int
|
6019 |
|
|
same_dw_val_p (dw_val_node *v1, dw_val_node *v2, int *mark)
|
6020 |
|
|
{
|
6021 |
|
|
dw_loc_descr_ref loc1, loc2;
|
6022 |
|
|
rtx r1, r2;
|
6023 |
|
|
|
6024 |
|
|
if (v1->val_class != v2->val_class)
|
6025 |
|
|
return 0;
|
6026 |
|
|
|
6027 |
|
|
switch (v1->val_class)
|
6028 |
|
|
{
|
6029 |
|
|
case dw_val_class_const:
|
6030 |
|
|
return v1->v.val_int == v2->v.val_int;
|
6031 |
|
|
case dw_val_class_unsigned_const:
|
6032 |
|
|
return v1->v.val_unsigned == v2->v.val_unsigned;
|
6033 |
|
|
case dw_val_class_long_long:
|
6034 |
|
|
return v1->v.val_long_long.hi == v2->v.val_long_long.hi
|
6035 |
|
|
&& v1->v.val_long_long.low == v2->v.val_long_long.low;
|
6036 |
|
|
case dw_val_class_vec:
|
6037 |
|
|
if (v1->v.val_vec.length != v2->v.val_vec.length
|
6038 |
|
|
|| v1->v.val_vec.elt_size != v2->v.val_vec.elt_size)
|
6039 |
|
|
return 0;
|
6040 |
|
|
if (memcmp (v1->v.val_vec.array, v2->v.val_vec.array,
|
6041 |
|
|
v1->v.val_vec.length * v1->v.val_vec.elt_size))
|
6042 |
|
|
return 0;
|
6043 |
|
|
return 1;
|
6044 |
|
|
case dw_val_class_flag:
|
6045 |
|
|
return v1->v.val_flag == v2->v.val_flag;
|
6046 |
|
|
case dw_val_class_str:
|
6047 |
|
|
return !strcmp(v1->v.val_str->str, v2->v.val_str->str);
|
6048 |
|
|
|
6049 |
|
|
case dw_val_class_addr:
|
6050 |
|
|
r1 = v1->v.val_addr;
|
6051 |
|
|
r2 = v2->v.val_addr;
|
6052 |
|
|
if (GET_CODE (r1) != GET_CODE (r2))
|
6053 |
|
|
return 0;
|
6054 |
|
|
gcc_assert (GET_CODE (r1) == SYMBOL_REF);
|
6055 |
|
|
return !strcmp (XSTR (r1, 0), XSTR (r2, 0));
|
6056 |
|
|
|
6057 |
|
|
case dw_val_class_offset:
|
6058 |
|
|
return v1->v.val_offset == v2->v.val_offset;
|
6059 |
|
|
|
6060 |
|
|
case dw_val_class_loc:
|
6061 |
|
|
for (loc1 = v1->v.val_loc, loc2 = v2->v.val_loc;
|
6062 |
|
|
loc1 && loc2;
|
6063 |
|
|
loc1 = loc1->dw_loc_next, loc2 = loc2->dw_loc_next)
|
6064 |
|
|
if (!same_loc_p (loc1, loc2, mark))
|
6065 |
|
|
return 0;
|
6066 |
|
|
return !loc1 && !loc2;
|
6067 |
|
|
|
6068 |
|
|
case dw_val_class_die_ref:
|
6069 |
|
|
return same_die_p (v1->v.val_die_ref.die, v2->v.val_die_ref.die, mark);
|
6070 |
|
|
|
6071 |
|
|
case dw_val_class_fde_ref:
|
6072 |
|
|
case dw_val_class_lbl_id:
|
6073 |
|
|
case dw_val_class_lineptr:
|
6074 |
|
|
case dw_val_class_macptr:
|
6075 |
|
|
return 1;
|
6076 |
|
|
|
6077 |
|
|
case dw_val_class_file:
|
6078 |
|
|
return v1->v.val_file == v2->v.val_file;
|
6079 |
|
|
|
6080 |
|
|
default:
|
6081 |
|
|
return 1;
|
6082 |
|
|
}
|
6083 |
|
|
}
|
6084 |
|
|
|
6085 |
|
|
/* Do the attributes look the same? */
|
6086 |
|
|
|
6087 |
|
|
static int
|
6088 |
|
|
same_attr_p (dw_attr_ref at1, dw_attr_ref at2, int *mark)
|
6089 |
|
|
{
|
6090 |
|
|
if (at1->dw_attr != at2->dw_attr)
|
6091 |
|
|
return 0;
|
6092 |
|
|
|
6093 |
|
|
/* We don't care that this was compiled with a different compiler
|
6094 |
|
|
snapshot; if the output is the same, that's what matters. */
|
6095 |
|
|
if (at1->dw_attr == DW_AT_producer)
|
6096 |
|
|
return 1;
|
6097 |
|
|
|
6098 |
|
|
return same_dw_val_p (&at1->dw_attr_val, &at2->dw_attr_val, mark);
|
6099 |
|
|
}
|
6100 |
|
|
|
6101 |
|
|
/* Do the dies look the same? */
|
6102 |
|
|
|
6103 |
|
|
static int
|
6104 |
|
|
same_die_p (dw_die_ref die1, dw_die_ref die2, int *mark)
|
6105 |
|
|
{
|
6106 |
|
|
dw_die_ref c1, c2;
|
6107 |
|
|
dw_attr_ref a1;
|
6108 |
|
|
unsigned ix;
|
6109 |
|
|
|
6110 |
|
|
/* To avoid infinite recursion. */
|
6111 |
|
|
if (die1->die_mark)
|
6112 |
|
|
return die1->die_mark == die2->die_mark;
|
6113 |
|
|
die1->die_mark = die2->die_mark = ++(*mark);
|
6114 |
|
|
|
6115 |
|
|
if (die1->die_tag != die2->die_tag)
|
6116 |
|
|
return 0;
|
6117 |
|
|
|
6118 |
|
|
if (VEC_length (dw_attr_node, die1->die_attr)
|
6119 |
|
|
!= VEC_length (dw_attr_node, die2->die_attr))
|
6120 |
|
|
return 0;
|
6121 |
|
|
|
6122 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die1->die_attr, ix, a1); ix++)
|
6123 |
|
|
if (!same_attr_p (a1, VEC_index (dw_attr_node, die2->die_attr, ix), mark))
|
6124 |
|
|
return 0;
|
6125 |
|
|
|
6126 |
|
|
c1 = die1->die_child;
|
6127 |
|
|
c2 = die2->die_child;
|
6128 |
|
|
if (! c1)
|
6129 |
|
|
{
|
6130 |
|
|
if (c2)
|
6131 |
|
|
return 0;
|
6132 |
|
|
}
|
6133 |
|
|
else
|
6134 |
|
|
for (;;)
|
6135 |
|
|
{
|
6136 |
|
|
if (!same_die_p (c1, c2, mark))
|
6137 |
|
|
return 0;
|
6138 |
|
|
c1 = c1->die_sib;
|
6139 |
|
|
c2 = c2->die_sib;
|
6140 |
|
|
if (c1 == die1->die_child)
|
6141 |
|
|
{
|
6142 |
|
|
if (c2 == die2->die_child)
|
6143 |
|
|
break;
|
6144 |
|
|
else
|
6145 |
|
|
return 0;
|
6146 |
|
|
}
|
6147 |
|
|
}
|
6148 |
|
|
|
6149 |
|
|
return 1;
|
6150 |
|
|
}
|
6151 |
|
|
|
6152 |
|
|
/* Do the dies look the same? Wrapper around same_die_p. */
|
6153 |
|
|
|
6154 |
|
|
static int
|
6155 |
|
|
same_die_p_wrap (dw_die_ref die1, dw_die_ref die2)
|
6156 |
|
|
{
|
6157 |
|
|
int mark = 0;
|
6158 |
|
|
int ret = same_die_p (die1, die2, &mark);
|
6159 |
|
|
|
6160 |
|
|
unmark_all_dies (die1);
|
6161 |
|
|
unmark_all_dies (die2);
|
6162 |
|
|
|
6163 |
|
|
return ret;
|
6164 |
|
|
}
|
6165 |
|
|
|
6166 |
|
|
/* The prefix to attach to symbols on DIEs in the current comdat debug
|
6167 |
|
|
info section. */
|
6168 |
|
|
static char *comdat_symbol_id;
|
6169 |
|
|
|
6170 |
|
|
/* The index of the current symbol within the current comdat CU. */
|
6171 |
|
|
static unsigned int comdat_symbol_number;
|
6172 |
|
|
|
6173 |
|
|
/* Calculate the MD5 checksum of the compilation unit DIE UNIT_DIE and its
|
6174 |
|
|
children, and set comdat_symbol_id accordingly. */
|
6175 |
|
|
|
6176 |
|
|
static void
|
6177 |
|
|
compute_section_prefix (dw_die_ref unit_die)
|
6178 |
|
|
{
|
6179 |
|
|
const char *die_name = get_AT_string (unit_die, DW_AT_name);
|
6180 |
|
|
const char *base = die_name ? lbasename (die_name) : "anonymous";
|
6181 |
|
|
char *name = alloca (strlen (base) + 64);
|
6182 |
|
|
char *p;
|
6183 |
|
|
int i, mark;
|
6184 |
|
|
unsigned char checksum[16];
|
6185 |
|
|
struct md5_ctx ctx;
|
6186 |
|
|
|
6187 |
|
|
/* Compute the checksum of the DIE, then append part of it as hex digits to
|
6188 |
|
|
the name filename of the unit. */
|
6189 |
|
|
|
6190 |
|
|
md5_init_ctx (&ctx);
|
6191 |
|
|
mark = 0;
|
6192 |
|
|
die_checksum (unit_die, &ctx, &mark);
|
6193 |
|
|
unmark_all_dies (unit_die);
|
6194 |
|
|
md5_finish_ctx (&ctx, checksum);
|
6195 |
|
|
|
6196 |
|
|
sprintf (name, "%s.", base);
|
6197 |
|
|
clean_symbol_name (name);
|
6198 |
|
|
|
6199 |
|
|
p = name + strlen (name);
|
6200 |
|
|
for (i = 0; i < 4; i++)
|
6201 |
|
|
{
|
6202 |
|
|
sprintf (p, "%.2x", checksum[i]);
|
6203 |
|
|
p += 2;
|
6204 |
|
|
}
|
6205 |
|
|
|
6206 |
|
|
comdat_symbol_id = unit_die->die_symbol = xstrdup (name);
|
6207 |
|
|
comdat_symbol_number = 0;
|
6208 |
|
|
}
|
6209 |
|
|
|
6210 |
|
|
/* Returns nonzero if DIE represents a type, in the sense of TYPE_P. */
|
6211 |
|
|
|
6212 |
|
|
static int
|
6213 |
|
|
is_type_die (dw_die_ref die)
|
6214 |
|
|
{
|
6215 |
|
|
switch (die->die_tag)
|
6216 |
|
|
{
|
6217 |
|
|
case DW_TAG_array_type:
|
6218 |
|
|
case DW_TAG_class_type:
|
6219 |
|
|
case DW_TAG_enumeration_type:
|
6220 |
|
|
case DW_TAG_pointer_type:
|
6221 |
|
|
case DW_TAG_reference_type:
|
6222 |
|
|
case DW_TAG_string_type:
|
6223 |
|
|
case DW_TAG_structure_type:
|
6224 |
|
|
case DW_TAG_subroutine_type:
|
6225 |
|
|
case DW_TAG_union_type:
|
6226 |
|
|
case DW_TAG_ptr_to_member_type:
|
6227 |
|
|
case DW_TAG_set_type:
|
6228 |
|
|
case DW_TAG_subrange_type:
|
6229 |
|
|
case DW_TAG_base_type:
|
6230 |
|
|
case DW_TAG_const_type:
|
6231 |
|
|
case DW_TAG_file_type:
|
6232 |
|
|
case DW_TAG_packed_type:
|
6233 |
|
|
case DW_TAG_volatile_type:
|
6234 |
|
|
case DW_TAG_typedef:
|
6235 |
|
|
return 1;
|
6236 |
|
|
default:
|
6237 |
|
|
return 0;
|
6238 |
|
|
}
|
6239 |
|
|
}
|
6240 |
|
|
|
6241 |
|
|
/* Returns 1 iff C is the sort of DIE that should go into a COMDAT CU.
|
6242 |
|
|
Basically, we want to choose the bits that are likely to be shared between
|
6243 |
|
|
compilations (types) and leave out the bits that are specific to individual
|
6244 |
|
|
compilations (functions). */
|
6245 |
|
|
|
6246 |
|
|
static int
|
6247 |
|
|
is_comdat_die (dw_die_ref c)
|
6248 |
|
|
{
|
6249 |
|
|
/* I think we want to leave base types and __vtbl_ptr_type in the main CU, as
|
6250 |
|
|
we do for stabs. The advantage is a greater likelihood of sharing between
|
6251 |
|
|
objects that don't include headers in the same order (and therefore would
|
6252 |
|
|
put the base types in a different comdat). jason 8/28/00 */
|
6253 |
|
|
|
6254 |
|
|
if (c->die_tag == DW_TAG_base_type)
|
6255 |
|
|
return 0;
|
6256 |
|
|
|
6257 |
|
|
if (c->die_tag == DW_TAG_pointer_type
|
6258 |
|
|
|| c->die_tag == DW_TAG_reference_type
|
6259 |
|
|
|| c->die_tag == DW_TAG_const_type
|
6260 |
|
|
|| c->die_tag == DW_TAG_volatile_type)
|
6261 |
|
|
{
|
6262 |
|
|
dw_die_ref t = get_AT_ref (c, DW_AT_type);
|
6263 |
|
|
|
6264 |
|
|
return t ? is_comdat_die (t) : 0;
|
6265 |
|
|
}
|
6266 |
|
|
|
6267 |
|
|
return is_type_die (c);
|
6268 |
|
|
}
|
6269 |
|
|
|
6270 |
|
|
/* Returns 1 iff C is the sort of DIE that might be referred to from another
|
6271 |
|
|
compilation unit. */
|
6272 |
|
|
|
6273 |
|
|
static int
|
6274 |
|
|
is_symbol_die (dw_die_ref c)
|
6275 |
|
|
{
|
6276 |
|
|
return (is_type_die (c)
|
6277 |
|
|
|| (get_AT (c, DW_AT_declaration)
|
6278 |
|
|
&& !get_AT (c, DW_AT_specification))
|
6279 |
|
|
|| c->die_tag == DW_TAG_namespace);
|
6280 |
|
|
}
|
6281 |
|
|
|
6282 |
|
|
static char *
|
6283 |
|
|
gen_internal_sym (const char *prefix)
|
6284 |
|
|
{
|
6285 |
|
|
char buf[256];
|
6286 |
|
|
|
6287 |
|
|
ASM_GENERATE_INTERNAL_LABEL (buf, prefix, label_num++);
|
6288 |
|
|
return xstrdup (buf);
|
6289 |
|
|
}
|
6290 |
|
|
|
6291 |
|
|
/* Assign symbols to all worthy DIEs under DIE. */
|
6292 |
|
|
|
6293 |
|
|
static void
|
6294 |
|
|
assign_symbol_names (dw_die_ref die)
|
6295 |
|
|
{
|
6296 |
|
|
dw_die_ref c;
|
6297 |
|
|
|
6298 |
|
|
if (is_symbol_die (die))
|
6299 |
|
|
{
|
6300 |
|
|
if (comdat_symbol_id)
|
6301 |
|
|
{
|
6302 |
|
|
char *p = alloca (strlen (comdat_symbol_id) + 64);
|
6303 |
|
|
|
6304 |
|
|
sprintf (p, "%s.%s.%x", DIE_LABEL_PREFIX,
|
6305 |
|
|
comdat_symbol_id, comdat_symbol_number++);
|
6306 |
|
|
die->die_symbol = xstrdup (p);
|
6307 |
|
|
}
|
6308 |
|
|
else
|
6309 |
|
|
die->die_symbol = gen_internal_sym ("LDIE");
|
6310 |
|
|
}
|
6311 |
|
|
|
6312 |
|
|
FOR_EACH_CHILD (die, c, assign_symbol_names (c));
|
6313 |
|
|
}
|
6314 |
|
|
|
6315 |
|
|
struct cu_hash_table_entry
|
6316 |
|
|
{
|
6317 |
|
|
dw_die_ref cu;
|
6318 |
|
|
unsigned min_comdat_num, max_comdat_num;
|
6319 |
|
|
struct cu_hash_table_entry *next;
|
6320 |
|
|
};
|
6321 |
|
|
|
6322 |
|
|
/* Routines to manipulate hash table of CUs. */
|
6323 |
|
|
static hashval_t
|
6324 |
|
|
htab_cu_hash (const void *of)
|
6325 |
|
|
{
|
6326 |
|
|
const struct cu_hash_table_entry *entry = of;
|
6327 |
|
|
|
6328 |
|
|
return htab_hash_string (entry->cu->die_symbol);
|
6329 |
|
|
}
|
6330 |
|
|
|
6331 |
|
|
static int
|
6332 |
|
|
htab_cu_eq (const void *of1, const void *of2)
|
6333 |
|
|
{
|
6334 |
|
|
const struct cu_hash_table_entry *entry1 = of1;
|
6335 |
|
|
const struct die_struct *entry2 = of2;
|
6336 |
|
|
|
6337 |
|
|
return !strcmp (entry1->cu->die_symbol, entry2->die_symbol);
|
6338 |
|
|
}
|
6339 |
|
|
|
6340 |
|
|
static void
|
6341 |
|
|
htab_cu_del (void *what)
|
6342 |
|
|
{
|
6343 |
|
|
struct cu_hash_table_entry *next, *entry = what;
|
6344 |
|
|
|
6345 |
|
|
while (entry)
|
6346 |
|
|
{
|
6347 |
|
|
next = entry->next;
|
6348 |
|
|
free (entry);
|
6349 |
|
|
entry = next;
|
6350 |
|
|
}
|
6351 |
|
|
}
|
6352 |
|
|
|
6353 |
|
|
/* Check whether we have already seen this CU and set up SYM_NUM
|
6354 |
|
|
accordingly. */
|
6355 |
|
|
static int
|
6356 |
|
|
check_duplicate_cu (dw_die_ref cu, htab_t htable, unsigned int *sym_num)
|
6357 |
|
|
{
|
6358 |
|
|
struct cu_hash_table_entry dummy;
|
6359 |
|
|
struct cu_hash_table_entry **slot, *entry, *last = &dummy;
|
6360 |
|
|
|
6361 |
|
|
dummy.max_comdat_num = 0;
|
6362 |
|
|
|
6363 |
|
|
slot = (struct cu_hash_table_entry **)
|
6364 |
|
|
htab_find_slot_with_hash (htable, cu, htab_hash_string (cu->die_symbol),
|
6365 |
|
|
INSERT);
|
6366 |
|
|
entry = *slot;
|
6367 |
|
|
|
6368 |
|
|
for (; entry; last = entry, entry = entry->next)
|
6369 |
|
|
{
|
6370 |
|
|
if (same_die_p_wrap (cu, entry->cu))
|
6371 |
|
|
break;
|
6372 |
|
|
}
|
6373 |
|
|
|
6374 |
|
|
if (entry)
|
6375 |
|
|
{
|
6376 |
|
|
*sym_num = entry->min_comdat_num;
|
6377 |
|
|
return 1;
|
6378 |
|
|
}
|
6379 |
|
|
|
6380 |
|
|
entry = XCNEW (struct cu_hash_table_entry);
|
6381 |
|
|
entry->cu = cu;
|
6382 |
|
|
entry->min_comdat_num = *sym_num = last->max_comdat_num;
|
6383 |
|
|
entry->next = *slot;
|
6384 |
|
|
*slot = entry;
|
6385 |
|
|
|
6386 |
|
|
return 0;
|
6387 |
|
|
}
|
6388 |
|
|
|
6389 |
|
|
/* Record SYM_NUM to record of CU in HTABLE. */
|
6390 |
|
|
static void
|
6391 |
|
|
record_comdat_symbol_number (dw_die_ref cu, htab_t htable, unsigned int sym_num)
|
6392 |
|
|
{
|
6393 |
|
|
struct cu_hash_table_entry **slot, *entry;
|
6394 |
|
|
|
6395 |
|
|
slot = (struct cu_hash_table_entry **)
|
6396 |
|
|
htab_find_slot_with_hash (htable, cu, htab_hash_string (cu->die_symbol),
|
6397 |
|
|
NO_INSERT);
|
6398 |
|
|
entry = *slot;
|
6399 |
|
|
|
6400 |
|
|
entry->max_comdat_num = sym_num;
|
6401 |
|
|
}
|
6402 |
|
|
|
6403 |
|
|
/* Traverse the DIE (which is always comp_unit_die), and set up
|
6404 |
|
|
additional compilation units for each of the include files we see
|
6405 |
|
|
bracketed by BINCL/EINCL. */
|
6406 |
|
|
|
6407 |
|
|
static void
|
6408 |
|
|
break_out_includes (dw_die_ref die)
|
6409 |
|
|
{
|
6410 |
|
|
dw_die_ref c;
|
6411 |
|
|
dw_die_ref unit = NULL;
|
6412 |
|
|
limbo_die_node *node, **pnode;
|
6413 |
|
|
htab_t cu_hash_table;
|
6414 |
|
|
|
6415 |
|
|
c = die->die_child;
|
6416 |
|
|
if (c) do {
|
6417 |
|
|
dw_die_ref prev = c;
|
6418 |
|
|
c = c->die_sib;
|
6419 |
|
|
while (c->die_tag == DW_TAG_GNU_BINCL || c->die_tag == DW_TAG_GNU_EINCL
|
6420 |
|
|
|| (unit && is_comdat_die (c)))
|
6421 |
|
|
{
|
6422 |
|
|
dw_die_ref next = c->die_sib;
|
6423 |
|
|
|
6424 |
|
|
/* This DIE is for a secondary CU; remove it from the main one. */
|
6425 |
|
|
remove_child_with_prev (c, prev);
|
6426 |
|
|
|
6427 |
|
|
if (c->die_tag == DW_TAG_GNU_BINCL)
|
6428 |
|
|
unit = push_new_compile_unit (unit, c);
|
6429 |
|
|
else if (c->die_tag == DW_TAG_GNU_EINCL)
|
6430 |
|
|
unit = pop_compile_unit (unit);
|
6431 |
|
|
else
|
6432 |
|
|
add_child_die (unit, c);
|
6433 |
|
|
c = next;
|
6434 |
|
|
if (c == die->die_child)
|
6435 |
|
|
break;
|
6436 |
|
|
}
|
6437 |
|
|
} while (c != die->die_child);
|
6438 |
|
|
|
6439 |
|
|
#if 0
|
6440 |
|
|
/* We can only use this in debugging, since the frontend doesn't check
|
6441 |
|
|
to make sure that we leave every include file we enter. */
|
6442 |
|
|
gcc_assert (!unit);
|
6443 |
|
|
#endif
|
6444 |
|
|
|
6445 |
|
|
assign_symbol_names (die);
|
6446 |
|
|
cu_hash_table = htab_create (10, htab_cu_hash, htab_cu_eq, htab_cu_del);
|
6447 |
|
|
for (node = limbo_die_list, pnode = &limbo_die_list;
|
6448 |
|
|
node;
|
6449 |
|
|
node = node->next)
|
6450 |
|
|
{
|
6451 |
|
|
int is_dupl;
|
6452 |
|
|
|
6453 |
|
|
compute_section_prefix (node->die);
|
6454 |
|
|
is_dupl = check_duplicate_cu (node->die, cu_hash_table,
|
6455 |
|
|
&comdat_symbol_number);
|
6456 |
|
|
assign_symbol_names (node->die);
|
6457 |
|
|
if (is_dupl)
|
6458 |
|
|
*pnode = node->next;
|
6459 |
|
|
else
|
6460 |
|
|
{
|
6461 |
|
|
pnode = &node->next;
|
6462 |
|
|
record_comdat_symbol_number (node->die, cu_hash_table,
|
6463 |
|
|
comdat_symbol_number);
|
6464 |
|
|
}
|
6465 |
|
|
}
|
6466 |
|
|
htab_delete (cu_hash_table);
|
6467 |
|
|
}
|
6468 |
|
|
|
6469 |
|
|
/* Traverse the DIE and add a sibling attribute if it may have the
|
6470 |
|
|
effect of speeding up access to siblings. To save some space,
|
6471 |
|
|
avoid generating sibling attributes for DIE's without children. */
|
6472 |
|
|
|
6473 |
|
|
static void
|
6474 |
|
|
add_sibling_attributes (dw_die_ref die)
|
6475 |
|
|
{
|
6476 |
|
|
dw_die_ref c;
|
6477 |
|
|
|
6478 |
|
|
if (! die->die_child)
|
6479 |
|
|
return;
|
6480 |
|
|
|
6481 |
|
|
if (die->die_parent && die != die->die_parent->die_child)
|
6482 |
|
|
add_AT_die_ref (die, DW_AT_sibling, die->die_sib);
|
6483 |
|
|
|
6484 |
|
|
FOR_EACH_CHILD (die, c, add_sibling_attributes (c));
|
6485 |
|
|
}
|
6486 |
|
|
|
6487 |
|
|
/* Output all location lists for the DIE and its children. */
|
6488 |
|
|
|
6489 |
|
|
static void
|
6490 |
|
|
output_location_lists (dw_die_ref die)
|
6491 |
|
|
{
|
6492 |
|
|
dw_die_ref c;
|
6493 |
|
|
dw_attr_ref a;
|
6494 |
|
|
unsigned ix;
|
6495 |
|
|
|
6496 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
6497 |
|
|
if (AT_class (a) == dw_val_class_loc_list)
|
6498 |
|
|
output_loc_list (AT_loc_list (a));
|
6499 |
|
|
|
6500 |
|
|
FOR_EACH_CHILD (die, c, output_location_lists (c));
|
6501 |
|
|
}
|
6502 |
|
|
|
6503 |
|
|
/* The format of each DIE (and its attribute value pairs) is encoded in an
|
6504 |
|
|
abbreviation table. This routine builds the abbreviation table and assigns
|
6505 |
|
|
a unique abbreviation id for each abbreviation entry. The children of each
|
6506 |
|
|
die are visited recursively. */
|
6507 |
|
|
|
6508 |
|
|
static void
|
6509 |
|
|
build_abbrev_table (dw_die_ref die)
|
6510 |
|
|
{
|
6511 |
|
|
unsigned long abbrev_id;
|
6512 |
|
|
unsigned int n_alloc;
|
6513 |
|
|
dw_die_ref c;
|
6514 |
|
|
dw_attr_ref a;
|
6515 |
|
|
unsigned ix;
|
6516 |
|
|
|
6517 |
|
|
/* Scan the DIE references, and mark as external any that refer to
|
6518 |
|
|
DIEs from other CUs (i.e. those which are not marked). */
|
6519 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
6520 |
|
|
if (AT_class (a) == dw_val_class_die_ref
|
6521 |
|
|
&& AT_ref (a)->die_mark == 0)
|
6522 |
|
|
{
|
6523 |
|
|
gcc_assert (AT_ref (a)->die_symbol);
|
6524 |
|
|
|
6525 |
|
|
set_AT_ref_external (a, 1);
|
6526 |
|
|
}
|
6527 |
|
|
|
6528 |
|
|
for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
|
6529 |
|
|
{
|
6530 |
|
|
dw_die_ref abbrev = abbrev_die_table[abbrev_id];
|
6531 |
|
|
dw_attr_ref die_a, abbrev_a;
|
6532 |
|
|
unsigned ix;
|
6533 |
|
|
bool ok = true;
|
6534 |
|
|
|
6535 |
|
|
if (abbrev->die_tag != die->die_tag)
|
6536 |
|
|
continue;
|
6537 |
|
|
if ((abbrev->die_child != NULL) != (die->die_child != NULL))
|
6538 |
|
|
continue;
|
6539 |
|
|
|
6540 |
|
|
if (VEC_length (dw_attr_node, abbrev->die_attr)
|
6541 |
|
|
!= VEC_length (dw_attr_node, die->die_attr))
|
6542 |
|
|
continue;
|
6543 |
|
|
|
6544 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, die_a); ix++)
|
6545 |
|
|
{
|
6546 |
|
|
abbrev_a = VEC_index (dw_attr_node, abbrev->die_attr, ix);
|
6547 |
|
|
if ((abbrev_a->dw_attr != die_a->dw_attr)
|
6548 |
|
|
|| (value_format (abbrev_a) != value_format (die_a)))
|
6549 |
|
|
{
|
6550 |
|
|
ok = false;
|
6551 |
|
|
break;
|
6552 |
|
|
}
|
6553 |
|
|
}
|
6554 |
|
|
if (ok)
|
6555 |
|
|
break;
|
6556 |
|
|
}
|
6557 |
|
|
|
6558 |
|
|
if (abbrev_id >= abbrev_die_table_in_use)
|
6559 |
|
|
{
|
6560 |
|
|
if (abbrev_die_table_in_use >= abbrev_die_table_allocated)
|
6561 |
|
|
{
|
6562 |
|
|
n_alloc = abbrev_die_table_allocated + ABBREV_DIE_TABLE_INCREMENT;
|
6563 |
|
|
abbrev_die_table = ggc_realloc (abbrev_die_table,
|
6564 |
|
|
sizeof (dw_die_ref) * n_alloc);
|
6565 |
|
|
|
6566 |
|
|
memset (&abbrev_die_table[abbrev_die_table_allocated], 0,
|
6567 |
|
|
(n_alloc - abbrev_die_table_allocated) * sizeof (dw_die_ref));
|
6568 |
|
|
abbrev_die_table_allocated = n_alloc;
|
6569 |
|
|
}
|
6570 |
|
|
|
6571 |
|
|
++abbrev_die_table_in_use;
|
6572 |
|
|
abbrev_die_table[abbrev_id] = die;
|
6573 |
|
|
}
|
6574 |
|
|
|
6575 |
|
|
die->die_abbrev = abbrev_id;
|
6576 |
|
|
FOR_EACH_CHILD (die, c, build_abbrev_table (c));
|
6577 |
|
|
}
|
6578 |
|
|
|
6579 |
|
|
/* Return the power-of-two number of bytes necessary to represent VALUE. */
|
6580 |
|
|
|
6581 |
|
|
static int
|
6582 |
|
|
constant_size (long unsigned int value)
|
6583 |
|
|
{
|
6584 |
|
|
int log;
|
6585 |
|
|
|
6586 |
|
|
if (value == 0)
|
6587 |
|
|
log = 0;
|
6588 |
|
|
else
|
6589 |
|
|
log = floor_log2 (value);
|
6590 |
|
|
|
6591 |
|
|
log = log / 8;
|
6592 |
|
|
log = 1 << (floor_log2 (log) + 1);
|
6593 |
|
|
|
6594 |
|
|
return log;
|
6595 |
|
|
}
|
6596 |
|
|
|
6597 |
|
|
/* Return the size of a DIE as it is represented in the
|
6598 |
|
|
.debug_info section. */
|
6599 |
|
|
|
6600 |
|
|
static unsigned long
|
6601 |
|
|
size_of_die (dw_die_ref die)
|
6602 |
|
|
{
|
6603 |
|
|
unsigned long size = 0;
|
6604 |
|
|
dw_attr_ref a;
|
6605 |
|
|
unsigned ix;
|
6606 |
|
|
|
6607 |
|
|
size += size_of_uleb128 (die->die_abbrev);
|
6608 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
6609 |
|
|
{
|
6610 |
|
|
switch (AT_class (a))
|
6611 |
|
|
{
|
6612 |
|
|
case dw_val_class_addr:
|
6613 |
|
|
size += DWARF2_ADDR_SIZE;
|
6614 |
|
|
break;
|
6615 |
|
|
case dw_val_class_offset:
|
6616 |
|
|
size += DWARF_OFFSET_SIZE;
|
6617 |
|
|
break;
|
6618 |
|
|
case dw_val_class_loc:
|
6619 |
|
|
{
|
6620 |
|
|
unsigned long lsize = size_of_locs (AT_loc (a));
|
6621 |
|
|
|
6622 |
|
|
/* Block length. */
|
6623 |
|
|
size += constant_size (lsize);
|
6624 |
|
|
size += lsize;
|
6625 |
|
|
}
|
6626 |
|
|
break;
|
6627 |
|
|
case dw_val_class_loc_list:
|
6628 |
|
|
size += DWARF_OFFSET_SIZE;
|
6629 |
|
|
break;
|
6630 |
|
|
case dw_val_class_range_list:
|
6631 |
|
|
size += DWARF_OFFSET_SIZE;
|
6632 |
|
|
break;
|
6633 |
|
|
case dw_val_class_const:
|
6634 |
|
|
size += size_of_sleb128 (AT_int (a));
|
6635 |
|
|
break;
|
6636 |
|
|
case dw_val_class_unsigned_const:
|
6637 |
|
|
size += constant_size (AT_unsigned (a));
|
6638 |
|
|
break;
|
6639 |
|
|
case dw_val_class_long_long:
|
6640 |
|
|
size += 1 + 2*HOST_BITS_PER_LONG/HOST_BITS_PER_CHAR; /* block */
|
6641 |
|
|
break;
|
6642 |
|
|
case dw_val_class_vec:
|
6643 |
|
|
size += 1 + (a->dw_attr_val.v.val_vec.length
|
6644 |
|
|
* a->dw_attr_val.v.val_vec.elt_size); /* block */
|
6645 |
|
|
break;
|
6646 |
|
|
case dw_val_class_flag:
|
6647 |
|
|
size += 1;
|
6648 |
|
|
break;
|
6649 |
|
|
case dw_val_class_die_ref:
|
6650 |
|
|
if (AT_ref_external (a))
|
6651 |
|
|
size += DWARF2_ADDR_SIZE;
|
6652 |
|
|
else
|
6653 |
|
|
size += DWARF_OFFSET_SIZE;
|
6654 |
|
|
break;
|
6655 |
|
|
case dw_val_class_fde_ref:
|
6656 |
|
|
size += DWARF_OFFSET_SIZE;
|
6657 |
|
|
break;
|
6658 |
|
|
case dw_val_class_lbl_id:
|
6659 |
|
|
size += DWARF2_ADDR_SIZE;
|
6660 |
|
|
break;
|
6661 |
|
|
case dw_val_class_lineptr:
|
6662 |
|
|
case dw_val_class_macptr:
|
6663 |
|
|
size += DWARF_OFFSET_SIZE;
|
6664 |
|
|
break;
|
6665 |
|
|
case dw_val_class_str:
|
6666 |
|
|
if (AT_string_form (a) == DW_FORM_strp)
|
6667 |
|
|
size += DWARF_OFFSET_SIZE;
|
6668 |
|
|
else
|
6669 |
|
|
size += strlen (a->dw_attr_val.v.val_str->str) + 1;
|
6670 |
|
|
break;
|
6671 |
|
|
case dw_val_class_file:
|
6672 |
|
|
size += constant_size (maybe_emit_file (a->dw_attr_val.v.val_file));
|
6673 |
|
|
break;
|
6674 |
|
|
default:
|
6675 |
|
|
gcc_unreachable ();
|
6676 |
|
|
}
|
6677 |
|
|
}
|
6678 |
|
|
|
6679 |
|
|
return size;
|
6680 |
|
|
}
|
6681 |
|
|
|
6682 |
|
|
/* Size the debugging information associated with a given DIE. Visits the
|
6683 |
|
|
DIE's children recursively. Updates the global variable next_die_offset, on
|
6684 |
|
|
each time through. Uses the current value of next_die_offset to update the
|
6685 |
|
|
die_offset field in each DIE. */
|
6686 |
|
|
|
6687 |
|
|
static void
|
6688 |
|
|
calc_die_sizes (dw_die_ref die)
|
6689 |
|
|
{
|
6690 |
|
|
dw_die_ref c;
|
6691 |
|
|
|
6692 |
|
|
die->die_offset = next_die_offset;
|
6693 |
|
|
next_die_offset += size_of_die (die);
|
6694 |
|
|
|
6695 |
|
|
FOR_EACH_CHILD (die, c, calc_die_sizes (c));
|
6696 |
|
|
|
6697 |
|
|
if (die->die_child != NULL)
|
6698 |
|
|
/* Count the null byte used to terminate sibling lists. */
|
6699 |
|
|
next_die_offset += 1;
|
6700 |
|
|
}
|
6701 |
|
|
|
6702 |
|
|
/* Set the marks for a die and its children. We do this so
|
6703 |
|
|
that we know whether or not a reference needs to use FORM_ref_addr; only
|
6704 |
|
|
DIEs in the same CU will be marked. We used to clear out the offset
|
6705 |
|
|
and use that as the flag, but ran into ordering problems. */
|
6706 |
|
|
|
6707 |
|
|
static void
|
6708 |
|
|
mark_dies (dw_die_ref die)
|
6709 |
|
|
{
|
6710 |
|
|
dw_die_ref c;
|
6711 |
|
|
|
6712 |
|
|
gcc_assert (!die->die_mark);
|
6713 |
|
|
|
6714 |
|
|
die->die_mark = 1;
|
6715 |
|
|
FOR_EACH_CHILD (die, c, mark_dies (c));
|
6716 |
|
|
}
|
6717 |
|
|
|
6718 |
|
|
/* Clear the marks for a die and its children. */
|
6719 |
|
|
|
6720 |
|
|
static void
|
6721 |
|
|
unmark_dies (dw_die_ref die)
|
6722 |
|
|
{
|
6723 |
|
|
dw_die_ref c;
|
6724 |
|
|
|
6725 |
|
|
gcc_assert (die->die_mark);
|
6726 |
|
|
|
6727 |
|
|
die->die_mark = 0;
|
6728 |
|
|
FOR_EACH_CHILD (die, c, unmark_dies (c));
|
6729 |
|
|
}
|
6730 |
|
|
|
6731 |
|
|
/* Clear the marks for a die, its children and referred dies. */
|
6732 |
|
|
|
6733 |
|
|
static void
|
6734 |
|
|
unmark_all_dies (dw_die_ref die)
|
6735 |
|
|
{
|
6736 |
|
|
dw_die_ref c;
|
6737 |
|
|
dw_attr_ref a;
|
6738 |
|
|
unsigned ix;
|
6739 |
|
|
|
6740 |
|
|
if (!die->die_mark)
|
6741 |
|
|
return;
|
6742 |
|
|
die->die_mark = 0;
|
6743 |
|
|
|
6744 |
|
|
FOR_EACH_CHILD (die, c, unmark_all_dies (c));
|
6745 |
|
|
|
6746 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
6747 |
|
|
if (AT_class (a) == dw_val_class_die_ref)
|
6748 |
|
|
unmark_all_dies (AT_ref (a));
|
6749 |
|
|
}
|
6750 |
|
|
|
6751 |
|
|
/* Return the size of the .debug_pubnames table generated for the
|
6752 |
|
|
compilation unit. */
|
6753 |
|
|
|
6754 |
|
|
static unsigned long
|
6755 |
|
|
size_of_pubnames (void)
|
6756 |
|
|
{
|
6757 |
|
|
unsigned long size;
|
6758 |
|
|
unsigned i;
|
6759 |
|
|
|
6760 |
|
|
size = DWARF_PUBNAMES_HEADER_SIZE;
|
6761 |
|
|
for (i = 0; i < pubname_table_in_use; i++)
|
6762 |
|
|
{
|
6763 |
|
|
pubname_ref p = &pubname_table[i];
|
6764 |
|
|
size += DWARF_OFFSET_SIZE + strlen (p->name) + 1;
|
6765 |
|
|
}
|
6766 |
|
|
|
6767 |
|
|
size += DWARF_OFFSET_SIZE;
|
6768 |
|
|
return size;
|
6769 |
|
|
}
|
6770 |
|
|
|
6771 |
|
|
/* Return the size of the information in the .debug_aranges section. */
|
6772 |
|
|
|
6773 |
|
|
static unsigned long
|
6774 |
|
|
size_of_aranges (void)
|
6775 |
|
|
{
|
6776 |
|
|
unsigned long size;
|
6777 |
|
|
|
6778 |
|
|
size = DWARF_ARANGES_HEADER_SIZE;
|
6779 |
|
|
|
6780 |
|
|
/* Count the address/length pair for this compilation unit. */
|
6781 |
|
|
size += 2 * DWARF2_ADDR_SIZE;
|
6782 |
|
|
size += 2 * DWARF2_ADDR_SIZE * arange_table_in_use;
|
6783 |
|
|
|
6784 |
|
|
/* Count the two zero words used to terminated the address range table. */
|
6785 |
|
|
size += 2 * DWARF2_ADDR_SIZE;
|
6786 |
|
|
return size;
|
6787 |
|
|
}
|
6788 |
|
|
|
6789 |
|
|
/* Select the encoding of an attribute value. */
|
6790 |
|
|
|
6791 |
|
|
static enum dwarf_form
|
6792 |
|
|
value_format (dw_attr_ref a)
|
6793 |
|
|
{
|
6794 |
|
|
switch (a->dw_attr_val.val_class)
|
6795 |
|
|
{
|
6796 |
|
|
case dw_val_class_addr:
|
6797 |
|
|
return DW_FORM_addr;
|
6798 |
|
|
case dw_val_class_range_list:
|
6799 |
|
|
case dw_val_class_offset:
|
6800 |
|
|
case dw_val_class_loc_list:
|
6801 |
|
|
switch (DWARF_OFFSET_SIZE)
|
6802 |
|
|
{
|
6803 |
|
|
case 4:
|
6804 |
|
|
return DW_FORM_data4;
|
6805 |
|
|
case 8:
|
6806 |
|
|
return DW_FORM_data8;
|
6807 |
|
|
default:
|
6808 |
|
|
gcc_unreachable ();
|
6809 |
|
|
}
|
6810 |
|
|
case dw_val_class_loc:
|
6811 |
|
|
switch (constant_size (size_of_locs (AT_loc (a))))
|
6812 |
|
|
{
|
6813 |
|
|
case 1:
|
6814 |
|
|
return DW_FORM_block1;
|
6815 |
|
|
case 2:
|
6816 |
|
|
return DW_FORM_block2;
|
6817 |
|
|
default:
|
6818 |
|
|
gcc_unreachable ();
|
6819 |
|
|
}
|
6820 |
|
|
case dw_val_class_const:
|
6821 |
|
|
return DW_FORM_sdata;
|
6822 |
|
|
case dw_val_class_unsigned_const:
|
6823 |
|
|
switch (constant_size (AT_unsigned (a)))
|
6824 |
|
|
{
|
6825 |
|
|
case 1:
|
6826 |
|
|
return DW_FORM_data1;
|
6827 |
|
|
case 2:
|
6828 |
|
|
return DW_FORM_data2;
|
6829 |
|
|
case 4:
|
6830 |
|
|
return DW_FORM_data4;
|
6831 |
|
|
case 8:
|
6832 |
|
|
return DW_FORM_data8;
|
6833 |
|
|
default:
|
6834 |
|
|
gcc_unreachable ();
|
6835 |
|
|
}
|
6836 |
|
|
case dw_val_class_long_long:
|
6837 |
|
|
return DW_FORM_block1;
|
6838 |
|
|
case dw_val_class_vec:
|
6839 |
|
|
return DW_FORM_block1;
|
6840 |
|
|
case dw_val_class_flag:
|
6841 |
|
|
return DW_FORM_flag;
|
6842 |
|
|
case dw_val_class_die_ref:
|
6843 |
|
|
if (AT_ref_external (a))
|
6844 |
|
|
return DW_FORM_ref_addr;
|
6845 |
|
|
else
|
6846 |
|
|
return DW_FORM_ref;
|
6847 |
|
|
case dw_val_class_fde_ref:
|
6848 |
|
|
return DW_FORM_data;
|
6849 |
|
|
case dw_val_class_lbl_id:
|
6850 |
|
|
return DW_FORM_addr;
|
6851 |
|
|
case dw_val_class_lineptr:
|
6852 |
|
|
case dw_val_class_macptr:
|
6853 |
|
|
return DW_FORM_data;
|
6854 |
|
|
case dw_val_class_str:
|
6855 |
|
|
return AT_string_form (a);
|
6856 |
|
|
case dw_val_class_file:
|
6857 |
|
|
switch (constant_size (maybe_emit_file (a->dw_attr_val.v.val_file)))
|
6858 |
|
|
{
|
6859 |
|
|
case 1:
|
6860 |
|
|
return DW_FORM_data1;
|
6861 |
|
|
case 2:
|
6862 |
|
|
return DW_FORM_data2;
|
6863 |
|
|
case 4:
|
6864 |
|
|
return DW_FORM_data4;
|
6865 |
|
|
default:
|
6866 |
|
|
gcc_unreachable ();
|
6867 |
|
|
}
|
6868 |
|
|
|
6869 |
|
|
default:
|
6870 |
|
|
gcc_unreachable ();
|
6871 |
|
|
}
|
6872 |
|
|
}
|
6873 |
|
|
|
6874 |
|
|
/* Output the encoding of an attribute value. */
|
6875 |
|
|
|
6876 |
|
|
static void
|
6877 |
|
|
output_value_format (dw_attr_ref a)
|
6878 |
|
|
{
|
6879 |
|
|
enum dwarf_form form = value_format (a);
|
6880 |
|
|
|
6881 |
|
|
dw2_asm_output_data_uleb128 (form, "(%s)", dwarf_form_name (form));
|
6882 |
|
|
}
|
6883 |
|
|
|
6884 |
|
|
/* Output the .debug_abbrev section which defines the DIE abbreviation
|
6885 |
|
|
table. */
|
6886 |
|
|
|
6887 |
|
|
static void
|
6888 |
|
|
output_abbrev_section (void)
|
6889 |
|
|
{
|
6890 |
|
|
unsigned long abbrev_id;
|
6891 |
|
|
|
6892 |
|
|
for (abbrev_id = 1; abbrev_id < abbrev_die_table_in_use; ++abbrev_id)
|
6893 |
|
|
{
|
6894 |
|
|
dw_die_ref abbrev = abbrev_die_table[abbrev_id];
|
6895 |
|
|
unsigned ix;
|
6896 |
|
|
dw_attr_ref a_attr;
|
6897 |
|
|
|
6898 |
|
|
dw2_asm_output_data_uleb128 (abbrev_id, "(abbrev code)");
|
6899 |
|
|
dw2_asm_output_data_uleb128 (abbrev->die_tag, "(TAG: %s)",
|
6900 |
|
|
dwarf_tag_name (abbrev->die_tag));
|
6901 |
|
|
|
6902 |
|
|
if (abbrev->die_child != NULL)
|
6903 |
|
|
dw2_asm_output_data (1, DW_children_yes, "DW_children_yes");
|
6904 |
|
|
else
|
6905 |
|
|
dw2_asm_output_data (1, DW_children_no, "DW_children_no");
|
6906 |
|
|
|
6907 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, abbrev->die_attr, ix, a_attr);
|
6908 |
|
|
ix++)
|
6909 |
|
|
{
|
6910 |
|
|
dw2_asm_output_data_uleb128 (a_attr->dw_attr, "(%s)",
|
6911 |
|
|
dwarf_attr_name (a_attr->dw_attr));
|
6912 |
|
|
output_value_format (a_attr);
|
6913 |
|
|
}
|
6914 |
|
|
|
6915 |
|
|
dw2_asm_output_data (1, 0, NULL);
|
6916 |
|
|
dw2_asm_output_data (1, 0, NULL);
|
6917 |
|
|
}
|
6918 |
|
|
|
6919 |
|
|
/* Terminate the table. */
|
6920 |
|
|
dw2_asm_output_data (1, 0, NULL);
|
6921 |
|
|
}
|
6922 |
|
|
|
6923 |
|
|
/* Output a symbol we can use to refer to this DIE from another CU. */
|
6924 |
|
|
|
6925 |
|
|
static inline void
|
6926 |
|
|
output_die_symbol (dw_die_ref die)
|
6927 |
|
|
{
|
6928 |
|
|
char *sym = die->die_symbol;
|
6929 |
|
|
|
6930 |
|
|
if (sym == 0)
|
6931 |
|
|
return;
|
6932 |
|
|
|
6933 |
|
|
if (strncmp (sym, DIE_LABEL_PREFIX, sizeof (DIE_LABEL_PREFIX) - 1) == 0)
|
6934 |
|
|
/* We make these global, not weak; if the target doesn't support
|
6935 |
|
|
.linkonce, it doesn't support combining the sections, so debugging
|
6936 |
|
|
will break. */
|
6937 |
|
|
targetm.asm_out.globalize_label (asm_out_file, sym);
|
6938 |
|
|
|
6939 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, sym);
|
6940 |
|
|
}
|
6941 |
|
|
|
6942 |
|
|
/* Return a new location list, given the begin and end range, and the
|
6943 |
|
|
expression. gensym tells us whether to generate a new internal symbol for
|
6944 |
|
|
this location list node, which is done for the head of the list only. */
|
6945 |
|
|
|
6946 |
|
|
static inline dw_loc_list_ref
|
6947 |
|
|
new_loc_list (dw_loc_descr_ref expr, const char *begin, const char *end,
|
6948 |
|
|
const char *section, unsigned int gensym)
|
6949 |
|
|
{
|
6950 |
|
|
dw_loc_list_ref retlist = ggc_alloc_cleared (sizeof (dw_loc_list_node));
|
6951 |
|
|
|
6952 |
|
|
retlist->begin = begin;
|
6953 |
|
|
retlist->end = end;
|
6954 |
|
|
retlist->expr = expr;
|
6955 |
|
|
retlist->section = section;
|
6956 |
|
|
if (gensym)
|
6957 |
|
|
retlist->ll_symbol = gen_internal_sym ("LLST");
|
6958 |
|
|
|
6959 |
|
|
return retlist;
|
6960 |
|
|
}
|
6961 |
|
|
|
6962 |
|
|
/* Add a location description expression to a location list. */
|
6963 |
|
|
|
6964 |
|
|
static inline void
|
6965 |
|
|
add_loc_descr_to_loc_list (dw_loc_list_ref *list_head, dw_loc_descr_ref descr,
|
6966 |
|
|
const char *begin, const char *end,
|
6967 |
|
|
const char *section)
|
6968 |
|
|
{
|
6969 |
|
|
dw_loc_list_ref *d;
|
6970 |
|
|
|
6971 |
|
|
/* Find the end of the chain. */
|
6972 |
|
|
for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next)
|
6973 |
|
|
;
|
6974 |
|
|
|
6975 |
|
|
/* Add a new location list node to the list. */
|
6976 |
|
|
*d = new_loc_list (descr, begin, end, section, 0);
|
6977 |
|
|
}
|
6978 |
|
|
|
6979 |
|
|
static void
|
6980 |
|
|
dwarf2out_switch_text_section (void)
|
6981 |
|
|
{
|
6982 |
|
|
dw_fde_ref fde;
|
6983 |
|
|
|
6984 |
|
|
gcc_assert (cfun);
|
6985 |
|
|
|
6986 |
|
|
fde = &fde_table[fde_table_in_use - 1];
|
6987 |
|
|
fde->dw_fde_switched_sections = true;
|
6988 |
|
|
fde->dw_fde_hot_section_label = cfun->hot_section_label;
|
6989 |
|
|
fde->dw_fde_hot_section_end_label = cfun->hot_section_end_label;
|
6990 |
|
|
fde->dw_fde_unlikely_section_label = cfun->cold_section_label;
|
6991 |
|
|
fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label;
|
6992 |
|
|
have_multiple_function_sections = true;
|
6993 |
|
|
|
6994 |
|
|
/* Reset the current label on switching text sections, so that we
|
6995 |
|
|
don't attempt to advance_loc4 between labels in different sections. */
|
6996 |
|
|
fde->dw_fde_current_label = NULL;
|
6997 |
|
|
}
|
6998 |
|
|
|
6999 |
|
|
/* Output the location list given to us. */
|
7000 |
|
|
|
7001 |
|
|
static void
|
7002 |
|
|
output_loc_list (dw_loc_list_ref list_head)
|
7003 |
|
|
{
|
7004 |
|
|
dw_loc_list_ref curr = list_head;
|
7005 |
|
|
|
7006 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, list_head->ll_symbol);
|
7007 |
|
|
|
7008 |
|
|
/* Walk the location list, and output each range + expression. */
|
7009 |
|
|
for (curr = list_head; curr != NULL; curr = curr->dw_loc_next)
|
7010 |
|
|
{
|
7011 |
|
|
unsigned long size;
|
7012 |
|
|
if (!have_multiple_function_sections)
|
7013 |
|
|
{
|
7014 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->begin, curr->section,
|
7015 |
|
|
"Location list begin address (%s)",
|
7016 |
|
|
list_head->ll_symbol);
|
7017 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->end, curr->section,
|
7018 |
|
|
"Location list end address (%s)",
|
7019 |
|
|
list_head->ll_symbol);
|
7020 |
|
|
}
|
7021 |
|
|
else
|
7022 |
|
|
{
|
7023 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->begin,
|
7024 |
|
|
"Location list begin address (%s)",
|
7025 |
|
|
list_head->ll_symbol);
|
7026 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->end,
|
7027 |
|
|
"Location list end address (%s)",
|
7028 |
|
|
list_head->ll_symbol);
|
7029 |
|
|
}
|
7030 |
|
|
size = size_of_locs (curr->expr);
|
7031 |
|
|
|
7032 |
|
|
/* Output the block length for this list of location operations. */
|
7033 |
|
|
gcc_assert (size <= 0xffff);
|
7034 |
|
|
dw2_asm_output_data (2, size, "%s", "Location expression size");
|
7035 |
|
|
|
7036 |
|
|
output_loc_sequence (curr->expr);
|
7037 |
|
|
}
|
7038 |
|
|
|
7039 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0,
|
7040 |
|
|
"Location list terminator begin (%s)",
|
7041 |
|
|
list_head->ll_symbol);
|
7042 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0,
|
7043 |
|
|
"Location list terminator end (%s)",
|
7044 |
|
|
list_head->ll_symbol);
|
7045 |
|
|
}
|
7046 |
|
|
|
7047 |
|
|
/* Output the DIE and its attributes. Called recursively to generate
|
7048 |
|
|
the definitions of each child DIE. */
|
7049 |
|
|
|
7050 |
|
|
static void
|
7051 |
|
|
output_die (dw_die_ref die)
|
7052 |
|
|
{
|
7053 |
|
|
dw_attr_ref a;
|
7054 |
|
|
dw_die_ref c;
|
7055 |
|
|
unsigned long size;
|
7056 |
|
|
unsigned ix;
|
7057 |
|
|
|
7058 |
|
|
/* If someone in another CU might refer to us, set up a symbol for
|
7059 |
|
|
them to point to. */
|
7060 |
|
|
if (die->die_symbol)
|
7061 |
|
|
output_die_symbol (die);
|
7062 |
|
|
|
7063 |
|
|
dw2_asm_output_data_uleb128 (die->die_abbrev, "(DIE (0x%lx) %s)",
|
7064 |
|
|
die->die_offset, dwarf_tag_name (die->die_tag));
|
7065 |
|
|
|
7066 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
7067 |
|
|
{
|
7068 |
|
|
const char *name = dwarf_attr_name (a->dw_attr);
|
7069 |
|
|
|
7070 |
|
|
switch (AT_class (a))
|
7071 |
|
|
{
|
7072 |
|
|
case dw_val_class_addr:
|
7073 |
|
|
dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, AT_addr (a), "%s", name);
|
7074 |
|
|
break;
|
7075 |
|
|
|
7076 |
|
|
case dw_val_class_offset:
|
7077 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, a->dw_attr_val.v.val_offset,
|
7078 |
|
|
"%s", name);
|
7079 |
|
|
break;
|
7080 |
|
|
|
7081 |
|
|
case dw_val_class_range_list:
|
7082 |
|
|
{
|
7083 |
|
|
char *p = strchr (ranges_section_label, '\0');
|
7084 |
|
|
|
7085 |
|
|
sprintf (p, "+" HOST_WIDE_INT_PRINT_HEX,
|
7086 |
|
|
a->dw_attr_val.v.val_offset);
|
7087 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, ranges_section_label,
|
7088 |
|
|
debug_ranges_section, "%s", name);
|
7089 |
|
|
*p = '\0';
|
7090 |
|
|
}
|
7091 |
|
|
break;
|
7092 |
|
|
|
7093 |
|
|
case dw_val_class_loc:
|
7094 |
|
|
size = size_of_locs (AT_loc (a));
|
7095 |
|
|
|
7096 |
|
|
/* Output the block length for this list of location operations. */
|
7097 |
|
|
dw2_asm_output_data (constant_size (size), size, "%s", name);
|
7098 |
|
|
|
7099 |
|
|
output_loc_sequence (AT_loc (a));
|
7100 |
|
|
break;
|
7101 |
|
|
|
7102 |
|
|
case dw_val_class_const:
|
7103 |
|
|
/* ??? It would be slightly more efficient to use a scheme like is
|
7104 |
|
|
used for unsigned constants below, but gdb 4.x does not sign
|
7105 |
|
|
extend. Gdb 5.x does sign extend. */
|
7106 |
|
|
dw2_asm_output_data_sleb128 (AT_int (a), "%s", name);
|
7107 |
|
|
break;
|
7108 |
|
|
|
7109 |
|
|
case dw_val_class_unsigned_const:
|
7110 |
|
|
dw2_asm_output_data (constant_size (AT_unsigned (a)),
|
7111 |
|
|
AT_unsigned (a), "%s", name);
|
7112 |
|
|
break;
|
7113 |
|
|
|
7114 |
|
|
case dw_val_class_long_long:
|
7115 |
|
|
{
|
7116 |
|
|
unsigned HOST_WIDE_INT first, second;
|
7117 |
|
|
|
7118 |
|
|
dw2_asm_output_data (1,
|
7119 |
|
|
2 * HOST_BITS_PER_LONG / HOST_BITS_PER_CHAR,
|
7120 |
|
|
"%s", name);
|
7121 |
|
|
|
7122 |
|
|
if (WORDS_BIG_ENDIAN)
|
7123 |
|
|
{
|
7124 |
|
|
first = a->dw_attr_val.v.val_long_long.hi;
|
7125 |
|
|
second = a->dw_attr_val.v.val_long_long.low;
|
7126 |
|
|
}
|
7127 |
|
|
else
|
7128 |
|
|
{
|
7129 |
|
|
first = a->dw_attr_val.v.val_long_long.low;
|
7130 |
|
|
second = a->dw_attr_val.v.val_long_long.hi;
|
7131 |
|
|
}
|
7132 |
|
|
|
7133 |
|
|
dw2_asm_output_data (HOST_BITS_PER_LONG / HOST_BITS_PER_CHAR,
|
7134 |
|
|
first, "long long constant");
|
7135 |
|
|
dw2_asm_output_data (HOST_BITS_PER_LONG / HOST_BITS_PER_CHAR,
|
7136 |
|
|
second, NULL);
|
7137 |
|
|
}
|
7138 |
|
|
break;
|
7139 |
|
|
|
7140 |
|
|
case dw_val_class_vec:
|
7141 |
|
|
{
|
7142 |
|
|
unsigned int elt_size = a->dw_attr_val.v.val_vec.elt_size;
|
7143 |
|
|
unsigned int len = a->dw_attr_val.v.val_vec.length;
|
7144 |
|
|
unsigned int i;
|
7145 |
|
|
unsigned char *p;
|
7146 |
|
|
|
7147 |
|
|
dw2_asm_output_data (1, len * elt_size, "%s", name);
|
7148 |
|
|
if (elt_size > sizeof (HOST_WIDE_INT))
|
7149 |
|
|
{
|
7150 |
|
|
elt_size /= 2;
|
7151 |
|
|
len *= 2;
|
7152 |
|
|
}
|
7153 |
|
|
for (i = 0, p = a->dw_attr_val.v.val_vec.array;
|
7154 |
|
|
i < len;
|
7155 |
|
|
i++, p += elt_size)
|
7156 |
|
|
dw2_asm_output_data (elt_size, extract_int (p, elt_size),
|
7157 |
|
|
"fp or vector constant word %u", i);
|
7158 |
|
|
break;
|
7159 |
|
|
}
|
7160 |
|
|
|
7161 |
|
|
case dw_val_class_flag:
|
7162 |
|
|
dw2_asm_output_data (1, AT_flag (a), "%s", name);
|
7163 |
|
|
break;
|
7164 |
|
|
|
7165 |
|
|
case dw_val_class_loc_list:
|
7166 |
|
|
{
|
7167 |
|
|
char *sym = AT_loc_list (a)->ll_symbol;
|
7168 |
|
|
|
7169 |
|
|
gcc_assert (sym);
|
7170 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section,
|
7171 |
|
|
"%s", name);
|
7172 |
|
|
}
|
7173 |
|
|
break;
|
7174 |
|
|
|
7175 |
|
|
case dw_val_class_die_ref:
|
7176 |
|
|
if (AT_ref_external (a))
|
7177 |
|
|
{
|
7178 |
|
|
char *sym = AT_ref (a)->die_symbol;
|
7179 |
|
|
|
7180 |
|
|
gcc_assert (sym);
|
7181 |
|
|
dw2_asm_output_offset (DWARF2_ADDR_SIZE, sym, debug_info_section,
|
7182 |
|
|
"%s", name);
|
7183 |
|
|
}
|
7184 |
|
|
else
|
7185 |
|
|
{
|
7186 |
|
|
gcc_assert (AT_ref (a)->die_offset);
|
7187 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, AT_ref (a)->die_offset,
|
7188 |
|
|
"%s", name);
|
7189 |
|
|
}
|
7190 |
|
|
break;
|
7191 |
|
|
|
7192 |
|
|
case dw_val_class_fde_ref:
|
7193 |
|
|
{
|
7194 |
|
|
char l1[20];
|
7195 |
|
|
|
7196 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l1, FDE_LABEL,
|
7197 |
|
|
a->dw_attr_val.v.val_fde_index * 2);
|
7198 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, l1, debug_frame_section,
|
7199 |
|
|
"%s", name);
|
7200 |
|
|
}
|
7201 |
|
|
break;
|
7202 |
|
|
|
7203 |
|
|
case dw_val_class_lbl_id:
|
7204 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, AT_lbl (a), "%s", name);
|
7205 |
|
|
break;
|
7206 |
|
|
|
7207 |
|
|
case dw_val_class_lineptr:
|
7208 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
|
7209 |
|
|
debug_line_section, "%s", name);
|
7210 |
|
|
break;
|
7211 |
|
|
|
7212 |
|
|
case dw_val_class_macptr:
|
7213 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
|
7214 |
|
|
debug_macinfo_section, "%s", name);
|
7215 |
|
|
break;
|
7216 |
|
|
|
7217 |
|
|
case dw_val_class_str:
|
7218 |
|
|
if (AT_string_form (a) == DW_FORM_strp)
|
7219 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE,
|
7220 |
|
|
a->dw_attr_val.v.val_str->label,
|
7221 |
|
|
debug_str_section,
|
7222 |
|
|
"%s: \"%s\"", name, AT_string (a));
|
7223 |
|
|
else
|
7224 |
|
|
dw2_asm_output_nstring (AT_string (a), -1, "%s", name);
|
7225 |
|
|
break;
|
7226 |
|
|
|
7227 |
|
|
case dw_val_class_file:
|
7228 |
|
|
{
|
7229 |
|
|
int f = maybe_emit_file (a->dw_attr_val.v.val_file);
|
7230 |
|
|
|
7231 |
|
|
dw2_asm_output_data (constant_size (f), f, "%s (%s)", name,
|
7232 |
|
|
a->dw_attr_val.v.val_file->filename);
|
7233 |
|
|
break;
|
7234 |
|
|
}
|
7235 |
|
|
|
7236 |
|
|
default:
|
7237 |
|
|
gcc_unreachable ();
|
7238 |
|
|
}
|
7239 |
|
|
}
|
7240 |
|
|
|
7241 |
|
|
FOR_EACH_CHILD (die, c, output_die (c));
|
7242 |
|
|
|
7243 |
|
|
/* Add null byte to terminate sibling list. */
|
7244 |
|
|
if (die->die_child != NULL)
|
7245 |
|
|
dw2_asm_output_data (1, 0, "end of children of DIE 0x%lx",
|
7246 |
|
|
die->die_offset);
|
7247 |
|
|
}
|
7248 |
|
|
|
7249 |
|
|
/* Output the compilation unit that appears at the beginning of the
|
7250 |
|
|
.debug_info section, and precedes the DIE descriptions. */
|
7251 |
|
|
|
7252 |
|
|
static void
|
7253 |
|
|
output_compilation_unit_header (void)
|
7254 |
|
|
{
|
7255 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
|
7256 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
7257 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
7258 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE,
|
7259 |
|
|
next_die_offset - DWARF_INITIAL_LENGTH_SIZE,
|
7260 |
|
|
"Length of Compilation Unit Info");
|
7261 |
|
|
dw2_asm_output_data (2, DWARF_VERSION, "DWARF version number");
|
7262 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label,
|
7263 |
|
|
debug_abbrev_section,
|
7264 |
|
|
"Offset Into Abbrev. Section");
|
7265 |
|
|
dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)");
|
7266 |
|
|
}
|
7267 |
|
|
|
7268 |
|
|
/* Output the compilation unit DIE and its children. */
|
7269 |
|
|
|
7270 |
|
|
static void
|
7271 |
|
|
output_comp_unit (dw_die_ref die, int output_if_empty)
|
7272 |
|
|
{
|
7273 |
|
|
const char *secname;
|
7274 |
|
|
char *oldsym, *tmp;
|
7275 |
|
|
|
7276 |
|
|
/* Unless we are outputting main CU, we may throw away empty ones. */
|
7277 |
|
|
if (!output_if_empty && die->die_child == NULL)
|
7278 |
|
|
return;
|
7279 |
|
|
|
7280 |
|
|
/* Even if there are no children of this DIE, we must output the information
|
7281 |
|
|
about the compilation unit. Otherwise, on an empty translation unit, we
|
7282 |
|
|
will generate a present, but empty, .debug_info section. IRIX 6.5 `nm'
|
7283 |
|
|
will then complain when examining the file. First mark all the DIEs in
|
7284 |
|
|
this CU so we know which get local refs. */
|
7285 |
|
|
mark_dies (die);
|
7286 |
|
|
|
7287 |
|
|
build_abbrev_table (die);
|
7288 |
|
|
|
7289 |
|
|
/* Initialize the beginning DIE offset - and calculate sizes/offsets. */
|
7290 |
|
|
next_die_offset = DWARF_COMPILE_UNIT_HEADER_SIZE;
|
7291 |
|
|
calc_die_sizes (die);
|
7292 |
|
|
|
7293 |
|
|
oldsym = die->die_symbol;
|
7294 |
|
|
if (oldsym)
|
7295 |
|
|
{
|
7296 |
|
|
tmp = alloca (strlen (oldsym) + 24);
|
7297 |
|
|
|
7298 |
|
|
sprintf (tmp, ".gnu.linkonce.wi.%s", oldsym);
|
7299 |
|
|
secname = tmp;
|
7300 |
|
|
die->die_symbol = NULL;
|
7301 |
|
|
switch_to_section (get_section (secname, SECTION_DEBUG, NULL));
|
7302 |
|
|
}
|
7303 |
|
|
else
|
7304 |
|
|
switch_to_section (debug_info_section);
|
7305 |
|
|
|
7306 |
|
|
/* Output debugging information. */
|
7307 |
|
|
output_compilation_unit_header ();
|
7308 |
|
|
output_die (die);
|
7309 |
|
|
|
7310 |
|
|
/* Leave the marks on the main CU, so we can check them in
|
7311 |
|
|
output_pubnames. */
|
7312 |
|
|
if (oldsym)
|
7313 |
|
|
{
|
7314 |
|
|
unmark_dies (die);
|
7315 |
|
|
die->die_symbol = oldsym;
|
7316 |
|
|
}
|
7317 |
|
|
}
|
7318 |
|
|
|
7319 |
|
|
/* Return the DWARF2/3 pubname associated with a decl. */
|
7320 |
|
|
|
7321 |
|
|
static const char *
|
7322 |
|
|
dwarf2_name (tree decl, int scope)
|
7323 |
|
|
{
|
7324 |
|
|
return lang_hooks.dwarf_name (decl, scope ? 1 : 0);
|
7325 |
|
|
}
|
7326 |
|
|
|
7327 |
|
|
/* Add a new entry to .debug_pubnames if appropriate. */
|
7328 |
|
|
|
7329 |
|
|
static void
|
7330 |
|
|
add_pubname (tree decl, dw_die_ref die)
|
7331 |
|
|
{
|
7332 |
|
|
pubname_ref p;
|
7333 |
|
|
|
7334 |
|
|
if (! TREE_PUBLIC (decl))
|
7335 |
|
|
return;
|
7336 |
|
|
|
7337 |
|
|
if (pubname_table_in_use == pubname_table_allocated)
|
7338 |
|
|
{
|
7339 |
|
|
pubname_table_allocated += PUBNAME_TABLE_INCREMENT;
|
7340 |
|
|
pubname_table
|
7341 |
|
|
= ggc_realloc (pubname_table,
|
7342 |
|
|
(pubname_table_allocated * sizeof (pubname_entry)));
|
7343 |
|
|
memset (pubname_table + pubname_table_in_use, 0,
|
7344 |
|
|
PUBNAME_TABLE_INCREMENT * sizeof (pubname_entry));
|
7345 |
|
|
}
|
7346 |
|
|
|
7347 |
|
|
p = &pubname_table[pubname_table_in_use++];
|
7348 |
|
|
p->die = die;
|
7349 |
|
|
p->name = xstrdup (dwarf2_name (decl, 1));
|
7350 |
|
|
}
|
7351 |
|
|
|
7352 |
|
|
/* Output the public names table used to speed up access to externally
|
7353 |
|
|
visible names. For now, only generate entries for externally
|
7354 |
|
|
visible procedures. */
|
7355 |
|
|
|
7356 |
|
|
static void
|
7357 |
|
|
output_pubnames (void)
|
7358 |
|
|
{
|
7359 |
|
|
unsigned i;
|
7360 |
|
|
unsigned long pubnames_length = size_of_pubnames ();
|
7361 |
|
|
|
7362 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
|
7363 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
7364 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
7365 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length,
|
7366 |
|
|
"Length of Public Names Info");
|
7367 |
|
|
dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
|
7368 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
|
7369 |
|
|
debug_info_section,
|
7370 |
|
|
"Offset of Compilation Unit Info");
|
7371 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, next_die_offset,
|
7372 |
|
|
"Compilation Unit Length");
|
7373 |
|
|
|
7374 |
|
|
for (i = 0; i < pubname_table_in_use; i++)
|
7375 |
|
|
{
|
7376 |
|
|
pubname_ref pub = &pubname_table[i];
|
7377 |
|
|
|
7378 |
|
|
/* We shouldn't see pubnames for DIEs outside of the main CU. */
|
7379 |
|
|
gcc_assert (pub->die->die_mark);
|
7380 |
|
|
|
7381 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, pub->die->die_offset,
|
7382 |
|
|
"DIE offset");
|
7383 |
|
|
|
7384 |
|
|
dw2_asm_output_nstring (pub->name, -1, "external name");
|
7385 |
|
|
}
|
7386 |
|
|
|
7387 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, 0, NULL);
|
7388 |
|
|
}
|
7389 |
|
|
|
7390 |
|
|
/* Add a new entry to .debug_aranges if appropriate. */
|
7391 |
|
|
|
7392 |
|
|
static void
|
7393 |
|
|
add_arange (tree decl, dw_die_ref die)
|
7394 |
|
|
{
|
7395 |
|
|
if (! DECL_SECTION_NAME (decl))
|
7396 |
|
|
return;
|
7397 |
|
|
|
7398 |
|
|
if (arange_table_in_use == arange_table_allocated)
|
7399 |
|
|
{
|
7400 |
|
|
arange_table_allocated += ARANGE_TABLE_INCREMENT;
|
7401 |
|
|
arange_table = ggc_realloc (arange_table,
|
7402 |
|
|
(arange_table_allocated
|
7403 |
|
|
* sizeof (dw_die_ref)));
|
7404 |
|
|
memset (arange_table + arange_table_in_use, 0,
|
7405 |
|
|
ARANGE_TABLE_INCREMENT * sizeof (dw_die_ref));
|
7406 |
|
|
}
|
7407 |
|
|
|
7408 |
|
|
arange_table[arange_table_in_use++] = die;
|
7409 |
|
|
}
|
7410 |
|
|
|
7411 |
|
|
/* Output the information that goes into the .debug_aranges table.
|
7412 |
|
|
Namely, define the beginning and ending address range of the
|
7413 |
|
|
text section generated for this compilation unit. */
|
7414 |
|
|
|
7415 |
|
|
static void
|
7416 |
|
|
output_aranges (void)
|
7417 |
|
|
{
|
7418 |
|
|
unsigned i;
|
7419 |
|
|
unsigned long aranges_length = size_of_aranges ();
|
7420 |
|
|
|
7421 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
|
7422 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
7423 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
7424 |
|
|
dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length,
|
7425 |
|
|
"Length of Address Ranges Info");
|
7426 |
|
|
dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
|
7427 |
|
|
dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
|
7428 |
|
|
debug_info_section,
|
7429 |
|
|
"Offset of Compilation Unit Info");
|
7430 |
|
|
dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address");
|
7431 |
|
|
dw2_asm_output_data (1, 0, "Size of Segment Descriptor");
|
7432 |
|
|
|
7433 |
|
|
/* We need to align to twice the pointer size here. */
|
7434 |
|
|
if (DWARF_ARANGES_PAD_SIZE)
|
7435 |
|
|
{
|
7436 |
|
|
/* Pad using a 2 byte words so that padding is correct for any
|
7437 |
|
|
pointer size. */
|
7438 |
|
|
dw2_asm_output_data (2, 0, "Pad to %d byte boundary",
|
7439 |
|
|
2 * DWARF2_ADDR_SIZE);
|
7440 |
|
|
for (i = 2; i < (unsigned) DWARF_ARANGES_PAD_SIZE; i += 2)
|
7441 |
|
|
dw2_asm_output_data (2, 0, NULL);
|
7442 |
|
|
}
|
7443 |
|
|
|
7444 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
|
7445 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
|
7446 |
|
|
text_section_label, "Length");
|
7447 |
|
|
if (flag_reorder_blocks_and_partition)
|
7448 |
|
|
{
|
7449 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label,
|
7450 |
|
|
"Address");
|
7451 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label,
|
7452 |
|
|
cold_text_section_label, "Length");
|
7453 |
|
|
}
|
7454 |
|
|
|
7455 |
|
|
for (i = 0; i < arange_table_in_use; i++)
|
7456 |
|
|
{
|
7457 |
|
|
dw_die_ref die = arange_table[i];
|
7458 |
|
|
|
7459 |
|
|
/* We shouldn't see aranges for DIEs outside of the main CU. */
|
7460 |
|
|
gcc_assert (die->die_mark);
|
7461 |
|
|
|
7462 |
|
|
if (die->die_tag == DW_TAG_subprogram)
|
7463 |
|
|
{
|
7464 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, get_AT_low_pc (die),
|
7465 |
|
|
"Address");
|
7466 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, get_AT_hi_pc (die),
|
7467 |
|
|
get_AT_low_pc (die), "Length");
|
7468 |
|
|
}
|
7469 |
|
|
else
|
7470 |
|
|
{
|
7471 |
|
|
/* A static variable; extract the symbol from DW_AT_location.
|
7472 |
|
|
Note that this code isn't currently hit, as we only emit
|
7473 |
|
|
aranges for functions (jason 9/23/99). */
|
7474 |
|
|
dw_attr_ref a = get_AT (die, DW_AT_location);
|
7475 |
|
|
dw_loc_descr_ref loc;
|
7476 |
|
|
|
7477 |
|
|
gcc_assert (a && AT_class (a) == dw_val_class_loc);
|
7478 |
|
|
|
7479 |
|
|
loc = AT_loc (a);
|
7480 |
|
|
gcc_assert (loc->dw_loc_opc == DW_OP_addr);
|
7481 |
|
|
|
7482 |
|
|
dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE,
|
7483 |
|
|
loc->dw_loc_oprnd1.v.val_addr, "Address");
|
7484 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE,
|
7485 |
|
|
get_AT_unsigned (die, DW_AT_byte_size),
|
7486 |
|
|
"Length");
|
7487 |
|
|
}
|
7488 |
|
|
}
|
7489 |
|
|
|
7490 |
|
|
/* Output the terminator words. */
|
7491 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
|
7492 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
|
7493 |
|
|
}
|
7494 |
|
|
|
7495 |
|
|
/* Add a new entry to .debug_ranges. Return the offset at which it
|
7496 |
|
|
was placed. */
|
7497 |
|
|
|
7498 |
|
|
static unsigned int
|
7499 |
|
|
add_ranges (tree block)
|
7500 |
|
|
{
|
7501 |
|
|
unsigned int in_use = ranges_table_in_use;
|
7502 |
|
|
|
7503 |
|
|
if (in_use == ranges_table_allocated)
|
7504 |
|
|
{
|
7505 |
|
|
ranges_table_allocated += RANGES_TABLE_INCREMENT;
|
7506 |
|
|
ranges_table
|
7507 |
|
|
= ggc_realloc (ranges_table, (ranges_table_allocated
|
7508 |
|
|
* sizeof (struct dw_ranges_struct)));
|
7509 |
|
|
memset (ranges_table + ranges_table_in_use, 0,
|
7510 |
|
|
RANGES_TABLE_INCREMENT * sizeof (struct dw_ranges_struct));
|
7511 |
|
|
}
|
7512 |
|
|
|
7513 |
|
|
ranges_table[in_use].block_num = (block ? BLOCK_NUMBER (block) : 0);
|
7514 |
|
|
ranges_table_in_use = in_use + 1;
|
7515 |
|
|
|
7516 |
|
|
return in_use * 2 * DWARF2_ADDR_SIZE;
|
7517 |
|
|
}
|
7518 |
|
|
|
7519 |
|
|
static void
|
7520 |
|
|
output_ranges (void)
|
7521 |
|
|
{
|
7522 |
|
|
unsigned i;
|
7523 |
|
|
static const char *const start_fmt = "Offset 0x%x";
|
7524 |
|
|
const char *fmt = start_fmt;
|
7525 |
|
|
|
7526 |
|
|
for (i = 0; i < ranges_table_in_use; i++)
|
7527 |
|
|
{
|
7528 |
|
|
int block_num = ranges_table[i].block_num;
|
7529 |
|
|
|
7530 |
|
|
if (block_num)
|
7531 |
|
|
{
|
7532 |
|
|
char blabel[MAX_ARTIFICIAL_LABEL_BYTES];
|
7533 |
|
|
char elabel[MAX_ARTIFICIAL_LABEL_BYTES];
|
7534 |
|
|
|
7535 |
|
|
ASM_GENERATE_INTERNAL_LABEL (blabel, BLOCK_BEGIN_LABEL, block_num);
|
7536 |
|
|
ASM_GENERATE_INTERNAL_LABEL (elabel, BLOCK_END_LABEL, block_num);
|
7537 |
|
|
|
7538 |
|
|
/* If all code is in the text section, then the compilation
|
7539 |
|
|
unit base address defaults to DW_AT_low_pc, which is the
|
7540 |
|
|
base of the text section. */
|
7541 |
|
|
if (!have_multiple_function_sections)
|
7542 |
|
|
{
|
7543 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel,
|
7544 |
|
|
text_section_label,
|
7545 |
|
|
fmt, i * 2 * DWARF2_ADDR_SIZE);
|
7546 |
|
|
dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel,
|
7547 |
|
|
text_section_label, NULL);
|
7548 |
|
|
}
|
7549 |
|
|
|
7550 |
|
|
/* Otherwise, we add a DW_AT_entry_pc attribute to force the
|
7551 |
|
|
compilation unit base address to zero, which allows us to
|
7552 |
|
|
use absolute addresses, and not worry about whether the
|
7553 |
|
|
target supports cross-section arithmetic. */
|
7554 |
|
|
else
|
7555 |
|
|
{
|
7556 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
|
7557 |
|
|
fmt, i * 2 * DWARF2_ADDR_SIZE);
|
7558 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, elabel, NULL);
|
7559 |
|
|
}
|
7560 |
|
|
|
7561 |
|
|
fmt = NULL;
|
7562 |
|
|
}
|
7563 |
|
|
else
|
7564 |
|
|
{
|
7565 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
|
7566 |
|
|
dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
|
7567 |
|
|
fmt = start_fmt;
|
7568 |
|
|
}
|
7569 |
|
|
}
|
7570 |
|
|
}
|
7571 |
|
|
|
7572 |
|
|
/* Data structure containing information about input files. */
|
7573 |
|
|
struct file_info
|
7574 |
|
|
{
|
7575 |
|
|
const char *path; /* Complete file name. */
|
7576 |
|
|
const char *fname; /* File name part. */
|
7577 |
|
|
int length; /* Length of entire string. */
|
7578 |
|
|
struct dwarf_file_data * file_idx; /* Index in input file table. */
|
7579 |
|
|
int dir_idx; /* Index in directory table. */
|
7580 |
|
|
};
|
7581 |
|
|
|
7582 |
|
|
/* Data structure containing information about directories with source
|
7583 |
|
|
files. */
|
7584 |
|
|
struct dir_info
|
7585 |
|
|
{
|
7586 |
|
|
const char *path; /* Path including directory name. */
|
7587 |
|
|
int length; /* Path length. */
|
7588 |
|
|
int prefix; /* Index of directory entry which is a prefix. */
|
7589 |
|
|
int count; /* Number of files in this directory. */
|
7590 |
|
|
int dir_idx; /* Index of directory used as base. */
|
7591 |
|
|
};
|
7592 |
|
|
|
7593 |
|
|
/* Callback function for file_info comparison. We sort by looking at
|
7594 |
|
|
the directories in the path. */
|
7595 |
|
|
|
7596 |
|
|
static int
|
7597 |
|
|
file_info_cmp (const void *p1, const void *p2)
|
7598 |
|
|
{
|
7599 |
|
|
const struct file_info *s1 = p1;
|
7600 |
|
|
const struct file_info *s2 = p2;
|
7601 |
|
|
unsigned char *cp1;
|
7602 |
|
|
unsigned char *cp2;
|
7603 |
|
|
|
7604 |
|
|
/* Take care of file names without directories. We need to make sure that
|
7605 |
|
|
we return consistent values to qsort since some will get confused if
|
7606 |
|
|
we return the same value when identical operands are passed in opposite
|
7607 |
|
|
orders. So if neither has a directory, return 0 and otherwise return
|
7608 |
|
|
1 or -1 depending on which one has the directory. */
|
7609 |
|
|
if ((s1->path == s1->fname || s2->path == s2->fname))
|
7610 |
|
|
return (s2->path == s2->fname) - (s1->path == s1->fname);
|
7611 |
|
|
|
7612 |
|
|
cp1 = (unsigned char *) s1->path;
|
7613 |
|
|
cp2 = (unsigned char *) s2->path;
|
7614 |
|
|
|
7615 |
|
|
while (1)
|
7616 |
|
|
{
|
7617 |
|
|
++cp1;
|
7618 |
|
|
++cp2;
|
7619 |
|
|
/* Reached the end of the first path? If so, handle like above. */
|
7620 |
|
|
if ((cp1 == (unsigned char *) s1->fname)
|
7621 |
|
|
|| (cp2 == (unsigned char *) s2->fname))
|
7622 |
|
|
return ((cp2 == (unsigned char *) s2->fname)
|
7623 |
|
|
- (cp1 == (unsigned char *) s1->fname));
|
7624 |
|
|
|
7625 |
|
|
/* Character of current path component the same? */
|
7626 |
|
|
else if (*cp1 != *cp2)
|
7627 |
|
|
return *cp1 - *cp2;
|
7628 |
|
|
}
|
7629 |
|
|
}
|
7630 |
|
|
|
7631 |
|
|
struct file_name_acquire_data
|
7632 |
|
|
{
|
7633 |
|
|
struct file_info *files;
|
7634 |
|
|
int used_files;
|
7635 |
|
|
int max_files;
|
7636 |
|
|
};
|
7637 |
|
|
|
7638 |
|
|
/* Traversal function for the hash table. */
|
7639 |
|
|
|
7640 |
|
|
static int
|
7641 |
|
|
file_name_acquire (void ** slot, void *data)
|
7642 |
|
|
{
|
7643 |
|
|
struct file_name_acquire_data *fnad = data;
|
7644 |
|
|
struct dwarf_file_data *d = *slot;
|
7645 |
|
|
struct file_info *fi;
|
7646 |
|
|
const char *f;
|
7647 |
|
|
|
7648 |
|
|
gcc_assert (fnad->max_files >= d->emitted_number);
|
7649 |
|
|
|
7650 |
|
|
if (! d->emitted_number)
|
7651 |
|
|
return 1;
|
7652 |
|
|
|
7653 |
|
|
gcc_assert (fnad->max_files != fnad->used_files);
|
7654 |
|
|
|
7655 |
|
|
fi = fnad->files + fnad->used_files++;
|
7656 |
|
|
|
7657 |
|
|
/* Skip all leading "./". */
|
7658 |
|
|
f = d->filename;
|
7659 |
|
|
while (f[0] == '.' && f[1] == '/')
|
7660 |
|
|
f += 2;
|
7661 |
|
|
|
7662 |
|
|
/* Create a new array entry. */
|
7663 |
|
|
fi->path = f;
|
7664 |
|
|
fi->length = strlen (f);
|
7665 |
|
|
fi->file_idx = d;
|
7666 |
|
|
|
7667 |
|
|
/* Search for the file name part. */
|
7668 |
|
|
f = strrchr (f, '/');
|
7669 |
|
|
fi->fname = f == NULL ? fi->path : f + 1;
|
7670 |
|
|
return 1;
|
7671 |
|
|
}
|
7672 |
|
|
|
7673 |
|
|
/* Output the directory table and the file name table. We try to minimize
|
7674 |
|
|
the total amount of memory needed. A heuristic is used to avoid large
|
7675 |
|
|
slowdowns with many input files. */
|
7676 |
|
|
|
7677 |
|
|
static void
|
7678 |
|
|
output_file_names (void)
|
7679 |
|
|
{
|
7680 |
|
|
struct file_name_acquire_data fnad;
|
7681 |
|
|
int numfiles;
|
7682 |
|
|
struct file_info *files;
|
7683 |
|
|
struct dir_info *dirs;
|
7684 |
|
|
int *saved;
|
7685 |
|
|
int *savehere;
|
7686 |
|
|
int *backmap;
|
7687 |
|
|
int ndirs;
|
7688 |
|
|
int idx_offset;
|
7689 |
|
|
int i;
|
7690 |
|
|
int idx;
|
7691 |
|
|
|
7692 |
|
|
if (!last_emitted_file)
|
7693 |
|
|
{
|
7694 |
|
|
dw2_asm_output_data (1, 0, "End directory table");
|
7695 |
|
|
dw2_asm_output_data (1, 0, "End file name table");
|
7696 |
|
|
return;
|
7697 |
|
|
}
|
7698 |
|
|
|
7699 |
|
|
numfiles = last_emitted_file->emitted_number;
|
7700 |
|
|
|
7701 |
|
|
/* Allocate the various arrays we need. */
|
7702 |
|
|
files = alloca (numfiles * sizeof (struct file_info));
|
7703 |
|
|
dirs = alloca (numfiles * sizeof (struct dir_info));
|
7704 |
|
|
|
7705 |
|
|
fnad.files = files;
|
7706 |
|
|
fnad.used_files = 0;
|
7707 |
|
|
fnad.max_files = numfiles;
|
7708 |
|
|
htab_traverse (file_table, file_name_acquire, &fnad);
|
7709 |
|
|
gcc_assert (fnad.used_files == fnad.max_files);
|
7710 |
|
|
|
7711 |
|
|
qsort (files, numfiles, sizeof (files[0]), file_info_cmp);
|
7712 |
|
|
|
7713 |
|
|
/* Find all the different directories used. */
|
7714 |
|
|
dirs[0].path = files[0].path;
|
7715 |
|
|
dirs[0].length = files[0].fname - files[0].path;
|
7716 |
|
|
dirs[0].prefix = -1;
|
7717 |
|
|
dirs[0].count = 1;
|
7718 |
|
|
dirs[0].dir_idx = 0;
|
7719 |
|
|
files[0].dir_idx = 0;
|
7720 |
|
|
ndirs = 1;
|
7721 |
|
|
|
7722 |
|
|
for (i = 1; i < numfiles; i++)
|
7723 |
|
|
if (files[i].fname - files[i].path == dirs[ndirs - 1].length
|
7724 |
|
|
&& memcmp (dirs[ndirs - 1].path, files[i].path,
|
7725 |
|
|
dirs[ndirs - 1].length) == 0)
|
7726 |
|
|
{
|
7727 |
|
|
/* Same directory as last entry. */
|
7728 |
|
|
files[i].dir_idx = ndirs - 1;
|
7729 |
|
|
++dirs[ndirs - 1].count;
|
7730 |
|
|
}
|
7731 |
|
|
else
|
7732 |
|
|
{
|
7733 |
|
|
int j;
|
7734 |
|
|
|
7735 |
|
|
/* This is a new directory. */
|
7736 |
|
|
dirs[ndirs].path = files[i].path;
|
7737 |
|
|
dirs[ndirs].length = files[i].fname - files[i].path;
|
7738 |
|
|
dirs[ndirs].count = 1;
|
7739 |
|
|
dirs[ndirs].dir_idx = ndirs;
|
7740 |
|
|
files[i].dir_idx = ndirs;
|
7741 |
|
|
|
7742 |
|
|
/* Search for a prefix. */
|
7743 |
|
|
dirs[ndirs].prefix = -1;
|
7744 |
|
|
for (j = 0; j < ndirs; j++)
|
7745 |
|
|
if (dirs[j].length < dirs[ndirs].length
|
7746 |
|
|
&& dirs[j].length > 1
|
7747 |
|
|
&& (dirs[ndirs].prefix == -1
|
7748 |
|
|
|| dirs[j].length > dirs[dirs[ndirs].prefix].length)
|
7749 |
|
|
&& memcmp (dirs[j].path, dirs[ndirs].path, dirs[j].length) == 0)
|
7750 |
|
|
dirs[ndirs].prefix = j;
|
7751 |
|
|
|
7752 |
|
|
++ndirs;
|
7753 |
|
|
}
|
7754 |
|
|
|
7755 |
|
|
/* Now to the actual work. We have to find a subset of the directories which
|
7756 |
|
|
allow expressing the file name using references to the directory table
|
7757 |
|
|
with the least amount of characters. We do not do an exhaustive search
|
7758 |
|
|
where we would have to check out every combination of every single
|
7759 |
|
|
possible prefix. Instead we use a heuristic which provides nearly optimal
|
7760 |
|
|
results in most cases and never is much off. */
|
7761 |
|
|
saved = alloca (ndirs * sizeof (int));
|
7762 |
|
|
savehere = alloca (ndirs * sizeof (int));
|
7763 |
|
|
|
7764 |
|
|
memset (saved, '\0', ndirs * sizeof (saved[0]));
|
7765 |
|
|
for (i = 0; i < ndirs; i++)
|
7766 |
|
|
{
|
7767 |
|
|
int j;
|
7768 |
|
|
int total;
|
7769 |
|
|
|
7770 |
|
|
/* We can always save some space for the current directory. But this
|
7771 |
|
|
does not mean it will be enough to justify adding the directory. */
|
7772 |
|
|
savehere[i] = dirs[i].length;
|
7773 |
|
|
total = (savehere[i] - saved[i]) * dirs[i].count;
|
7774 |
|
|
|
7775 |
|
|
for (j = i + 1; j < ndirs; j++)
|
7776 |
|
|
{
|
7777 |
|
|
savehere[j] = 0;
|
7778 |
|
|
if (saved[j] < dirs[i].length)
|
7779 |
|
|
{
|
7780 |
|
|
/* Determine whether the dirs[i] path is a prefix of the
|
7781 |
|
|
dirs[j] path. */
|
7782 |
|
|
int k;
|
7783 |
|
|
|
7784 |
|
|
k = dirs[j].prefix;
|
7785 |
|
|
while (k != -1 && k != (int) i)
|
7786 |
|
|
k = dirs[k].prefix;
|
7787 |
|
|
|
7788 |
|
|
if (k == (int) i)
|
7789 |
|
|
{
|
7790 |
|
|
/* Yes it is. We can possibly save some memory by
|
7791 |
|
|
writing the filenames in dirs[j] relative to
|
7792 |
|
|
dirs[i]. */
|
7793 |
|
|
savehere[j] = dirs[i].length;
|
7794 |
|
|
total += (savehere[j] - saved[j]) * dirs[j].count;
|
7795 |
|
|
}
|
7796 |
|
|
}
|
7797 |
|
|
}
|
7798 |
|
|
|
7799 |
|
|
/* Check whether we can save enough to justify adding the dirs[i]
|
7800 |
|
|
directory. */
|
7801 |
|
|
if (total > dirs[i].length + 1)
|
7802 |
|
|
{
|
7803 |
|
|
/* It's worthwhile adding. */
|
7804 |
|
|
for (j = i; j < ndirs; j++)
|
7805 |
|
|
if (savehere[j] > 0)
|
7806 |
|
|
{
|
7807 |
|
|
/* Remember how much we saved for this directory so far. */
|
7808 |
|
|
saved[j] = savehere[j];
|
7809 |
|
|
|
7810 |
|
|
/* Remember the prefix directory. */
|
7811 |
|
|
dirs[j].dir_idx = i;
|
7812 |
|
|
}
|
7813 |
|
|
}
|
7814 |
|
|
}
|
7815 |
|
|
|
7816 |
|
|
/* Emit the directory name table. */
|
7817 |
|
|
idx = 1;
|
7818 |
|
|
idx_offset = dirs[0].length > 0 ? 1 : 0;
|
7819 |
|
|
for (i = 1 - idx_offset; i < ndirs; i++)
|
7820 |
|
|
dw2_asm_output_nstring (dirs[i].path, dirs[i].length - 1,
|
7821 |
|
|
"Directory Entry: 0x%x", i + idx_offset);
|
7822 |
|
|
|
7823 |
|
|
dw2_asm_output_data (1, 0, "End directory table");
|
7824 |
|
|
|
7825 |
|
|
/* We have to emit them in the order of emitted_number since that's
|
7826 |
|
|
used in the debug info generation. To do this efficiently we
|
7827 |
|
|
generate a back-mapping of the indices first. */
|
7828 |
|
|
backmap = alloca (numfiles * sizeof (int));
|
7829 |
|
|
for (i = 0; i < numfiles; i++)
|
7830 |
|
|
backmap[files[i].file_idx->emitted_number - 1] = i;
|
7831 |
|
|
|
7832 |
|
|
/* Now write all the file names. */
|
7833 |
|
|
for (i = 0; i < numfiles; i++)
|
7834 |
|
|
{
|
7835 |
|
|
int file_idx = backmap[i];
|
7836 |
|
|
int dir_idx = dirs[files[file_idx].dir_idx].dir_idx;
|
7837 |
|
|
|
7838 |
|
|
dw2_asm_output_nstring (files[file_idx].path + dirs[dir_idx].length, -1,
|
7839 |
|
|
"File Entry: 0x%x", (unsigned) i + 1);
|
7840 |
|
|
|
7841 |
|
|
/* Include directory index. */
|
7842 |
|
|
dw2_asm_output_data_uleb128 (dir_idx + idx_offset, NULL);
|
7843 |
|
|
|
7844 |
|
|
/* Modification time. */
|
7845 |
|
|
dw2_asm_output_data_uleb128 (0, NULL);
|
7846 |
|
|
|
7847 |
|
|
/* File length in bytes. */
|
7848 |
|
|
dw2_asm_output_data_uleb128 (0, NULL);
|
7849 |
|
|
}
|
7850 |
|
|
|
7851 |
|
|
dw2_asm_output_data (1, 0, "End file name table");
|
7852 |
|
|
}
|
7853 |
|
|
|
7854 |
|
|
|
7855 |
|
|
/* Output the source line number correspondence information. This
|
7856 |
|
|
information goes into the .debug_line section. */
|
7857 |
|
|
|
7858 |
|
|
static void
|
7859 |
|
|
output_line_info (void)
|
7860 |
|
|
{
|
7861 |
|
|
char l1[20], l2[20], p1[20], p2[20];
|
7862 |
|
|
char line_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
7863 |
|
|
char prev_line_label[MAX_ARTIFICIAL_LABEL_BYTES];
|
7864 |
|
|
unsigned opc;
|
7865 |
|
|
unsigned n_op_args;
|
7866 |
|
|
unsigned long lt_index;
|
7867 |
|
|
unsigned long current_line;
|
7868 |
|
|
long line_offset;
|
7869 |
|
|
long line_delta;
|
7870 |
|
|
unsigned long current_file;
|
7871 |
|
|
unsigned long function;
|
7872 |
|
|
|
7873 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0);
|
7874 |
|
|
ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0);
|
7875 |
|
|
ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0);
|
7876 |
|
|
ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, 0);
|
7877 |
|
|
|
7878 |
|
|
if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
|
7879 |
|
|
dw2_asm_output_data (4, 0xffffffff,
|
7880 |
|
|
"Initial length escape value indicating 64-bit DWARF extension");
|
7881 |
|
|
dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
|
7882 |
|
|
"Length of Source Line Info");
|
7883 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l1);
|
7884 |
|
|
|
7885 |
|
|
dw2_asm_output_data (2, DWARF_VERSION, "DWARF Version");
|
7886 |
|
|
dw2_asm_output_delta (DWARF_OFFSET_SIZE, p2, p1, "Prolog Length");
|
7887 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, p1);
|
7888 |
|
|
|
7889 |
|
|
/* Define the architecture-dependent minimum instruction length (in
|
7890 |
|
|
bytes). In this implementation of DWARF, this field is used for
|
7891 |
|
|
information purposes only. Since GCC generates assembly language,
|
7892 |
|
|
we have no a priori knowledge of how many instruction bytes are
|
7893 |
|
|
generated for each source line, and therefore can use only the
|
7894 |
|
|
DW_LNE_set_address and DW_LNS_fixed_advance_pc line information
|
7895 |
|
|
commands. Accordingly, we fix this as `1', which is "correct
|
7896 |
|
|
enough" for all architectures, and don't let the target override. */
|
7897 |
|
|
dw2_asm_output_data (1, 1,
|
7898 |
|
|
"Minimum Instruction Length");
|
7899 |
|
|
|
7900 |
|
|
dw2_asm_output_data (1, DWARF_LINE_DEFAULT_IS_STMT_START,
|
7901 |
|
|
"Default is_stmt_start flag");
|
7902 |
|
|
dw2_asm_output_data (1, DWARF_LINE_BASE,
|
7903 |
|
|
"Line Base Value (Special Opcodes)");
|
7904 |
|
|
dw2_asm_output_data (1, DWARF_LINE_RANGE,
|
7905 |
|
|
"Line Range Value (Special Opcodes)");
|
7906 |
|
|
dw2_asm_output_data (1, DWARF_LINE_OPCODE_BASE,
|
7907 |
|
|
"Special Opcode Base");
|
7908 |
|
|
|
7909 |
|
|
for (opc = 1; opc < DWARF_LINE_OPCODE_BASE; opc++)
|
7910 |
|
|
{
|
7911 |
|
|
switch (opc)
|
7912 |
|
|
{
|
7913 |
|
|
case DW_LNS_advance_pc:
|
7914 |
|
|
case DW_LNS_advance_line:
|
7915 |
|
|
case DW_LNS_set_file:
|
7916 |
|
|
case DW_LNS_set_column:
|
7917 |
|
|
case DW_LNS_fixed_advance_pc:
|
7918 |
|
|
n_op_args = 1;
|
7919 |
|
|
break;
|
7920 |
|
|
default:
|
7921 |
|
|
n_op_args = 0;
|
7922 |
|
|
break;
|
7923 |
|
|
}
|
7924 |
|
|
|
7925 |
|
|
dw2_asm_output_data (1, n_op_args, "opcode: 0x%x has %d args",
|
7926 |
|
|
opc, n_op_args);
|
7927 |
|
|
}
|
7928 |
|
|
|
7929 |
|
|
/* Write out the information about the files we use. */
|
7930 |
|
|
output_file_names ();
|
7931 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, p2);
|
7932 |
|
|
|
7933 |
|
|
/* We used to set the address register to the first location in the text
|
7934 |
|
|
section here, but that didn't accomplish anything since we already
|
7935 |
|
|
have a line note for the opening brace of the first function. */
|
7936 |
|
|
|
7937 |
|
|
/* Generate the line number to PC correspondence table, encoded as
|
7938 |
|
|
a series of state machine operations. */
|
7939 |
|
|
current_file = 1;
|
7940 |
|
|
current_line = 1;
|
7941 |
|
|
|
7942 |
|
|
if (cfun && in_cold_section_p)
|
7943 |
|
|
strcpy (prev_line_label, cfun->cold_section_label);
|
7944 |
|
|
else
|
7945 |
|
|
strcpy (prev_line_label, text_section_label);
|
7946 |
|
|
for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
|
7947 |
|
|
{
|
7948 |
|
|
dw_line_info_ref line_info = &line_info_table[lt_index];
|
7949 |
|
|
|
7950 |
|
|
#if 0
|
7951 |
|
|
/* Disable this optimization for now; GDB wants to see two line notes
|
7952 |
|
|
at the beginning of a function so it can find the end of the
|
7953 |
|
|
prologue. */
|
7954 |
|
|
|
7955 |
|
|
/* Don't emit anything for redundant notes. Just updating the
|
7956 |
|
|
address doesn't accomplish anything, because we already assume
|
7957 |
|
|
that anything after the last address is this line. */
|
7958 |
|
|
if (line_info->dw_line_num == current_line
|
7959 |
|
|
&& line_info->dw_file_num == current_file)
|
7960 |
|
|
continue;
|
7961 |
|
|
#endif
|
7962 |
|
|
|
7963 |
|
|
/* Emit debug info for the address of the current line.
|
7964 |
|
|
|
7965 |
|
|
Unfortunately, we have little choice here currently, and must always
|
7966 |
|
|
use the most general form. GCC does not know the address delta
|
7967 |
|
|
itself, so we can't use DW_LNS_advance_pc. Many ports do have length
|
7968 |
|
|
attributes which will give an upper bound on the address range. We
|
7969 |
|
|
could perhaps use length attributes to determine when it is safe to
|
7970 |
|
|
use DW_LNS_fixed_advance_pc. */
|
7971 |
|
|
|
7972 |
|
|
ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, lt_index);
|
7973 |
|
|
if (0)
|
7974 |
|
|
{
|
7975 |
|
|
/* This can handle deltas up to 0xffff. This takes 3 bytes. */
|
7976 |
|
|
dw2_asm_output_data (1, DW_LNS_fixed_advance_pc,
|
7977 |
|
|
"DW_LNS_fixed_advance_pc");
|
7978 |
|
|
dw2_asm_output_delta (2, line_label, prev_line_label, NULL);
|
7979 |
|
|
}
|
7980 |
|
|
else
|
7981 |
|
|
{
|
7982 |
|
|
/* This can handle any delta. This takes
|
7983 |
|
|
4+DWARF2_ADDR_SIZE bytes. */
|
7984 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_set_address");
|
7985 |
|
|
dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
|
7986 |
|
|
dw2_asm_output_data (1, DW_LNE_set_address, NULL);
|
7987 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, line_label, NULL);
|
7988 |
|
|
}
|
7989 |
|
|
|
7990 |
|
|
strcpy (prev_line_label, line_label);
|
7991 |
|
|
|
7992 |
|
|
/* Emit debug info for the source file of the current line, if
|
7993 |
|
|
different from the previous line. */
|
7994 |
|
|
if (line_info->dw_file_num != current_file)
|
7995 |
|
|
{
|
7996 |
|
|
current_file = line_info->dw_file_num;
|
7997 |
|
|
dw2_asm_output_data (1, DW_LNS_set_file, "DW_LNS_set_file");
|
7998 |
|
|
dw2_asm_output_data_uleb128 (current_file, "%lu", current_file);
|
7999 |
|
|
}
|
8000 |
|
|
|
8001 |
|
|
/* Emit debug info for the current line number, choosing the encoding
|
8002 |
|
|
that uses the least amount of space. */
|
8003 |
|
|
if (line_info->dw_line_num != current_line)
|
8004 |
|
|
{
|
8005 |
|
|
line_offset = line_info->dw_line_num - current_line;
|
8006 |
|
|
line_delta = line_offset - DWARF_LINE_BASE;
|
8007 |
|
|
current_line = line_info->dw_line_num;
|
8008 |
|
|
if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
|
8009 |
|
|
/* This can handle deltas from -10 to 234, using the current
|
8010 |
|
|
definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE. This
|
8011 |
|
|
takes 1 byte. */
|
8012 |
|
|
dw2_asm_output_data (1, DWARF_LINE_OPCODE_BASE + line_delta,
|
8013 |
|
|
"line %lu", current_line);
|
8014 |
|
|
else
|
8015 |
|
|
{
|
8016 |
|
|
/* This can handle any delta. This takes at least 4 bytes,
|
8017 |
|
|
depending on the value being encoded. */
|
8018 |
|
|
dw2_asm_output_data (1, DW_LNS_advance_line,
|
8019 |
|
|
"advance to line %lu", current_line);
|
8020 |
|
|
dw2_asm_output_data_sleb128 (line_offset, NULL);
|
8021 |
|
|
dw2_asm_output_data (1, DW_LNS_copy, "DW_LNS_copy");
|
8022 |
|
|
}
|
8023 |
|
|
}
|
8024 |
|
|
else
|
8025 |
|
|
/* We still need to start a new row, so output a copy insn. */
|
8026 |
|
|
dw2_asm_output_data (1, DW_LNS_copy, "DW_LNS_copy");
|
8027 |
|
|
}
|
8028 |
|
|
|
8029 |
|
|
/* Emit debug info for the address of the end of the function. */
|
8030 |
|
|
if (0)
|
8031 |
|
|
{
|
8032 |
|
|
dw2_asm_output_data (1, DW_LNS_fixed_advance_pc,
|
8033 |
|
|
"DW_LNS_fixed_advance_pc");
|
8034 |
|
|
dw2_asm_output_delta (2, text_end_label, prev_line_label, NULL);
|
8035 |
|
|
}
|
8036 |
|
|
else
|
8037 |
|
|
{
|
8038 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_set_address");
|
8039 |
|
|
dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
|
8040 |
|
|
dw2_asm_output_data (1, DW_LNE_set_address, NULL);
|
8041 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_end_label, NULL);
|
8042 |
|
|
}
|
8043 |
|
|
|
8044 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_end_sequence");
|
8045 |
|
|
dw2_asm_output_data_uleb128 (1, NULL);
|
8046 |
|
|
dw2_asm_output_data (1, DW_LNE_end_sequence, NULL);
|
8047 |
|
|
|
8048 |
|
|
function = 0;
|
8049 |
|
|
current_file = 1;
|
8050 |
|
|
current_line = 1;
|
8051 |
|
|
for (lt_index = 0; lt_index < separate_line_info_table_in_use;)
|
8052 |
|
|
{
|
8053 |
|
|
dw_separate_line_info_ref line_info
|
8054 |
|
|
= &separate_line_info_table[lt_index];
|
8055 |
|
|
|
8056 |
|
|
#if 0
|
8057 |
|
|
/* Don't emit anything for redundant notes. */
|
8058 |
|
|
if (line_info->dw_line_num == current_line
|
8059 |
|
|
&& line_info->dw_file_num == current_file
|
8060 |
|
|
&& line_info->function == function)
|
8061 |
|
|
goto cont;
|
8062 |
|
|
#endif
|
8063 |
|
|
|
8064 |
|
|
/* Emit debug info for the address of the current line. If this is
|
8065 |
|
|
a new function, or the first line of a function, then we need
|
8066 |
|
|
to handle it differently. */
|
8067 |
|
|
ASM_GENERATE_INTERNAL_LABEL (line_label, SEPARATE_LINE_CODE_LABEL,
|
8068 |
|
|
lt_index);
|
8069 |
|
|
if (function != line_info->function)
|
8070 |
|
|
{
|
8071 |
|
|
function = line_info->function;
|
8072 |
|
|
|
8073 |
|
|
/* Set the address register to the first line in the function. */
|
8074 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_set_address");
|
8075 |
|
|
dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
|
8076 |
|
|
dw2_asm_output_data (1, DW_LNE_set_address, NULL);
|
8077 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, line_label, NULL);
|
8078 |
|
|
}
|
8079 |
|
|
else
|
8080 |
|
|
{
|
8081 |
|
|
/* ??? See the DW_LNS_advance_pc comment above. */
|
8082 |
|
|
if (0)
|
8083 |
|
|
{
|
8084 |
|
|
dw2_asm_output_data (1, DW_LNS_fixed_advance_pc,
|
8085 |
|
|
"DW_LNS_fixed_advance_pc");
|
8086 |
|
|
dw2_asm_output_delta (2, line_label, prev_line_label, NULL);
|
8087 |
|
|
}
|
8088 |
|
|
else
|
8089 |
|
|
{
|
8090 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_set_address");
|
8091 |
|
|
dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
|
8092 |
|
|
dw2_asm_output_data (1, DW_LNE_set_address, NULL);
|
8093 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, line_label, NULL);
|
8094 |
|
|
}
|
8095 |
|
|
}
|
8096 |
|
|
|
8097 |
|
|
strcpy (prev_line_label, line_label);
|
8098 |
|
|
|
8099 |
|
|
/* Emit debug info for the source file of the current line, if
|
8100 |
|
|
different from the previous line. */
|
8101 |
|
|
if (line_info->dw_file_num != current_file)
|
8102 |
|
|
{
|
8103 |
|
|
current_file = line_info->dw_file_num;
|
8104 |
|
|
dw2_asm_output_data (1, DW_LNS_set_file, "DW_LNS_set_file");
|
8105 |
|
|
dw2_asm_output_data_uleb128 (current_file, "%lu", current_file);
|
8106 |
|
|
}
|
8107 |
|
|
|
8108 |
|
|
/* Emit debug info for the current line number, choosing the encoding
|
8109 |
|
|
that uses the least amount of space. */
|
8110 |
|
|
if (line_info->dw_line_num != current_line)
|
8111 |
|
|
{
|
8112 |
|
|
line_offset = line_info->dw_line_num - current_line;
|
8113 |
|
|
line_delta = line_offset - DWARF_LINE_BASE;
|
8114 |
|
|
current_line = line_info->dw_line_num;
|
8115 |
|
|
if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
|
8116 |
|
|
dw2_asm_output_data (1, DWARF_LINE_OPCODE_BASE + line_delta,
|
8117 |
|
|
"line %lu", current_line);
|
8118 |
|
|
else
|
8119 |
|
|
{
|
8120 |
|
|
dw2_asm_output_data (1, DW_LNS_advance_line,
|
8121 |
|
|
"advance to line %lu", current_line);
|
8122 |
|
|
dw2_asm_output_data_sleb128 (line_offset, NULL);
|
8123 |
|
|
dw2_asm_output_data (1, DW_LNS_copy, "DW_LNS_copy");
|
8124 |
|
|
}
|
8125 |
|
|
}
|
8126 |
|
|
else
|
8127 |
|
|
dw2_asm_output_data (1, DW_LNS_copy, "DW_LNS_copy");
|
8128 |
|
|
|
8129 |
|
|
#if 0
|
8130 |
|
|
cont:
|
8131 |
|
|
#endif
|
8132 |
|
|
|
8133 |
|
|
lt_index++;
|
8134 |
|
|
|
8135 |
|
|
/* If we're done with a function, end its sequence. */
|
8136 |
|
|
if (lt_index == separate_line_info_table_in_use
|
8137 |
|
|
|| separate_line_info_table[lt_index].function != function)
|
8138 |
|
|
{
|
8139 |
|
|
current_file = 1;
|
8140 |
|
|
current_line = 1;
|
8141 |
|
|
|
8142 |
|
|
/* Emit debug info for the address of the end of the function. */
|
8143 |
|
|
ASM_GENERATE_INTERNAL_LABEL (line_label, FUNC_END_LABEL, function);
|
8144 |
|
|
if (0)
|
8145 |
|
|
{
|
8146 |
|
|
dw2_asm_output_data (1, DW_LNS_fixed_advance_pc,
|
8147 |
|
|
"DW_LNS_fixed_advance_pc");
|
8148 |
|
|
dw2_asm_output_delta (2, line_label, prev_line_label, NULL);
|
8149 |
|
|
}
|
8150 |
|
|
else
|
8151 |
|
|
{
|
8152 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_set_address");
|
8153 |
|
|
dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
|
8154 |
|
|
dw2_asm_output_data (1, DW_LNE_set_address, NULL);
|
8155 |
|
|
dw2_asm_output_addr (DWARF2_ADDR_SIZE, line_label, NULL);
|
8156 |
|
|
}
|
8157 |
|
|
|
8158 |
|
|
/* Output the marker for the end of this sequence. */
|
8159 |
|
|
dw2_asm_output_data (1, 0, "DW_LNE_end_sequence");
|
8160 |
|
|
dw2_asm_output_data_uleb128 (1, NULL);
|
8161 |
|
|
dw2_asm_output_data (1, DW_LNE_end_sequence, NULL);
|
8162 |
|
|
}
|
8163 |
|
|
}
|
8164 |
|
|
|
8165 |
|
|
/* Output the marker for the end of the line number info. */
|
8166 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, l2);
|
8167 |
|
|
}
|
8168 |
|
|
|
8169 |
|
|
/* Given a pointer to a tree node for some base type, return a pointer to
|
8170 |
|
|
a DIE that describes the given type.
|
8171 |
|
|
|
8172 |
|
|
This routine must only be called for GCC type nodes that correspond to
|
8173 |
|
|
Dwarf base (fundamental) types. */
|
8174 |
|
|
|
8175 |
|
|
static dw_die_ref
|
8176 |
|
|
base_type_die (tree type)
|
8177 |
|
|
{
|
8178 |
|
|
dw_die_ref base_type_result;
|
8179 |
|
|
enum dwarf_type encoding;
|
8180 |
|
|
|
8181 |
|
|
if (TREE_CODE (type) == ERROR_MARK || TREE_CODE (type) == VOID_TYPE)
|
8182 |
|
|
return 0;
|
8183 |
|
|
|
8184 |
|
|
switch (TREE_CODE (type))
|
8185 |
|
|
{
|
8186 |
|
|
case INTEGER_TYPE:
|
8187 |
|
|
if (TYPE_STRING_FLAG (type))
|
8188 |
|
|
{
|
8189 |
|
|
if (TYPE_UNSIGNED (type))
|
8190 |
|
|
encoding = DW_ATE_unsigned_char;
|
8191 |
|
|
else
|
8192 |
|
|
encoding = DW_ATE_signed_char;
|
8193 |
|
|
}
|
8194 |
|
|
else if (TYPE_UNSIGNED (type))
|
8195 |
|
|
encoding = DW_ATE_unsigned;
|
8196 |
|
|
else
|
8197 |
|
|
encoding = DW_ATE_signed;
|
8198 |
|
|
break;
|
8199 |
|
|
|
8200 |
|
|
case REAL_TYPE:
|
8201 |
|
|
if (DECIMAL_FLOAT_MODE_P (TYPE_MODE (type)))
|
8202 |
|
|
encoding = DW_ATE_decimal_float;
|
8203 |
|
|
else
|
8204 |
|
|
encoding = DW_ATE_float;
|
8205 |
|
|
break;
|
8206 |
|
|
|
8207 |
|
|
/* Dwarf2 doesn't know anything about complex ints, so use
|
8208 |
|
|
a user defined type for it. */
|
8209 |
|
|
case COMPLEX_TYPE:
|
8210 |
|
|
if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
|
8211 |
|
|
encoding = DW_ATE_complex_float;
|
8212 |
|
|
else
|
8213 |
|
|
encoding = DW_ATE_lo_user;
|
8214 |
|
|
break;
|
8215 |
|
|
|
8216 |
|
|
case BOOLEAN_TYPE:
|
8217 |
|
|
/* GNU FORTRAN/Ada/C++ BOOLEAN type. */
|
8218 |
|
|
encoding = DW_ATE_boolean;
|
8219 |
|
|
break;
|
8220 |
|
|
|
8221 |
|
|
default:
|
8222 |
|
|
/* No other TREE_CODEs are Dwarf fundamental types. */
|
8223 |
|
|
gcc_unreachable ();
|
8224 |
|
|
}
|
8225 |
|
|
|
8226 |
|
|
base_type_result = new_die (DW_TAG_base_type, comp_unit_die, type);
|
8227 |
|
|
|
8228 |
|
|
/* This probably indicates a bug. */
|
8229 |
|
|
if (! TYPE_NAME (type))
|
8230 |
|
|
add_name_attribute (base_type_result, "__unknown__");
|
8231 |
|
|
|
8232 |
|
|
add_AT_unsigned (base_type_result, DW_AT_byte_size,
|
8233 |
|
|
int_size_in_bytes (type));
|
8234 |
|
|
add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
|
8235 |
|
|
|
8236 |
|
|
return base_type_result;
|
8237 |
|
|
}
|
8238 |
|
|
|
8239 |
|
|
/* Given a pointer to an arbitrary ..._TYPE tree node, return a pointer to
|
8240 |
|
|
the Dwarf "root" type for the given input type. The Dwarf "root" type of
|
8241 |
|
|
a given type is generally the same as the given type, except that if the
|
8242 |
|
|
given type is a pointer or reference type, then the root type of the given
|
8243 |
|
|
type is the root type of the "basis" type for the pointer or reference
|
8244 |
|
|
type. (This definition of the "root" type is recursive.) Also, the root
|
8245 |
|
|
type of a `const' qualified type or a `volatile' qualified type is the
|
8246 |
|
|
root type of the given type without the qualifiers. */
|
8247 |
|
|
|
8248 |
|
|
static tree
|
8249 |
|
|
root_type (tree type)
|
8250 |
|
|
{
|
8251 |
|
|
if (TREE_CODE (type) == ERROR_MARK)
|
8252 |
|
|
return error_mark_node;
|
8253 |
|
|
|
8254 |
|
|
switch (TREE_CODE (type))
|
8255 |
|
|
{
|
8256 |
|
|
case ERROR_MARK:
|
8257 |
|
|
return error_mark_node;
|
8258 |
|
|
|
8259 |
|
|
case POINTER_TYPE:
|
8260 |
|
|
case REFERENCE_TYPE:
|
8261 |
|
|
return type_main_variant (root_type (TREE_TYPE (type)));
|
8262 |
|
|
|
8263 |
|
|
default:
|
8264 |
|
|
return type_main_variant (type);
|
8265 |
|
|
}
|
8266 |
|
|
}
|
8267 |
|
|
|
8268 |
|
|
/* Given a pointer to an arbitrary ..._TYPE tree node, return nonzero if the
|
8269 |
|
|
given input type is a Dwarf "fundamental" type. Otherwise return null. */
|
8270 |
|
|
|
8271 |
|
|
static inline int
|
8272 |
|
|
is_base_type (tree type)
|
8273 |
|
|
{
|
8274 |
|
|
switch (TREE_CODE (type))
|
8275 |
|
|
{
|
8276 |
|
|
case ERROR_MARK:
|
8277 |
|
|
case VOID_TYPE:
|
8278 |
|
|
case INTEGER_TYPE:
|
8279 |
|
|
case REAL_TYPE:
|
8280 |
|
|
case COMPLEX_TYPE:
|
8281 |
|
|
case BOOLEAN_TYPE:
|
8282 |
|
|
return 1;
|
8283 |
|
|
|
8284 |
|
|
case ARRAY_TYPE:
|
8285 |
|
|
case RECORD_TYPE:
|
8286 |
|
|
case UNION_TYPE:
|
8287 |
|
|
case QUAL_UNION_TYPE:
|
8288 |
|
|
case ENUMERAL_TYPE:
|
8289 |
|
|
case FUNCTION_TYPE:
|
8290 |
|
|
case METHOD_TYPE:
|
8291 |
|
|
case POINTER_TYPE:
|
8292 |
|
|
case REFERENCE_TYPE:
|
8293 |
|
|
case OFFSET_TYPE:
|
8294 |
|
|
case LANG_TYPE:
|
8295 |
|
|
case VECTOR_TYPE:
|
8296 |
|
|
return 0;
|
8297 |
|
|
|
8298 |
|
|
default:
|
8299 |
|
|
gcc_unreachable ();
|
8300 |
|
|
}
|
8301 |
|
|
|
8302 |
|
|
return 0;
|
8303 |
|
|
}
|
8304 |
|
|
|
8305 |
|
|
/* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
|
8306 |
|
|
node, return the size in bits for the type if it is a constant, or else
|
8307 |
|
|
return the alignment for the type if the type's size is not constant, or
|
8308 |
|
|
else return BITS_PER_WORD if the type actually turns out to be an
|
8309 |
|
|
ERROR_MARK node. */
|
8310 |
|
|
|
8311 |
|
|
static inline unsigned HOST_WIDE_INT
|
8312 |
|
|
simple_type_size_in_bits (tree type)
|
8313 |
|
|
{
|
8314 |
|
|
if (TREE_CODE (type) == ERROR_MARK)
|
8315 |
|
|
return BITS_PER_WORD;
|
8316 |
|
|
else if (TYPE_SIZE (type) == NULL_TREE)
|
8317 |
|
|
return 0;
|
8318 |
|
|
else if (host_integerp (TYPE_SIZE (type), 1))
|
8319 |
|
|
return tree_low_cst (TYPE_SIZE (type), 1);
|
8320 |
|
|
else
|
8321 |
|
|
return TYPE_ALIGN (type);
|
8322 |
|
|
}
|
8323 |
|
|
|
8324 |
|
|
/* Return true if the debug information for the given type should be
|
8325 |
|
|
emitted as a subrange type. */
|
8326 |
|
|
|
8327 |
|
|
static inline bool
|
8328 |
|
|
is_subrange_type (tree type)
|
8329 |
|
|
{
|
8330 |
|
|
tree subtype = TREE_TYPE (type);
|
8331 |
|
|
|
8332 |
|
|
/* Subrange types are identified by the fact that they are integer
|
8333 |
|
|
types, and that they have a subtype which is either an integer type
|
8334 |
|
|
or an enumeral type. */
|
8335 |
|
|
|
8336 |
|
|
if (TREE_CODE (type) != INTEGER_TYPE
|
8337 |
|
|
|| subtype == NULL_TREE)
|
8338 |
|
|
return false;
|
8339 |
|
|
|
8340 |
|
|
if (TREE_CODE (subtype) != INTEGER_TYPE
|
8341 |
|
|
&& TREE_CODE (subtype) != ENUMERAL_TYPE)
|
8342 |
|
|
return false;
|
8343 |
|
|
|
8344 |
|
|
if (TREE_CODE (type) == TREE_CODE (subtype)
|
8345 |
|
|
&& int_size_in_bytes (type) == int_size_in_bytes (subtype)
|
8346 |
|
|
&& TYPE_MIN_VALUE (type) != NULL
|
8347 |
|
|
&& TYPE_MIN_VALUE (subtype) != NULL
|
8348 |
|
|
&& tree_int_cst_equal (TYPE_MIN_VALUE (type), TYPE_MIN_VALUE (subtype))
|
8349 |
|
|
&& TYPE_MAX_VALUE (type) != NULL
|
8350 |
|
|
&& TYPE_MAX_VALUE (subtype) != NULL
|
8351 |
|
|
&& tree_int_cst_equal (TYPE_MAX_VALUE (type), TYPE_MAX_VALUE (subtype)))
|
8352 |
|
|
{
|
8353 |
|
|
/* The type and its subtype have the same representation. If in
|
8354 |
|
|
addition the two types also have the same name, then the given
|
8355 |
|
|
type is not a subrange type, but rather a plain base type. */
|
8356 |
|
|
/* FIXME: brobecker/2004-03-22:
|
8357 |
|
|
Sizetype INTEGER_CSTs nodes are canonicalized. It should
|
8358 |
|
|
therefore be sufficient to check the TYPE_SIZE node pointers
|
8359 |
|
|
rather than checking the actual size. Unfortunately, we have
|
8360 |
|
|
found some cases, such as in the Ada "integer" type, where
|
8361 |
|
|
this is not the case. Until this problem is solved, we need to
|
8362 |
|
|
keep checking the actual size. */
|
8363 |
|
|
tree type_name = TYPE_NAME (type);
|
8364 |
|
|
tree subtype_name = TYPE_NAME (subtype);
|
8365 |
|
|
|
8366 |
|
|
if (type_name != NULL && TREE_CODE (type_name) == TYPE_DECL)
|
8367 |
|
|
type_name = DECL_NAME (type_name);
|
8368 |
|
|
|
8369 |
|
|
if (subtype_name != NULL && TREE_CODE (subtype_name) == TYPE_DECL)
|
8370 |
|
|
subtype_name = DECL_NAME (subtype_name);
|
8371 |
|
|
|
8372 |
|
|
if (type_name == subtype_name)
|
8373 |
|
|
return false;
|
8374 |
|
|
}
|
8375 |
|
|
|
8376 |
|
|
return true;
|
8377 |
|
|
}
|
8378 |
|
|
|
8379 |
|
|
/* Given a pointer to a tree node for a subrange type, return a pointer
|
8380 |
|
|
to a DIE that describes the given type. */
|
8381 |
|
|
|
8382 |
|
|
static dw_die_ref
|
8383 |
|
|
subrange_type_die (tree type, dw_die_ref context_die)
|
8384 |
|
|
{
|
8385 |
|
|
dw_die_ref subrange_die;
|
8386 |
|
|
const HOST_WIDE_INT size_in_bytes = int_size_in_bytes (type);
|
8387 |
|
|
|
8388 |
|
|
if (context_die == NULL)
|
8389 |
|
|
context_die = comp_unit_die;
|
8390 |
|
|
|
8391 |
|
|
subrange_die = new_die (DW_TAG_subrange_type, context_die, type);
|
8392 |
|
|
|
8393 |
|
|
if (int_size_in_bytes (TREE_TYPE (type)) != size_in_bytes)
|
8394 |
|
|
{
|
8395 |
|
|
/* The size of the subrange type and its base type do not match,
|
8396 |
|
|
so we need to generate a size attribute for the subrange type. */
|
8397 |
|
|
add_AT_unsigned (subrange_die, DW_AT_byte_size, size_in_bytes);
|
8398 |
|
|
}
|
8399 |
|
|
|
8400 |
|
|
if (TYPE_MIN_VALUE (type) != NULL)
|
8401 |
|
|
add_bound_info (subrange_die, DW_AT_lower_bound,
|
8402 |
|
|
TYPE_MIN_VALUE (type));
|
8403 |
|
|
if (TYPE_MAX_VALUE (type) != NULL)
|
8404 |
|
|
add_bound_info (subrange_die, DW_AT_upper_bound,
|
8405 |
|
|
TYPE_MAX_VALUE (type));
|
8406 |
|
|
|
8407 |
|
|
return subrange_die;
|
8408 |
|
|
}
|
8409 |
|
|
|
8410 |
|
|
/* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
|
8411 |
|
|
entry that chains various modifiers in front of the given type. */
|
8412 |
|
|
|
8413 |
|
|
static dw_die_ref
|
8414 |
|
|
modified_type_die (tree type, int is_const_type, int is_volatile_type,
|
8415 |
|
|
dw_die_ref context_die)
|
8416 |
|
|
{
|
8417 |
|
|
enum tree_code code = TREE_CODE (type);
|
8418 |
|
|
dw_die_ref mod_type_die;
|
8419 |
|
|
dw_die_ref sub_die = NULL;
|
8420 |
|
|
tree item_type = NULL;
|
8421 |
|
|
tree qualified_type;
|
8422 |
|
|
tree name;
|
8423 |
|
|
|
8424 |
|
|
if (code == ERROR_MARK)
|
8425 |
|
|
return NULL;
|
8426 |
|
|
|
8427 |
|
|
/* See if we already have the appropriately qualified variant of
|
8428 |
|
|
this type. */
|
8429 |
|
|
qualified_type
|
8430 |
|
|
= get_qualified_type (type,
|
8431 |
|
|
((is_const_type ? TYPE_QUAL_CONST : 0)
|
8432 |
|
|
| (is_volatile_type ? TYPE_QUAL_VOLATILE : 0)));
|
8433 |
|
|
|
8434 |
|
|
/* If we do, then we can just use its DIE, if it exists. */
|
8435 |
|
|
if (qualified_type)
|
8436 |
|
|
{
|
8437 |
|
|
mod_type_die = lookup_type_die (qualified_type);
|
8438 |
|
|
if (mod_type_die)
|
8439 |
|
|
return mod_type_die;
|
8440 |
|
|
}
|
8441 |
|
|
|
8442 |
|
|
name = qualified_type ? TYPE_NAME (qualified_type) : NULL;
|
8443 |
|
|
|
8444 |
|
|
/* Handle C typedef types. */
|
8445 |
|
|
if (name && TREE_CODE (name) == TYPE_DECL && DECL_ORIGINAL_TYPE (name))
|
8446 |
|
|
{
|
8447 |
|
|
tree dtype = TREE_TYPE (name);
|
8448 |
|
|
|
8449 |
|
|
if (qualified_type == dtype)
|
8450 |
|
|
{
|
8451 |
|
|
/* For a named type, use the typedef. */
|
8452 |
|
|
gen_type_die (qualified_type, context_die);
|
8453 |
|
|
return lookup_type_die (qualified_type);
|
8454 |
|
|
}
|
8455 |
|
|
else if (is_const_type < TYPE_READONLY (dtype)
|
8456 |
|
|
|| is_volatile_type < TYPE_VOLATILE (dtype)
|
8457 |
|
|
|| (is_const_type <= TYPE_READONLY (dtype)
|
8458 |
|
|
&& is_volatile_type <= TYPE_VOLATILE (dtype)
|
8459 |
|
|
&& DECL_ORIGINAL_TYPE (name) != type))
|
8460 |
|
|
/* cv-unqualified version of named type. Just use the unnamed
|
8461 |
|
|
type to which it refers. */
|
8462 |
|
|
return modified_type_die (DECL_ORIGINAL_TYPE (name),
|
8463 |
|
|
is_const_type, is_volatile_type,
|
8464 |
|
|
context_die);
|
8465 |
|
|
/* Else cv-qualified version of named type; fall through. */
|
8466 |
|
|
}
|
8467 |
|
|
|
8468 |
|
|
if (is_const_type)
|
8469 |
|
|
{
|
8470 |
|
|
mod_type_die = new_die (DW_TAG_const_type, comp_unit_die, type);
|
8471 |
|
|
sub_die = modified_type_die (type, 0, is_volatile_type, context_die);
|
8472 |
|
|
}
|
8473 |
|
|
else if (is_volatile_type)
|
8474 |
|
|
{
|
8475 |
|
|
mod_type_die = new_die (DW_TAG_volatile_type, comp_unit_die, type);
|
8476 |
|
|
sub_die = modified_type_die (type, 0, 0, context_die);
|
8477 |
|
|
}
|
8478 |
|
|
else if (code == POINTER_TYPE)
|
8479 |
|
|
{
|
8480 |
|
|
mod_type_die = new_die (DW_TAG_pointer_type, comp_unit_die, type);
|
8481 |
|
|
add_AT_unsigned (mod_type_die, DW_AT_byte_size,
|
8482 |
|
|
simple_type_size_in_bits (type) / BITS_PER_UNIT);
|
8483 |
|
|
item_type = TREE_TYPE (type);
|
8484 |
|
|
}
|
8485 |
|
|
else if (code == REFERENCE_TYPE)
|
8486 |
|
|
{
|
8487 |
|
|
mod_type_die = new_die (DW_TAG_reference_type, comp_unit_die, type);
|
8488 |
|
|
add_AT_unsigned (mod_type_die, DW_AT_byte_size,
|
8489 |
|
|
simple_type_size_in_bits (type) / BITS_PER_UNIT);
|
8490 |
|
|
item_type = TREE_TYPE (type);
|
8491 |
|
|
}
|
8492 |
|
|
else if (is_subrange_type (type))
|
8493 |
|
|
{
|
8494 |
|
|
mod_type_die = subrange_type_die (type, context_die);
|
8495 |
|
|
item_type = TREE_TYPE (type);
|
8496 |
|
|
}
|
8497 |
|
|
else if (is_base_type (type))
|
8498 |
|
|
mod_type_die = base_type_die (type);
|
8499 |
|
|
else
|
8500 |
|
|
{
|
8501 |
|
|
gen_type_die (type, context_die);
|
8502 |
|
|
|
8503 |
|
|
/* We have to get the type_main_variant here (and pass that to the
|
8504 |
|
|
`lookup_type_die' routine) because the ..._TYPE node we have
|
8505 |
|
|
might simply be a *copy* of some original type node (where the
|
8506 |
|
|
copy was created to help us keep track of typedef names) and
|
8507 |
|
|
that copy might have a different TYPE_UID from the original
|
8508 |
|
|
..._TYPE node. */
|
8509 |
|
|
if (TREE_CODE (type) != VECTOR_TYPE)
|
8510 |
|
|
return lookup_type_die (type_main_variant (type));
|
8511 |
|
|
else
|
8512 |
|
|
/* Vectors have the debugging information in the type,
|
8513 |
|
|
not the main variant. */
|
8514 |
|
|
return lookup_type_die (type);
|
8515 |
|
|
}
|
8516 |
|
|
|
8517 |
|
|
/* Builtin types don't have a DECL_ORIGINAL_TYPE. For those,
|
8518 |
|
|
don't output a DW_TAG_typedef, since there isn't one in the
|
8519 |
|
|
user's program; just attach a DW_AT_name to the type. */
|
8520 |
|
|
if (name
|
8521 |
|
|
&& (TREE_CODE (name) != TYPE_DECL
|
8522 |
|
|
|| (TREE_TYPE (name) == qualified_type && DECL_NAME (name))))
|
8523 |
|
|
{
|
8524 |
|
|
if (TREE_CODE (name) == TYPE_DECL)
|
8525 |
|
|
/* Could just call add_name_and_src_coords_attributes here,
|
8526 |
|
|
but since this is a builtin type it doesn't have any
|
8527 |
|
|
useful source coordinates anyway. */
|
8528 |
|
|
name = DECL_NAME (name);
|
8529 |
|
|
add_name_attribute (mod_type_die, IDENTIFIER_POINTER (name));
|
8530 |
|
|
}
|
8531 |
|
|
|
8532 |
|
|
if (qualified_type)
|
8533 |
|
|
equate_type_number_to_die (qualified_type, mod_type_die);
|
8534 |
|
|
|
8535 |
|
|
if (item_type)
|
8536 |
|
|
/* We must do this after the equate_type_number_to_die call, in case
|
8537 |
|
|
this is a recursive type. This ensures that the modified_type_die
|
8538 |
|
|
recursion will terminate even if the type is recursive. Recursive
|
8539 |
|
|
types are possible in Ada. */
|
8540 |
|
|
sub_die = modified_type_die (item_type,
|
8541 |
|
|
TYPE_READONLY (item_type),
|
8542 |
|
|
TYPE_VOLATILE (item_type),
|
8543 |
|
|
context_die);
|
8544 |
|
|
|
8545 |
|
|
if (sub_die != NULL)
|
8546 |
|
|
add_AT_die_ref (mod_type_die, DW_AT_type, sub_die);
|
8547 |
|
|
|
8548 |
|
|
return mod_type_die;
|
8549 |
|
|
}
|
8550 |
|
|
|
8551 |
|
|
/* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is
|
8552 |
|
|
an enumerated type. */
|
8553 |
|
|
|
8554 |
|
|
static inline int
|
8555 |
|
|
type_is_enum (tree type)
|
8556 |
|
|
{
|
8557 |
|
|
return TREE_CODE (type) == ENUMERAL_TYPE;
|
8558 |
|
|
}
|
8559 |
|
|
|
8560 |
|
|
/* Return the DBX register number described by a given RTL node. */
|
8561 |
|
|
|
8562 |
|
|
static unsigned int
|
8563 |
|
|
dbx_reg_number (rtx rtl)
|
8564 |
|
|
{
|
8565 |
|
|
unsigned regno = REGNO (rtl);
|
8566 |
|
|
|
8567 |
|
|
gcc_assert (regno < FIRST_PSEUDO_REGISTER);
|
8568 |
|
|
|
8569 |
|
|
#ifdef LEAF_REG_REMAP
|
8570 |
|
|
if (current_function_uses_only_leaf_regs)
|
8571 |
|
|
{
|
8572 |
|
|
int leaf_reg = LEAF_REG_REMAP (regno);
|
8573 |
|
|
if (leaf_reg != -1)
|
8574 |
|
|
regno = (unsigned) leaf_reg;
|
8575 |
|
|
}
|
8576 |
|
|
#endif
|
8577 |
|
|
|
8578 |
|
|
return DBX_REGISTER_NUMBER (regno);
|
8579 |
|
|
}
|
8580 |
|
|
|
8581 |
|
|
/* Optionally add a DW_OP_piece term to a location description expression.
|
8582 |
|
|
DW_OP_piece is only added if the location description expression already
|
8583 |
|
|
doesn't end with DW_OP_piece. */
|
8584 |
|
|
|
8585 |
|
|
static void
|
8586 |
|
|
add_loc_descr_op_piece (dw_loc_descr_ref *list_head, int size)
|
8587 |
|
|
{
|
8588 |
|
|
dw_loc_descr_ref loc;
|
8589 |
|
|
|
8590 |
|
|
if (*list_head != NULL)
|
8591 |
|
|
{
|
8592 |
|
|
/* Find the end of the chain. */
|
8593 |
|
|
for (loc = *list_head; loc->dw_loc_next != NULL; loc = loc->dw_loc_next)
|
8594 |
|
|
;
|
8595 |
|
|
|
8596 |
|
|
if (loc->dw_loc_opc != DW_OP_piece)
|
8597 |
|
|
loc->dw_loc_next = new_loc_descr (DW_OP_piece, size, 0);
|
8598 |
|
|
}
|
8599 |
|
|
}
|
8600 |
|
|
|
8601 |
|
|
/* Return a location descriptor that designates a machine register or
|
8602 |
|
|
zero if there is none. */
|
8603 |
|
|
|
8604 |
|
|
static dw_loc_descr_ref
|
8605 |
|
|
reg_loc_descriptor (rtx rtl)
|
8606 |
|
|
{
|
8607 |
|
|
rtx regs;
|
8608 |
|
|
|
8609 |
|
|
if (REGNO (rtl) >= FIRST_PSEUDO_REGISTER)
|
8610 |
|
|
return 0;
|
8611 |
|
|
|
8612 |
|
|
regs = targetm.dwarf_register_span (rtl);
|
8613 |
|
|
|
8614 |
|
|
if (hard_regno_nregs[REGNO (rtl)][GET_MODE (rtl)] > 1 || regs)
|
8615 |
|
|
return multiple_reg_loc_descriptor (rtl, regs);
|
8616 |
|
|
else
|
8617 |
|
|
return one_reg_loc_descriptor (dbx_reg_number (rtl));
|
8618 |
|
|
}
|
8619 |
|
|
|
8620 |
|
|
/* Return a location descriptor that designates a machine register for
|
8621 |
|
|
a given hard register number. */
|
8622 |
|
|
|
8623 |
|
|
static dw_loc_descr_ref
|
8624 |
|
|
one_reg_loc_descriptor (unsigned int regno)
|
8625 |
|
|
{
|
8626 |
|
|
if (regno <= 31)
|
8627 |
|
|
return new_loc_descr (DW_OP_reg0 + regno, 0, 0);
|
8628 |
|
|
else
|
8629 |
|
|
return new_loc_descr (DW_OP_regx, regno, 0);
|
8630 |
|
|
}
|
8631 |
|
|
|
8632 |
|
|
/* Given an RTL of a register, return a location descriptor that
|
8633 |
|
|
designates a value that spans more than one register. */
|
8634 |
|
|
|
8635 |
|
|
static dw_loc_descr_ref
|
8636 |
|
|
multiple_reg_loc_descriptor (rtx rtl, rtx regs)
|
8637 |
|
|
{
|
8638 |
|
|
int nregs, size, i;
|
8639 |
|
|
unsigned reg;
|
8640 |
|
|
dw_loc_descr_ref loc_result = NULL;
|
8641 |
|
|
|
8642 |
|
|
reg = REGNO (rtl);
|
8643 |
|
|
#ifdef LEAF_REG_REMAP
|
8644 |
|
|
if (current_function_uses_only_leaf_regs)
|
8645 |
|
|
{
|
8646 |
|
|
int leaf_reg = LEAF_REG_REMAP (reg);
|
8647 |
|
|
if (leaf_reg != -1)
|
8648 |
|
|
reg = (unsigned) leaf_reg;
|
8649 |
|
|
}
|
8650 |
|
|
#endif
|
8651 |
|
|
gcc_assert ((unsigned) DBX_REGISTER_NUMBER (reg) == dbx_reg_number (rtl));
|
8652 |
|
|
nregs = hard_regno_nregs[REGNO (rtl)][GET_MODE (rtl)];
|
8653 |
|
|
|
8654 |
|
|
/* Simple, contiguous registers. */
|
8655 |
|
|
if (regs == NULL_RTX)
|
8656 |
|
|
{
|
8657 |
|
|
size = GET_MODE_SIZE (GET_MODE (rtl)) / nregs;
|
8658 |
|
|
|
8659 |
|
|
loc_result = NULL;
|
8660 |
|
|
while (nregs--)
|
8661 |
|
|
{
|
8662 |
|
|
dw_loc_descr_ref t;
|
8663 |
|
|
|
8664 |
|
|
t = one_reg_loc_descriptor (DBX_REGISTER_NUMBER (reg));
|
8665 |
|
|
add_loc_descr (&loc_result, t);
|
8666 |
|
|
add_loc_descr_op_piece (&loc_result, size);
|
8667 |
|
|
++reg;
|
8668 |
|
|
}
|
8669 |
|
|
return loc_result;
|
8670 |
|
|
}
|
8671 |
|
|
|
8672 |
|
|
/* Now onto stupid register sets in non contiguous locations. */
|
8673 |
|
|
|
8674 |
|
|
gcc_assert (GET_CODE (regs) == PARALLEL);
|
8675 |
|
|
|
8676 |
|
|
size = GET_MODE_SIZE (GET_MODE (XVECEXP (regs, 0, 0)));
|
8677 |
|
|
loc_result = NULL;
|
8678 |
|
|
|
8679 |
|
|
for (i = 0; i < XVECLEN (regs, 0); ++i)
|
8680 |
|
|
{
|
8681 |
|
|
dw_loc_descr_ref t;
|
8682 |
|
|
|
8683 |
|
|
t = one_reg_loc_descriptor (REGNO (XVECEXP (regs, 0, i)));
|
8684 |
|
|
add_loc_descr (&loc_result, t);
|
8685 |
|
|
size = GET_MODE_SIZE (GET_MODE (XVECEXP (regs, 0, 0)));
|
8686 |
|
|
add_loc_descr_op_piece (&loc_result, size);
|
8687 |
|
|
}
|
8688 |
|
|
return loc_result;
|
8689 |
|
|
}
|
8690 |
|
|
|
8691 |
|
|
/* Return a location descriptor that designates a constant. */
|
8692 |
|
|
|
8693 |
|
|
static dw_loc_descr_ref
|
8694 |
|
|
int_loc_descriptor (HOST_WIDE_INT i)
|
8695 |
|
|
{
|
8696 |
|
|
enum dwarf_location_atom op;
|
8697 |
|
|
|
8698 |
|
|
/* Pick the smallest representation of a constant, rather than just
|
8699 |
|
|
defaulting to the LEB encoding. */
|
8700 |
|
|
if (i >= 0)
|
8701 |
|
|
{
|
8702 |
|
|
if (i <= 31)
|
8703 |
|
|
op = DW_OP_lit0 + i;
|
8704 |
|
|
else if (i <= 0xff)
|
8705 |
|
|
op = DW_OP_const1u;
|
8706 |
|
|
else if (i <= 0xffff)
|
8707 |
|
|
op = DW_OP_const2u;
|
8708 |
|
|
else if (HOST_BITS_PER_WIDE_INT == 32
|
8709 |
|
|
|| i <= 0xffffffff)
|
8710 |
|
|
op = DW_OP_const4u;
|
8711 |
|
|
else
|
8712 |
|
|
op = DW_OP_constu;
|
8713 |
|
|
}
|
8714 |
|
|
else
|
8715 |
|
|
{
|
8716 |
|
|
if (i >= -0x80)
|
8717 |
|
|
op = DW_OP_const1s;
|
8718 |
|
|
else if (i >= -0x8000)
|
8719 |
|
|
op = DW_OP_const2s;
|
8720 |
|
|
else if (HOST_BITS_PER_WIDE_INT == 32
|
8721 |
|
|
|| i >= -0x80000000)
|
8722 |
|
|
op = DW_OP_const4s;
|
8723 |
|
|
else
|
8724 |
|
|
op = DW_OP_consts;
|
8725 |
|
|
}
|
8726 |
|
|
|
8727 |
|
|
return new_loc_descr (op, i, 0);
|
8728 |
|
|
}
|
8729 |
|
|
|
8730 |
|
|
/* Return a location descriptor that designates a base+offset location. */
|
8731 |
|
|
|
8732 |
|
|
static dw_loc_descr_ref
|
8733 |
|
|
based_loc_descr (rtx reg, HOST_WIDE_INT offset)
|
8734 |
|
|
{
|
8735 |
|
|
unsigned int regno;
|
8736 |
|
|
|
8737 |
|
|
/* We only use "frame base" when we're sure we're talking about the
|
8738 |
|
|
post-prologue local stack frame. We do this by *not* running
|
8739 |
|
|
register elimination until this point, and recognizing the special
|
8740 |
|
|
argument pointer and soft frame pointer rtx's. */
|
8741 |
|
|
if (reg == arg_pointer_rtx || reg == frame_pointer_rtx)
|
8742 |
|
|
{
|
8743 |
|
|
rtx elim = eliminate_regs (reg, VOIDmode, NULL_RTX);
|
8744 |
|
|
|
8745 |
|
|
if (elim != reg)
|
8746 |
|
|
{
|
8747 |
|
|
if (GET_CODE (elim) == PLUS)
|
8748 |
|
|
{
|
8749 |
|
|
offset += INTVAL (XEXP (elim, 1));
|
8750 |
|
|
elim = XEXP (elim, 0);
|
8751 |
|
|
}
|
8752 |
|
|
gcc_assert (elim == (frame_pointer_needed ? hard_frame_pointer_rtx
|
8753 |
|
|
: stack_pointer_rtx));
|
8754 |
|
|
offset += frame_pointer_fb_offset;
|
8755 |
|
|
|
8756 |
|
|
return new_loc_descr (DW_OP_fbreg, offset, 0);
|
8757 |
|
|
}
|
8758 |
|
|
}
|
8759 |
|
|
|
8760 |
|
|
regno = dbx_reg_number (reg);
|
8761 |
|
|
if (regno <= 31)
|
8762 |
|
|
return new_loc_descr (DW_OP_breg0 + regno, offset, 0);
|
8763 |
|
|
else
|
8764 |
|
|
return new_loc_descr (DW_OP_bregx, regno, offset);
|
8765 |
|
|
}
|
8766 |
|
|
|
8767 |
|
|
/* Return true if this RTL expression describes a base+offset calculation. */
|
8768 |
|
|
|
8769 |
|
|
static inline int
|
8770 |
|
|
is_based_loc (rtx rtl)
|
8771 |
|
|
{
|
8772 |
|
|
return (GET_CODE (rtl) == PLUS
|
8773 |
|
|
&& ((REG_P (XEXP (rtl, 0))
|
8774 |
|
|
&& REGNO (XEXP (rtl, 0)) < FIRST_PSEUDO_REGISTER
|
8775 |
|
|
&& GET_CODE (XEXP (rtl, 1)) == CONST_INT)));
|
8776 |
|
|
}
|
8777 |
|
|
|
8778 |
|
|
/* The following routine converts the RTL for a variable or parameter
|
8779 |
|
|
(resident in memory) into an equivalent Dwarf representation of a
|
8780 |
|
|
mechanism for getting the address of that same variable onto the top of a
|
8781 |
|
|
hypothetical "address evaluation" stack.
|
8782 |
|
|
|
8783 |
|
|
When creating memory location descriptors, we are effectively transforming
|
8784 |
|
|
the RTL for a memory-resident object into its Dwarf postfix expression
|
8785 |
|
|
equivalent. This routine recursively descends an RTL tree, turning
|
8786 |
|
|
it into Dwarf postfix code as it goes.
|
8787 |
|
|
|
8788 |
|
|
MODE is the mode of the memory reference, needed to handle some
|
8789 |
|
|
autoincrement addressing modes.
|
8790 |
|
|
|
8791 |
|
|
CAN_USE_FBREG is a flag whether we can use DW_AT_frame_base in the
|
8792 |
|
|
location list for RTL.
|
8793 |
|
|
|
8794 |
|
|
Return 0 if we can't represent the location. */
|
8795 |
|
|
|
8796 |
|
|
static dw_loc_descr_ref
|
8797 |
|
|
mem_loc_descriptor (rtx rtl, enum machine_mode mode)
|
8798 |
|
|
{
|
8799 |
|
|
dw_loc_descr_ref mem_loc_result = NULL;
|
8800 |
|
|
enum dwarf_location_atom op;
|
8801 |
|
|
|
8802 |
|
|
/* Note that for a dynamically sized array, the location we will generate a
|
8803 |
|
|
description of here will be the lowest numbered location which is
|
8804 |
|
|
actually within the array. That's *not* necessarily the same as the
|
8805 |
|
|
zeroth element of the array. */
|
8806 |
|
|
|
8807 |
|
|
rtl = targetm.delegitimize_address (rtl);
|
8808 |
|
|
|
8809 |
|
|
switch (GET_CODE (rtl))
|
8810 |
|
|
{
|
8811 |
|
|
case POST_INC:
|
8812 |
|
|
case POST_DEC:
|
8813 |
|
|
case POST_MODIFY:
|
8814 |
|
|
/* POST_INC and POST_DEC can be handled just like a SUBREG. So we
|
8815 |
|
|
just fall into the SUBREG code. */
|
8816 |
|
|
|
8817 |
|
|
/* ... fall through ... */
|
8818 |
|
|
|
8819 |
|
|
case SUBREG:
|
8820 |
|
|
/* The case of a subreg may arise when we have a local (register)
|
8821 |
|
|
variable or a formal (register) parameter which doesn't quite fill
|
8822 |
|
|
up an entire register. For now, just assume that it is
|
8823 |
|
|
legitimate to make the Dwarf info refer to the whole register which
|
8824 |
|
|
contains the given subreg. */
|
8825 |
|
|
rtl = XEXP (rtl, 0);
|
8826 |
|
|
|
8827 |
|
|
/* ... fall through ... */
|
8828 |
|
|
|
8829 |
|
|
case REG:
|
8830 |
|
|
/* Whenever a register number forms a part of the description of the
|
8831 |
|
|
method for calculating the (dynamic) address of a memory resident
|
8832 |
|
|
object, DWARF rules require the register number be referred to as
|
8833 |
|
|
a "base register". This distinction is not based in any way upon
|
8834 |
|
|
what category of register the hardware believes the given register
|
8835 |
|
|
belongs to. This is strictly DWARF terminology we're dealing with
|
8836 |
|
|
here. Note that in cases where the location of a memory-resident
|
8837 |
|
|
data object could be expressed as: OP_ADD (OP_BASEREG (basereg),
|
8838 |
|
|
OP_CONST (0)) the actual DWARF location descriptor that we generate
|
8839 |
|
|
may just be OP_BASEREG (basereg). This may look deceptively like
|
8840 |
|
|
the object in question was allocated to a register (rather than in
|
8841 |
|
|
memory) so DWARF consumers need to be aware of the subtle
|
8842 |
|
|
distinction between OP_REG and OP_BASEREG. */
|
8843 |
|
|
if (REGNO (rtl) < FIRST_PSEUDO_REGISTER)
|
8844 |
|
|
mem_loc_result = based_loc_descr (rtl, 0);
|
8845 |
|
|
break;
|
8846 |
|
|
|
8847 |
|
|
case MEM:
|
8848 |
|
|
mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl));
|
8849 |
|
|
if (mem_loc_result != 0)
|
8850 |
|
|
add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0));
|
8851 |
|
|
break;
|
8852 |
|
|
|
8853 |
|
|
case LO_SUM:
|
8854 |
|
|
rtl = XEXP (rtl, 1);
|
8855 |
|
|
|
8856 |
|
|
/* ... fall through ... */
|
8857 |
|
|
|
8858 |
|
|
case LABEL_REF:
|
8859 |
|
|
/* Some ports can transform a symbol ref into a label ref, because
|
8860 |
|
|
the symbol ref is too far away and has to be dumped into a constant
|
8861 |
|
|
pool. */
|
8862 |
|
|
case CONST:
|
8863 |
|
|
case SYMBOL_REF:
|
8864 |
|
|
/* Alternatively, the symbol in the constant pool might be referenced
|
8865 |
|
|
by a different symbol. */
|
8866 |
|
|
if (GET_CODE (rtl) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (rtl))
|
8867 |
|
|
{
|
8868 |
|
|
bool marked;
|
8869 |
|
|
rtx tmp = get_pool_constant_mark (rtl, &marked);
|
8870 |
|
|
|
8871 |
|
|
if (GET_CODE (tmp) == SYMBOL_REF)
|
8872 |
|
|
{
|
8873 |
|
|
rtl = tmp;
|
8874 |
|
|
if (CONSTANT_POOL_ADDRESS_P (tmp))
|
8875 |
|
|
get_pool_constant_mark (tmp, &marked);
|
8876 |
|
|
else
|
8877 |
|
|
marked = true;
|
8878 |
|
|
}
|
8879 |
|
|
|
8880 |
|
|
/* If all references to this pool constant were optimized away,
|
8881 |
|
|
it was not output and thus we can't represent it.
|
8882 |
|
|
FIXME: might try to use DW_OP_const_value here, though
|
8883 |
|
|
DW_OP_piece complicates it. */
|
8884 |
|
|
if (!marked)
|
8885 |
|
|
return 0;
|
8886 |
|
|
}
|
8887 |
|
|
|
8888 |
|
|
mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0);
|
8889 |
|
|
mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr;
|
8890 |
|
|
mem_loc_result->dw_loc_oprnd1.v.val_addr = rtl;
|
8891 |
|
|
VEC_safe_push (rtx, gc, used_rtx_array, rtl);
|
8892 |
|
|
break;
|
8893 |
|
|
|
8894 |
|
|
case PRE_MODIFY:
|
8895 |
|
|
/* Extract the PLUS expression nested inside and fall into
|
8896 |
|
|
PLUS code below. */
|
8897 |
|
|
rtl = XEXP (rtl, 1);
|
8898 |
|
|
goto plus;
|
8899 |
|
|
|
8900 |
|
|
case PRE_INC:
|
8901 |
|
|
case PRE_DEC:
|
8902 |
|
|
/* Turn these into a PLUS expression and fall into the PLUS code
|
8903 |
|
|
below. */
|
8904 |
|
|
rtl = gen_rtx_PLUS (word_mode, XEXP (rtl, 0),
|
8905 |
|
|
GEN_INT (GET_CODE (rtl) == PRE_INC
|
8906 |
|
|
? GET_MODE_UNIT_SIZE (mode)
|
8907 |
|
|
: -GET_MODE_UNIT_SIZE (mode)));
|
8908 |
|
|
|
8909 |
|
|
/* ... fall through ... */
|
8910 |
|
|
|
8911 |
|
|
case PLUS:
|
8912 |
|
|
plus:
|
8913 |
|
|
if (is_based_loc (rtl))
|
8914 |
|
|
mem_loc_result = based_loc_descr (XEXP (rtl, 0),
|
8915 |
|
|
INTVAL (XEXP (rtl, 1)));
|
8916 |
|
|
else
|
8917 |
|
|
{
|
8918 |
|
|
mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), mode);
|
8919 |
|
|
if (mem_loc_result == 0)
|
8920 |
|
|
break;
|
8921 |
|
|
|
8922 |
|
|
if (GET_CODE (XEXP (rtl, 1)) == CONST_INT
|
8923 |
|
|
&& INTVAL (XEXP (rtl, 1)) >= 0)
|
8924 |
|
|
add_loc_descr (&mem_loc_result,
|
8925 |
|
|
new_loc_descr (DW_OP_plus_uconst,
|
8926 |
|
|
INTVAL (XEXP (rtl, 1)), 0));
|
8927 |
|
|
else
|
8928 |
|
|
{
|
8929 |
|
|
add_loc_descr (&mem_loc_result,
|
8930 |
|
|
mem_loc_descriptor (XEXP (rtl, 1), mode));
|
8931 |
|
|
add_loc_descr (&mem_loc_result,
|
8932 |
|
|
new_loc_descr (DW_OP_plus, 0, 0));
|
8933 |
|
|
}
|
8934 |
|
|
}
|
8935 |
|
|
break;
|
8936 |
|
|
|
8937 |
|
|
/* If a pseudo-reg is optimized away, it is possible for it to
|
8938 |
|
|
be replaced with a MEM containing a multiply or shift. */
|
8939 |
|
|
case MULT:
|
8940 |
|
|
op = DW_OP_mul;
|
8941 |
|
|
goto do_binop;
|
8942 |
|
|
|
8943 |
|
|
case ASHIFT:
|
8944 |
|
|
op = DW_OP_shl;
|
8945 |
|
|
goto do_binop;
|
8946 |
|
|
|
8947 |
|
|
case ASHIFTRT:
|
8948 |
|
|
op = DW_OP_shra;
|
8949 |
|
|
goto do_binop;
|
8950 |
|
|
|
8951 |
|
|
case LSHIFTRT:
|
8952 |
|
|
op = DW_OP_shr;
|
8953 |
|
|
goto do_binop;
|
8954 |
|
|
|
8955 |
|
|
do_binop:
|
8956 |
|
|
{
|
8957 |
|
|
dw_loc_descr_ref op0 = mem_loc_descriptor (XEXP (rtl, 0), mode);
|
8958 |
|
|
dw_loc_descr_ref op1 = mem_loc_descriptor (XEXP (rtl, 1), mode);
|
8959 |
|
|
|
8960 |
|
|
if (op0 == 0 || op1 == 0)
|
8961 |
|
|
break;
|
8962 |
|
|
|
8963 |
|
|
mem_loc_result = op0;
|
8964 |
|
|
add_loc_descr (&mem_loc_result, op1);
|
8965 |
|
|
add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
|
8966 |
|
|
break;
|
8967 |
|
|
}
|
8968 |
|
|
|
8969 |
|
|
case CONST_INT:
|
8970 |
|
|
mem_loc_result = int_loc_descriptor (INTVAL (rtl));
|
8971 |
|
|
break;
|
8972 |
|
|
|
8973 |
|
|
default:
|
8974 |
|
|
gcc_unreachable ();
|
8975 |
|
|
}
|
8976 |
|
|
|
8977 |
|
|
return mem_loc_result;
|
8978 |
|
|
}
|
8979 |
|
|
|
8980 |
|
|
/* Return a descriptor that describes the concatenation of two locations.
|
8981 |
|
|
This is typically a complex variable. */
|
8982 |
|
|
|
8983 |
|
|
static dw_loc_descr_ref
|
8984 |
|
|
concat_loc_descriptor (rtx x0, rtx x1)
|
8985 |
|
|
{
|
8986 |
|
|
dw_loc_descr_ref cc_loc_result = NULL;
|
8987 |
|
|
dw_loc_descr_ref x0_ref = loc_descriptor (x0);
|
8988 |
|
|
dw_loc_descr_ref x1_ref = loc_descriptor (x1);
|
8989 |
|
|
|
8990 |
|
|
if (x0_ref == 0 || x1_ref == 0)
|
8991 |
|
|
return 0;
|
8992 |
|
|
|
8993 |
|
|
cc_loc_result = x0_ref;
|
8994 |
|
|
add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x0)));
|
8995 |
|
|
|
8996 |
|
|
add_loc_descr (&cc_loc_result, x1_ref);
|
8997 |
|
|
add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x1)));
|
8998 |
|
|
|
8999 |
|
|
return cc_loc_result;
|
9000 |
|
|
}
|
9001 |
|
|
|
9002 |
|
|
/* Output a proper Dwarf location descriptor for a variable or parameter
|
9003 |
|
|
which is either allocated in a register or in a memory location. For a
|
9004 |
|
|
register, we just generate an OP_REG and the register number. For a
|
9005 |
|
|
memory location we provide a Dwarf postfix expression describing how to
|
9006 |
|
|
generate the (dynamic) address of the object onto the address stack.
|
9007 |
|
|
|
9008 |
|
|
If we don't know how to describe it, return 0. */
|
9009 |
|
|
|
9010 |
|
|
static dw_loc_descr_ref
|
9011 |
|
|
loc_descriptor (rtx rtl)
|
9012 |
|
|
{
|
9013 |
|
|
dw_loc_descr_ref loc_result = NULL;
|
9014 |
|
|
|
9015 |
|
|
switch (GET_CODE (rtl))
|
9016 |
|
|
{
|
9017 |
|
|
case SUBREG:
|
9018 |
|
|
/* The case of a subreg may arise when we have a local (register)
|
9019 |
|
|
variable or a formal (register) parameter which doesn't quite fill
|
9020 |
|
|
up an entire register. For now, just assume that it is
|
9021 |
|
|
legitimate to make the Dwarf info refer to the whole register which
|
9022 |
|
|
contains the given subreg. */
|
9023 |
|
|
rtl = SUBREG_REG (rtl);
|
9024 |
|
|
|
9025 |
|
|
/* ... fall through ... */
|
9026 |
|
|
|
9027 |
|
|
case REG:
|
9028 |
|
|
loc_result = reg_loc_descriptor (rtl);
|
9029 |
|
|
break;
|
9030 |
|
|
|
9031 |
|
|
case MEM:
|
9032 |
|
|
loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl));
|
9033 |
|
|
break;
|
9034 |
|
|
|
9035 |
|
|
case CONCAT:
|
9036 |
|
|
loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1));
|
9037 |
|
|
break;
|
9038 |
|
|
|
9039 |
|
|
case VAR_LOCATION:
|
9040 |
|
|
/* Single part. */
|
9041 |
|
|
if (GET_CODE (XEXP (rtl, 1)) != PARALLEL)
|
9042 |
|
|
{
|
9043 |
|
|
loc_result = loc_descriptor (XEXP (XEXP (rtl, 1), 0));
|
9044 |
|
|
break;
|
9045 |
|
|
}
|
9046 |
|
|
|
9047 |
|
|
rtl = XEXP (rtl, 1);
|
9048 |
|
|
/* FALLTHRU */
|
9049 |
|
|
|
9050 |
|
|
case PARALLEL:
|
9051 |
|
|
{
|
9052 |
|
|
rtvec par_elems = XVEC (rtl, 0);
|
9053 |
|
|
int num_elem = GET_NUM_ELEM (par_elems);
|
9054 |
|
|
enum machine_mode mode;
|
9055 |
|
|
int i;
|
9056 |
|
|
|
9057 |
|
|
/* Create the first one, so we have something to add to. */
|
9058 |
|
|
loc_result = loc_descriptor (XEXP (RTVEC_ELT (par_elems, 0), 0));
|
9059 |
|
|
mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, 0), 0));
|
9060 |
|
|
add_loc_descr_op_piece (&loc_result, GET_MODE_SIZE (mode));
|
9061 |
|
|
for (i = 1; i < num_elem; i++)
|
9062 |
|
|
{
|
9063 |
|
|
dw_loc_descr_ref temp;
|
9064 |
|
|
|
9065 |
|
|
temp = loc_descriptor (XEXP (RTVEC_ELT (par_elems, i), 0));
|
9066 |
|
|
add_loc_descr (&loc_result, temp);
|
9067 |
|
|
mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, i), 0));
|
9068 |
|
|
add_loc_descr_op_piece (&loc_result, GET_MODE_SIZE (mode));
|
9069 |
|
|
}
|
9070 |
|
|
}
|
9071 |
|
|
break;
|
9072 |
|
|
|
9073 |
|
|
default:
|
9074 |
|
|
gcc_unreachable ();
|
9075 |
|
|
}
|
9076 |
|
|
|
9077 |
|
|
return loc_result;
|
9078 |
|
|
}
|
9079 |
|
|
|
9080 |
|
|
/* Similar, but generate the descriptor from trees instead of rtl. This comes
|
9081 |
|
|
up particularly with variable length arrays. WANT_ADDRESS is 2 if this is
|
9082 |
|
|
a top-level invocation of loc_descriptor_from_tree; is 1 if this is not a
|
9083 |
|
|
top-level invocation, and we require the address of LOC; is 0 if we require
|
9084 |
|
|
the value of LOC. */
|
9085 |
|
|
|
9086 |
|
|
static dw_loc_descr_ref
|
9087 |
|
|
loc_descriptor_from_tree_1 (tree loc, int want_address)
|
9088 |
|
|
{
|
9089 |
|
|
dw_loc_descr_ref ret, ret1;
|
9090 |
|
|
int have_address = 0;
|
9091 |
|
|
enum dwarf_location_atom op;
|
9092 |
|
|
|
9093 |
|
|
/* ??? Most of the time we do not take proper care for sign/zero
|
9094 |
|
|
extending the values properly. Hopefully this won't be a real
|
9095 |
|
|
problem... */
|
9096 |
|
|
|
9097 |
|
|
switch (TREE_CODE (loc))
|
9098 |
|
|
{
|
9099 |
|
|
case ERROR_MARK:
|
9100 |
|
|
return 0;
|
9101 |
|
|
|
9102 |
|
|
case PLACEHOLDER_EXPR:
|
9103 |
|
|
/* This case involves extracting fields from an object to determine the
|
9104 |
|
|
position of other fields. We don't try to encode this here. The
|
9105 |
|
|
only user of this is Ada, which encodes the needed information using
|
9106 |
|
|
the names of types. */
|
9107 |
|
|
return 0;
|
9108 |
|
|
|
9109 |
|
|
case CALL_EXPR:
|
9110 |
|
|
return 0;
|
9111 |
|
|
|
9112 |
|
|
case PREINCREMENT_EXPR:
|
9113 |
|
|
case PREDECREMENT_EXPR:
|
9114 |
|
|
case POSTINCREMENT_EXPR:
|
9115 |
|
|
case POSTDECREMENT_EXPR:
|
9116 |
|
|
/* There are no opcodes for these operations. */
|
9117 |
|
|
return 0;
|
9118 |
|
|
|
9119 |
|
|
case ADDR_EXPR:
|
9120 |
|
|
/* If we already want an address, there's nothing we can do. */
|
9121 |
|
|
if (want_address)
|
9122 |
|
|
return 0;
|
9123 |
|
|
|
9124 |
|
|
/* Otherwise, process the argument and look for the address. */
|
9125 |
|
|
return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 1);
|
9126 |
|
|
|
9127 |
|
|
case VAR_DECL:
|
9128 |
|
|
if (DECL_THREAD_LOCAL_P (loc))
|
9129 |
|
|
{
|
9130 |
|
|
rtx rtl;
|
9131 |
|
|
|
9132 |
|
|
/* If this is not defined, we have no way to emit the data. */
|
9133 |
|
|
if (!targetm.asm_out.output_dwarf_dtprel)
|
9134 |
|
|
return 0;
|
9135 |
|
|
|
9136 |
|
|
/* The way DW_OP_GNU_push_tls_address is specified, we can only
|
9137 |
|
|
look up addresses of objects in the current module. */
|
9138 |
|
|
if (DECL_EXTERNAL (loc))
|
9139 |
|
|
return 0;
|
9140 |
|
|
|
9141 |
|
|
rtl = rtl_for_decl_location (loc);
|
9142 |
|
|
if (rtl == NULL_RTX)
|
9143 |
|
|
return 0;
|
9144 |
|
|
|
9145 |
|
|
if (!MEM_P (rtl))
|
9146 |
|
|
return 0;
|
9147 |
|
|
rtl = XEXP (rtl, 0);
|
9148 |
|
|
if (! CONSTANT_P (rtl))
|
9149 |
|
|
return 0;
|
9150 |
|
|
|
9151 |
|
|
ret = new_loc_descr (INTERNAL_DW_OP_tls_addr, 0, 0);
|
9152 |
|
|
ret->dw_loc_oprnd1.val_class = dw_val_class_addr;
|
9153 |
|
|
ret->dw_loc_oprnd1.v.val_addr = rtl;
|
9154 |
|
|
|
9155 |
|
|
ret1 = new_loc_descr (DW_OP_GNU_push_tls_address, 0, 0);
|
9156 |
|
|
add_loc_descr (&ret, ret1);
|
9157 |
|
|
|
9158 |
|
|
have_address = 1;
|
9159 |
|
|
break;
|
9160 |
|
|
}
|
9161 |
|
|
/* FALLTHRU */
|
9162 |
|
|
|
9163 |
|
|
case PARM_DECL:
|
9164 |
|
|
if (DECL_HAS_VALUE_EXPR_P (loc))
|
9165 |
|
|
return loc_descriptor_from_tree_1 (DECL_VALUE_EXPR (loc),
|
9166 |
|
|
want_address);
|
9167 |
|
|
/* FALLTHRU */
|
9168 |
|
|
|
9169 |
|
|
case RESULT_DECL:
|
9170 |
|
|
case FUNCTION_DECL:
|
9171 |
|
|
{
|
9172 |
|
|
rtx rtl = rtl_for_decl_location (loc);
|
9173 |
|
|
|
9174 |
|
|
if (rtl == NULL_RTX)
|
9175 |
|
|
return 0;
|
9176 |
|
|
else if (GET_CODE (rtl) == CONST_INT)
|
9177 |
|
|
{
|
9178 |
|
|
HOST_WIDE_INT val = INTVAL (rtl);
|
9179 |
|
|
if (TYPE_UNSIGNED (TREE_TYPE (loc)))
|
9180 |
|
|
val &= GET_MODE_MASK (DECL_MODE (loc));
|
9181 |
|
|
ret = int_loc_descriptor (val);
|
9182 |
|
|
}
|
9183 |
|
|
else if (GET_CODE (rtl) == CONST_STRING)
|
9184 |
|
|
return 0;
|
9185 |
|
|
else if (CONSTANT_P (rtl))
|
9186 |
|
|
{
|
9187 |
|
|
ret = new_loc_descr (DW_OP_addr, 0, 0);
|
9188 |
|
|
ret->dw_loc_oprnd1.val_class = dw_val_class_addr;
|
9189 |
|
|
ret->dw_loc_oprnd1.v.val_addr = rtl;
|
9190 |
|
|
}
|
9191 |
|
|
else
|
9192 |
|
|
{
|
9193 |
|
|
enum machine_mode mode;
|
9194 |
|
|
|
9195 |
|
|
/* Certain constructs can only be represented at top-level. */
|
9196 |
|
|
if (want_address == 2)
|
9197 |
|
|
return loc_descriptor (rtl);
|
9198 |
|
|
|
9199 |
|
|
mode = GET_MODE (rtl);
|
9200 |
|
|
if (MEM_P (rtl))
|
9201 |
|
|
{
|
9202 |
|
|
rtl = XEXP (rtl, 0);
|
9203 |
|
|
have_address = 1;
|
9204 |
|
|
}
|
9205 |
|
|
ret = mem_loc_descriptor (rtl, mode);
|
9206 |
|
|
}
|
9207 |
|
|
}
|
9208 |
|
|
break;
|
9209 |
|
|
|
9210 |
|
|
case INDIRECT_REF:
|
9211 |
|
|
ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
|
9212 |
|
|
have_address = 1;
|
9213 |
|
|
break;
|
9214 |
|
|
|
9215 |
|
|
case COMPOUND_EXPR:
|
9216 |
|
|
return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), want_address);
|
9217 |
|
|
|
9218 |
|
|
case NOP_EXPR:
|
9219 |
|
|
case CONVERT_EXPR:
|
9220 |
|
|
case NON_LVALUE_EXPR:
|
9221 |
|
|
case VIEW_CONVERT_EXPR:
|
9222 |
|
|
case SAVE_EXPR:
|
9223 |
|
|
case MODIFY_EXPR:
|
9224 |
|
|
return loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), want_address);
|
9225 |
|
|
|
9226 |
|
|
case COMPONENT_REF:
|
9227 |
|
|
case BIT_FIELD_REF:
|
9228 |
|
|
case ARRAY_REF:
|
9229 |
|
|
case ARRAY_RANGE_REF:
|
9230 |
|
|
{
|
9231 |
|
|
tree obj, offset;
|
9232 |
|
|
HOST_WIDE_INT bitsize, bitpos, bytepos;
|
9233 |
|
|
enum machine_mode mode;
|
9234 |
|
|
int volatilep;
|
9235 |
|
|
int unsignedp = TYPE_UNSIGNED (TREE_TYPE (loc));
|
9236 |
|
|
|
9237 |
|
|
obj = get_inner_reference (loc, &bitsize, &bitpos, &offset, &mode,
|
9238 |
|
|
&unsignedp, &volatilep, false);
|
9239 |
|
|
|
9240 |
|
|
if (obj == loc)
|
9241 |
|
|
return 0;
|
9242 |
|
|
|
9243 |
|
|
ret = loc_descriptor_from_tree_1 (obj, 1);
|
9244 |
|
|
if (ret == 0
|
9245 |
|
|
|| bitpos % BITS_PER_UNIT != 0 || bitsize % BITS_PER_UNIT != 0)
|
9246 |
|
|
return 0;
|
9247 |
|
|
|
9248 |
|
|
if (offset != NULL_TREE)
|
9249 |
|
|
{
|
9250 |
|
|
/* Variable offset. */
|
9251 |
|
|
add_loc_descr (&ret, loc_descriptor_from_tree_1 (offset, 0));
|
9252 |
|
|
add_loc_descr (&ret, new_loc_descr (DW_OP_plus, 0, 0));
|
9253 |
|
|
}
|
9254 |
|
|
|
9255 |
|
|
bytepos = bitpos / BITS_PER_UNIT;
|
9256 |
|
|
if (bytepos > 0)
|
9257 |
|
|
add_loc_descr (&ret, new_loc_descr (DW_OP_plus_uconst, bytepos, 0));
|
9258 |
|
|
else if (bytepos < 0)
|
9259 |
|
|
{
|
9260 |
|
|
add_loc_descr (&ret, int_loc_descriptor (bytepos));
|
9261 |
|
|
add_loc_descr (&ret, new_loc_descr (DW_OP_plus, 0, 0));
|
9262 |
|
|
}
|
9263 |
|
|
|
9264 |
|
|
have_address = 1;
|
9265 |
|
|
break;
|
9266 |
|
|
}
|
9267 |
|
|
|
9268 |
|
|
case INTEGER_CST:
|
9269 |
|
|
if (host_integerp (loc, 0))
|
9270 |
|
|
ret = int_loc_descriptor (tree_low_cst (loc, 0));
|
9271 |
|
|
else
|
9272 |
|
|
return 0;
|
9273 |
|
|
break;
|
9274 |
|
|
|
9275 |
|
|
case CONSTRUCTOR:
|
9276 |
|
|
{
|
9277 |
|
|
/* Get an RTL for this, if something has been emitted. */
|
9278 |
|
|
rtx rtl = lookup_constant_def (loc);
|
9279 |
|
|
enum machine_mode mode;
|
9280 |
|
|
|
9281 |
|
|
if (!rtl || !MEM_P (rtl))
|
9282 |
|
|
return 0;
|
9283 |
|
|
mode = GET_MODE (rtl);
|
9284 |
|
|
rtl = XEXP (rtl, 0);
|
9285 |
|
|
ret = mem_loc_descriptor (rtl, mode);
|
9286 |
|
|
have_address = 1;
|
9287 |
|
|
break;
|
9288 |
|
|
}
|
9289 |
|
|
|
9290 |
|
|
case TRUTH_AND_EXPR:
|
9291 |
|
|
case TRUTH_ANDIF_EXPR:
|
9292 |
|
|
case BIT_AND_EXPR:
|
9293 |
|
|
op = DW_OP_and;
|
9294 |
|
|
goto do_binop;
|
9295 |
|
|
|
9296 |
|
|
case TRUTH_XOR_EXPR:
|
9297 |
|
|
case BIT_XOR_EXPR:
|
9298 |
|
|
op = DW_OP_xor;
|
9299 |
|
|
goto do_binop;
|
9300 |
|
|
|
9301 |
|
|
case TRUTH_OR_EXPR:
|
9302 |
|
|
case TRUTH_ORIF_EXPR:
|
9303 |
|
|
case BIT_IOR_EXPR:
|
9304 |
|
|
op = DW_OP_or;
|
9305 |
|
|
goto do_binop;
|
9306 |
|
|
|
9307 |
|
|
case FLOOR_DIV_EXPR:
|
9308 |
|
|
case CEIL_DIV_EXPR:
|
9309 |
|
|
case ROUND_DIV_EXPR:
|
9310 |
|
|
case TRUNC_DIV_EXPR:
|
9311 |
|
|
op = DW_OP_div;
|
9312 |
|
|
goto do_binop;
|
9313 |
|
|
|
9314 |
|
|
case MINUS_EXPR:
|
9315 |
|
|
op = DW_OP_minus;
|
9316 |
|
|
goto do_binop;
|
9317 |
|
|
|
9318 |
|
|
case FLOOR_MOD_EXPR:
|
9319 |
|
|
case CEIL_MOD_EXPR:
|
9320 |
|
|
case ROUND_MOD_EXPR:
|
9321 |
|
|
case TRUNC_MOD_EXPR:
|
9322 |
|
|
op = DW_OP_mod;
|
9323 |
|
|
goto do_binop;
|
9324 |
|
|
|
9325 |
|
|
case MULT_EXPR:
|
9326 |
|
|
op = DW_OP_mul;
|
9327 |
|
|
goto do_binop;
|
9328 |
|
|
|
9329 |
|
|
case LSHIFT_EXPR:
|
9330 |
|
|
op = DW_OP_shl;
|
9331 |
|
|
goto do_binop;
|
9332 |
|
|
|
9333 |
|
|
case RSHIFT_EXPR:
|
9334 |
|
|
op = (TYPE_UNSIGNED (TREE_TYPE (loc)) ? DW_OP_shr : DW_OP_shra);
|
9335 |
|
|
goto do_binop;
|
9336 |
|
|
|
9337 |
|
|
case PLUS_EXPR:
|
9338 |
|
|
if (TREE_CODE (TREE_OPERAND (loc, 1)) == INTEGER_CST
|
9339 |
|
|
&& host_integerp (TREE_OPERAND (loc, 1), 0))
|
9340 |
|
|
{
|
9341 |
|
|
ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
|
9342 |
|
|
if (ret == 0)
|
9343 |
|
|
return 0;
|
9344 |
|
|
|
9345 |
|
|
add_loc_descr (&ret,
|
9346 |
|
|
new_loc_descr (DW_OP_plus_uconst,
|
9347 |
|
|
tree_low_cst (TREE_OPERAND (loc, 1),
|
9348 |
|
|
0),
|
9349 |
|
|
0));
|
9350 |
|
|
break;
|
9351 |
|
|
}
|
9352 |
|
|
|
9353 |
|
|
op = DW_OP_plus;
|
9354 |
|
|
goto do_binop;
|
9355 |
|
|
|
9356 |
|
|
case LE_EXPR:
|
9357 |
|
|
if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (loc, 0))))
|
9358 |
|
|
return 0;
|
9359 |
|
|
|
9360 |
|
|
op = DW_OP_le;
|
9361 |
|
|
goto do_binop;
|
9362 |
|
|
|
9363 |
|
|
case GE_EXPR:
|
9364 |
|
|
if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (loc, 0))))
|
9365 |
|
|
return 0;
|
9366 |
|
|
|
9367 |
|
|
op = DW_OP_ge;
|
9368 |
|
|
goto do_binop;
|
9369 |
|
|
|
9370 |
|
|
case LT_EXPR:
|
9371 |
|
|
if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (loc, 0))))
|
9372 |
|
|
return 0;
|
9373 |
|
|
|
9374 |
|
|
op = DW_OP_lt;
|
9375 |
|
|
goto do_binop;
|
9376 |
|
|
|
9377 |
|
|
case GT_EXPR:
|
9378 |
|
|
if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (loc, 0))))
|
9379 |
|
|
return 0;
|
9380 |
|
|
|
9381 |
|
|
op = DW_OP_gt;
|
9382 |
|
|
goto do_binop;
|
9383 |
|
|
|
9384 |
|
|
case EQ_EXPR:
|
9385 |
|
|
op = DW_OP_eq;
|
9386 |
|
|
goto do_binop;
|
9387 |
|
|
|
9388 |
|
|
case NE_EXPR:
|
9389 |
|
|
op = DW_OP_ne;
|
9390 |
|
|
goto do_binop;
|
9391 |
|
|
|
9392 |
|
|
do_binop:
|
9393 |
|
|
ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
|
9394 |
|
|
ret1 = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), 0);
|
9395 |
|
|
if (ret == 0 || ret1 == 0)
|
9396 |
|
|
return 0;
|
9397 |
|
|
|
9398 |
|
|
add_loc_descr (&ret, ret1);
|
9399 |
|
|
add_loc_descr (&ret, new_loc_descr (op, 0, 0));
|
9400 |
|
|
break;
|
9401 |
|
|
|
9402 |
|
|
case TRUTH_NOT_EXPR:
|
9403 |
|
|
case BIT_NOT_EXPR:
|
9404 |
|
|
op = DW_OP_not;
|
9405 |
|
|
goto do_unop;
|
9406 |
|
|
|
9407 |
|
|
case ABS_EXPR:
|
9408 |
|
|
op = DW_OP_abs;
|
9409 |
|
|
goto do_unop;
|
9410 |
|
|
|
9411 |
|
|
case NEGATE_EXPR:
|
9412 |
|
|
op = DW_OP_neg;
|
9413 |
|
|
goto do_unop;
|
9414 |
|
|
|
9415 |
|
|
do_unop:
|
9416 |
|
|
ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
|
9417 |
|
|
if (ret == 0)
|
9418 |
|
|
return 0;
|
9419 |
|
|
|
9420 |
|
|
add_loc_descr (&ret, new_loc_descr (op, 0, 0));
|
9421 |
|
|
break;
|
9422 |
|
|
|
9423 |
|
|
case MIN_EXPR:
|
9424 |
|
|
case MAX_EXPR:
|
9425 |
|
|
{
|
9426 |
|
|
const enum tree_code code =
|
9427 |
|
|
TREE_CODE (loc) == MIN_EXPR ? GT_EXPR : LT_EXPR;
|
9428 |
|
|
|
9429 |
|
|
loc = build3 (COND_EXPR, TREE_TYPE (loc),
|
9430 |
|
|
build2 (code, integer_type_node,
|
9431 |
|
|
TREE_OPERAND (loc, 0), TREE_OPERAND (loc, 1)),
|
9432 |
|
|
TREE_OPERAND (loc, 1), TREE_OPERAND (loc, 0));
|
9433 |
|
|
}
|
9434 |
|
|
|
9435 |
|
|
/* ... fall through ... */
|
9436 |
|
|
|
9437 |
|
|
case COND_EXPR:
|
9438 |
|
|
{
|
9439 |
|
|
dw_loc_descr_ref lhs
|
9440 |
|
|
= loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 1), 0);
|
9441 |
|
|
dw_loc_descr_ref rhs
|
9442 |
|
|
= loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 2), 0);
|
9443 |
|
|
dw_loc_descr_ref bra_node, jump_node, tmp;
|
9444 |
|
|
|
9445 |
|
|
ret = loc_descriptor_from_tree_1 (TREE_OPERAND (loc, 0), 0);
|
9446 |
|
|
if (ret == 0 || lhs == 0 || rhs == 0)
|
9447 |
|
|
return 0;
|
9448 |
|
|
|
9449 |
|
|
bra_node = new_loc_descr (DW_OP_bra, 0, 0);
|
9450 |
|
|
add_loc_descr (&ret, bra_node);
|
9451 |
|
|
|
9452 |
|
|
add_loc_descr (&ret, rhs);
|
9453 |
|
|
jump_node = new_loc_descr (DW_OP_skip, 0, 0);
|
9454 |
|
|
add_loc_descr (&ret, jump_node);
|
9455 |
|
|
|
9456 |
|
|
add_loc_descr (&ret, lhs);
|
9457 |
|
|
bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
|
9458 |
|
|
bra_node->dw_loc_oprnd1.v.val_loc = lhs;
|
9459 |
|
|
|
9460 |
|
|
/* ??? Need a node to point the skip at. Use a nop. */
|
9461 |
|
|
tmp = new_loc_descr (DW_OP_nop, 0, 0);
|
9462 |
|
|
add_loc_descr (&ret, tmp);
|
9463 |
|
|
jump_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
|
9464 |
|
|
jump_node->dw_loc_oprnd1.v.val_loc = tmp;
|
9465 |
|
|
}
|
9466 |
|
|
break;
|
9467 |
|
|
|
9468 |
|
|
case FIX_TRUNC_EXPR:
|
9469 |
|
|
case FIX_CEIL_EXPR:
|
9470 |
|
|
case FIX_FLOOR_EXPR:
|
9471 |
|
|
case FIX_ROUND_EXPR:
|
9472 |
|
|
return 0;
|
9473 |
|
|
|
9474 |
|
|
default:
|
9475 |
|
|
/* Leave front-end specific codes as simply unknown. This comes
|
9476 |
|
|
up, for instance, with the C STMT_EXPR. */
|
9477 |
|
|
if ((unsigned int) TREE_CODE (loc)
|
9478 |
|
|
>= (unsigned int) LAST_AND_UNUSED_TREE_CODE)
|
9479 |
|
|
return 0;
|
9480 |
|
|
|
9481 |
|
|
#ifdef ENABLE_CHECKING
|
9482 |
|
|
/* Otherwise this is a generic code; we should just lists all of
|
9483 |
|
|
these explicitly. We forgot one. */
|
9484 |
|
|
gcc_unreachable ();
|
9485 |
|
|
#else
|
9486 |
|
|
/* In a release build, we want to degrade gracefully: better to
|
9487 |
|
|
generate incomplete debugging information than to crash. */
|
9488 |
|
|
return NULL;
|
9489 |
|
|
#endif
|
9490 |
|
|
}
|
9491 |
|
|
|
9492 |
|
|
/* Show if we can't fill the request for an address. */
|
9493 |
|
|
if (want_address && !have_address)
|
9494 |
|
|
return 0;
|
9495 |
|
|
|
9496 |
|
|
/* If we've got an address and don't want one, dereference. */
|
9497 |
|
|
if (!want_address && have_address && ret)
|
9498 |
|
|
{
|
9499 |
|
|
HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (loc));
|
9500 |
|
|
|
9501 |
|
|
if (size > DWARF2_ADDR_SIZE || size == -1)
|
9502 |
|
|
return 0;
|
9503 |
|
|
else if (size == DWARF2_ADDR_SIZE)
|
9504 |
|
|
op = DW_OP_deref;
|
9505 |
|
|
else
|
9506 |
|
|
op = DW_OP_deref_size;
|
9507 |
|
|
|
9508 |
|
|
add_loc_descr (&ret, new_loc_descr (op, size, 0));
|
9509 |
|
|
}
|
9510 |
|
|
|
9511 |
|
|
return ret;
|
9512 |
|
|
}
|
9513 |
|
|
|
9514 |
|
|
static inline dw_loc_descr_ref
|
9515 |
|
|
loc_descriptor_from_tree (tree loc)
|
9516 |
|
|
{
|
9517 |
|
|
return loc_descriptor_from_tree_1 (loc, 2);
|
9518 |
|
|
}
|
9519 |
|
|
|
9520 |
|
|
/* Given a value, round it up to the lowest multiple of `boundary'
|
9521 |
|
|
which is not less than the value itself. */
|
9522 |
|
|
|
9523 |
|
|
static inline HOST_WIDE_INT
|
9524 |
|
|
ceiling (HOST_WIDE_INT value, unsigned int boundary)
|
9525 |
|
|
{
|
9526 |
|
|
return (((value + boundary - 1) / boundary) * boundary);
|
9527 |
|
|
}
|
9528 |
|
|
|
9529 |
|
|
/* Given a pointer to what is assumed to be a FIELD_DECL node, return a
|
9530 |
|
|
pointer to the declared type for the relevant field variable, or return
|
9531 |
|
|
`integer_type_node' if the given node turns out to be an
|
9532 |
|
|
ERROR_MARK node. */
|
9533 |
|
|
|
9534 |
|
|
static inline tree
|
9535 |
|
|
field_type (tree decl)
|
9536 |
|
|
{
|
9537 |
|
|
tree type;
|
9538 |
|
|
|
9539 |
|
|
if (TREE_CODE (decl) == ERROR_MARK)
|
9540 |
|
|
return integer_type_node;
|
9541 |
|
|
|
9542 |
|
|
type = DECL_BIT_FIELD_TYPE (decl);
|
9543 |
|
|
if (type == NULL_TREE)
|
9544 |
|
|
type = TREE_TYPE (decl);
|
9545 |
|
|
|
9546 |
|
|
return type;
|
9547 |
|
|
}
|
9548 |
|
|
|
9549 |
|
|
/* Given a pointer to a tree node, return the alignment in bits for
|
9550 |
|
|
it, or else return BITS_PER_WORD if the node actually turns out to
|
9551 |
|
|
be an ERROR_MARK node. */
|
9552 |
|
|
|
9553 |
|
|
static inline unsigned
|
9554 |
|
|
simple_type_align_in_bits (tree type)
|
9555 |
|
|
{
|
9556 |
|
|
return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD;
|
9557 |
|
|
}
|
9558 |
|
|
|
9559 |
|
|
static inline unsigned
|
9560 |
|
|
simple_decl_align_in_bits (tree decl)
|
9561 |
|
|
{
|
9562 |
|
|
return (TREE_CODE (decl) != ERROR_MARK) ? DECL_ALIGN (decl) : BITS_PER_WORD;
|
9563 |
|
|
}
|
9564 |
|
|
|
9565 |
|
|
/* Given a pointer to a FIELD_DECL, compute and return the byte offset of the
|
9566 |
|
|
lowest addressed byte of the "containing object" for the given FIELD_DECL,
|
9567 |
|
|
or return 0 if we are unable to determine what that offset is, either
|
9568 |
|
|
because the argument turns out to be a pointer to an ERROR_MARK node, or
|
9569 |
|
|
because the offset is actually variable. (We can't handle the latter case
|
9570 |
|
|
just yet). */
|
9571 |
|
|
|
9572 |
|
|
static HOST_WIDE_INT
|
9573 |
|
|
field_byte_offset (tree decl)
|
9574 |
|
|
{
|
9575 |
|
|
unsigned int type_align_in_bits;
|
9576 |
|
|
unsigned int decl_align_in_bits;
|
9577 |
|
|
unsigned HOST_WIDE_INT type_size_in_bits;
|
9578 |
|
|
HOST_WIDE_INT object_offset_in_bits;
|
9579 |
|
|
tree type;
|
9580 |
|
|
tree field_size_tree;
|
9581 |
|
|
HOST_WIDE_INT bitpos_int;
|
9582 |
|
|
HOST_WIDE_INT deepest_bitpos;
|
9583 |
|
|
unsigned HOST_WIDE_INT field_size_in_bits;
|
9584 |
|
|
|
9585 |
|
|
if (TREE_CODE (decl) == ERROR_MARK)
|
9586 |
|
|
return 0;
|
9587 |
|
|
|
9588 |
|
|
gcc_assert (TREE_CODE (decl) == FIELD_DECL);
|
9589 |
|
|
|
9590 |
|
|
type = field_type (decl);
|
9591 |
|
|
field_size_tree = DECL_SIZE (decl);
|
9592 |
|
|
|
9593 |
|
|
/* The size could be unspecified if there was an error, or for
|
9594 |
|
|
a flexible array member. */
|
9595 |
|
|
if (! field_size_tree)
|
9596 |
|
|
field_size_tree = bitsize_zero_node;
|
9597 |
|
|
|
9598 |
|
|
/* We cannot yet cope with fields whose positions are variable, so
|
9599 |
|
|
for now, when we see such things, we simply return 0. Someday, we may
|
9600 |
|
|
be able to handle such cases, but it will be damn difficult. */
|
9601 |
|
|
if (! host_integerp (bit_position (decl), 0))
|
9602 |
|
|
return 0;
|
9603 |
|
|
|
9604 |
|
|
bitpos_int = int_bit_position (decl);
|
9605 |
|
|
|
9606 |
|
|
/* If we don't know the size of the field, pretend it's a full word. */
|
9607 |
|
|
if (host_integerp (field_size_tree, 1))
|
9608 |
|
|
field_size_in_bits = tree_low_cst (field_size_tree, 1);
|
9609 |
|
|
else
|
9610 |
|
|
field_size_in_bits = BITS_PER_WORD;
|
9611 |
|
|
|
9612 |
|
|
type_size_in_bits = simple_type_size_in_bits (type);
|
9613 |
|
|
type_align_in_bits = simple_type_align_in_bits (type);
|
9614 |
|
|
decl_align_in_bits = simple_decl_align_in_bits (decl);
|
9615 |
|
|
|
9616 |
|
|
/* The GCC front-end doesn't make any attempt to keep track of the starting
|
9617 |
|
|
bit offset (relative to the start of the containing structure type) of the
|
9618 |
|
|
hypothetical "containing object" for a bit-field. Thus, when computing
|
9619 |
|
|
the byte offset value for the start of the "containing object" of a
|
9620 |
|
|
bit-field, we must deduce this information on our own. This can be rather
|
9621 |
|
|
tricky to do in some cases. For example, handling the following structure
|
9622 |
|
|
type definition when compiling for an i386/i486 target (which only aligns
|
9623 |
|
|
long long's to 32-bit boundaries) can be very tricky:
|
9624 |
|
|
|
9625 |
|
|
struct S { int field1; long long field2:31; };
|
9626 |
|
|
|
9627 |
|
|
Fortunately, there is a simple rule-of-thumb which can be used in such
|
9628 |
|
|
cases. When compiling for an i386/i486, GCC will allocate 8 bytes for the
|
9629 |
|
|
structure shown above. It decides to do this based upon one simple rule
|
9630 |
|
|
for bit-field allocation. GCC allocates each "containing object" for each
|
9631 |
|
|
bit-field at the first (i.e. lowest addressed) legitimate alignment
|
9632 |
|
|
boundary (based upon the required minimum alignment for the declared type
|
9633 |
|
|
of the field) which it can possibly use, subject to the condition that
|
9634 |
|
|
there is still enough available space remaining in the containing object
|
9635 |
|
|
(when allocated at the selected point) to fully accommodate all of the
|
9636 |
|
|
bits of the bit-field itself.
|
9637 |
|
|
|
9638 |
|
|
This simple rule makes it obvious why GCC allocates 8 bytes for each
|
9639 |
|
|
object of the structure type shown above. When looking for a place to
|
9640 |
|
|
allocate the "containing object" for `field2', the compiler simply tries
|
9641 |
|
|
to allocate a 64-bit "containing object" at each successive 32-bit
|
9642 |
|
|
boundary (starting at zero) until it finds a place to allocate that 64-
|
9643 |
|
|
bit field such that at least 31 contiguous (and previously unallocated)
|
9644 |
|
|
bits remain within that selected 64 bit field. (As it turns out, for the
|
9645 |
|
|
example above, the compiler finds it is OK to allocate the "containing
|
9646 |
|
|
object" 64-bit field at bit-offset zero within the structure type.)
|
9647 |
|
|
|
9648 |
|
|
Here we attempt to work backwards from the limited set of facts we're
|
9649 |
|
|
given, and we try to deduce from those facts, where GCC must have believed
|
9650 |
|
|
that the containing object started (within the structure type). The value
|
9651 |
|
|
we deduce is then used (by the callers of this routine) to generate
|
9652 |
|
|
DW_AT_location and DW_AT_bit_offset attributes for fields (both bit-fields
|
9653 |
|
|
and, in the case of DW_AT_location, regular fields as well). */
|
9654 |
|
|
|
9655 |
|
|
/* Figure out the bit-distance from the start of the structure to the
|
9656 |
|
|
"deepest" bit of the bit-field. */
|
9657 |
|
|
deepest_bitpos = bitpos_int + field_size_in_bits;
|
9658 |
|
|
|
9659 |
|
|
/* This is the tricky part. Use some fancy footwork to deduce where the
|
9660 |
|
|
lowest addressed bit of the containing object must be. */
|
9661 |
|
|
object_offset_in_bits = deepest_bitpos - type_size_in_bits;
|
9662 |
|
|
|
9663 |
|
|
/* Round up to type_align by default. This works best for bitfields. */
|
9664 |
|
|
object_offset_in_bits += type_align_in_bits - 1;
|
9665 |
|
|
object_offset_in_bits /= type_align_in_bits;
|
9666 |
|
|
object_offset_in_bits *= type_align_in_bits;
|
9667 |
|
|
|
9668 |
|
|
if (object_offset_in_bits > bitpos_int)
|
9669 |
|
|
{
|
9670 |
|
|
/* Sigh, the decl must be packed. */
|
9671 |
|
|
object_offset_in_bits = deepest_bitpos - type_size_in_bits;
|
9672 |
|
|
|
9673 |
|
|
/* Round up to decl_align instead. */
|
9674 |
|
|
object_offset_in_bits += decl_align_in_bits - 1;
|
9675 |
|
|
object_offset_in_bits /= decl_align_in_bits;
|
9676 |
|
|
object_offset_in_bits *= decl_align_in_bits;
|
9677 |
|
|
}
|
9678 |
|
|
|
9679 |
|
|
return object_offset_in_bits / BITS_PER_UNIT;
|
9680 |
|
|
}
|
9681 |
|
|
|
9682 |
|
|
/* The following routines define various Dwarf attributes and any data
|
9683 |
|
|
associated with them. */
|
9684 |
|
|
|
9685 |
|
|
/* Add a location description attribute value to a DIE.
|
9686 |
|
|
|
9687 |
|
|
This emits location attributes suitable for whole variables and
|
9688 |
|
|
whole parameters. Note that the location attributes for struct fields are
|
9689 |
|
|
generated by the routine `data_member_location_attribute' below. */
|
9690 |
|
|
|
9691 |
|
|
static inline void
|
9692 |
|
|
add_AT_location_description (dw_die_ref die, enum dwarf_attribute attr_kind,
|
9693 |
|
|
dw_loc_descr_ref descr)
|
9694 |
|
|
{
|
9695 |
|
|
if (descr != 0)
|
9696 |
|
|
add_AT_loc (die, attr_kind, descr);
|
9697 |
|
|
}
|
9698 |
|
|
|
9699 |
|
|
/* Attach the specialized form of location attribute used for data members of
|
9700 |
|
|
struct and union types. In the special case of a FIELD_DECL node which
|
9701 |
|
|
represents a bit-field, the "offset" part of this special location
|
9702 |
|
|
descriptor must indicate the distance in bytes from the lowest-addressed
|
9703 |
|
|
byte of the containing struct or union type to the lowest-addressed byte of
|
9704 |
|
|
the "containing object" for the bit-field. (See the `field_byte_offset'
|
9705 |
|
|
function above).
|
9706 |
|
|
|
9707 |
|
|
For any given bit-field, the "containing object" is a hypothetical object
|
9708 |
|
|
(of some integral or enum type) within which the given bit-field lives. The
|
9709 |
|
|
type of this hypothetical "containing object" is always the same as the
|
9710 |
|
|
declared type of the individual bit-field itself (for GCC anyway... the
|
9711 |
|
|
DWARF spec doesn't actually mandate this). Note that it is the size (in
|
9712 |
|
|
bytes) of the hypothetical "containing object" which will be given in the
|
9713 |
|
|
DW_AT_byte_size attribute for this bit-field. (See the
|
9714 |
|
|
`byte_size_attribute' function below.) It is also used when calculating the
|
9715 |
|
|
value of the DW_AT_bit_offset attribute. (See the `bit_offset_attribute'
|
9716 |
|
|
function below.) */
|
9717 |
|
|
|
9718 |
|
|
static void
|
9719 |
|
|
add_data_member_location_attribute (dw_die_ref die, tree decl)
|
9720 |
|
|
{
|
9721 |
|
|
HOST_WIDE_INT offset;
|
9722 |
|
|
dw_loc_descr_ref loc_descr = 0;
|
9723 |
|
|
|
9724 |
|
|
if (TREE_CODE (decl) == TREE_BINFO)
|
9725 |
|
|
{
|
9726 |
|
|
/* We're working on the TAG_inheritance for a base class. */
|
9727 |
|
|
if (BINFO_VIRTUAL_P (decl) && is_cxx ())
|
9728 |
|
|
{
|
9729 |
|
|
/* For C++ virtual bases we can't just use BINFO_OFFSET, as they
|
9730 |
|
|
aren't at a fixed offset from all (sub)objects of the same
|
9731 |
|
|
type. We need to extract the appropriate offset from our
|
9732 |
|
|
vtable. The following dwarf expression means
|
9733 |
|
|
|
9734 |
|
|
BaseAddr = ObAddr + *((*ObAddr) - Offset)
|
9735 |
|
|
|
9736 |
|
|
This is specific to the V3 ABI, of course. */
|
9737 |
|
|
|
9738 |
|
|
dw_loc_descr_ref tmp;
|
9739 |
|
|
|
9740 |
|
|
/* Make a copy of the object address. */
|
9741 |
|
|
tmp = new_loc_descr (DW_OP_dup, 0, 0);
|
9742 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9743 |
|
|
|
9744 |
|
|
/* Extract the vtable address. */
|
9745 |
|
|
tmp = new_loc_descr (DW_OP_deref, 0, 0);
|
9746 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9747 |
|
|
|
9748 |
|
|
/* Calculate the address of the offset. */
|
9749 |
|
|
offset = tree_low_cst (BINFO_VPTR_FIELD (decl), 0);
|
9750 |
|
|
gcc_assert (offset < 0);
|
9751 |
|
|
|
9752 |
|
|
tmp = int_loc_descriptor (-offset);
|
9753 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9754 |
|
|
tmp = new_loc_descr (DW_OP_minus, 0, 0);
|
9755 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9756 |
|
|
|
9757 |
|
|
/* Extract the offset. */
|
9758 |
|
|
tmp = new_loc_descr (DW_OP_deref, 0, 0);
|
9759 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9760 |
|
|
|
9761 |
|
|
/* Add it to the object address. */
|
9762 |
|
|
tmp = new_loc_descr (DW_OP_plus, 0, 0);
|
9763 |
|
|
add_loc_descr (&loc_descr, tmp);
|
9764 |
|
|
}
|
9765 |
|
|
else
|
9766 |
|
|
offset = tree_low_cst (BINFO_OFFSET (decl), 0);
|
9767 |
|
|
}
|
9768 |
|
|
else
|
9769 |
|
|
offset = field_byte_offset (decl);
|
9770 |
|
|
|
9771 |
|
|
if (! loc_descr)
|
9772 |
|
|
{
|
9773 |
|
|
enum dwarf_location_atom op;
|
9774 |
|
|
|
9775 |
|
|
/* The DWARF2 standard says that we should assume that the structure
|
9776 |
|
|
address is already on the stack, so we can specify a structure field
|
9777 |
|
|
address by using DW_OP_plus_uconst. */
|
9778 |
|
|
|
9779 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
9780 |
|
|
/* ??? The SGI dwarf reader does not handle the DW_OP_plus_uconst
|
9781 |
|
|
operator correctly. It works only if we leave the offset on the
|
9782 |
|
|
stack. */
|
9783 |
|
|
op = DW_OP_constu;
|
9784 |
|
|
#else
|
9785 |
|
|
op = DW_OP_plus_uconst;
|
9786 |
|
|
#endif
|
9787 |
|
|
|
9788 |
|
|
loc_descr = new_loc_descr (op, offset, 0);
|
9789 |
|
|
}
|
9790 |
|
|
|
9791 |
|
|
add_AT_loc (die, DW_AT_data_member_location, loc_descr);
|
9792 |
|
|
}
|
9793 |
|
|
|
9794 |
|
|
/* Writes integer values to dw_vec_const array. */
|
9795 |
|
|
|
9796 |
|
|
static void
|
9797 |
|
|
insert_int (HOST_WIDE_INT val, unsigned int size, unsigned char *dest)
|
9798 |
|
|
{
|
9799 |
|
|
while (size != 0)
|
9800 |
|
|
{
|
9801 |
|
|
*dest++ = val & 0xff;
|
9802 |
|
|
val >>= 8;
|
9803 |
|
|
--size;
|
9804 |
|
|
}
|
9805 |
|
|
}
|
9806 |
|
|
|
9807 |
|
|
/* Reads integers from dw_vec_const array. Inverse of insert_int. */
|
9808 |
|
|
|
9809 |
|
|
static HOST_WIDE_INT
|
9810 |
|
|
extract_int (const unsigned char *src, unsigned int size)
|
9811 |
|
|
{
|
9812 |
|
|
HOST_WIDE_INT val = 0;
|
9813 |
|
|
|
9814 |
|
|
src += size;
|
9815 |
|
|
while (size != 0)
|
9816 |
|
|
{
|
9817 |
|
|
val <<= 8;
|
9818 |
|
|
val |= *--src & 0xff;
|
9819 |
|
|
--size;
|
9820 |
|
|
}
|
9821 |
|
|
return val;
|
9822 |
|
|
}
|
9823 |
|
|
|
9824 |
|
|
/* Writes floating point values to dw_vec_const array. */
|
9825 |
|
|
|
9826 |
|
|
static void
|
9827 |
|
|
insert_float (rtx rtl, unsigned char *array)
|
9828 |
|
|
{
|
9829 |
|
|
REAL_VALUE_TYPE rv;
|
9830 |
|
|
long val[4];
|
9831 |
|
|
int i;
|
9832 |
|
|
|
9833 |
|
|
REAL_VALUE_FROM_CONST_DOUBLE (rv, rtl);
|
9834 |
|
|
real_to_target (val, &rv, GET_MODE (rtl));
|
9835 |
|
|
|
9836 |
|
|
/* real_to_target puts 32-bit pieces in each long. Pack them. */
|
9837 |
|
|
for (i = 0; i < GET_MODE_SIZE (GET_MODE (rtl)) / 4; i++)
|
9838 |
|
|
{
|
9839 |
|
|
insert_int (val[i], 4, array);
|
9840 |
|
|
array += 4;
|
9841 |
|
|
}
|
9842 |
|
|
}
|
9843 |
|
|
|
9844 |
|
|
/* Attach a DW_AT_const_value attribute for a variable or a parameter which
|
9845 |
|
|
does not have a "location" either in memory or in a register. These
|
9846 |
|
|
things can arise in GNU C when a constant is passed as an actual parameter
|
9847 |
|
|
to an inlined function. They can also arise in C++ where declared
|
9848 |
|
|
constants do not necessarily get memory "homes". */
|
9849 |
|
|
|
9850 |
|
|
static void
|
9851 |
|
|
add_const_value_attribute (dw_die_ref die, rtx rtl)
|
9852 |
|
|
{
|
9853 |
|
|
switch (GET_CODE (rtl))
|
9854 |
|
|
{
|
9855 |
|
|
case CONST_INT:
|
9856 |
|
|
{
|
9857 |
|
|
HOST_WIDE_INT val = INTVAL (rtl);
|
9858 |
|
|
|
9859 |
|
|
if (val < 0)
|
9860 |
|
|
add_AT_int (die, DW_AT_const_value, val);
|
9861 |
|
|
else
|
9862 |
|
|
add_AT_unsigned (die, DW_AT_const_value, (unsigned HOST_WIDE_INT) val);
|
9863 |
|
|
}
|
9864 |
|
|
break;
|
9865 |
|
|
|
9866 |
|
|
case CONST_DOUBLE:
|
9867 |
|
|
/* Note that a CONST_DOUBLE rtx could represent either an integer or a
|
9868 |
|
|
floating-point constant. A CONST_DOUBLE is used whenever the
|
9869 |
|
|
constant requires more than one word in order to be adequately
|
9870 |
|
|
represented. We output CONST_DOUBLEs as blocks. */
|
9871 |
|
|
{
|
9872 |
|
|
enum machine_mode mode = GET_MODE (rtl);
|
9873 |
|
|
|
9874 |
|
|
if (SCALAR_FLOAT_MODE_P (mode))
|
9875 |
|
|
{
|
9876 |
|
|
unsigned int length = GET_MODE_SIZE (mode);
|
9877 |
|
|
unsigned char *array = ggc_alloc (length);
|
9878 |
|
|
|
9879 |
|
|
insert_float (rtl, array);
|
9880 |
|
|
add_AT_vec (die, DW_AT_const_value, length / 4, 4, array);
|
9881 |
|
|
}
|
9882 |
|
|
else
|
9883 |
|
|
{
|
9884 |
|
|
/* ??? We really should be using HOST_WIDE_INT throughout. */
|
9885 |
|
|
gcc_assert (HOST_BITS_PER_LONG == HOST_BITS_PER_WIDE_INT);
|
9886 |
|
|
|
9887 |
|
|
add_AT_long_long (die, DW_AT_const_value,
|
9888 |
|
|
CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl));
|
9889 |
|
|
}
|
9890 |
|
|
}
|
9891 |
|
|
break;
|
9892 |
|
|
|
9893 |
|
|
case CONST_VECTOR:
|
9894 |
|
|
{
|
9895 |
|
|
enum machine_mode mode = GET_MODE (rtl);
|
9896 |
|
|
unsigned int elt_size = GET_MODE_UNIT_SIZE (mode);
|
9897 |
|
|
unsigned int length = CONST_VECTOR_NUNITS (rtl);
|
9898 |
|
|
unsigned char *array = ggc_alloc (length * elt_size);
|
9899 |
|
|
unsigned int i;
|
9900 |
|
|
unsigned char *p;
|
9901 |
|
|
|
9902 |
|
|
switch (GET_MODE_CLASS (mode))
|
9903 |
|
|
{
|
9904 |
|
|
case MODE_VECTOR_INT:
|
9905 |
|
|
for (i = 0, p = array; i < length; i++, p += elt_size)
|
9906 |
|
|
{
|
9907 |
|
|
rtx elt = CONST_VECTOR_ELT (rtl, i);
|
9908 |
|
|
HOST_WIDE_INT lo, hi;
|
9909 |
|
|
|
9910 |
|
|
switch (GET_CODE (elt))
|
9911 |
|
|
{
|
9912 |
|
|
case CONST_INT:
|
9913 |
|
|
lo = INTVAL (elt);
|
9914 |
|
|
hi = -(lo < 0);
|
9915 |
|
|
break;
|
9916 |
|
|
|
9917 |
|
|
case CONST_DOUBLE:
|
9918 |
|
|
lo = CONST_DOUBLE_LOW (elt);
|
9919 |
|
|
hi = CONST_DOUBLE_HIGH (elt);
|
9920 |
|
|
break;
|
9921 |
|
|
|
9922 |
|
|
default:
|
9923 |
|
|
gcc_unreachable ();
|
9924 |
|
|
}
|
9925 |
|
|
|
9926 |
|
|
if (elt_size <= sizeof (HOST_WIDE_INT))
|
9927 |
|
|
insert_int (lo, elt_size, p);
|
9928 |
|
|
else
|
9929 |
|
|
{
|
9930 |
|
|
unsigned char *p0 = p;
|
9931 |
|
|
unsigned char *p1 = p + sizeof (HOST_WIDE_INT);
|
9932 |
|
|
|
9933 |
|
|
gcc_assert (elt_size == 2 * sizeof (HOST_WIDE_INT));
|
9934 |
|
|
if (WORDS_BIG_ENDIAN)
|
9935 |
|
|
{
|
9936 |
|
|
p0 = p1;
|
9937 |
|
|
p1 = p;
|
9938 |
|
|
}
|
9939 |
|
|
insert_int (lo, sizeof (HOST_WIDE_INT), p0);
|
9940 |
|
|
insert_int (hi, sizeof (HOST_WIDE_INT), p1);
|
9941 |
|
|
}
|
9942 |
|
|
}
|
9943 |
|
|
break;
|
9944 |
|
|
|
9945 |
|
|
case MODE_VECTOR_FLOAT:
|
9946 |
|
|
for (i = 0, p = array; i < length; i++, p += elt_size)
|
9947 |
|
|
{
|
9948 |
|
|
rtx elt = CONST_VECTOR_ELT (rtl, i);
|
9949 |
|
|
insert_float (elt, p);
|
9950 |
|
|
}
|
9951 |
|
|
break;
|
9952 |
|
|
|
9953 |
|
|
default:
|
9954 |
|
|
gcc_unreachable ();
|
9955 |
|
|
}
|
9956 |
|
|
|
9957 |
|
|
add_AT_vec (die, DW_AT_const_value, length, elt_size, array);
|
9958 |
|
|
}
|
9959 |
|
|
break;
|
9960 |
|
|
|
9961 |
|
|
case CONST_STRING:
|
9962 |
|
|
add_AT_string (die, DW_AT_const_value, XSTR (rtl, 0));
|
9963 |
|
|
break;
|
9964 |
|
|
|
9965 |
|
|
case SYMBOL_REF:
|
9966 |
|
|
case LABEL_REF:
|
9967 |
|
|
case CONST:
|
9968 |
|
|
add_AT_addr (die, DW_AT_const_value, rtl);
|
9969 |
|
|
VEC_safe_push (rtx, gc, used_rtx_array, rtl);
|
9970 |
|
|
break;
|
9971 |
|
|
|
9972 |
|
|
case PLUS:
|
9973 |
|
|
/* In cases where an inlined instance of an inline function is passed
|
9974 |
|
|
the address of an `auto' variable (which is local to the caller) we
|
9975 |
|
|
can get a situation where the DECL_RTL of the artificial local
|
9976 |
|
|
variable (for the inlining) which acts as a stand-in for the
|
9977 |
|
|
corresponding formal parameter (of the inline function) will look
|
9978 |
|
|
like (plus:SI (reg:SI FRAME_PTR) (const_int ...)). This is not
|
9979 |
|
|
exactly a compile-time constant expression, but it isn't the address
|
9980 |
|
|
of the (artificial) local variable either. Rather, it represents the
|
9981 |
|
|
*value* which the artificial local variable always has during its
|
9982 |
|
|
lifetime. We currently have no way to represent such quasi-constant
|
9983 |
|
|
values in Dwarf, so for now we just punt and generate nothing. */
|
9984 |
|
|
break;
|
9985 |
|
|
|
9986 |
|
|
default:
|
9987 |
|
|
/* No other kinds of rtx should be possible here. */
|
9988 |
|
|
gcc_unreachable ();
|
9989 |
|
|
}
|
9990 |
|
|
|
9991 |
|
|
}
|
9992 |
|
|
|
9993 |
|
|
/* Determine whether the evaluation of EXPR references any variables
|
9994 |
|
|
or functions which aren't otherwise used (and therefore may not be
|
9995 |
|
|
output). */
|
9996 |
|
|
static tree
|
9997 |
|
|
reference_to_unused (tree * tp, int * walk_subtrees,
|
9998 |
|
|
void * data ATTRIBUTE_UNUSED)
|
9999 |
|
|
{
|
10000 |
|
|
if (! EXPR_P (*tp) && ! CONSTANT_CLASS_P (*tp))
|
10001 |
|
|
*walk_subtrees = 0;
|
10002 |
|
|
|
10003 |
|
|
if (DECL_P (*tp) && ! TREE_PUBLIC (*tp) && ! TREE_USED (*tp)
|
10004 |
|
|
&& ! TREE_ASM_WRITTEN (*tp))
|
10005 |
|
|
return *tp;
|
10006 |
|
|
else if (!flag_unit_at_a_time)
|
10007 |
|
|
return NULL_TREE;
|
10008 |
|
|
else if (!cgraph_global_info_ready
|
10009 |
|
|
&& (TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == FUNCTION_DECL))
|
10010 |
|
|
gcc_unreachable ();
|
10011 |
|
|
else if (DECL_P (*tp) && TREE_CODE (*tp) == VAR_DECL)
|
10012 |
|
|
{
|
10013 |
|
|
struct cgraph_varpool_node *node = cgraph_varpool_node (*tp);
|
10014 |
|
|
if (!node->needed)
|
10015 |
|
|
return *tp;
|
10016 |
|
|
}
|
10017 |
|
|
else if (DECL_P (*tp) && TREE_CODE (*tp) == FUNCTION_DECL
|
10018 |
|
|
&& (!DECL_EXTERNAL (*tp) || DECL_DECLARED_INLINE_P (*tp)))
|
10019 |
|
|
{
|
10020 |
|
|
struct cgraph_node *node = cgraph_node (*tp);
|
10021 |
|
|
if (!node->output)
|
10022 |
|
|
return *tp;
|
10023 |
|
|
}
|
10024 |
|
|
|
10025 |
|
|
return NULL_TREE;
|
10026 |
|
|
}
|
10027 |
|
|
|
10028 |
|
|
/* Generate an RTL constant from a decl initializer INIT with decl type TYPE,
|
10029 |
|
|
for use in a later add_const_value_attribute call. */
|
10030 |
|
|
|
10031 |
|
|
static rtx
|
10032 |
|
|
rtl_for_decl_init (tree init, tree type)
|
10033 |
|
|
{
|
10034 |
|
|
rtx rtl = NULL_RTX;
|
10035 |
|
|
|
10036 |
|
|
/* If a variable is initialized with a string constant without embedded
|
10037 |
|
|
zeros, build CONST_STRING. */
|
10038 |
|
|
if (TREE_CODE (init) == STRING_CST && TREE_CODE (type) == ARRAY_TYPE)
|
10039 |
|
|
{
|
10040 |
|
|
tree enttype = TREE_TYPE (type);
|
10041 |
|
|
tree domain = TYPE_DOMAIN (type);
|
10042 |
|
|
enum machine_mode mode = TYPE_MODE (enttype);
|
10043 |
|
|
|
10044 |
|
|
if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_SIZE (mode) == 1
|
10045 |
|
|
&& domain
|
10046 |
|
|
&& integer_zerop (TYPE_MIN_VALUE (domain))
|
10047 |
|
|
&& compare_tree_int (TYPE_MAX_VALUE (domain),
|
10048 |
|
|
TREE_STRING_LENGTH (init) - 1) == 0
|
10049 |
|
|
&& ((size_t) TREE_STRING_LENGTH (init)
|
10050 |
|
|
== strlen (TREE_STRING_POINTER (init)) + 1))
|
10051 |
|
|
rtl = gen_rtx_CONST_STRING (VOIDmode,
|
10052 |
|
|
ggc_strdup (TREE_STRING_POINTER (init)));
|
10053 |
|
|
}
|
10054 |
|
|
/* Other aggregates, and complex values, could be represented using
|
10055 |
|
|
CONCAT: FIXME! */
|
10056 |
|
|
else if (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE)
|
10057 |
|
|
;
|
10058 |
|
|
/* Vectors only work if their mode is supported by the target.
|
10059 |
|
|
FIXME: generic vectors ought to work too. */
|
10060 |
|
|
else if (TREE_CODE (type) == VECTOR_TYPE && TYPE_MODE (type) == BLKmode)
|
10061 |
|
|
;
|
10062 |
|
|
/* If the initializer is something that we know will expand into an
|
10063 |
|
|
immediate RTL constant, expand it now. We must be careful not to
|
10064 |
|
|
reference variables which won't be output. */
|
10065 |
|
|
else if (initializer_constant_valid_p (init, type)
|
10066 |
|
|
&& ! walk_tree (&init, reference_to_unused, NULL, NULL))
|
10067 |
|
|
{
|
10068 |
|
|
/* Convert vector CONSTRUCTOR initializers to VECTOR_CST if
|
10069 |
|
|
possible. */
|
10070 |
|
|
if (TREE_CODE (type) == VECTOR_TYPE)
|
10071 |
|
|
switch (TREE_CODE (init))
|
10072 |
|
|
{
|
10073 |
|
|
case VECTOR_CST:
|
10074 |
|
|
break;
|
10075 |
|
|
case CONSTRUCTOR:
|
10076 |
|
|
if (TREE_CONSTANT (init))
|
10077 |
|
|
{
|
10078 |
|
|
VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (init);
|
10079 |
|
|
bool constant_p = true;
|
10080 |
|
|
tree value;
|
10081 |
|
|
unsigned HOST_WIDE_INT ix;
|
10082 |
|
|
|
10083 |
|
|
/* Even when ctor is constant, it might contain non-*_CST
|
10084 |
|
|
elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
|
10085 |
|
|
belong into VECTOR_CST nodes. */
|
10086 |
|
|
FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
|
10087 |
|
|
if (!CONSTANT_CLASS_P (value))
|
10088 |
|
|
{
|
10089 |
|
|
constant_p = false;
|
10090 |
|
|
break;
|
10091 |
|
|
}
|
10092 |
|
|
|
10093 |
|
|
if (constant_p)
|
10094 |
|
|
{
|
10095 |
|
|
init = build_vector_from_ctor (type, elts);
|
10096 |
|
|
break;
|
10097 |
|
|
}
|
10098 |
|
|
}
|
10099 |
|
|
/* FALLTHRU */
|
10100 |
|
|
|
10101 |
|
|
default:
|
10102 |
|
|
return NULL;
|
10103 |
|
|
}
|
10104 |
|
|
|
10105 |
|
|
rtl = expand_expr (init, NULL_RTX, VOIDmode, EXPAND_INITIALIZER);
|
10106 |
|
|
|
10107 |
|
|
/* If expand_expr returns a MEM, it wasn't immediate. */
|
10108 |
|
|
gcc_assert (!rtl || !MEM_P (rtl));
|
10109 |
|
|
}
|
10110 |
|
|
|
10111 |
|
|
return rtl;
|
10112 |
|
|
}
|
10113 |
|
|
|
10114 |
|
|
/* Generate RTL for the variable DECL to represent its location. */
|
10115 |
|
|
|
10116 |
|
|
static rtx
|
10117 |
|
|
rtl_for_decl_location (tree decl)
|
10118 |
|
|
{
|
10119 |
|
|
rtx rtl;
|
10120 |
|
|
|
10121 |
|
|
/* Here we have to decide where we are going to say the parameter "lives"
|
10122 |
|
|
(as far as the debugger is concerned). We only have a couple of
|
10123 |
|
|
choices. GCC provides us with DECL_RTL and with DECL_INCOMING_RTL.
|
10124 |
|
|
|
10125 |
|
|
DECL_RTL normally indicates where the parameter lives during most of the
|
10126 |
|
|
activation of the function. If optimization is enabled however, this
|
10127 |
|
|
could be either NULL or else a pseudo-reg. Both of those cases indicate
|
10128 |
|
|
that the parameter doesn't really live anywhere (as far as the code
|
10129 |
|
|
generation parts of GCC are concerned) during most of the function's
|
10130 |
|
|
activation. That will happen (for example) if the parameter is never
|
10131 |
|
|
referenced within the function.
|
10132 |
|
|
|
10133 |
|
|
We could just generate a location descriptor here for all non-NULL
|
10134 |
|
|
non-pseudo values of DECL_RTL and ignore all of the rest, but we can be
|
10135 |
|
|
a little nicer than that if we also consider DECL_INCOMING_RTL in cases
|
10136 |
|
|
where DECL_RTL is NULL or is a pseudo-reg.
|
10137 |
|
|
|
10138 |
|
|
Note however that we can only get away with using DECL_INCOMING_RTL as
|
10139 |
|
|
a backup substitute for DECL_RTL in certain limited cases. In cases
|
10140 |
|
|
where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl),
|
10141 |
|
|
we can be sure that the parameter was passed using the same type as it is
|
10142 |
|
|
declared to have within the function, and that its DECL_INCOMING_RTL
|
10143 |
|
|
points us to a place where a value of that type is passed.
|
10144 |
|
|
|
10145 |
|
|
In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different,
|
10146 |
|
|
we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL
|
10147 |
|
|
because in these cases DECL_INCOMING_RTL points us to a value of some
|
10148 |
|
|
type which is *different* from the type of the parameter itself. Thus,
|
10149 |
|
|
if we tried to use DECL_INCOMING_RTL to generate a location attribute in
|
10150 |
|
|
such cases, the debugger would end up (for example) trying to fetch a
|
10151 |
|
|
`float' from a place which actually contains the first part of a
|
10152 |
|
|
`double'. That would lead to really incorrect and confusing
|
10153 |
|
|
output at debug-time.
|
10154 |
|
|
|
10155 |
|
|
So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL
|
10156 |
|
|
in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl). There
|
10157 |
|
|
are a couple of exceptions however. On little-endian machines we can
|
10158 |
|
|
get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is
|
10159 |
|
|
not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is
|
10160 |
|
|
an integral type that is smaller than TREE_TYPE (decl). These cases arise
|
10161 |
|
|
when (on a little-endian machine) a non-prototyped function has a
|
10162 |
|
|
parameter declared to be of type `short' or `char'. In such cases,
|
10163 |
|
|
TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will
|
10164 |
|
|
be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
|
10165 |
|
|
passed `int' value. If the debugger then uses that address to fetch
|
10166 |
|
|
a `short' or a `char' (on a little-endian machine) the result will be
|
10167 |
|
|
the correct data, so we allow for such exceptional cases below.
|
10168 |
|
|
|
10169 |
|
|
Note that our goal here is to describe the place where the given formal
|
10170 |
|
|
parameter lives during most of the function's activation (i.e. between the
|
10171 |
|
|
end of the prologue and the start of the epilogue). We'll do that as best
|
10172 |
|
|
as we can. Note however that if the given formal parameter is modified
|
10173 |
|
|
sometime during the execution of the function, then a stack backtrace (at
|
10174 |
|
|
debug-time) will show the function as having been called with the *new*
|
10175 |
|
|
value rather than the value which was originally passed in. This happens
|
10176 |
|
|
rarely enough that it is not a major problem, but it *is* a problem, and
|
10177 |
|
|
I'd like to fix it.
|
10178 |
|
|
|
10179 |
|
|
A future version of dwarf2out.c may generate two additional attributes for
|
10180 |
|
|
any given DW_TAG_formal_parameter DIE which will describe the "passed
|
10181 |
|
|
type" and the "passed location" for the given formal parameter in addition
|
10182 |
|
|
to the attributes we now generate to indicate the "declared type" and the
|
10183 |
|
|
"active location" for each parameter. This additional set of attributes
|
10184 |
|
|
could be used by debuggers for stack backtraces. Separately, note that
|
10185 |
|
|
sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be NULL also.
|
10186 |
|
|
This happens (for example) for inlined-instances of inline function formal
|
10187 |
|
|
parameters which are never referenced. This really shouldn't be
|
10188 |
|
|
happening. All PARM_DECL nodes should get valid non-NULL
|
10189 |
|
|
DECL_INCOMING_RTL values. FIXME. */
|
10190 |
|
|
|
10191 |
|
|
/* Use DECL_RTL as the "location" unless we find something better. */
|
10192 |
|
|
rtl = DECL_RTL_IF_SET (decl);
|
10193 |
|
|
|
10194 |
|
|
/* When generating abstract instances, ignore everything except
|
10195 |
|
|
constants, symbols living in memory, and symbols living in
|
10196 |
|
|
fixed registers. */
|
10197 |
|
|
if (! reload_completed)
|
10198 |
|
|
{
|
10199 |
|
|
if (rtl
|
10200 |
|
|
&& (CONSTANT_P (rtl)
|
10201 |
|
|
|| (MEM_P (rtl)
|
10202 |
|
|
&& CONSTANT_P (XEXP (rtl, 0)))
|
10203 |
|
|
|| (REG_P (rtl)
|
10204 |
|
|
&& TREE_CODE (decl) == VAR_DECL
|
10205 |
|
|
&& TREE_STATIC (decl))))
|
10206 |
|
|
{
|
10207 |
|
|
rtl = targetm.delegitimize_address (rtl);
|
10208 |
|
|
return rtl;
|
10209 |
|
|
}
|
10210 |
|
|
rtl = NULL_RTX;
|
10211 |
|
|
}
|
10212 |
|
|
else if (TREE_CODE (decl) == PARM_DECL)
|
10213 |
|
|
{
|
10214 |
|
|
if (rtl == NULL_RTX || is_pseudo_reg (rtl))
|
10215 |
|
|
{
|
10216 |
|
|
tree declared_type = TREE_TYPE (decl);
|
10217 |
|
|
tree passed_type = DECL_ARG_TYPE (decl);
|
10218 |
|
|
enum machine_mode dmode = TYPE_MODE (declared_type);
|
10219 |
|
|
enum machine_mode pmode = TYPE_MODE (passed_type);
|
10220 |
|
|
|
10221 |
|
|
/* This decl represents a formal parameter which was optimized out.
|
10222 |
|
|
Note that DECL_INCOMING_RTL may be NULL in here, but we handle
|
10223 |
|
|
all cases where (rtl == NULL_RTX) just below. */
|
10224 |
|
|
if (dmode == pmode)
|
10225 |
|
|
rtl = DECL_INCOMING_RTL (decl);
|
10226 |
|
|
else if (SCALAR_INT_MODE_P (dmode)
|
10227 |
|
|
&& GET_MODE_SIZE (dmode) <= GET_MODE_SIZE (pmode)
|
10228 |
|
|
&& DECL_INCOMING_RTL (decl))
|
10229 |
|
|
{
|
10230 |
|
|
rtx inc = DECL_INCOMING_RTL (decl);
|
10231 |
|
|
if (REG_P (inc))
|
10232 |
|
|
rtl = inc;
|
10233 |
|
|
else if (MEM_P (inc))
|
10234 |
|
|
{
|
10235 |
|
|
if (BYTES_BIG_ENDIAN)
|
10236 |
|
|
rtl = adjust_address_nv (inc, dmode,
|
10237 |
|
|
GET_MODE_SIZE (pmode)
|
10238 |
|
|
- GET_MODE_SIZE (dmode));
|
10239 |
|
|
else
|
10240 |
|
|
rtl = inc;
|
10241 |
|
|
}
|
10242 |
|
|
}
|
10243 |
|
|
}
|
10244 |
|
|
|
10245 |
|
|
/* If the parm was passed in registers, but lives on the stack, then
|
10246 |
|
|
make a big endian correction if the mode of the type of the
|
10247 |
|
|
parameter is not the same as the mode of the rtl. */
|
10248 |
|
|
/* ??? This is the same series of checks that are made in dbxout.c before
|
10249 |
|
|
we reach the big endian correction code there. It isn't clear if all
|
10250 |
|
|
of these checks are necessary here, but keeping them all is the safe
|
10251 |
|
|
thing to do. */
|
10252 |
|
|
else if (MEM_P (rtl)
|
10253 |
|
|
&& XEXP (rtl, 0) != const0_rtx
|
10254 |
|
|
&& ! CONSTANT_P (XEXP (rtl, 0))
|
10255 |
|
|
/* Not passed in memory. */
|
10256 |
|
|
&& !MEM_P (DECL_INCOMING_RTL (decl))
|
10257 |
|
|
/* Not passed by invisible reference. */
|
10258 |
|
|
&& (!REG_P (XEXP (rtl, 0))
|
10259 |
|
|
|| REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM
|
10260 |
|
|
|| REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM
|
10261 |
|
|
#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
|
10262 |
|
|
|| REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM
|
10263 |
|
|
#endif
|
10264 |
|
|
)
|
10265 |
|
|
/* Big endian correction check. */
|
10266 |
|
|
&& BYTES_BIG_ENDIAN
|
10267 |
|
|
&& TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl)
|
10268 |
|
|
&& (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))
|
10269 |
|
|
< UNITS_PER_WORD))
|
10270 |
|
|
{
|
10271 |
|
|
int offset = (UNITS_PER_WORD
|
10272 |
|
|
- GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))));
|
10273 |
|
|
|
10274 |
|
|
rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
|
10275 |
|
|
plus_constant (XEXP (rtl, 0), offset));
|
10276 |
|
|
}
|
10277 |
|
|
}
|
10278 |
|
|
else if (TREE_CODE (decl) == VAR_DECL
|
10279 |
|
|
&& rtl
|
10280 |
|
|
&& MEM_P (rtl)
|
10281 |
|
|
&& GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl))
|
10282 |
|
|
&& BYTES_BIG_ENDIAN)
|
10283 |
|
|
{
|
10284 |
|
|
int rsize = GET_MODE_SIZE (GET_MODE (rtl));
|
10285 |
|
|
int dsize = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)));
|
10286 |
|
|
|
10287 |
|
|
/* If a variable is declared "register" yet is smaller than
|
10288 |
|
|
a register, then if we store the variable to memory, it
|
10289 |
|
|
looks like we're storing a register-sized value, when in
|
10290 |
|
|
fact we are not. We need to adjust the offset of the
|
10291 |
|
|
storage location to reflect the actual value's bytes,
|
10292 |
|
|
else gdb will not be able to display it. */
|
10293 |
|
|
if (rsize > dsize)
|
10294 |
|
|
rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
|
10295 |
|
|
plus_constant (XEXP (rtl, 0), rsize-dsize));
|
10296 |
|
|
}
|
10297 |
|
|
|
10298 |
|
|
/* A variable with no DECL_RTL but a DECL_INITIAL is a compile-time constant,
|
10299 |
|
|
and will have been substituted directly into all expressions that use it.
|
10300 |
|
|
C does not have such a concept, but C++ and other languages do. */
|
10301 |
|
|
if (!rtl && TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
|
10302 |
|
|
rtl = rtl_for_decl_init (DECL_INITIAL (decl), TREE_TYPE (decl));
|
10303 |
|
|
|
10304 |
|
|
if (rtl)
|
10305 |
|
|
rtl = targetm.delegitimize_address (rtl);
|
10306 |
|
|
|
10307 |
|
|
/* If we don't look past the constant pool, we risk emitting a
|
10308 |
|
|
reference to a constant pool entry that isn't referenced from
|
10309 |
|
|
code, and thus is not emitted. */
|
10310 |
|
|
if (rtl)
|
10311 |
|
|
rtl = avoid_constant_pool_reference (rtl);
|
10312 |
|
|
|
10313 |
|
|
return rtl;
|
10314 |
|
|
}
|
10315 |
|
|
|
10316 |
|
|
/* We need to figure out what section we should use as the base for the
|
10317 |
|
|
address ranges where a given location is valid.
|
10318 |
|
|
1. If this particular DECL has a section associated with it, use that.
|
10319 |
|
|
2. If this function has a section associated with it, use that.
|
10320 |
|
|
3. Otherwise, use the text section.
|
10321 |
|
|
XXX: If you split a variable across multiple sections, we won't notice. */
|
10322 |
|
|
|
10323 |
|
|
static const char *
|
10324 |
|
|
secname_for_decl (tree decl)
|
10325 |
|
|
{
|
10326 |
|
|
const char *secname;
|
10327 |
|
|
|
10328 |
|
|
if (VAR_OR_FUNCTION_DECL_P (decl) && DECL_SECTION_NAME (decl))
|
10329 |
|
|
{
|
10330 |
|
|
tree sectree = DECL_SECTION_NAME (decl);
|
10331 |
|
|
secname = TREE_STRING_POINTER (sectree);
|
10332 |
|
|
}
|
10333 |
|
|
else if (current_function_decl && DECL_SECTION_NAME (current_function_decl))
|
10334 |
|
|
{
|
10335 |
|
|
tree sectree = DECL_SECTION_NAME (current_function_decl);
|
10336 |
|
|
secname = TREE_STRING_POINTER (sectree);
|
10337 |
|
|
}
|
10338 |
|
|
else if (cfun && in_cold_section_p)
|
10339 |
|
|
secname = cfun->cold_section_label;
|
10340 |
|
|
else
|
10341 |
|
|
secname = text_section_label;
|
10342 |
|
|
|
10343 |
|
|
return secname;
|
10344 |
|
|
}
|
10345 |
|
|
|
10346 |
|
|
/* Generate *either* a DW_AT_location attribute or else a DW_AT_const_value
|
10347 |
|
|
data attribute for a variable or a parameter. We generate the
|
10348 |
|
|
DW_AT_const_value attribute only in those cases where the given variable
|
10349 |
|
|
or parameter does not have a true "location" either in memory or in a
|
10350 |
|
|
register. This can happen (for example) when a constant is passed as an
|
10351 |
|
|
actual argument in a call to an inline function. (It's possible that
|
10352 |
|
|
these things can crop up in other ways also.) Note that one type of
|
10353 |
|
|
constant value which can be passed into an inlined function is a constant
|
10354 |
|
|
pointer. This can happen for example if an actual argument in an inlined
|
10355 |
|
|
function call evaluates to a compile-time constant address. */
|
10356 |
|
|
|
10357 |
|
|
static void
|
10358 |
|
|
add_location_or_const_value_attribute (dw_die_ref die, tree decl,
|
10359 |
|
|
enum dwarf_attribute attr)
|
10360 |
|
|
{
|
10361 |
|
|
rtx rtl;
|
10362 |
|
|
dw_loc_descr_ref descr;
|
10363 |
|
|
var_loc_list *loc_list;
|
10364 |
|
|
struct var_loc_node *node;
|
10365 |
|
|
if (TREE_CODE (decl) == ERROR_MARK)
|
10366 |
|
|
return;
|
10367 |
|
|
|
10368 |
|
|
gcc_assert (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL
|
10369 |
|
|
|| TREE_CODE (decl) == RESULT_DECL);
|
10370 |
|
|
|
10371 |
|
|
/* See if we possibly have multiple locations for this variable. */
|
10372 |
|
|
loc_list = lookup_decl_loc (decl);
|
10373 |
|
|
|
10374 |
|
|
/* If it truly has multiple locations, the first and last node will
|
10375 |
|
|
differ. */
|
10376 |
|
|
if (loc_list && loc_list->first != loc_list->last)
|
10377 |
|
|
{
|
10378 |
|
|
const char *endname, *secname;
|
10379 |
|
|
dw_loc_list_ref list;
|
10380 |
|
|
rtx varloc;
|
10381 |
|
|
|
10382 |
|
|
/* Now that we know what section we are using for a base,
|
10383 |
|
|
actually construct the list of locations.
|
10384 |
|
|
The first location information is what is passed to the
|
10385 |
|
|
function that creates the location list, and the remaining
|
10386 |
|
|
locations just get added on to that list.
|
10387 |
|
|
Note that we only know the start address for a location
|
10388 |
|
|
(IE location changes), so to build the range, we use
|
10389 |
|
|
the range [current location start, next location start].
|
10390 |
|
|
This means we have to special case the last node, and generate
|
10391 |
|
|
a range of [last location start, end of function label]. */
|
10392 |
|
|
|
10393 |
|
|
node = loc_list->first;
|
10394 |
|
|
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
|
10395 |
|
|
secname = secname_for_decl (decl);
|
10396 |
|
|
|
10397 |
|
|
list = new_loc_list (loc_descriptor (varloc),
|
10398 |
|
|
node->label, node->next->label, secname, 1);
|
10399 |
|
|
node = node->next;
|
10400 |
|
|
|
10401 |
|
|
for (; node->next; node = node->next)
|
10402 |
|
|
if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX)
|
10403 |
|
|
{
|
10404 |
|
|
/* The variable has a location between NODE->LABEL and
|
10405 |
|
|
NODE->NEXT->LABEL. */
|
10406 |
|
|
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
|
10407 |
|
|
add_loc_descr_to_loc_list (&list, loc_descriptor (varloc),
|
10408 |
|
|
node->label, node->next->label, secname);
|
10409 |
|
|
}
|
10410 |
|
|
|
10411 |
|
|
/* If the variable has a location at the last label
|
10412 |
|
|
it keeps its location until the end of function. */
|
10413 |
|
|
if (NOTE_VAR_LOCATION_LOC (node->var_loc_note) != NULL_RTX)
|
10414 |
|
|
{
|
10415 |
|
|
char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
|
10416 |
|
|
|
10417 |
|
|
varloc = NOTE_VAR_LOCATION (node->var_loc_note);
|
10418 |
|
|
if (!current_function_decl)
|
10419 |
|
|
endname = text_end_label;
|
10420 |
|
|
else
|
10421 |
|
|
{
|
10422 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
|
10423 |
|
|
current_function_funcdef_no);
|
10424 |
|
|
endname = ggc_strdup (label_id);
|
10425 |
|
|
}
|
10426 |
|
|
add_loc_descr_to_loc_list (&list, loc_descriptor (varloc),
|
10427 |
|
|
node->label, endname, secname);
|
10428 |
|
|
}
|
10429 |
|
|
|
10430 |
|
|
/* Finally, add the location list to the DIE, and we are done. */
|
10431 |
|
|
add_AT_loc_list (die, attr, list);
|
10432 |
|
|
return;
|
10433 |
|
|
}
|
10434 |
|
|
|
10435 |
|
|
/* Try to get some constant RTL for this decl, and use that as the value of
|
10436 |
|
|
the location. */
|
10437 |
|
|
|
10438 |
|
|
rtl = rtl_for_decl_location (decl);
|
10439 |
|
|
if (rtl && (CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING))
|
10440 |
|
|
{
|
10441 |
|
|
add_const_value_attribute (die, rtl);
|
10442 |
|
|
return;
|
10443 |
|
|
}
|
10444 |
|
|
|
10445 |
|
|
/* If we have tried to generate the location otherwise, and it
|
10446 |
|
|
didn't work out (we wouldn't be here if we did), and we have a one entry
|
10447 |
|
|
location list, try generating a location from that. */
|
10448 |
|
|
if (loc_list && loc_list->first)
|
10449 |
|
|
{
|
10450 |
|
|
node = loc_list->first;
|
10451 |
|
|
descr = loc_descriptor (NOTE_VAR_LOCATION (node->var_loc_note));
|
10452 |
|
|
if (descr)
|
10453 |
|
|
{
|
10454 |
|
|
add_AT_location_description (die, attr, descr);
|
10455 |
|
|
return;
|
10456 |
|
|
}
|
10457 |
|
|
}
|
10458 |
|
|
|
10459 |
|
|
/* We couldn't get any rtl, so try directly generating the location
|
10460 |
|
|
description from the tree. */
|
10461 |
|
|
descr = loc_descriptor_from_tree (decl);
|
10462 |
|
|
if (descr)
|
10463 |
|
|
{
|
10464 |
|
|
add_AT_location_description (die, attr, descr);
|
10465 |
|
|
return;
|
10466 |
|
|
}
|
10467 |
|
|
/* None of that worked, so it must not really have a location;
|
10468 |
|
|
try adding a constant value attribute from the DECL_INITIAL. */
|
10469 |
|
|
tree_add_const_value_attribute (die, decl);
|
10470 |
|
|
}
|
10471 |
|
|
|
10472 |
|
|
/* If we don't have a copy of this variable in memory for some reason (such
|
10473 |
|
|
as a C++ member constant that doesn't have an out-of-line definition),
|
10474 |
|
|
we should tell the debugger about the constant value. */
|
10475 |
|
|
|
10476 |
|
|
static void
|
10477 |
|
|
tree_add_const_value_attribute (dw_die_ref var_die, tree decl)
|
10478 |
|
|
{
|
10479 |
|
|
tree init = DECL_INITIAL (decl);
|
10480 |
|
|
tree type = TREE_TYPE (decl);
|
10481 |
|
|
rtx rtl;
|
10482 |
|
|
|
10483 |
|
|
if (TREE_READONLY (decl) && ! TREE_THIS_VOLATILE (decl) && init)
|
10484 |
|
|
/* OK */;
|
10485 |
|
|
else
|
10486 |
|
|
return;
|
10487 |
|
|
|
10488 |
|
|
rtl = rtl_for_decl_init (init, type);
|
10489 |
|
|
if (rtl)
|
10490 |
|
|
add_const_value_attribute (var_die, rtl);
|
10491 |
|
|
}
|
10492 |
|
|
|
10493 |
|
|
/* Convert the CFI instructions for the current function into a
|
10494 |
|
|
location list. This is used for DW_AT_frame_base when we targeting
|
10495 |
|
|
a dwarf2 consumer that does not support the dwarf3
|
10496 |
|
|
DW_OP_call_frame_cfa. OFFSET is a constant to be added to all CFA
|
10497 |
|
|
expressions. */
|
10498 |
|
|
|
10499 |
|
|
static dw_loc_list_ref
|
10500 |
|
|
convert_cfa_to_fb_loc_list (HOST_WIDE_INT offset)
|
10501 |
|
|
{
|
10502 |
|
|
dw_fde_ref fde;
|
10503 |
|
|
dw_loc_list_ref list, *list_tail;
|
10504 |
|
|
dw_cfi_ref cfi;
|
10505 |
|
|
dw_cfa_location last_cfa, next_cfa;
|
10506 |
|
|
const char *start_label, *last_label, *section;
|
10507 |
|
|
|
10508 |
|
|
fde = &fde_table[fde_table_in_use - 1];
|
10509 |
|
|
|
10510 |
|
|
section = secname_for_decl (current_function_decl);
|
10511 |
|
|
list_tail = &list;
|
10512 |
|
|
list = NULL;
|
10513 |
|
|
|
10514 |
|
|
next_cfa.reg = INVALID_REGNUM;
|
10515 |
|
|
next_cfa.offset = 0;
|
10516 |
|
|
next_cfa.indirect = 0;
|
10517 |
|
|
next_cfa.base_offset = 0;
|
10518 |
|
|
|
10519 |
|
|
start_label = fde->dw_fde_begin;
|
10520 |
|
|
|
10521 |
|
|
/* ??? Bald assumption that the CIE opcode list does not contain
|
10522 |
|
|
advance opcodes. */
|
10523 |
|
|
for (cfi = cie_cfi_head; cfi; cfi = cfi->dw_cfi_next)
|
10524 |
|
|
lookup_cfa_1 (cfi, &next_cfa);
|
10525 |
|
|
|
10526 |
|
|
last_cfa = next_cfa;
|
10527 |
|
|
last_label = start_label;
|
10528 |
|
|
|
10529 |
|
|
for (cfi = fde->dw_fde_cfi; cfi; cfi = cfi->dw_cfi_next)
|
10530 |
|
|
switch (cfi->dw_cfi_opc)
|
10531 |
|
|
{
|
10532 |
|
|
case DW_CFA_set_loc:
|
10533 |
|
|
case DW_CFA_advance_loc1:
|
10534 |
|
|
case DW_CFA_advance_loc2:
|
10535 |
|
|
case DW_CFA_advance_loc4:
|
10536 |
|
|
if (!cfa_equal_p (&last_cfa, &next_cfa))
|
10537 |
|
|
{
|
10538 |
|
|
*list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
|
10539 |
|
|
start_label, last_label, section,
|
10540 |
|
|
list == NULL);
|
10541 |
|
|
|
10542 |
|
|
list_tail = &(*list_tail)->dw_loc_next;
|
10543 |
|
|
last_cfa = next_cfa;
|
10544 |
|
|
start_label = last_label;
|
10545 |
|
|
}
|
10546 |
|
|
last_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
|
10547 |
|
|
break;
|
10548 |
|
|
|
10549 |
|
|
case DW_CFA_advance_loc:
|
10550 |
|
|
/* The encoding is complex enough that we should never emit this. */
|
10551 |
|
|
case DW_CFA_remember_state:
|
10552 |
|
|
case DW_CFA_restore_state:
|
10553 |
|
|
/* We don't handle these two in this function. It would be possible
|
10554 |
|
|
if it were to be required. */
|
10555 |
|
|
gcc_unreachable ();
|
10556 |
|
|
|
10557 |
|
|
default:
|
10558 |
|
|
lookup_cfa_1 (cfi, &next_cfa);
|
10559 |
|
|
break;
|
10560 |
|
|
}
|
10561 |
|
|
|
10562 |
|
|
if (!cfa_equal_p (&last_cfa, &next_cfa))
|
10563 |
|
|
{
|
10564 |
|
|
*list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
|
10565 |
|
|
start_label, last_label, section,
|
10566 |
|
|
list == NULL);
|
10567 |
|
|
list_tail = &(*list_tail)->dw_loc_next;
|
10568 |
|
|
start_label = last_label;
|
10569 |
|
|
}
|
10570 |
|
|
*list_tail = new_loc_list (build_cfa_loc (&next_cfa, offset),
|
10571 |
|
|
start_label, fde->dw_fde_end, section,
|
10572 |
|
|
list == NULL);
|
10573 |
|
|
|
10574 |
|
|
return list;
|
10575 |
|
|
}
|
10576 |
|
|
|
10577 |
|
|
/* Compute a displacement from the "steady-state frame pointer" to the
|
10578 |
|
|
frame base (often the same as the CFA), and store it in
|
10579 |
|
|
frame_pointer_fb_offset. OFFSET is added to the displacement
|
10580 |
|
|
before the latter is negated. */
|
10581 |
|
|
|
10582 |
|
|
static void
|
10583 |
|
|
compute_frame_pointer_to_fb_displacement (HOST_WIDE_INT offset)
|
10584 |
|
|
{
|
10585 |
|
|
rtx reg, elim;
|
10586 |
|
|
|
10587 |
|
|
#ifdef FRAME_POINTER_CFA_OFFSET
|
10588 |
|
|
reg = frame_pointer_rtx;
|
10589 |
|
|
offset += FRAME_POINTER_CFA_OFFSET (current_function_decl);
|
10590 |
|
|
#else
|
10591 |
|
|
reg = arg_pointer_rtx;
|
10592 |
|
|
offset += ARG_POINTER_CFA_OFFSET (current_function_decl);
|
10593 |
|
|
#endif
|
10594 |
|
|
|
10595 |
|
|
elim = eliminate_regs (reg, VOIDmode, NULL_RTX);
|
10596 |
|
|
if (GET_CODE (elim) == PLUS)
|
10597 |
|
|
{
|
10598 |
|
|
offset += INTVAL (XEXP (elim, 1));
|
10599 |
|
|
elim = XEXP (elim, 0);
|
10600 |
|
|
}
|
10601 |
|
|
gcc_assert (elim == (frame_pointer_needed ? hard_frame_pointer_rtx
|
10602 |
|
|
: stack_pointer_rtx));
|
10603 |
|
|
|
10604 |
|
|
frame_pointer_fb_offset = -offset;
|
10605 |
|
|
}
|
10606 |
|
|
|
10607 |
|
|
/* Generate a DW_AT_name attribute given some string value to be included as
|
10608 |
|
|
the value of the attribute. */
|
10609 |
|
|
|
10610 |
|
|
static void
|
10611 |
|
|
add_name_attribute (dw_die_ref die, const char *name_string)
|
10612 |
|
|
{
|
10613 |
|
|
if (name_string != NULL && *name_string != 0)
|
10614 |
|
|
{
|
10615 |
|
|
if (demangle_name_func)
|
10616 |
|
|
name_string = (*demangle_name_func) (name_string);
|
10617 |
|
|
|
10618 |
|
|
add_AT_string (die, DW_AT_name, name_string);
|
10619 |
|
|
}
|
10620 |
|
|
}
|
10621 |
|
|
|
10622 |
|
|
/* Generate a DW_AT_comp_dir attribute for DIE. */
|
10623 |
|
|
|
10624 |
|
|
static void
|
10625 |
|
|
add_comp_dir_attribute (dw_die_ref die)
|
10626 |
|
|
{
|
10627 |
|
|
const char *wd = get_src_pwd ();
|
10628 |
|
|
if (wd != NULL)
|
10629 |
|
|
add_AT_string (die, DW_AT_comp_dir, wd);
|
10630 |
|
|
}
|
10631 |
|
|
|
10632 |
|
|
/* Given a tree node describing an array bound (either lower or upper) output
|
10633 |
|
|
a representation for that bound. */
|
10634 |
|
|
|
10635 |
|
|
static void
|
10636 |
|
|
add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree bound)
|
10637 |
|
|
{
|
10638 |
|
|
switch (TREE_CODE (bound))
|
10639 |
|
|
{
|
10640 |
|
|
case ERROR_MARK:
|
10641 |
|
|
return;
|
10642 |
|
|
|
10643 |
|
|
/* All fixed-bounds are represented by INTEGER_CST nodes. */
|
10644 |
|
|
case INTEGER_CST:
|
10645 |
|
|
if (! host_integerp (bound, 0)
|
10646 |
|
|
|| (bound_attr == DW_AT_lower_bound
|
10647 |
|
|
&& (((is_c_family () || is_java ()) && integer_zerop (bound))
|
10648 |
|
|
|| (is_fortran () && integer_onep (bound)))))
|
10649 |
|
|
/* Use the default. */
|
10650 |
|
|
;
|
10651 |
|
|
else
|
10652 |
|
|
add_AT_unsigned (subrange_die, bound_attr, tree_low_cst (bound, 0));
|
10653 |
|
|
break;
|
10654 |
|
|
|
10655 |
|
|
case CONVERT_EXPR:
|
10656 |
|
|
case NOP_EXPR:
|
10657 |
|
|
case NON_LVALUE_EXPR:
|
10658 |
|
|
case VIEW_CONVERT_EXPR:
|
10659 |
|
|
add_bound_info (subrange_die, bound_attr, TREE_OPERAND (bound, 0));
|
10660 |
|
|
break;
|
10661 |
|
|
|
10662 |
|
|
case SAVE_EXPR:
|
10663 |
|
|
break;
|
10664 |
|
|
|
10665 |
|
|
case VAR_DECL:
|
10666 |
|
|
case PARM_DECL:
|
10667 |
|
|
case RESULT_DECL:
|
10668 |
|
|
{
|
10669 |
|
|
dw_die_ref decl_die = lookup_decl_die (bound);
|
10670 |
|
|
|
10671 |
|
|
/* ??? Can this happen, or should the variable have been bound
|
10672 |
|
|
first? Probably it can, since I imagine that we try to create
|
10673 |
|
|
the types of parameters in the order in which they exist in
|
10674 |
|
|
the list, and won't have created a forward reference to a
|
10675 |
|
|
later parameter. */
|
10676 |
|
|
if (decl_die != NULL)
|
10677 |
|
|
add_AT_die_ref (subrange_die, bound_attr, decl_die);
|
10678 |
|
|
break;
|
10679 |
|
|
}
|
10680 |
|
|
|
10681 |
|
|
default:
|
10682 |
|
|
{
|
10683 |
|
|
/* Otherwise try to create a stack operation procedure to
|
10684 |
|
|
evaluate the value of the array bound. */
|
10685 |
|
|
|
10686 |
|
|
dw_die_ref ctx, decl_die;
|
10687 |
|
|
dw_loc_descr_ref loc;
|
10688 |
|
|
|
10689 |
|
|
loc = loc_descriptor_from_tree (bound);
|
10690 |
|
|
if (loc == NULL)
|
10691 |
|
|
break;
|
10692 |
|
|
|
10693 |
|
|
if (current_function_decl == 0)
|
10694 |
|
|
ctx = comp_unit_die;
|
10695 |
|
|
else
|
10696 |
|
|
ctx = lookup_decl_die (current_function_decl);
|
10697 |
|
|
|
10698 |
|
|
decl_die = new_die (DW_TAG_variable, ctx, bound);
|
10699 |
|
|
add_AT_flag (decl_die, DW_AT_artificial, 1);
|
10700 |
|
|
add_type_attribute (decl_die, TREE_TYPE (bound), 1, 0, ctx);
|
10701 |
|
|
add_AT_loc (decl_die, DW_AT_location, loc);
|
10702 |
|
|
|
10703 |
|
|
add_AT_die_ref (subrange_die, bound_attr, decl_die);
|
10704 |
|
|
break;
|
10705 |
|
|
}
|
10706 |
|
|
}
|
10707 |
|
|
}
|
10708 |
|
|
|
10709 |
|
|
/* Note that the block of subscript information for an array type also
|
10710 |
|
|
includes information about the element type of type given array type. */
|
10711 |
|
|
|
10712 |
|
|
static void
|
10713 |
|
|
add_subscript_info (dw_die_ref type_die, tree type)
|
10714 |
|
|
{
|
10715 |
|
|
#ifndef MIPS_DEBUGGING_INFO
|
10716 |
|
|
unsigned dimension_number;
|
10717 |
|
|
#endif
|
10718 |
|
|
tree lower, upper;
|
10719 |
|
|
dw_die_ref subrange_die;
|
10720 |
|
|
|
10721 |
|
|
/* The GNU compilers represent multidimensional array types as sequences of
|
10722 |
|
|
one dimensional array types whose element types are themselves array
|
10723 |
|
|
types. Here we squish that down, so that each multidimensional array
|
10724 |
|
|
type gets only one array_type DIE in the Dwarf debugging info. The draft
|
10725 |
|
|
Dwarf specification say that we are allowed to do this kind of
|
10726 |
|
|
compression in C (because there is no difference between an array or
|
10727 |
|
|
arrays and a multidimensional array in C) but for other source languages
|
10728 |
|
|
(e.g. Ada) we probably shouldn't do this. */
|
10729 |
|
|
|
10730 |
|
|
/* ??? The SGI dwarf reader fails for multidimensional arrays with a
|
10731 |
|
|
const enum type. E.g. const enum machine_mode insn_operand_mode[2][10].
|
10732 |
|
|
We work around this by disabling this feature. See also
|
10733 |
|
|
gen_array_type_die. */
|
10734 |
|
|
#ifndef MIPS_DEBUGGING_INFO
|
10735 |
|
|
for (dimension_number = 0;
|
10736 |
|
|
TREE_CODE (type) == ARRAY_TYPE;
|
10737 |
|
|
type = TREE_TYPE (type), dimension_number++)
|
10738 |
|
|
#endif
|
10739 |
|
|
{
|
10740 |
|
|
tree domain = TYPE_DOMAIN (type);
|
10741 |
|
|
|
10742 |
|
|
/* Arrays come in three flavors: Unspecified bounds, fixed bounds,
|
10743 |
|
|
and (in GNU C only) variable bounds. Handle all three forms
|
10744 |
|
|
here. */
|
10745 |
|
|
subrange_die = new_die (DW_TAG_subrange_type, type_die, NULL);
|
10746 |
|
|
if (domain)
|
10747 |
|
|
{
|
10748 |
|
|
/* We have an array type with specified bounds. */
|
10749 |
|
|
lower = TYPE_MIN_VALUE (domain);
|
10750 |
|
|
upper = TYPE_MAX_VALUE (domain);
|
10751 |
|
|
|
10752 |
|
|
/* Define the index type. */
|
10753 |
|
|
if (TREE_TYPE (domain))
|
10754 |
|
|
{
|
10755 |
|
|
/* ??? This is probably an Ada unnamed subrange type. Ignore the
|
10756 |
|
|
TREE_TYPE field. We can't emit debug info for this
|
10757 |
|
|
because it is an unnamed integral type. */
|
10758 |
|
|
if (TREE_CODE (domain) == INTEGER_TYPE
|
10759 |
|
|
&& TYPE_NAME (domain) == NULL_TREE
|
10760 |
|
|
&& TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
|
10761 |
|
|
&& TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
|
10762 |
|
|
;
|
10763 |
|
|
else
|
10764 |
|
|
add_type_attribute (subrange_die, TREE_TYPE (domain), 0, 0,
|
10765 |
|
|
type_die);
|
10766 |
|
|
}
|
10767 |
|
|
|
10768 |
|
|
/* ??? If upper is NULL, the array has unspecified length,
|
10769 |
|
|
but it does have a lower bound. This happens with Fortran
|
10770 |
|
|
dimension arr(N:*)
|
10771 |
|
|
Since the debugger is definitely going to need to know N
|
10772 |
|
|
to produce useful results, go ahead and output the lower
|
10773 |
|
|
bound solo, and hope the debugger can cope. */
|
10774 |
|
|
|
10775 |
|
|
add_bound_info (subrange_die, DW_AT_lower_bound, lower);
|
10776 |
|
|
if (upper)
|
10777 |
|
|
add_bound_info (subrange_die, DW_AT_upper_bound, upper);
|
10778 |
|
|
}
|
10779 |
|
|
|
10780 |
|
|
/* Otherwise we have an array type with an unspecified length. The
|
10781 |
|
|
DWARF-2 spec does not say how to handle this; let's just leave out the
|
10782 |
|
|
bounds. */
|
10783 |
|
|
}
|
10784 |
|
|
}
|
10785 |
|
|
|
10786 |
|
|
static void
|
10787 |
|
|
add_byte_size_attribute (dw_die_ref die, tree tree_node)
|
10788 |
|
|
{
|
10789 |
|
|
unsigned size;
|
10790 |
|
|
|
10791 |
|
|
switch (TREE_CODE (tree_node))
|
10792 |
|
|
{
|
10793 |
|
|
case ERROR_MARK:
|
10794 |
|
|
size = 0;
|
10795 |
|
|
break;
|
10796 |
|
|
case ENUMERAL_TYPE:
|
10797 |
|
|
case RECORD_TYPE:
|
10798 |
|
|
case UNION_TYPE:
|
10799 |
|
|
case QUAL_UNION_TYPE:
|
10800 |
|
|
size = int_size_in_bytes (tree_node);
|
10801 |
|
|
break;
|
10802 |
|
|
case FIELD_DECL:
|
10803 |
|
|
/* For a data member of a struct or union, the DW_AT_byte_size is
|
10804 |
|
|
generally given as the number of bytes normally allocated for an
|
10805 |
|
|
object of the *declared* type of the member itself. This is true
|
10806 |
|
|
even for bit-fields. */
|
10807 |
|
|
size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT;
|
10808 |
|
|
break;
|
10809 |
|
|
default:
|
10810 |
|
|
gcc_unreachable ();
|
10811 |
|
|
}
|
10812 |
|
|
|
10813 |
|
|
/* Note that `size' might be -1 when we get to this point. If it is, that
|
10814 |
|
|
indicates that the byte size of the entity in question is variable. We
|
10815 |
|
|
have no good way of expressing this fact in Dwarf at the present time,
|
10816 |
|
|
so just let the -1 pass on through. */
|
10817 |
|
|
add_AT_unsigned (die, DW_AT_byte_size, size);
|
10818 |
|
|
}
|
10819 |
|
|
|
10820 |
|
|
/* For a FIELD_DECL node which represents a bit-field, output an attribute
|
10821 |
|
|
which specifies the distance in bits from the highest order bit of the
|
10822 |
|
|
"containing object" for the bit-field to the highest order bit of the
|
10823 |
|
|
bit-field itself.
|
10824 |
|
|
|
10825 |
|
|
For any given bit-field, the "containing object" is a hypothetical object
|
10826 |
|
|
(of some integral or enum type) within which the given bit-field lives. The
|
10827 |
|
|
type of this hypothetical "containing object" is always the same as the
|
10828 |
|
|
declared type of the individual bit-field itself. The determination of the
|
10829 |
|
|
exact location of the "containing object" for a bit-field is rather
|
10830 |
|
|
complicated. It's handled by the `field_byte_offset' function (above).
|
10831 |
|
|
|
10832 |
|
|
Note that it is the size (in bytes) of the hypothetical "containing object"
|
10833 |
|
|
which will be given in the DW_AT_byte_size attribute for this bit-field.
|
10834 |
|
|
(See `byte_size_attribute' above). */
|
10835 |
|
|
|
10836 |
|
|
static inline void
|
10837 |
|
|
add_bit_offset_attribute (dw_die_ref die, tree decl)
|
10838 |
|
|
{
|
10839 |
|
|
HOST_WIDE_INT object_offset_in_bytes = field_byte_offset (decl);
|
10840 |
|
|
tree type = DECL_BIT_FIELD_TYPE (decl);
|
10841 |
|
|
HOST_WIDE_INT bitpos_int;
|
10842 |
|
|
HOST_WIDE_INT highest_order_object_bit_offset;
|
10843 |
|
|
HOST_WIDE_INT highest_order_field_bit_offset;
|
10844 |
|
|
HOST_WIDE_INT unsigned bit_offset;
|
10845 |
|
|
|
10846 |
|
|
/* Must be a field and a bit field. */
|
10847 |
|
|
gcc_assert (type && TREE_CODE (decl) == FIELD_DECL);
|
10848 |
|
|
|
10849 |
|
|
/* We can't yet handle bit-fields whose offsets are variable, so if we
|
10850 |
|
|
encounter such things, just return without generating any attribute
|
10851 |
|
|
whatsoever. Likewise for variable or too large size. */
|
10852 |
|
|
if (! host_integerp (bit_position (decl), 0)
|
10853 |
|
|
|| ! host_integerp (DECL_SIZE (decl), 1))
|
10854 |
|
|
return;
|
10855 |
|
|
|
10856 |
|
|
bitpos_int = int_bit_position (decl);
|
10857 |
|
|
|
10858 |
|
|
/* Note that the bit offset is always the distance (in bits) from the
|
10859 |
|
|
highest-order bit of the "containing object" to the highest-order bit of
|
10860 |
|
|
the bit-field itself. Since the "high-order end" of any object or field
|
10861 |
|
|
is different on big-endian and little-endian machines, the computation
|
10862 |
|
|
below must take account of these differences. */
|
10863 |
|
|
highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
|
10864 |
|
|
highest_order_field_bit_offset = bitpos_int;
|
10865 |
|
|
|
10866 |
|
|
if (! BYTES_BIG_ENDIAN)
|
10867 |
|
|
{
|
10868 |
|
|
highest_order_field_bit_offset += tree_low_cst (DECL_SIZE (decl), 0);
|
10869 |
|
|
highest_order_object_bit_offset += simple_type_size_in_bits (type);
|
10870 |
|
|
}
|
10871 |
|
|
|
10872 |
|
|
bit_offset
|
10873 |
|
|
= (! BYTES_BIG_ENDIAN
|
10874 |
|
|
? highest_order_object_bit_offset - highest_order_field_bit_offset
|
10875 |
|
|
: highest_order_field_bit_offset - highest_order_object_bit_offset);
|
10876 |
|
|
|
10877 |
|
|
add_AT_unsigned (die, DW_AT_bit_offset, bit_offset);
|
10878 |
|
|
}
|
10879 |
|
|
|
10880 |
|
|
/* For a FIELD_DECL node which represents a bit field, output an attribute
|
10881 |
|
|
which specifies the length in bits of the given field. */
|
10882 |
|
|
|
10883 |
|
|
static inline void
|
10884 |
|
|
add_bit_size_attribute (dw_die_ref die, tree decl)
|
10885 |
|
|
{
|
10886 |
|
|
/* Must be a field and a bit field. */
|
10887 |
|
|
gcc_assert (TREE_CODE (decl) == FIELD_DECL
|
10888 |
|
|
&& DECL_BIT_FIELD_TYPE (decl));
|
10889 |
|
|
|
10890 |
|
|
if (host_integerp (DECL_SIZE (decl), 1))
|
10891 |
|
|
add_AT_unsigned (die, DW_AT_bit_size, tree_low_cst (DECL_SIZE (decl), 1));
|
10892 |
|
|
}
|
10893 |
|
|
|
10894 |
|
|
/* If the compiled language is ANSI C, then add a 'prototyped'
|
10895 |
|
|
attribute, if arg types are given for the parameters of a function. */
|
10896 |
|
|
|
10897 |
|
|
static inline void
|
10898 |
|
|
add_prototyped_attribute (dw_die_ref die, tree func_type)
|
10899 |
|
|
{
|
10900 |
|
|
if (get_AT_unsigned (comp_unit_die, DW_AT_language) == DW_LANG_C89
|
10901 |
|
|
&& TYPE_ARG_TYPES (func_type) != NULL)
|
10902 |
|
|
add_AT_flag (die, DW_AT_prototyped, 1);
|
10903 |
|
|
}
|
10904 |
|
|
|
10905 |
|
|
/* Add an 'abstract_origin' attribute below a given DIE. The DIE is found
|
10906 |
|
|
by looking in either the type declaration or object declaration
|
10907 |
|
|
equate table. */
|
10908 |
|
|
|
10909 |
|
|
static inline void
|
10910 |
|
|
add_abstract_origin_attribute (dw_die_ref die, tree origin)
|
10911 |
|
|
{
|
10912 |
|
|
dw_die_ref origin_die = NULL;
|
10913 |
|
|
|
10914 |
|
|
if (TREE_CODE (origin) != FUNCTION_DECL)
|
10915 |
|
|
{
|
10916 |
|
|
/* We may have gotten separated from the block for the inlined
|
10917 |
|
|
function, if we're in an exception handler or some such; make
|
10918 |
|
|
sure that the abstract function has been written out.
|
10919 |
|
|
|
10920 |
|
|
Doing this for nested functions is wrong, however; functions are
|
10921 |
|
|
distinct units, and our context might not even be inline. */
|
10922 |
|
|
tree fn = origin;
|
10923 |
|
|
|
10924 |
|
|
if (TYPE_P (fn))
|
10925 |
|
|
fn = TYPE_STUB_DECL (fn);
|
10926 |
|
|
|
10927 |
|
|
fn = decl_function_context (fn);
|
10928 |
|
|
if (fn)
|
10929 |
|
|
dwarf2out_abstract_function (fn);
|
10930 |
|
|
}
|
10931 |
|
|
|
10932 |
|
|
if (DECL_P (origin))
|
10933 |
|
|
origin_die = lookup_decl_die (origin);
|
10934 |
|
|
else if (TYPE_P (origin))
|
10935 |
|
|
origin_die = lookup_type_die (origin);
|
10936 |
|
|
|
10937 |
|
|
/* XXX: Functions that are never lowered don't always have correct block
|
10938 |
|
|
trees (in the case of java, they simply have no block tree, in some other
|
10939 |
|
|
languages). For these functions, there is nothing we can really do to
|
10940 |
|
|
output correct debug info for inlined functions in all cases. Rather
|
10941 |
|
|
than die, we'll just produce deficient debug info now, in that we will
|
10942 |
|
|
have variables without a proper abstract origin. In the future, when all
|
10943 |
|
|
functions are lowered, we should re-add a gcc_assert (origin_die)
|
10944 |
|
|
here. */
|
10945 |
|
|
|
10946 |
|
|
if (origin_die)
|
10947 |
|
|
add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
|
10948 |
|
|
}
|
10949 |
|
|
|
10950 |
|
|
/* We do not currently support the pure_virtual attribute. */
|
10951 |
|
|
|
10952 |
|
|
static inline void
|
10953 |
|
|
add_pure_or_virtual_attribute (dw_die_ref die, tree func_decl)
|
10954 |
|
|
{
|
10955 |
|
|
if (DECL_VINDEX (func_decl))
|
10956 |
|
|
{
|
10957 |
|
|
add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
|
10958 |
|
|
|
10959 |
|
|
if (host_integerp (DECL_VINDEX (func_decl), 0))
|
10960 |
|
|
add_AT_loc (die, DW_AT_vtable_elem_location,
|
10961 |
|
|
new_loc_descr (DW_OP_constu,
|
10962 |
|
|
tree_low_cst (DECL_VINDEX (func_decl), 0),
|
10963 |
|
|
0));
|
10964 |
|
|
|
10965 |
|
|
/* GNU extension: Record what type this method came from originally. */
|
10966 |
|
|
if (debug_info_level > DINFO_LEVEL_TERSE)
|
10967 |
|
|
add_AT_die_ref (die, DW_AT_containing_type,
|
10968 |
|
|
lookup_type_die (DECL_CONTEXT (func_decl)));
|
10969 |
|
|
}
|
10970 |
|
|
}
|
10971 |
|
|
|
10972 |
|
|
/* Add source coordinate attributes for the given decl. */
|
10973 |
|
|
|
10974 |
|
|
static void
|
10975 |
|
|
add_src_coords_attributes (dw_die_ref die, tree decl)
|
10976 |
|
|
{
|
10977 |
|
|
expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
|
10978 |
|
|
|
10979 |
|
|
add_AT_file (die, DW_AT_decl_file, lookup_filename (s.file));
|
10980 |
|
|
add_AT_unsigned (die, DW_AT_decl_line, s.line);
|
10981 |
|
|
}
|
10982 |
|
|
|
10983 |
|
|
/* Add a DW_AT_name attribute and source coordinate attribute for the
|
10984 |
|
|
given decl, but only if it actually has a name. */
|
10985 |
|
|
|
10986 |
|
|
static void
|
10987 |
|
|
add_name_and_src_coords_attributes (dw_die_ref die, tree decl)
|
10988 |
|
|
{
|
10989 |
|
|
tree decl_name;
|
10990 |
|
|
|
10991 |
|
|
decl_name = DECL_NAME (decl);
|
10992 |
|
|
if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
|
10993 |
|
|
{
|
10994 |
|
|
add_name_attribute (die, dwarf2_name (decl, 0));
|
10995 |
|
|
if (! DECL_ARTIFICIAL (decl))
|
10996 |
|
|
add_src_coords_attributes (die, decl);
|
10997 |
|
|
|
10998 |
|
|
if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
|
10999 |
|
|
&& TREE_PUBLIC (decl)
|
11000 |
|
|
&& DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)
|
11001 |
|
|
&& !DECL_ABSTRACT (decl)
|
11002 |
|
|
&& !(TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)))
|
11003 |
|
|
add_AT_string (die, DW_AT_MIPS_linkage_name,
|
11004 |
|
|
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
|
11005 |
|
|
}
|
11006 |
|
|
|
11007 |
|
|
#ifdef VMS_DEBUGGING_INFO
|
11008 |
|
|
/* Get the function's name, as described by its RTL. This may be different
|
11009 |
|
|
from the DECL_NAME name used in the source file. */
|
11010 |
|
|
if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
|
11011 |
|
|
{
|
11012 |
|
|
add_AT_addr (die, DW_AT_VMS_rtnbeg_pd_address,
|
11013 |
|
|
XEXP (DECL_RTL (decl), 0));
|
11014 |
|
|
VEC_safe_push (tree, gc, used_rtx_array, XEXP (DECL_RTL (decl), 0));
|
11015 |
|
|
}
|
11016 |
|
|
#endif
|
11017 |
|
|
}
|
11018 |
|
|
|
11019 |
|
|
/* Push a new declaration scope. */
|
11020 |
|
|
|
11021 |
|
|
static void
|
11022 |
|
|
push_decl_scope (tree scope)
|
11023 |
|
|
{
|
11024 |
|
|
VEC_safe_push (tree, gc, decl_scope_table, scope);
|
11025 |
|
|
}
|
11026 |
|
|
|
11027 |
|
|
/* Pop a declaration scope. */
|
11028 |
|
|
|
11029 |
|
|
static inline void
|
11030 |
|
|
pop_decl_scope (void)
|
11031 |
|
|
{
|
11032 |
|
|
VEC_pop (tree, decl_scope_table);
|
11033 |
|
|
}
|
11034 |
|
|
|
11035 |
|
|
/* Return the DIE for the scope that immediately contains this type.
|
11036 |
|
|
Non-named types get global scope. Named types nested in other
|
11037 |
|
|
types get their containing scope if it's open, or global scope
|
11038 |
|
|
otherwise. All other types (i.e. function-local named types) get
|
11039 |
|
|
the current active scope. */
|
11040 |
|
|
|
11041 |
|
|
static dw_die_ref
|
11042 |
|
|
scope_die_for (tree t, dw_die_ref context_die)
|
11043 |
|
|
{
|
11044 |
|
|
dw_die_ref scope_die = NULL;
|
11045 |
|
|
tree containing_scope;
|
11046 |
|
|
int i;
|
11047 |
|
|
|
11048 |
|
|
/* Non-types always go in the current scope. */
|
11049 |
|
|
gcc_assert (TYPE_P (t));
|
11050 |
|
|
|
11051 |
|
|
containing_scope = TYPE_CONTEXT (t);
|
11052 |
|
|
|
11053 |
|
|
/* Use the containing namespace if it was passed in (for a declaration). */
|
11054 |
|
|
if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
|
11055 |
|
|
{
|
11056 |
|
|
if (context_die == lookup_decl_die (containing_scope))
|
11057 |
|
|
/* OK */;
|
11058 |
|
|
else
|
11059 |
|
|
containing_scope = NULL_TREE;
|
11060 |
|
|
}
|
11061 |
|
|
|
11062 |
|
|
/* Ignore function type "scopes" from the C frontend. They mean that
|
11063 |
|
|
a tagged type is local to a parmlist of a function declarator, but
|
11064 |
|
|
that isn't useful to DWARF. */
|
11065 |
|
|
if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
|
11066 |
|
|
containing_scope = NULL_TREE;
|
11067 |
|
|
|
11068 |
|
|
if (containing_scope == NULL_TREE)
|
11069 |
|
|
scope_die = comp_unit_die;
|
11070 |
|
|
else if (TYPE_P (containing_scope))
|
11071 |
|
|
{
|
11072 |
|
|
/* For types, we can just look up the appropriate DIE. But
|
11073 |
|
|
first we check to see if we're in the middle of emitting it
|
11074 |
|
|
so we know where the new DIE should go. */
|
11075 |
|
|
for (i = VEC_length (tree, decl_scope_table) - 1; i >= 0; --i)
|
11076 |
|
|
if (VEC_index (tree, decl_scope_table, i) == containing_scope)
|
11077 |
|
|
break;
|
11078 |
|
|
|
11079 |
|
|
if (i < 0)
|
11080 |
|
|
{
|
11081 |
|
|
gcc_assert (debug_info_level <= DINFO_LEVEL_TERSE
|
11082 |
|
|
|| TREE_ASM_WRITTEN (containing_scope));
|
11083 |
|
|
|
11084 |
|
|
/* If none of the current dies are suitable, we get file scope. */
|
11085 |
|
|
scope_die = comp_unit_die;
|
11086 |
|
|
}
|
11087 |
|
|
else
|
11088 |
|
|
scope_die = lookup_type_die (containing_scope);
|
11089 |
|
|
}
|
11090 |
|
|
else
|
11091 |
|
|
scope_die = context_die;
|
11092 |
|
|
|
11093 |
|
|
return scope_die;
|
11094 |
|
|
}
|
11095 |
|
|
|
11096 |
|
|
/* Returns nonzero if CONTEXT_DIE is internal to a function. */
|
11097 |
|
|
|
11098 |
|
|
static inline int
|
11099 |
|
|
local_scope_p (dw_die_ref context_die)
|
11100 |
|
|
{
|
11101 |
|
|
for (; context_die; context_die = context_die->die_parent)
|
11102 |
|
|
if (context_die->die_tag == DW_TAG_inlined_subroutine
|
11103 |
|
|
|| context_die->die_tag == DW_TAG_subprogram)
|
11104 |
|
|
return 1;
|
11105 |
|
|
|
11106 |
|
|
return 0;
|
11107 |
|
|
}
|
11108 |
|
|
|
11109 |
|
|
/* Returns nonzero if CONTEXT_DIE is a class or namespace, for deciding
|
11110 |
|
|
whether or not to treat a DIE in this context as a declaration. */
|
11111 |
|
|
|
11112 |
|
|
static inline int
|
11113 |
|
|
class_or_namespace_scope_p (dw_die_ref context_die)
|
11114 |
|
|
{
|
11115 |
|
|
return (context_die
|
11116 |
|
|
&& (context_die->die_tag == DW_TAG_structure_type
|
11117 |
|
|
|| context_die->die_tag == DW_TAG_union_type
|
11118 |
|
|
|| context_die->die_tag == DW_TAG_namespace));
|
11119 |
|
|
}
|
11120 |
|
|
|
11121 |
|
|
/* Many forms of DIEs require a "type description" attribute. This
|
11122 |
|
|
routine locates the proper "type descriptor" die for the type given
|
11123 |
|
|
by 'type', and adds a DW_AT_type attribute below the given die. */
|
11124 |
|
|
|
11125 |
|
|
static void
|
11126 |
|
|
add_type_attribute (dw_die_ref object_die, tree type, int decl_const,
|
11127 |
|
|
int decl_volatile, dw_die_ref context_die)
|
11128 |
|
|
{
|
11129 |
|
|
enum tree_code code = TREE_CODE (type);
|
11130 |
|
|
dw_die_ref type_die = NULL;
|
11131 |
|
|
|
11132 |
|
|
/* ??? If this type is an unnamed subrange type of an integral or
|
11133 |
|
|
floating-point type, use the inner type. This is because we have no
|
11134 |
|
|
support for unnamed types in base_type_die. This can happen if this is
|
11135 |
|
|
an Ada subrange type. Correct solution is emit a subrange type die. */
|
11136 |
|
|
if ((code == INTEGER_TYPE || code == REAL_TYPE)
|
11137 |
|
|
&& TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
|
11138 |
|
|
type = TREE_TYPE (type), code = TREE_CODE (type);
|
11139 |
|
|
|
11140 |
|
|
if (code == ERROR_MARK
|
11141 |
|
|
/* Handle a special case. For functions whose return type is void, we
|
11142 |
|
|
generate *no* type attribute. (Note that no object may have type
|
11143 |
|
|
`void', so this only applies to function return types). */
|
11144 |
|
|
|| code == VOID_TYPE)
|
11145 |
|
|
return;
|
11146 |
|
|
|
11147 |
|
|
type_die = modified_type_die (type,
|
11148 |
|
|
decl_const || TYPE_READONLY (type),
|
11149 |
|
|
decl_volatile || TYPE_VOLATILE (type),
|
11150 |
|
|
context_die);
|
11151 |
|
|
|
11152 |
|
|
if (type_die != NULL)
|
11153 |
|
|
add_AT_die_ref (object_die, DW_AT_type, type_die);
|
11154 |
|
|
}
|
11155 |
|
|
|
11156 |
|
|
/* Given an object die, add the calling convention attribute for the
|
11157 |
|
|
function call type. */
|
11158 |
|
|
static void
|
11159 |
|
|
add_calling_convention_attribute (dw_die_ref subr_die, tree type)
|
11160 |
|
|
{
|
11161 |
|
|
enum dwarf_calling_convention value = DW_CC_normal;
|
11162 |
|
|
|
11163 |
|
|
value = targetm.dwarf_calling_convention (type);
|
11164 |
|
|
|
11165 |
|
|
/* Only add the attribute if the backend requests it, and
|
11166 |
|
|
is not DW_CC_normal. */
|
11167 |
|
|
if (value && (value != DW_CC_normal))
|
11168 |
|
|
add_AT_unsigned (subr_die, DW_AT_calling_convention, value);
|
11169 |
|
|
}
|
11170 |
|
|
|
11171 |
|
|
/* Given a tree pointer to a struct, class, union, or enum type node, return
|
11172 |
|
|
a pointer to the (string) tag name for the given type, or zero if the type
|
11173 |
|
|
was declared without a tag. */
|
11174 |
|
|
|
11175 |
|
|
static const char *
|
11176 |
|
|
type_tag (tree type)
|
11177 |
|
|
{
|
11178 |
|
|
const char *name = 0;
|
11179 |
|
|
|
11180 |
|
|
if (TYPE_NAME (type) != 0)
|
11181 |
|
|
{
|
11182 |
|
|
tree t = 0;
|
11183 |
|
|
|
11184 |
|
|
/* Find the IDENTIFIER_NODE for the type name. */
|
11185 |
|
|
if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
|
11186 |
|
|
t = TYPE_NAME (type);
|
11187 |
|
|
|
11188 |
|
|
/* The g++ front end makes the TYPE_NAME of *each* tagged type point to
|
11189 |
|
|
a TYPE_DECL node, regardless of whether or not a `typedef' was
|
11190 |
|
|
involved. */
|
11191 |
|
|
else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
|
11192 |
|
|
&& ! DECL_IGNORED_P (TYPE_NAME (type)))
|
11193 |
|
|
t = DECL_NAME (TYPE_NAME (type));
|
11194 |
|
|
|
11195 |
|
|
/* Now get the name as a string, or invent one. */
|
11196 |
|
|
if (t != 0)
|
11197 |
|
|
name = IDENTIFIER_POINTER (t);
|
11198 |
|
|
}
|
11199 |
|
|
|
11200 |
|
|
return (name == 0 || *name == '\0') ? 0 : name;
|
11201 |
|
|
}
|
11202 |
|
|
|
11203 |
|
|
/* Return the type associated with a data member, make a special check
|
11204 |
|
|
for bit field types. */
|
11205 |
|
|
|
11206 |
|
|
static inline tree
|
11207 |
|
|
member_declared_type (tree member)
|
11208 |
|
|
{
|
11209 |
|
|
return (DECL_BIT_FIELD_TYPE (member)
|
11210 |
|
|
? DECL_BIT_FIELD_TYPE (member) : TREE_TYPE (member));
|
11211 |
|
|
}
|
11212 |
|
|
|
11213 |
|
|
/* Get the decl's label, as described by its RTL. This may be different
|
11214 |
|
|
from the DECL_NAME name used in the source file. */
|
11215 |
|
|
|
11216 |
|
|
#if 0
|
11217 |
|
|
static const char *
|
11218 |
|
|
decl_start_label (tree decl)
|
11219 |
|
|
{
|
11220 |
|
|
rtx x;
|
11221 |
|
|
const char *fnname;
|
11222 |
|
|
|
11223 |
|
|
x = DECL_RTL (decl);
|
11224 |
|
|
gcc_assert (MEM_P (x));
|
11225 |
|
|
|
11226 |
|
|
x = XEXP (x, 0);
|
11227 |
|
|
gcc_assert (GET_CODE (x) == SYMBOL_REF);
|
11228 |
|
|
|
11229 |
|
|
fnname = XSTR (x, 0);
|
11230 |
|
|
return fnname;
|
11231 |
|
|
}
|
11232 |
|
|
#endif
|
11233 |
|
|
|
11234 |
|
|
/* These routines generate the internal representation of the DIE's for
|
11235 |
|
|
the compilation unit. Debugging information is collected by walking
|
11236 |
|
|
the declaration trees passed in from dwarf2out_decl(). */
|
11237 |
|
|
|
11238 |
|
|
static void
|
11239 |
|
|
gen_array_type_die (tree type, dw_die_ref context_die)
|
11240 |
|
|
{
|
11241 |
|
|
dw_die_ref scope_die = scope_die_for (type, context_die);
|
11242 |
|
|
dw_die_ref array_die;
|
11243 |
|
|
tree element_type;
|
11244 |
|
|
|
11245 |
|
|
/* ??? The SGI dwarf reader fails for array of array of enum types unless
|
11246 |
|
|
the inner array type comes before the outer array type. Thus we must
|
11247 |
|
|
call gen_type_die before we call new_die. See below also. */
|
11248 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
11249 |
|
|
gen_type_die (TREE_TYPE (type), context_die);
|
11250 |
|
|
#endif
|
11251 |
|
|
|
11252 |
|
|
array_die = new_die (DW_TAG_array_type, scope_die, type);
|
11253 |
|
|
add_name_attribute (array_die, type_tag (type));
|
11254 |
|
|
equate_type_number_to_die (type, array_die);
|
11255 |
|
|
|
11256 |
|
|
if (TREE_CODE (type) == VECTOR_TYPE)
|
11257 |
|
|
{
|
11258 |
|
|
/* The frontend feeds us a representation for the vector as a struct
|
11259 |
|
|
containing an array. Pull out the array type. */
|
11260 |
|
|
type = TREE_TYPE (TYPE_FIELDS (TYPE_DEBUG_REPRESENTATION_TYPE (type)));
|
11261 |
|
|
add_AT_flag (array_die, DW_AT_GNU_vector, 1);
|
11262 |
|
|
}
|
11263 |
|
|
|
11264 |
|
|
#if 0
|
11265 |
|
|
/* We default the array ordering. SDB will probably do
|
11266 |
|
|
the right things even if DW_AT_ordering is not present. It's not even
|
11267 |
|
|
an issue until we start to get into multidimensional arrays anyway. If
|
11268 |
|
|
SDB is ever caught doing the Wrong Thing for multi-dimensional arrays,
|
11269 |
|
|
then we'll have to put the DW_AT_ordering attribute back in. (But if
|
11270 |
|
|
and when we find out that we need to put these in, we will only do so
|
11271 |
|
|
for multidimensional arrays. */
|
11272 |
|
|
add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
|
11273 |
|
|
#endif
|
11274 |
|
|
|
11275 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
11276 |
|
|
/* The SGI compilers handle arrays of unknown bound by setting
|
11277 |
|
|
AT_declaration and not emitting any subrange DIEs. */
|
11278 |
|
|
if (! TYPE_DOMAIN (type))
|
11279 |
|
|
add_AT_flag (array_die, DW_AT_declaration, 1);
|
11280 |
|
|
else
|
11281 |
|
|
#endif
|
11282 |
|
|
add_subscript_info (array_die, type);
|
11283 |
|
|
|
11284 |
|
|
/* Add representation of the type of the elements of this array type. */
|
11285 |
|
|
element_type = TREE_TYPE (type);
|
11286 |
|
|
|
11287 |
|
|
/* ??? The SGI dwarf reader fails for multidimensional arrays with a
|
11288 |
|
|
const enum type. E.g. const enum machine_mode insn_operand_mode[2][10].
|
11289 |
|
|
We work around this by disabling this feature. See also
|
11290 |
|
|
add_subscript_info. */
|
11291 |
|
|
#ifndef MIPS_DEBUGGING_INFO
|
11292 |
|
|
while (TREE_CODE (element_type) == ARRAY_TYPE)
|
11293 |
|
|
element_type = TREE_TYPE (element_type);
|
11294 |
|
|
|
11295 |
|
|
gen_type_die (element_type, context_die);
|
11296 |
|
|
#endif
|
11297 |
|
|
|
11298 |
|
|
add_type_attribute (array_die, element_type, 0, 0, context_die);
|
11299 |
|
|
}
|
11300 |
|
|
|
11301 |
|
|
#if 0
|
11302 |
|
|
static void
|
11303 |
|
|
gen_entry_point_die (tree decl, dw_die_ref context_die)
|
11304 |
|
|
{
|
11305 |
|
|
tree origin = decl_ultimate_origin (decl);
|
11306 |
|
|
dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die, decl);
|
11307 |
|
|
|
11308 |
|
|
if (origin != NULL)
|
11309 |
|
|
add_abstract_origin_attribute (decl_die, origin);
|
11310 |
|
|
else
|
11311 |
|
|
{
|
11312 |
|
|
add_name_and_src_coords_attributes (decl_die, decl);
|
11313 |
|
|
add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
|
11314 |
|
|
0, 0, context_die);
|
11315 |
|
|
}
|
11316 |
|
|
|
11317 |
|
|
if (DECL_ABSTRACT (decl))
|
11318 |
|
|
equate_decl_number_to_die (decl, decl_die);
|
11319 |
|
|
else
|
11320 |
|
|
add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
|
11321 |
|
|
}
|
11322 |
|
|
#endif
|
11323 |
|
|
|
11324 |
|
|
/* Walk through the list of incomplete types again, trying once more to
|
11325 |
|
|
emit full debugging info for them. */
|
11326 |
|
|
|
11327 |
|
|
static void
|
11328 |
|
|
retry_incomplete_types (void)
|
11329 |
|
|
{
|
11330 |
|
|
int i;
|
11331 |
|
|
|
11332 |
|
|
for (i = VEC_length (tree, incomplete_types) - 1; i >= 0; i--)
|
11333 |
|
|
gen_type_die (VEC_index (tree, incomplete_types, i), comp_unit_die);
|
11334 |
|
|
}
|
11335 |
|
|
|
11336 |
|
|
/* Generate a DIE to represent an inlined instance of an enumeration type. */
|
11337 |
|
|
|
11338 |
|
|
static void
|
11339 |
|
|
gen_inlined_enumeration_type_die (tree type, dw_die_ref context_die)
|
11340 |
|
|
{
|
11341 |
|
|
dw_die_ref type_die = new_die (DW_TAG_enumeration_type, context_die, type);
|
11342 |
|
|
|
11343 |
|
|
/* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
|
11344 |
|
|
be incomplete and such types are not marked. */
|
11345 |
|
|
add_abstract_origin_attribute (type_die, type);
|
11346 |
|
|
}
|
11347 |
|
|
|
11348 |
|
|
/* Generate a DIE to represent an inlined instance of a structure type. */
|
11349 |
|
|
|
11350 |
|
|
static void
|
11351 |
|
|
gen_inlined_structure_type_die (tree type, dw_die_ref context_die)
|
11352 |
|
|
{
|
11353 |
|
|
dw_die_ref type_die = new_die (DW_TAG_structure_type, context_die, type);
|
11354 |
|
|
|
11355 |
|
|
/* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
|
11356 |
|
|
be incomplete and such types are not marked. */
|
11357 |
|
|
add_abstract_origin_attribute (type_die, type);
|
11358 |
|
|
}
|
11359 |
|
|
|
11360 |
|
|
/* Generate a DIE to represent an inlined instance of a union type. */
|
11361 |
|
|
|
11362 |
|
|
static void
|
11363 |
|
|
gen_inlined_union_type_die (tree type, dw_die_ref context_die)
|
11364 |
|
|
{
|
11365 |
|
|
dw_die_ref type_die = new_die (DW_TAG_union_type, context_die, type);
|
11366 |
|
|
|
11367 |
|
|
/* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
|
11368 |
|
|
be incomplete and such types are not marked. */
|
11369 |
|
|
add_abstract_origin_attribute (type_die, type);
|
11370 |
|
|
}
|
11371 |
|
|
|
11372 |
|
|
/* Generate a DIE to represent an enumeration type. Note that these DIEs
|
11373 |
|
|
include all of the information about the enumeration values also. Each
|
11374 |
|
|
enumerated type name/value is listed as a child of the enumerated type
|
11375 |
|
|
DIE. */
|
11376 |
|
|
|
11377 |
|
|
static dw_die_ref
|
11378 |
|
|
gen_enumeration_type_die (tree type, dw_die_ref context_die)
|
11379 |
|
|
{
|
11380 |
|
|
dw_die_ref type_die = lookup_type_die (type);
|
11381 |
|
|
|
11382 |
|
|
if (type_die == NULL)
|
11383 |
|
|
{
|
11384 |
|
|
type_die = new_die (DW_TAG_enumeration_type,
|
11385 |
|
|
scope_die_for (type, context_die), type);
|
11386 |
|
|
equate_type_number_to_die (type, type_die);
|
11387 |
|
|
add_name_attribute (type_die, type_tag (type));
|
11388 |
|
|
}
|
11389 |
|
|
else if (! TYPE_SIZE (type))
|
11390 |
|
|
return type_die;
|
11391 |
|
|
else
|
11392 |
|
|
remove_AT (type_die, DW_AT_declaration);
|
11393 |
|
|
|
11394 |
|
|
/* Handle a GNU C/C++ extension, i.e. incomplete enum types. If the
|
11395 |
|
|
given enum type is incomplete, do not generate the DW_AT_byte_size
|
11396 |
|
|
attribute or the DW_AT_element_list attribute. */
|
11397 |
|
|
if (TYPE_SIZE (type))
|
11398 |
|
|
{
|
11399 |
|
|
tree link;
|
11400 |
|
|
|
11401 |
|
|
TREE_ASM_WRITTEN (type) = 1;
|
11402 |
|
|
add_byte_size_attribute (type_die, type);
|
11403 |
|
|
if (TYPE_STUB_DECL (type) != NULL_TREE)
|
11404 |
|
|
add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
|
11405 |
|
|
|
11406 |
|
|
/* If the first reference to this type was as the return type of an
|
11407 |
|
|
inline function, then it may not have a parent. Fix this now. */
|
11408 |
|
|
if (type_die->die_parent == NULL)
|
11409 |
|
|
add_child_die (scope_die_for (type, context_die), type_die);
|
11410 |
|
|
|
11411 |
|
|
for (link = TYPE_VALUES (type);
|
11412 |
|
|
link != NULL; link = TREE_CHAIN (link))
|
11413 |
|
|
{
|
11414 |
|
|
dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die, link);
|
11415 |
|
|
tree value = TREE_VALUE (link);
|
11416 |
|
|
|
11417 |
|
|
add_name_attribute (enum_die,
|
11418 |
|
|
IDENTIFIER_POINTER (TREE_PURPOSE (link)));
|
11419 |
|
|
|
11420 |
|
|
if (host_integerp (value, TYPE_UNSIGNED (TREE_TYPE (value))))
|
11421 |
|
|
/* DWARF2 does not provide a way of indicating whether or
|
11422 |
|
|
not enumeration constants are signed or unsigned. GDB
|
11423 |
|
|
always assumes the values are signed, so we output all
|
11424 |
|
|
values as if they were signed. That means that
|
11425 |
|
|
enumeration constants with very large unsigned values
|
11426 |
|
|
will appear to have negative values in the debugger. */
|
11427 |
|
|
add_AT_int (enum_die, DW_AT_const_value,
|
11428 |
|
|
tree_low_cst (value, tree_int_cst_sgn (value) > 0));
|
11429 |
|
|
}
|
11430 |
|
|
}
|
11431 |
|
|
else
|
11432 |
|
|
add_AT_flag (type_die, DW_AT_declaration, 1);
|
11433 |
|
|
|
11434 |
|
|
return type_die;
|
11435 |
|
|
}
|
11436 |
|
|
|
11437 |
|
|
/* Generate a DIE to represent either a real live formal parameter decl or to
|
11438 |
|
|
represent just the type of some formal parameter position in some function
|
11439 |
|
|
type.
|
11440 |
|
|
|
11441 |
|
|
Note that this routine is a bit unusual because its argument may be a
|
11442 |
|
|
..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
|
11443 |
|
|
represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
|
11444 |
|
|
node. If it's the former then this function is being called to output a
|
11445 |
|
|
DIE to represent a formal parameter object (or some inlining thereof). If
|
11446 |
|
|
it's the latter, then this function is only being called to output a
|
11447 |
|
|
DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
|
11448 |
|
|
argument type of some subprogram type. */
|
11449 |
|
|
|
11450 |
|
|
static dw_die_ref
|
11451 |
|
|
gen_formal_parameter_die (tree node, dw_die_ref context_die)
|
11452 |
|
|
{
|
11453 |
|
|
dw_die_ref parm_die
|
11454 |
|
|
= new_die (DW_TAG_formal_parameter, context_die, node);
|
11455 |
|
|
tree origin;
|
11456 |
|
|
|
11457 |
|
|
switch (TREE_CODE_CLASS (TREE_CODE (node)))
|
11458 |
|
|
{
|
11459 |
|
|
case tcc_declaration:
|
11460 |
|
|
origin = decl_ultimate_origin (node);
|
11461 |
|
|
if (origin != NULL)
|
11462 |
|
|
add_abstract_origin_attribute (parm_die, origin);
|
11463 |
|
|
else
|
11464 |
|
|
{
|
11465 |
|
|
add_name_and_src_coords_attributes (parm_die, node);
|
11466 |
|
|
add_type_attribute (parm_die, TREE_TYPE (node),
|
11467 |
|
|
TREE_READONLY (node),
|
11468 |
|
|
TREE_THIS_VOLATILE (node),
|
11469 |
|
|
context_die);
|
11470 |
|
|
if (DECL_ARTIFICIAL (node))
|
11471 |
|
|
add_AT_flag (parm_die, DW_AT_artificial, 1);
|
11472 |
|
|
}
|
11473 |
|
|
|
11474 |
|
|
equate_decl_number_to_die (node, parm_die);
|
11475 |
|
|
if (! DECL_ABSTRACT (node))
|
11476 |
|
|
add_location_or_const_value_attribute (parm_die, node, DW_AT_location);
|
11477 |
|
|
|
11478 |
|
|
break;
|
11479 |
|
|
|
11480 |
|
|
case tcc_type:
|
11481 |
|
|
/* We were called with some kind of a ..._TYPE node. */
|
11482 |
|
|
add_type_attribute (parm_die, node, 0, 0, context_die);
|
11483 |
|
|
break;
|
11484 |
|
|
|
11485 |
|
|
default:
|
11486 |
|
|
gcc_unreachable ();
|
11487 |
|
|
}
|
11488 |
|
|
|
11489 |
|
|
return parm_die;
|
11490 |
|
|
}
|
11491 |
|
|
|
11492 |
|
|
/* Generate a special type of DIE used as a stand-in for a trailing ellipsis
|
11493 |
|
|
at the end of an (ANSI prototyped) formal parameters list. */
|
11494 |
|
|
|
11495 |
|
|
static void
|
11496 |
|
|
gen_unspecified_parameters_die (tree decl_or_type, dw_die_ref context_die)
|
11497 |
|
|
{
|
11498 |
|
|
new_die (DW_TAG_unspecified_parameters, context_die, decl_or_type);
|
11499 |
|
|
}
|
11500 |
|
|
|
11501 |
|
|
/* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
|
11502 |
|
|
DW_TAG_unspecified_parameters DIE) to represent the types of the formal
|
11503 |
|
|
parameters as specified in some function type specification (except for
|
11504 |
|
|
those which appear as part of a function *definition*). */
|
11505 |
|
|
|
11506 |
|
|
static void
|
11507 |
|
|
gen_formal_types_die (tree function_or_method_type, dw_die_ref context_die)
|
11508 |
|
|
{
|
11509 |
|
|
tree link;
|
11510 |
|
|
tree formal_type = NULL;
|
11511 |
|
|
tree first_parm_type;
|
11512 |
|
|
tree arg;
|
11513 |
|
|
|
11514 |
|
|
if (TREE_CODE (function_or_method_type) == FUNCTION_DECL)
|
11515 |
|
|
{
|
11516 |
|
|
arg = DECL_ARGUMENTS (function_or_method_type);
|
11517 |
|
|
function_or_method_type = TREE_TYPE (function_or_method_type);
|
11518 |
|
|
}
|
11519 |
|
|
else
|
11520 |
|
|
arg = NULL_TREE;
|
11521 |
|
|
|
11522 |
|
|
first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
|
11523 |
|
|
|
11524 |
|
|
/* Make our first pass over the list of formal parameter types and output a
|
11525 |
|
|
DW_TAG_formal_parameter DIE for each one. */
|
11526 |
|
|
for (link = first_parm_type; link; )
|
11527 |
|
|
{
|
11528 |
|
|
dw_die_ref parm_die;
|
11529 |
|
|
|
11530 |
|
|
formal_type = TREE_VALUE (link);
|
11531 |
|
|
if (formal_type == void_type_node)
|
11532 |
|
|
break;
|
11533 |
|
|
|
11534 |
|
|
/* Output a (nameless) DIE to represent the formal parameter itself. */
|
11535 |
|
|
parm_die = gen_formal_parameter_die (formal_type, context_die);
|
11536 |
|
|
if ((TREE_CODE (function_or_method_type) == METHOD_TYPE
|
11537 |
|
|
&& link == first_parm_type)
|
11538 |
|
|
|| (arg && DECL_ARTIFICIAL (arg)))
|
11539 |
|
|
add_AT_flag (parm_die, DW_AT_artificial, 1);
|
11540 |
|
|
|
11541 |
|
|
link = TREE_CHAIN (link);
|
11542 |
|
|
if (arg)
|
11543 |
|
|
arg = TREE_CHAIN (arg);
|
11544 |
|
|
}
|
11545 |
|
|
|
11546 |
|
|
/* If this function type has an ellipsis, add a
|
11547 |
|
|
DW_TAG_unspecified_parameters DIE to the end of the parameter list. */
|
11548 |
|
|
if (formal_type != void_type_node)
|
11549 |
|
|
gen_unspecified_parameters_die (function_or_method_type, context_die);
|
11550 |
|
|
|
11551 |
|
|
/* Make our second (and final) pass over the list of formal parameter types
|
11552 |
|
|
and output DIEs to represent those types (as necessary). */
|
11553 |
|
|
for (link = TYPE_ARG_TYPES (function_or_method_type);
|
11554 |
|
|
link && TREE_VALUE (link);
|
11555 |
|
|
link = TREE_CHAIN (link))
|
11556 |
|
|
gen_type_die (TREE_VALUE (link), context_die);
|
11557 |
|
|
}
|
11558 |
|
|
|
11559 |
|
|
/* We want to generate the DIE for TYPE so that we can generate the
|
11560 |
|
|
die for MEMBER, which has been defined; we will need to refer back
|
11561 |
|
|
to the member declaration nested within TYPE. If we're trying to
|
11562 |
|
|
generate minimal debug info for TYPE, processing TYPE won't do the
|
11563 |
|
|
trick; we need to attach the member declaration by hand. */
|
11564 |
|
|
|
11565 |
|
|
static void
|
11566 |
|
|
gen_type_die_for_member (tree type, tree member, dw_die_ref context_die)
|
11567 |
|
|
{
|
11568 |
|
|
gen_type_die (type, context_die);
|
11569 |
|
|
|
11570 |
|
|
/* If we're trying to avoid duplicate debug info, we may not have
|
11571 |
|
|
emitted the member decl for this function. Emit it now. */
|
11572 |
|
|
if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
|
11573 |
|
|
&& ! lookup_decl_die (member))
|
11574 |
|
|
{
|
11575 |
|
|
dw_die_ref type_die;
|
11576 |
|
|
gcc_assert (!decl_ultimate_origin (member));
|
11577 |
|
|
|
11578 |
|
|
push_decl_scope (type);
|
11579 |
|
|
type_die = lookup_type_die (type);
|
11580 |
|
|
if (TREE_CODE (member) == FUNCTION_DECL)
|
11581 |
|
|
gen_subprogram_die (member, type_die);
|
11582 |
|
|
else if (TREE_CODE (member) == FIELD_DECL)
|
11583 |
|
|
{
|
11584 |
|
|
/* Ignore the nameless fields that are used to skip bits but handle
|
11585 |
|
|
C++ anonymous unions and structs. */
|
11586 |
|
|
if (DECL_NAME (member) != NULL_TREE
|
11587 |
|
|
|| TREE_CODE (TREE_TYPE (member)) == UNION_TYPE
|
11588 |
|
|
|| TREE_CODE (TREE_TYPE (member)) == RECORD_TYPE)
|
11589 |
|
|
{
|
11590 |
|
|
gen_type_die (member_declared_type (member), type_die);
|
11591 |
|
|
gen_field_die (member, type_die);
|
11592 |
|
|
}
|
11593 |
|
|
}
|
11594 |
|
|
else
|
11595 |
|
|
gen_variable_die (member, type_die);
|
11596 |
|
|
|
11597 |
|
|
pop_decl_scope ();
|
11598 |
|
|
}
|
11599 |
|
|
}
|
11600 |
|
|
|
11601 |
|
|
/* Generate the DWARF2 info for the "abstract" instance of a function which we
|
11602 |
|
|
may later generate inlined and/or out-of-line instances of. */
|
11603 |
|
|
|
11604 |
|
|
static void
|
11605 |
|
|
dwarf2out_abstract_function (tree decl)
|
11606 |
|
|
{
|
11607 |
|
|
dw_die_ref old_die;
|
11608 |
|
|
tree save_fn;
|
11609 |
|
|
struct function *save_cfun;
|
11610 |
|
|
tree context;
|
11611 |
|
|
int was_abstract = DECL_ABSTRACT (decl);
|
11612 |
|
|
|
11613 |
|
|
/* Make sure we have the actual abstract inline, not a clone. */
|
11614 |
|
|
decl = DECL_ORIGIN (decl);
|
11615 |
|
|
|
11616 |
|
|
old_die = lookup_decl_die (decl);
|
11617 |
|
|
if (old_die && get_AT (old_die, DW_AT_inline))
|
11618 |
|
|
/* We've already generated the abstract instance. */
|
11619 |
|
|
return;
|
11620 |
|
|
|
11621 |
|
|
/* Be sure we've emitted the in-class declaration DIE (if any) first, so
|
11622 |
|
|
we don't get confused by DECL_ABSTRACT. */
|
11623 |
|
|
if (debug_info_level > DINFO_LEVEL_TERSE)
|
11624 |
|
|
{
|
11625 |
|
|
context = decl_class_context (decl);
|
11626 |
|
|
if (context)
|
11627 |
|
|
gen_type_die_for_member
|
11628 |
|
|
(context, decl, decl_function_context (decl) ? NULL : comp_unit_die);
|
11629 |
|
|
}
|
11630 |
|
|
|
11631 |
|
|
/* Pretend we've just finished compiling this function. */
|
11632 |
|
|
save_fn = current_function_decl;
|
11633 |
|
|
save_cfun = cfun;
|
11634 |
|
|
current_function_decl = decl;
|
11635 |
|
|
cfun = DECL_STRUCT_FUNCTION (decl);
|
11636 |
|
|
|
11637 |
|
|
set_decl_abstract_flags (decl, 1);
|
11638 |
|
|
dwarf2out_decl (decl);
|
11639 |
|
|
if (! was_abstract)
|
11640 |
|
|
set_decl_abstract_flags (decl, 0);
|
11641 |
|
|
|
11642 |
|
|
current_function_decl = save_fn;
|
11643 |
|
|
cfun = save_cfun;
|
11644 |
|
|
}
|
11645 |
|
|
|
11646 |
|
|
/* Helper function of premark_used_types() which gets called through
|
11647 |
|
|
htab_traverse_resize().
|
11648 |
|
|
|
11649 |
|
|
Marks the DIE of a given type in *SLOT as perennial, so it never gets
|
11650 |
|
|
marked as unused by prune_unused_types. */
|
11651 |
|
|
static int
|
11652 |
|
|
premark_used_types_helper (void **slot, void *data ATTRIBUTE_UNUSED)
|
11653 |
|
|
{
|
11654 |
|
|
tree type;
|
11655 |
|
|
dw_die_ref die;
|
11656 |
|
|
|
11657 |
|
|
type = *slot;
|
11658 |
|
|
die = lookup_type_die (type);
|
11659 |
|
|
if (die != NULL)
|
11660 |
|
|
die->die_perennial_p = 1;
|
11661 |
|
|
return 1;
|
11662 |
|
|
}
|
11663 |
|
|
|
11664 |
|
|
/* Mark all members of used_types_hash as perennial. */
|
11665 |
|
|
static void
|
11666 |
|
|
premark_used_types (void)
|
11667 |
|
|
{
|
11668 |
|
|
if (cfun && cfun->used_types_hash)
|
11669 |
|
|
htab_traverse (cfun->used_types_hash, premark_used_types_helper, NULL);
|
11670 |
|
|
}
|
11671 |
|
|
|
11672 |
|
|
/* Generate a DIE to represent a declared function (either file-scope or
|
11673 |
|
|
block-local). */
|
11674 |
|
|
|
11675 |
|
|
static void
|
11676 |
|
|
gen_subprogram_die (tree decl, dw_die_ref context_die)
|
11677 |
|
|
{
|
11678 |
|
|
char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
|
11679 |
|
|
tree origin = decl_ultimate_origin (decl);
|
11680 |
|
|
dw_die_ref subr_die;
|
11681 |
|
|
tree fn_arg_types;
|
11682 |
|
|
tree outer_scope;
|
11683 |
|
|
dw_die_ref old_die = lookup_decl_die (decl);
|
11684 |
|
|
int declaration = (current_function_decl != decl
|
11685 |
|
|
|| class_or_namespace_scope_p (context_die));
|
11686 |
|
|
|
11687 |
|
|
premark_used_types ();
|
11688 |
|
|
|
11689 |
|
|
/* It is possible to have both DECL_ABSTRACT and DECLARATION be true if we
|
11690 |
|
|
started to generate the abstract instance of an inline, decided to output
|
11691 |
|
|
its containing class, and proceeded to emit the declaration of the inline
|
11692 |
|
|
from the member list for the class. If so, DECLARATION takes priority;
|
11693 |
|
|
we'll get back to the abstract instance when done with the class. */
|
11694 |
|
|
|
11695 |
|
|
/* The class-scope declaration DIE must be the primary DIE. */
|
11696 |
|
|
if (origin && declaration && class_or_namespace_scope_p (context_die))
|
11697 |
|
|
{
|
11698 |
|
|
origin = NULL;
|
11699 |
|
|
gcc_assert (!old_die);
|
11700 |
|
|
}
|
11701 |
|
|
|
11702 |
|
|
/* Now that the C++ front end lazily declares artificial member fns, we
|
11703 |
|
|
might need to retrofit the declaration into its class. */
|
11704 |
|
|
if (!declaration && !origin && !old_die
|
11705 |
|
|
&& DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))
|
11706 |
|
|
&& !class_or_namespace_scope_p (context_die)
|
11707 |
|
|
&& debug_info_level > DINFO_LEVEL_TERSE)
|
11708 |
|
|
old_die = force_decl_die (decl);
|
11709 |
|
|
|
11710 |
|
|
if (origin != NULL)
|
11711 |
|
|
{
|
11712 |
|
|
gcc_assert (!declaration || local_scope_p (context_die));
|
11713 |
|
|
|
11714 |
|
|
/* Fixup die_parent for the abstract instance of a nested
|
11715 |
|
|
inline function. */
|
11716 |
|
|
if (old_die && old_die->die_parent == NULL)
|
11717 |
|
|
add_child_die (context_die, old_die);
|
11718 |
|
|
|
11719 |
|
|
subr_die = new_die (DW_TAG_subprogram, context_die, decl);
|
11720 |
|
|
add_abstract_origin_attribute (subr_die, origin);
|
11721 |
|
|
}
|
11722 |
|
|
else if (old_die)
|
11723 |
|
|
{
|
11724 |
|
|
expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
|
11725 |
|
|
struct dwarf_file_data * file_index = lookup_filename (s.file);
|
11726 |
|
|
|
11727 |
|
|
if (!get_AT_flag (old_die, DW_AT_declaration)
|
11728 |
|
|
/* We can have a normal definition following an inline one in the
|
11729 |
|
|
case of redefinition of GNU C extern inlines.
|
11730 |
|
|
It seems reasonable to use AT_specification in this case. */
|
11731 |
|
|
&& !get_AT (old_die, DW_AT_inline))
|
11732 |
|
|
{
|
11733 |
|
|
/* Detect and ignore this case, where we are trying to output
|
11734 |
|
|
something we have already output. */
|
11735 |
|
|
return;
|
11736 |
|
|
}
|
11737 |
|
|
|
11738 |
|
|
/* If the definition comes from the same place as the declaration,
|
11739 |
|
|
maybe use the old DIE. We always want the DIE for this function
|
11740 |
|
|
that has the *_pc attributes to be under comp_unit_die so the
|
11741 |
|
|
debugger can find it. We also need to do this for abstract
|
11742 |
|
|
instances of inlines, since the spec requires the out-of-line copy
|
11743 |
|
|
to have the same parent. For local class methods, this doesn't
|
11744 |
|
|
apply; we just use the old DIE. */
|
11745 |
|
|
if ((old_die->die_parent == comp_unit_die || context_die == NULL)
|
11746 |
|
|
&& (DECL_ARTIFICIAL (decl)
|
11747 |
|
|
|| (get_AT_file (old_die, DW_AT_decl_file) == file_index
|
11748 |
|
|
&& (get_AT_unsigned (old_die, DW_AT_decl_line)
|
11749 |
|
|
== (unsigned) s.line))))
|
11750 |
|
|
{
|
11751 |
|
|
subr_die = old_die;
|
11752 |
|
|
|
11753 |
|
|
/* Clear out the declaration attribute and the formal parameters.
|
11754 |
|
|
Do not remove all children, because it is possible that this
|
11755 |
|
|
declaration die was forced using force_decl_die(). In such
|
11756 |
|
|
cases die that forced declaration die (e.g. TAG_imported_module)
|
11757 |
|
|
is one of the children that we do not want to remove. */
|
11758 |
|
|
remove_AT (subr_die, DW_AT_declaration);
|
11759 |
|
|
remove_child_TAG (subr_die, DW_TAG_formal_parameter);
|
11760 |
|
|
}
|
11761 |
|
|
else
|
11762 |
|
|
{
|
11763 |
|
|
subr_die = new_die (DW_TAG_subprogram, context_die, decl);
|
11764 |
|
|
add_AT_specification (subr_die, old_die);
|
11765 |
|
|
if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
|
11766 |
|
|
add_AT_file (subr_die, DW_AT_decl_file, file_index);
|
11767 |
|
|
if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
|
11768 |
|
|
add_AT_unsigned (subr_die, DW_AT_decl_line, s.line);
|
11769 |
|
|
}
|
11770 |
|
|
}
|
11771 |
|
|
else
|
11772 |
|
|
{
|
11773 |
|
|
subr_die = new_die (DW_TAG_subprogram, context_die, decl);
|
11774 |
|
|
|
11775 |
|
|
if (TREE_PUBLIC (decl))
|
11776 |
|
|
add_AT_flag (subr_die, DW_AT_external, 1);
|
11777 |
|
|
|
11778 |
|
|
add_name_and_src_coords_attributes (subr_die, decl);
|
11779 |
|
|
if (debug_info_level > DINFO_LEVEL_TERSE)
|
11780 |
|
|
{
|
11781 |
|
|
add_prototyped_attribute (subr_die, TREE_TYPE (decl));
|
11782 |
|
|
add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
|
11783 |
|
|
0, 0, context_die);
|
11784 |
|
|
}
|
11785 |
|
|
|
11786 |
|
|
add_pure_or_virtual_attribute (subr_die, decl);
|
11787 |
|
|
if (DECL_ARTIFICIAL (decl))
|
11788 |
|
|
add_AT_flag (subr_die, DW_AT_artificial, 1);
|
11789 |
|
|
|
11790 |
|
|
if (TREE_PROTECTED (decl))
|
11791 |
|
|
add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_protected);
|
11792 |
|
|
else if (TREE_PRIVATE (decl))
|
11793 |
|
|
add_AT_unsigned (subr_die, DW_AT_accessibility, DW_ACCESS_private);
|
11794 |
|
|
}
|
11795 |
|
|
|
11796 |
|
|
if (declaration)
|
11797 |
|
|
{
|
11798 |
|
|
if (!old_die || !get_AT (old_die, DW_AT_inline))
|
11799 |
|
|
{
|
11800 |
|
|
add_AT_flag (subr_die, DW_AT_declaration, 1);
|
11801 |
|
|
|
11802 |
|
|
/* The first time we see a member function, it is in the context of
|
11803 |
|
|
the class to which it belongs. We make sure of this by emitting
|
11804 |
|
|
the class first. The next time is the definition, which is
|
11805 |
|
|
handled above. The two may come from the same source text.
|
11806 |
|
|
|
11807 |
|
|
Note that force_decl_die() forces function declaration die. It is
|
11808 |
|
|
later reused to represent definition. */
|
11809 |
|
|
equate_decl_number_to_die (decl, subr_die);
|
11810 |
|
|
}
|
11811 |
|
|
}
|
11812 |
|
|
else if (DECL_ABSTRACT (decl))
|
11813 |
|
|
{
|
11814 |
|
|
if (DECL_DECLARED_INLINE_P (decl))
|
11815 |
|
|
{
|
11816 |
|
|
if (cgraph_function_possibly_inlined_p (decl))
|
11817 |
|
|
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_inlined);
|
11818 |
|
|
else
|
11819 |
|
|
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_declared_not_inlined);
|
11820 |
|
|
}
|
11821 |
|
|
else
|
11822 |
|
|
{
|
11823 |
|
|
if (cgraph_function_possibly_inlined_p (decl))
|
11824 |
|
|
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_inlined);
|
11825 |
|
|
else
|
11826 |
|
|
add_AT_unsigned (subr_die, DW_AT_inline, DW_INL_not_inlined);
|
11827 |
|
|
}
|
11828 |
|
|
|
11829 |
|
|
equate_decl_number_to_die (decl, subr_die);
|
11830 |
|
|
}
|
11831 |
|
|
else if (!DECL_EXTERNAL (decl))
|
11832 |
|
|
{
|
11833 |
|
|
HOST_WIDE_INT cfa_fb_offset;
|
11834 |
|
|
|
11835 |
|
|
if (!old_die || !get_AT (old_die, DW_AT_inline))
|
11836 |
|
|
equate_decl_number_to_die (decl, subr_die);
|
11837 |
|
|
|
11838 |
|
|
if (!flag_reorder_blocks_and_partition)
|
11839 |
|
|
{
|
11840 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_BEGIN_LABEL,
|
11841 |
|
|
current_function_funcdef_no);
|
11842 |
|
|
add_AT_lbl_id (subr_die, DW_AT_low_pc, label_id);
|
11843 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
|
11844 |
|
|
current_function_funcdef_no);
|
11845 |
|
|
add_AT_lbl_id (subr_die, DW_AT_high_pc, label_id);
|
11846 |
|
|
|
11847 |
|
|
add_pubname (decl, subr_die);
|
11848 |
|
|
add_arange (decl, subr_die);
|
11849 |
|
|
}
|
11850 |
|
|
else
|
11851 |
|
|
{ /* Do nothing for now; maybe need to duplicate die, one for
|
11852 |
|
|
hot section and ond for cold section, then use the hot/cold
|
11853 |
|
|
section begin/end labels to generate the aranges... */
|
11854 |
|
|
/*
|
11855 |
|
|
add_AT_lbl_id (subr_die, DW_AT_low_pc, hot_section_label);
|
11856 |
|
|
add_AT_lbl_id (subr_die, DW_AT_high_pc, hot_section_end_label);
|
11857 |
|
|
add_AT_lbl_id (subr_die, DW_AT_lo_user, unlikely_section_label);
|
11858 |
|
|
add_AT_lbl_id (subr_die, DW_AT_hi_user, cold_section_end_label);
|
11859 |
|
|
|
11860 |
|
|
add_pubname (decl, subr_die);
|
11861 |
|
|
add_arange (decl, subr_die);
|
11862 |
|
|
add_arange (decl, subr_die);
|
11863 |
|
|
*/
|
11864 |
|
|
}
|
11865 |
|
|
|
11866 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
11867 |
|
|
/* Add a reference to the FDE for this routine. */
|
11868 |
|
|
add_AT_fde_ref (subr_die, DW_AT_MIPS_fde, current_funcdef_fde);
|
11869 |
|
|
#endif
|
11870 |
|
|
|
11871 |
|
|
cfa_fb_offset = CFA_FRAME_BASE_OFFSET (decl);
|
11872 |
|
|
|
11873 |
|
|
/* We define the "frame base" as the function's CFA. This is more
|
11874 |
|
|
convenient for several reasons: (1) It's stable across the prologue
|
11875 |
|
|
and epilogue, which makes it better than just a frame pointer,
|
11876 |
|
|
(2) With dwarf3, there exists a one-byte encoding that allows us
|
11877 |
|
|
to reference the .debug_frame data by proxy, but failing that,
|
11878 |
|
|
(3) We can at least reuse the code inspection and interpretation
|
11879 |
|
|
code that determines the CFA position at various points in the
|
11880 |
|
|
function. */
|
11881 |
|
|
/* ??? Use some command-line or configury switch to enable the use
|
11882 |
|
|
of dwarf3 DW_OP_call_frame_cfa. At present there are no dwarf
|
11883 |
|
|
consumers that understand it; fall back to "pure" dwarf2 and
|
11884 |
|
|
convert the CFA data into a location list. */
|
11885 |
|
|
{
|
11886 |
|
|
dw_loc_list_ref list = convert_cfa_to_fb_loc_list (cfa_fb_offset);
|
11887 |
|
|
if (list->dw_loc_next)
|
11888 |
|
|
add_AT_loc_list (subr_die, DW_AT_frame_base, list);
|
11889 |
|
|
else
|
11890 |
|
|
add_AT_loc (subr_die, DW_AT_frame_base, list->expr);
|
11891 |
|
|
}
|
11892 |
|
|
|
11893 |
|
|
/* Compute a displacement from the "steady-state frame pointer" to
|
11894 |
|
|
the CFA. The former is what all stack slots and argument slots
|
11895 |
|
|
will reference in the rtl; the later is what we've told the
|
11896 |
|
|
debugger about. We'll need to adjust all frame_base references
|
11897 |
|
|
by this displacement. */
|
11898 |
|
|
compute_frame_pointer_to_fb_displacement (cfa_fb_offset);
|
11899 |
|
|
|
11900 |
|
|
if (cfun->static_chain_decl)
|
11901 |
|
|
add_AT_location_description (subr_die, DW_AT_static_link,
|
11902 |
|
|
loc_descriptor_from_tree (cfun->static_chain_decl));
|
11903 |
|
|
}
|
11904 |
|
|
|
11905 |
|
|
/* Now output descriptions of the arguments for this function. This gets
|
11906 |
|
|
(unnecessarily?) complex because of the fact that the DECL_ARGUMENT list
|
11907 |
|
|
for a FUNCTION_DECL doesn't indicate cases where there was a trailing
|
11908 |
|
|
`...' at the end of the formal parameter list. In order to find out if
|
11909 |
|
|
there was a trailing ellipsis or not, we must instead look at the type
|
11910 |
|
|
associated with the FUNCTION_DECL. This will be a node of type
|
11911 |
|
|
FUNCTION_TYPE. If the chain of type nodes hanging off of this
|
11912 |
|
|
FUNCTION_TYPE node ends with a void_type_node then there should *not* be
|
11913 |
|
|
an ellipsis at the end. */
|
11914 |
|
|
|
11915 |
|
|
/* In the case where we are describing a mere function declaration, all we
|
11916 |
|
|
need to do here (and all we *can* do here) is to describe the *types* of
|
11917 |
|
|
its formal parameters. */
|
11918 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
11919 |
|
|
;
|
11920 |
|
|
else if (declaration)
|
11921 |
|
|
gen_formal_types_die (decl, subr_die);
|
11922 |
|
|
else
|
11923 |
|
|
{
|
11924 |
|
|
/* Generate DIEs to represent all known formal parameters. */
|
11925 |
|
|
tree arg_decls = DECL_ARGUMENTS (decl);
|
11926 |
|
|
tree parm;
|
11927 |
|
|
|
11928 |
|
|
/* When generating DIEs, generate the unspecified_parameters DIE
|
11929 |
|
|
instead if we come across the arg "__builtin_va_alist" */
|
11930 |
|
|
for (parm = arg_decls; parm; parm = TREE_CHAIN (parm))
|
11931 |
|
|
if (TREE_CODE (parm) == PARM_DECL)
|
11932 |
|
|
{
|
11933 |
|
|
if (DECL_NAME (parm)
|
11934 |
|
|
&& !strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
|
11935 |
|
|
"__builtin_va_alist"))
|
11936 |
|
|
gen_unspecified_parameters_die (parm, subr_die);
|
11937 |
|
|
else
|
11938 |
|
|
gen_decl_die (parm, subr_die);
|
11939 |
|
|
}
|
11940 |
|
|
|
11941 |
|
|
/* Decide whether we need an unspecified_parameters DIE at the end.
|
11942 |
|
|
There are 2 more cases to do this for: 1) the ansi ... declaration -
|
11943 |
|
|
this is detectable when the end of the arg list is not a
|
11944 |
|
|
void_type_node 2) an unprototyped function declaration (not a
|
11945 |
|
|
definition). This just means that we have no info about the
|
11946 |
|
|
parameters at all. */
|
11947 |
|
|
fn_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
|
11948 |
|
|
if (fn_arg_types != NULL)
|
11949 |
|
|
{
|
11950 |
|
|
/* This is the prototyped case, check for.... */
|
11951 |
|
|
if (TREE_VALUE (tree_last (fn_arg_types)) != void_type_node)
|
11952 |
|
|
gen_unspecified_parameters_die (decl, subr_die);
|
11953 |
|
|
}
|
11954 |
|
|
else if (DECL_INITIAL (decl) == NULL_TREE)
|
11955 |
|
|
gen_unspecified_parameters_die (decl, subr_die);
|
11956 |
|
|
}
|
11957 |
|
|
|
11958 |
|
|
/* Output Dwarf info for all of the stuff within the body of the function
|
11959 |
|
|
(if it has one - it may be just a declaration). */
|
11960 |
|
|
outer_scope = DECL_INITIAL (decl);
|
11961 |
|
|
|
11962 |
|
|
/* OUTER_SCOPE is a pointer to the outermost BLOCK node created to represent
|
11963 |
|
|
a function. This BLOCK actually represents the outermost binding contour
|
11964 |
|
|
for the function, i.e. the contour in which the function's formal
|
11965 |
|
|
parameters and labels get declared. Curiously, it appears that the front
|
11966 |
|
|
end doesn't actually put the PARM_DECL nodes for the current function onto
|
11967 |
|
|
the BLOCK_VARS list for this outer scope, but are strung off of the
|
11968 |
|
|
DECL_ARGUMENTS list for the function instead.
|
11969 |
|
|
|
11970 |
|
|
The BLOCK_VARS list for the `outer_scope' does provide us with a list of
|
11971 |
|
|
the LABEL_DECL nodes for the function however, and we output DWARF info
|
11972 |
|
|
for those in decls_for_scope. Just within the `outer_scope' there will be
|
11973 |
|
|
a BLOCK node representing the function's outermost pair of curly braces,
|
11974 |
|
|
and any blocks used for the base and member initializers of a C++
|
11975 |
|
|
constructor function. */
|
11976 |
|
|
if (! declaration && TREE_CODE (outer_scope) != ERROR_MARK)
|
11977 |
|
|
{
|
11978 |
|
|
/* Emit a DW_TAG_variable DIE for a named return value. */
|
11979 |
|
|
if (DECL_NAME (DECL_RESULT (decl)))
|
11980 |
|
|
gen_decl_die (DECL_RESULT (decl), subr_die);
|
11981 |
|
|
|
11982 |
|
|
current_function_has_inlines = 0;
|
11983 |
|
|
decls_for_scope (outer_scope, subr_die, 0);
|
11984 |
|
|
|
11985 |
|
|
#if 0 && defined (MIPS_DEBUGGING_INFO)
|
11986 |
|
|
if (current_function_has_inlines)
|
11987 |
|
|
{
|
11988 |
|
|
add_AT_flag (subr_die, DW_AT_MIPS_has_inlines, 1);
|
11989 |
|
|
if (! comp_unit_has_inlines)
|
11990 |
|
|
{
|
11991 |
|
|
add_AT_flag (comp_unit_die, DW_AT_MIPS_has_inlines, 1);
|
11992 |
|
|
comp_unit_has_inlines = 1;
|
11993 |
|
|
}
|
11994 |
|
|
}
|
11995 |
|
|
#endif
|
11996 |
|
|
}
|
11997 |
|
|
/* Add the calling convention attribute if requested. */
|
11998 |
|
|
add_calling_convention_attribute (subr_die, TREE_TYPE (decl));
|
11999 |
|
|
|
12000 |
|
|
}
|
12001 |
|
|
|
12002 |
|
|
/* Generate a DIE to represent a declared data object. */
|
12003 |
|
|
|
12004 |
|
|
static void
|
12005 |
|
|
gen_variable_die (tree decl, dw_die_ref context_die)
|
12006 |
|
|
{
|
12007 |
|
|
tree origin = decl_ultimate_origin (decl);
|
12008 |
|
|
dw_die_ref var_die = new_die (DW_TAG_variable, context_die, decl);
|
12009 |
|
|
|
12010 |
|
|
dw_die_ref old_die = lookup_decl_die (decl);
|
12011 |
|
|
int declaration = (DECL_EXTERNAL (decl)
|
12012 |
|
|
/* If DECL is COMDAT and has not actually been
|
12013 |
|
|
emitted, we cannot take its address; there
|
12014 |
|
|
might end up being no definition anywhere in
|
12015 |
|
|
the program. For example, consider the C++
|
12016 |
|
|
test case:
|
12017 |
|
|
|
12018 |
|
|
template <class T>
|
12019 |
|
|
struct S { static const int i = 7; };
|
12020 |
|
|
|
12021 |
|
|
template <class T>
|
12022 |
|
|
const int S<T>::i;
|
12023 |
|
|
|
12024 |
|
|
int f() { return S<int>::i; }
|
12025 |
|
|
|
12026 |
|
|
Here, S<int>::i is not DECL_EXTERNAL, but no
|
12027 |
|
|
definition is required, so the compiler will
|
12028 |
|
|
not emit a definition. */
|
12029 |
|
|
|| (TREE_CODE (decl) == VAR_DECL
|
12030 |
|
|
&& DECL_COMDAT (decl) && !TREE_ASM_WRITTEN (decl))
|
12031 |
|
|
|| class_or_namespace_scope_p (context_die));
|
12032 |
|
|
|
12033 |
|
|
if (origin != NULL)
|
12034 |
|
|
add_abstract_origin_attribute (var_die, origin);
|
12035 |
|
|
|
12036 |
|
|
/* Loop unrolling can create multiple blocks that refer to the same
|
12037 |
|
|
static variable, so we must test for the DW_AT_declaration flag.
|
12038 |
|
|
|
12039 |
|
|
??? Loop unrolling/reorder_blocks should perhaps be rewritten to
|
12040 |
|
|
copy decls and set the DECL_ABSTRACT flag on them instead of
|
12041 |
|
|
sharing them.
|
12042 |
|
|
|
12043 |
|
|
??? Duplicated blocks have been rewritten to use .debug_ranges.
|
12044 |
|
|
|
12045 |
|
|
??? The declare_in_namespace support causes us to get two DIEs for one
|
12046 |
|
|
variable, both of which are declarations. We want to avoid considering
|
12047 |
|
|
one to be a specification, so we must test that this DIE is not a
|
12048 |
|
|
declaration. */
|
12049 |
|
|
else if (old_die && TREE_STATIC (decl) && ! declaration
|
12050 |
|
|
&& get_AT_flag (old_die, DW_AT_declaration) == 1)
|
12051 |
|
|
{
|
12052 |
|
|
/* This is a definition of a C++ class level static. */
|
12053 |
|
|
add_AT_specification (var_die, old_die);
|
12054 |
|
|
if (DECL_NAME (decl))
|
12055 |
|
|
{
|
12056 |
|
|
expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
|
12057 |
|
|
struct dwarf_file_data * file_index = lookup_filename (s.file);
|
12058 |
|
|
|
12059 |
|
|
if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
|
12060 |
|
|
add_AT_file (var_die, DW_AT_decl_file, file_index);
|
12061 |
|
|
|
12062 |
|
|
if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
|
12063 |
|
|
|
12064 |
|
|
add_AT_unsigned (var_die, DW_AT_decl_line, s.line);
|
12065 |
|
|
}
|
12066 |
|
|
}
|
12067 |
|
|
else
|
12068 |
|
|
{
|
12069 |
|
|
add_name_and_src_coords_attributes (var_die, decl);
|
12070 |
|
|
add_type_attribute (var_die, TREE_TYPE (decl), TREE_READONLY (decl),
|
12071 |
|
|
TREE_THIS_VOLATILE (decl), context_die);
|
12072 |
|
|
|
12073 |
|
|
if (TREE_PUBLIC (decl))
|
12074 |
|
|
add_AT_flag (var_die, DW_AT_external, 1);
|
12075 |
|
|
|
12076 |
|
|
if (DECL_ARTIFICIAL (decl))
|
12077 |
|
|
add_AT_flag (var_die, DW_AT_artificial, 1);
|
12078 |
|
|
|
12079 |
|
|
if (TREE_PROTECTED (decl))
|
12080 |
|
|
add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_protected);
|
12081 |
|
|
else if (TREE_PRIVATE (decl))
|
12082 |
|
|
add_AT_unsigned (var_die, DW_AT_accessibility, DW_ACCESS_private);
|
12083 |
|
|
}
|
12084 |
|
|
|
12085 |
|
|
if (declaration)
|
12086 |
|
|
add_AT_flag (var_die, DW_AT_declaration, 1);
|
12087 |
|
|
|
12088 |
|
|
if (DECL_ABSTRACT (decl) || declaration)
|
12089 |
|
|
equate_decl_number_to_die (decl, var_die);
|
12090 |
|
|
|
12091 |
|
|
if (! declaration && ! DECL_ABSTRACT (decl))
|
12092 |
|
|
{
|
12093 |
|
|
add_location_or_const_value_attribute (var_die, decl, DW_AT_location);
|
12094 |
|
|
add_pubname (decl, var_die);
|
12095 |
|
|
}
|
12096 |
|
|
else
|
12097 |
|
|
tree_add_const_value_attribute (var_die, decl);
|
12098 |
|
|
}
|
12099 |
|
|
|
12100 |
|
|
/* Generate a DIE to represent a label identifier. */
|
12101 |
|
|
|
12102 |
|
|
static void
|
12103 |
|
|
gen_label_die (tree decl, dw_die_ref context_die)
|
12104 |
|
|
{
|
12105 |
|
|
tree origin = decl_ultimate_origin (decl);
|
12106 |
|
|
dw_die_ref lbl_die = new_die (DW_TAG_label, context_die, decl);
|
12107 |
|
|
rtx insn;
|
12108 |
|
|
char label[MAX_ARTIFICIAL_LABEL_BYTES];
|
12109 |
|
|
|
12110 |
|
|
if (origin != NULL)
|
12111 |
|
|
add_abstract_origin_attribute (lbl_die, origin);
|
12112 |
|
|
else
|
12113 |
|
|
add_name_and_src_coords_attributes (lbl_die, decl);
|
12114 |
|
|
|
12115 |
|
|
if (DECL_ABSTRACT (decl))
|
12116 |
|
|
equate_decl_number_to_die (decl, lbl_die);
|
12117 |
|
|
else
|
12118 |
|
|
{
|
12119 |
|
|
insn = DECL_RTL_IF_SET (decl);
|
12120 |
|
|
|
12121 |
|
|
/* Deleted labels are programmer specified labels which have been
|
12122 |
|
|
eliminated because of various optimizations. We still emit them
|
12123 |
|
|
here so that it is possible to put breakpoints on them. */
|
12124 |
|
|
if (insn
|
12125 |
|
|
&& (LABEL_P (insn)
|
12126 |
|
|
|| ((NOTE_P (insn)
|
12127 |
|
|
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL))))
|
12128 |
|
|
{
|
12129 |
|
|
/* When optimization is enabled (via -O) some parts of the compiler
|
12130 |
|
|
(e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which
|
12131 |
|
|
represent source-level labels which were explicitly declared by
|
12132 |
|
|
the user. This really shouldn't be happening though, so catch
|
12133 |
|
|
it if it ever does happen. */
|
12134 |
|
|
gcc_assert (!INSN_DELETED_P (insn));
|
12135 |
|
|
|
12136 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (insn));
|
12137 |
|
|
add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
|
12138 |
|
|
}
|
12139 |
|
|
}
|
12140 |
|
|
}
|
12141 |
|
|
|
12142 |
|
|
/* A helper function for gen_inlined_subroutine_die. Add source coordinate
|
12143 |
|
|
attributes to the DIE for a block STMT, to describe where the inlined
|
12144 |
|
|
function was called from. This is similar to add_src_coords_attributes. */
|
12145 |
|
|
|
12146 |
|
|
static inline void
|
12147 |
|
|
add_call_src_coords_attributes (tree stmt, dw_die_ref die)
|
12148 |
|
|
{
|
12149 |
|
|
expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (stmt));
|
12150 |
|
|
|
12151 |
|
|
add_AT_file (die, DW_AT_call_file, lookup_filename (s.file));
|
12152 |
|
|
add_AT_unsigned (die, DW_AT_call_line, s.line);
|
12153 |
|
|
}
|
12154 |
|
|
|
12155 |
|
|
/* A helper function for gen_lexical_block_die and gen_inlined_subroutine_die.
|
12156 |
|
|
Add low_pc and high_pc attributes to the DIE for a block STMT. */
|
12157 |
|
|
|
12158 |
|
|
static inline void
|
12159 |
|
|
add_high_low_attributes (tree stmt, dw_die_ref die)
|
12160 |
|
|
{
|
12161 |
|
|
char label[MAX_ARTIFICIAL_LABEL_BYTES];
|
12162 |
|
|
|
12163 |
|
|
if (BLOCK_FRAGMENT_CHAIN (stmt))
|
12164 |
|
|
{
|
12165 |
|
|
tree chain;
|
12166 |
|
|
|
12167 |
|
|
add_AT_range_list (die, DW_AT_ranges, add_ranges (stmt));
|
12168 |
|
|
|
12169 |
|
|
chain = BLOCK_FRAGMENT_CHAIN (stmt);
|
12170 |
|
|
do
|
12171 |
|
|
{
|
12172 |
|
|
add_ranges (chain);
|
12173 |
|
|
chain = BLOCK_FRAGMENT_CHAIN (chain);
|
12174 |
|
|
}
|
12175 |
|
|
while (chain);
|
12176 |
|
|
add_ranges (NULL);
|
12177 |
|
|
}
|
12178 |
|
|
else
|
12179 |
|
|
{
|
12180 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
|
12181 |
|
|
BLOCK_NUMBER (stmt));
|
12182 |
|
|
add_AT_lbl_id (die, DW_AT_low_pc, label);
|
12183 |
|
|
ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_END_LABEL,
|
12184 |
|
|
BLOCK_NUMBER (stmt));
|
12185 |
|
|
add_AT_lbl_id (die, DW_AT_high_pc, label);
|
12186 |
|
|
}
|
12187 |
|
|
}
|
12188 |
|
|
|
12189 |
|
|
/* Generate a DIE for a lexical block. */
|
12190 |
|
|
|
12191 |
|
|
static void
|
12192 |
|
|
gen_lexical_block_die (tree stmt, dw_die_ref context_die, int depth)
|
12193 |
|
|
{
|
12194 |
|
|
dw_die_ref stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
|
12195 |
|
|
|
12196 |
|
|
if (! BLOCK_ABSTRACT (stmt))
|
12197 |
|
|
add_high_low_attributes (stmt, stmt_die);
|
12198 |
|
|
|
12199 |
|
|
decls_for_scope (stmt, stmt_die, depth);
|
12200 |
|
|
}
|
12201 |
|
|
|
12202 |
|
|
/* Generate a DIE for an inlined subprogram. */
|
12203 |
|
|
|
12204 |
|
|
static void
|
12205 |
|
|
gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die, int depth)
|
12206 |
|
|
{
|
12207 |
|
|
tree decl = block_ultimate_origin (stmt);
|
12208 |
|
|
|
12209 |
|
|
/* Emit info for the abstract instance first, if we haven't yet. We
|
12210 |
|
|
must emit this even if the block is abstract, otherwise when we
|
12211 |
|
|
emit the block below (or elsewhere), we may end up trying to emit
|
12212 |
|
|
a die whose origin die hasn't been emitted, and crashing. */
|
12213 |
|
|
dwarf2out_abstract_function (decl);
|
12214 |
|
|
|
12215 |
|
|
if (! BLOCK_ABSTRACT (stmt))
|
12216 |
|
|
{
|
12217 |
|
|
dw_die_ref subr_die
|
12218 |
|
|
= new_die (DW_TAG_inlined_subroutine, context_die, stmt);
|
12219 |
|
|
|
12220 |
|
|
add_abstract_origin_attribute (subr_die, decl);
|
12221 |
|
|
add_high_low_attributes (stmt, subr_die);
|
12222 |
|
|
add_call_src_coords_attributes (stmt, subr_die);
|
12223 |
|
|
|
12224 |
|
|
decls_for_scope (stmt, subr_die, depth);
|
12225 |
|
|
current_function_has_inlines = 1;
|
12226 |
|
|
}
|
12227 |
|
|
else
|
12228 |
|
|
/* We may get here if we're the outer block of function A that was
|
12229 |
|
|
inlined into function B that was inlined into function C. When
|
12230 |
|
|
generating debugging info for C, dwarf2out_abstract_function(B)
|
12231 |
|
|
would mark all inlined blocks as abstract, including this one.
|
12232 |
|
|
So, we wouldn't (and shouldn't) expect labels to be generated
|
12233 |
|
|
for this one. Instead, just emit debugging info for
|
12234 |
|
|
declarations within the block. This is particularly important
|
12235 |
|
|
in the case of initializers of arguments passed from B to us:
|
12236 |
|
|
if they're statement expressions containing declarations, we
|
12237 |
|
|
wouldn't generate dies for their abstract variables, and then,
|
12238 |
|
|
when generating dies for the real variables, we'd die (pun
|
12239 |
|
|
intended :-) */
|
12240 |
|
|
gen_lexical_block_die (stmt, context_die, depth);
|
12241 |
|
|
}
|
12242 |
|
|
|
12243 |
|
|
/* Generate a DIE for a field in a record, or structure. */
|
12244 |
|
|
|
12245 |
|
|
static void
|
12246 |
|
|
gen_field_die (tree decl, dw_die_ref context_die)
|
12247 |
|
|
{
|
12248 |
|
|
dw_die_ref decl_die;
|
12249 |
|
|
|
12250 |
|
|
if (TREE_TYPE (decl) == error_mark_node)
|
12251 |
|
|
return;
|
12252 |
|
|
|
12253 |
|
|
decl_die = new_die (DW_TAG_member, context_die, decl);
|
12254 |
|
|
add_name_and_src_coords_attributes (decl_die, decl);
|
12255 |
|
|
add_type_attribute (decl_die, member_declared_type (decl),
|
12256 |
|
|
TREE_READONLY (decl), TREE_THIS_VOLATILE (decl),
|
12257 |
|
|
context_die);
|
12258 |
|
|
|
12259 |
|
|
if (DECL_BIT_FIELD_TYPE (decl))
|
12260 |
|
|
{
|
12261 |
|
|
add_byte_size_attribute (decl_die, decl);
|
12262 |
|
|
add_bit_size_attribute (decl_die, decl);
|
12263 |
|
|
add_bit_offset_attribute (decl_die, decl);
|
12264 |
|
|
}
|
12265 |
|
|
|
12266 |
|
|
if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
|
12267 |
|
|
add_data_member_location_attribute (decl_die, decl);
|
12268 |
|
|
|
12269 |
|
|
if (DECL_ARTIFICIAL (decl))
|
12270 |
|
|
add_AT_flag (decl_die, DW_AT_artificial, 1);
|
12271 |
|
|
|
12272 |
|
|
if (TREE_PROTECTED (decl))
|
12273 |
|
|
add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_protected);
|
12274 |
|
|
else if (TREE_PRIVATE (decl))
|
12275 |
|
|
add_AT_unsigned (decl_die, DW_AT_accessibility, DW_ACCESS_private);
|
12276 |
|
|
|
12277 |
|
|
/* Equate decl number to die, so that we can look up this decl later on. */
|
12278 |
|
|
equate_decl_number_to_die (decl, decl_die);
|
12279 |
|
|
}
|
12280 |
|
|
|
12281 |
|
|
#if 0
|
12282 |
|
|
/* Don't generate either pointer_type DIEs or reference_type DIEs here.
|
12283 |
|
|
Use modified_type_die instead.
|
12284 |
|
|
We keep this code here just in case these types of DIEs may be needed to
|
12285 |
|
|
represent certain things in other languages (e.g. Pascal) someday. */
|
12286 |
|
|
|
12287 |
|
|
static void
|
12288 |
|
|
gen_pointer_type_die (tree type, dw_die_ref context_die)
|
12289 |
|
|
{
|
12290 |
|
|
dw_die_ref ptr_die
|
12291 |
|
|
= new_die (DW_TAG_pointer_type, scope_die_for (type, context_die), type);
|
12292 |
|
|
|
12293 |
|
|
equate_type_number_to_die (type, ptr_die);
|
12294 |
|
|
add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
|
12295 |
|
|
add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
|
12296 |
|
|
}
|
12297 |
|
|
|
12298 |
|
|
/* Don't generate either pointer_type DIEs or reference_type DIEs here.
|
12299 |
|
|
Use modified_type_die instead.
|
12300 |
|
|
We keep this code here just in case these types of DIEs may be needed to
|
12301 |
|
|
represent certain things in other languages (e.g. Pascal) someday. */
|
12302 |
|
|
|
12303 |
|
|
static void
|
12304 |
|
|
gen_reference_type_die (tree type, dw_die_ref context_die)
|
12305 |
|
|
{
|
12306 |
|
|
dw_die_ref ref_die
|
12307 |
|
|
= new_die (DW_TAG_reference_type, scope_die_for (type, context_die), type);
|
12308 |
|
|
|
12309 |
|
|
equate_type_number_to_die (type, ref_die);
|
12310 |
|
|
add_type_attribute (ref_die, TREE_TYPE (type), 0, 0, context_die);
|
12311 |
|
|
add_AT_unsigned (mod_type_die, DW_AT_byte_size, PTR_SIZE);
|
12312 |
|
|
}
|
12313 |
|
|
#endif
|
12314 |
|
|
|
12315 |
|
|
/* Generate a DIE for a pointer to a member type. */
|
12316 |
|
|
|
12317 |
|
|
static void
|
12318 |
|
|
gen_ptr_to_mbr_type_die (tree type, dw_die_ref context_die)
|
12319 |
|
|
{
|
12320 |
|
|
dw_die_ref ptr_die
|
12321 |
|
|
= new_die (DW_TAG_ptr_to_member_type,
|
12322 |
|
|
scope_die_for (type, context_die), type);
|
12323 |
|
|
|
12324 |
|
|
equate_type_number_to_die (type, ptr_die);
|
12325 |
|
|
add_AT_die_ref (ptr_die, DW_AT_containing_type,
|
12326 |
|
|
lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
|
12327 |
|
|
add_type_attribute (ptr_die, TREE_TYPE (type), 0, 0, context_die);
|
12328 |
|
|
}
|
12329 |
|
|
|
12330 |
|
|
/* Generate the DIE for the compilation unit. */
|
12331 |
|
|
|
12332 |
|
|
static dw_die_ref
|
12333 |
|
|
gen_compile_unit_die (const char *filename)
|
12334 |
|
|
{
|
12335 |
|
|
dw_die_ref die;
|
12336 |
|
|
char producer[250];
|
12337 |
|
|
const char *language_string = lang_hooks.name;
|
12338 |
|
|
int language;
|
12339 |
|
|
|
12340 |
|
|
die = new_die (DW_TAG_compile_unit, NULL, NULL);
|
12341 |
|
|
|
12342 |
|
|
if (filename)
|
12343 |
|
|
{
|
12344 |
|
|
add_name_attribute (die, filename);
|
12345 |
|
|
/* Don't add cwd for <built-in>. */
|
12346 |
|
|
if (filename[0] != DIR_SEPARATOR && filename[0] != '<')
|
12347 |
|
|
add_comp_dir_attribute (die);
|
12348 |
|
|
}
|
12349 |
|
|
|
12350 |
|
|
sprintf (producer, "%s %s", language_string, version_string);
|
12351 |
|
|
|
12352 |
|
|
#ifdef MIPS_DEBUGGING_INFO
|
12353 |
|
|
/* The MIPS/SGI compilers place the 'cc' command line options in the producer
|
12354 |
|
|
string. The SGI debugger looks for -g, -g1, -g2, or -g3; if they do
|
12355 |
|
|
not appear in the producer string, the debugger reaches the conclusion
|
12356 |
|
|
that the object file is stripped and has no debugging information.
|
12357 |
|
|
To get the MIPS/SGI debugger to believe that there is debugging
|
12358 |
|
|
information in the object file, we add a -g to the producer string. */
|
12359 |
|
|
if (debug_info_level > DINFO_LEVEL_TERSE)
|
12360 |
|
|
strcat (producer, " -g");
|
12361 |
|
|
#endif
|
12362 |
|
|
|
12363 |
|
|
add_AT_string (die, DW_AT_producer, producer);
|
12364 |
|
|
|
12365 |
|
|
if (strcmp (language_string, "GNU C++") == 0)
|
12366 |
|
|
language = DW_LANG_C_plus_plus;
|
12367 |
|
|
else if (strcmp (language_string, "GNU Ada") == 0)
|
12368 |
|
|
language = DW_LANG_Ada95;
|
12369 |
|
|
else if (strcmp (language_string, "GNU F77") == 0)
|
12370 |
|
|
language = DW_LANG_Fortran77;
|
12371 |
|
|
else if (strcmp (language_string, "GNU F95") == 0)
|
12372 |
|
|
language = DW_LANG_Fortran95;
|
12373 |
|
|
else if (strcmp (language_string, "GNU Pascal") == 0)
|
12374 |
|
|
language = DW_LANG_Pascal83;
|
12375 |
|
|
else if (strcmp (language_string, "GNU Java") == 0)
|
12376 |
|
|
language = DW_LANG_Java;
|
12377 |
|
|
else if (strcmp (language_string, "GNU Objective-C") == 0)
|
12378 |
|
|
language = DW_LANG_ObjC;
|
12379 |
|
|
else if (strcmp (language_string, "GNU Objective-C++") == 0)
|
12380 |
|
|
language = DW_LANG_ObjC_plus_plus;
|
12381 |
|
|
else
|
12382 |
|
|
language = DW_LANG_C89;
|
12383 |
|
|
|
12384 |
|
|
add_AT_unsigned (die, DW_AT_language, language);
|
12385 |
|
|
return die;
|
12386 |
|
|
}
|
12387 |
|
|
|
12388 |
|
|
/* Generate the DIE for a base class. */
|
12389 |
|
|
|
12390 |
|
|
static void
|
12391 |
|
|
gen_inheritance_die (tree binfo, tree access, dw_die_ref context_die)
|
12392 |
|
|
{
|
12393 |
|
|
dw_die_ref die = new_die (DW_TAG_inheritance, context_die, binfo);
|
12394 |
|
|
|
12395 |
|
|
add_type_attribute (die, BINFO_TYPE (binfo), 0, 0, context_die);
|
12396 |
|
|
add_data_member_location_attribute (die, binfo);
|
12397 |
|
|
|
12398 |
|
|
if (BINFO_VIRTUAL_P (binfo))
|
12399 |
|
|
add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
|
12400 |
|
|
|
12401 |
|
|
if (access == access_public_node)
|
12402 |
|
|
add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
|
12403 |
|
|
else if (access == access_protected_node)
|
12404 |
|
|
add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
|
12405 |
|
|
}
|
12406 |
|
|
|
12407 |
|
|
/* Generate a DIE for a class member. */
|
12408 |
|
|
|
12409 |
|
|
static void
|
12410 |
|
|
gen_member_die (tree type, dw_die_ref context_die)
|
12411 |
|
|
{
|
12412 |
|
|
tree member;
|
12413 |
|
|
tree binfo = TYPE_BINFO (type);
|
12414 |
|
|
dw_die_ref child;
|
12415 |
|
|
|
12416 |
|
|
/* If this is not an incomplete type, output descriptions of each of its
|
12417 |
|
|
members. Note that as we output the DIEs necessary to represent the
|
12418 |
|
|
members of this record or union type, we will also be trying to output
|
12419 |
|
|
DIEs to represent the *types* of those members. However the `type'
|
12420 |
|
|
function (above) will specifically avoid generating type DIEs for member
|
12421 |
|
|
types *within* the list of member DIEs for this (containing) type except
|
12422 |
|
|
for those types (of members) which are explicitly marked as also being
|
12423 |
|
|
members of this (containing) type themselves. The g++ front- end can
|
12424 |
|
|
force any given type to be treated as a member of some other (containing)
|
12425 |
|
|
type by setting the TYPE_CONTEXT of the given (member) type to point to
|
12426 |
|
|
the TREE node representing the appropriate (containing) type. */
|
12427 |
|
|
|
12428 |
|
|
/* First output info about the base classes. */
|
12429 |
|
|
if (binfo)
|
12430 |
|
|
{
|
12431 |
|
|
VEC(tree,gc) *accesses = BINFO_BASE_ACCESSES (binfo);
|
12432 |
|
|
int i;
|
12433 |
|
|
tree base;
|
12434 |
|
|
|
12435 |
|
|
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base); i++)
|
12436 |
|
|
gen_inheritance_die (base,
|
12437 |
|
|
(accesses ? VEC_index (tree, accesses, i)
|
12438 |
|
|
: access_public_node), context_die);
|
12439 |
|
|
}
|
12440 |
|
|
|
12441 |
|
|
/* Now output info about the data members and type members. */
|
12442 |
|
|
for (member = TYPE_FIELDS (type); member; member = TREE_CHAIN (member))
|
12443 |
|
|
{
|
12444 |
|
|
/* If we thought we were generating minimal debug info for TYPE
|
12445 |
|
|
and then changed our minds, some of the member declarations
|
12446 |
|
|
may have already been defined. Don't define them again, but
|
12447 |
|
|
do put them in the right order. */
|
12448 |
|
|
|
12449 |
|
|
child = lookup_decl_die (member);
|
12450 |
|
|
if (child)
|
12451 |
|
|
splice_child_die (context_die, child);
|
12452 |
|
|
else
|
12453 |
|
|
gen_decl_die (member, context_die);
|
12454 |
|
|
}
|
12455 |
|
|
|
12456 |
|
|
/* Now output info about the function members (if any). */
|
12457 |
|
|
for (member = TYPE_METHODS (type); member; member = TREE_CHAIN (member))
|
12458 |
|
|
{
|
12459 |
|
|
/* Don't include clones in the member list. */
|
12460 |
|
|
if (DECL_ABSTRACT_ORIGIN (member))
|
12461 |
|
|
continue;
|
12462 |
|
|
|
12463 |
|
|
child = lookup_decl_die (member);
|
12464 |
|
|
if (child)
|
12465 |
|
|
splice_child_die (context_die, child);
|
12466 |
|
|
else
|
12467 |
|
|
gen_decl_die (member, context_die);
|
12468 |
|
|
}
|
12469 |
|
|
}
|
12470 |
|
|
|
12471 |
|
|
/* Generate a DIE for a structure or union type. If TYPE_DECL_SUPPRESS_DEBUG
|
12472 |
|
|
is set, we pretend that the type was never defined, so we only get the
|
12473 |
|
|
member DIEs needed by later specification DIEs. */
|
12474 |
|
|
|
12475 |
|
|
static void
|
12476 |
|
|
gen_struct_or_union_type_die (tree type, dw_die_ref context_die)
|
12477 |
|
|
{
|
12478 |
|
|
dw_die_ref type_die = lookup_type_die (type);
|
12479 |
|
|
dw_die_ref scope_die = 0;
|
12480 |
|
|
int nested = 0;
|
12481 |
|
|
int complete = (TYPE_SIZE (type)
|
12482 |
|
|
&& (! TYPE_STUB_DECL (type)
|
12483 |
|
|
|| ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))));
|
12484 |
|
|
int ns_decl = (context_die && context_die->die_tag == DW_TAG_namespace);
|
12485 |
|
|
|
12486 |
|
|
if (type_die && ! complete)
|
12487 |
|
|
return;
|
12488 |
|
|
|
12489 |
|
|
if (TYPE_CONTEXT (type) != NULL_TREE
|
12490 |
|
|
&& (AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
|
12491 |
|
|
|| TREE_CODE (TYPE_CONTEXT (type)) == NAMESPACE_DECL))
|
12492 |
|
|
nested = 1;
|
12493 |
|
|
|
12494 |
|
|
scope_die = scope_die_for (type, context_die);
|
12495 |
|
|
|
12496 |
|
|
if (! type_die || (nested && scope_die == comp_unit_die))
|
12497 |
|
|
/* First occurrence of type or toplevel definition of nested class. */
|
12498 |
|
|
{
|
12499 |
|
|
dw_die_ref old_die = type_die;
|
12500 |
|
|
|
12501 |
|
|
type_die = new_die (TREE_CODE (type) == RECORD_TYPE
|
12502 |
|
|
? DW_TAG_structure_type : DW_TAG_union_type,
|
12503 |
|
|
scope_die, type);
|
12504 |
|
|
equate_type_number_to_die (type, type_die);
|
12505 |
|
|
if (old_die)
|
12506 |
|
|
add_AT_specification (type_die, old_die);
|
12507 |
|
|
else
|
12508 |
|
|
add_name_attribute (type_die, type_tag (type));
|
12509 |
|
|
}
|
12510 |
|
|
else
|
12511 |
|
|
remove_AT (type_die, DW_AT_declaration);
|
12512 |
|
|
|
12513 |
|
|
/* If this type has been completed, then give it a byte_size attribute and
|
12514 |
|
|
then give a list of members. */
|
12515 |
|
|
if (complete && !ns_decl)
|
12516 |
|
|
{
|
12517 |
|
|
/* Prevent infinite recursion in cases where the type of some member of
|
12518 |
|
|
this type is expressed in terms of this type itself. */
|
12519 |
|
|
TREE_ASM_WRITTEN (type) = 1;
|
12520 |
|
|
add_byte_size_attribute (type_die, type);
|
12521 |
|
|
if (TYPE_STUB_DECL (type) != NULL_TREE)
|
12522 |
|
|
add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
|
12523 |
|
|
|
12524 |
|
|
/* If the first reference to this type was as the return type of an
|
12525 |
|
|
inline function, then it may not have a parent. Fix this now. */
|
12526 |
|
|
if (type_die->die_parent == NULL)
|
12527 |
|
|
add_child_die (scope_die, type_die);
|
12528 |
|
|
|
12529 |
|
|
push_decl_scope (type);
|
12530 |
|
|
gen_member_die (type, type_die);
|
12531 |
|
|
pop_decl_scope ();
|
12532 |
|
|
|
12533 |
|
|
/* GNU extension: Record what type our vtable lives in. */
|
12534 |
|
|
if (TYPE_VFIELD (type))
|
12535 |
|
|
{
|
12536 |
|
|
tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
|
12537 |
|
|
|
12538 |
|
|
gen_type_die (vtype, context_die);
|
12539 |
|
|
add_AT_die_ref (type_die, DW_AT_containing_type,
|
12540 |
|
|
lookup_type_die (vtype));
|
12541 |
|
|
}
|
12542 |
|
|
}
|
12543 |
|
|
else
|
12544 |
|
|
{
|
12545 |
|
|
add_AT_flag (type_die, DW_AT_declaration, 1);
|
12546 |
|
|
|
12547 |
|
|
/* We don't need to do this for function-local types. */
|
12548 |
|
|
if (TYPE_STUB_DECL (type)
|
12549 |
|
|
&& ! decl_function_context (TYPE_STUB_DECL (type)))
|
12550 |
|
|
VEC_safe_push (tree, gc, incomplete_types, type);
|
12551 |
|
|
}
|
12552 |
|
|
}
|
12553 |
|
|
|
12554 |
|
|
/* Generate a DIE for a subroutine _type_. */
|
12555 |
|
|
|
12556 |
|
|
static void
|
12557 |
|
|
gen_subroutine_type_die (tree type, dw_die_ref context_die)
|
12558 |
|
|
{
|
12559 |
|
|
tree return_type = TREE_TYPE (type);
|
12560 |
|
|
dw_die_ref subr_die
|
12561 |
|
|
= new_die (DW_TAG_subroutine_type,
|
12562 |
|
|
scope_die_for (type, context_die), type);
|
12563 |
|
|
|
12564 |
|
|
equate_type_number_to_die (type, subr_die);
|
12565 |
|
|
add_prototyped_attribute (subr_die, type);
|
12566 |
|
|
add_type_attribute (subr_die, return_type, 0, 0, context_die);
|
12567 |
|
|
gen_formal_types_die (type, subr_die);
|
12568 |
|
|
}
|
12569 |
|
|
|
12570 |
|
|
/* Generate a DIE for a type definition. */
|
12571 |
|
|
|
12572 |
|
|
static void
|
12573 |
|
|
gen_typedef_die (tree decl, dw_die_ref context_die)
|
12574 |
|
|
{
|
12575 |
|
|
dw_die_ref type_die;
|
12576 |
|
|
tree origin;
|
12577 |
|
|
|
12578 |
|
|
if (TREE_ASM_WRITTEN (decl))
|
12579 |
|
|
return;
|
12580 |
|
|
|
12581 |
|
|
TREE_ASM_WRITTEN (decl) = 1;
|
12582 |
|
|
type_die = new_die (DW_TAG_typedef, context_die, decl);
|
12583 |
|
|
origin = decl_ultimate_origin (decl);
|
12584 |
|
|
if (origin != NULL)
|
12585 |
|
|
add_abstract_origin_attribute (type_die, origin);
|
12586 |
|
|
else
|
12587 |
|
|
{
|
12588 |
|
|
tree type;
|
12589 |
|
|
|
12590 |
|
|
add_name_and_src_coords_attributes (type_die, decl);
|
12591 |
|
|
if (DECL_ORIGINAL_TYPE (decl))
|
12592 |
|
|
{
|
12593 |
|
|
type = DECL_ORIGINAL_TYPE (decl);
|
12594 |
|
|
|
12595 |
|
|
gcc_assert (type != TREE_TYPE (decl));
|
12596 |
|
|
equate_type_number_to_die (TREE_TYPE (decl), type_die);
|
12597 |
|
|
}
|
12598 |
|
|
else
|
12599 |
|
|
type = TREE_TYPE (decl);
|
12600 |
|
|
|
12601 |
|
|
add_type_attribute (type_die, type, TREE_READONLY (decl),
|
12602 |
|
|
TREE_THIS_VOLATILE (decl), context_die);
|
12603 |
|
|
}
|
12604 |
|
|
|
12605 |
|
|
if (DECL_ABSTRACT (decl))
|
12606 |
|
|
equate_decl_number_to_die (decl, type_die);
|
12607 |
|
|
}
|
12608 |
|
|
|
12609 |
|
|
/* Generate a type description DIE. */
|
12610 |
|
|
|
12611 |
|
|
static void
|
12612 |
|
|
gen_type_die (tree type, dw_die_ref context_die)
|
12613 |
|
|
{
|
12614 |
|
|
int need_pop;
|
12615 |
|
|
|
12616 |
|
|
if (type == NULL_TREE || type == error_mark_node)
|
12617 |
|
|
return;
|
12618 |
|
|
|
12619 |
|
|
if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
|
12620 |
|
|
&& DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
|
12621 |
|
|
{
|
12622 |
|
|
if (TREE_ASM_WRITTEN (type))
|
12623 |
|
|
return;
|
12624 |
|
|
|
12625 |
|
|
/* Prevent broken recursion; we can't hand off to the same type. */
|
12626 |
|
|
gcc_assert (DECL_ORIGINAL_TYPE (TYPE_NAME (type)) != type);
|
12627 |
|
|
|
12628 |
|
|
TREE_ASM_WRITTEN (type) = 1;
|
12629 |
|
|
gen_decl_die (TYPE_NAME (type), context_die);
|
12630 |
|
|
return;
|
12631 |
|
|
}
|
12632 |
|
|
|
12633 |
|
|
/* We are going to output a DIE to represent the unqualified version
|
12634 |
|
|
of this type (i.e. without any const or volatile qualifiers) so
|
12635 |
|
|
get the main variant (i.e. the unqualified version) of this type
|
12636 |
|
|
now. (Vectors are special because the debugging info is in the
|
12637 |
|
|
cloned type itself). */
|
12638 |
|
|
if (TREE_CODE (type) != VECTOR_TYPE)
|
12639 |
|
|
type = type_main_variant (type);
|
12640 |
|
|
|
12641 |
|
|
if (TREE_ASM_WRITTEN (type))
|
12642 |
|
|
return;
|
12643 |
|
|
|
12644 |
|
|
switch (TREE_CODE (type))
|
12645 |
|
|
{
|
12646 |
|
|
case ERROR_MARK:
|
12647 |
|
|
break;
|
12648 |
|
|
|
12649 |
|
|
case POINTER_TYPE:
|
12650 |
|
|
case REFERENCE_TYPE:
|
12651 |
|
|
/* We must set TREE_ASM_WRITTEN in case this is a recursive type. This
|
12652 |
|
|
ensures that the gen_type_die recursion will terminate even if the
|
12653 |
|
|
type is recursive. Recursive types are possible in Ada. */
|
12654 |
|
|
/* ??? We could perhaps do this for all types before the switch
|
12655 |
|
|
statement. */
|
12656 |
|
|
TREE_ASM_WRITTEN (type) = 1;
|
12657 |
|
|
|
12658 |
|
|
/* For these types, all that is required is that we output a DIE (or a
|
12659 |
|
|
set of DIEs) to represent the "basis" type. */
|
12660 |
|
|
gen_type_die (TREE_TYPE (type), context_die);
|
12661 |
|
|
break;
|
12662 |
|
|
|
12663 |
|
|
case OFFSET_TYPE:
|
12664 |
|
|
/* This code is used for C++ pointer-to-data-member types.
|
12665 |
|
|
Output a description of the relevant class type. */
|
12666 |
|
|
gen_type_die (TYPE_OFFSET_BASETYPE (type), context_die);
|
12667 |
|
|
|
12668 |
|
|
/* Output a description of the type of the object pointed to. */
|
12669 |
|
|
gen_type_die (TREE_TYPE (type), context_die);
|
12670 |
|
|
|
12671 |
|
|
/* Now output a DIE to represent this pointer-to-data-member type
|
12672 |
|
|
itself. */
|
12673 |
|
|
gen_ptr_to_mbr_type_die (type, context_die);
|
12674 |
|
|
break;
|
12675 |
|
|
|
12676 |
|
|
case FUNCTION_TYPE:
|
12677 |
|
|
/* Force out return type (in case it wasn't forced out already). */
|
12678 |
|
|
gen_type_die (TREE_TYPE (type), context_die);
|
12679 |
|
|
gen_subroutine_type_die (type, context_die);
|
12680 |
|
|
break;
|
12681 |
|
|
|
12682 |
|
|
case METHOD_TYPE:
|
12683 |
|
|
/* Force out return type (in case it wasn't forced out already). */
|
12684 |
|
|
gen_type_die (TREE_TYPE (type), context_die);
|
12685 |
|
|
gen_subroutine_type_die (type, context_die);
|
12686 |
|
|
break;
|
12687 |
|
|
|
12688 |
|
|
case ARRAY_TYPE:
|
12689 |
|
|
gen_array_type_die (type, context_die);
|
12690 |
|
|
break;
|
12691 |
|
|
|
12692 |
|
|
case VECTOR_TYPE:
|
12693 |
|
|
gen_array_type_die (type, context_die);
|
12694 |
|
|
break;
|
12695 |
|
|
|
12696 |
|
|
case ENUMERAL_TYPE:
|
12697 |
|
|
case RECORD_TYPE:
|
12698 |
|
|
case UNION_TYPE:
|
12699 |
|
|
case QUAL_UNION_TYPE:
|
12700 |
|
|
/* If this is a nested type whose containing class hasn't been written
|
12701 |
|
|
out yet, writing it out will cover this one, too. This does not apply
|
12702 |
|
|
to instantiations of member class templates; they need to be added to
|
12703 |
|
|
the containing class as they are generated. FIXME: This hurts the
|
12704 |
|
|
idea of combining type decls from multiple TUs, since we can't predict
|
12705 |
|
|
what set of template instantiations we'll get. */
|
12706 |
|
|
if (TYPE_CONTEXT (type)
|
12707 |
|
|
&& AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
|
12708 |
|
|
&& ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
|
12709 |
|
|
{
|
12710 |
|
|
gen_type_die (TYPE_CONTEXT (type), context_die);
|
12711 |
|
|
|
12712 |
|
|
if (TREE_ASM_WRITTEN (type))
|
12713 |
|
|
return;
|
12714 |
|
|
|
12715 |
|
|
/* If that failed, attach ourselves to the stub. */
|
12716 |
|
|
push_decl_scope (TYPE_CONTEXT (type));
|
12717 |
|
|
context_die = lookup_type_die (TYPE_CONTEXT (type));
|
12718 |
|
|
need_pop = 1;
|
12719 |
|
|
}
|
12720 |
|
|
else
|
12721 |
|
|
{
|
12722 |
|
|
declare_in_namespace (type, context_die);
|
12723 |
|
|
need_pop = 0;
|
12724 |
|
|
}
|
12725 |
|
|
|
12726 |
|
|
if (TREE_CODE (type) == ENUMERAL_TYPE)
|
12727 |
|
|
{
|
12728 |
|
|
/* This might have been written out by the call to
|
12729 |
|
|
declare_in_namespace. */
|
12730 |
|
|
if (!TREE_ASM_WRITTEN (type))
|
12731 |
|
|
gen_enumeration_type_die (type, context_die);
|
12732 |
|
|
}
|
12733 |
|
|
else
|
12734 |
|
|
gen_struct_or_union_type_die (type, context_die);
|
12735 |
|
|
|
12736 |
|
|
if (need_pop)
|
12737 |
|
|
pop_decl_scope ();
|
12738 |
|
|
|
12739 |
|
|
/* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
|
12740 |
|
|
it up if it is ever completed. gen_*_type_die will set it for us
|
12741 |
|
|
when appropriate. */
|
12742 |
|
|
return;
|
12743 |
|
|
|
12744 |
|
|
case VOID_TYPE:
|
12745 |
|
|
case INTEGER_TYPE:
|
12746 |
|
|
case REAL_TYPE:
|
12747 |
|
|
case COMPLEX_TYPE:
|
12748 |
|
|
case BOOLEAN_TYPE:
|
12749 |
|
|
/* No DIEs needed for fundamental types. */
|
12750 |
|
|
break;
|
12751 |
|
|
|
12752 |
|
|
case LANG_TYPE:
|
12753 |
|
|
/* No Dwarf representation currently defined. */
|
12754 |
|
|
break;
|
12755 |
|
|
|
12756 |
|
|
default:
|
12757 |
|
|
gcc_unreachable ();
|
12758 |
|
|
}
|
12759 |
|
|
|
12760 |
|
|
TREE_ASM_WRITTEN (type) = 1;
|
12761 |
|
|
}
|
12762 |
|
|
|
12763 |
|
|
/* Generate a DIE for a tagged type instantiation. */
|
12764 |
|
|
|
12765 |
|
|
static void
|
12766 |
|
|
gen_tagged_type_instantiation_die (tree type, dw_die_ref context_die)
|
12767 |
|
|
{
|
12768 |
|
|
if (type == NULL_TREE || type == error_mark_node)
|
12769 |
|
|
return;
|
12770 |
|
|
|
12771 |
|
|
/* We are going to output a DIE to represent the unqualified version of
|
12772 |
|
|
this type (i.e. without any const or volatile qualifiers) so make sure
|
12773 |
|
|
that we have the main variant (i.e. the unqualified version) of this
|
12774 |
|
|
type now. */
|
12775 |
|
|
gcc_assert (type == type_main_variant (type));
|
12776 |
|
|
|
12777 |
|
|
/* Do not check TREE_ASM_WRITTEN (type) as it may not be set if this is
|
12778 |
|
|
an instance of an unresolved type. */
|
12779 |
|
|
|
12780 |
|
|
switch (TREE_CODE (type))
|
12781 |
|
|
{
|
12782 |
|
|
case ERROR_MARK:
|
12783 |
|
|
break;
|
12784 |
|
|
|
12785 |
|
|
case ENUMERAL_TYPE:
|
12786 |
|
|
gen_inlined_enumeration_type_die (type, context_die);
|
12787 |
|
|
break;
|
12788 |
|
|
|
12789 |
|
|
case RECORD_TYPE:
|
12790 |
|
|
gen_inlined_structure_type_die (type, context_die);
|
12791 |
|
|
break;
|
12792 |
|
|
|
12793 |
|
|
case UNION_TYPE:
|
12794 |
|
|
case QUAL_UNION_TYPE:
|
12795 |
|
|
gen_inlined_union_type_die (type, context_die);
|
12796 |
|
|
break;
|
12797 |
|
|
|
12798 |
|
|
default:
|
12799 |
|
|
gcc_unreachable ();
|
12800 |
|
|
}
|
12801 |
|
|
}
|
12802 |
|
|
|
12803 |
|
|
/* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
|
12804 |
|
|
things which are local to the given block. */
|
12805 |
|
|
|
12806 |
|
|
static void
|
12807 |
|
|
gen_block_die (tree stmt, dw_die_ref context_die, int depth)
|
12808 |
|
|
{
|
12809 |
|
|
int must_output_die = 0;
|
12810 |
|
|
tree origin;
|
12811 |
|
|
tree decl;
|
12812 |
|
|
enum tree_code origin_code;
|
12813 |
|
|
|
12814 |
|
|
/* Ignore blocks that are NULL. */
|
12815 |
|
|
if (stmt == NULL_TREE)
|
12816 |
|
|
return;
|
12817 |
|
|
|
12818 |
|
|
/* If the block is one fragment of a non-contiguous block, do not
|
12819 |
|
|
process the variables, since they will have been done by the
|
12820 |
|
|
origin block. Do process subblocks. */
|
12821 |
|
|
if (BLOCK_FRAGMENT_ORIGIN (stmt))
|
12822 |
|
|
{
|
12823 |
|
|
tree sub;
|
12824 |
|
|
|
12825 |
|
|
for (sub = BLOCK_SUBBLOCKS (stmt); sub; sub = BLOCK_CHAIN (sub))
|
12826 |
|
|
gen_block_die (sub, context_die, depth + 1);
|
12827 |
|
|
|
12828 |
|
|
return;
|
12829 |
|
|
}
|
12830 |
|
|
|
12831 |
|
|
/* Determine the "ultimate origin" of this block. This block may be an
|
12832 |
|
|
inlined instance of an inlined instance of inline function, so we have
|
12833 |
|
|
to trace all of the way back through the origin chain to find out what
|
12834 |
|
|
sort of node actually served as the original seed for the creation of
|
12835 |
|
|
the current block. */
|
12836 |
|
|
origin = block_ultimate_origin (stmt);
|
12837 |
|
|
origin_code = (origin != NULL) ? TREE_CODE (origin) : ERROR_MARK;
|
12838 |
|
|
|
12839 |
|
|
/* Determine if we need to output any Dwarf DIEs at all to represent this
|
12840 |
|
|
block. */
|
12841 |
|
|
if (origin_code == FUNCTION_DECL)
|
12842 |
|
|
/* The outer scopes for inlinings *must* always be represented. We
|
12843 |
|
|
generate DW_TAG_inlined_subroutine DIEs for them. (See below.) */
|
12844 |
|
|
must_output_die = 1;
|
12845 |
|
|
else
|
12846 |
|
|
{
|
12847 |
|
|
/* In the case where the current block represents an inlining of the
|
12848 |
|
|
"body block" of an inline function, we must *NOT* output any DIE for
|
12849 |
|
|
this block because we have already output a DIE to represent the whole
|
12850 |
|
|
inlined function scope and the "body block" of any function doesn't
|
12851 |
|
|
really represent a different scope according to ANSI C rules. So we
|
12852 |
|
|
check here to make sure that this block does not represent a "body
|
12853 |
|
|
block inlining" before trying to set the MUST_OUTPUT_DIE flag. */
|
12854 |
|
|
if (! is_body_block (origin ? origin : stmt))
|
12855 |
|
|
{
|
12856 |
|
|
/* Determine if this block directly contains any "significant"
|
12857 |
|
|
local declarations which we will need to output DIEs for. */
|
12858 |
|
|
if (debug_info_level > DINFO_LEVEL_TERSE)
|
12859 |
|
|
/* We are not in terse mode so *any* local declaration counts
|
12860 |
|
|
as being a "significant" one. */
|
12861 |
|
|
must_output_die = (BLOCK_VARS (stmt) != NULL
|
12862 |
|
|
&& (TREE_USED (stmt)
|
12863 |
|
|
|| TREE_ASM_WRITTEN (stmt)
|
12864 |
|
|
|| BLOCK_ABSTRACT (stmt)));
|
12865 |
|
|
else
|
12866 |
|
|
/* We are in terse mode, so only local (nested) function
|
12867 |
|
|
definitions count as "significant" local declarations. */
|
12868 |
|
|
for (decl = BLOCK_VARS (stmt);
|
12869 |
|
|
decl != NULL; decl = TREE_CHAIN (decl))
|
12870 |
|
|
if (TREE_CODE (decl) == FUNCTION_DECL
|
12871 |
|
|
&& DECL_INITIAL (decl))
|
12872 |
|
|
{
|
12873 |
|
|
must_output_die = 1;
|
12874 |
|
|
break;
|
12875 |
|
|
}
|
12876 |
|
|
}
|
12877 |
|
|
}
|
12878 |
|
|
|
12879 |
|
|
/* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
|
12880 |
|
|
DIE for any block which contains no significant local declarations at
|
12881 |
|
|
all. Rather, in such cases we just call `decls_for_scope' so that any
|
12882 |
|
|
needed Dwarf info for any sub-blocks will get properly generated. Note
|
12883 |
|
|
that in terse mode, our definition of what constitutes a "significant"
|
12884 |
|
|
local declaration gets restricted to include only inlined function
|
12885 |
|
|
instances and local (nested) function definitions. */
|
12886 |
|
|
if (must_output_die)
|
12887 |
|
|
{
|
12888 |
|
|
if (origin_code == FUNCTION_DECL)
|
12889 |
|
|
gen_inlined_subroutine_die (stmt, context_die, depth);
|
12890 |
|
|
else
|
12891 |
|
|
gen_lexical_block_die (stmt, context_die, depth);
|
12892 |
|
|
}
|
12893 |
|
|
else
|
12894 |
|
|
decls_for_scope (stmt, context_die, depth);
|
12895 |
|
|
}
|
12896 |
|
|
|
12897 |
|
|
/* Generate all of the decls declared within a given scope and (recursively)
|
12898 |
|
|
all of its sub-blocks. */
|
12899 |
|
|
|
12900 |
|
|
static void
|
12901 |
|
|
decls_for_scope (tree stmt, dw_die_ref context_die, int depth)
|
12902 |
|
|
{
|
12903 |
|
|
tree decl;
|
12904 |
|
|
tree subblocks;
|
12905 |
|
|
|
12906 |
|
|
/* Ignore NULL blocks. */
|
12907 |
|
|
if (stmt == NULL_TREE)
|
12908 |
|
|
return;
|
12909 |
|
|
|
12910 |
|
|
if (TREE_USED (stmt))
|
12911 |
|
|
{
|
12912 |
|
|
/* Output the DIEs to represent all of the data objects and typedefs
|
12913 |
|
|
declared directly within this block but not within any nested
|
12914 |
|
|
sub-blocks. Also, nested function and tag DIEs have been
|
12915 |
|
|
generated with a parent of NULL; fix that up now. */
|
12916 |
|
|
for (decl = BLOCK_VARS (stmt); decl != NULL; decl = TREE_CHAIN (decl))
|
12917 |
|
|
{
|
12918 |
|
|
dw_die_ref die;
|
12919 |
|
|
|
12920 |
|
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
12921 |
|
|
die = lookup_decl_die (decl);
|
12922 |
|
|
else if (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl))
|
12923 |
|
|
die = lookup_type_die (TREE_TYPE (decl));
|
12924 |
|
|
else
|
12925 |
|
|
die = NULL;
|
12926 |
|
|
|
12927 |
|
|
if (die != NULL && die->die_parent == NULL)
|
12928 |
|
|
add_child_die (context_die, die);
|
12929 |
|
|
/* Do not produce debug information for static variables since
|
12930 |
|
|
these might be optimized out. We are called for these later
|
12931 |
|
|
in cgraph_varpool_analyze_pending_decls. */
|
12932 |
|
|
if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
|
12933 |
|
|
;
|
12934 |
|
|
else
|
12935 |
|
|
gen_decl_die (decl, context_die);
|
12936 |
|
|
}
|
12937 |
|
|
}
|
12938 |
|
|
|
12939 |
|
|
/* If we're at -g1, we're not interested in subblocks. */
|
12940 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
12941 |
|
|
return;
|
12942 |
|
|
|
12943 |
|
|
/* Output the DIEs to represent all sub-blocks (and the items declared
|
12944 |
|
|
therein) of this block. */
|
12945 |
|
|
for (subblocks = BLOCK_SUBBLOCKS (stmt);
|
12946 |
|
|
subblocks != NULL;
|
12947 |
|
|
subblocks = BLOCK_CHAIN (subblocks))
|
12948 |
|
|
gen_block_die (subblocks, context_die, depth + 1);
|
12949 |
|
|
}
|
12950 |
|
|
|
12951 |
|
|
/* Is this a typedef we can avoid emitting? */
|
12952 |
|
|
|
12953 |
|
|
static inline int
|
12954 |
|
|
is_redundant_typedef (tree decl)
|
12955 |
|
|
{
|
12956 |
|
|
if (TYPE_DECL_IS_STUB (decl))
|
12957 |
|
|
return 1;
|
12958 |
|
|
|
12959 |
|
|
if (DECL_ARTIFICIAL (decl)
|
12960 |
|
|
&& DECL_CONTEXT (decl)
|
12961 |
|
|
&& is_tagged_type (DECL_CONTEXT (decl))
|
12962 |
|
|
&& TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
|
12963 |
|
|
&& DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
|
12964 |
|
|
/* Also ignore the artificial member typedef for the class name. */
|
12965 |
|
|
return 1;
|
12966 |
|
|
|
12967 |
|
|
return 0;
|
12968 |
|
|
}
|
12969 |
|
|
|
12970 |
|
|
/* Returns the DIE for decl. A DIE will always be returned. */
|
12971 |
|
|
|
12972 |
|
|
static dw_die_ref
|
12973 |
|
|
force_decl_die (tree decl)
|
12974 |
|
|
{
|
12975 |
|
|
dw_die_ref decl_die;
|
12976 |
|
|
unsigned saved_external_flag;
|
12977 |
|
|
tree save_fn = NULL_TREE;
|
12978 |
|
|
decl_die = lookup_decl_die (decl);
|
12979 |
|
|
if (!decl_die)
|
12980 |
|
|
{
|
12981 |
|
|
dw_die_ref context_die;
|
12982 |
|
|
tree decl_context = DECL_CONTEXT (decl);
|
12983 |
|
|
if (decl_context)
|
12984 |
|
|
{
|
12985 |
|
|
/* Find die that represents this context. */
|
12986 |
|
|
if (TYPE_P (decl_context))
|
12987 |
|
|
context_die = force_type_die (decl_context);
|
12988 |
|
|
else
|
12989 |
|
|
context_die = force_decl_die (decl_context);
|
12990 |
|
|
}
|
12991 |
|
|
else
|
12992 |
|
|
context_die = comp_unit_die;
|
12993 |
|
|
|
12994 |
|
|
decl_die = lookup_decl_die (decl);
|
12995 |
|
|
if (decl_die)
|
12996 |
|
|
return decl_die;
|
12997 |
|
|
|
12998 |
|
|
switch (TREE_CODE (decl))
|
12999 |
|
|
{
|
13000 |
|
|
case FUNCTION_DECL:
|
13001 |
|
|
/* Clear current_function_decl, so that gen_subprogram_die thinks
|
13002 |
|
|
that this is a declaration. At this point, we just want to force
|
13003 |
|
|
declaration die. */
|
13004 |
|
|
save_fn = current_function_decl;
|
13005 |
|
|
current_function_decl = NULL_TREE;
|
13006 |
|
|
gen_subprogram_die (decl, context_die);
|
13007 |
|
|
current_function_decl = save_fn;
|
13008 |
|
|
break;
|
13009 |
|
|
|
13010 |
|
|
case VAR_DECL:
|
13011 |
|
|
/* Set external flag to force declaration die. Restore it after
|
13012 |
|
|
gen_decl_die() call. */
|
13013 |
|
|
saved_external_flag = DECL_EXTERNAL (decl);
|
13014 |
|
|
DECL_EXTERNAL (decl) = 1;
|
13015 |
|
|
gen_decl_die (decl, context_die);
|
13016 |
|
|
DECL_EXTERNAL (decl) = saved_external_flag;
|
13017 |
|
|
break;
|
13018 |
|
|
|
13019 |
|
|
case NAMESPACE_DECL:
|
13020 |
|
|
dwarf2out_decl (decl);
|
13021 |
|
|
break;
|
13022 |
|
|
|
13023 |
|
|
default:
|
13024 |
|
|
gcc_unreachable ();
|
13025 |
|
|
}
|
13026 |
|
|
|
13027 |
|
|
/* We should be able to find the DIE now. */
|
13028 |
|
|
if (!decl_die)
|
13029 |
|
|
decl_die = lookup_decl_die (decl);
|
13030 |
|
|
gcc_assert (decl_die);
|
13031 |
|
|
}
|
13032 |
|
|
|
13033 |
|
|
return decl_die;
|
13034 |
|
|
}
|
13035 |
|
|
|
13036 |
|
|
/* Returns the DIE for TYPE, that must not be a base type. A DIE is
|
13037 |
|
|
always returned. */
|
13038 |
|
|
|
13039 |
|
|
static dw_die_ref
|
13040 |
|
|
force_type_die (tree type)
|
13041 |
|
|
{
|
13042 |
|
|
dw_die_ref type_die;
|
13043 |
|
|
|
13044 |
|
|
type_die = lookup_type_die (type);
|
13045 |
|
|
if (!type_die)
|
13046 |
|
|
{
|
13047 |
|
|
dw_die_ref context_die;
|
13048 |
|
|
if (TYPE_CONTEXT (type))
|
13049 |
|
|
{
|
13050 |
|
|
if (TYPE_P (TYPE_CONTEXT (type)))
|
13051 |
|
|
context_die = force_type_die (TYPE_CONTEXT (type));
|
13052 |
|
|
else
|
13053 |
|
|
context_die = force_decl_die (TYPE_CONTEXT (type));
|
13054 |
|
|
}
|
13055 |
|
|
else
|
13056 |
|
|
context_die = comp_unit_die;
|
13057 |
|
|
|
13058 |
|
|
type_die = lookup_type_die (type);
|
13059 |
|
|
if (type_die)
|
13060 |
|
|
return type_die;
|
13061 |
|
|
gen_type_die (type, context_die);
|
13062 |
|
|
type_die = lookup_type_die (type);
|
13063 |
|
|
gcc_assert (type_die);
|
13064 |
|
|
}
|
13065 |
|
|
return type_die;
|
13066 |
|
|
}
|
13067 |
|
|
|
13068 |
|
|
/* Force out any required namespaces to be able to output DECL,
|
13069 |
|
|
and return the new context_die for it, if it's changed. */
|
13070 |
|
|
|
13071 |
|
|
static dw_die_ref
|
13072 |
|
|
setup_namespace_context (tree thing, dw_die_ref context_die)
|
13073 |
|
|
{
|
13074 |
|
|
tree context = (DECL_P (thing)
|
13075 |
|
|
? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing));
|
13076 |
|
|
if (context && TREE_CODE (context) == NAMESPACE_DECL)
|
13077 |
|
|
/* Force out the namespace. */
|
13078 |
|
|
context_die = force_decl_die (context);
|
13079 |
|
|
|
13080 |
|
|
return context_die;
|
13081 |
|
|
}
|
13082 |
|
|
|
13083 |
|
|
/* Emit a declaration DIE for THING (which is either a DECL or a tagged
|
13084 |
|
|
type) within its namespace, if appropriate.
|
13085 |
|
|
|
13086 |
|
|
For compatibility with older debuggers, namespace DIEs only contain
|
13087 |
|
|
declarations; all definitions are emitted at CU scope. */
|
13088 |
|
|
|
13089 |
|
|
static void
|
13090 |
|
|
declare_in_namespace (tree thing, dw_die_ref context_die)
|
13091 |
|
|
{
|
13092 |
|
|
dw_die_ref ns_context;
|
13093 |
|
|
|
13094 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13095 |
|
|
return;
|
13096 |
|
|
|
13097 |
|
|
/* If this decl is from an inlined function, then don't try to emit it in its
|
13098 |
|
|
namespace, as we will get confused. It would have already been emitted
|
13099 |
|
|
when the abstract instance of the inline function was emitted anyways. */
|
13100 |
|
|
if (DECL_P (thing) && DECL_ABSTRACT_ORIGIN (thing))
|
13101 |
|
|
return;
|
13102 |
|
|
|
13103 |
|
|
ns_context = setup_namespace_context (thing, context_die);
|
13104 |
|
|
|
13105 |
|
|
if (ns_context != context_die)
|
13106 |
|
|
{
|
13107 |
|
|
if (DECL_P (thing))
|
13108 |
|
|
gen_decl_die (thing, ns_context);
|
13109 |
|
|
else
|
13110 |
|
|
gen_type_die (thing, ns_context);
|
13111 |
|
|
}
|
13112 |
|
|
}
|
13113 |
|
|
|
13114 |
|
|
/* Generate a DIE for a namespace or namespace alias. */
|
13115 |
|
|
|
13116 |
|
|
static void
|
13117 |
|
|
gen_namespace_die (tree decl)
|
13118 |
|
|
{
|
13119 |
|
|
dw_die_ref context_die = setup_namespace_context (decl, comp_unit_die);
|
13120 |
|
|
|
13121 |
|
|
/* Namespace aliases have a DECL_ABSTRACT_ORIGIN of the namespace
|
13122 |
|
|
they are an alias of. */
|
13123 |
|
|
if (DECL_ABSTRACT_ORIGIN (decl) == NULL)
|
13124 |
|
|
{
|
13125 |
|
|
/* Output a real namespace. */
|
13126 |
|
|
dw_die_ref namespace_die
|
13127 |
|
|
= new_die (DW_TAG_namespace, context_die, decl);
|
13128 |
|
|
add_name_and_src_coords_attributes (namespace_die, decl);
|
13129 |
|
|
equate_decl_number_to_die (decl, namespace_die);
|
13130 |
|
|
}
|
13131 |
|
|
else
|
13132 |
|
|
{
|
13133 |
|
|
/* Output a namespace alias. */
|
13134 |
|
|
|
13135 |
|
|
/* Force out the namespace we are an alias of, if necessary. */
|
13136 |
|
|
dw_die_ref origin_die
|
13137 |
|
|
= force_decl_die (DECL_ABSTRACT_ORIGIN (decl));
|
13138 |
|
|
|
13139 |
|
|
/* Now create the namespace alias DIE. */
|
13140 |
|
|
dw_die_ref namespace_die
|
13141 |
|
|
= new_die (DW_TAG_imported_declaration, context_die, decl);
|
13142 |
|
|
add_name_and_src_coords_attributes (namespace_die, decl);
|
13143 |
|
|
add_AT_die_ref (namespace_die, DW_AT_import, origin_die);
|
13144 |
|
|
equate_decl_number_to_die (decl, namespace_die);
|
13145 |
|
|
}
|
13146 |
|
|
}
|
13147 |
|
|
|
13148 |
|
|
/* Generate Dwarf debug information for a decl described by DECL. */
|
13149 |
|
|
|
13150 |
|
|
static void
|
13151 |
|
|
gen_decl_die (tree decl, dw_die_ref context_die)
|
13152 |
|
|
{
|
13153 |
|
|
tree origin;
|
13154 |
|
|
|
13155 |
|
|
if (DECL_P (decl) && DECL_IGNORED_P (decl))
|
13156 |
|
|
return;
|
13157 |
|
|
|
13158 |
|
|
switch (TREE_CODE (decl))
|
13159 |
|
|
{
|
13160 |
|
|
case ERROR_MARK:
|
13161 |
|
|
break;
|
13162 |
|
|
|
13163 |
|
|
case CONST_DECL:
|
13164 |
|
|
/* The individual enumerators of an enum type get output when we output
|
13165 |
|
|
the Dwarf representation of the relevant enum type itself. */
|
13166 |
|
|
break;
|
13167 |
|
|
|
13168 |
|
|
case FUNCTION_DECL:
|
13169 |
|
|
/* Don't output any DIEs to represent mere function declarations,
|
13170 |
|
|
unless they are class members or explicit block externs. */
|
13171 |
|
|
if (DECL_INITIAL (decl) == NULL_TREE && DECL_CONTEXT (decl) == NULL_TREE
|
13172 |
|
|
&& (current_function_decl == NULL_TREE || DECL_ARTIFICIAL (decl)))
|
13173 |
|
|
break;
|
13174 |
|
|
|
13175 |
|
|
#if 0
|
13176 |
|
|
/* FIXME */
|
13177 |
|
|
/* This doesn't work because the C frontend sets DECL_ABSTRACT_ORIGIN
|
13178 |
|
|
on local redeclarations of global functions. That seems broken. */
|
13179 |
|
|
if (current_function_decl != decl)
|
13180 |
|
|
/* This is only a declaration. */;
|
13181 |
|
|
#endif
|
13182 |
|
|
|
13183 |
|
|
/* If we're emitting a clone, emit info for the abstract instance. */
|
13184 |
|
|
if (DECL_ORIGIN (decl) != decl)
|
13185 |
|
|
dwarf2out_abstract_function (DECL_ABSTRACT_ORIGIN (decl));
|
13186 |
|
|
|
13187 |
|
|
/* If we're emitting an out-of-line copy of an inline function,
|
13188 |
|
|
emit info for the abstract instance and set up to refer to it. */
|
13189 |
|
|
else if (cgraph_function_possibly_inlined_p (decl)
|
13190 |
|
|
&& ! DECL_ABSTRACT (decl)
|
13191 |
|
|
&& ! class_or_namespace_scope_p (context_die)
|
13192 |
|
|
/* dwarf2out_abstract_function won't emit a die if this is just
|
13193 |
|
|
a declaration. We must avoid setting DECL_ABSTRACT_ORIGIN in
|
13194 |
|
|
that case, because that works only if we have a die. */
|
13195 |
|
|
&& DECL_INITIAL (decl) != NULL_TREE)
|
13196 |
|
|
{
|
13197 |
|
|
dwarf2out_abstract_function (decl);
|
13198 |
|
|
set_decl_origin_self (decl);
|
13199 |
|
|
}
|
13200 |
|
|
|
13201 |
|
|
/* Otherwise we're emitting the primary DIE for this decl. */
|
13202 |
|
|
else if (debug_info_level > DINFO_LEVEL_TERSE)
|
13203 |
|
|
{
|
13204 |
|
|
/* Before we describe the FUNCTION_DECL itself, make sure that we
|
13205 |
|
|
have described its return type. */
|
13206 |
|
|
gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
|
13207 |
|
|
|
13208 |
|
|
/* And its virtual context. */
|
13209 |
|
|
if (DECL_VINDEX (decl) != NULL_TREE)
|
13210 |
|
|
gen_type_die (DECL_CONTEXT (decl), context_die);
|
13211 |
|
|
|
13212 |
|
|
/* And its containing type. */
|
13213 |
|
|
origin = decl_class_context (decl);
|
13214 |
|
|
if (origin != NULL_TREE)
|
13215 |
|
|
gen_type_die_for_member (origin, decl, context_die);
|
13216 |
|
|
|
13217 |
|
|
/* And its containing namespace. */
|
13218 |
|
|
declare_in_namespace (decl, context_die);
|
13219 |
|
|
}
|
13220 |
|
|
|
13221 |
|
|
/* Now output a DIE to represent the function itself. */
|
13222 |
|
|
gen_subprogram_die (decl, context_die);
|
13223 |
|
|
break;
|
13224 |
|
|
|
13225 |
|
|
case TYPE_DECL:
|
13226 |
|
|
/* If we are in terse mode, don't generate any DIEs to represent any
|
13227 |
|
|
actual typedefs. */
|
13228 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13229 |
|
|
break;
|
13230 |
|
|
|
13231 |
|
|
/* In the special case of a TYPE_DECL node representing the declaration
|
13232 |
|
|
of some type tag, if the given TYPE_DECL is marked as having been
|
13233 |
|
|
instantiated from some other (original) TYPE_DECL node (e.g. one which
|
13234 |
|
|
was generated within the original definition of an inline function) we
|
13235 |
|
|
have to generate a special (abbreviated) DW_TAG_structure_type,
|
13236 |
|
|
DW_TAG_union_type, or DW_TAG_enumeration_type DIE here. */
|
13237 |
|
|
if (TYPE_DECL_IS_STUB (decl) && decl_ultimate_origin (decl) != NULL_TREE
|
13238 |
|
|
&& is_tagged_type (TREE_TYPE (decl)))
|
13239 |
|
|
{
|
13240 |
|
|
gen_tagged_type_instantiation_die (TREE_TYPE (decl), context_die);
|
13241 |
|
|
break;
|
13242 |
|
|
}
|
13243 |
|
|
|
13244 |
|
|
if (is_redundant_typedef (decl))
|
13245 |
|
|
gen_type_die (TREE_TYPE (decl), context_die);
|
13246 |
|
|
else
|
13247 |
|
|
/* Output a DIE to represent the typedef itself. */
|
13248 |
|
|
gen_typedef_die (decl, context_die);
|
13249 |
|
|
break;
|
13250 |
|
|
|
13251 |
|
|
case LABEL_DECL:
|
13252 |
|
|
if (debug_info_level >= DINFO_LEVEL_NORMAL)
|
13253 |
|
|
gen_label_die (decl, context_die);
|
13254 |
|
|
break;
|
13255 |
|
|
|
13256 |
|
|
case VAR_DECL:
|
13257 |
|
|
case RESULT_DECL:
|
13258 |
|
|
/* If we are in terse mode, don't generate any DIEs to represent any
|
13259 |
|
|
variable declarations or definitions. */
|
13260 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13261 |
|
|
break;
|
13262 |
|
|
|
13263 |
|
|
/* Output any DIEs that are needed to specify the type of this data
|
13264 |
|
|
object. */
|
13265 |
|
|
gen_type_die (TREE_TYPE (decl), context_die);
|
13266 |
|
|
|
13267 |
|
|
/* And its containing type. */
|
13268 |
|
|
origin = decl_class_context (decl);
|
13269 |
|
|
if (origin != NULL_TREE)
|
13270 |
|
|
gen_type_die_for_member (origin, decl, context_die);
|
13271 |
|
|
|
13272 |
|
|
/* And its containing namespace. */
|
13273 |
|
|
declare_in_namespace (decl, context_die);
|
13274 |
|
|
|
13275 |
|
|
/* Now output the DIE to represent the data object itself. This gets
|
13276 |
|
|
complicated because of the possibility that the VAR_DECL really
|
13277 |
|
|
represents an inlined instance of a formal parameter for an inline
|
13278 |
|
|
function. */
|
13279 |
|
|
origin = decl_ultimate_origin (decl);
|
13280 |
|
|
if (origin != NULL_TREE && TREE_CODE (origin) == PARM_DECL)
|
13281 |
|
|
gen_formal_parameter_die (decl, context_die);
|
13282 |
|
|
else
|
13283 |
|
|
gen_variable_die (decl, context_die);
|
13284 |
|
|
break;
|
13285 |
|
|
|
13286 |
|
|
case FIELD_DECL:
|
13287 |
|
|
/* Ignore the nameless fields that are used to skip bits but handle C++
|
13288 |
|
|
anonymous unions and structs. */
|
13289 |
|
|
if (DECL_NAME (decl) != NULL_TREE
|
13290 |
|
|
|| TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
|
13291 |
|
|
|| TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
|
13292 |
|
|
{
|
13293 |
|
|
gen_type_die (member_declared_type (decl), context_die);
|
13294 |
|
|
gen_field_die (decl, context_die);
|
13295 |
|
|
}
|
13296 |
|
|
break;
|
13297 |
|
|
|
13298 |
|
|
case PARM_DECL:
|
13299 |
|
|
gen_type_die (TREE_TYPE (decl), context_die);
|
13300 |
|
|
gen_formal_parameter_die (decl, context_die);
|
13301 |
|
|
break;
|
13302 |
|
|
|
13303 |
|
|
case NAMESPACE_DECL:
|
13304 |
|
|
gen_namespace_die (decl);
|
13305 |
|
|
break;
|
13306 |
|
|
|
13307 |
|
|
default:
|
13308 |
|
|
/* Probably some frontend-internal decl. Assume we don't care. */
|
13309 |
|
|
gcc_assert ((int)TREE_CODE (decl) > NUM_TREE_CODES);
|
13310 |
|
|
break;
|
13311 |
|
|
}
|
13312 |
|
|
}
|
13313 |
|
|
|
13314 |
|
|
/* Output debug information for global decl DECL. Called from toplev.c after
|
13315 |
|
|
compilation proper has finished. */
|
13316 |
|
|
|
13317 |
|
|
static void
|
13318 |
|
|
dwarf2out_global_decl (tree decl)
|
13319 |
|
|
{
|
13320 |
|
|
/* Output DWARF2 information for file-scope tentative data object
|
13321 |
|
|
declarations, file-scope (extern) function declarations (which had no
|
13322 |
|
|
corresponding body) and file-scope tagged type declarations and
|
13323 |
|
|
definitions which have not yet been forced out. */
|
13324 |
|
|
if (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl))
|
13325 |
|
|
dwarf2out_decl (decl);
|
13326 |
|
|
}
|
13327 |
|
|
|
13328 |
|
|
/* Output debug information for type decl DECL. Called from toplev.c
|
13329 |
|
|
and from language front ends (to record built-in types). */
|
13330 |
|
|
static void
|
13331 |
|
|
dwarf2out_type_decl (tree decl, int local)
|
13332 |
|
|
{
|
13333 |
|
|
if (!local)
|
13334 |
|
|
dwarf2out_decl (decl);
|
13335 |
|
|
}
|
13336 |
|
|
|
13337 |
|
|
/* Output debug information for imported module or decl. */
|
13338 |
|
|
|
13339 |
|
|
static void
|
13340 |
|
|
dwarf2out_imported_module_or_decl (tree decl, tree context)
|
13341 |
|
|
{
|
13342 |
|
|
dw_die_ref imported_die, at_import_die;
|
13343 |
|
|
dw_die_ref scope_die;
|
13344 |
|
|
expanded_location xloc;
|
13345 |
|
|
|
13346 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13347 |
|
|
return;
|
13348 |
|
|
|
13349 |
|
|
gcc_assert (decl);
|
13350 |
|
|
|
13351 |
|
|
/* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
|
13352 |
|
|
We need decl DIE for reference and scope die. First, get DIE for the decl
|
13353 |
|
|
itself. */
|
13354 |
|
|
|
13355 |
|
|
/* Get the scope die for decl context. Use comp_unit_die for global module
|
13356 |
|
|
or decl. If die is not found for non globals, force new die. */
|
13357 |
|
|
if (!context)
|
13358 |
|
|
scope_die = comp_unit_die;
|
13359 |
|
|
else if (TYPE_P (context))
|
13360 |
|
|
scope_die = force_type_die (context);
|
13361 |
|
|
else
|
13362 |
|
|
scope_die = force_decl_die (context);
|
13363 |
|
|
|
13364 |
|
|
/* For TYPE_DECL or CONST_DECL, lookup TREE_TYPE. */
|
13365 |
|
|
if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL)
|
13366 |
|
|
{
|
13367 |
|
|
if (is_base_type (TREE_TYPE (decl)))
|
13368 |
|
|
at_import_die = base_type_die (TREE_TYPE (decl));
|
13369 |
|
|
else
|
13370 |
|
|
at_import_die = force_type_die (TREE_TYPE (decl));
|
13371 |
|
|
}
|
13372 |
|
|
else
|
13373 |
|
|
{
|
13374 |
|
|
at_import_die = lookup_decl_die (decl);
|
13375 |
|
|
if (!at_import_die)
|
13376 |
|
|
{
|
13377 |
|
|
/* If we're trying to avoid duplicate debug info, we may not have
|
13378 |
|
|
emitted the member decl for this field. Emit it now. */
|
13379 |
|
|
if (TREE_CODE (decl) == FIELD_DECL)
|
13380 |
|
|
{
|
13381 |
|
|
tree type = DECL_CONTEXT (decl);
|
13382 |
|
|
dw_die_ref type_context_die;
|
13383 |
|
|
|
13384 |
|
|
if (TYPE_CONTEXT (type))
|
13385 |
|
|
if (TYPE_P (TYPE_CONTEXT (type)))
|
13386 |
|
|
type_context_die = force_type_die (TYPE_CONTEXT (type));
|
13387 |
|
|
else
|
13388 |
|
|
type_context_die = force_decl_die (TYPE_CONTEXT (type));
|
13389 |
|
|
else
|
13390 |
|
|
type_context_die = comp_unit_die;
|
13391 |
|
|
gen_type_die_for_member (type, decl, type_context_die);
|
13392 |
|
|
}
|
13393 |
|
|
at_import_die = force_decl_die (decl);
|
13394 |
|
|
}
|
13395 |
|
|
}
|
13396 |
|
|
|
13397 |
|
|
/* OK, now we have DIEs for decl as well as scope. Emit imported die. */
|
13398 |
|
|
if (TREE_CODE (decl) == NAMESPACE_DECL)
|
13399 |
|
|
imported_die = new_die (DW_TAG_imported_module, scope_die, context);
|
13400 |
|
|
else
|
13401 |
|
|
imported_die = new_die (DW_TAG_imported_declaration, scope_die, context);
|
13402 |
|
|
|
13403 |
|
|
xloc = expand_location (input_location);
|
13404 |
|
|
add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file));
|
13405 |
|
|
add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line);
|
13406 |
|
|
add_AT_die_ref (imported_die, DW_AT_import, at_import_die);
|
13407 |
|
|
}
|
13408 |
|
|
|
13409 |
|
|
/* Write the debugging output for DECL. */
|
13410 |
|
|
|
13411 |
|
|
void
|
13412 |
|
|
dwarf2out_decl (tree decl)
|
13413 |
|
|
{
|
13414 |
|
|
dw_die_ref context_die = comp_unit_die;
|
13415 |
|
|
|
13416 |
|
|
switch (TREE_CODE (decl))
|
13417 |
|
|
{
|
13418 |
|
|
case ERROR_MARK:
|
13419 |
|
|
return;
|
13420 |
|
|
|
13421 |
|
|
case FUNCTION_DECL:
|
13422 |
|
|
/* What we would really like to do here is to filter out all mere
|
13423 |
|
|
file-scope declarations of file-scope functions which are never
|
13424 |
|
|
referenced later within this translation unit (and keep all of ones
|
13425 |
|
|
that *are* referenced later on) but we aren't clairvoyant, so we have
|
13426 |
|
|
no idea which functions will be referenced in the future (i.e. later
|
13427 |
|
|
on within the current translation unit). So here we just ignore all
|
13428 |
|
|
file-scope function declarations which are not also definitions. If
|
13429 |
|
|
and when the debugger needs to know something about these functions,
|
13430 |
|
|
it will have to hunt around and find the DWARF information associated
|
13431 |
|
|
with the definition of the function.
|
13432 |
|
|
|
13433 |
|
|
We can't just check DECL_EXTERNAL to find out which FUNCTION_DECL
|
13434 |
|
|
nodes represent definitions and which ones represent mere
|
13435 |
|
|
declarations. We have to check DECL_INITIAL instead. That's because
|
13436 |
|
|
the C front-end supports some weird semantics for "extern inline"
|
13437 |
|
|
function definitions. These can get inlined within the current
|
13438 |
|
|
translation unit (and thus, we need to generate Dwarf info for their
|
13439 |
|
|
abstract instances so that the Dwarf info for the concrete inlined
|
13440 |
|
|
instances can have something to refer to) but the compiler never
|
13441 |
|
|
generates any out-of-lines instances of such things (despite the fact
|
13442 |
|
|
that they *are* definitions).
|
13443 |
|
|
|
13444 |
|
|
The important point is that the C front-end marks these "extern
|
13445 |
|
|
inline" functions as DECL_EXTERNAL, but we need to generate DWARF for
|
13446 |
|
|
them anyway. Note that the C++ front-end also plays some similar games
|
13447 |
|
|
for inline function definitions appearing within include files which
|
13448 |
|
|
also contain `#pragma interface' pragmas. */
|
13449 |
|
|
if (DECL_INITIAL (decl) == NULL_TREE)
|
13450 |
|
|
return;
|
13451 |
|
|
|
13452 |
|
|
/* If we're a nested function, initially use a parent of NULL; if we're
|
13453 |
|
|
a plain function, this will be fixed up in decls_for_scope. If
|
13454 |
|
|
we're a method, it will be ignored, since we already have a DIE. */
|
13455 |
|
|
if (decl_function_context (decl)
|
13456 |
|
|
/* But if we're in terse mode, we don't care about scope. */
|
13457 |
|
|
&& debug_info_level > DINFO_LEVEL_TERSE)
|
13458 |
|
|
context_die = NULL;
|
13459 |
|
|
break;
|
13460 |
|
|
|
13461 |
|
|
case VAR_DECL:
|
13462 |
|
|
/* Ignore this VAR_DECL if it refers to a file-scope extern data object
|
13463 |
|
|
declaration and if the declaration was never even referenced from
|
13464 |
|
|
within this entire compilation unit. We suppress these DIEs in
|
13465 |
|
|
order to save space in the .debug section (by eliminating entries
|
13466 |
|
|
which are probably useless). Note that we must not suppress
|
13467 |
|
|
block-local extern declarations (whether used or not) because that
|
13468 |
|
|
would screw-up the debugger's name lookup mechanism and cause it to
|
13469 |
|
|
miss things which really ought to be in scope at a given point. */
|
13470 |
|
|
if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
|
13471 |
|
|
return;
|
13472 |
|
|
|
13473 |
|
|
/* For local statics lookup proper context die. */
|
13474 |
|
|
if (TREE_STATIC (decl) && decl_function_context (decl))
|
13475 |
|
|
context_die = lookup_decl_die (DECL_CONTEXT (decl));
|
13476 |
|
|
|
13477 |
|
|
/* If we are in terse mode, don't generate any DIEs to represent any
|
13478 |
|
|
variable declarations or definitions. */
|
13479 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13480 |
|
|
return;
|
13481 |
|
|
break;
|
13482 |
|
|
|
13483 |
|
|
case NAMESPACE_DECL:
|
13484 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13485 |
|
|
return;
|
13486 |
|
|
if (lookup_decl_die (decl) != NULL)
|
13487 |
|
|
return;
|
13488 |
|
|
break;
|
13489 |
|
|
|
13490 |
|
|
case TYPE_DECL:
|
13491 |
|
|
/* Don't emit stubs for types unless they are needed by other DIEs. */
|
13492 |
|
|
if (TYPE_DECL_SUPPRESS_DEBUG (decl))
|
13493 |
|
|
return;
|
13494 |
|
|
|
13495 |
|
|
/* Don't bother trying to generate any DIEs to represent any of the
|
13496 |
|
|
normal built-in types for the language we are compiling. */
|
13497 |
|
|
if (DECL_IS_BUILTIN (decl))
|
13498 |
|
|
{
|
13499 |
|
|
/* OK, we need to generate one for `bool' so GDB knows what type
|
13500 |
|
|
comparisons have. */
|
13501 |
|
|
if (is_cxx ()
|
13502 |
|
|
&& TREE_CODE (TREE_TYPE (decl)) == BOOLEAN_TYPE
|
13503 |
|
|
&& ! DECL_IGNORED_P (decl))
|
13504 |
|
|
modified_type_die (TREE_TYPE (decl), 0, 0, NULL);
|
13505 |
|
|
|
13506 |
|
|
return;
|
13507 |
|
|
}
|
13508 |
|
|
|
13509 |
|
|
/* If we are in terse mode, don't generate any DIEs for types. */
|
13510 |
|
|
if (debug_info_level <= DINFO_LEVEL_TERSE)
|
13511 |
|
|
return;
|
13512 |
|
|
|
13513 |
|
|
/* If we're a function-scope tag, initially use a parent of NULL;
|
13514 |
|
|
this will be fixed up in decls_for_scope. */
|
13515 |
|
|
if (decl_function_context (decl))
|
13516 |
|
|
context_die = NULL;
|
13517 |
|
|
|
13518 |
|
|
break;
|
13519 |
|
|
|
13520 |
|
|
default:
|
13521 |
|
|
return;
|
13522 |
|
|
}
|
13523 |
|
|
|
13524 |
|
|
gen_decl_die (decl, context_die);
|
13525 |
|
|
}
|
13526 |
|
|
|
13527 |
|
|
/* Output a marker (i.e. a label) for the beginning of the generated code for
|
13528 |
|
|
a lexical block. */
|
13529 |
|
|
|
13530 |
|
|
static void
|
13531 |
|
|
dwarf2out_begin_block (unsigned int line ATTRIBUTE_UNUSED,
|
13532 |
|
|
unsigned int blocknum)
|
13533 |
|
|
{
|
13534 |
|
|
switch_to_section (current_function_section ());
|
13535 |
|
|
ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
|
13536 |
|
|
}
|
13537 |
|
|
|
13538 |
|
|
/* Output a marker (i.e. a label) for the end of the generated code for a
|
13539 |
|
|
lexical block. */
|
13540 |
|
|
|
13541 |
|
|
static void
|
13542 |
|
|
dwarf2out_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int blocknum)
|
13543 |
|
|
{
|
13544 |
|
|
switch_to_section (current_function_section ());
|
13545 |
|
|
ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
|
13546 |
|
|
}
|
13547 |
|
|
|
13548 |
|
|
/* Returns nonzero if it is appropriate not to emit any debugging
|
13549 |
|
|
information for BLOCK, because it doesn't contain any instructions.
|
13550 |
|
|
|
13551 |
|
|
Don't allow this for blocks with nested functions or local classes
|
13552 |
|
|
as we would end up with orphans, and in the presence of scheduling
|
13553 |
|
|
we may end up calling them anyway. */
|
13554 |
|
|
|
13555 |
|
|
static bool
|
13556 |
|
|
dwarf2out_ignore_block (tree block)
|
13557 |
|
|
{
|
13558 |
|
|
tree decl;
|
13559 |
|
|
|
13560 |
|
|
for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
|
13561 |
|
|
if (TREE_CODE (decl) == FUNCTION_DECL
|
13562 |
|
|
|| (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)))
|
13563 |
|
|
return 0;
|
13564 |
|
|
|
13565 |
|
|
return 1;
|
13566 |
|
|
}
|
13567 |
|
|
|
13568 |
|
|
/* Hash table routines for file_hash. */
|
13569 |
|
|
|
13570 |
|
|
static int
|
13571 |
|
|
file_table_eq (const void *p1_p, const void *p2_p)
|
13572 |
|
|
{
|
13573 |
|
|
const struct dwarf_file_data * p1 = p1_p;
|
13574 |
|
|
const char * p2 = p2_p;
|
13575 |
|
|
return strcmp (p1->filename, p2) == 0;
|
13576 |
|
|
}
|
13577 |
|
|
|
13578 |
|
|
static hashval_t
|
13579 |
|
|
file_table_hash (const void *p_p)
|
13580 |
|
|
{
|
13581 |
|
|
const struct dwarf_file_data * p = p_p;
|
13582 |
|
|
return htab_hash_string (p->filename);
|
13583 |
|
|
}
|
13584 |
|
|
|
13585 |
|
|
/* Lookup FILE_NAME (in the list of filenames that we know about here in
|
13586 |
|
|
dwarf2out.c) and return its "index". The index of each (known) filename is
|
13587 |
|
|
just a unique number which is associated with only that one filename. We
|
13588 |
|
|
need such numbers for the sake of generating labels (in the .debug_sfnames
|
13589 |
|
|
section) and references to those files numbers (in the .debug_srcinfo
|
13590 |
|
|
and.debug_macinfo sections). If the filename given as an argument is not
|
13591 |
|
|
found in our current list, add it to the list and assign it the next
|
13592 |
|
|
available unique index number. In order to speed up searches, we remember
|
13593 |
|
|
the index of the filename was looked up last. This handles the majority of
|
13594 |
|
|
all searches. */
|
13595 |
|
|
|
13596 |
|
|
static struct dwarf_file_data *
|
13597 |
|
|
lookup_filename (const char *file_name)
|
13598 |
|
|
{
|
13599 |
|
|
void ** slot;
|
13600 |
|
|
struct dwarf_file_data * created;
|
13601 |
|
|
|
13602 |
|
|
/* Check to see if the file name that was searched on the previous
|
13603 |
|
|
call matches this file name. If so, return the index. */
|
13604 |
|
|
if (file_table_last_lookup
|
13605 |
|
|
&& (file_name == file_table_last_lookup->filename
|
13606 |
|
|
|| strcmp (file_table_last_lookup->filename, file_name) == 0))
|
13607 |
|
|
return file_table_last_lookup;
|
13608 |
|
|
|
13609 |
|
|
/* Didn't match the previous lookup, search the table. */
|
13610 |
|
|
slot = htab_find_slot_with_hash (file_table, file_name,
|
13611 |
|
|
htab_hash_string (file_name), INSERT);
|
13612 |
|
|
if (*slot)
|
13613 |
|
|
return *slot;
|
13614 |
|
|
|
13615 |
|
|
created = ggc_alloc (sizeof (struct dwarf_file_data));
|
13616 |
|
|
created->filename = file_name;
|
13617 |
|
|
created->emitted_number = 0;
|
13618 |
|
|
*slot = created;
|
13619 |
|
|
return created;
|
13620 |
|
|
}
|
13621 |
|
|
|
13622 |
|
|
/* If the assembler will construct the file table, then translate the compiler
|
13623 |
|
|
internal file table number into the assembler file table number, and emit
|
13624 |
|
|
a .file directive if we haven't already emitted one yet. The file table
|
13625 |
|
|
numbers are different because we prune debug info for unused variables and
|
13626 |
|
|
types, which may include filenames. */
|
13627 |
|
|
|
13628 |
|
|
static int
|
13629 |
|
|
maybe_emit_file (struct dwarf_file_data * fd)
|
13630 |
|
|
{
|
13631 |
|
|
if (! fd->emitted_number)
|
13632 |
|
|
{
|
13633 |
|
|
if (last_emitted_file)
|
13634 |
|
|
fd->emitted_number = last_emitted_file->emitted_number + 1;
|
13635 |
|
|
else
|
13636 |
|
|
fd->emitted_number = 1;
|
13637 |
|
|
last_emitted_file = fd;
|
13638 |
|
|
|
13639 |
|
|
if (DWARF2_ASM_LINE_DEBUG_INFO)
|
13640 |
|
|
{
|
13641 |
|
|
fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
|
13642 |
|
|
output_quoted_string (asm_out_file, fd->filename);
|
13643 |
|
|
fputc ('\n', asm_out_file);
|
13644 |
|
|
}
|
13645 |
|
|
}
|
13646 |
|
|
|
13647 |
|
|
return fd->emitted_number;
|
13648 |
|
|
}
|
13649 |
|
|
|
13650 |
|
|
/* Called by the final INSN scan whenever we see a var location. We
|
13651 |
|
|
use it to drop labels in the right places, and throw the location in
|
13652 |
|
|
our lookup table. */
|
13653 |
|
|
|
13654 |
|
|
static void
|
13655 |
|
|
dwarf2out_var_location (rtx loc_note)
|
13656 |
|
|
{
|
13657 |
|
|
char loclabel[MAX_ARTIFICIAL_LABEL_BYTES];
|
13658 |
|
|
struct var_loc_node *newloc;
|
13659 |
|
|
rtx prev_insn;
|
13660 |
|
|
static rtx last_insn;
|
13661 |
|
|
static const char *last_label;
|
13662 |
|
|
tree decl;
|
13663 |
|
|
|
13664 |
|
|
if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
|
13665 |
|
|
return;
|
13666 |
|
|
prev_insn = PREV_INSN (loc_note);
|
13667 |
|
|
|
13668 |
|
|
newloc = ggc_alloc_cleared (sizeof (struct var_loc_node));
|
13669 |
|
|
/* If the insn we processed last time is the previous insn
|
13670 |
|
|
and it is also a var location note, use the label we emitted
|
13671 |
|
|
last time. */
|
13672 |
|
|
if (last_insn != NULL_RTX
|
13673 |
|
|
&& last_insn == prev_insn
|
13674 |
|
|
&& NOTE_P (prev_insn)
|
13675 |
|
|
&& NOTE_LINE_NUMBER (prev_insn) == NOTE_INSN_VAR_LOCATION)
|
13676 |
|
|
{
|
13677 |
|
|
newloc->label = last_label;
|
13678 |
|
|
}
|
13679 |
|
|
else
|
13680 |
|
|
{
|
13681 |
|
|
ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", loclabel_num);
|
13682 |
|
|
ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LVL", loclabel_num);
|
13683 |
|
|
loclabel_num++;
|
13684 |
|
|
newloc->label = ggc_strdup (loclabel);
|
13685 |
|
|
}
|
13686 |
|
|
newloc->var_loc_note = loc_note;
|
13687 |
|
|
newloc->next = NULL;
|
13688 |
|
|
|
13689 |
|
|
if (cfun && in_cold_section_p)
|
13690 |
|
|
newloc->section_label = cfun->cold_section_label;
|
13691 |
|
|
else
|
13692 |
|
|
newloc->section_label = text_section_label;
|
13693 |
|
|
|
13694 |
|
|
last_insn = loc_note;
|
13695 |
|
|
last_label = newloc->label;
|
13696 |
|
|
decl = NOTE_VAR_LOCATION_DECL (loc_note);
|
13697 |
|
|
add_var_loc_to_decl (decl, newloc);
|
13698 |
|
|
}
|
13699 |
|
|
|
13700 |
|
|
/* We need to reset the locations at the beginning of each
|
13701 |
|
|
function. We can't do this in the end_function hook, because the
|
13702 |
|
|
declarations that use the locations won't have been output when
|
13703 |
|
|
that hook is called. Also compute have_multiple_function_sections here. */
|
13704 |
|
|
|
13705 |
|
|
static void
|
13706 |
|
|
dwarf2out_begin_function (tree fun)
|
13707 |
|
|
{
|
13708 |
|
|
htab_empty (decl_loc_table);
|
13709 |
|
|
|
13710 |
|
|
if (function_section (fun) != text_section)
|
13711 |
|
|
have_multiple_function_sections = true;
|
13712 |
|
|
}
|
13713 |
|
|
|
13714 |
|
|
/* Output a label to mark the beginning of a source code line entry
|
13715 |
|
|
and record information relating to this source line, in
|
13716 |
|
|
'line_info_table' for later output of the .debug_line section. */
|
13717 |
|
|
|
13718 |
|
|
static void
|
13719 |
|
|
dwarf2out_source_line (unsigned int line, const char *filename)
|
13720 |
|
|
{
|
13721 |
|
|
if (debug_info_level >= DINFO_LEVEL_NORMAL
|
13722 |
|
|
&& line != 0)
|
13723 |
|
|
{
|
13724 |
|
|
int file_num = maybe_emit_file (lookup_filename (filename));
|
13725 |
|
|
|
13726 |
|
|
switch_to_section (current_function_section ());
|
13727 |
|
|
|
13728 |
|
|
/* If requested, emit something human-readable. */
|
13729 |
|
|
if (flag_debug_asm)
|
13730 |
|
|
fprintf (asm_out_file, "\t%s %s:%d\n", ASM_COMMENT_START,
|
13731 |
|
|
filename, line);
|
13732 |
|
|
|
13733 |
|
|
if (DWARF2_ASM_LINE_DEBUG_INFO)
|
13734 |
|
|
{
|
13735 |
|
|
/* Emit the .loc directive understood by GNU as. */
|
13736 |
|
|
fprintf (asm_out_file, "\t.loc %d %d 0\n", file_num, line);
|
13737 |
|
|
|
13738 |
|
|
/* Indicate that line number info exists. */
|
13739 |
|
|
line_info_table_in_use++;
|
13740 |
|
|
}
|
13741 |
|
|
else if (function_section (current_function_decl) != text_section)
|
13742 |
|
|
{
|
13743 |
|
|
dw_separate_line_info_ref line_info;
|
13744 |
|
|
targetm.asm_out.internal_label (asm_out_file,
|
13745 |
|
|
SEPARATE_LINE_CODE_LABEL,
|
13746 |
|
|
separate_line_info_table_in_use);
|
13747 |
|
|
|
13748 |
|
|
/* Expand the line info table if necessary. */
|
13749 |
|
|
if (separate_line_info_table_in_use
|
13750 |
|
|
== separate_line_info_table_allocated)
|
13751 |
|
|
{
|
13752 |
|
|
separate_line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
|
13753 |
|
|
separate_line_info_table
|
13754 |
|
|
= ggc_realloc (separate_line_info_table,
|
13755 |
|
|
separate_line_info_table_allocated
|
13756 |
|
|
* sizeof (dw_separate_line_info_entry));
|
13757 |
|
|
memset (separate_line_info_table
|
13758 |
|
|
+ separate_line_info_table_in_use,
|
13759 |
|
|
0,
|
13760 |
|
|
(LINE_INFO_TABLE_INCREMENT
|
13761 |
|
|
* sizeof (dw_separate_line_info_entry)));
|
13762 |
|
|
}
|
13763 |
|
|
|
13764 |
|
|
/* Add the new entry at the end of the line_info_table. */
|
13765 |
|
|
line_info
|
13766 |
|
|
= &separate_line_info_table[separate_line_info_table_in_use++];
|
13767 |
|
|
line_info->dw_file_num = file_num;
|
13768 |
|
|
line_info->dw_line_num = line;
|
13769 |
|
|
line_info->function = current_function_funcdef_no;
|
13770 |
|
|
}
|
13771 |
|
|
else
|
13772 |
|
|
{
|
13773 |
|
|
dw_line_info_ref line_info;
|
13774 |
|
|
|
13775 |
|
|
targetm.asm_out.internal_label (asm_out_file, LINE_CODE_LABEL,
|
13776 |
|
|
line_info_table_in_use);
|
13777 |
|
|
|
13778 |
|
|
/* Expand the line info table if necessary. */
|
13779 |
|
|
if (line_info_table_in_use == line_info_table_allocated)
|
13780 |
|
|
{
|
13781 |
|
|
line_info_table_allocated += LINE_INFO_TABLE_INCREMENT;
|
13782 |
|
|
line_info_table
|
13783 |
|
|
= ggc_realloc (line_info_table,
|
13784 |
|
|
(line_info_table_allocated
|
13785 |
|
|
* sizeof (dw_line_info_entry)));
|
13786 |
|
|
memset (line_info_table + line_info_table_in_use, 0,
|
13787 |
|
|
LINE_INFO_TABLE_INCREMENT * sizeof (dw_line_info_entry));
|
13788 |
|
|
}
|
13789 |
|
|
|
13790 |
|
|
/* Add the new entry at the end of the line_info_table. */
|
13791 |
|
|
line_info = &line_info_table[line_info_table_in_use++];
|
13792 |
|
|
line_info->dw_file_num = file_num;
|
13793 |
|
|
line_info->dw_line_num = line;
|
13794 |
|
|
}
|
13795 |
|
|
}
|
13796 |
|
|
}
|
13797 |
|
|
|
13798 |
|
|
/* Record the beginning of a new source file. */
|
13799 |
|
|
|
13800 |
|
|
static void
|
13801 |
|
|
dwarf2out_start_source_file (unsigned int lineno, const char *filename)
|
13802 |
|
|
{
|
13803 |
|
|
if (flag_eliminate_dwarf2_dups)
|
13804 |
|
|
{
|
13805 |
|
|
/* Record the beginning of the file for break_out_includes. */
|
13806 |
|
|
dw_die_ref bincl_die;
|
13807 |
|
|
|
13808 |
|
|
bincl_die = new_die (DW_TAG_GNU_BINCL, comp_unit_die, NULL);
|
13809 |
|
|
add_AT_string (bincl_die, DW_AT_name, filename);
|
13810 |
|
|
}
|
13811 |
|
|
|
13812 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
13813 |
|
|
{
|
13814 |
|
|
int file_num = maybe_emit_file (lookup_filename (filename));
|
13815 |
|
|
|
13816 |
|
|
switch_to_section (debug_macinfo_section);
|
13817 |
|
|
dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file");
|
13818 |
|
|
dw2_asm_output_data_uleb128 (lineno, "Included from line number %d",
|
13819 |
|
|
lineno);
|
13820 |
|
|
|
13821 |
|
|
dw2_asm_output_data_uleb128 (file_num, "file %s", filename);
|
13822 |
|
|
}
|
13823 |
|
|
}
|
13824 |
|
|
|
13825 |
|
|
/* Record the end of a source file. */
|
13826 |
|
|
|
13827 |
|
|
static void
|
13828 |
|
|
dwarf2out_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED)
|
13829 |
|
|
{
|
13830 |
|
|
if (flag_eliminate_dwarf2_dups)
|
13831 |
|
|
/* Record the end of the file for break_out_includes. */
|
13832 |
|
|
new_die (DW_TAG_GNU_EINCL, comp_unit_die, NULL);
|
13833 |
|
|
|
13834 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
13835 |
|
|
{
|
13836 |
|
|
switch_to_section (debug_macinfo_section);
|
13837 |
|
|
dw2_asm_output_data (1, DW_MACINFO_end_file, "End file");
|
13838 |
|
|
}
|
13839 |
|
|
}
|
13840 |
|
|
|
13841 |
|
|
/* Called from debug_define in toplev.c. The `buffer' parameter contains
|
13842 |
|
|
the tail part of the directive line, i.e. the part which is past the
|
13843 |
|
|
initial whitespace, #, whitespace, directive-name, whitespace part. */
|
13844 |
|
|
|
13845 |
|
|
static void
|
13846 |
|
|
dwarf2out_define (unsigned int lineno ATTRIBUTE_UNUSED,
|
13847 |
|
|
const char *buffer ATTRIBUTE_UNUSED)
|
13848 |
|
|
{
|
13849 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
13850 |
|
|
{
|
13851 |
|
|
switch_to_section (debug_macinfo_section);
|
13852 |
|
|
dw2_asm_output_data (1, DW_MACINFO_define, "Define macro");
|
13853 |
|
|
dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno);
|
13854 |
|
|
dw2_asm_output_nstring (buffer, -1, "The macro");
|
13855 |
|
|
}
|
13856 |
|
|
}
|
13857 |
|
|
|
13858 |
|
|
/* Called from debug_undef in toplev.c. The `buffer' parameter contains
|
13859 |
|
|
the tail part of the directive line, i.e. the part which is past the
|
13860 |
|
|
initial whitespace, #, whitespace, directive-name, whitespace part. */
|
13861 |
|
|
|
13862 |
|
|
static void
|
13863 |
|
|
dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED,
|
13864 |
|
|
const char *buffer ATTRIBUTE_UNUSED)
|
13865 |
|
|
{
|
13866 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
13867 |
|
|
{
|
13868 |
|
|
switch_to_section (debug_macinfo_section);
|
13869 |
|
|
dw2_asm_output_data (1, DW_MACINFO_undef, "Undefine macro");
|
13870 |
|
|
dw2_asm_output_data_uleb128 (lineno, "At line number %d", lineno);
|
13871 |
|
|
dw2_asm_output_nstring (buffer, -1, "The macro");
|
13872 |
|
|
}
|
13873 |
|
|
}
|
13874 |
|
|
|
13875 |
|
|
/* Set up for Dwarf output at the start of compilation. */
|
13876 |
|
|
|
13877 |
|
|
static void
|
13878 |
|
|
dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
|
13879 |
|
|
{
|
13880 |
|
|
/* Allocate the file_table. */
|
13881 |
|
|
file_table = htab_create_ggc (50, file_table_hash,
|
13882 |
|
|
file_table_eq, NULL);
|
13883 |
|
|
|
13884 |
|
|
/* Allocate the decl_die_table. */
|
13885 |
|
|
decl_die_table = htab_create_ggc (10, decl_die_table_hash,
|
13886 |
|
|
decl_die_table_eq, NULL);
|
13887 |
|
|
|
13888 |
|
|
/* Allocate the decl_loc_table. */
|
13889 |
|
|
decl_loc_table = htab_create_ggc (10, decl_loc_table_hash,
|
13890 |
|
|
decl_loc_table_eq, NULL);
|
13891 |
|
|
|
13892 |
|
|
/* Allocate the initial hunk of the decl_scope_table. */
|
13893 |
|
|
decl_scope_table = VEC_alloc (tree, gc, 256);
|
13894 |
|
|
|
13895 |
|
|
/* Allocate the initial hunk of the abbrev_die_table. */
|
13896 |
|
|
abbrev_die_table = ggc_alloc_cleared (ABBREV_DIE_TABLE_INCREMENT
|
13897 |
|
|
* sizeof (dw_die_ref));
|
13898 |
|
|
abbrev_die_table_allocated = ABBREV_DIE_TABLE_INCREMENT;
|
13899 |
|
|
/* Zero-th entry is allocated, but unused. */
|
13900 |
|
|
abbrev_die_table_in_use = 1;
|
13901 |
|
|
|
13902 |
|
|
/* Allocate the initial hunk of the line_info_table. */
|
13903 |
|
|
line_info_table = ggc_alloc_cleared (LINE_INFO_TABLE_INCREMENT
|
13904 |
|
|
* sizeof (dw_line_info_entry));
|
13905 |
|
|
line_info_table_allocated = LINE_INFO_TABLE_INCREMENT;
|
13906 |
|
|
|
13907 |
|
|
/* Zero-th entry is allocated, but unused. */
|
13908 |
|
|
line_info_table_in_use = 1;
|
13909 |
|
|
|
13910 |
|
|
/* Generate the initial DIE for the .debug section. Note that the (string)
|
13911 |
|
|
value given in the DW_AT_name attribute of the DW_TAG_compile_unit DIE
|
13912 |
|
|
will (typically) be a relative pathname and that this pathname should be
|
13913 |
|
|
taken as being relative to the directory from which the compiler was
|
13914 |
|
|
invoked when the given (base) source file was compiled. We will fill
|
13915 |
|
|
in this value in dwarf2out_finish. */
|
13916 |
|
|
comp_unit_die = gen_compile_unit_die (NULL);
|
13917 |
|
|
|
13918 |
|
|
incomplete_types = VEC_alloc (tree, gc, 64);
|
13919 |
|
|
|
13920 |
|
|
used_rtx_array = VEC_alloc (rtx, gc, 32);
|
13921 |
|
|
|
13922 |
|
|
debug_info_section = get_section (DEBUG_INFO_SECTION,
|
13923 |
|
|
SECTION_DEBUG, NULL);
|
13924 |
|
|
debug_abbrev_section = get_section (DEBUG_ABBREV_SECTION,
|
13925 |
|
|
SECTION_DEBUG, NULL);
|
13926 |
|
|
debug_aranges_section = get_section (DEBUG_ARANGES_SECTION,
|
13927 |
|
|
SECTION_DEBUG, NULL);
|
13928 |
|
|
debug_macinfo_section = get_section (DEBUG_MACINFO_SECTION,
|
13929 |
|
|
SECTION_DEBUG, NULL);
|
13930 |
|
|
debug_line_section = get_section (DEBUG_LINE_SECTION,
|
13931 |
|
|
SECTION_DEBUG, NULL);
|
13932 |
|
|
debug_loc_section = get_section (DEBUG_LOC_SECTION,
|
13933 |
|
|
SECTION_DEBUG, NULL);
|
13934 |
|
|
debug_pubnames_section = get_section (DEBUG_PUBNAMES_SECTION,
|
13935 |
|
|
SECTION_DEBUG, NULL);
|
13936 |
|
|
debug_str_section = get_section (DEBUG_STR_SECTION,
|
13937 |
|
|
DEBUG_STR_SECTION_FLAGS, NULL);
|
13938 |
|
|
debug_ranges_section = get_section (DEBUG_RANGES_SECTION,
|
13939 |
|
|
SECTION_DEBUG, NULL);
|
13940 |
|
|
debug_frame_section = get_section (DEBUG_FRAME_SECTION,
|
13941 |
|
|
SECTION_DEBUG, NULL);
|
13942 |
|
|
|
13943 |
|
|
ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
|
13944 |
|
|
ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
|
13945 |
|
|
DEBUG_ABBREV_SECTION_LABEL, 0);
|
13946 |
|
|
ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
|
13947 |
|
|
ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label,
|
13948 |
|
|
COLD_TEXT_SECTION_LABEL, 0);
|
13949 |
|
|
ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
|
13950 |
|
|
|
13951 |
|
|
ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
|
13952 |
|
|
DEBUG_INFO_SECTION_LABEL, 0);
|
13953 |
|
|
ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
|
13954 |
|
|
DEBUG_LINE_SECTION_LABEL, 0);
|
13955 |
|
|
ASM_GENERATE_INTERNAL_LABEL (ranges_section_label,
|
13956 |
|
|
DEBUG_RANGES_SECTION_LABEL, 0);
|
13957 |
|
|
switch_to_section (debug_abbrev_section);
|
13958 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
|
13959 |
|
|
switch_to_section (debug_info_section);
|
13960 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
|
13961 |
|
|
switch_to_section (debug_line_section);
|
13962 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
|
13963 |
|
|
|
13964 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
13965 |
|
|
{
|
13966 |
|
|
switch_to_section (debug_macinfo_section);
|
13967 |
|
|
ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label,
|
13968 |
|
|
DEBUG_MACINFO_SECTION_LABEL, 0);
|
13969 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
|
13970 |
|
|
}
|
13971 |
|
|
|
13972 |
|
|
switch_to_section (text_section);
|
13973 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
|
13974 |
|
|
if (flag_reorder_blocks_and_partition)
|
13975 |
|
|
{
|
13976 |
|
|
switch_to_section (unlikely_text_section ());
|
13977 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
|
13978 |
|
|
}
|
13979 |
|
|
}
|
13980 |
|
|
|
13981 |
|
|
/* A helper function for dwarf2out_finish called through
|
13982 |
|
|
ht_forall. Emit one queued .debug_str string. */
|
13983 |
|
|
|
13984 |
|
|
static int
|
13985 |
|
|
output_indirect_string (void **h, void *v ATTRIBUTE_UNUSED)
|
13986 |
|
|
{
|
13987 |
|
|
struct indirect_string_node *node = (struct indirect_string_node *) *h;
|
13988 |
|
|
|
13989 |
|
|
if (node->form == DW_FORM_strp)
|
13990 |
|
|
{
|
13991 |
|
|
switch_to_section (debug_str_section);
|
13992 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, node->label);
|
13993 |
|
|
assemble_string (node->str, strlen (node->str) + 1);
|
13994 |
|
|
}
|
13995 |
|
|
|
13996 |
|
|
return 1;
|
13997 |
|
|
}
|
13998 |
|
|
|
13999 |
|
|
#if ENABLE_ASSERT_CHECKING
|
14000 |
|
|
/* Verify that all marks are clear. */
|
14001 |
|
|
|
14002 |
|
|
static void
|
14003 |
|
|
verify_marks_clear (dw_die_ref die)
|
14004 |
|
|
{
|
14005 |
|
|
dw_die_ref c;
|
14006 |
|
|
|
14007 |
|
|
gcc_assert (! die->die_mark);
|
14008 |
|
|
FOR_EACH_CHILD (die, c, verify_marks_clear (c));
|
14009 |
|
|
}
|
14010 |
|
|
#endif /* ENABLE_ASSERT_CHECKING */
|
14011 |
|
|
|
14012 |
|
|
/* Clear the marks for a die and its children.
|
14013 |
|
|
Be cool if the mark isn't set. */
|
14014 |
|
|
|
14015 |
|
|
static void
|
14016 |
|
|
prune_unmark_dies (dw_die_ref die)
|
14017 |
|
|
{
|
14018 |
|
|
dw_die_ref c;
|
14019 |
|
|
|
14020 |
|
|
if (die->die_mark)
|
14021 |
|
|
die->die_mark = 0;
|
14022 |
|
|
FOR_EACH_CHILD (die, c, prune_unmark_dies (c));
|
14023 |
|
|
}
|
14024 |
|
|
|
14025 |
|
|
/* Given DIE that we're marking as used, find any other dies
|
14026 |
|
|
it references as attributes and mark them as used. */
|
14027 |
|
|
|
14028 |
|
|
static void
|
14029 |
|
|
prune_unused_types_walk_attribs (dw_die_ref die)
|
14030 |
|
|
{
|
14031 |
|
|
dw_attr_ref a;
|
14032 |
|
|
unsigned ix;
|
14033 |
|
|
|
14034 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
14035 |
|
|
{
|
14036 |
|
|
if (a->dw_attr_val.val_class == dw_val_class_die_ref)
|
14037 |
|
|
{
|
14038 |
|
|
/* A reference to another DIE.
|
14039 |
|
|
Make sure that it will get emitted. */
|
14040 |
|
|
prune_unused_types_mark (a->dw_attr_val.v.val_die_ref.die, 1);
|
14041 |
|
|
}
|
14042 |
|
|
/* Set the string's refcount to 0 so that prune_unused_types_mark
|
14043 |
|
|
accounts properly for it. */
|
14044 |
|
|
if (AT_class (a) == dw_val_class_str)
|
14045 |
|
|
a->dw_attr_val.v.val_str->refcount = 0;
|
14046 |
|
|
}
|
14047 |
|
|
}
|
14048 |
|
|
|
14049 |
|
|
|
14050 |
|
|
/* Mark DIE as being used. If DOKIDS is true, then walk down
|
14051 |
|
|
to DIE's children. */
|
14052 |
|
|
|
14053 |
|
|
static void
|
14054 |
|
|
prune_unused_types_mark (dw_die_ref die, int dokids)
|
14055 |
|
|
{
|
14056 |
|
|
dw_die_ref c;
|
14057 |
|
|
|
14058 |
|
|
if (die->die_mark == 0)
|
14059 |
|
|
{
|
14060 |
|
|
/* We haven't done this node yet. Mark it as used. */
|
14061 |
|
|
die->die_mark = 1;
|
14062 |
|
|
|
14063 |
|
|
/* We also have to mark its parents as used.
|
14064 |
|
|
(But we don't want to mark our parents' kids due to this.) */
|
14065 |
|
|
if (die->die_parent)
|
14066 |
|
|
prune_unused_types_mark (die->die_parent, 0);
|
14067 |
|
|
|
14068 |
|
|
/* Mark any referenced nodes. */
|
14069 |
|
|
prune_unused_types_walk_attribs (die);
|
14070 |
|
|
|
14071 |
|
|
/* If this node is a specification,
|
14072 |
|
|
also mark the definition, if it exists. */
|
14073 |
|
|
if (get_AT_flag (die, DW_AT_declaration) && die->die_definition)
|
14074 |
|
|
prune_unused_types_mark (die->die_definition, 1);
|
14075 |
|
|
}
|
14076 |
|
|
|
14077 |
|
|
if (dokids && die->die_mark != 2)
|
14078 |
|
|
{
|
14079 |
|
|
/* We need to walk the children, but haven't done so yet.
|
14080 |
|
|
Remember that we've walked the kids. */
|
14081 |
|
|
die->die_mark = 2;
|
14082 |
|
|
|
14083 |
|
|
/* If this is an array type, we need to make sure our
|
14084 |
|
|
kids get marked, even if they're types. */
|
14085 |
|
|
if (die->die_tag == DW_TAG_array_type)
|
14086 |
|
|
FOR_EACH_CHILD (die, c, prune_unused_types_mark (c, 1));
|
14087 |
|
|
else
|
14088 |
|
|
FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
|
14089 |
|
|
}
|
14090 |
|
|
}
|
14091 |
|
|
|
14092 |
|
|
|
14093 |
|
|
/* Walk the tree DIE and mark types that we actually use. */
|
14094 |
|
|
|
14095 |
|
|
static void
|
14096 |
|
|
prune_unused_types_walk (dw_die_ref die)
|
14097 |
|
|
{
|
14098 |
|
|
dw_die_ref c;
|
14099 |
|
|
|
14100 |
|
|
/* Don't do anything if this node is already marked. */
|
14101 |
|
|
if (die->die_mark)
|
14102 |
|
|
return;
|
14103 |
|
|
|
14104 |
|
|
switch (die->die_tag) {
|
14105 |
|
|
case DW_TAG_const_type:
|
14106 |
|
|
case DW_TAG_packed_type:
|
14107 |
|
|
case DW_TAG_pointer_type:
|
14108 |
|
|
case DW_TAG_reference_type:
|
14109 |
|
|
case DW_TAG_volatile_type:
|
14110 |
|
|
case DW_TAG_typedef:
|
14111 |
|
|
case DW_TAG_array_type:
|
14112 |
|
|
case DW_TAG_structure_type:
|
14113 |
|
|
case DW_TAG_union_type:
|
14114 |
|
|
case DW_TAG_class_type:
|
14115 |
|
|
case DW_TAG_friend:
|
14116 |
|
|
case DW_TAG_variant_part:
|
14117 |
|
|
case DW_TAG_enumeration_type:
|
14118 |
|
|
case DW_TAG_subroutine_type:
|
14119 |
|
|
case DW_TAG_string_type:
|
14120 |
|
|
case DW_TAG_set_type:
|
14121 |
|
|
case DW_TAG_subrange_type:
|
14122 |
|
|
case DW_TAG_ptr_to_member_type:
|
14123 |
|
|
case DW_TAG_file_type:
|
14124 |
|
|
if (die->die_perennial_p)
|
14125 |
|
|
break;
|
14126 |
|
|
|
14127 |
|
|
/* It's a type node --- don't mark it. */
|
14128 |
|
|
return;
|
14129 |
|
|
|
14130 |
|
|
default:
|
14131 |
|
|
/* Mark everything else. */
|
14132 |
|
|
break;
|
14133 |
|
|
}
|
14134 |
|
|
|
14135 |
|
|
die->die_mark = 1;
|
14136 |
|
|
|
14137 |
|
|
/* Now, mark any dies referenced from here. */
|
14138 |
|
|
prune_unused_types_walk_attribs (die);
|
14139 |
|
|
|
14140 |
|
|
/* Mark children. */
|
14141 |
|
|
FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
|
14142 |
|
|
}
|
14143 |
|
|
|
14144 |
|
|
/* Increment the string counts on strings referred to from DIE's
|
14145 |
|
|
attributes. */
|
14146 |
|
|
|
14147 |
|
|
static void
|
14148 |
|
|
prune_unused_types_update_strings (dw_die_ref die)
|
14149 |
|
|
{
|
14150 |
|
|
dw_attr_ref a;
|
14151 |
|
|
unsigned ix;
|
14152 |
|
|
|
14153 |
|
|
for (ix = 0; VEC_iterate (dw_attr_node, die->die_attr, ix, a); ix++)
|
14154 |
|
|
if (AT_class (a) == dw_val_class_str)
|
14155 |
|
|
{
|
14156 |
|
|
struct indirect_string_node *s = a->dw_attr_val.v.val_str;
|
14157 |
|
|
s->refcount++;
|
14158 |
|
|
/* Avoid unnecessarily putting strings that are used less than
|
14159 |
|
|
twice in the hash table. */
|
14160 |
|
|
if (s->refcount
|
14161 |
|
|
== ((DEBUG_STR_SECTION_FLAGS & SECTION_MERGE) ? 1 : 2))
|
14162 |
|
|
{
|
14163 |
|
|
void ** slot;
|
14164 |
|
|
slot = htab_find_slot_with_hash (debug_str_hash, s->str,
|
14165 |
|
|
htab_hash_string (s->str),
|
14166 |
|
|
INSERT);
|
14167 |
|
|
gcc_assert (*slot == NULL);
|
14168 |
|
|
*slot = s;
|
14169 |
|
|
}
|
14170 |
|
|
}
|
14171 |
|
|
}
|
14172 |
|
|
|
14173 |
|
|
/* Remove from the tree DIE any dies that aren't marked. */
|
14174 |
|
|
|
14175 |
|
|
static void
|
14176 |
|
|
prune_unused_types_prune (dw_die_ref die)
|
14177 |
|
|
{
|
14178 |
|
|
dw_die_ref c;
|
14179 |
|
|
|
14180 |
|
|
gcc_assert (die->die_mark);
|
14181 |
|
|
prune_unused_types_update_strings (die);
|
14182 |
|
|
|
14183 |
|
|
if (! die->die_child)
|
14184 |
|
|
return;
|
14185 |
|
|
|
14186 |
|
|
c = die->die_child;
|
14187 |
|
|
do {
|
14188 |
|
|
dw_die_ref prev = c;
|
14189 |
|
|
for (c = c->die_sib; ! c->die_mark; c = c->die_sib)
|
14190 |
|
|
if (c == die->die_child)
|
14191 |
|
|
{
|
14192 |
|
|
/* No marked children between 'prev' and the end of the list. */
|
14193 |
|
|
if (prev == c)
|
14194 |
|
|
/* No marked children at all. */
|
14195 |
|
|
die->die_child = NULL;
|
14196 |
|
|
else
|
14197 |
|
|
{
|
14198 |
|
|
prev->die_sib = c->die_sib;
|
14199 |
|
|
die->die_child = prev;
|
14200 |
|
|
}
|
14201 |
|
|
return;
|
14202 |
|
|
}
|
14203 |
|
|
|
14204 |
|
|
if (c != prev->die_sib)
|
14205 |
|
|
prev->die_sib = c;
|
14206 |
|
|
prune_unused_types_prune (c);
|
14207 |
|
|
} while (c != die->die_child);
|
14208 |
|
|
}
|
14209 |
|
|
|
14210 |
|
|
|
14211 |
|
|
/* Remove dies representing declarations that we never use. */
|
14212 |
|
|
|
14213 |
|
|
static void
|
14214 |
|
|
prune_unused_types (void)
|
14215 |
|
|
{
|
14216 |
|
|
unsigned int i;
|
14217 |
|
|
limbo_die_node *node;
|
14218 |
|
|
|
14219 |
|
|
#if ENABLE_ASSERT_CHECKING
|
14220 |
|
|
/* All the marks should already be clear. */
|
14221 |
|
|
verify_marks_clear (comp_unit_die);
|
14222 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14223 |
|
|
verify_marks_clear (node->die);
|
14224 |
|
|
#endif /* ENABLE_ASSERT_CHECKING */
|
14225 |
|
|
|
14226 |
|
|
/* Set the mark on nodes that are actually used. */
|
14227 |
|
|
prune_unused_types_walk (comp_unit_die);
|
14228 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14229 |
|
|
prune_unused_types_walk (node->die);
|
14230 |
|
|
|
14231 |
|
|
/* Also set the mark on nodes referenced from the
|
14232 |
|
|
pubname_table or arange_table. */
|
14233 |
|
|
for (i = 0; i < pubname_table_in_use; i++)
|
14234 |
|
|
prune_unused_types_mark (pubname_table[i].die, 1);
|
14235 |
|
|
for (i = 0; i < arange_table_in_use; i++)
|
14236 |
|
|
prune_unused_types_mark (arange_table[i], 1);
|
14237 |
|
|
|
14238 |
|
|
/* Get rid of nodes that aren't marked; and update the string counts. */
|
14239 |
|
|
if (debug_str_hash)
|
14240 |
|
|
htab_empty (debug_str_hash);
|
14241 |
|
|
prune_unused_types_prune (comp_unit_die);
|
14242 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14243 |
|
|
prune_unused_types_prune (node->die);
|
14244 |
|
|
|
14245 |
|
|
/* Leave the marks clear. */
|
14246 |
|
|
prune_unmark_dies (comp_unit_die);
|
14247 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14248 |
|
|
prune_unmark_dies (node->die);
|
14249 |
|
|
}
|
14250 |
|
|
|
14251 |
|
|
/* Set the parameter to true if there are any relative pathnames in
|
14252 |
|
|
the file table. */
|
14253 |
|
|
static int
|
14254 |
|
|
file_table_relative_p (void ** slot, void *param)
|
14255 |
|
|
{
|
14256 |
|
|
bool *p = param;
|
14257 |
|
|
struct dwarf_file_data *d = *slot;
|
14258 |
|
|
if (d->emitted_number && d->filename[0] != DIR_SEPARATOR)
|
14259 |
|
|
{
|
14260 |
|
|
*p = true;
|
14261 |
|
|
return 0;
|
14262 |
|
|
}
|
14263 |
|
|
return 1;
|
14264 |
|
|
}
|
14265 |
|
|
|
14266 |
|
|
/* Output stuff that dwarf requires at the end of every file,
|
14267 |
|
|
and generate the DWARF-2 debugging info. */
|
14268 |
|
|
|
14269 |
|
|
static void
|
14270 |
|
|
dwarf2out_finish (const char *filename)
|
14271 |
|
|
{
|
14272 |
|
|
limbo_die_node *node, *next_node;
|
14273 |
|
|
dw_die_ref die = 0;
|
14274 |
|
|
|
14275 |
|
|
/* Add the name for the main input file now. We delayed this from
|
14276 |
|
|
dwarf2out_init to avoid complications with PCH. */
|
14277 |
|
|
add_name_attribute (comp_unit_die, filename);
|
14278 |
|
|
if (filename[0] != DIR_SEPARATOR)
|
14279 |
|
|
add_comp_dir_attribute (comp_unit_die);
|
14280 |
|
|
else if (get_AT (comp_unit_die, DW_AT_comp_dir) == NULL)
|
14281 |
|
|
{
|
14282 |
|
|
bool p = false;
|
14283 |
|
|
htab_traverse (file_table, file_table_relative_p, &p);
|
14284 |
|
|
if (p)
|
14285 |
|
|
add_comp_dir_attribute (comp_unit_die);
|
14286 |
|
|
}
|
14287 |
|
|
|
14288 |
|
|
/* Traverse the limbo die list, and add parent/child links. The only
|
14289 |
|
|
dies without parents that should be here are concrete instances of
|
14290 |
|
|
inline functions, and the comp_unit_die. We can ignore the comp_unit_die.
|
14291 |
|
|
For concrete instances, we can get the parent die from the abstract
|
14292 |
|
|
instance. */
|
14293 |
|
|
for (node = limbo_die_list; node; node = next_node)
|
14294 |
|
|
{
|
14295 |
|
|
next_node = node->next;
|
14296 |
|
|
die = node->die;
|
14297 |
|
|
|
14298 |
|
|
if (die->die_parent == NULL)
|
14299 |
|
|
{
|
14300 |
|
|
dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
|
14301 |
|
|
|
14302 |
|
|
if (origin)
|
14303 |
|
|
add_child_die (origin->die_parent, die);
|
14304 |
|
|
else if (die == comp_unit_die)
|
14305 |
|
|
;
|
14306 |
|
|
else if (errorcount > 0 || sorrycount > 0)
|
14307 |
|
|
/* It's OK to be confused by errors in the input. */
|
14308 |
|
|
add_child_die (comp_unit_die, die);
|
14309 |
|
|
else
|
14310 |
|
|
{
|
14311 |
|
|
/* In certain situations, the lexical block containing a
|
14312 |
|
|
nested function can be optimized away, which results
|
14313 |
|
|
in the nested function die being orphaned. Likewise
|
14314 |
|
|
with the return type of that nested function. Force
|
14315 |
|
|
this to be a child of the containing function.
|
14316 |
|
|
|
14317 |
|
|
It may happen that even the containing function got fully
|
14318 |
|
|
inlined and optimized out. In that case we are lost and
|
14319 |
|
|
assign the empty child. This should not be big issue as
|
14320 |
|
|
the function is likely unreachable too. */
|
14321 |
|
|
tree context = NULL_TREE;
|
14322 |
|
|
|
14323 |
|
|
gcc_assert (node->created_for);
|
14324 |
|
|
|
14325 |
|
|
if (DECL_P (node->created_for))
|
14326 |
|
|
context = DECL_CONTEXT (node->created_for);
|
14327 |
|
|
else if (TYPE_P (node->created_for))
|
14328 |
|
|
context = TYPE_CONTEXT (node->created_for);
|
14329 |
|
|
|
14330 |
|
|
gcc_assert (context
|
14331 |
|
|
&& (TREE_CODE (context) == FUNCTION_DECL
|
14332 |
|
|
|| TREE_CODE (context) == NAMESPACE_DECL));
|
14333 |
|
|
|
14334 |
|
|
origin = lookup_decl_die (context);
|
14335 |
|
|
if (origin)
|
14336 |
|
|
add_child_die (origin, die);
|
14337 |
|
|
else
|
14338 |
|
|
add_child_die (comp_unit_die, die);
|
14339 |
|
|
}
|
14340 |
|
|
}
|
14341 |
|
|
}
|
14342 |
|
|
|
14343 |
|
|
limbo_die_list = NULL;
|
14344 |
|
|
|
14345 |
|
|
/* Walk through the list of incomplete types again, trying once more to
|
14346 |
|
|
emit full debugging info for them. */
|
14347 |
|
|
retry_incomplete_types ();
|
14348 |
|
|
|
14349 |
|
|
if (flag_eliminate_unused_debug_types)
|
14350 |
|
|
prune_unused_types ();
|
14351 |
|
|
|
14352 |
|
|
/* Generate separate CUs for each of the include files we've seen.
|
14353 |
|
|
They will go into limbo_die_list. */
|
14354 |
|
|
if (flag_eliminate_dwarf2_dups)
|
14355 |
|
|
break_out_includes (comp_unit_die);
|
14356 |
|
|
|
14357 |
|
|
/* Traverse the DIE's and add add sibling attributes to those DIE's
|
14358 |
|
|
that have children. */
|
14359 |
|
|
add_sibling_attributes (comp_unit_die);
|
14360 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14361 |
|
|
add_sibling_attributes (node->die);
|
14362 |
|
|
|
14363 |
|
|
/* Output a terminator label for the .text section. */
|
14364 |
|
|
switch_to_section (text_section);
|
14365 |
|
|
targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
|
14366 |
|
|
if (flag_reorder_blocks_and_partition)
|
14367 |
|
|
{
|
14368 |
|
|
switch_to_section (unlikely_text_section ());
|
14369 |
|
|
targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0);
|
14370 |
|
|
}
|
14371 |
|
|
|
14372 |
|
|
/* We can only use the low/high_pc attributes if all of the code was
|
14373 |
|
|
in .text. */
|
14374 |
|
|
if (!have_multiple_function_sections)
|
14375 |
|
|
{
|
14376 |
|
|
add_AT_lbl_id (comp_unit_die, DW_AT_low_pc, text_section_label);
|
14377 |
|
|
add_AT_lbl_id (comp_unit_die, DW_AT_high_pc, text_end_label);
|
14378 |
|
|
}
|
14379 |
|
|
|
14380 |
|
|
/* If it wasn't, we need to give .debug_loc and .debug_ranges an appropriate
|
14381 |
|
|
"base address". Use zero so that these addresses become absolute. */
|
14382 |
|
|
else if (have_location_lists || ranges_table_in_use)
|
14383 |
|
|
add_AT_addr (comp_unit_die, DW_AT_entry_pc, const0_rtx);
|
14384 |
|
|
|
14385 |
|
|
/* Output location list section if necessary. */
|
14386 |
|
|
if (have_location_lists)
|
14387 |
|
|
{
|
14388 |
|
|
/* Output the location lists info. */
|
14389 |
|
|
switch_to_section (debug_loc_section);
|
14390 |
|
|
ASM_GENERATE_INTERNAL_LABEL (loc_section_label,
|
14391 |
|
|
DEBUG_LOC_SECTION_LABEL, 0);
|
14392 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, loc_section_label);
|
14393 |
|
|
output_location_lists (die);
|
14394 |
|
|
}
|
14395 |
|
|
|
14396 |
|
|
if (debug_info_level >= DINFO_LEVEL_NORMAL)
|
14397 |
|
|
add_AT_lineptr (comp_unit_die, DW_AT_stmt_list,
|
14398 |
|
|
debug_line_section_label);
|
14399 |
|
|
|
14400 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
14401 |
|
|
add_AT_macptr (comp_unit_die, DW_AT_macro_info, macinfo_section_label);
|
14402 |
|
|
|
14403 |
|
|
/* Output all of the compilation units. We put the main one last so that
|
14404 |
|
|
the offsets are available to output_pubnames. */
|
14405 |
|
|
for (node = limbo_die_list; node; node = node->next)
|
14406 |
|
|
output_comp_unit (node->die, 0);
|
14407 |
|
|
|
14408 |
|
|
output_comp_unit (comp_unit_die, 0);
|
14409 |
|
|
|
14410 |
|
|
/* Output the abbreviation table. */
|
14411 |
|
|
switch_to_section (debug_abbrev_section);
|
14412 |
|
|
output_abbrev_section ();
|
14413 |
|
|
|
14414 |
|
|
/* Output public names table if necessary. */
|
14415 |
|
|
if (pubname_table_in_use)
|
14416 |
|
|
{
|
14417 |
|
|
switch_to_section (debug_pubnames_section);
|
14418 |
|
|
output_pubnames ();
|
14419 |
|
|
}
|
14420 |
|
|
|
14421 |
|
|
/* Output the address range information. We only put functions in the arange
|
14422 |
|
|
table, so don't write it out if we don't have any. */
|
14423 |
|
|
if (fde_table_in_use)
|
14424 |
|
|
{
|
14425 |
|
|
switch_to_section (debug_aranges_section);
|
14426 |
|
|
output_aranges ();
|
14427 |
|
|
}
|
14428 |
|
|
|
14429 |
|
|
/* Output ranges section if necessary. */
|
14430 |
|
|
if (ranges_table_in_use)
|
14431 |
|
|
{
|
14432 |
|
|
switch_to_section (debug_ranges_section);
|
14433 |
|
|
ASM_OUTPUT_LABEL (asm_out_file, ranges_section_label);
|
14434 |
|
|
output_ranges ();
|
14435 |
|
|
}
|
14436 |
|
|
|
14437 |
|
|
/* Output the source line correspondence table. We must do this
|
14438 |
|
|
even if there is no line information. Otherwise, on an empty
|
14439 |
|
|
translation unit, we will generate a present, but empty,
|
14440 |
|
|
.debug_info section. IRIX 6.5 `nm' will then complain when
|
14441 |
|
|
examining the file. This is done late so that any filenames
|
14442 |
|
|
used by the debug_info section are marked as 'used'. */
|
14443 |
|
|
if (! DWARF2_ASM_LINE_DEBUG_INFO)
|
14444 |
|
|
{
|
14445 |
|
|
switch_to_section (debug_line_section);
|
14446 |
|
|
output_line_info ();
|
14447 |
|
|
}
|
14448 |
|
|
|
14449 |
|
|
/* Have to end the macro section. */
|
14450 |
|
|
if (debug_info_level >= DINFO_LEVEL_VERBOSE)
|
14451 |
|
|
{
|
14452 |
|
|
switch_to_section (debug_macinfo_section);
|
14453 |
|
|
dw2_asm_output_data (1, 0, "End compilation unit");
|
14454 |
|
|
}
|
14455 |
|
|
|
14456 |
|
|
/* If we emitted any DW_FORM_strp form attribute, output the string
|
14457 |
|
|
table too. */
|
14458 |
|
|
if (debug_str_hash)
|
14459 |
|
|
htab_traverse (debug_str_hash, output_indirect_string, NULL);
|
14460 |
|
|
}
|
14461 |
|
|
#else
|
14462 |
|
|
|
14463 |
|
|
/* This should never be used, but its address is needed for comparisons. */
|
14464 |
|
|
const struct gcc_debug_hooks dwarf2_debug_hooks;
|
14465 |
|
|
|
14466 |
|
|
#endif /* DWARF2_DEBUGGING_INFO */
|
14467 |
|
|
|
14468 |
|
|
#include "gt-dwarf2out.h"
|