* gcc-interface/trans.c (node_has_volatile_full_access) <N_Identifier>:
[official-gcc.git] / gcc / dwarf2out.c
blob4e6ee5e8f82e0283476e096b1421759c011068c1
1 /* Output Dwarf2 format symbol table information from GCC.
2 Copyright (C) 1992-2018 Free Software Foundation, Inc.
3 Contributed by Gary Funck (gary@intrepid.com).
4 Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
5 Extensively modified by Jason Merrill (jason@cygnus.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
12 version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* TODO: Emit .debug_line header even when there are no functions, since
24 the file numbers are used by .debug_info. Alternately, leave
25 out locations for types and decls.
26 Avoid talking about ctors and op= for PODs.
27 Factor out common prologue sequences into multiple CIEs. */
29 /* The first part of this file deals with the DWARF 2 frame unwind
30 information, which is also used by the GCC efficient exception handling
31 mechanism. The second part, controlled only by an #ifdef
32 DWARF2_DEBUGGING_INFO, deals with the other DWARF 2 debugging
33 information. */
35 /* DWARF2 Abbreviation Glossary:
37 CFA = Canonical Frame Address
38 a fixed address on the stack which identifies a call frame.
39 We define it to be the value of SP just before the call insn.
40 The CFA register and offset, which may change during the course
41 of the function, are used to calculate its value at runtime.
43 CFI = Call Frame Instruction
44 an instruction for the DWARF2 abstract machine
46 CIE = Common Information Entry
47 information describing information common to one or more FDEs
49 DIE = Debugging Information Entry
51 FDE = Frame Description Entry
52 information describing the stack call frame, in particular,
53 how to restore registers
55 DW_CFA_... = DWARF2 CFA call frame instruction
56 DW_TAG_... = DWARF2 DIE tag */
58 #include "config.h"
59 #include "system.h"
60 #include "coretypes.h"
61 #include "target.h"
62 #include "function.h"
63 #include "rtl.h"
64 #include "tree.h"
65 #include "memmodel.h"
66 #include "tm_p.h"
67 #include "stringpool.h"
68 #include "insn-config.h"
69 #include "ira.h"
70 #include "cgraph.h"
71 #include "diagnostic.h"
72 #include "fold-const.h"
73 #include "stor-layout.h"
74 #include "varasm.h"
75 #include "version.h"
76 #include "flags.h"
77 #include "rtlhash.h"
78 #include "reload.h"
79 #include "output.h"
80 #include "expr.h"
81 #include "dwarf2out.h"
82 #include "dwarf2asm.h"
83 #include "toplev.h"
84 #include "md5.h"
85 #include "tree-pretty-print.h"
86 #include "print-rtl.h"
87 #include "debug.h"
88 #include "common/common-target.h"
89 #include "langhooks.h"
90 #include "lra.h"
91 #include "dumpfile.h"
92 #include "opts.h"
93 #include "tree-dfa.h"
94 #include "gdb/gdb-index.h"
95 #include "rtl-iter.h"
96 #include "stringpool.h"
97 #include "attribs.h"
98 #include "file-prefix-map.h" /* remap_debug_filename() */
100 static void dwarf2out_source_line (unsigned int, unsigned int, const char *,
101 int, bool);
102 static rtx_insn *last_var_location_insn;
103 static rtx_insn *cached_next_real_insn;
104 static void dwarf2out_decl (tree);
106 #ifndef XCOFF_DEBUGGING_INFO
107 #define XCOFF_DEBUGGING_INFO 0
108 #endif
110 #ifndef HAVE_XCOFF_DWARF_EXTRAS
111 #define HAVE_XCOFF_DWARF_EXTRAS 0
112 #endif
114 #ifdef VMS_DEBUGGING_INFO
115 int vms_file_stats_name (const char *, long long *, long *, char *, int *);
117 /* Define this macro to be a nonzero value if the directory specifications
118 which are output in the debug info should end with a separator. */
119 #define DWARF2_DIR_SHOULD_END_WITH_SEPARATOR 1
120 /* Define this macro to evaluate to a nonzero value if GCC should refrain
121 from generating indirect strings in DWARF2 debug information, for instance
122 if your target is stuck with an old version of GDB that is unable to
123 process them properly or uses VMS Debug. */
124 #define DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET 1
125 #else
126 #define DWARF2_DIR_SHOULD_END_WITH_SEPARATOR 0
127 #define DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET 0
128 #endif
130 /* ??? Poison these here until it can be done generically. They've been
131 totally replaced in this file; make sure it stays that way. */
132 #undef DWARF2_UNWIND_INFO
133 #undef DWARF2_FRAME_INFO
134 #if (GCC_VERSION >= 3000)
135 #pragma GCC poison DWARF2_UNWIND_INFO DWARF2_FRAME_INFO
136 #endif
138 /* The size of the target's pointer type. */
139 #ifndef PTR_SIZE
140 #define PTR_SIZE (POINTER_SIZE / BITS_PER_UNIT)
141 #endif
143 /* Array of RTXes referenced by the debugging information, which therefore
144 must be kept around forever. */
145 static GTY(()) vec<rtx, va_gc> *used_rtx_array;
147 /* A pointer to the base of a list of incomplete types which might be
148 completed at some later time. incomplete_types_list needs to be a
149 vec<tree, va_gc> *because we want to tell the garbage collector about
150 it. */
151 static GTY(()) vec<tree, va_gc> *incomplete_types;
153 /* A pointer to the base of a table of references to declaration
154 scopes. This table is a display which tracks the nesting
155 of declaration scopes at the current scope and containing
156 scopes. This table is used to find the proper place to
157 define type declaration DIE's. */
158 static GTY(()) vec<tree, va_gc> *decl_scope_table;
160 /* Pointers to various DWARF2 sections. */
161 static GTY(()) section *debug_info_section;
162 static GTY(()) section *debug_skeleton_info_section;
163 static GTY(()) section *debug_abbrev_section;
164 static GTY(()) section *debug_skeleton_abbrev_section;
165 static GTY(()) section *debug_aranges_section;
166 static GTY(()) section *debug_addr_section;
167 static GTY(()) section *debug_macinfo_section;
168 static const char *debug_macinfo_section_name;
169 static unsigned macinfo_label_base = 1;
170 static GTY(()) section *debug_line_section;
171 static GTY(()) section *debug_skeleton_line_section;
172 static GTY(()) section *debug_loc_section;
173 static GTY(()) section *debug_pubnames_section;
174 static GTY(()) section *debug_pubtypes_section;
175 static GTY(()) section *debug_str_section;
176 static GTY(()) section *debug_line_str_section;
177 static GTY(()) section *debug_str_dwo_section;
178 static GTY(()) section *debug_str_offsets_section;
179 static GTY(()) section *debug_ranges_section;
180 static GTY(()) section *debug_frame_section;
182 /* Maximum size (in bytes) of an artificially generated label. */
183 #define MAX_ARTIFICIAL_LABEL_BYTES 40
185 /* According to the (draft) DWARF 3 specification, the initial length
186 should either be 4 or 12 bytes. When it's 12 bytes, the first 4
187 bytes are 0xffffffff, followed by the length stored in the next 8
188 bytes.
190 However, the SGI/MIPS ABI uses an initial length which is equal to
191 DWARF_OFFSET_SIZE. It is defined (elsewhere) accordingly. */
193 #ifndef DWARF_INITIAL_LENGTH_SIZE
194 #define DWARF_INITIAL_LENGTH_SIZE (DWARF_OFFSET_SIZE == 4 ? 4 : 12)
195 #endif
197 #ifndef DWARF_INITIAL_LENGTH_SIZE_STR
198 #define DWARF_INITIAL_LENGTH_SIZE_STR (DWARF_OFFSET_SIZE == 4 ? "-4" : "-12")
199 #endif
201 /* Round SIZE up to the nearest BOUNDARY. */
202 #define DWARF_ROUND(SIZE,BOUNDARY) \
203 ((((SIZE) + (BOUNDARY) - 1) / (BOUNDARY)) * (BOUNDARY))
205 /* CIE identifier. */
206 #if HOST_BITS_PER_WIDE_INT >= 64
207 #define DWARF_CIE_ID \
208 (unsigned HOST_WIDE_INT) (DWARF_OFFSET_SIZE == 4 ? DW_CIE_ID : DW64_CIE_ID)
209 #else
210 #define DWARF_CIE_ID DW_CIE_ID
211 #endif
214 /* A vector for a table that contains frame description
215 information for each routine. */
216 #define NOT_INDEXED (-1U)
217 #define NO_INDEX_ASSIGNED (-2U)
219 static GTY(()) vec<dw_fde_ref, va_gc> *fde_vec;
221 struct GTY((for_user)) indirect_string_node {
222 const char *str;
223 unsigned int refcount;
224 enum dwarf_form form;
225 char *label;
226 unsigned int index;
229 struct indirect_string_hasher : ggc_ptr_hash<indirect_string_node>
231 typedef const char *compare_type;
233 static hashval_t hash (indirect_string_node *);
234 static bool equal (indirect_string_node *, const char *);
237 static GTY (()) hash_table<indirect_string_hasher> *debug_str_hash;
239 static GTY (()) hash_table<indirect_string_hasher> *debug_line_str_hash;
241 /* With split_debug_info, both the comp_dir and dwo_name go in the
242 main object file, rather than the dwo, similar to the force_direct
243 parameter elsewhere but with additional complications:
245 1) The string is needed in both the main object file and the dwo.
246 That is, the comp_dir and dwo_name will appear in both places.
248 2) Strings can use four forms: DW_FORM_string, DW_FORM_strp,
249 DW_FORM_line_strp or DW_FORM_GNU_str_index.
251 3) GCC chooses the form to use late, depending on the size and
252 reference count.
254 Rather than forcing the all debug string handling functions and
255 callers to deal with these complications, simply use a separate,
256 special-cased string table for any attribute that should go in the
257 main object file. This limits the complexity to just the places
258 that need it. */
260 static GTY (()) hash_table<indirect_string_hasher> *skeleton_debug_str_hash;
262 static GTY(()) int dw2_string_counter;
264 /* True if the compilation unit places functions in more than one section. */
265 static GTY(()) bool have_multiple_function_sections = false;
267 /* Whether the default text and cold text sections have been used at all. */
268 static GTY(()) bool text_section_used = false;
269 static GTY(()) bool cold_text_section_used = false;
271 /* The default cold text section. */
272 static GTY(()) section *cold_text_section;
274 /* The DIE for C++14 'auto' in a function return type. */
275 static GTY(()) dw_die_ref auto_die;
277 /* The DIE for C++14 'decltype(auto)' in a function return type. */
278 static GTY(()) dw_die_ref decltype_auto_die;
280 /* Forward declarations for functions defined in this file. */
282 static void output_call_frame_info (int);
283 static void dwarf2out_note_section_used (void);
285 /* Personality decl of current unit. Used only when assembler does not support
286 personality CFI. */
287 static GTY(()) rtx current_unit_personality;
289 /* Whether an eh_frame section is required. */
290 static GTY(()) bool do_eh_frame = false;
292 /* .debug_rnglists next index. */
293 static unsigned int rnglist_idx;
295 /* Data and reference forms for relocatable data. */
296 #define DW_FORM_data (DWARF_OFFSET_SIZE == 8 ? DW_FORM_data8 : DW_FORM_data4)
297 #define DW_FORM_ref (DWARF_OFFSET_SIZE == 8 ? DW_FORM_ref8 : DW_FORM_ref4)
299 #ifndef DEBUG_FRAME_SECTION
300 #define DEBUG_FRAME_SECTION ".debug_frame"
301 #endif
303 #ifndef FUNC_BEGIN_LABEL
304 #define FUNC_BEGIN_LABEL "LFB"
305 #endif
307 #ifndef FUNC_END_LABEL
308 #define FUNC_END_LABEL "LFE"
309 #endif
311 #ifndef PROLOGUE_END_LABEL
312 #define PROLOGUE_END_LABEL "LPE"
313 #endif
315 #ifndef EPILOGUE_BEGIN_LABEL
316 #define EPILOGUE_BEGIN_LABEL "LEB"
317 #endif
319 #ifndef FRAME_BEGIN_LABEL
320 #define FRAME_BEGIN_LABEL "Lframe"
321 #endif
322 #define CIE_AFTER_SIZE_LABEL "LSCIE"
323 #define CIE_END_LABEL "LECIE"
324 #define FDE_LABEL "LSFDE"
325 #define FDE_AFTER_SIZE_LABEL "LASFDE"
326 #define FDE_END_LABEL "LEFDE"
327 #define LINE_NUMBER_BEGIN_LABEL "LSLT"
328 #define LINE_NUMBER_END_LABEL "LELT"
329 #define LN_PROLOG_AS_LABEL "LASLTP"
330 #define LN_PROLOG_END_LABEL "LELTP"
331 #define DIE_LABEL_PREFIX "DW"
333 /* Match the base name of a file to the base name of a compilation unit. */
335 static int
336 matches_main_base (const char *path)
338 /* Cache the last query. */
339 static const char *last_path = NULL;
340 static int last_match = 0;
341 if (path != last_path)
343 const char *base;
344 int length = base_of_path (path, &base);
345 last_path = path;
346 last_match = (length == main_input_baselength
347 && memcmp (base, main_input_basename, length) == 0);
349 return last_match;
352 #ifdef DEBUG_DEBUG_STRUCT
354 static int
355 dump_struct_debug (tree type, enum debug_info_usage usage,
356 enum debug_struct_file criterion, int generic,
357 int matches, int result)
359 /* Find the type name. */
360 tree type_decl = TYPE_STUB_DECL (type);
361 tree t = type_decl;
362 const char *name = 0;
363 if (TREE_CODE (t) == TYPE_DECL)
364 t = DECL_NAME (t);
365 if (t)
366 name = IDENTIFIER_POINTER (t);
368 fprintf (stderr, " struct %d %s %s %s %s %d %p %s\n",
369 criterion,
370 DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
371 matches ? "bas" : "hdr",
372 generic ? "gen" : "ord",
373 usage == DINFO_USAGE_DFN ? ";" :
374 usage == DINFO_USAGE_DIR_USE ? "." : "*",
375 result,
376 (void*) type_decl, name);
377 return result;
379 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
380 dump_struct_debug (type, usage, criterion, generic, matches, result)
382 #else
384 #define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
385 (result)
387 #endif
389 /* Get the number of HOST_WIDE_INTs needed to represent the precision
390 of the number. Some constants have a large uniform precision, so
391 we get the precision needed for the actual value of the number. */
393 static unsigned int
394 get_full_len (const wide_int &op)
396 int prec = wi::min_precision (op, UNSIGNED);
397 return ((prec + HOST_BITS_PER_WIDE_INT - 1)
398 / HOST_BITS_PER_WIDE_INT);
401 static bool
402 should_emit_struct_debug (tree type, enum debug_info_usage usage)
404 enum debug_struct_file criterion;
405 tree type_decl;
406 bool generic = lang_hooks.types.generic_p (type);
408 if (generic)
409 criterion = debug_struct_generic[usage];
410 else
411 criterion = debug_struct_ordinary[usage];
413 if (criterion == DINFO_STRUCT_FILE_NONE)
414 return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
415 if (criterion == DINFO_STRUCT_FILE_ANY)
416 return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
418 type_decl = TYPE_STUB_DECL (TYPE_MAIN_VARIANT (type));
420 if (type_decl != NULL)
422 if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
423 return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
425 if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
426 return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
429 return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
432 /* Switch [BACK] to eh_frame_section. If we don't have an eh_frame_section,
433 switch to the data section instead, and write out a synthetic start label
434 for collect2 the first time around. */
436 static void
437 switch_to_eh_frame_section (bool back ATTRIBUTE_UNUSED)
439 if (eh_frame_section == 0)
441 int flags;
443 if (EH_TABLES_CAN_BE_READ_ONLY)
445 int fde_encoding;
446 int per_encoding;
447 int lsda_encoding;
449 fde_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1,
450 /*global=*/0);
451 per_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2,
452 /*global=*/1);
453 lsda_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0,
454 /*global=*/0);
455 flags = ((! flag_pic
456 || ((fde_encoding & 0x70) != DW_EH_PE_absptr
457 && (fde_encoding & 0x70) != DW_EH_PE_aligned
458 && (per_encoding & 0x70) != DW_EH_PE_absptr
459 && (per_encoding & 0x70) != DW_EH_PE_aligned
460 && (lsda_encoding & 0x70) != DW_EH_PE_absptr
461 && (lsda_encoding & 0x70) != DW_EH_PE_aligned))
462 ? 0 : SECTION_WRITE);
464 else
465 flags = SECTION_WRITE;
467 #ifdef EH_FRAME_SECTION_NAME
468 eh_frame_section = get_section (EH_FRAME_SECTION_NAME, flags, NULL);
469 #else
470 eh_frame_section = ((flags == SECTION_WRITE)
471 ? data_section : readonly_data_section);
472 #endif /* EH_FRAME_SECTION_NAME */
475 switch_to_section (eh_frame_section);
477 #ifdef EH_FRAME_THROUGH_COLLECT2
478 /* We have no special eh_frame section. Emit special labels to guide
479 collect2. */
480 if (!back)
482 tree label = get_file_function_name ("F");
483 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
484 targetm.asm_out.globalize_label (asm_out_file,
485 IDENTIFIER_POINTER (label));
486 ASM_OUTPUT_LABEL (asm_out_file, IDENTIFIER_POINTER (label));
488 #endif
491 /* Switch [BACK] to the eh or debug frame table section, depending on
492 FOR_EH. */
494 static void
495 switch_to_frame_table_section (int for_eh, bool back)
497 if (for_eh)
498 switch_to_eh_frame_section (back);
499 else
501 if (!debug_frame_section)
502 debug_frame_section = get_section (DEBUG_FRAME_SECTION,
503 SECTION_DEBUG, NULL);
504 switch_to_section (debug_frame_section);
508 /* Describe for the GTY machinery what parts of dw_cfi_oprnd1 are used. */
510 enum dw_cfi_oprnd_type
511 dw_cfi_oprnd1_desc (enum dwarf_call_frame_info cfi)
513 switch (cfi)
515 case DW_CFA_nop:
516 case DW_CFA_GNU_window_save:
517 case DW_CFA_remember_state:
518 case DW_CFA_restore_state:
519 return dw_cfi_oprnd_unused;
521 case DW_CFA_set_loc:
522 case DW_CFA_advance_loc1:
523 case DW_CFA_advance_loc2:
524 case DW_CFA_advance_loc4:
525 case DW_CFA_MIPS_advance_loc8:
526 return dw_cfi_oprnd_addr;
528 case DW_CFA_offset:
529 case DW_CFA_offset_extended:
530 case DW_CFA_def_cfa:
531 case DW_CFA_offset_extended_sf:
532 case DW_CFA_def_cfa_sf:
533 case DW_CFA_restore:
534 case DW_CFA_restore_extended:
535 case DW_CFA_undefined:
536 case DW_CFA_same_value:
537 case DW_CFA_def_cfa_register:
538 case DW_CFA_register:
539 case DW_CFA_expression:
540 case DW_CFA_val_expression:
541 return dw_cfi_oprnd_reg_num;
543 case DW_CFA_def_cfa_offset:
544 case DW_CFA_GNU_args_size:
545 case DW_CFA_def_cfa_offset_sf:
546 return dw_cfi_oprnd_offset;
548 case DW_CFA_def_cfa_expression:
549 return dw_cfi_oprnd_loc;
551 default:
552 gcc_unreachable ();
556 /* Describe for the GTY machinery what parts of dw_cfi_oprnd2 are used. */
558 enum dw_cfi_oprnd_type
559 dw_cfi_oprnd2_desc (enum dwarf_call_frame_info cfi)
561 switch (cfi)
563 case DW_CFA_def_cfa:
564 case DW_CFA_def_cfa_sf:
565 case DW_CFA_offset:
566 case DW_CFA_offset_extended_sf:
567 case DW_CFA_offset_extended:
568 return dw_cfi_oprnd_offset;
570 case DW_CFA_register:
571 return dw_cfi_oprnd_reg_num;
573 case DW_CFA_expression:
574 case DW_CFA_val_expression:
575 return dw_cfi_oprnd_loc;
577 case DW_CFA_def_cfa_expression:
578 return dw_cfi_oprnd_cfa_loc;
580 default:
581 return dw_cfi_oprnd_unused;
585 /* Output one FDE. */
587 static void
588 output_fde (dw_fde_ref fde, bool for_eh, bool second,
589 char *section_start_label, int fde_encoding, char *augmentation,
590 bool any_lsda_needed, int lsda_encoding)
592 const char *begin, *end;
593 static unsigned int j;
594 char l1[MAX_ARTIFICIAL_LABEL_BYTES], l2[MAX_ARTIFICIAL_LABEL_BYTES];
596 targetm.asm_out.emit_unwind_label (asm_out_file, fde->decl, for_eh,
597 /* empty */ 0);
598 targetm.asm_out.internal_label (asm_out_file, FDE_LABEL,
599 for_eh + j);
600 ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + j);
601 ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + j);
602 if (!XCOFF_DEBUGGING_INFO || for_eh)
604 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
605 dw2_asm_output_data (4, 0xffffffff, "Initial length escape value"
606 " indicating 64-bit DWARF extension");
607 dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
608 "FDE Length");
610 ASM_OUTPUT_LABEL (asm_out_file, l1);
612 if (for_eh)
613 dw2_asm_output_delta (4, l1, section_start_label, "FDE CIE offset");
614 else
615 dw2_asm_output_offset (DWARF_OFFSET_SIZE, section_start_label,
616 debug_frame_section, "FDE CIE offset");
618 begin = second ? fde->dw_fde_second_begin : fde->dw_fde_begin;
619 end = second ? fde->dw_fde_second_end : fde->dw_fde_end;
621 if (for_eh)
623 rtx sym_ref = gen_rtx_SYMBOL_REF (Pmode, begin);
624 SYMBOL_REF_FLAGS (sym_ref) |= SYMBOL_FLAG_LOCAL;
625 dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref, false,
626 "FDE initial location");
627 dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
628 end, begin, "FDE address range");
630 else
632 dw2_asm_output_addr (DWARF2_ADDR_SIZE, begin, "FDE initial location");
633 dw2_asm_output_delta (DWARF2_ADDR_SIZE, end, begin, "FDE address range");
636 if (augmentation[0])
638 if (any_lsda_needed)
640 int size = size_of_encoded_value (lsda_encoding);
642 if (lsda_encoding == DW_EH_PE_aligned)
644 int offset = ( 4 /* Length */
645 + 4 /* CIE offset */
646 + 2 * size_of_encoded_value (fde_encoding)
647 + 1 /* Augmentation size */ );
648 int pad = -offset & (PTR_SIZE - 1);
650 size += pad;
651 gcc_assert (size_of_uleb128 (size) == 1);
654 dw2_asm_output_data_uleb128 (size, "Augmentation size");
656 if (fde->uses_eh_lsda)
658 ASM_GENERATE_INTERNAL_LABEL (l1, second ? "LLSDAC" : "LLSDA",
659 fde->funcdef_number);
660 dw2_asm_output_encoded_addr_rtx (lsda_encoding,
661 gen_rtx_SYMBOL_REF (Pmode, l1),
662 false,
663 "Language Specific Data Area");
665 else
667 if (lsda_encoding == DW_EH_PE_aligned)
668 ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (PTR_SIZE));
669 dw2_asm_output_data (size_of_encoded_value (lsda_encoding), 0,
670 "Language Specific Data Area (none)");
673 else
674 dw2_asm_output_data_uleb128 (0, "Augmentation size");
677 /* Loop through the Call Frame Instructions associated with this FDE. */
678 fde->dw_fde_current_label = begin;
680 size_t from, until, i;
682 from = 0;
683 until = vec_safe_length (fde->dw_fde_cfi);
685 if (fde->dw_fde_second_begin == NULL)
687 else if (!second)
688 until = fde->dw_fde_switch_cfi_index;
689 else
690 from = fde->dw_fde_switch_cfi_index;
692 for (i = from; i < until; i++)
693 output_cfi ((*fde->dw_fde_cfi)[i], fde, for_eh);
696 /* If we are to emit a ref/link from function bodies to their frame tables,
697 do it now. This is typically performed to make sure that tables
698 associated with functions are dragged with them and not discarded in
699 garbage collecting links. We need to do this on a per function basis to
700 cope with -ffunction-sections. */
702 #ifdef ASM_OUTPUT_DWARF_TABLE_REF
703 /* Switch to the function section, emit the ref to the tables, and
704 switch *back* into the table section. */
705 switch_to_section (function_section (fde->decl));
706 ASM_OUTPUT_DWARF_TABLE_REF (section_start_label);
707 switch_to_frame_table_section (for_eh, true);
708 #endif
710 /* Pad the FDE out to an address sized boundary. */
711 ASM_OUTPUT_ALIGN (asm_out_file,
712 floor_log2 ((for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE)));
713 ASM_OUTPUT_LABEL (asm_out_file, l2);
715 j += 2;
718 /* Return true if frame description entry FDE is needed for EH. */
720 static bool
721 fde_needed_for_eh_p (dw_fde_ref fde)
723 if (flag_asynchronous_unwind_tables)
724 return true;
726 if (TARGET_USES_WEAK_UNWIND_INFO && DECL_WEAK (fde->decl))
727 return true;
729 if (fde->uses_eh_lsda)
730 return true;
732 /* If exceptions are enabled, we have collected nothrow info. */
733 if (flag_exceptions && (fde->all_throwers_are_sibcalls || fde->nothrow))
734 return false;
736 return true;
739 /* Output the call frame information used to record information
740 that relates to calculating the frame pointer, and records the
741 location of saved registers. */
743 static void
744 output_call_frame_info (int for_eh)
746 unsigned int i;
747 dw_fde_ref fde;
748 dw_cfi_ref cfi;
749 char l1[MAX_ARTIFICIAL_LABEL_BYTES], l2[MAX_ARTIFICIAL_LABEL_BYTES];
750 char section_start_label[MAX_ARTIFICIAL_LABEL_BYTES];
751 bool any_lsda_needed = false;
752 char augmentation[6];
753 int augmentation_size;
754 int fde_encoding = DW_EH_PE_absptr;
755 int per_encoding = DW_EH_PE_absptr;
756 int lsda_encoding = DW_EH_PE_absptr;
757 int return_reg;
758 rtx personality = NULL;
759 int dw_cie_version;
761 /* Don't emit a CIE if there won't be any FDEs. */
762 if (!fde_vec)
763 return;
765 /* Nothing to do if the assembler's doing it all. */
766 if (dwarf2out_do_cfi_asm ())
767 return;
769 /* If we don't have any functions we'll want to unwind out of, don't emit
770 any EH unwind information. If we make FDEs linkonce, we may have to
771 emit an empty label for an FDE that wouldn't otherwise be emitted. We
772 want to avoid having an FDE kept around when the function it refers to
773 is discarded. Example where this matters: a primary function template
774 in C++ requires EH information, an explicit specialization doesn't. */
775 if (for_eh)
777 bool any_eh_needed = false;
779 FOR_EACH_VEC_ELT (*fde_vec, i, fde)
781 if (fde->uses_eh_lsda)
782 any_eh_needed = any_lsda_needed = true;
783 else if (fde_needed_for_eh_p (fde))
784 any_eh_needed = true;
785 else if (TARGET_USES_WEAK_UNWIND_INFO)
786 targetm.asm_out.emit_unwind_label (asm_out_file, fde->decl, 1, 1);
789 if (!any_eh_needed)
790 return;
793 /* We're going to be generating comments, so turn on app. */
794 if (flag_debug_asm)
795 app_enable ();
797 /* Switch to the proper frame section, first time. */
798 switch_to_frame_table_section (for_eh, false);
800 ASM_GENERATE_INTERNAL_LABEL (section_start_label, FRAME_BEGIN_LABEL, for_eh);
801 ASM_OUTPUT_LABEL (asm_out_file, section_start_label);
803 /* Output the CIE. */
804 ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh);
805 ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh);
806 if (!XCOFF_DEBUGGING_INFO || for_eh)
808 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4 && !for_eh)
809 dw2_asm_output_data (4, 0xffffffff,
810 "Initial length escape value indicating 64-bit DWARF extension");
811 dw2_asm_output_delta (for_eh ? 4 : DWARF_OFFSET_SIZE, l2, l1,
812 "Length of Common Information Entry");
814 ASM_OUTPUT_LABEL (asm_out_file, l1);
816 /* Now that the CIE pointer is PC-relative for EH,
817 use 0 to identify the CIE. */
818 dw2_asm_output_data ((for_eh ? 4 : DWARF_OFFSET_SIZE),
819 (for_eh ? 0 : DWARF_CIE_ID),
820 "CIE Identifier Tag");
822 /* Use the CIE version 3 for DWARF3; allow DWARF2 to continue to
823 use CIE version 1, unless that would produce incorrect results
824 due to overflowing the return register column. */
825 return_reg = DWARF2_FRAME_REG_OUT (DWARF_FRAME_RETURN_COLUMN, for_eh);
826 dw_cie_version = 1;
827 if (return_reg >= 256 || dwarf_version > 2)
828 dw_cie_version = 3;
829 dw2_asm_output_data (1, dw_cie_version, "CIE Version");
831 augmentation[0] = 0;
832 augmentation_size = 0;
834 personality = current_unit_personality;
835 if (for_eh)
837 char *p;
839 /* Augmentation:
840 z Indicates that a uleb128 is present to size the
841 augmentation section.
842 L Indicates the encoding (and thus presence) of
843 an LSDA pointer in the FDE augmentation.
844 R Indicates a non-default pointer encoding for
845 FDE code pointers.
846 P Indicates the presence of an encoding + language
847 personality routine in the CIE augmentation. */
849 fde_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0);
850 per_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2, /*global=*/1);
851 lsda_encoding = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/0);
853 p = augmentation + 1;
854 if (personality)
856 *p++ = 'P';
857 augmentation_size += 1 + size_of_encoded_value (per_encoding);
858 assemble_external_libcall (personality);
860 if (any_lsda_needed)
862 *p++ = 'L';
863 augmentation_size += 1;
865 if (fde_encoding != DW_EH_PE_absptr)
867 *p++ = 'R';
868 augmentation_size += 1;
870 if (p > augmentation + 1)
872 augmentation[0] = 'z';
873 *p = '\0';
876 /* Ug. Some platforms can't do unaligned dynamic relocations at all. */
877 if (personality && per_encoding == DW_EH_PE_aligned)
879 int offset = ( 4 /* Length */
880 + 4 /* CIE Id */
881 + 1 /* CIE version */
882 + strlen (augmentation) + 1 /* Augmentation */
883 + size_of_uleb128 (1) /* Code alignment */
884 + size_of_sleb128 (DWARF_CIE_DATA_ALIGNMENT)
885 + 1 /* RA column */
886 + 1 /* Augmentation size */
887 + 1 /* Personality encoding */ );
888 int pad = -offset & (PTR_SIZE - 1);
890 augmentation_size += pad;
892 /* Augmentations should be small, so there's scarce need to
893 iterate for a solution. Die if we exceed one uleb128 byte. */
894 gcc_assert (size_of_uleb128 (augmentation_size) == 1);
898 dw2_asm_output_nstring (augmentation, -1, "CIE Augmentation");
899 if (dw_cie_version >= 4)
901 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "CIE Address Size");
902 dw2_asm_output_data (1, 0, "CIE Segment Size");
904 dw2_asm_output_data_uleb128 (1, "CIE Code Alignment Factor");
905 dw2_asm_output_data_sleb128 (DWARF_CIE_DATA_ALIGNMENT,
906 "CIE Data Alignment Factor");
908 if (dw_cie_version == 1)
909 dw2_asm_output_data (1, return_reg, "CIE RA Column");
910 else
911 dw2_asm_output_data_uleb128 (return_reg, "CIE RA Column");
913 if (augmentation[0])
915 dw2_asm_output_data_uleb128 (augmentation_size, "Augmentation size");
916 if (personality)
918 dw2_asm_output_data (1, per_encoding, "Personality (%s)",
919 eh_data_format_name (per_encoding));
920 dw2_asm_output_encoded_addr_rtx (per_encoding,
921 personality,
922 true, NULL);
925 if (any_lsda_needed)
926 dw2_asm_output_data (1, lsda_encoding, "LSDA Encoding (%s)",
927 eh_data_format_name (lsda_encoding));
929 if (fde_encoding != DW_EH_PE_absptr)
930 dw2_asm_output_data (1, fde_encoding, "FDE Encoding (%s)",
931 eh_data_format_name (fde_encoding));
934 FOR_EACH_VEC_ELT (*cie_cfi_vec, i, cfi)
935 output_cfi (cfi, NULL, for_eh);
937 /* Pad the CIE out to an address sized boundary. */
938 ASM_OUTPUT_ALIGN (asm_out_file,
939 floor_log2 (for_eh ? PTR_SIZE : DWARF2_ADDR_SIZE));
940 ASM_OUTPUT_LABEL (asm_out_file, l2);
942 /* Loop through all of the FDE's. */
943 FOR_EACH_VEC_ELT (*fde_vec, i, fde)
945 unsigned int k;
947 /* Don't emit EH unwind info for leaf functions that don't need it. */
948 if (for_eh && !fde_needed_for_eh_p (fde))
949 continue;
951 for (k = 0; k < (fde->dw_fde_second_begin ? 2 : 1); k++)
952 output_fde (fde, for_eh, k, section_start_label, fde_encoding,
953 augmentation, any_lsda_needed, lsda_encoding);
956 if (for_eh && targetm.terminate_dw2_eh_frame_info)
957 dw2_asm_output_data (4, 0, "End of Table");
959 /* Turn off app to make assembly quicker. */
960 if (flag_debug_asm)
961 app_disable ();
964 /* Emit .cfi_startproc and .cfi_personality/.cfi_lsda if needed. */
966 static void
967 dwarf2out_do_cfi_startproc (bool second)
969 int enc;
970 rtx ref;
972 fprintf (asm_out_file, "\t.cfi_startproc\n");
974 /* .cfi_personality and .cfi_lsda are only relevant to DWARF2
975 eh unwinders. */
976 if (targetm_common.except_unwind_info (&global_options) != UI_DWARF2)
977 return;
979 rtx personality = get_personality_function (current_function_decl);
981 if (personality)
983 enc = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/2, /*global=*/1);
984 ref = personality;
986 /* ??? The GAS support isn't entirely consistent. We have to
987 handle indirect support ourselves, but PC-relative is done
988 in the assembler. Further, the assembler can't handle any
989 of the weirder relocation types. */
990 if (enc & DW_EH_PE_indirect)
991 ref = dw2_force_const_mem (ref, true);
993 fprintf (asm_out_file, "\t.cfi_personality %#x,", enc);
994 output_addr_const (asm_out_file, ref);
995 fputc ('\n', asm_out_file);
998 if (crtl->uses_eh_lsda)
1000 char lab[MAX_ARTIFICIAL_LABEL_BYTES];
1002 enc = ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/0, /*global=*/0);
1003 ASM_GENERATE_INTERNAL_LABEL (lab, second ? "LLSDAC" : "LLSDA",
1004 current_function_funcdef_no);
1005 ref = gen_rtx_SYMBOL_REF (Pmode, lab);
1006 SYMBOL_REF_FLAGS (ref) = SYMBOL_FLAG_LOCAL;
1008 if (enc & DW_EH_PE_indirect)
1009 ref = dw2_force_const_mem (ref, true);
1011 fprintf (asm_out_file, "\t.cfi_lsda %#x,", enc);
1012 output_addr_const (asm_out_file, ref);
1013 fputc ('\n', asm_out_file);
1017 /* Allocate CURRENT_FDE. Immediately initialize all we can, noting that
1018 this allocation may be done before pass_final. */
1020 dw_fde_ref
1021 dwarf2out_alloc_current_fde (void)
1023 dw_fde_ref fde;
1025 fde = ggc_cleared_alloc<dw_fde_node> ();
1026 fde->decl = current_function_decl;
1027 fde->funcdef_number = current_function_funcdef_no;
1028 fde->fde_index = vec_safe_length (fde_vec);
1029 fde->all_throwers_are_sibcalls = crtl->all_throwers_are_sibcalls;
1030 fde->uses_eh_lsda = crtl->uses_eh_lsda;
1031 fde->nothrow = crtl->nothrow;
1032 fde->drap_reg = INVALID_REGNUM;
1033 fde->vdrap_reg = INVALID_REGNUM;
1035 /* Record the FDE associated with this function. */
1036 cfun->fde = fde;
1037 vec_safe_push (fde_vec, fde);
1039 return fde;
1042 /* Output a marker (i.e. a label) for the beginning of a function, before
1043 the prologue. */
1045 void
1046 dwarf2out_begin_prologue (unsigned int line ATTRIBUTE_UNUSED,
1047 unsigned int column ATTRIBUTE_UNUSED,
1048 const char *file ATTRIBUTE_UNUSED)
1050 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1051 char * dup_label;
1052 dw_fde_ref fde;
1053 section *fnsec;
1054 bool do_frame;
1056 current_function_func_begin_label = NULL;
1058 do_frame = dwarf2out_do_frame ();
1060 /* ??? current_function_func_begin_label is also used by except.c for
1061 call-site information. We must emit this label if it might be used. */
1062 if (!do_frame
1063 && (!flag_exceptions
1064 || targetm_common.except_unwind_info (&global_options) == UI_SJLJ))
1065 return;
1067 fnsec = function_section (current_function_decl);
1068 switch_to_section (fnsec);
1069 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_BEGIN_LABEL,
1070 current_function_funcdef_no);
1071 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, FUNC_BEGIN_LABEL,
1072 current_function_funcdef_no);
1073 dup_label = xstrdup (label);
1074 current_function_func_begin_label = dup_label;
1076 /* We can elide FDE allocation if we're not emitting frame unwind info. */
1077 if (!do_frame)
1078 return;
1080 /* Unlike the debug version, the EH version of frame unwind info is a per-
1081 function setting so we need to record whether we need it for the unit. */
1082 do_eh_frame |= dwarf2out_do_eh_frame ();
1084 /* Cater to the various TARGET_ASM_OUTPUT_MI_THUNK implementations that
1085 emit insns as rtx but bypass the bulk of rest_of_compilation, which
1086 would include pass_dwarf2_frame. If we've not created the FDE yet,
1087 do so now. */
1088 fde = cfun->fde;
1089 if (fde == NULL)
1090 fde = dwarf2out_alloc_current_fde ();
1092 /* Initialize the bits of CURRENT_FDE that were not available earlier. */
1093 fde->dw_fde_begin = dup_label;
1094 fde->dw_fde_current_label = dup_label;
1095 fde->in_std_section = (fnsec == text_section
1096 || (cold_text_section && fnsec == cold_text_section));
1098 /* We only want to output line number information for the genuine dwarf2
1099 prologue case, not the eh frame case. */
1100 #ifdef DWARF2_DEBUGGING_INFO
1101 if (file)
1102 dwarf2out_source_line (line, column, file, 0, true);
1103 #endif
1105 if (dwarf2out_do_cfi_asm ())
1106 dwarf2out_do_cfi_startproc (false);
1107 else
1109 rtx personality = get_personality_function (current_function_decl);
1110 if (!current_unit_personality)
1111 current_unit_personality = personality;
1113 /* We cannot keep a current personality per function as without CFI
1114 asm, at the point where we emit the CFI data, there is no current
1115 function anymore. */
1116 if (personality && current_unit_personality != personality)
1117 sorry ("multiple EH personalities are supported only with assemblers "
1118 "supporting .cfi_personality directive");
1122 /* Output a marker (i.e. a label) for the end of the generated code
1123 for a function prologue. This gets called *after* the prologue code has
1124 been generated. */
1126 void
1127 dwarf2out_vms_end_prologue (unsigned int line ATTRIBUTE_UNUSED,
1128 const char *file ATTRIBUTE_UNUSED)
1130 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1132 /* Output a label to mark the endpoint of the code generated for this
1133 function. */
1134 ASM_GENERATE_INTERNAL_LABEL (label, PROLOGUE_END_LABEL,
1135 current_function_funcdef_no);
1136 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, PROLOGUE_END_LABEL,
1137 current_function_funcdef_no);
1138 cfun->fde->dw_fde_vms_end_prologue = xstrdup (label);
1141 /* Output a marker (i.e. a label) for the beginning of the generated code
1142 for a function epilogue. This gets called *before* the prologue code has
1143 been generated. */
1145 void
1146 dwarf2out_vms_begin_epilogue (unsigned int line ATTRIBUTE_UNUSED,
1147 const char *file ATTRIBUTE_UNUSED)
1149 dw_fde_ref fde = cfun->fde;
1150 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1152 if (fde->dw_fde_vms_begin_epilogue)
1153 return;
1155 /* Output a label to mark the endpoint of the code generated for this
1156 function. */
1157 ASM_GENERATE_INTERNAL_LABEL (label, EPILOGUE_BEGIN_LABEL,
1158 current_function_funcdef_no);
1159 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, EPILOGUE_BEGIN_LABEL,
1160 current_function_funcdef_no);
1161 fde->dw_fde_vms_begin_epilogue = xstrdup (label);
1164 /* Output a marker (i.e. a label) for the absolute end of the generated code
1165 for a function definition. This gets called *after* the epilogue code has
1166 been generated. */
1168 void
1169 dwarf2out_end_epilogue (unsigned int line ATTRIBUTE_UNUSED,
1170 const char *file ATTRIBUTE_UNUSED)
1172 dw_fde_ref fde;
1173 char label[MAX_ARTIFICIAL_LABEL_BYTES];
1175 last_var_location_insn = NULL;
1176 cached_next_real_insn = NULL;
1178 if (dwarf2out_do_cfi_asm ())
1179 fprintf (asm_out_file, "\t.cfi_endproc\n");
1181 /* Output a label to mark the endpoint of the code generated for this
1182 function. */
1183 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL,
1184 current_function_funcdef_no);
1185 ASM_OUTPUT_LABEL (asm_out_file, label);
1186 fde = cfun->fde;
1187 gcc_assert (fde != NULL);
1188 if (fde->dw_fde_second_begin == NULL)
1189 fde->dw_fde_end = xstrdup (label);
1192 void
1193 dwarf2out_frame_finish (void)
1195 /* Output call frame information. */
1196 if (targetm.debug_unwind_info () == UI_DWARF2)
1197 output_call_frame_info (0);
1199 /* Output another copy for the unwinder. */
1200 if (do_eh_frame)
1201 output_call_frame_info (1);
1204 /* Note that the current function section is being used for code. */
1206 static void
1207 dwarf2out_note_section_used (void)
1209 section *sec = current_function_section ();
1210 if (sec == text_section)
1211 text_section_used = true;
1212 else if (sec == cold_text_section)
1213 cold_text_section_used = true;
1216 static void var_location_switch_text_section (void);
1217 static void set_cur_line_info_table (section *);
1219 void
1220 dwarf2out_switch_text_section (void)
1222 section *sect;
1223 dw_fde_ref fde = cfun->fde;
1225 gcc_assert (cfun && fde && fde->dw_fde_second_begin == NULL);
1227 if (!in_cold_section_p)
1229 fde->dw_fde_end = crtl->subsections.cold_section_end_label;
1230 fde->dw_fde_second_begin = crtl->subsections.hot_section_label;
1231 fde->dw_fde_second_end = crtl->subsections.hot_section_end_label;
1233 else
1235 fde->dw_fde_end = crtl->subsections.hot_section_end_label;
1236 fde->dw_fde_second_begin = crtl->subsections.cold_section_label;
1237 fde->dw_fde_second_end = crtl->subsections.cold_section_end_label;
1239 have_multiple_function_sections = true;
1241 /* There is no need to mark used sections when not debugging. */
1242 if (cold_text_section != NULL)
1243 dwarf2out_note_section_used ();
1245 if (dwarf2out_do_cfi_asm ())
1246 fprintf (asm_out_file, "\t.cfi_endproc\n");
1248 /* Now do the real section switch. */
1249 sect = current_function_section ();
1250 switch_to_section (sect);
1252 fde->second_in_std_section
1253 = (sect == text_section
1254 || (cold_text_section && sect == cold_text_section));
1256 if (dwarf2out_do_cfi_asm ())
1257 dwarf2out_do_cfi_startproc (true);
1259 var_location_switch_text_section ();
1261 if (cold_text_section != NULL)
1262 set_cur_line_info_table (sect);
1265 /* And now, the subset of the debugging information support code necessary
1266 for emitting location expressions. */
1268 /* Data about a single source file. */
1269 struct GTY((for_user)) dwarf_file_data {
1270 const char * filename;
1271 int emitted_number;
1274 /* Describe an entry into the .debug_addr section. */
1276 enum ate_kind {
1277 ate_kind_rtx,
1278 ate_kind_rtx_dtprel,
1279 ate_kind_label
1282 struct GTY((for_user)) addr_table_entry {
1283 enum ate_kind kind;
1284 unsigned int refcount;
1285 unsigned int index;
1286 union addr_table_entry_struct_union
1288 rtx GTY ((tag ("0"))) rtl;
1289 char * GTY ((tag ("1"))) label;
1291 GTY ((desc ("%1.kind"))) addr;
1294 typedef unsigned int var_loc_view;
1296 /* Location lists are ranges + location descriptions for that range,
1297 so you can track variables that are in different places over
1298 their entire life. */
1299 typedef struct GTY(()) dw_loc_list_struct {
1300 dw_loc_list_ref dw_loc_next;
1301 const char *begin; /* Label and addr_entry for start of range */
1302 addr_table_entry *begin_entry;
1303 const char *end; /* Label for end of range */
1304 char *ll_symbol; /* Label for beginning of location list.
1305 Only on head of list. */
1306 char *vl_symbol; /* Label for beginning of view list. Ditto. */
1307 const char *section; /* Section this loclist is relative to */
1308 dw_loc_descr_ref expr;
1309 var_loc_view vbegin, vend;
1310 hashval_t hash;
1311 /* True if all addresses in this and subsequent lists are known to be
1312 resolved. */
1313 bool resolved_addr;
1314 /* True if this list has been replaced by dw_loc_next. */
1315 bool replaced;
1316 /* True if it has been emitted into .debug_loc* / .debug_loclists*
1317 section. */
1318 unsigned char emitted : 1;
1319 /* True if hash field is index rather than hash value. */
1320 unsigned char num_assigned : 1;
1321 /* True if .debug_loclists.dwo offset has been emitted for it already. */
1322 unsigned char offset_emitted : 1;
1323 /* True if note_variable_value_in_expr has been called on it. */
1324 unsigned char noted_variable_value : 1;
1325 /* True if the range should be emitted even if begin and end
1326 are the same. */
1327 bool force;
1328 } dw_loc_list_node;
1330 static dw_loc_descr_ref int_loc_descriptor (poly_int64);
1331 static dw_loc_descr_ref uint_loc_descriptor (unsigned HOST_WIDE_INT);
1333 /* Convert a DWARF stack opcode into its string name. */
1335 static const char *
1336 dwarf_stack_op_name (unsigned int op)
1338 const char *name = get_DW_OP_name (op);
1340 if (name != NULL)
1341 return name;
1343 return "OP_<unknown>";
1346 /* Return TRUE iff we're to output location view lists as a separate
1347 attribute next to the location lists, as an extension compatible
1348 with DWARF 2 and above. */
1350 static inline bool
1351 dwarf2out_locviews_in_attribute ()
1353 return debug_variable_location_views == 1;
1356 /* Return TRUE iff we're to output location view lists as part of the
1357 location lists, as proposed for standardization after DWARF 5. */
1359 static inline bool
1360 dwarf2out_locviews_in_loclist ()
1362 #ifndef DW_LLE_view_pair
1363 return false;
1364 #else
1365 return debug_variable_location_views == -1;
1366 #endif
1369 /* Return a pointer to a newly allocated location description. Location
1370 descriptions are simple expression terms that can be strung
1371 together to form more complicated location (address) descriptions. */
1373 static inline dw_loc_descr_ref
1374 new_loc_descr (enum dwarf_location_atom op, unsigned HOST_WIDE_INT oprnd1,
1375 unsigned HOST_WIDE_INT oprnd2)
1377 dw_loc_descr_ref descr = ggc_cleared_alloc<dw_loc_descr_node> ();
1379 descr->dw_loc_opc = op;
1380 descr->dw_loc_oprnd1.val_class = dw_val_class_unsigned_const;
1381 descr->dw_loc_oprnd1.val_entry = NULL;
1382 descr->dw_loc_oprnd1.v.val_unsigned = oprnd1;
1383 descr->dw_loc_oprnd2.val_class = dw_val_class_unsigned_const;
1384 descr->dw_loc_oprnd2.val_entry = NULL;
1385 descr->dw_loc_oprnd2.v.val_unsigned = oprnd2;
1387 return descr;
1390 /* Add a location description term to a location description expression. */
1392 static inline void
1393 add_loc_descr (dw_loc_descr_ref *list_head, dw_loc_descr_ref descr)
1395 dw_loc_descr_ref *d;
1397 /* Find the end of the chain. */
1398 for (d = list_head; (*d) != NULL; d = &(*d)->dw_loc_next)
1401 *d = descr;
1404 /* Compare two location operands for exact equality. */
1406 static bool
1407 dw_val_equal_p (dw_val_node *a, dw_val_node *b)
1409 if (a->val_class != b->val_class)
1410 return false;
1411 switch (a->val_class)
1413 case dw_val_class_none:
1414 return true;
1415 case dw_val_class_addr:
1416 return rtx_equal_p (a->v.val_addr, b->v.val_addr);
1418 case dw_val_class_offset:
1419 case dw_val_class_unsigned_const:
1420 case dw_val_class_const:
1421 case dw_val_class_unsigned_const_implicit:
1422 case dw_val_class_const_implicit:
1423 case dw_val_class_range_list:
1424 /* These are all HOST_WIDE_INT, signed or unsigned. */
1425 return a->v.val_unsigned == b->v.val_unsigned;
1427 case dw_val_class_loc:
1428 return a->v.val_loc == b->v.val_loc;
1429 case dw_val_class_loc_list:
1430 return a->v.val_loc_list == b->v.val_loc_list;
1431 case dw_val_class_view_list:
1432 return a->v.val_view_list == b->v.val_view_list;
1433 case dw_val_class_die_ref:
1434 return a->v.val_die_ref.die == b->v.val_die_ref.die;
1435 case dw_val_class_fde_ref:
1436 return a->v.val_fde_index == b->v.val_fde_index;
1437 case dw_val_class_symview:
1438 return strcmp (a->v.val_symbolic_view, b->v.val_symbolic_view) == 0;
1439 case dw_val_class_lbl_id:
1440 case dw_val_class_lineptr:
1441 case dw_val_class_macptr:
1442 case dw_val_class_loclistsptr:
1443 case dw_val_class_high_pc:
1444 return strcmp (a->v.val_lbl_id, b->v.val_lbl_id) == 0;
1445 case dw_val_class_str:
1446 return a->v.val_str == b->v.val_str;
1447 case dw_val_class_flag:
1448 return a->v.val_flag == b->v.val_flag;
1449 case dw_val_class_file:
1450 case dw_val_class_file_implicit:
1451 return a->v.val_file == b->v.val_file;
1452 case dw_val_class_decl_ref:
1453 return a->v.val_decl_ref == b->v.val_decl_ref;
1455 case dw_val_class_const_double:
1456 return (a->v.val_double.high == b->v.val_double.high
1457 && a->v.val_double.low == b->v.val_double.low);
1459 case dw_val_class_wide_int:
1460 return *a->v.val_wide == *b->v.val_wide;
1462 case dw_val_class_vec:
1464 size_t a_len = a->v.val_vec.elt_size * a->v.val_vec.length;
1465 size_t b_len = b->v.val_vec.elt_size * b->v.val_vec.length;
1467 return (a_len == b_len
1468 && !memcmp (a->v.val_vec.array, b->v.val_vec.array, a_len));
1471 case dw_val_class_data8:
1472 return memcmp (a->v.val_data8, b->v.val_data8, 8) == 0;
1474 case dw_val_class_vms_delta:
1475 return (!strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1)
1476 && !strcmp (a->v.val_vms_delta.lbl1, b->v.val_vms_delta.lbl1));
1478 case dw_val_class_discr_value:
1479 return (a->v.val_discr_value.pos == b->v.val_discr_value.pos
1480 && a->v.val_discr_value.v.uval == b->v.val_discr_value.v.uval);
1481 case dw_val_class_discr_list:
1482 /* It makes no sense comparing two discriminant value lists. */
1483 return false;
1485 gcc_unreachable ();
1488 /* Compare two location atoms for exact equality. */
1490 static bool
1491 loc_descr_equal_p_1 (dw_loc_descr_ref a, dw_loc_descr_ref b)
1493 if (a->dw_loc_opc != b->dw_loc_opc)
1494 return false;
1496 /* ??? This is only ever set for DW_OP_constNu, for N equal to the
1497 address size, but since we always allocate cleared storage it
1498 should be zero for other types of locations. */
1499 if (a->dtprel != b->dtprel)
1500 return false;
1502 return (dw_val_equal_p (&a->dw_loc_oprnd1, &b->dw_loc_oprnd1)
1503 && dw_val_equal_p (&a->dw_loc_oprnd2, &b->dw_loc_oprnd2));
1506 /* Compare two complete location expressions for exact equality. */
1508 bool
1509 loc_descr_equal_p (dw_loc_descr_ref a, dw_loc_descr_ref b)
1511 while (1)
1513 if (a == b)
1514 return true;
1515 if (a == NULL || b == NULL)
1516 return false;
1517 if (!loc_descr_equal_p_1 (a, b))
1518 return false;
1520 a = a->dw_loc_next;
1521 b = b->dw_loc_next;
1526 /* Add a constant POLY_OFFSET to a location expression. */
1528 static void
1529 loc_descr_plus_const (dw_loc_descr_ref *list_head, poly_int64 poly_offset)
1531 dw_loc_descr_ref loc;
1532 HOST_WIDE_INT *p;
1534 gcc_assert (*list_head != NULL);
1536 if (known_eq (poly_offset, 0))
1537 return;
1539 /* Find the end of the chain. */
1540 for (loc = *list_head; loc->dw_loc_next != NULL; loc = loc->dw_loc_next)
1543 HOST_WIDE_INT offset;
1544 if (!poly_offset.is_constant (&offset))
1546 loc->dw_loc_next = int_loc_descriptor (poly_offset);
1547 add_loc_descr (&loc->dw_loc_next, new_loc_descr (DW_OP_plus, 0, 0));
1548 return;
1551 p = NULL;
1552 if (loc->dw_loc_opc == DW_OP_fbreg
1553 || (loc->dw_loc_opc >= DW_OP_breg0 && loc->dw_loc_opc <= DW_OP_breg31))
1554 p = &loc->dw_loc_oprnd1.v.val_int;
1555 else if (loc->dw_loc_opc == DW_OP_bregx)
1556 p = &loc->dw_loc_oprnd2.v.val_int;
1558 /* If the last operation is fbreg, breg{0..31,x}, optimize by adjusting its
1559 offset. Don't optimize if an signed integer overflow would happen. */
1560 if (p != NULL
1561 && ((offset > 0 && *p <= INTTYPE_MAXIMUM (HOST_WIDE_INT) - offset)
1562 || (offset < 0 && *p >= INTTYPE_MINIMUM (HOST_WIDE_INT) - offset)))
1563 *p += offset;
1565 else if (offset > 0)
1566 loc->dw_loc_next = new_loc_descr (DW_OP_plus_uconst, offset, 0);
1568 else
1570 loc->dw_loc_next
1571 = uint_loc_descriptor (-(unsigned HOST_WIDE_INT) offset);
1572 add_loc_descr (&loc->dw_loc_next, new_loc_descr (DW_OP_minus, 0, 0));
1576 /* Return a pointer to a newly allocated location description for
1577 REG and OFFSET. */
1579 static inline dw_loc_descr_ref
1580 new_reg_loc_descr (unsigned int reg, poly_int64 offset)
1582 HOST_WIDE_INT const_offset;
1583 if (offset.is_constant (&const_offset))
1585 if (reg <= 31)
1586 return new_loc_descr ((enum dwarf_location_atom) (DW_OP_breg0 + reg),
1587 const_offset, 0);
1588 else
1589 return new_loc_descr (DW_OP_bregx, reg, const_offset);
1591 else
1593 dw_loc_descr_ref ret = new_reg_loc_descr (reg, 0);
1594 loc_descr_plus_const (&ret, offset);
1595 return ret;
1599 /* Add a constant OFFSET to a location list. */
1601 static void
1602 loc_list_plus_const (dw_loc_list_ref list_head, poly_int64 offset)
1604 dw_loc_list_ref d;
1605 for (d = list_head; d != NULL; d = d->dw_loc_next)
1606 loc_descr_plus_const (&d->expr, offset);
1609 #define DWARF_REF_SIZE \
1610 (dwarf_version == 2 ? DWARF2_ADDR_SIZE : DWARF_OFFSET_SIZE)
1612 /* The number of bits that can be encoded by largest DW_FORM_dataN.
1613 In DWARF4 and earlier it is DW_FORM_data8 with 64 bits, in DWARF5
1614 DW_FORM_data16 with 128 bits. */
1615 #define DWARF_LARGEST_DATA_FORM_BITS \
1616 (dwarf_version >= 5 ? 128 : 64)
1618 /* Utility inline function for construction of ops that were GNU extension
1619 before DWARF 5. */
1620 static inline enum dwarf_location_atom
1621 dwarf_OP (enum dwarf_location_atom op)
1623 switch (op)
1625 case DW_OP_implicit_pointer:
1626 if (dwarf_version < 5)
1627 return DW_OP_GNU_implicit_pointer;
1628 break;
1630 case DW_OP_entry_value:
1631 if (dwarf_version < 5)
1632 return DW_OP_GNU_entry_value;
1633 break;
1635 case DW_OP_const_type:
1636 if (dwarf_version < 5)
1637 return DW_OP_GNU_const_type;
1638 break;
1640 case DW_OP_regval_type:
1641 if (dwarf_version < 5)
1642 return DW_OP_GNU_regval_type;
1643 break;
1645 case DW_OP_deref_type:
1646 if (dwarf_version < 5)
1647 return DW_OP_GNU_deref_type;
1648 break;
1650 case DW_OP_convert:
1651 if (dwarf_version < 5)
1652 return DW_OP_GNU_convert;
1653 break;
1655 case DW_OP_reinterpret:
1656 if (dwarf_version < 5)
1657 return DW_OP_GNU_reinterpret;
1658 break;
1660 default:
1661 break;
1663 return op;
1666 /* Similarly for attributes. */
1667 static inline enum dwarf_attribute
1668 dwarf_AT (enum dwarf_attribute at)
1670 switch (at)
1672 case DW_AT_call_return_pc:
1673 if (dwarf_version < 5)
1674 return DW_AT_low_pc;
1675 break;
1677 case DW_AT_call_tail_call:
1678 if (dwarf_version < 5)
1679 return DW_AT_GNU_tail_call;
1680 break;
1682 case DW_AT_call_origin:
1683 if (dwarf_version < 5)
1684 return DW_AT_abstract_origin;
1685 break;
1687 case DW_AT_call_target:
1688 if (dwarf_version < 5)
1689 return DW_AT_GNU_call_site_target;
1690 break;
1692 case DW_AT_call_target_clobbered:
1693 if (dwarf_version < 5)
1694 return DW_AT_GNU_call_site_target_clobbered;
1695 break;
1697 case DW_AT_call_parameter:
1698 if (dwarf_version < 5)
1699 return DW_AT_abstract_origin;
1700 break;
1702 case DW_AT_call_value:
1703 if (dwarf_version < 5)
1704 return DW_AT_GNU_call_site_value;
1705 break;
1707 case DW_AT_call_data_value:
1708 if (dwarf_version < 5)
1709 return DW_AT_GNU_call_site_data_value;
1710 break;
1712 case DW_AT_call_all_calls:
1713 if (dwarf_version < 5)
1714 return DW_AT_GNU_all_call_sites;
1715 break;
1717 case DW_AT_call_all_tail_calls:
1718 if (dwarf_version < 5)
1719 return DW_AT_GNU_all_tail_call_sites;
1720 break;
1722 case DW_AT_dwo_name:
1723 if (dwarf_version < 5)
1724 return DW_AT_GNU_dwo_name;
1725 break;
1727 default:
1728 break;
1730 return at;
1733 /* And similarly for tags. */
1734 static inline enum dwarf_tag
1735 dwarf_TAG (enum dwarf_tag tag)
1737 switch (tag)
1739 case DW_TAG_call_site:
1740 if (dwarf_version < 5)
1741 return DW_TAG_GNU_call_site;
1742 break;
1744 case DW_TAG_call_site_parameter:
1745 if (dwarf_version < 5)
1746 return DW_TAG_GNU_call_site_parameter;
1747 break;
1749 default:
1750 break;
1752 return tag;
1755 static unsigned long int get_base_type_offset (dw_die_ref);
1757 /* Return the size of a location descriptor. */
1759 static unsigned long
1760 size_of_loc_descr (dw_loc_descr_ref loc)
1762 unsigned long size = 1;
1764 switch (loc->dw_loc_opc)
1766 case DW_OP_addr:
1767 size += DWARF2_ADDR_SIZE;
1768 break;
1769 case DW_OP_GNU_addr_index:
1770 case DW_OP_GNU_const_index:
1771 gcc_assert (loc->dw_loc_oprnd1.val_entry->index != NO_INDEX_ASSIGNED);
1772 size += size_of_uleb128 (loc->dw_loc_oprnd1.val_entry->index);
1773 break;
1774 case DW_OP_const1u:
1775 case DW_OP_const1s:
1776 size += 1;
1777 break;
1778 case DW_OP_const2u:
1779 case DW_OP_const2s:
1780 size += 2;
1781 break;
1782 case DW_OP_const4u:
1783 case DW_OP_const4s:
1784 size += 4;
1785 break;
1786 case DW_OP_const8u:
1787 case DW_OP_const8s:
1788 size += 8;
1789 break;
1790 case DW_OP_constu:
1791 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1792 break;
1793 case DW_OP_consts:
1794 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
1795 break;
1796 case DW_OP_pick:
1797 size += 1;
1798 break;
1799 case DW_OP_plus_uconst:
1800 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1801 break;
1802 case DW_OP_skip:
1803 case DW_OP_bra:
1804 size += 2;
1805 break;
1806 case DW_OP_breg0:
1807 case DW_OP_breg1:
1808 case DW_OP_breg2:
1809 case DW_OP_breg3:
1810 case DW_OP_breg4:
1811 case DW_OP_breg5:
1812 case DW_OP_breg6:
1813 case DW_OP_breg7:
1814 case DW_OP_breg8:
1815 case DW_OP_breg9:
1816 case DW_OP_breg10:
1817 case DW_OP_breg11:
1818 case DW_OP_breg12:
1819 case DW_OP_breg13:
1820 case DW_OP_breg14:
1821 case DW_OP_breg15:
1822 case DW_OP_breg16:
1823 case DW_OP_breg17:
1824 case DW_OP_breg18:
1825 case DW_OP_breg19:
1826 case DW_OP_breg20:
1827 case DW_OP_breg21:
1828 case DW_OP_breg22:
1829 case DW_OP_breg23:
1830 case DW_OP_breg24:
1831 case DW_OP_breg25:
1832 case DW_OP_breg26:
1833 case DW_OP_breg27:
1834 case DW_OP_breg28:
1835 case DW_OP_breg29:
1836 case DW_OP_breg30:
1837 case DW_OP_breg31:
1838 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
1839 break;
1840 case DW_OP_regx:
1841 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1842 break;
1843 case DW_OP_fbreg:
1844 size += size_of_sleb128 (loc->dw_loc_oprnd1.v.val_int);
1845 break;
1846 case DW_OP_bregx:
1847 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1848 size += size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int);
1849 break;
1850 case DW_OP_piece:
1851 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1852 break;
1853 case DW_OP_bit_piece:
1854 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1855 size += size_of_uleb128 (loc->dw_loc_oprnd2.v.val_unsigned);
1856 break;
1857 case DW_OP_deref_size:
1858 case DW_OP_xderef_size:
1859 size += 1;
1860 break;
1861 case DW_OP_call2:
1862 size += 2;
1863 break;
1864 case DW_OP_call4:
1865 size += 4;
1866 break;
1867 case DW_OP_call_ref:
1868 case DW_OP_GNU_variable_value:
1869 size += DWARF_REF_SIZE;
1870 break;
1871 case DW_OP_implicit_value:
1872 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned)
1873 + loc->dw_loc_oprnd1.v.val_unsigned;
1874 break;
1875 case DW_OP_implicit_pointer:
1876 case DW_OP_GNU_implicit_pointer:
1877 size += DWARF_REF_SIZE + size_of_sleb128 (loc->dw_loc_oprnd2.v.val_int);
1878 break;
1879 case DW_OP_entry_value:
1880 case DW_OP_GNU_entry_value:
1882 unsigned long op_size = size_of_locs (loc->dw_loc_oprnd1.v.val_loc);
1883 size += size_of_uleb128 (op_size) + op_size;
1884 break;
1886 case DW_OP_const_type:
1887 case DW_OP_GNU_const_type:
1889 unsigned long o
1890 = get_base_type_offset (loc->dw_loc_oprnd1.v.val_die_ref.die);
1891 size += size_of_uleb128 (o) + 1;
1892 switch (loc->dw_loc_oprnd2.val_class)
1894 case dw_val_class_vec:
1895 size += loc->dw_loc_oprnd2.v.val_vec.length
1896 * loc->dw_loc_oprnd2.v.val_vec.elt_size;
1897 break;
1898 case dw_val_class_const:
1899 size += HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT;
1900 break;
1901 case dw_val_class_const_double:
1902 size += HOST_BITS_PER_DOUBLE_INT / BITS_PER_UNIT;
1903 break;
1904 case dw_val_class_wide_int:
1905 size += (get_full_len (*loc->dw_loc_oprnd2.v.val_wide)
1906 * HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT);
1907 break;
1908 default:
1909 gcc_unreachable ();
1911 break;
1913 case DW_OP_regval_type:
1914 case DW_OP_GNU_regval_type:
1916 unsigned long o
1917 = get_base_type_offset (loc->dw_loc_oprnd2.v.val_die_ref.die);
1918 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned)
1919 + size_of_uleb128 (o);
1921 break;
1922 case DW_OP_deref_type:
1923 case DW_OP_GNU_deref_type:
1925 unsigned long o
1926 = get_base_type_offset (loc->dw_loc_oprnd2.v.val_die_ref.die);
1927 size += 1 + size_of_uleb128 (o);
1929 break;
1930 case DW_OP_convert:
1931 case DW_OP_reinterpret:
1932 case DW_OP_GNU_convert:
1933 case DW_OP_GNU_reinterpret:
1934 if (loc->dw_loc_oprnd1.val_class == dw_val_class_unsigned_const)
1935 size += size_of_uleb128 (loc->dw_loc_oprnd1.v.val_unsigned);
1936 else
1938 unsigned long o
1939 = get_base_type_offset (loc->dw_loc_oprnd1.v.val_die_ref.die);
1940 size += size_of_uleb128 (o);
1942 break;
1943 case DW_OP_GNU_parameter_ref:
1944 size += 4;
1945 break;
1946 default:
1947 break;
1950 return size;
1953 /* Return the size of a series of location descriptors. */
1955 unsigned long
1956 size_of_locs (dw_loc_descr_ref loc)
1958 dw_loc_descr_ref l;
1959 unsigned long size;
1961 /* If there are no skip or bra opcodes, don't fill in the dw_loc_addr
1962 field, to avoid writing to a PCH file. */
1963 for (size = 0, l = loc; l != NULL; l = l->dw_loc_next)
1965 if (l->dw_loc_opc == DW_OP_skip || l->dw_loc_opc == DW_OP_bra)
1966 break;
1967 size += size_of_loc_descr (l);
1969 if (! l)
1970 return size;
1972 for (size = 0, l = loc; l != NULL; l = l->dw_loc_next)
1974 l->dw_loc_addr = size;
1975 size += size_of_loc_descr (l);
1978 return size;
1981 /* Return the size of the value in a DW_AT_discr_value attribute. */
1983 static int
1984 size_of_discr_value (dw_discr_value *discr_value)
1986 if (discr_value->pos)
1987 return size_of_uleb128 (discr_value->v.uval);
1988 else
1989 return size_of_sleb128 (discr_value->v.sval);
1992 /* Return the size of the value in a DW_AT_discr_list attribute. */
1994 static int
1995 size_of_discr_list (dw_discr_list_ref discr_list)
1997 int size = 0;
1999 for (dw_discr_list_ref list = discr_list;
2000 list != NULL;
2001 list = list->dw_discr_next)
2003 /* One byte for the discriminant value descriptor, and then one or two
2004 LEB128 numbers, depending on whether it's a single case label or a
2005 range label. */
2006 size += 1;
2007 size += size_of_discr_value (&list->dw_discr_lower_bound);
2008 if (list->dw_discr_range != 0)
2009 size += size_of_discr_value (&list->dw_discr_upper_bound);
2011 return size;
2014 static HOST_WIDE_INT extract_int (const unsigned char *, unsigned);
2015 static void get_ref_die_offset_label (char *, dw_die_ref);
2016 static unsigned long int get_ref_die_offset (dw_die_ref);
2018 /* Output location description stack opcode's operands (if any).
2019 The for_eh_or_skip parameter controls whether register numbers are
2020 converted using DWARF2_FRAME_REG_OUT, which is needed in the case that
2021 hard reg numbers have been processed via DWARF_FRAME_REGNUM (i.e. for unwind
2022 info). This should be suppressed for the cases that have not been converted
2023 (i.e. symbolic debug info), by setting the parameter < 0. See PR47324. */
2025 static void
2026 output_loc_operands (dw_loc_descr_ref loc, int for_eh_or_skip)
2028 dw_val_ref val1 = &loc->dw_loc_oprnd1;
2029 dw_val_ref val2 = &loc->dw_loc_oprnd2;
2031 switch (loc->dw_loc_opc)
2033 #ifdef DWARF2_DEBUGGING_INFO
2034 case DW_OP_const2u:
2035 case DW_OP_const2s:
2036 dw2_asm_output_data (2, val1->v.val_int, NULL);
2037 break;
2038 case DW_OP_const4u:
2039 if (loc->dtprel)
2041 gcc_assert (targetm.asm_out.output_dwarf_dtprel);
2042 targetm.asm_out.output_dwarf_dtprel (asm_out_file, 4,
2043 val1->v.val_addr);
2044 fputc ('\n', asm_out_file);
2045 break;
2047 /* FALLTHRU */
2048 case DW_OP_const4s:
2049 dw2_asm_output_data (4, val1->v.val_int, NULL);
2050 break;
2051 case DW_OP_const8u:
2052 if (loc->dtprel)
2054 gcc_assert (targetm.asm_out.output_dwarf_dtprel);
2055 targetm.asm_out.output_dwarf_dtprel (asm_out_file, 8,
2056 val1->v.val_addr);
2057 fputc ('\n', asm_out_file);
2058 break;
2060 /* FALLTHRU */
2061 case DW_OP_const8s:
2062 gcc_assert (HOST_BITS_PER_WIDE_INT >= 64);
2063 dw2_asm_output_data (8, val1->v.val_int, NULL);
2064 break;
2065 case DW_OP_skip:
2066 case DW_OP_bra:
2068 int offset;
2070 gcc_assert (val1->val_class == dw_val_class_loc);
2071 offset = val1->v.val_loc->dw_loc_addr - (loc->dw_loc_addr + 3);
2073 dw2_asm_output_data (2, offset, NULL);
2075 break;
2076 case DW_OP_implicit_value:
2077 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2078 switch (val2->val_class)
2080 case dw_val_class_const:
2081 dw2_asm_output_data (val1->v.val_unsigned, val2->v.val_int, NULL);
2082 break;
2083 case dw_val_class_vec:
2085 unsigned int elt_size = val2->v.val_vec.elt_size;
2086 unsigned int len = val2->v.val_vec.length;
2087 unsigned int i;
2088 unsigned char *p;
2090 if (elt_size > sizeof (HOST_WIDE_INT))
2092 elt_size /= 2;
2093 len *= 2;
2095 for (i = 0, p = (unsigned char *) val2->v.val_vec.array;
2096 i < len;
2097 i++, p += elt_size)
2098 dw2_asm_output_data (elt_size, extract_int (p, elt_size),
2099 "fp or vector constant word %u", i);
2101 break;
2102 case dw_val_class_const_double:
2104 unsigned HOST_WIDE_INT first, second;
2106 if (WORDS_BIG_ENDIAN)
2108 first = val2->v.val_double.high;
2109 second = val2->v.val_double.low;
2111 else
2113 first = val2->v.val_double.low;
2114 second = val2->v.val_double.high;
2116 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
2117 first, NULL);
2118 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
2119 second, NULL);
2121 break;
2122 case dw_val_class_wide_int:
2124 int i;
2125 int len = get_full_len (*val2->v.val_wide);
2126 if (WORDS_BIG_ENDIAN)
2127 for (i = len - 1; i >= 0; --i)
2128 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
2129 val2->v.val_wide->elt (i), NULL);
2130 else
2131 for (i = 0; i < len; ++i)
2132 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
2133 val2->v.val_wide->elt (i), NULL);
2135 break;
2136 case dw_val_class_addr:
2137 gcc_assert (val1->v.val_unsigned == DWARF2_ADDR_SIZE);
2138 dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, val2->v.val_addr, NULL);
2139 break;
2140 default:
2141 gcc_unreachable ();
2143 break;
2144 #else
2145 case DW_OP_const2u:
2146 case DW_OP_const2s:
2147 case DW_OP_const4u:
2148 case DW_OP_const4s:
2149 case DW_OP_const8u:
2150 case DW_OP_const8s:
2151 case DW_OP_skip:
2152 case DW_OP_bra:
2153 case DW_OP_implicit_value:
2154 /* We currently don't make any attempt to make sure these are
2155 aligned properly like we do for the main unwind info, so
2156 don't support emitting things larger than a byte if we're
2157 only doing unwinding. */
2158 gcc_unreachable ();
2159 #endif
2160 case DW_OP_const1u:
2161 case DW_OP_const1s:
2162 dw2_asm_output_data (1, val1->v.val_int, NULL);
2163 break;
2164 case DW_OP_constu:
2165 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2166 break;
2167 case DW_OP_consts:
2168 dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
2169 break;
2170 case DW_OP_pick:
2171 dw2_asm_output_data (1, val1->v.val_int, NULL);
2172 break;
2173 case DW_OP_plus_uconst:
2174 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2175 break;
2176 case DW_OP_breg0:
2177 case DW_OP_breg1:
2178 case DW_OP_breg2:
2179 case DW_OP_breg3:
2180 case DW_OP_breg4:
2181 case DW_OP_breg5:
2182 case DW_OP_breg6:
2183 case DW_OP_breg7:
2184 case DW_OP_breg8:
2185 case DW_OP_breg9:
2186 case DW_OP_breg10:
2187 case DW_OP_breg11:
2188 case DW_OP_breg12:
2189 case DW_OP_breg13:
2190 case DW_OP_breg14:
2191 case DW_OP_breg15:
2192 case DW_OP_breg16:
2193 case DW_OP_breg17:
2194 case DW_OP_breg18:
2195 case DW_OP_breg19:
2196 case DW_OP_breg20:
2197 case DW_OP_breg21:
2198 case DW_OP_breg22:
2199 case DW_OP_breg23:
2200 case DW_OP_breg24:
2201 case DW_OP_breg25:
2202 case DW_OP_breg26:
2203 case DW_OP_breg27:
2204 case DW_OP_breg28:
2205 case DW_OP_breg29:
2206 case DW_OP_breg30:
2207 case DW_OP_breg31:
2208 dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
2209 break;
2210 case DW_OP_regx:
2212 unsigned r = val1->v.val_unsigned;
2213 if (for_eh_or_skip >= 0)
2214 r = DWARF2_FRAME_REG_OUT (r, for_eh_or_skip);
2215 gcc_assert (size_of_uleb128 (r)
2216 == size_of_uleb128 (val1->v.val_unsigned));
2217 dw2_asm_output_data_uleb128 (r, NULL);
2219 break;
2220 case DW_OP_fbreg:
2221 dw2_asm_output_data_sleb128 (val1->v.val_int, NULL);
2222 break;
2223 case DW_OP_bregx:
2225 unsigned r = val1->v.val_unsigned;
2226 if (for_eh_or_skip >= 0)
2227 r = DWARF2_FRAME_REG_OUT (r, for_eh_or_skip);
2228 gcc_assert (size_of_uleb128 (r)
2229 == size_of_uleb128 (val1->v.val_unsigned));
2230 dw2_asm_output_data_uleb128 (r, NULL);
2231 dw2_asm_output_data_sleb128 (val2->v.val_int, NULL);
2233 break;
2234 case DW_OP_piece:
2235 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2236 break;
2237 case DW_OP_bit_piece:
2238 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2239 dw2_asm_output_data_uleb128 (val2->v.val_unsigned, NULL);
2240 break;
2241 case DW_OP_deref_size:
2242 case DW_OP_xderef_size:
2243 dw2_asm_output_data (1, val1->v.val_int, NULL);
2244 break;
2246 case DW_OP_addr:
2247 if (loc->dtprel)
2249 if (targetm.asm_out.output_dwarf_dtprel)
2251 targetm.asm_out.output_dwarf_dtprel (asm_out_file,
2252 DWARF2_ADDR_SIZE,
2253 val1->v.val_addr);
2254 fputc ('\n', asm_out_file);
2256 else
2257 gcc_unreachable ();
2259 else
2261 #ifdef DWARF2_DEBUGGING_INFO
2262 dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, val1->v.val_addr, NULL);
2263 #else
2264 gcc_unreachable ();
2265 #endif
2267 break;
2269 case DW_OP_GNU_addr_index:
2270 case DW_OP_GNU_const_index:
2271 gcc_assert (loc->dw_loc_oprnd1.val_entry->index != NO_INDEX_ASSIGNED);
2272 dw2_asm_output_data_uleb128 (loc->dw_loc_oprnd1.val_entry->index,
2273 "(index into .debug_addr)");
2274 break;
2276 case DW_OP_call2:
2277 case DW_OP_call4:
2279 unsigned long die_offset
2280 = get_ref_die_offset (val1->v.val_die_ref.die);
2281 /* Make sure the offset has been computed and that we can encode it as
2282 an operand. */
2283 gcc_assert (die_offset > 0
2284 && die_offset <= (loc->dw_loc_opc == DW_OP_call2
2285 ? 0xffff
2286 : 0xffffffff));
2287 dw2_asm_output_data ((loc->dw_loc_opc == DW_OP_call2) ? 2 : 4,
2288 die_offset, NULL);
2290 break;
2292 case DW_OP_call_ref:
2293 case DW_OP_GNU_variable_value:
2295 char label[MAX_ARTIFICIAL_LABEL_BYTES
2296 + HOST_BITS_PER_WIDE_INT / 2 + 2];
2297 gcc_assert (val1->val_class == dw_val_class_die_ref);
2298 get_ref_die_offset_label (label, val1->v.val_die_ref.die);
2299 dw2_asm_output_offset (DWARF_REF_SIZE, label, debug_info_section, NULL);
2301 break;
2303 case DW_OP_implicit_pointer:
2304 case DW_OP_GNU_implicit_pointer:
2306 char label[MAX_ARTIFICIAL_LABEL_BYTES
2307 + HOST_BITS_PER_WIDE_INT / 2 + 2];
2308 gcc_assert (val1->val_class == dw_val_class_die_ref);
2309 get_ref_die_offset_label (label, val1->v.val_die_ref.die);
2310 dw2_asm_output_offset (DWARF_REF_SIZE, label, debug_info_section, NULL);
2311 dw2_asm_output_data_sleb128 (val2->v.val_int, NULL);
2313 break;
2315 case DW_OP_entry_value:
2316 case DW_OP_GNU_entry_value:
2317 dw2_asm_output_data_uleb128 (size_of_locs (val1->v.val_loc), NULL);
2318 output_loc_sequence (val1->v.val_loc, for_eh_or_skip);
2319 break;
2321 case DW_OP_const_type:
2322 case DW_OP_GNU_const_type:
2324 unsigned long o = get_base_type_offset (val1->v.val_die_ref.die), l;
2325 gcc_assert (o);
2326 dw2_asm_output_data_uleb128 (o, NULL);
2327 switch (val2->val_class)
2329 case dw_val_class_const:
2330 l = HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
2331 dw2_asm_output_data (1, l, NULL);
2332 dw2_asm_output_data (l, val2->v.val_int, NULL);
2333 break;
2334 case dw_val_class_vec:
2336 unsigned int elt_size = val2->v.val_vec.elt_size;
2337 unsigned int len = val2->v.val_vec.length;
2338 unsigned int i;
2339 unsigned char *p;
2341 l = len * elt_size;
2342 dw2_asm_output_data (1, l, NULL);
2343 if (elt_size > sizeof (HOST_WIDE_INT))
2345 elt_size /= 2;
2346 len *= 2;
2348 for (i = 0, p = (unsigned char *) val2->v.val_vec.array;
2349 i < len;
2350 i++, p += elt_size)
2351 dw2_asm_output_data (elt_size, extract_int (p, elt_size),
2352 "fp or vector constant word %u", i);
2354 break;
2355 case dw_val_class_const_double:
2357 unsigned HOST_WIDE_INT first, second;
2358 l = HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
2360 dw2_asm_output_data (1, 2 * l, NULL);
2361 if (WORDS_BIG_ENDIAN)
2363 first = val2->v.val_double.high;
2364 second = val2->v.val_double.low;
2366 else
2368 first = val2->v.val_double.low;
2369 second = val2->v.val_double.high;
2371 dw2_asm_output_data (l, first, NULL);
2372 dw2_asm_output_data (l, second, NULL);
2374 break;
2375 case dw_val_class_wide_int:
2377 int i;
2378 int len = get_full_len (*val2->v.val_wide);
2379 l = HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
2381 dw2_asm_output_data (1, len * l, NULL);
2382 if (WORDS_BIG_ENDIAN)
2383 for (i = len - 1; i >= 0; --i)
2384 dw2_asm_output_data (l, val2->v.val_wide->elt (i), NULL);
2385 else
2386 for (i = 0; i < len; ++i)
2387 dw2_asm_output_data (l, val2->v.val_wide->elt (i), NULL);
2389 break;
2390 default:
2391 gcc_unreachable ();
2394 break;
2395 case DW_OP_regval_type:
2396 case DW_OP_GNU_regval_type:
2398 unsigned r = val1->v.val_unsigned;
2399 unsigned long o = get_base_type_offset (val2->v.val_die_ref.die);
2400 gcc_assert (o);
2401 if (for_eh_or_skip >= 0)
2403 r = DWARF2_FRAME_REG_OUT (r, for_eh_or_skip);
2404 gcc_assert (size_of_uleb128 (r)
2405 == size_of_uleb128 (val1->v.val_unsigned));
2407 dw2_asm_output_data_uleb128 (r, NULL);
2408 dw2_asm_output_data_uleb128 (o, NULL);
2410 break;
2411 case DW_OP_deref_type:
2412 case DW_OP_GNU_deref_type:
2414 unsigned long o = get_base_type_offset (val2->v.val_die_ref.die);
2415 gcc_assert (o);
2416 dw2_asm_output_data (1, val1->v.val_int, NULL);
2417 dw2_asm_output_data_uleb128 (o, NULL);
2419 break;
2420 case DW_OP_convert:
2421 case DW_OP_reinterpret:
2422 case DW_OP_GNU_convert:
2423 case DW_OP_GNU_reinterpret:
2424 if (loc->dw_loc_oprnd1.val_class == dw_val_class_unsigned_const)
2425 dw2_asm_output_data_uleb128 (val1->v.val_unsigned, NULL);
2426 else
2428 unsigned long o = get_base_type_offset (val1->v.val_die_ref.die);
2429 gcc_assert (o);
2430 dw2_asm_output_data_uleb128 (o, NULL);
2432 break;
2434 case DW_OP_GNU_parameter_ref:
2436 unsigned long o;
2437 gcc_assert (val1->val_class == dw_val_class_die_ref);
2438 o = get_ref_die_offset (val1->v.val_die_ref.die);
2439 dw2_asm_output_data (4, o, NULL);
2441 break;
2443 default:
2444 /* Other codes have no operands. */
2445 break;
2449 /* Output a sequence of location operations.
2450 The for_eh_or_skip parameter controls whether register numbers are
2451 converted using DWARF2_FRAME_REG_OUT, which is needed in the case that
2452 hard reg numbers have been processed via DWARF_FRAME_REGNUM (i.e. for unwind
2453 info). This should be suppressed for the cases that have not been converted
2454 (i.e. symbolic debug info), by setting the parameter < 0. See PR47324. */
2456 void
2457 output_loc_sequence (dw_loc_descr_ref loc, int for_eh_or_skip)
2459 for (; loc != NULL; loc = loc->dw_loc_next)
2461 enum dwarf_location_atom opc = loc->dw_loc_opc;
2462 /* Output the opcode. */
2463 if (for_eh_or_skip >= 0
2464 && opc >= DW_OP_breg0 && opc <= DW_OP_breg31)
2466 unsigned r = (opc - DW_OP_breg0);
2467 r = DWARF2_FRAME_REG_OUT (r, for_eh_or_skip);
2468 gcc_assert (r <= 31);
2469 opc = (enum dwarf_location_atom) (DW_OP_breg0 + r);
2471 else if (for_eh_or_skip >= 0
2472 && opc >= DW_OP_reg0 && opc <= DW_OP_reg31)
2474 unsigned r = (opc - DW_OP_reg0);
2475 r = DWARF2_FRAME_REG_OUT (r, for_eh_or_skip);
2476 gcc_assert (r <= 31);
2477 opc = (enum dwarf_location_atom) (DW_OP_reg0 + r);
2480 dw2_asm_output_data (1, opc,
2481 "%s", dwarf_stack_op_name (opc));
2483 /* Output the operand(s) (if any). */
2484 output_loc_operands (loc, for_eh_or_skip);
2488 /* Output location description stack opcode's operands (if any).
2489 The output is single bytes on a line, suitable for .cfi_escape. */
2491 static void
2492 output_loc_operands_raw (dw_loc_descr_ref loc)
2494 dw_val_ref val1 = &loc->dw_loc_oprnd1;
2495 dw_val_ref val2 = &loc->dw_loc_oprnd2;
2497 switch (loc->dw_loc_opc)
2499 case DW_OP_addr:
2500 case DW_OP_GNU_addr_index:
2501 case DW_OP_GNU_const_index:
2502 case DW_OP_implicit_value:
2503 /* We cannot output addresses in .cfi_escape, only bytes. */
2504 gcc_unreachable ();
2506 case DW_OP_const1u:
2507 case DW_OP_const1s:
2508 case DW_OP_pick:
2509 case DW_OP_deref_size:
2510 case DW_OP_xderef_size:
2511 fputc (',', asm_out_file);
2512 dw2_asm_output_data_raw (1, val1->v.val_int);
2513 break;
2515 case DW_OP_const2u:
2516 case DW_OP_const2s:
2517 fputc (',', asm_out_file);
2518 dw2_asm_output_data_raw (2, val1->v.val_int);
2519 break;
2521 case DW_OP_const4u:
2522 case DW_OP_const4s:
2523 fputc (',', asm_out_file);
2524 dw2_asm_output_data_raw (4, val1->v.val_int);
2525 break;
2527 case DW_OP_const8u:
2528 case DW_OP_const8s:
2529 gcc_assert (HOST_BITS_PER_WIDE_INT >= 64);
2530 fputc (',', asm_out_file);
2531 dw2_asm_output_data_raw (8, val1->v.val_int);
2532 break;
2534 case DW_OP_skip:
2535 case DW_OP_bra:
2537 int offset;
2539 gcc_assert (val1->val_class == dw_val_class_loc);
2540 offset = val1->v.val_loc->dw_loc_addr - (loc->dw_loc_addr + 3);
2542 fputc (',', asm_out_file);
2543 dw2_asm_output_data_raw (2, offset);
2545 break;
2547 case DW_OP_regx:
2549 unsigned r = DWARF2_FRAME_REG_OUT (val1->v.val_unsigned, 1);
2550 gcc_assert (size_of_uleb128 (r)
2551 == size_of_uleb128 (val1->v.val_unsigned));
2552 fputc (',', asm_out_file);
2553 dw2_asm_output_data_uleb128_raw (r);
2555 break;
2557 case DW_OP_constu:
2558 case DW_OP_plus_uconst:
2559 case DW_OP_piece:
2560 fputc (',', asm_out_file);
2561 dw2_asm_output_data_uleb128_raw (val1->v.val_unsigned);
2562 break;
2564 case DW_OP_bit_piece:
2565 fputc (',', asm_out_file);
2566 dw2_asm_output_data_uleb128_raw (val1->v.val_unsigned);
2567 dw2_asm_output_data_uleb128_raw (val2->v.val_unsigned);
2568 break;
2570 case DW_OP_consts:
2571 case DW_OP_breg0:
2572 case DW_OP_breg1:
2573 case DW_OP_breg2:
2574 case DW_OP_breg3:
2575 case DW_OP_breg4:
2576 case DW_OP_breg5:
2577 case DW_OP_breg6:
2578 case DW_OP_breg7:
2579 case DW_OP_breg8:
2580 case DW_OP_breg9:
2581 case DW_OP_breg10:
2582 case DW_OP_breg11:
2583 case DW_OP_breg12:
2584 case DW_OP_breg13:
2585 case DW_OP_breg14:
2586 case DW_OP_breg15:
2587 case DW_OP_breg16:
2588 case DW_OP_breg17:
2589 case DW_OP_breg18:
2590 case DW_OP_breg19:
2591 case DW_OP_breg20:
2592 case DW_OP_breg21:
2593 case DW_OP_breg22:
2594 case DW_OP_breg23:
2595 case DW_OP_breg24:
2596 case DW_OP_breg25:
2597 case DW_OP_breg26:
2598 case DW_OP_breg27:
2599 case DW_OP_breg28:
2600 case DW_OP_breg29:
2601 case DW_OP_breg30:
2602 case DW_OP_breg31:
2603 case DW_OP_fbreg:
2604 fputc (',', asm_out_file);
2605 dw2_asm_output_data_sleb128_raw (val1->v.val_int);
2606 break;
2608 case DW_OP_bregx:
2610 unsigned r = DWARF2_FRAME_REG_OUT (val1->v.val_unsigned, 1);
2611 gcc_assert (size_of_uleb128 (r)
2612 == size_of_uleb128 (val1->v.val_unsigned));
2613 fputc (',', asm_out_file);
2614 dw2_asm_output_data_uleb128_raw (r);
2615 fputc (',', asm_out_file);
2616 dw2_asm_output_data_sleb128_raw (val2->v.val_int);
2618 break;
2620 case DW_OP_implicit_pointer:
2621 case DW_OP_entry_value:
2622 case DW_OP_const_type:
2623 case DW_OP_regval_type:
2624 case DW_OP_deref_type:
2625 case DW_OP_convert:
2626 case DW_OP_reinterpret:
2627 case DW_OP_GNU_implicit_pointer:
2628 case DW_OP_GNU_entry_value:
2629 case DW_OP_GNU_const_type:
2630 case DW_OP_GNU_regval_type:
2631 case DW_OP_GNU_deref_type:
2632 case DW_OP_GNU_convert:
2633 case DW_OP_GNU_reinterpret:
2634 case DW_OP_GNU_parameter_ref:
2635 gcc_unreachable ();
2636 break;
2638 default:
2639 /* Other codes have no operands. */
2640 break;
2644 void
2645 output_loc_sequence_raw (dw_loc_descr_ref loc)
2647 while (1)
2649 enum dwarf_location_atom opc = loc->dw_loc_opc;
2650 /* Output the opcode. */
2651 if (opc >= DW_OP_breg0 && opc <= DW_OP_breg31)
2653 unsigned r = (opc - DW_OP_breg0);
2654 r = DWARF2_FRAME_REG_OUT (r, 1);
2655 gcc_assert (r <= 31);
2656 opc = (enum dwarf_location_atom) (DW_OP_breg0 + r);
2658 else if (opc >= DW_OP_reg0 && opc <= DW_OP_reg31)
2660 unsigned r = (opc - DW_OP_reg0);
2661 r = DWARF2_FRAME_REG_OUT (r, 1);
2662 gcc_assert (r <= 31);
2663 opc = (enum dwarf_location_atom) (DW_OP_reg0 + r);
2665 /* Output the opcode. */
2666 fprintf (asm_out_file, "%#x", opc);
2667 output_loc_operands_raw (loc);
2669 if (!loc->dw_loc_next)
2670 break;
2671 loc = loc->dw_loc_next;
2673 fputc (',', asm_out_file);
2677 /* This function builds a dwarf location descriptor sequence from a
2678 dw_cfa_location, adding the given OFFSET to the result of the
2679 expression. */
2681 struct dw_loc_descr_node *
2682 build_cfa_loc (dw_cfa_location *cfa, poly_int64 offset)
2684 struct dw_loc_descr_node *head, *tmp;
2686 offset += cfa->offset;
2688 if (cfa->indirect)
2690 head = new_reg_loc_descr (cfa->reg, cfa->base_offset);
2691 head->dw_loc_oprnd1.val_class = dw_val_class_const;
2692 head->dw_loc_oprnd1.val_entry = NULL;
2693 tmp = new_loc_descr (DW_OP_deref, 0, 0);
2694 add_loc_descr (&head, tmp);
2695 loc_descr_plus_const (&head, offset);
2697 else
2698 head = new_reg_loc_descr (cfa->reg, offset);
2700 return head;
2703 /* This function builds a dwarf location descriptor sequence for
2704 the address at OFFSET from the CFA when stack is aligned to
2705 ALIGNMENT byte. */
2707 struct dw_loc_descr_node *
2708 build_cfa_aligned_loc (dw_cfa_location *cfa,
2709 poly_int64 offset, HOST_WIDE_INT alignment)
2711 struct dw_loc_descr_node *head;
2712 unsigned int dwarf_fp
2713 = DWARF_FRAME_REGNUM (HARD_FRAME_POINTER_REGNUM);
2715 /* When CFA is defined as FP+OFFSET, emulate stack alignment. */
2716 if (cfa->reg == HARD_FRAME_POINTER_REGNUM && cfa->indirect == 0)
2718 head = new_reg_loc_descr (dwarf_fp, 0);
2719 add_loc_descr (&head, int_loc_descriptor (alignment));
2720 add_loc_descr (&head, new_loc_descr (DW_OP_and, 0, 0));
2721 loc_descr_plus_const (&head, offset);
2723 else
2724 head = new_reg_loc_descr (dwarf_fp, offset);
2725 return head;
2728 /* And now, the support for symbolic debugging information. */
2730 /* .debug_str support. */
2732 static void dwarf2out_init (const char *);
2733 static void dwarf2out_finish (const char *);
2734 static void dwarf2out_early_finish (const char *);
2735 static void dwarf2out_assembly_start (void);
2736 static void dwarf2out_define (unsigned int, const char *);
2737 static void dwarf2out_undef (unsigned int, const char *);
2738 static void dwarf2out_start_source_file (unsigned, const char *);
2739 static void dwarf2out_end_source_file (unsigned);
2740 static void dwarf2out_function_decl (tree);
2741 static void dwarf2out_begin_block (unsigned, unsigned);
2742 static void dwarf2out_end_block (unsigned, unsigned);
2743 static bool dwarf2out_ignore_block (const_tree);
2744 static void dwarf2out_early_global_decl (tree);
2745 static void dwarf2out_late_global_decl (tree);
2746 static void dwarf2out_type_decl (tree, int);
2747 static void dwarf2out_imported_module_or_decl (tree, tree, tree, bool, bool);
2748 static void dwarf2out_imported_module_or_decl_1 (tree, tree, tree,
2749 dw_die_ref);
2750 static void dwarf2out_abstract_function (tree);
2751 static void dwarf2out_var_location (rtx_insn *);
2752 static void dwarf2out_inline_entry (tree);
2753 static void dwarf2out_size_function (tree);
2754 static void dwarf2out_begin_function (tree);
2755 static void dwarf2out_end_function (unsigned int);
2756 static void dwarf2out_register_main_translation_unit (tree unit);
2757 static void dwarf2out_set_name (tree, tree);
2758 static void dwarf2out_register_external_die (tree decl, const char *sym,
2759 unsigned HOST_WIDE_INT off);
2760 static bool dwarf2out_die_ref_for_decl (tree decl, const char **sym,
2761 unsigned HOST_WIDE_INT *off);
2763 /* The debug hooks structure. */
2765 const struct gcc_debug_hooks dwarf2_debug_hooks =
2767 dwarf2out_init,
2768 dwarf2out_finish,
2769 dwarf2out_early_finish,
2770 dwarf2out_assembly_start,
2771 dwarf2out_define,
2772 dwarf2out_undef,
2773 dwarf2out_start_source_file,
2774 dwarf2out_end_source_file,
2775 dwarf2out_begin_block,
2776 dwarf2out_end_block,
2777 dwarf2out_ignore_block,
2778 dwarf2out_source_line,
2779 dwarf2out_begin_prologue,
2780 #if VMS_DEBUGGING_INFO
2781 dwarf2out_vms_end_prologue,
2782 dwarf2out_vms_begin_epilogue,
2783 #else
2784 debug_nothing_int_charstar,
2785 debug_nothing_int_charstar,
2786 #endif
2787 dwarf2out_end_epilogue,
2788 dwarf2out_begin_function,
2789 dwarf2out_end_function, /* end_function */
2790 dwarf2out_register_main_translation_unit,
2791 dwarf2out_function_decl, /* function_decl */
2792 dwarf2out_early_global_decl,
2793 dwarf2out_late_global_decl,
2794 dwarf2out_type_decl, /* type_decl */
2795 dwarf2out_imported_module_or_decl,
2796 dwarf2out_die_ref_for_decl,
2797 dwarf2out_register_external_die,
2798 debug_nothing_tree, /* deferred_inline_function */
2799 /* The DWARF 2 backend tries to reduce debugging bloat by not
2800 emitting the abstract description of inline functions until
2801 something tries to reference them. */
2802 dwarf2out_abstract_function, /* outlining_inline_function */
2803 debug_nothing_rtx_code_label, /* label */
2804 debug_nothing_int, /* handle_pch */
2805 dwarf2out_var_location,
2806 dwarf2out_inline_entry, /* inline_entry */
2807 dwarf2out_size_function, /* size_function */
2808 dwarf2out_switch_text_section,
2809 dwarf2out_set_name,
2810 1, /* start_end_main_source_file */
2811 TYPE_SYMTAB_IS_DIE /* tree_type_symtab_field */
2814 const struct gcc_debug_hooks dwarf2_lineno_debug_hooks =
2816 dwarf2out_init,
2817 debug_nothing_charstar,
2818 debug_nothing_charstar,
2819 dwarf2out_assembly_start,
2820 debug_nothing_int_charstar,
2821 debug_nothing_int_charstar,
2822 debug_nothing_int_charstar,
2823 debug_nothing_int,
2824 debug_nothing_int_int, /* begin_block */
2825 debug_nothing_int_int, /* end_block */
2826 debug_true_const_tree, /* ignore_block */
2827 dwarf2out_source_line, /* source_line */
2828 debug_nothing_int_int_charstar, /* begin_prologue */
2829 debug_nothing_int_charstar, /* end_prologue */
2830 debug_nothing_int_charstar, /* begin_epilogue */
2831 debug_nothing_int_charstar, /* end_epilogue */
2832 debug_nothing_tree, /* begin_function */
2833 debug_nothing_int, /* end_function */
2834 debug_nothing_tree, /* register_main_translation_unit */
2835 debug_nothing_tree, /* function_decl */
2836 debug_nothing_tree, /* early_global_decl */
2837 debug_nothing_tree, /* late_global_decl */
2838 debug_nothing_tree_int, /* type_decl */
2839 debug_nothing_tree_tree_tree_bool_bool,/* imported_module_or_decl */
2840 debug_false_tree_charstarstar_uhwistar,/* die_ref_for_decl */
2841 debug_nothing_tree_charstar_uhwi, /* register_external_die */
2842 debug_nothing_tree, /* deferred_inline_function */
2843 debug_nothing_tree, /* outlining_inline_function */
2844 debug_nothing_rtx_code_label, /* label */
2845 debug_nothing_int, /* handle_pch */
2846 debug_nothing_rtx_insn, /* var_location */
2847 debug_nothing_tree, /* inline_entry */
2848 debug_nothing_tree, /* size_function */
2849 debug_nothing_void, /* switch_text_section */
2850 debug_nothing_tree_tree, /* set_name */
2851 0, /* start_end_main_source_file */
2852 TYPE_SYMTAB_IS_ADDRESS /* tree_type_symtab_field */
2855 /* NOTE: In the comments in this file, many references are made to
2856 "Debugging Information Entries". This term is abbreviated as `DIE'
2857 throughout the remainder of this file. */
2859 /* An internal representation of the DWARF output is built, and then
2860 walked to generate the DWARF debugging info. The walk of the internal
2861 representation is done after the entire program has been compiled.
2862 The types below are used to describe the internal representation. */
2864 /* Whether to put type DIEs into their own section .debug_types instead
2865 of making them part of the .debug_info section. Only supported for
2866 Dwarf V4 or higher and the user didn't disable them through
2867 -fno-debug-types-section. It is more efficient to put them in a
2868 separate comdat sections since the linker will then be able to
2869 remove duplicates. But not all tools support .debug_types sections
2870 yet. For Dwarf V5 or higher .debug_types doesn't exist any more,
2871 it is DW_UT_type unit type in .debug_info section. */
2873 #define use_debug_types (dwarf_version >= 4 && flag_debug_types_section)
2875 /* Various DIE's use offsets relative to the beginning of the
2876 .debug_info section to refer to each other. */
2878 typedef long int dw_offset;
2880 struct comdat_type_node;
2882 /* The entries in the line_info table more-or-less mirror the opcodes
2883 that are used in the real dwarf line table. Arrays of these entries
2884 are collected per section when DWARF2_ASM_LINE_DEBUG_INFO is not
2885 supported. */
2887 enum dw_line_info_opcode {
2888 /* Emit DW_LNE_set_address; the operand is the label index. */
2889 LI_set_address,
2891 /* Emit a row to the matrix with the given line. This may be done
2892 via any combination of DW_LNS_copy, DW_LNS_advance_line, and
2893 special opcodes. */
2894 LI_set_line,
2896 /* Emit a DW_LNS_set_file. */
2897 LI_set_file,
2899 /* Emit a DW_LNS_set_column. */
2900 LI_set_column,
2902 /* Emit a DW_LNS_negate_stmt; the operand is ignored. */
2903 LI_negate_stmt,
2905 /* Emit a DW_LNS_set_prologue_end/epilogue_begin; the operand is ignored. */
2906 LI_set_prologue_end,
2907 LI_set_epilogue_begin,
2909 /* Emit a DW_LNE_set_discriminator. */
2910 LI_set_discriminator,
2912 /* Output a Fixed Advance PC; the target PC is the label index; the
2913 base PC is the previous LI_adv_address or LI_set_address entry.
2914 We only use this when emitting debug views without assembler
2915 support, at explicit user request. Ideally, we should only use
2916 it when the offset might be zero but we can't tell: it's the only
2917 way to maybe change the PC without resetting the view number. */
2918 LI_adv_address
2921 typedef struct GTY(()) dw_line_info_struct {
2922 enum dw_line_info_opcode opcode;
2923 unsigned int val;
2924 } dw_line_info_entry;
2927 struct GTY(()) dw_line_info_table {
2928 /* The label that marks the end of this section. */
2929 const char *end_label;
2931 /* The values for the last row of the matrix, as collected in the table.
2932 These are used to minimize the changes to the next row. */
2933 unsigned int file_num;
2934 unsigned int line_num;
2935 unsigned int column_num;
2936 int discrim_num;
2937 bool is_stmt;
2938 bool in_use;
2940 /* This denotes the NEXT view number.
2942 If it is 0, it is known that the NEXT view will be the first view
2943 at the given PC.
2945 If it is -1, we're forcing the view number to be reset, e.g. at a
2946 function entry.
2948 The meaning of other nonzero values depends on whether we're
2949 computing views internally or leaving it for the assembler to do
2950 so. If we're emitting them internally, view denotes the view
2951 number since the last known advance of PC. If we're leaving it
2952 for the assembler, it denotes the LVU label number that we're
2953 going to ask the assembler to assign. */
2954 var_loc_view view;
2956 /* This counts the number of symbolic views emitted in this table
2957 since the latest view reset. Its max value, over all tables,
2958 sets symview_upper_bound. */
2959 var_loc_view symviews_since_reset;
2961 #define FORCE_RESET_NEXT_VIEW(x) ((x) = (var_loc_view)-1)
2962 #define RESET_NEXT_VIEW(x) ((x) = (var_loc_view)0)
2963 #define FORCE_RESETTING_VIEW_P(x) ((x) == (var_loc_view)-1)
2964 #define RESETTING_VIEW_P(x) ((x) == (var_loc_view)0 || FORCE_RESETTING_VIEW_P (x))
2966 vec<dw_line_info_entry, va_gc> *entries;
2969 /* This is an upper bound for view numbers that the assembler may
2970 assign to symbolic views output in this translation. It is used to
2971 decide how big a field to use to represent view numbers in
2972 symview-classed attributes. */
2974 static var_loc_view symview_upper_bound;
2976 /* If we're keep track of location views and their reset points, and
2977 INSN is a reset point (i.e., it necessarily advances the PC), mark
2978 the next view in TABLE as reset. */
2980 static void
2981 maybe_reset_location_view (rtx_insn *insn, dw_line_info_table *table)
2983 if (!debug_internal_reset_location_views)
2984 return;
2986 /* Maybe turn (part of?) this test into a default target hook. */
2987 int reset = 0;
2989 if (targetm.reset_location_view)
2990 reset = targetm.reset_location_view (insn);
2992 if (reset)
2994 else if (JUMP_TABLE_DATA_P (insn))
2995 reset = 1;
2996 else if (GET_CODE (insn) == USE
2997 || GET_CODE (insn) == CLOBBER
2998 || GET_CODE (insn) == ASM_INPUT
2999 || asm_noperands (insn) >= 0)
3001 else if (get_attr_min_length (insn) > 0)
3002 reset = 1;
3004 if (reset > 0 && !RESETTING_VIEW_P (table->view))
3005 RESET_NEXT_VIEW (table->view);
3008 /* Each DIE attribute has a field specifying the attribute kind,
3009 a link to the next attribute in the chain, and an attribute value.
3010 Attributes are typically linked below the DIE they modify. */
3012 typedef struct GTY(()) dw_attr_struct {
3013 enum dwarf_attribute dw_attr;
3014 dw_val_node dw_attr_val;
3016 dw_attr_node;
3019 /* The Debugging Information Entry (DIE) structure. DIEs form a tree.
3020 The children of each node form a circular list linked by
3021 die_sib. die_child points to the node *before* the "first" child node. */
3023 typedef struct GTY((chain_circular ("%h.die_sib"), for_user)) die_struct {
3024 union die_symbol_or_type_node
3026 const char * GTY ((tag ("0"))) die_symbol;
3027 comdat_type_node *GTY ((tag ("1"))) die_type_node;
3029 GTY ((desc ("%0.comdat_type_p"))) die_id;
3030 vec<dw_attr_node, va_gc> *die_attr;
3031 dw_die_ref die_parent;
3032 dw_die_ref die_child;
3033 dw_die_ref die_sib;
3034 dw_die_ref die_definition; /* ref from a specification to its definition */
3035 dw_offset die_offset;
3036 unsigned long die_abbrev;
3037 int die_mark;
3038 unsigned int decl_id;
3039 enum dwarf_tag die_tag;
3040 /* Die is used and must not be pruned as unused. */
3041 BOOL_BITFIELD die_perennial_p : 1;
3042 BOOL_BITFIELD comdat_type_p : 1; /* DIE has a type signature */
3043 /* For an external ref to die_symbol if die_offset contains an extra
3044 offset to that symbol. */
3045 BOOL_BITFIELD with_offset : 1;
3046 /* Whether this DIE was removed from the DIE tree, for example via
3047 prune_unused_types. We don't consider those present from the
3048 DIE lookup routines. */
3049 BOOL_BITFIELD removed : 1;
3050 /* Lots of spare bits. */
3052 die_node;
3054 /* Set to TRUE while dwarf2out_early_global_decl is running. */
3055 static bool early_dwarf;
3056 static bool early_dwarf_finished;
3057 struct set_early_dwarf {
3058 bool saved;
3059 set_early_dwarf () : saved(early_dwarf)
3061 gcc_assert (! early_dwarf_finished);
3062 early_dwarf = true;
3064 ~set_early_dwarf () { early_dwarf = saved; }
3067 /* Evaluate 'expr' while 'c' is set to each child of DIE in order. */
3068 #define FOR_EACH_CHILD(die, c, expr) do { \
3069 c = die->die_child; \
3070 if (c) do { \
3071 c = c->die_sib; \
3072 expr; \
3073 } while (c != die->die_child); \
3074 } while (0)
3076 /* The pubname structure */
3078 typedef struct GTY(()) pubname_struct {
3079 dw_die_ref die;
3080 const char *name;
3082 pubname_entry;
3085 struct GTY(()) dw_ranges {
3086 const char *label;
3087 /* If this is positive, it's a block number, otherwise it's a
3088 bitwise-negated index into dw_ranges_by_label. */
3089 int num;
3090 /* Index for the range list for DW_FORM_rnglistx. */
3091 unsigned int idx : 31;
3092 /* True if this range might be possibly in a different section
3093 from previous entry. */
3094 unsigned int maybe_new_sec : 1;
3097 /* A structure to hold a macinfo entry. */
3099 typedef struct GTY(()) macinfo_struct {
3100 unsigned char code;
3101 unsigned HOST_WIDE_INT lineno;
3102 const char *info;
3104 macinfo_entry;
3107 struct GTY(()) dw_ranges_by_label {
3108 const char *begin;
3109 const char *end;
3112 /* The comdat type node structure. */
3113 struct GTY(()) comdat_type_node
3115 dw_die_ref root_die;
3116 dw_die_ref type_die;
3117 dw_die_ref skeleton_die;
3118 char signature[DWARF_TYPE_SIGNATURE_SIZE];
3119 comdat_type_node *next;
3122 /* A list of DIEs for which we can't determine ancestry (parent_die
3123 field) just yet. Later in dwarf2out_finish we will fill in the
3124 missing bits. */
3125 typedef struct GTY(()) limbo_die_struct {
3126 dw_die_ref die;
3127 /* The tree for which this DIE was created. We use this to
3128 determine ancestry later. */
3129 tree created_for;
3130 struct limbo_die_struct *next;
3132 limbo_die_node;
3134 typedef struct skeleton_chain_struct
3136 dw_die_ref old_die;
3137 dw_die_ref new_die;
3138 struct skeleton_chain_struct *parent;
3140 skeleton_chain_node;
3142 /* Define a macro which returns nonzero for a TYPE_DECL which was
3143 implicitly generated for a type.
3145 Note that, unlike the C front-end (which generates a NULL named
3146 TYPE_DECL node for each complete tagged type, each array type,
3147 and each function type node created) the C++ front-end generates
3148 a _named_ TYPE_DECL node for each tagged type node created.
3149 These TYPE_DECLs have DECL_ARTIFICIAL set, so we know not to
3150 generate a DW_TAG_typedef DIE for them. Likewise with the Ada
3151 front-end, but for each type, tagged or not. */
3153 #define TYPE_DECL_IS_STUB(decl) \
3154 (DECL_NAME (decl) == NULL_TREE \
3155 || (DECL_ARTIFICIAL (decl) \
3156 && ((decl == TYPE_STUB_DECL (TREE_TYPE (decl))) \
3157 /* This is necessary for stub decls that \
3158 appear in nested inline functions. */ \
3159 || (DECL_ABSTRACT_ORIGIN (decl) != NULL_TREE \
3160 && (decl_ultimate_origin (decl) \
3161 == TYPE_STUB_DECL (TREE_TYPE (decl)))))))
3163 /* Information concerning the compilation unit's programming
3164 language, and compiler version. */
3166 /* Fixed size portion of the DWARF compilation unit header. */
3167 #define DWARF_COMPILE_UNIT_HEADER_SIZE \
3168 (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE \
3169 + (dwarf_version >= 5 ? 4 : 3))
3171 /* Fixed size portion of the DWARF comdat type unit header. */
3172 #define DWARF_COMDAT_TYPE_UNIT_HEADER_SIZE \
3173 (DWARF_COMPILE_UNIT_HEADER_SIZE \
3174 + DWARF_TYPE_SIGNATURE_SIZE + DWARF_OFFSET_SIZE)
3176 /* Fixed size portion of the DWARF skeleton compilation unit header. */
3177 #define DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE \
3178 (DWARF_COMPILE_UNIT_HEADER_SIZE + (dwarf_version >= 5 ? 8 : 0))
3180 /* Fixed size portion of public names info. */
3181 #define DWARF_PUBNAMES_HEADER_SIZE (2 * DWARF_OFFSET_SIZE + 2)
3183 /* Fixed size portion of the address range info. */
3184 #define DWARF_ARANGES_HEADER_SIZE \
3185 (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \
3186 DWARF2_ADDR_SIZE * 2) \
3187 - DWARF_INITIAL_LENGTH_SIZE)
3189 /* Size of padding portion in the address range info. It must be
3190 aligned to twice the pointer size. */
3191 #define DWARF_ARANGES_PAD_SIZE \
3192 (DWARF_ROUND (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4, \
3193 DWARF2_ADDR_SIZE * 2) \
3194 - (DWARF_INITIAL_LENGTH_SIZE + DWARF_OFFSET_SIZE + 4))
3196 /* Use assembler line directives if available. */
3197 #ifndef DWARF2_ASM_LINE_DEBUG_INFO
3198 #ifdef HAVE_AS_DWARF2_DEBUG_LINE
3199 #define DWARF2_ASM_LINE_DEBUG_INFO 1
3200 #else
3201 #define DWARF2_ASM_LINE_DEBUG_INFO 0
3202 #endif
3203 #endif
3205 /* Use assembler views in line directives if available. */
3206 #ifndef DWARF2_ASM_VIEW_DEBUG_INFO
3207 #ifdef HAVE_AS_DWARF2_DEBUG_VIEW
3208 #define DWARF2_ASM_VIEW_DEBUG_INFO 1
3209 #else
3210 #define DWARF2_ASM_VIEW_DEBUG_INFO 0
3211 #endif
3212 #endif
3214 /* Return true if GCC configure detected assembler support for .loc. */
3216 bool
3217 dwarf2out_default_as_loc_support (void)
3219 return DWARF2_ASM_LINE_DEBUG_INFO;
3220 #if (GCC_VERSION >= 3000)
3221 # undef DWARF2_ASM_LINE_DEBUG_INFO
3222 # pragma GCC poison DWARF2_ASM_LINE_DEBUG_INFO
3223 #endif
3226 /* Return true if GCC configure detected assembler support for views
3227 in .loc directives. */
3229 bool
3230 dwarf2out_default_as_locview_support (void)
3232 return DWARF2_ASM_VIEW_DEBUG_INFO;
3233 #if (GCC_VERSION >= 3000)
3234 # undef DWARF2_ASM_VIEW_DEBUG_INFO
3235 # pragma GCC poison DWARF2_ASM_VIEW_DEBUG_INFO
3236 #endif
3239 /* A bit is set in ZERO_VIEW_P if we are using the assembler-supported
3240 view computation, and it refers to a view identifier for which we
3241 will not emit a label because it is known to map to a view number
3242 zero. We won't allocate the bitmap if we're not using assembler
3243 support for location views, but we have to make the variable
3244 visible for GGC and for code that will be optimized out for lack of
3245 support but that's still parsed and compiled. We could abstract it
3246 out with macros, but it's not worth it. */
3247 static GTY(()) bitmap zero_view_p;
3249 /* Evaluate to TRUE iff N is known to identify the first location view
3250 at its PC. When not using assembler location view computation,
3251 that must be view number zero. Otherwise, ZERO_VIEW_P is allocated
3252 and views label numbers recorded in it are the ones known to be
3253 zero. */
3254 #define ZERO_VIEW_P(N) ((N) == (var_loc_view)0 \
3255 || (N) == (var_loc_view)-1 \
3256 || (zero_view_p \
3257 && bitmap_bit_p (zero_view_p, (N))))
3259 /* Return true iff we're to emit .loc directives for the assembler to
3260 generate line number sections.
3262 When we're not emitting views, all we need from the assembler is
3263 support for .loc directives.
3265 If we are emitting views, we can only use the assembler's .loc
3266 support if it also supports views.
3268 When the compiler is emitting the line number programs and
3269 computing view numbers itself, it resets view numbers at known PC
3270 changes and counts from that, and then it emits view numbers as
3271 literal constants in locviewlists. There are cases in which the
3272 compiler is not sure about PC changes, e.g. when extra alignment is
3273 requested for a label. In these cases, the compiler may not reset
3274 the view counter, and the potential PC advance in the line number
3275 program will use an opcode that does not reset the view counter
3276 even if the PC actually changes, so that compiler and debug info
3277 consumer can keep view numbers in sync.
3279 When the compiler defers view computation to the assembler, it
3280 emits symbolic view numbers in locviewlists, with the exception of
3281 views known to be zero (forced resets, or reset after
3282 compiler-visible PC changes): instead of emitting symbols for
3283 these, we emit literal zero and assert the assembler agrees with
3284 the compiler's assessment. We could use symbolic views everywhere,
3285 instead of special-casing zero views, but then we'd be unable to
3286 optimize out locviewlists that contain only zeros. */
3288 static bool
3289 output_asm_line_debug_info (void)
3291 return (dwarf2out_as_loc_support
3292 && (dwarf2out_as_locview_support
3293 || !debug_variable_location_views));
3296 /* Minimum line offset in a special line info. opcode.
3297 This value was chosen to give a reasonable range of values. */
3298 #define DWARF_LINE_BASE -10
3300 /* First special line opcode - leave room for the standard opcodes. */
3301 #define DWARF_LINE_OPCODE_BASE ((int)DW_LNS_set_isa + 1)
3303 /* Range of line offsets in a special line info. opcode. */
3304 #define DWARF_LINE_RANGE (254-DWARF_LINE_OPCODE_BASE+1)
3306 /* Flag that indicates the initial value of the is_stmt_start flag.
3307 In the present implementation, we do not mark any lines as
3308 the beginning of a source statement, because that information
3309 is not made available by the GCC front-end. */
3310 #define DWARF_LINE_DEFAULT_IS_STMT_START 1
3312 /* Maximum number of operations per instruction bundle. */
3313 #ifndef DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN
3314 #define DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN 1
3315 #endif
3317 /* This location is used by calc_die_sizes() to keep track
3318 the offset of each DIE within the .debug_info section. */
3319 static unsigned long next_die_offset;
3321 /* Record the root of the DIE's built for the current compilation unit. */
3322 static GTY(()) dw_die_ref single_comp_unit_die;
3324 /* A list of type DIEs that have been separated into comdat sections. */
3325 static GTY(()) comdat_type_node *comdat_type_list;
3327 /* A list of CU DIEs that have been separated. */
3328 static GTY(()) limbo_die_node *cu_die_list;
3330 /* A list of DIEs with a NULL parent waiting to be relocated. */
3331 static GTY(()) limbo_die_node *limbo_die_list;
3333 /* A list of DIEs for which we may have to generate
3334 DW_AT_{,MIPS_}linkage_name once their DECL_ASSEMBLER_NAMEs are set. */
3335 static GTY(()) limbo_die_node *deferred_asm_name;
3337 struct dwarf_file_hasher : ggc_ptr_hash<dwarf_file_data>
3339 typedef const char *compare_type;
3341 static hashval_t hash (dwarf_file_data *);
3342 static bool equal (dwarf_file_data *, const char *);
3345 /* Filenames referenced by this compilation unit. */
3346 static GTY(()) hash_table<dwarf_file_hasher> *file_table;
3348 struct decl_die_hasher : ggc_ptr_hash<die_node>
3350 typedef tree compare_type;
3352 static hashval_t hash (die_node *);
3353 static bool equal (die_node *, tree);
3355 /* A hash table of references to DIE's that describe declarations.
3356 The key is a DECL_UID() which is a unique number identifying each decl. */
3357 static GTY (()) hash_table<decl_die_hasher> *decl_die_table;
3359 struct GTY ((for_user)) variable_value_struct {
3360 unsigned int decl_id;
3361 vec<dw_die_ref, va_gc> *dies;
3364 struct variable_value_hasher : ggc_ptr_hash<variable_value_struct>
3366 typedef tree compare_type;
3368 static hashval_t hash (variable_value_struct *);
3369 static bool equal (variable_value_struct *, tree);
3371 /* A hash table of DIEs that contain DW_OP_GNU_variable_value with
3372 dw_val_class_decl_ref class, indexed by FUNCTION_DECLs which is
3373 DECL_CONTEXT of the referenced VAR_DECLs. */
3374 static GTY (()) hash_table<variable_value_hasher> *variable_value_hash;
3376 struct block_die_hasher : ggc_ptr_hash<die_struct>
3378 static hashval_t hash (die_struct *);
3379 static bool equal (die_struct *, die_struct *);
3382 /* A hash table of references to DIE's that describe COMMON blocks.
3383 The key is DECL_UID() ^ die_parent. */
3384 static GTY (()) hash_table<block_die_hasher> *common_block_die_table;
3386 typedef struct GTY(()) die_arg_entry_struct {
3387 dw_die_ref die;
3388 tree arg;
3389 } die_arg_entry;
3392 /* Node of the variable location list. */
3393 struct GTY ((chain_next ("%h.next"))) var_loc_node {
3394 /* Either NOTE_INSN_VAR_LOCATION, or, for SRA optimized variables,
3395 EXPR_LIST chain. For small bitsizes, bitsize is encoded
3396 in mode of the EXPR_LIST node and first EXPR_LIST operand
3397 is either NOTE_INSN_VAR_LOCATION for a piece with a known
3398 location or NULL for padding. For larger bitsizes,
3399 mode is 0 and first operand is a CONCAT with bitsize
3400 as first CONCAT operand and NOTE_INSN_VAR_LOCATION resp.
3401 NULL as second operand. */
3402 rtx GTY (()) loc;
3403 const char * GTY (()) label;
3404 struct var_loc_node * GTY (()) next;
3405 var_loc_view view;
3408 /* Variable location list. */
3409 struct GTY ((for_user)) var_loc_list_def {
3410 struct var_loc_node * GTY (()) first;
3412 /* Pointer to the last but one or last element of the
3413 chained list. If the list is empty, both first and
3414 last are NULL, if the list contains just one node
3415 or the last node certainly is not redundant, it points
3416 to the last node, otherwise points to the last but one.
3417 Do not mark it for GC because it is marked through the chain. */
3418 struct var_loc_node * GTY ((skip ("%h"))) last;
3420 /* Pointer to the last element before section switch,
3421 if NULL, either sections weren't switched or first
3422 is after section switch. */
3423 struct var_loc_node * GTY ((skip ("%h"))) last_before_switch;
3425 /* DECL_UID of the variable decl. */
3426 unsigned int decl_id;
3428 typedef struct var_loc_list_def var_loc_list;
3430 /* Call argument location list. */
3431 struct GTY ((chain_next ("%h.next"))) call_arg_loc_node {
3432 rtx GTY (()) call_arg_loc_note;
3433 const char * GTY (()) label;
3434 tree GTY (()) block;
3435 bool tail_call_p;
3436 rtx GTY (()) symbol_ref;
3437 struct call_arg_loc_node * GTY (()) next;
3441 struct decl_loc_hasher : ggc_ptr_hash<var_loc_list>
3443 typedef const_tree compare_type;
3445 static hashval_t hash (var_loc_list *);
3446 static bool equal (var_loc_list *, const_tree);
3449 /* Table of decl location linked lists. */
3450 static GTY (()) hash_table<decl_loc_hasher> *decl_loc_table;
3452 /* Head and tail of call_arg_loc chain. */
3453 static GTY (()) struct call_arg_loc_node *call_arg_locations;
3454 static struct call_arg_loc_node *call_arg_loc_last;
3456 /* Number of call sites in the current function. */
3457 static int call_site_count = -1;
3458 /* Number of tail call sites in the current function. */
3459 static int tail_call_site_count = -1;
3461 /* A cached location list. */
3462 struct GTY ((for_user)) cached_dw_loc_list_def {
3463 /* The DECL_UID of the decl that this entry describes. */
3464 unsigned int decl_id;
3466 /* The cached location list. */
3467 dw_loc_list_ref loc_list;
3469 typedef struct cached_dw_loc_list_def cached_dw_loc_list;
3471 struct dw_loc_list_hasher : ggc_ptr_hash<cached_dw_loc_list>
3474 typedef const_tree compare_type;
3476 static hashval_t hash (cached_dw_loc_list *);
3477 static bool equal (cached_dw_loc_list *, const_tree);
3480 /* Table of cached location lists. */
3481 static GTY (()) hash_table<dw_loc_list_hasher> *cached_dw_loc_list_table;
3483 /* A vector of references to DIE's that are uniquely identified by their tag,
3484 presence/absence of children DIE's, and list of attribute/value pairs. */
3485 static GTY(()) vec<dw_die_ref, va_gc> *abbrev_die_table;
3487 /* A hash map to remember the stack usage for DWARF procedures. The value
3488 stored is the stack size difference between before the DWARF procedure
3489 invokation and after it returned. In other words, for a DWARF procedure
3490 that consumes N stack slots and that pushes M ones, this stores M - N. */
3491 static hash_map<dw_die_ref, int> *dwarf_proc_stack_usage_map;
3493 /* A global counter for generating labels for line number data. */
3494 static unsigned int line_info_label_num;
3496 /* The current table to which we should emit line number information
3497 for the current function. This will be set up at the beginning of
3498 assembly for the function. */
3499 static GTY(()) dw_line_info_table *cur_line_info_table;
3501 /* The two default tables of line number info. */
3502 static GTY(()) dw_line_info_table *text_section_line_info;
3503 static GTY(()) dw_line_info_table *cold_text_section_line_info;
3505 /* The set of all non-default tables of line number info. */
3506 static GTY(()) vec<dw_line_info_table *, va_gc> *separate_line_info;
3508 /* A flag to tell pubnames/types export if there is an info section to
3509 refer to. */
3510 static bool info_section_emitted;
3512 /* A pointer to the base of a table that contains a list of publicly
3513 accessible names. */
3514 static GTY (()) vec<pubname_entry, va_gc> *pubname_table;
3516 /* A pointer to the base of a table that contains a list of publicly
3517 accessible types. */
3518 static GTY (()) vec<pubname_entry, va_gc> *pubtype_table;
3520 /* A pointer to the base of a table that contains a list of macro
3521 defines/undefines (and file start/end markers). */
3522 static GTY (()) vec<macinfo_entry, va_gc> *macinfo_table;
3524 /* True if .debug_macinfo or .debug_macros section is going to be
3525 emitted. */
3526 #define have_macinfo \
3527 ((!XCOFF_DEBUGGING_INFO || HAVE_XCOFF_DWARF_EXTRAS) \
3528 && debug_info_level >= DINFO_LEVEL_VERBOSE \
3529 && !macinfo_table->is_empty ())
3531 /* Vector of dies for which we should generate .debug_ranges info. */
3532 static GTY (()) vec<dw_ranges, va_gc> *ranges_table;
3534 /* Vector of pairs of labels referenced in ranges_table. */
3535 static GTY (()) vec<dw_ranges_by_label, va_gc> *ranges_by_label;
3537 /* Whether we have location lists that need outputting */
3538 static GTY(()) bool have_location_lists;
3540 /* Unique label counter. */
3541 static GTY(()) unsigned int loclabel_num;
3543 /* Unique label counter for point-of-call tables. */
3544 static GTY(()) unsigned int poc_label_num;
3546 /* The last file entry emitted by maybe_emit_file(). */
3547 static GTY(()) struct dwarf_file_data * last_emitted_file;
3549 /* Number of internal labels generated by gen_internal_sym(). */
3550 static GTY(()) int label_num;
3552 static GTY(()) vec<die_arg_entry, va_gc> *tmpl_value_parm_die_table;
3554 /* Instances of generic types for which we need to generate debug
3555 info that describe their generic parameters and arguments. That
3556 generation needs to happen once all types are properly laid out so
3557 we do it at the end of compilation. */
3558 static GTY(()) vec<tree, va_gc> *generic_type_instances;
3560 /* Offset from the "steady-state frame pointer" to the frame base,
3561 within the current function. */
3562 static poly_int64 frame_pointer_fb_offset;
3563 static bool frame_pointer_fb_offset_valid;
3565 static vec<dw_die_ref> base_types;
3567 /* Flags to represent a set of attribute classes for attributes that represent
3568 a scalar value (bounds, pointers, ...). */
3569 enum dw_scalar_form
3571 dw_scalar_form_constant = 0x01,
3572 dw_scalar_form_exprloc = 0x02,
3573 dw_scalar_form_reference = 0x04
3576 /* Forward declarations for functions defined in this file. */
3578 static int is_pseudo_reg (const_rtx);
3579 static tree type_main_variant (tree);
3580 static int is_tagged_type (const_tree);
3581 static const char *dwarf_tag_name (unsigned);
3582 static const char *dwarf_attr_name (unsigned);
3583 static const char *dwarf_form_name (unsigned);
3584 static tree decl_ultimate_origin (const_tree);
3585 static tree decl_class_context (tree);
3586 static void add_dwarf_attr (dw_die_ref, dw_attr_node *);
3587 static inline enum dw_val_class AT_class (dw_attr_node *);
3588 static inline unsigned int AT_index (dw_attr_node *);
3589 static void add_AT_flag (dw_die_ref, enum dwarf_attribute, unsigned);
3590 static inline unsigned AT_flag (dw_attr_node *);
3591 static void add_AT_int (dw_die_ref, enum dwarf_attribute, HOST_WIDE_INT);
3592 static inline HOST_WIDE_INT AT_int (dw_attr_node *);
3593 static void add_AT_unsigned (dw_die_ref, enum dwarf_attribute, unsigned HOST_WIDE_INT);
3594 static inline unsigned HOST_WIDE_INT AT_unsigned (dw_attr_node *);
3595 static void add_AT_double (dw_die_ref, enum dwarf_attribute,
3596 HOST_WIDE_INT, unsigned HOST_WIDE_INT);
3597 static inline void add_AT_vec (dw_die_ref, enum dwarf_attribute, unsigned int,
3598 unsigned int, unsigned char *);
3599 static void add_AT_data8 (dw_die_ref, enum dwarf_attribute, unsigned char *);
3600 static void add_AT_string (dw_die_ref, enum dwarf_attribute, const char *);
3601 static inline const char *AT_string (dw_attr_node *);
3602 static enum dwarf_form AT_string_form (dw_attr_node *);
3603 static void add_AT_die_ref (dw_die_ref, enum dwarf_attribute, dw_die_ref);
3604 static void add_AT_specification (dw_die_ref, dw_die_ref);
3605 static inline dw_die_ref AT_ref (dw_attr_node *);
3606 static inline int AT_ref_external (dw_attr_node *);
3607 static inline void set_AT_ref_external (dw_attr_node *, int);
3608 static void add_AT_fde_ref (dw_die_ref, enum dwarf_attribute, unsigned);
3609 static void add_AT_loc (dw_die_ref, enum dwarf_attribute, dw_loc_descr_ref);
3610 static inline dw_loc_descr_ref AT_loc (dw_attr_node *);
3611 static void add_AT_loc_list (dw_die_ref, enum dwarf_attribute,
3612 dw_loc_list_ref);
3613 static inline dw_loc_list_ref AT_loc_list (dw_attr_node *);
3614 static void add_AT_view_list (dw_die_ref, enum dwarf_attribute);
3615 static inline dw_loc_list_ref AT_loc_list (dw_attr_node *);
3616 static addr_table_entry *add_addr_table_entry (void *, enum ate_kind);
3617 static void remove_addr_table_entry (addr_table_entry *);
3618 static void add_AT_addr (dw_die_ref, enum dwarf_attribute, rtx, bool);
3619 static inline rtx AT_addr (dw_attr_node *);
3620 static void add_AT_symview (dw_die_ref, enum dwarf_attribute, const char *);
3621 static void add_AT_lbl_id (dw_die_ref, enum dwarf_attribute, const char *);
3622 static void add_AT_lineptr (dw_die_ref, enum dwarf_attribute, const char *);
3623 static void add_AT_macptr (dw_die_ref, enum dwarf_attribute, const char *);
3624 static void add_AT_loclistsptr (dw_die_ref, enum dwarf_attribute,
3625 const char *);
3626 static void add_AT_offset (dw_die_ref, enum dwarf_attribute,
3627 unsigned HOST_WIDE_INT);
3628 static void add_AT_range_list (dw_die_ref, enum dwarf_attribute,
3629 unsigned long, bool);
3630 static inline const char *AT_lbl (dw_attr_node *);
3631 static dw_attr_node *get_AT (dw_die_ref, enum dwarf_attribute);
3632 static const char *get_AT_low_pc (dw_die_ref);
3633 static const char *get_AT_hi_pc (dw_die_ref);
3634 static const char *get_AT_string (dw_die_ref, enum dwarf_attribute);
3635 static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
3636 static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
3637 static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
3638 static bool is_cxx (void);
3639 static bool is_cxx (const_tree);
3640 static bool is_fortran (void);
3641 static bool is_ada (void);
3642 static bool remove_AT (dw_die_ref, enum dwarf_attribute);
3643 static void remove_child_TAG (dw_die_ref, enum dwarf_tag);
3644 static void add_child_die (dw_die_ref, dw_die_ref);
3645 static dw_die_ref new_die (enum dwarf_tag, dw_die_ref, tree);
3646 static dw_die_ref lookup_type_die (tree);
3647 static dw_die_ref strip_naming_typedef (tree, dw_die_ref);
3648 static dw_die_ref lookup_type_die_strip_naming_typedef (tree);
3649 static void equate_type_number_to_die (tree, dw_die_ref);
3650 static dw_die_ref lookup_decl_die (tree);
3651 static var_loc_list *lookup_decl_loc (const_tree);
3652 static void equate_decl_number_to_die (tree, dw_die_ref);
3653 static struct var_loc_node *add_var_loc_to_decl (tree, rtx, const char *, var_loc_view);
3654 static void print_spaces (FILE *);
3655 static void print_die (dw_die_ref, FILE *);
3656 static void loc_checksum (dw_loc_descr_ref, struct md5_ctx *);
3657 static void attr_checksum (dw_attr_node *, struct md5_ctx *, int *);
3658 static void die_checksum (dw_die_ref, struct md5_ctx *, int *);
3659 static void checksum_sleb128 (HOST_WIDE_INT, struct md5_ctx *);
3660 static void checksum_uleb128 (unsigned HOST_WIDE_INT, struct md5_ctx *);
3661 static void loc_checksum_ordered (dw_loc_descr_ref, struct md5_ctx *);
3662 static void attr_checksum_ordered (enum dwarf_tag, dw_attr_node *,
3663 struct md5_ctx *, int *);
3664 struct checksum_attributes;
3665 static void collect_checksum_attributes (struct checksum_attributes *, dw_die_ref);
3666 static void die_checksum_ordered (dw_die_ref, struct md5_ctx *, int *);
3667 static void checksum_die_context (dw_die_ref, struct md5_ctx *);
3668 static void generate_type_signature (dw_die_ref, comdat_type_node *);
3669 static int same_loc_p (dw_loc_descr_ref, dw_loc_descr_ref, int *);
3670 static int same_dw_val_p (const dw_val_node *, const dw_val_node *, int *);
3671 static int same_attr_p (dw_attr_node *, dw_attr_node *, int *);
3672 static int same_die_p (dw_die_ref, dw_die_ref, int *);
3673 static int is_type_die (dw_die_ref);
3674 static int is_comdat_die (dw_die_ref);
3675 static inline bool is_template_instantiation (dw_die_ref);
3676 static int is_declaration_die (dw_die_ref);
3677 static int should_move_die_to_comdat (dw_die_ref);
3678 static dw_die_ref clone_as_declaration (dw_die_ref);
3679 static dw_die_ref clone_die (dw_die_ref);
3680 static dw_die_ref clone_tree (dw_die_ref);
3681 static dw_die_ref copy_declaration_context (dw_die_ref, dw_die_ref);
3682 static void generate_skeleton_ancestor_tree (skeleton_chain_node *);
3683 static void generate_skeleton_bottom_up (skeleton_chain_node *);
3684 static dw_die_ref generate_skeleton (dw_die_ref);
3685 static dw_die_ref remove_child_or_replace_with_skeleton (dw_die_ref,
3686 dw_die_ref,
3687 dw_die_ref);
3688 static void break_out_comdat_types (dw_die_ref);
3689 static void copy_decls_for_unworthy_types (dw_die_ref);
3691 static void add_sibling_attributes (dw_die_ref);
3692 static void output_location_lists (dw_die_ref);
3693 static int constant_size (unsigned HOST_WIDE_INT);
3694 static unsigned long size_of_die (dw_die_ref);
3695 static void calc_die_sizes (dw_die_ref);
3696 static void calc_base_type_die_sizes (void);
3697 static void mark_dies (dw_die_ref);
3698 static void unmark_dies (dw_die_ref);
3699 static void unmark_all_dies (dw_die_ref);
3700 static unsigned long size_of_pubnames (vec<pubname_entry, va_gc> *);
3701 static unsigned long size_of_aranges (void);
3702 static enum dwarf_form value_format (dw_attr_node *);
3703 static void output_value_format (dw_attr_node *);
3704 static void output_abbrev_section (void);
3705 static void output_die_abbrevs (unsigned long, dw_die_ref);
3706 static void output_die (dw_die_ref);
3707 static void output_compilation_unit_header (enum dwarf_unit_type);
3708 static void output_comp_unit (dw_die_ref, int, const unsigned char *);
3709 static void output_comdat_type_unit (comdat_type_node *);
3710 static const char *dwarf2_name (tree, int);
3711 static void add_pubname (tree, dw_die_ref);
3712 static void add_enumerator_pubname (const char *, dw_die_ref);
3713 static void add_pubname_string (const char *, dw_die_ref);
3714 static void add_pubtype (tree, dw_die_ref);
3715 static void output_pubnames (vec<pubname_entry, va_gc> *);
3716 static void output_aranges (void);
3717 static unsigned int add_ranges (const_tree, bool = false);
3718 static void add_ranges_by_labels (dw_die_ref, const char *, const char *,
3719 bool *, bool);
3720 static void output_ranges (void);
3721 static dw_line_info_table *new_line_info_table (void);
3722 static void output_line_info (bool);
3723 static void output_file_names (void);
3724 static dw_die_ref base_type_die (tree, bool);
3725 static int is_base_type (tree);
3726 static dw_die_ref subrange_type_die (tree, tree, tree, tree, dw_die_ref);
3727 static int decl_quals (const_tree);
3728 static dw_die_ref modified_type_die (tree, int, bool, dw_die_ref);
3729 static dw_die_ref generic_parameter_die (tree, tree, bool, dw_die_ref);
3730 static dw_die_ref template_parameter_pack_die (tree, tree, dw_die_ref);
3731 static int type_is_enum (const_tree);
3732 static unsigned int dbx_reg_number (const_rtx);
3733 static void add_loc_descr_op_piece (dw_loc_descr_ref *, int);
3734 static dw_loc_descr_ref reg_loc_descriptor (rtx, enum var_init_status);
3735 static dw_loc_descr_ref one_reg_loc_descriptor (unsigned int,
3736 enum var_init_status);
3737 static dw_loc_descr_ref multiple_reg_loc_descriptor (rtx, rtx,
3738 enum var_init_status);
3739 static dw_loc_descr_ref based_loc_descr (rtx, poly_int64,
3740 enum var_init_status);
3741 static int is_based_loc (const_rtx);
3742 static bool resolve_one_addr (rtx *);
3743 static dw_loc_descr_ref concat_loc_descriptor (rtx, rtx,
3744 enum var_init_status);
3745 static dw_loc_descr_ref loc_descriptor (rtx, machine_mode mode,
3746 enum var_init_status);
3747 struct loc_descr_context;
3748 static void add_loc_descr_to_each (dw_loc_list_ref list, dw_loc_descr_ref ref);
3749 static void add_loc_list (dw_loc_list_ref *ret, dw_loc_list_ref list);
3750 static dw_loc_list_ref loc_list_from_tree (tree, int,
3751 struct loc_descr_context *);
3752 static dw_loc_descr_ref loc_descriptor_from_tree (tree, int,
3753 struct loc_descr_context *);
3754 static HOST_WIDE_INT ceiling (HOST_WIDE_INT, unsigned int);
3755 static tree field_type (const_tree);
3756 static unsigned int simple_type_align_in_bits (const_tree);
3757 static unsigned int simple_decl_align_in_bits (const_tree);
3758 static unsigned HOST_WIDE_INT simple_type_size_in_bits (const_tree);
3759 struct vlr_context;
3760 static dw_loc_descr_ref field_byte_offset (const_tree, struct vlr_context *,
3761 HOST_WIDE_INT *);
3762 static void add_AT_location_description (dw_die_ref, enum dwarf_attribute,
3763 dw_loc_list_ref);
3764 static void add_data_member_location_attribute (dw_die_ref, tree,
3765 struct vlr_context *);
3766 static bool add_const_value_attribute (dw_die_ref, rtx);
3767 static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *);
3768 static void insert_wide_int (const wide_int &, unsigned char *, int);
3769 static void insert_float (const_rtx, unsigned char *);
3770 static rtx rtl_for_decl_location (tree);
3771 static bool add_location_or_const_value_attribute (dw_die_ref, tree, bool);
3772 static bool tree_add_const_value_attribute (dw_die_ref, tree);
3773 static bool tree_add_const_value_attribute_for_decl (dw_die_ref, tree);
3774 static void add_name_attribute (dw_die_ref, const char *);
3775 static void add_gnat_descriptive_type_attribute (dw_die_ref, tree, dw_die_ref);
3776 static void add_comp_dir_attribute (dw_die_ref);
3777 static void add_scalar_info (dw_die_ref, enum dwarf_attribute, tree, int,
3778 struct loc_descr_context *);
3779 static void add_bound_info (dw_die_ref, enum dwarf_attribute, tree,
3780 struct loc_descr_context *);
3781 static void add_subscript_info (dw_die_ref, tree, bool);
3782 static void add_byte_size_attribute (dw_die_ref, tree);
3783 static void add_alignment_attribute (dw_die_ref, tree);
3784 static inline void add_bit_offset_attribute (dw_die_ref, tree,
3785 struct vlr_context *);
3786 static void add_bit_size_attribute (dw_die_ref, tree);
3787 static void add_prototyped_attribute (dw_die_ref, tree);
3788 static dw_die_ref add_abstract_origin_attribute (dw_die_ref, tree);
3789 static void add_pure_or_virtual_attribute (dw_die_ref, tree);
3790 static void add_src_coords_attributes (dw_die_ref, tree);
3791 static void add_name_and_src_coords_attributes (dw_die_ref, tree, bool = false);
3792 static void add_discr_value (dw_die_ref, dw_discr_value *);
3793 static void add_discr_list (dw_die_ref, dw_discr_list_ref);
3794 static inline dw_discr_list_ref AT_discr_list (dw_attr_node *);
3795 static void push_decl_scope (tree);
3796 static void pop_decl_scope (void);
3797 static dw_die_ref scope_die_for (tree, dw_die_ref);
3798 static inline int local_scope_p (dw_die_ref);
3799 static inline int class_scope_p (dw_die_ref);
3800 static inline int class_or_namespace_scope_p (dw_die_ref);
3801 static void add_type_attribute (dw_die_ref, tree, int, bool, dw_die_ref);
3802 static void add_calling_convention_attribute (dw_die_ref, tree);
3803 static const char *type_tag (const_tree);
3804 static tree member_declared_type (const_tree);
3805 #if 0
3806 static const char *decl_start_label (tree);
3807 #endif
3808 static void gen_array_type_die (tree, dw_die_ref);
3809 static void gen_descr_array_type_die (tree, struct array_descr_info *, dw_die_ref);
3810 #if 0
3811 static void gen_entry_point_die (tree, dw_die_ref);
3812 #endif
3813 static dw_die_ref gen_enumeration_type_die (tree, dw_die_ref);
3814 static dw_die_ref gen_formal_parameter_die (tree, tree, bool, dw_die_ref);
3815 static dw_die_ref gen_formal_parameter_pack_die (tree, tree, dw_die_ref, tree*);
3816 static void gen_unspecified_parameters_die (tree, dw_die_ref);
3817 static void gen_formal_types_die (tree, dw_die_ref);
3818 static void gen_subprogram_die (tree, dw_die_ref);
3819 static void gen_variable_die (tree, tree, dw_die_ref);
3820 static void gen_const_die (tree, dw_die_ref);
3821 static void gen_label_die (tree, dw_die_ref);
3822 static void gen_lexical_block_die (tree, dw_die_ref);
3823 static void gen_inlined_subroutine_die (tree, dw_die_ref);
3824 static void gen_field_die (tree, struct vlr_context *, dw_die_ref);
3825 static void gen_ptr_to_mbr_type_die (tree, dw_die_ref);
3826 static dw_die_ref gen_compile_unit_die (const char *);
3827 static void gen_inheritance_die (tree, tree, tree, dw_die_ref);
3828 static void gen_member_die (tree, dw_die_ref);
3829 static void gen_struct_or_union_type_die (tree, dw_die_ref,
3830 enum debug_info_usage);
3831 static void gen_subroutine_type_die (tree, dw_die_ref);
3832 static void gen_typedef_die (tree, dw_die_ref);
3833 static void gen_type_die (tree, dw_die_ref);
3834 static void gen_block_die (tree, dw_die_ref);
3835 static void decls_for_scope (tree, dw_die_ref);
3836 static bool is_naming_typedef_decl (const_tree);
3837 static inline dw_die_ref get_context_die (tree);
3838 static void gen_namespace_die (tree, dw_die_ref);
3839 static dw_die_ref gen_namelist_decl (tree, dw_die_ref, tree);
3840 static dw_die_ref gen_decl_die (tree, tree, struct vlr_context *, dw_die_ref);
3841 static dw_die_ref force_decl_die (tree);
3842 static dw_die_ref force_type_die (tree);
3843 static dw_die_ref setup_namespace_context (tree, dw_die_ref);
3844 static dw_die_ref declare_in_namespace (tree, dw_die_ref);
3845 static struct dwarf_file_data * lookup_filename (const char *);
3846 static void retry_incomplete_types (void);
3847 static void gen_type_die_for_member (tree, tree, dw_die_ref);
3848 static void gen_generic_params_dies (tree);
3849 static void gen_tagged_type_die (tree, dw_die_ref, enum debug_info_usage);
3850 static void gen_type_die_with_usage (tree, dw_die_ref, enum debug_info_usage);
3851 static void splice_child_die (dw_die_ref, dw_die_ref);
3852 static int file_info_cmp (const void *, const void *);
3853 static dw_loc_list_ref new_loc_list (dw_loc_descr_ref, const char *, var_loc_view,
3854 const char *, var_loc_view, const char *);
3855 static void output_loc_list (dw_loc_list_ref);
3856 static char *gen_internal_sym (const char *);
3857 static bool want_pubnames (void);
3859 static void prune_unmark_dies (dw_die_ref);
3860 static void prune_unused_types_mark_generic_parms_dies (dw_die_ref);
3861 static void prune_unused_types_mark (dw_die_ref, int);
3862 static void prune_unused_types_walk (dw_die_ref);
3863 static void prune_unused_types_walk_attribs (dw_die_ref);
3864 static void prune_unused_types_prune (dw_die_ref);
3865 static void prune_unused_types (void);
3866 static int maybe_emit_file (struct dwarf_file_data *fd);
3867 static inline const char *AT_vms_delta1 (dw_attr_node *);
3868 static inline const char *AT_vms_delta2 (dw_attr_node *);
3869 static inline void add_AT_vms_delta (dw_die_ref, enum dwarf_attribute,
3870 const char *, const char *);
3871 static void append_entry_to_tmpl_value_parm_die_table (dw_die_ref, tree);
3872 static void gen_remaining_tmpl_value_param_die_attribute (void);
3873 static bool generic_type_p (tree);
3874 static void schedule_generic_params_dies_gen (tree t);
3875 static void gen_scheduled_generic_parms_dies (void);
3876 static void resolve_variable_values (void);
3878 static const char *comp_dir_string (void);
3880 static void hash_loc_operands (dw_loc_descr_ref, inchash::hash &);
3882 /* enum for tracking thread-local variables whose address is really an offset
3883 relative to the TLS pointer, which will need link-time relocation, but will
3884 not need relocation by the DWARF consumer. */
3886 enum dtprel_bool
3888 dtprel_false = 0,
3889 dtprel_true = 1
3892 /* Return the operator to use for an address of a variable. For dtprel_true, we
3893 use DW_OP_const*. For regular variables, which need both link-time
3894 relocation and consumer-level relocation (e.g., to account for shared objects
3895 loaded at a random address), we use DW_OP_addr*. */
3897 static inline enum dwarf_location_atom
3898 dw_addr_op (enum dtprel_bool dtprel)
3900 if (dtprel == dtprel_true)
3901 return (dwarf_split_debug_info ? DW_OP_GNU_const_index
3902 : (DWARF2_ADDR_SIZE == 4 ? DW_OP_const4u : DW_OP_const8u));
3903 else
3904 return dwarf_split_debug_info ? DW_OP_GNU_addr_index : DW_OP_addr;
3907 /* Return a pointer to a newly allocated address location description. If
3908 dwarf_split_debug_info is true, then record the address with the appropriate
3909 relocation. */
3910 static inline dw_loc_descr_ref
3911 new_addr_loc_descr (rtx addr, enum dtprel_bool dtprel)
3913 dw_loc_descr_ref ref = new_loc_descr (dw_addr_op (dtprel), 0, 0);
3915 ref->dw_loc_oprnd1.val_class = dw_val_class_addr;
3916 ref->dw_loc_oprnd1.v.val_addr = addr;
3917 ref->dtprel = dtprel;
3918 if (dwarf_split_debug_info)
3919 ref->dw_loc_oprnd1.val_entry
3920 = add_addr_table_entry (addr,
3921 dtprel ? ate_kind_rtx_dtprel : ate_kind_rtx);
3922 else
3923 ref->dw_loc_oprnd1.val_entry = NULL;
3925 return ref;
3928 /* Section names used to hold DWARF debugging information. */
3930 #ifndef DEBUG_INFO_SECTION
3931 #define DEBUG_INFO_SECTION ".debug_info"
3932 #endif
3933 #ifndef DEBUG_DWO_INFO_SECTION
3934 #define DEBUG_DWO_INFO_SECTION ".debug_info.dwo"
3935 #endif
3936 #ifndef DEBUG_LTO_INFO_SECTION
3937 #define DEBUG_LTO_INFO_SECTION ".gnu.debuglto_.debug_info"
3938 #endif
3939 #ifndef DEBUG_LTO_DWO_INFO_SECTION
3940 #define DEBUG_LTO_DWO_INFO_SECTION ".gnu.debuglto_.debug_info.dwo"
3941 #endif
3942 #ifndef DEBUG_ABBREV_SECTION
3943 #define DEBUG_ABBREV_SECTION ".debug_abbrev"
3944 #endif
3945 #ifndef DEBUG_LTO_ABBREV_SECTION
3946 #define DEBUG_LTO_ABBREV_SECTION ".gnu.debuglto_.debug_abbrev"
3947 #endif
3948 #ifndef DEBUG_DWO_ABBREV_SECTION
3949 #define DEBUG_DWO_ABBREV_SECTION ".debug_abbrev.dwo"
3950 #endif
3951 #ifndef DEBUG_LTO_DWO_ABBREV_SECTION
3952 #define DEBUG_LTO_DWO_ABBREV_SECTION ".gnu.debuglto_.debug_abbrev.dwo"
3953 #endif
3954 #ifndef DEBUG_ARANGES_SECTION
3955 #define DEBUG_ARANGES_SECTION ".debug_aranges"
3956 #endif
3957 #ifndef DEBUG_ADDR_SECTION
3958 #define DEBUG_ADDR_SECTION ".debug_addr"
3959 #endif
3960 #ifndef DEBUG_MACINFO_SECTION
3961 #define DEBUG_MACINFO_SECTION ".debug_macinfo"
3962 #endif
3963 #ifndef DEBUG_LTO_MACINFO_SECTION
3964 #define DEBUG_LTO_MACINFO_SECTION ".gnu.debuglto_.debug_macinfo"
3965 #endif
3966 #ifndef DEBUG_DWO_MACINFO_SECTION
3967 #define DEBUG_DWO_MACINFO_SECTION ".debug_macinfo.dwo"
3968 #endif
3969 #ifndef DEBUG_LTO_DWO_MACINFO_SECTION
3970 #define DEBUG_LTO_DWO_MACINFO_SECTION ".gnu.debuglto_.debug_macinfo.dwo"
3971 #endif
3972 #ifndef DEBUG_MACRO_SECTION
3973 #define DEBUG_MACRO_SECTION ".debug_macro"
3974 #endif
3975 #ifndef DEBUG_LTO_MACRO_SECTION
3976 #define DEBUG_LTO_MACRO_SECTION ".gnu.debuglto_.debug_macro"
3977 #endif
3978 #ifndef DEBUG_DWO_MACRO_SECTION
3979 #define DEBUG_DWO_MACRO_SECTION ".debug_macro.dwo"
3980 #endif
3981 #ifndef DEBUG_LTO_DWO_MACRO_SECTION
3982 #define DEBUG_LTO_DWO_MACRO_SECTION ".gnu.debuglto_.debug_macro.dwo"
3983 #endif
3984 #ifndef DEBUG_LINE_SECTION
3985 #define DEBUG_LINE_SECTION ".debug_line"
3986 #endif
3987 #ifndef DEBUG_LTO_LINE_SECTION
3988 #define DEBUG_LTO_LINE_SECTION ".gnu.debuglto_.debug_line"
3989 #endif
3990 #ifndef DEBUG_DWO_LINE_SECTION
3991 #define DEBUG_DWO_LINE_SECTION ".debug_line.dwo"
3992 #endif
3993 #ifndef DEBUG_LTO_DWO_LINE_SECTION
3994 #define DEBUG_LTO_DWO_LINE_SECTION ".gnu.debuglto_.debug_line.dwo"
3995 #endif
3996 #ifndef DEBUG_LOC_SECTION
3997 #define DEBUG_LOC_SECTION ".debug_loc"
3998 #endif
3999 #ifndef DEBUG_DWO_LOC_SECTION
4000 #define DEBUG_DWO_LOC_SECTION ".debug_loc.dwo"
4001 #endif
4002 #ifndef DEBUG_LOCLISTS_SECTION
4003 #define DEBUG_LOCLISTS_SECTION ".debug_loclists"
4004 #endif
4005 #ifndef DEBUG_DWO_LOCLISTS_SECTION
4006 #define DEBUG_DWO_LOCLISTS_SECTION ".debug_loclists.dwo"
4007 #endif
4008 #ifndef DEBUG_PUBNAMES_SECTION
4009 #define DEBUG_PUBNAMES_SECTION \
4010 ((debug_generate_pub_sections == 2) \
4011 ? ".debug_gnu_pubnames" : ".debug_pubnames")
4012 #endif
4013 #ifndef DEBUG_PUBTYPES_SECTION
4014 #define DEBUG_PUBTYPES_SECTION \
4015 ((debug_generate_pub_sections == 2) \
4016 ? ".debug_gnu_pubtypes" : ".debug_pubtypes")
4017 #endif
4018 #ifndef DEBUG_STR_OFFSETS_SECTION
4019 #define DEBUG_STR_OFFSETS_SECTION ".debug_str_offsets"
4020 #endif
4021 #ifndef DEBUG_DWO_STR_OFFSETS_SECTION
4022 #define DEBUG_DWO_STR_OFFSETS_SECTION ".debug_str_offsets.dwo"
4023 #endif
4024 #ifndef DEBUG_LTO_DWO_STR_OFFSETS_SECTION
4025 #define DEBUG_LTO_DWO_STR_OFFSETS_SECTION ".gnu.debuglto_.debug_str_offsets.dwo"
4026 #endif
4027 #ifndef DEBUG_STR_SECTION
4028 #define DEBUG_STR_SECTION ".debug_str"
4029 #endif
4030 #ifndef DEBUG_LTO_STR_SECTION
4031 #define DEBUG_LTO_STR_SECTION ".gnu.debuglto_.debug_str"
4032 #endif
4033 #ifndef DEBUG_STR_DWO_SECTION
4034 #define DEBUG_STR_DWO_SECTION ".debug_str.dwo"
4035 #endif
4036 #ifndef DEBUG_LTO_STR_DWO_SECTION
4037 #define DEBUG_LTO_STR_DWO_SECTION ".gnu.debuglto_.debug_str.dwo"
4038 #endif
4039 #ifndef DEBUG_RANGES_SECTION
4040 #define DEBUG_RANGES_SECTION ".debug_ranges"
4041 #endif
4042 #ifndef DEBUG_RNGLISTS_SECTION
4043 #define DEBUG_RNGLISTS_SECTION ".debug_rnglists"
4044 #endif
4045 #ifndef DEBUG_LINE_STR_SECTION
4046 #define DEBUG_LINE_STR_SECTION ".debug_line_str"
4047 #endif
4048 #ifndef DEBUG_LTO_LINE_STR_SECTION
4049 #define DEBUG_LTO_LINE_STR_SECTION ".gnu.debuglto_.debug_line_str"
4050 #endif
4052 /* Standard ELF section names for compiled code and data. */
4053 #ifndef TEXT_SECTION_NAME
4054 #define TEXT_SECTION_NAME ".text"
4055 #endif
4057 /* Section flags for .debug_str section. */
4058 #define DEBUG_STR_SECTION_FLAGS \
4059 (HAVE_GAS_SHF_MERGE && flag_merge_debug_strings \
4060 ? SECTION_DEBUG | SECTION_MERGE | SECTION_STRINGS | 1 \
4061 : SECTION_DEBUG)
4063 /* Section flags for .debug_str.dwo section. */
4064 #define DEBUG_STR_DWO_SECTION_FLAGS (SECTION_DEBUG | SECTION_EXCLUDE)
4066 /* Attribute used to refer to the macro section. */
4067 #define DEBUG_MACRO_ATTRIBUTE (dwarf_version >= 5 ? DW_AT_macros \
4068 : dwarf_strict ? DW_AT_macro_info : DW_AT_GNU_macros)
4070 /* Labels we insert at beginning sections we can reference instead of
4071 the section names themselves. */
4073 #ifndef TEXT_SECTION_LABEL
4074 #define TEXT_SECTION_LABEL "Ltext"
4075 #endif
4076 #ifndef COLD_TEXT_SECTION_LABEL
4077 #define COLD_TEXT_SECTION_LABEL "Ltext_cold"
4078 #endif
4079 #ifndef DEBUG_LINE_SECTION_LABEL
4080 #define DEBUG_LINE_SECTION_LABEL "Ldebug_line"
4081 #endif
4082 #ifndef DEBUG_SKELETON_LINE_SECTION_LABEL
4083 #define DEBUG_SKELETON_LINE_SECTION_LABEL "Lskeleton_debug_line"
4084 #endif
4085 #ifndef DEBUG_INFO_SECTION_LABEL
4086 #define DEBUG_INFO_SECTION_LABEL "Ldebug_info"
4087 #endif
4088 #ifndef DEBUG_SKELETON_INFO_SECTION_LABEL
4089 #define DEBUG_SKELETON_INFO_SECTION_LABEL "Lskeleton_debug_info"
4090 #endif
4091 #ifndef DEBUG_ABBREV_SECTION_LABEL
4092 #define DEBUG_ABBREV_SECTION_LABEL "Ldebug_abbrev"
4093 #endif
4094 #ifndef DEBUG_SKELETON_ABBREV_SECTION_LABEL
4095 #define DEBUG_SKELETON_ABBREV_SECTION_LABEL "Lskeleton_debug_abbrev"
4096 #endif
4097 #ifndef DEBUG_ADDR_SECTION_LABEL
4098 #define DEBUG_ADDR_SECTION_LABEL "Ldebug_addr"
4099 #endif
4100 #ifndef DEBUG_LOC_SECTION_LABEL
4101 #define DEBUG_LOC_SECTION_LABEL "Ldebug_loc"
4102 #endif
4103 #ifndef DEBUG_RANGES_SECTION_LABEL
4104 #define DEBUG_RANGES_SECTION_LABEL "Ldebug_ranges"
4105 #endif
4106 #ifndef DEBUG_MACINFO_SECTION_LABEL
4107 #define DEBUG_MACINFO_SECTION_LABEL "Ldebug_macinfo"
4108 #endif
4109 #ifndef DEBUG_MACRO_SECTION_LABEL
4110 #define DEBUG_MACRO_SECTION_LABEL "Ldebug_macro"
4111 #endif
4112 #define SKELETON_COMP_DIE_ABBREV 1
4113 #define SKELETON_TYPE_DIE_ABBREV 2
4115 /* Definitions of defaults for formats and names of various special
4116 (artificial) labels which may be generated within this file (when the -g
4117 options is used and DWARF2_DEBUGGING_INFO is in effect.
4118 If necessary, these may be overridden from within the tm.h file, but
4119 typically, overriding these defaults is unnecessary. */
4121 static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
4122 static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4123 static char cold_text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4124 static char cold_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
4125 static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4126 static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4127 static char debug_skeleton_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4128 static char debug_skeleton_abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4129 static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4130 static char debug_addr_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4131 static char debug_skeleton_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4132 static char macinfo_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4133 static char loc_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
4134 static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
4135 static char ranges_base_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
4137 #ifndef TEXT_END_LABEL
4138 #define TEXT_END_LABEL "Letext"
4139 #endif
4140 #ifndef COLD_END_LABEL
4141 #define COLD_END_LABEL "Letext_cold"
4142 #endif
4143 #ifndef BLOCK_BEGIN_LABEL
4144 #define BLOCK_BEGIN_LABEL "LBB"
4145 #endif
4146 #ifndef BLOCK_INLINE_ENTRY_LABEL
4147 #define BLOCK_INLINE_ENTRY_LABEL "LBI"
4148 #endif
4149 #ifndef BLOCK_END_LABEL
4150 #define BLOCK_END_LABEL "LBE"
4151 #endif
4152 #ifndef LINE_CODE_LABEL
4153 #define LINE_CODE_LABEL "LM"
4154 #endif
4157 /* Return the root of the DIE's built for the current compilation unit. */
4158 static dw_die_ref
4159 comp_unit_die (void)
4161 if (!single_comp_unit_die)
4162 single_comp_unit_die = gen_compile_unit_die (NULL);
4163 return single_comp_unit_die;
4166 /* We allow a language front-end to designate a function that is to be
4167 called to "demangle" any name before it is put into a DIE. */
4169 static const char *(*demangle_name_func) (const char *);
4171 void
4172 dwarf2out_set_demangle_name_func (const char *(*func) (const char *))
4174 demangle_name_func = func;
4177 /* Test if rtl node points to a pseudo register. */
4179 static inline int
4180 is_pseudo_reg (const_rtx rtl)
4182 return ((REG_P (rtl) && REGNO (rtl) >= FIRST_PSEUDO_REGISTER)
4183 || (GET_CODE (rtl) == SUBREG
4184 && REGNO (SUBREG_REG (rtl)) >= FIRST_PSEUDO_REGISTER));
4187 /* Return a reference to a type, with its const and volatile qualifiers
4188 removed. */
4190 static inline tree
4191 type_main_variant (tree type)
4193 type = TYPE_MAIN_VARIANT (type);
4195 /* ??? There really should be only one main variant among any group of
4196 variants of a given type (and all of the MAIN_VARIANT values for all
4197 members of the group should point to that one type) but sometimes the C
4198 front-end messes this up for array types, so we work around that bug
4199 here. */
4200 if (TREE_CODE (type) == ARRAY_TYPE)
4201 while (type != TYPE_MAIN_VARIANT (type))
4202 type = TYPE_MAIN_VARIANT (type);
4204 return type;
4207 /* Return nonzero if the given type node represents a tagged type. */
4209 static inline int
4210 is_tagged_type (const_tree type)
4212 enum tree_code code = TREE_CODE (type);
4214 return (code == RECORD_TYPE || code == UNION_TYPE
4215 || code == QUAL_UNION_TYPE || code == ENUMERAL_TYPE);
4218 /* Set label to debug_info_section_label + die_offset of a DIE reference. */
4220 static void
4221 get_ref_die_offset_label (char *label, dw_die_ref ref)
4223 sprintf (label, "%s+%ld", debug_info_section_label, ref->die_offset);
4226 /* Return die_offset of a DIE reference to a base type. */
4228 static unsigned long int
4229 get_base_type_offset (dw_die_ref ref)
4231 if (ref->die_offset)
4232 return ref->die_offset;
4233 if (comp_unit_die ()->die_abbrev)
4235 calc_base_type_die_sizes ();
4236 gcc_assert (ref->die_offset);
4238 return ref->die_offset;
4241 /* Return die_offset of a DIE reference other than base type. */
4243 static unsigned long int
4244 get_ref_die_offset (dw_die_ref ref)
4246 gcc_assert (ref->die_offset);
4247 return ref->die_offset;
4250 /* Convert a DIE tag into its string name. */
4252 static const char *
4253 dwarf_tag_name (unsigned int tag)
4255 const char *name = get_DW_TAG_name (tag);
4257 if (name != NULL)
4258 return name;
4260 return "DW_TAG_<unknown>";
4263 /* Convert a DWARF attribute code into its string name. */
4265 static const char *
4266 dwarf_attr_name (unsigned int attr)
4268 const char *name;
4270 switch (attr)
4272 #if VMS_DEBUGGING_INFO
4273 case DW_AT_HP_prologue:
4274 return "DW_AT_HP_prologue";
4275 #else
4276 case DW_AT_MIPS_loop_unroll_factor:
4277 return "DW_AT_MIPS_loop_unroll_factor";
4278 #endif
4280 #if VMS_DEBUGGING_INFO
4281 case DW_AT_HP_epilogue:
4282 return "DW_AT_HP_epilogue";
4283 #else
4284 case DW_AT_MIPS_stride:
4285 return "DW_AT_MIPS_stride";
4286 #endif
4289 name = get_DW_AT_name (attr);
4291 if (name != NULL)
4292 return name;
4294 return "DW_AT_<unknown>";
4297 /* Convert a DWARF value form code into its string name. */
4299 static const char *
4300 dwarf_form_name (unsigned int form)
4302 const char *name = get_DW_FORM_name (form);
4304 if (name != NULL)
4305 return name;
4307 return "DW_FORM_<unknown>";
4310 /* Determine the "ultimate origin" of a decl. The decl may be an inlined
4311 instance of an inlined instance of a decl which is local to an inline
4312 function, so we have to trace all of the way back through the origin chain
4313 to find out what sort of node actually served as the original seed for the
4314 given block. */
4316 static tree
4317 decl_ultimate_origin (const_tree decl)
4319 if (!CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_COMMON))
4320 return NULL_TREE;
4322 /* DECL_ABSTRACT_ORIGIN can point to itself; ignore that if
4323 we're trying to output the abstract instance of this function. */
4324 if (DECL_ABSTRACT_P (decl) && DECL_ABSTRACT_ORIGIN (decl) == decl)
4325 return NULL_TREE;
4327 /* Since the DECL_ABSTRACT_ORIGIN for a DECL is supposed to be the
4328 most distant ancestor, this should never happen. */
4329 gcc_assert (!DECL_FROM_INLINE (DECL_ORIGIN (decl)));
4331 return DECL_ABSTRACT_ORIGIN (decl);
4334 /* Get the class to which DECL belongs, if any. In g++, the DECL_CONTEXT
4335 of a virtual function may refer to a base class, so we check the 'this'
4336 parameter. */
4338 static tree
4339 decl_class_context (tree decl)
4341 tree context = NULL_TREE;
4343 if (TREE_CODE (decl) != FUNCTION_DECL || ! DECL_VINDEX (decl))
4344 context = DECL_CONTEXT (decl);
4345 else
4346 context = TYPE_MAIN_VARIANT
4347 (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
4349 if (context && !TYPE_P (context))
4350 context = NULL_TREE;
4352 return context;
4355 /* Add an attribute/value pair to a DIE. */
4357 static inline void
4358 add_dwarf_attr (dw_die_ref die, dw_attr_node *attr)
4360 /* Maybe this should be an assert? */
4361 if (die == NULL)
4362 return;
4364 if (flag_checking)
4366 /* Check we do not add duplicate attrs. Can't use get_AT here
4367 because that recurses to the specification/abstract origin DIE. */
4368 dw_attr_node *a;
4369 unsigned ix;
4370 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
4371 gcc_assert (a->dw_attr != attr->dw_attr);
4374 vec_safe_reserve (die->die_attr, 1);
4375 vec_safe_push (die->die_attr, *attr);
4378 static inline enum dw_val_class
4379 AT_class (dw_attr_node *a)
4381 return a->dw_attr_val.val_class;
4384 /* Return the index for any attribute that will be referenced with a
4385 DW_FORM_GNU_addr_index or DW_FORM_GNU_str_index. String indices
4386 are stored in dw_attr_val.v.val_str for reference counting
4387 pruning. */
4389 static inline unsigned int
4390 AT_index (dw_attr_node *a)
4392 if (AT_class (a) == dw_val_class_str)
4393 return a->dw_attr_val.v.val_str->index;
4394 else if (a->dw_attr_val.val_entry != NULL)
4395 return a->dw_attr_val.val_entry->index;
4396 return NOT_INDEXED;
4399 /* Add a flag value attribute to a DIE. */
4401 static inline void
4402 add_AT_flag (dw_die_ref die, enum dwarf_attribute attr_kind, unsigned int flag)
4404 dw_attr_node attr;
4406 attr.dw_attr = attr_kind;
4407 attr.dw_attr_val.val_class = dw_val_class_flag;
4408 attr.dw_attr_val.val_entry = NULL;
4409 attr.dw_attr_val.v.val_flag = flag;
4410 add_dwarf_attr (die, &attr);
4413 static inline unsigned
4414 AT_flag (dw_attr_node *a)
4416 gcc_assert (a && AT_class (a) == dw_val_class_flag);
4417 return a->dw_attr_val.v.val_flag;
4420 /* Add a signed integer attribute value to a DIE. */
4422 static inline void
4423 add_AT_int (dw_die_ref die, enum dwarf_attribute attr_kind, HOST_WIDE_INT int_val)
4425 dw_attr_node attr;
4427 attr.dw_attr = attr_kind;
4428 attr.dw_attr_val.val_class = dw_val_class_const;
4429 attr.dw_attr_val.val_entry = NULL;
4430 attr.dw_attr_val.v.val_int = int_val;
4431 add_dwarf_attr (die, &attr);
4434 static inline HOST_WIDE_INT
4435 AT_int (dw_attr_node *a)
4437 gcc_assert (a && (AT_class (a) == dw_val_class_const
4438 || AT_class (a) == dw_val_class_const_implicit));
4439 return a->dw_attr_val.v.val_int;
4442 /* Add an unsigned integer attribute value to a DIE. */
4444 static inline void
4445 add_AT_unsigned (dw_die_ref die, enum dwarf_attribute attr_kind,
4446 unsigned HOST_WIDE_INT unsigned_val)
4448 dw_attr_node attr;
4450 attr.dw_attr = attr_kind;
4451 attr.dw_attr_val.val_class = dw_val_class_unsigned_const;
4452 attr.dw_attr_val.val_entry = NULL;
4453 attr.dw_attr_val.v.val_unsigned = unsigned_val;
4454 add_dwarf_attr (die, &attr);
4457 static inline unsigned HOST_WIDE_INT
4458 AT_unsigned (dw_attr_node *a)
4460 gcc_assert (a && (AT_class (a) == dw_val_class_unsigned_const
4461 || AT_class (a) == dw_val_class_unsigned_const_implicit));
4462 return a->dw_attr_val.v.val_unsigned;
4465 /* Add an unsigned wide integer attribute value to a DIE. */
4467 static inline void
4468 add_AT_wide (dw_die_ref die, enum dwarf_attribute attr_kind,
4469 const wide_int& w)
4471 dw_attr_node attr;
4473 attr.dw_attr = attr_kind;
4474 attr.dw_attr_val.val_class = dw_val_class_wide_int;
4475 attr.dw_attr_val.val_entry = NULL;
4476 attr.dw_attr_val.v.val_wide = ggc_alloc<wide_int> ();
4477 *attr.dw_attr_val.v.val_wide = w;
4478 add_dwarf_attr (die, &attr);
4481 /* Add an unsigned double integer attribute value to a DIE. */
4483 static inline void
4484 add_AT_double (dw_die_ref die, enum dwarf_attribute attr_kind,
4485 HOST_WIDE_INT high, unsigned HOST_WIDE_INT low)
4487 dw_attr_node attr;
4489 attr.dw_attr = attr_kind;
4490 attr.dw_attr_val.val_class = dw_val_class_const_double;
4491 attr.dw_attr_val.val_entry = NULL;
4492 attr.dw_attr_val.v.val_double.high = high;
4493 attr.dw_attr_val.v.val_double.low = low;
4494 add_dwarf_attr (die, &attr);
4497 /* Add a floating point attribute value to a DIE and return it. */
4499 static inline void
4500 add_AT_vec (dw_die_ref die, enum dwarf_attribute attr_kind,
4501 unsigned int length, unsigned int elt_size, unsigned char *array)
4503 dw_attr_node attr;
4505 attr.dw_attr = attr_kind;
4506 attr.dw_attr_val.val_class = dw_val_class_vec;
4507 attr.dw_attr_val.val_entry = NULL;
4508 attr.dw_attr_val.v.val_vec.length = length;
4509 attr.dw_attr_val.v.val_vec.elt_size = elt_size;
4510 attr.dw_attr_val.v.val_vec.array = array;
4511 add_dwarf_attr (die, &attr);
4514 /* Add an 8-byte data attribute value to a DIE. */
4516 static inline void
4517 add_AT_data8 (dw_die_ref die, enum dwarf_attribute attr_kind,
4518 unsigned char data8[8])
4520 dw_attr_node attr;
4522 attr.dw_attr = attr_kind;
4523 attr.dw_attr_val.val_class = dw_val_class_data8;
4524 attr.dw_attr_val.val_entry = NULL;
4525 memcpy (attr.dw_attr_val.v.val_data8, data8, 8);
4526 add_dwarf_attr (die, &attr);
4529 /* Add DW_AT_low_pc and DW_AT_high_pc to a DIE. When using
4530 dwarf_split_debug_info, address attributes in dies destined for the
4531 final executable have force_direct set to avoid using indexed
4532 references. */
4534 static inline void
4535 add_AT_low_high_pc (dw_die_ref die, const char *lbl_low, const char *lbl_high,
4536 bool force_direct)
4538 dw_attr_node attr;
4539 char * lbl_id;
4541 lbl_id = xstrdup (lbl_low);
4542 attr.dw_attr = DW_AT_low_pc;
4543 attr.dw_attr_val.val_class = dw_val_class_lbl_id;
4544 attr.dw_attr_val.v.val_lbl_id = lbl_id;
4545 if (dwarf_split_debug_info && !force_direct)
4546 attr.dw_attr_val.val_entry
4547 = add_addr_table_entry (lbl_id, ate_kind_label);
4548 else
4549 attr.dw_attr_val.val_entry = NULL;
4550 add_dwarf_attr (die, &attr);
4552 attr.dw_attr = DW_AT_high_pc;
4553 if (dwarf_version < 4)
4554 attr.dw_attr_val.val_class = dw_val_class_lbl_id;
4555 else
4556 attr.dw_attr_val.val_class = dw_val_class_high_pc;
4557 lbl_id = xstrdup (lbl_high);
4558 attr.dw_attr_val.v.val_lbl_id = lbl_id;
4559 if (attr.dw_attr_val.val_class == dw_val_class_lbl_id
4560 && dwarf_split_debug_info && !force_direct)
4561 attr.dw_attr_val.val_entry
4562 = add_addr_table_entry (lbl_id, ate_kind_label);
4563 else
4564 attr.dw_attr_val.val_entry = NULL;
4565 add_dwarf_attr (die, &attr);
4568 /* Hash and equality functions for debug_str_hash. */
4570 hashval_t
4571 indirect_string_hasher::hash (indirect_string_node *x)
4573 return htab_hash_string (x->str);
4576 bool
4577 indirect_string_hasher::equal (indirect_string_node *x1, const char *x2)
4579 return strcmp (x1->str, x2) == 0;
4582 /* Add STR to the given string hash table. */
4584 static struct indirect_string_node *
4585 find_AT_string_in_table (const char *str,
4586 hash_table<indirect_string_hasher> *table)
4588 struct indirect_string_node *node;
4590 indirect_string_node **slot
4591 = table->find_slot_with_hash (str, htab_hash_string (str), INSERT);
4592 if (*slot == NULL)
4594 node = ggc_cleared_alloc<indirect_string_node> ();
4595 node->str = ggc_strdup (str);
4596 *slot = node;
4598 else
4599 node = *slot;
4601 node->refcount++;
4602 return node;
4605 /* Add STR to the indirect string hash table. */
4607 static struct indirect_string_node *
4608 find_AT_string (const char *str)
4610 if (! debug_str_hash)
4611 debug_str_hash = hash_table<indirect_string_hasher>::create_ggc (10);
4613 return find_AT_string_in_table (str, debug_str_hash);
4616 /* Add a string attribute value to a DIE. */
4618 static inline void
4619 add_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind, const char *str)
4621 dw_attr_node attr;
4622 struct indirect_string_node *node;
4624 node = find_AT_string (str);
4626 attr.dw_attr = attr_kind;
4627 attr.dw_attr_val.val_class = dw_val_class_str;
4628 attr.dw_attr_val.val_entry = NULL;
4629 attr.dw_attr_val.v.val_str = node;
4630 add_dwarf_attr (die, &attr);
4633 static inline const char *
4634 AT_string (dw_attr_node *a)
4636 gcc_assert (a && AT_class (a) == dw_val_class_str);
4637 return a->dw_attr_val.v.val_str->str;
4640 /* Call this function directly to bypass AT_string_form's logic to put
4641 the string inline in the die. */
4643 static void
4644 set_indirect_string (struct indirect_string_node *node)
4646 char label[MAX_ARTIFICIAL_LABEL_BYTES];
4647 /* Already indirect is a no op. */
4648 if (node->form == DW_FORM_strp
4649 || node->form == DW_FORM_line_strp
4650 || node->form == DW_FORM_GNU_str_index)
4652 gcc_assert (node->label);
4653 return;
4655 ASM_GENERATE_INTERNAL_LABEL (label, "LASF", dw2_string_counter);
4656 ++dw2_string_counter;
4657 node->label = xstrdup (label);
4659 if (!dwarf_split_debug_info)
4661 node->form = DW_FORM_strp;
4662 node->index = NOT_INDEXED;
4664 else
4666 node->form = DW_FORM_GNU_str_index;
4667 node->index = NO_INDEX_ASSIGNED;
4671 /* A helper function for dwarf2out_finish, called to reset indirect
4672 string decisions done for early LTO dwarf output before fat object
4673 dwarf output. */
4676 reset_indirect_string (indirect_string_node **h, void *)
4678 struct indirect_string_node *node = *h;
4679 if (node->form == DW_FORM_strp || node->form == DW_FORM_GNU_str_index)
4681 free (node->label);
4682 node->label = NULL;
4683 node->form = (dwarf_form) 0;
4684 node->index = 0;
4686 return 1;
4689 /* Find out whether a string should be output inline in DIE
4690 or out-of-line in .debug_str section. */
4692 static enum dwarf_form
4693 find_string_form (struct indirect_string_node *node)
4695 unsigned int len;
4697 if (node->form)
4698 return node->form;
4700 len = strlen (node->str) + 1;
4702 /* If the string is shorter or equal to the size of the reference, it is
4703 always better to put it inline. */
4704 if (len <= DWARF_OFFSET_SIZE || node->refcount == 0)
4705 return node->form = DW_FORM_string;
4707 /* If we cannot expect the linker to merge strings in .debug_str
4708 section, only put it into .debug_str if it is worth even in this
4709 single module. */
4710 if (DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET
4711 || ((debug_str_section->common.flags & SECTION_MERGE) == 0
4712 && (len - DWARF_OFFSET_SIZE) * node->refcount <= len))
4713 return node->form = DW_FORM_string;
4715 set_indirect_string (node);
4717 return node->form;
4720 /* Find out whether the string referenced from the attribute should be
4721 output inline in DIE or out-of-line in .debug_str section. */
4723 static enum dwarf_form
4724 AT_string_form (dw_attr_node *a)
4726 gcc_assert (a && AT_class (a) == dw_val_class_str);
4727 return find_string_form (a->dw_attr_val.v.val_str);
4730 /* Add a DIE reference attribute value to a DIE. */
4732 static inline void
4733 add_AT_die_ref (dw_die_ref die, enum dwarf_attribute attr_kind, dw_die_ref targ_die)
4735 dw_attr_node attr;
4736 gcc_checking_assert (targ_die != NULL);
4738 /* With LTO we can end up trying to reference something we didn't create
4739 a DIE for. Avoid crashing later on a NULL referenced DIE. */
4740 if (targ_die == NULL)
4741 return;
4743 attr.dw_attr = attr_kind;
4744 attr.dw_attr_val.val_class = dw_val_class_die_ref;
4745 attr.dw_attr_val.val_entry = NULL;
4746 attr.dw_attr_val.v.val_die_ref.die = targ_die;
4747 attr.dw_attr_val.v.val_die_ref.external = 0;
4748 add_dwarf_attr (die, &attr);
4751 /* Change DIE reference REF to point to NEW_DIE instead. */
4753 static inline void
4754 change_AT_die_ref (dw_attr_node *ref, dw_die_ref new_die)
4756 gcc_assert (ref->dw_attr_val.val_class == dw_val_class_die_ref);
4757 ref->dw_attr_val.v.val_die_ref.die = new_die;
4758 ref->dw_attr_val.v.val_die_ref.external = 0;
4761 /* Add an AT_specification attribute to a DIE, and also make the back
4762 pointer from the specification to the definition. */
4764 static inline void
4765 add_AT_specification (dw_die_ref die, dw_die_ref targ_die)
4767 add_AT_die_ref (die, DW_AT_specification, targ_die);
4768 gcc_assert (!targ_die->die_definition);
4769 targ_die->die_definition = die;
4772 static inline dw_die_ref
4773 AT_ref (dw_attr_node *a)
4775 gcc_assert (a && AT_class (a) == dw_val_class_die_ref);
4776 return a->dw_attr_val.v.val_die_ref.die;
4779 static inline int
4780 AT_ref_external (dw_attr_node *a)
4782 if (a && AT_class (a) == dw_val_class_die_ref)
4783 return a->dw_attr_val.v.val_die_ref.external;
4785 return 0;
4788 static inline void
4789 set_AT_ref_external (dw_attr_node *a, int i)
4791 gcc_assert (a && AT_class (a) == dw_val_class_die_ref);
4792 a->dw_attr_val.v.val_die_ref.external = i;
4795 /* Add an FDE reference attribute value to a DIE. */
4797 static inline void
4798 add_AT_fde_ref (dw_die_ref die, enum dwarf_attribute attr_kind, unsigned int targ_fde)
4800 dw_attr_node attr;
4802 attr.dw_attr = attr_kind;
4803 attr.dw_attr_val.val_class = dw_val_class_fde_ref;
4804 attr.dw_attr_val.val_entry = NULL;
4805 attr.dw_attr_val.v.val_fde_index = targ_fde;
4806 add_dwarf_attr (die, &attr);
4809 /* Add a location description attribute value to a DIE. */
4811 static inline void
4812 add_AT_loc (dw_die_ref die, enum dwarf_attribute attr_kind, dw_loc_descr_ref loc)
4814 dw_attr_node attr;
4816 attr.dw_attr = attr_kind;
4817 attr.dw_attr_val.val_class = dw_val_class_loc;
4818 attr.dw_attr_val.val_entry = NULL;
4819 attr.dw_attr_val.v.val_loc = loc;
4820 add_dwarf_attr (die, &attr);
4823 static inline dw_loc_descr_ref
4824 AT_loc (dw_attr_node *a)
4826 gcc_assert (a && AT_class (a) == dw_val_class_loc);
4827 return a->dw_attr_val.v.val_loc;
4830 static inline void
4831 add_AT_loc_list (dw_die_ref die, enum dwarf_attribute attr_kind, dw_loc_list_ref loc_list)
4833 dw_attr_node attr;
4835 if (XCOFF_DEBUGGING_INFO && !HAVE_XCOFF_DWARF_EXTRAS)
4836 return;
4838 attr.dw_attr = attr_kind;
4839 attr.dw_attr_val.val_class = dw_val_class_loc_list;
4840 attr.dw_attr_val.val_entry = NULL;
4841 attr.dw_attr_val.v.val_loc_list = loc_list;
4842 add_dwarf_attr (die, &attr);
4843 have_location_lists = true;
4846 static inline dw_loc_list_ref
4847 AT_loc_list (dw_attr_node *a)
4849 gcc_assert (a && AT_class (a) == dw_val_class_loc_list);
4850 return a->dw_attr_val.v.val_loc_list;
4853 /* Add a view list attribute to DIE. It must have a DW_AT_location
4854 attribute, because the view list complements the location list. */
4856 static inline void
4857 add_AT_view_list (dw_die_ref die, enum dwarf_attribute attr_kind)
4859 dw_attr_node attr;
4861 if (XCOFF_DEBUGGING_INFO && !HAVE_XCOFF_DWARF_EXTRAS)
4862 return;
4864 attr.dw_attr = attr_kind;
4865 attr.dw_attr_val.val_class = dw_val_class_view_list;
4866 attr.dw_attr_val.val_entry = NULL;
4867 attr.dw_attr_val.v.val_view_list = die;
4868 add_dwarf_attr (die, &attr);
4869 gcc_checking_assert (get_AT (die, DW_AT_location));
4870 gcc_assert (have_location_lists);
4873 /* Return a pointer to the location list referenced by the attribute.
4874 If the named attribute is a view list, look up the corresponding
4875 DW_AT_location attribute and return its location list. */
4877 static inline dw_loc_list_ref *
4878 AT_loc_list_ptr (dw_attr_node *a)
4880 gcc_assert (a);
4881 switch (AT_class (a))
4883 case dw_val_class_loc_list:
4884 return &a->dw_attr_val.v.val_loc_list;
4885 case dw_val_class_view_list:
4887 dw_attr_node *l;
4888 l = get_AT (a->dw_attr_val.v.val_view_list, DW_AT_location);
4889 if (!l)
4890 return NULL;
4891 gcc_checking_assert (l + 1 == a);
4892 return AT_loc_list_ptr (l);
4894 default:
4895 gcc_unreachable ();
4899 /* Return the location attribute value associated with a view list
4900 attribute value. */
4902 static inline dw_val_node *
4903 view_list_to_loc_list_val_node (dw_val_node *val)
4905 gcc_assert (val->val_class == dw_val_class_view_list);
4906 dw_attr_node *loc = get_AT (val->v.val_view_list, DW_AT_location);
4907 if (!loc)
4908 return NULL;
4909 gcc_checking_assert (&(loc + 1)->dw_attr_val == val);
4910 gcc_assert (AT_class (loc) == dw_val_class_loc_list);
4911 return &loc->dw_attr_val;
4914 struct addr_hasher : ggc_ptr_hash<addr_table_entry>
4916 static hashval_t hash (addr_table_entry *);
4917 static bool equal (addr_table_entry *, addr_table_entry *);
4920 /* Table of entries into the .debug_addr section. */
4922 static GTY (()) hash_table<addr_hasher> *addr_index_table;
4924 /* Hash an address_table_entry. */
4926 hashval_t
4927 addr_hasher::hash (addr_table_entry *a)
4929 inchash::hash hstate;
4930 switch (a->kind)
4932 case ate_kind_rtx:
4933 hstate.add_int (0);
4934 break;
4935 case ate_kind_rtx_dtprel:
4936 hstate.add_int (1);
4937 break;
4938 case ate_kind_label:
4939 return htab_hash_string (a->addr.label);
4940 default:
4941 gcc_unreachable ();
4943 inchash::add_rtx (a->addr.rtl, hstate);
4944 return hstate.end ();
4947 /* Determine equality for two address_table_entries. */
4949 bool
4950 addr_hasher::equal (addr_table_entry *a1, addr_table_entry *a2)
4952 if (a1->kind != a2->kind)
4953 return 0;
4954 switch (a1->kind)
4956 case ate_kind_rtx:
4957 case ate_kind_rtx_dtprel:
4958 return rtx_equal_p (a1->addr.rtl, a2->addr.rtl);
4959 case ate_kind_label:
4960 return strcmp (a1->addr.label, a2->addr.label) == 0;
4961 default:
4962 gcc_unreachable ();
4966 /* Initialize an addr_table_entry. */
4968 void
4969 init_addr_table_entry (addr_table_entry *e, enum ate_kind kind, void *addr)
4971 e->kind = kind;
4972 switch (kind)
4974 case ate_kind_rtx:
4975 case ate_kind_rtx_dtprel:
4976 e->addr.rtl = (rtx) addr;
4977 break;
4978 case ate_kind_label:
4979 e->addr.label = (char *) addr;
4980 break;
4982 e->refcount = 0;
4983 e->index = NO_INDEX_ASSIGNED;
4986 /* Add attr to the address table entry to the table. Defer setting an
4987 index until output time. */
4989 static addr_table_entry *
4990 add_addr_table_entry (void *addr, enum ate_kind kind)
4992 addr_table_entry *node;
4993 addr_table_entry finder;
4995 gcc_assert (dwarf_split_debug_info);
4996 if (! addr_index_table)
4997 addr_index_table = hash_table<addr_hasher>::create_ggc (10);
4998 init_addr_table_entry (&finder, kind, addr);
4999 addr_table_entry **slot = addr_index_table->find_slot (&finder, INSERT);
5001 if (*slot == HTAB_EMPTY_ENTRY)
5003 node = ggc_cleared_alloc<addr_table_entry> ();
5004 init_addr_table_entry (node, kind, addr);
5005 *slot = node;
5007 else
5008 node = *slot;
5010 node->refcount++;
5011 return node;
5014 /* Remove an entry from the addr table by decrementing its refcount.
5015 Strictly, decrementing the refcount would be enough, but the
5016 assertion that the entry is actually in the table has found
5017 bugs. */
5019 static void
5020 remove_addr_table_entry (addr_table_entry *entry)
5022 gcc_assert (dwarf_split_debug_info && addr_index_table);
5023 /* After an index is assigned, the table is frozen. */
5024 gcc_assert (entry->refcount > 0 && entry->index == NO_INDEX_ASSIGNED);
5025 entry->refcount--;
5028 /* Given a location list, remove all addresses it refers to from the
5029 address_table. */
5031 static void
5032 remove_loc_list_addr_table_entries (dw_loc_descr_ref descr)
5034 for (; descr; descr = descr->dw_loc_next)
5035 if (descr->dw_loc_oprnd1.val_entry != NULL)
5037 gcc_assert (descr->dw_loc_oprnd1.val_entry->index == NO_INDEX_ASSIGNED);
5038 remove_addr_table_entry (descr->dw_loc_oprnd1.val_entry);
5042 /* A helper function for dwarf2out_finish called through
5043 htab_traverse. Assign an addr_table_entry its index. All entries
5044 must be collected into the table when this function is called,
5045 because the indexing code relies on htab_traverse to traverse nodes
5046 in the same order for each run. */
5049 index_addr_table_entry (addr_table_entry **h, unsigned int *index)
5051 addr_table_entry *node = *h;
5053 /* Don't index unreferenced nodes. */
5054 if (node->refcount == 0)
5055 return 1;
5057 gcc_assert (node->index == NO_INDEX_ASSIGNED);
5058 node->index = *index;
5059 *index += 1;
5061 return 1;
5064 /* Add an address constant attribute value to a DIE. When using
5065 dwarf_split_debug_info, address attributes in dies destined for the
5066 final executable should be direct references--setting the parameter
5067 force_direct ensures this behavior. */
5069 static inline void
5070 add_AT_addr (dw_die_ref die, enum dwarf_attribute attr_kind, rtx addr,
5071 bool force_direct)
5073 dw_attr_node attr;
5075 attr.dw_attr = attr_kind;
5076 attr.dw_attr_val.val_class = dw_val_class_addr;
5077 attr.dw_attr_val.v.val_addr = addr;
5078 if (dwarf_split_debug_info && !force_direct)
5079 attr.dw_attr_val.val_entry = add_addr_table_entry (addr, ate_kind_rtx);
5080 else
5081 attr.dw_attr_val.val_entry = NULL;
5082 add_dwarf_attr (die, &attr);
5085 /* Get the RTX from to an address DIE attribute. */
5087 static inline rtx
5088 AT_addr (dw_attr_node *a)
5090 gcc_assert (a && AT_class (a) == dw_val_class_addr);
5091 return a->dw_attr_val.v.val_addr;
5094 /* Add a file attribute value to a DIE. */
5096 static inline void
5097 add_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind,
5098 struct dwarf_file_data *fd)
5100 dw_attr_node attr;
5102 attr.dw_attr = attr_kind;
5103 attr.dw_attr_val.val_class = dw_val_class_file;
5104 attr.dw_attr_val.val_entry = NULL;
5105 attr.dw_attr_val.v.val_file = fd;
5106 add_dwarf_attr (die, &attr);
5109 /* Get the dwarf_file_data from a file DIE attribute. */
5111 static inline struct dwarf_file_data *
5112 AT_file (dw_attr_node *a)
5114 gcc_assert (a && (AT_class (a) == dw_val_class_file
5115 || AT_class (a) == dw_val_class_file_implicit));
5116 return a->dw_attr_val.v.val_file;
5119 /* Add a vms delta attribute value to a DIE. */
5121 static inline void
5122 add_AT_vms_delta (dw_die_ref die, enum dwarf_attribute attr_kind,
5123 const char *lbl1, const char *lbl2)
5125 dw_attr_node attr;
5127 attr.dw_attr = attr_kind;
5128 attr.dw_attr_val.val_class = dw_val_class_vms_delta;
5129 attr.dw_attr_val.val_entry = NULL;
5130 attr.dw_attr_val.v.val_vms_delta.lbl1 = xstrdup (lbl1);
5131 attr.dw_attr_val.v.val_vms_delta.lbl2 = xstrdup (lbl2);
5132 add_dwarf_attr (die, &attr);
5135 /* Add a symbolic view identifier attribute value to a DIE. */
5137 static inline void
5138 add_AT_symview (dw_die_ref die, enum dwarf_attribute attr_kind,
5139 const char *view_label)
5141 dw_attr_node attr;
5143 attr.dw_attr = attr_kind;
5144 attr.dw_attr_val.val_class = dw_val_class_symview;
5145 attr.dw_attr_val.val_entry = NULL;
5146 attr.dw_attr_val.v.val_symbolic_view = xstrdup (view_label);
5147 add_dwarf_attr (die, &attr);
5150 /* Add a label identifier attribute value to a DIE. */
5152 static inline void
5153 add_AT_lbl_id (dw_die_ref die, enum dwarf_attribute attr_kind,
5154 const char *lbl_id)
5156 dw_attr_node attr;
5158 attr.dw_attr = attr_kind;
5159 attr.dw_attr_val.val_class = dw_val_class_lbl_id;
5160 attr.dw_attr_val.val_entry = NULL;
5161 attr.dw_attr_val.v.val_lbl_id = xstrdup (lbl_id);
5162 if (dwarf_split_debug_info)
5163 attr.dw_attr_val.val_entry
5164 = add_addr_table_entry (attr.dw_attr_val.v.val_lbl_id,
5165 ate_kind_label);
5166 add_dwarf_attr (die, &attr);
5169 /* Add a section offset attribute value to a DIE, an offset into the
5170 debug_line section. */
5172 static inline void
5173 add_AT_lineptr (dw_die_ref die, enum dwarf_attribute attr_kind,
5174 const char *label)
5176 dw_attr_node attr;
5178 attr.dw_attr = attr_kind;
5179 attr.dw_attr_val.val_class = dw_val_class_lineptr;
5180 attr.dw_attr_val.val_entry = NULL;
5181 attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
5182 add_dwarf_attr (die, &attr);
5185 /* Add a section offset attribute value to a DIE, an offset into the
5186 debug_loclists section. */
5188 static inline void
5189 add_AT_loclistsptr (dw_die_ref die, enum dwarf_attribute attr_kind,
5190 const char *label)
5192 dw_attr_node attr;
5194 attr.dw_attr = attr_kind;
5195 attr.dw_attr_val.val_class = dw_val_class_loclistsptr;
5196 attr.dw_attr_val.val_entry = NULL;
5197 attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
5198 add_dwarf_attr (die, &attr);
5201 /* Add a section offset attribute value to a DIE, an offset into the
5202 debug_macinfo section. */
5204 static inline void
5205 add_AT_macptr (dw_die_ref die, enum dwarf_attribute attr_kind,
5206 const char *label)
5208 dw_attr_node attr;
5210 attr.dw_attr = attr_kind;
5211 attr.dw_attr_val.val_class = dw_val_class_macptr;
5212 attr.dw_attr_val.val_entry = NULL;
5213 attr.dw_attr_val.v.val_lbl_id = xstrdup (label);
5214 add_dwarf_attr (die, &attr);
5217 /* Add an offset attribute value to a DIE. */
5219 static inline void
5220 add_AT_offset (dw_die_ref die, enum dwarf_attribute attr_kind,
5221 unsigned HOST_WIDE_INT offset)
5223 dw_attr_node attr;
5225 attr.dw_attr = attr_kind;
5226 attr.dw_attr_val.val_class = dw_val_class_offset;
5227 attr.dw_attr_val.val_entry = NULL;
5228 attr.dw_attr_val.v.val_offset = offset;
5229 add_dwarf_attr (die, &attr);
5232 /* Add a range_list attribute value to a DIE. When using
5233 dwarf_split_debug_info, address attributes in dies destined for the
5234 final executable should be direct references--setting the parameter
5235 force_direct ensures this behavior. */
5237 #define UNRELOCATED_OFFSET ((addr_table_entry *) 1)
5238 #define RELOCATED_OFFSET (NULL)
5240 static void
5241 add_AT_range_list (dw_die_ref die, enum dwarf_attribute attr_kind,
5242 long unsigned int offset, bool force_direct)
5244 dw_attr_node attr;
5246 attr.dw_attr = attr_kind;
5247 attr.dw_attr_val.val_class = dw_val_class_range_list;
5248 /* For the range_list attribute, use val_entry to store whether the
5249 offset should follow split-debug-info or normal semantics. This
5250 value is read in output_range_list_offset. */
5251 if (dwarf_split_debug_info && !force_direct)
5252 attr.dw_attr_val.val_entry = UNRELOCATED_OFFSET;
5253 else
5254 attr.dw_attr_val.val_entry = RELOCATED_OFFSET;
5255 attr.dw_attr_val.v.val_offset = offset;
5256 add_dwarf_attr (die, &attr);
5259 /* Return the start label of a delta attribute. */
5261 static inline const char *
5262 AT_vms_delta1 (dw_attr_node *a)
5264 gcc_assert (a && (AT_class (a) == dw_val_class_vms_delta));
5265 return a->dw_attr_val.v.val_vms_delta.lbl1;
5268 /* Return the end label of a delta attribute. */
5270 static inline const char *
5271 AT_vms_delta2 (dw_attr_node *a)
5273 gcc_assert (a && (AT_class (a) == dw_val_class_vms_delta));
5274 return a->dw_attr_val.v.val_vms_delta.lbl2;
5277 static inline const char *
5278 AT_lbl (dw_attr_node *a)
5280 gcc_assert (a && (AT_class (a) == dw_val_class_lbl_id
5281 || AT_class (a) == dw_val_class_lineptr
5282 || AT_class (a) == dw_val_class_macptr
5283 || AT_class (a) == dw_val_class_loclistsptr
5284 || AT_class (a) == dw_val_class_high_pc));
5285 return a->dw_attr_val.v.val_lbl_id;
5288 /* Get the attribute of type attr_kind. */
5290 static dw_attr_node *
5291 get_AT (dw_die_ref die, enum dwarf_attribute attr_kind)
5293 dw_attr_node *a;
5294 unsigned ix;
5295 dw_die_ref spec = NULL;
5297 if (! die)
5298 return NULL;
5300 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
5301 if (a->dw_attr == attr_kind)
5302 return a;
5303 else if (a->dw_attr == DW_AT_specification
5304 || a->dw_attr == DW_AT_abstract_origin)
5305 spec = AT_ref (a);
5307 if (spec)
5308 return get_AT (spec, attr_kind);
5310 return NULL;
5313 /* Returns the parent of the declaration of DIE. */
5315 static dw_die_ref
5316 get_die_parent (dw_die_ref die)
5318 dw_die_ref t;
5320 if (!die)
5321 return NULL;
5323 if ((t = get_AT_ref (die, DW_AT_abstract_origin))
5324 || (t = get_AT_ref (die, DW_AT_specification)))
5325 die = t;
5327 return die->die_parent;
5330 /* Return the "low pc" attribute value, typically associated with a subprogram
5331 DIE. Return null if the "low pc" attribute is either not present, or if it
5332 cannot be represented as an assembler label identifier. */
5334 static inline const char *
5335 get_AT_low_pc (dw_die_ref die)
5337 dw_attr_node *a = get_AT (die, DW_AT_low_pc);
5339 return a ? AT_lbl (a) : NULL;
5342 /* Return the "high pc" attribute value, typically associated with a subprogram
5343 DIE. Return null if the "high pc" attribute is either not present, or if it
5344 cannot be represented as an assembler label identifier. */
5346 static inline const char *
5347 get_AT_hi_pc (dw_die_ref die)
5349 dw_attr_node *a = get_AT (die, DW_AT_high_pc);
5351 return a ? AT_lbl (a) : NULL;
5354 /* Return the value of the string attribute designated by ATTR_KIND, or
5355 NULL if it is not present. */
5357 static inline const char *
5358 get_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind)
5360 dw_attr_node *a = get_AT (die, attr_kind);
5362 return a ? AT_string (a) : NULL;
5365 /* Return the value of the flag attribute designated by ATTR_KIND, or -1
5366 if it is not present. */
5368 static inline int
5369 get_AT_flag (dw_die_ref die, enum dwarf_attribute attr_kind)
5371 dw_attr_node *a = get_AT (die, attr_kind);
5373 return a ? AT_flag (a) : 0;
5376 /* Return the value of the unsigned attribute designated by ATTR_KIND, or 0
5377 if it is not present. */
5379 static inline unsigned
5380 get_AT_unsigned (dw_die_ref die, enum dwarf_attribute attr_kind)
5382 dw_attr_node *a = get_AT (die, attr_kind);
5384 return a ? AT_unsigned (a) : 0;
5387 static inline dw_die_ref
5388 get_AT_ref (dw_die_ref die, enum dwarf_attribute attr_kind)
5390 dw_attr_node *a = get_AT (die, attr_kind);
5392 return a ? AT_ref (a) : NULL;
5395 static inline struct dwarf_file_data *
5396 get_AT_file (dw_die_ref die, enum dwarf_attribute attr_kind)
5398 dw_attr_node *a = get_AT (die, attr_kind);
5400 return a ? AT_file (a) : NULL;
5403 /* Return TRUE if the language is C++. */
5405 static inline bool
5406 is_cxx (void)
5408 unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language);
5410 return (lang == DW_LANG_C_plus_plus || lang == DW_LANG_ObjC_plus_plus
5411 || lang == DW_LANG_C_plus_plus_11 || lang == DW_LANG_C_plus_plus_14);
5414 /* Return TRUE if DECL was created by the C++ frontend. */
5416 static bool
5417 is_cxx (const_tree decl)
5419 if (in_lto_p)
5421 const_tree context = get_ultimate_context (decl);
5422 if (context && TRANSLATION_UNIT_LANGUAGE (context))
5423 return strncmp (TRANSLATION_UNIT_LANGUAGE (context), "GNU C++", 7) == 0;
5425 return is_cxx ();
5428 /* Return TRUE if the language is Fortran. */
5430 static inline bool
5431 is_fortran (void)
5433 unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language);
5435 return (lang == DW_LANG_Fortran77
5436 || lang == DW_LANG_Fortran90
5437 || lang == DW_LANG_Fortran95
5438 || lang == DW_LANG_Fortran03
5439 || lang == DW_LANG_Fortran08);
5442 static inline bool
5443 is_fortran (const_tree decl)
5445 if (in_lto_p)
5447 const_tree context = get_ultimate_context (decl);
5448 if (context && TRANSLATION_UNIT_LANGUAGE (context))
5449 return (strncmp (TRANSLATION_UNIT_LANGUAGE (context),
5450 "GNU Fortran", 11) == 0
5451 || strcmp (TRANSLATION_UNIT_LANGUAGE (context),
5452 "GNU F77") == 0);
5454 return is_fortran ();
5457 /* Return TRUE if the language is Ada. */
5459 static inline bool
5460 is_ada (void)
5462 unsigned int lang = get_AT_unsigned (comp_unit_die (), DW_AT_language);
5464 return lang == DW_LANG_Ada95 || lang == DW_LANG_Ada83;
5467 /* Remove the specified attribute if present. Return TRUE if removal
5468 was successful. */
5470 static bool
5471 remove_AT (dw_die_ref die, enum dwarf_attribute attr_kind)
5473 dw_attr_node *a;
5474 unsigned ix;
5476 if (! die)
5477 return false;
5479 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
5480 if (a->dw_attr == attr_kind)
5482 if (AT_class (a) == dw_val_class_str)
5483 if (a->dw_attr_val.v.val_str->refcount)
5484 a->dw_attr_val.v.val_str->refcount--;
5486 /* vec::ordered_remove should help reduce the number of abbrevs
5487 that are needed. */
5488 die->die_attr->ordered_remove (ix);
5489 return true;
5491 return false;
5494 /* Remove CHILD from its parent. PREV must have the property that
5495 PREV->DIE_SIB == CHILD. Does not alter CHILD. */
5497 static void
5498 remove_child_with_prev (dw_die_ref child, dw_die_ref prev)
5500 gcc_assert (child->die_parent == prev->die_parent);
5501 gcc_assert (prev->die_sib == child);
5502 if (prev == child)
5504 gcc_assert (child->die_parent->die_child == child);
5505 prev = NULL;
5507 else
5508 prev->die_sib = child->die_sib;
5509 if (child->die_parent->die_child == child)
5510 child->die_parent->die_child = prev;
5511 child->die_sib = NULL;
5514 /* Replace OLD_CHILD with NEW_CHILD. PREV must have the property that
5515 PREV->DIE_SIB == OLD_CHILD. Does not alter OLD_CHILD. */
5517 static void
5518 replace_child (dw_die_ref old_child, dw_die_ref new_child, dw_die_ref prev)
5520 dw_die_ref parent = old_child->die_parent;
5522 gcc_assert (parent == prev->die_parent);
5523 gcc_assert (prev->die_sib == old_child);
5525 new_child->die_parent = parent;
5526 if (prev == old_child)
5528 gcc_assert (parent->die_child == old_child);
5529 new_child->die_sib = new_child;
5531 else
5533 prev->die_sib = new_child;
5534 new_child->die_sib = old_child->die_sib;
5536 if (old_child->die_parent->die_child == old_child)
5537 old_child->die_parent->die_child = new_child;
5538 old_child->die_sib = NULL;
5541 /* Move all children from OLD_PARENT to NEW_PARENT. */
5543 static void
5544 move_all_children (dw_die_ref old_parent, dw_die_ref new_parent)
5546 dw_die_ref c;
5547 new_parent->die_child = old_parent->die_child;
5548 old_parent->die_child = NULL;
5549 FOR_EACH_CHILD (new_parent, c, c->die_parent = new_parent);
5552 /* Remove child DIE whose die_tag is TAG. Do nothing if no child
5553 matches TAG. */
5555 static void
5556 remove_child_TAG (dw_die_ref die, enum dwarf_tag tag)
5558 dw_die_ref c;
5560 c = die->die_child;
5561 if (c) do {
5562 dw_die_ref prev = c;
5563 c = c->die_sib;
5564 while (c->die_tag == tag)
5566 remove_child_with_prev (c, prev);
5567 c->die_parent = NULL;
5568 /* Might have removed every child. */
5569 if (die->die_child == NULL)
5570 return;
5571 c = prev->die_sib;
5573 } while (c != die->die_child);
5576 /* Add a CHILD_DIE as the last child of DIE. */
5578 static void
5579 add_child_die (dw_die_ref die, dw_die_ref child_die)
5581 /* FIXME this should probably be an assert. */
5582 if (! die || ! child_die)
5583 return;
5584 gcc_assert (die != child_die);
5586 child_die->die_parent = die;
5587 if (die->die_child)
5589 child_die->die_sib = die->die_child->die_sib;
5590 die->die_child->die_sib = child_die;
5592 else
5593 child_die->die_sib = child_die;
5594 die->die_child = child_die;
5597 /* Like add_child_die, but put CHILD_DIE after AFTER_DIE. */
5599 static void
5600 add_child_die_after (dw_die_ref die, dw_die_ref child_die,
5601 dw_die_ref after_die)
5603 gcc_assert (die
5604 && child_die
5605 && after_die
5606 && die->die_child
5607 && die != child_die);
5609 child_die->die_parent = die;
5610 child_die->die_sib = after_die->die_sib;
5611 after_die->die_sib = child_die;
5612 if (die->die_child == after_die)
5613 die->die_child = child_die;
5616 /* Unassociate CHILD from its parent, and make its parent be
5617 NEW_PARENT. */
5619 static void
5620 reparent_child (dw_die_ref child, dw_die_ref new_parent)
5622 for (dw_die_ref p = child->die_parent->die_child; ; p = p->die_sib)
5623 if (p->die_sib == child)
5625 remove_child_with_prev (child, p);
5626 break;
5628 add_child_die (new_parent, child);
5631 /* Move CHILD, which must be a child of PARENT or the DIE for which PARENT
5632 is the specification, to the end of PARENT's list of children.
5633 This is done by removing and re-adding it. */
5635 static void
5636 splice_child_die (dw_die_ref parent, dw_die_ref child)
5638 /* We want the declaration DIE from inside the class, not the
5639 specification DIE at toplevel. */
5640 if (child->die_parent != parent)
5642 dw_die_ref tmp = get_AT_ref (child, DW_AT_specification);
5644 if (tmp)
5645 child = tmp;
5648 gcc_assert (child->die_parent == parent
5649 || (child->die_parent
5650 == get_AT_ref (parent, DW_AT_specification)));
5652 reparent_child (child, parent);
5655 /* Create and return a new die with TAG_VALUE as tag. */
5657 static inline dw_die_ref
5658 new_die_raw (enum dwarf_tag tag_value)
5660 dw_die_ref die = ggc_cleared_alloc<die_node> ();
5661 die->die_tag = tag_value;
5662 return die;
5665 /* Create and return a new die with a parent of PARENT_DIE. If
5666 PARENT_DIE is NULL, the new DIE is placed in limbo and an
5667 associated tree T must be supplied to determine parenthood
5668 later. */
5670 static inline dw_die_ref
5671 new_die (enum dwarf_tag tag_value, dw_die_ref parent_die, tree t)
5673 dw_die_ref die = new_die_raw (tag_value);
5675 if (parent_die != NULL)
5676 add_child_die (parent_die, die);
5677 else
5679 limbo_die_node *limbo_node;
5681 /* No DIEs created after early dwarf should end up in limbo,
5682 because the limbo list should not persist past LTO
5683 streaming. */
5684 if (tag_value != DW_TAG_compile_unit
5685 /* These are allowed because they're generated while
5686 breaking out COMDAT units late. */
5687 && tag_value != DW_TAG_type_unit
5688 && tag_value != DW_TAG_skeleton_unit
5689 && !early_dwarf
5690 /* Allow nested functions to live in limbo because they will
5691 only temporarily live there, as decls_for_scope will fix
5692 them up. */
5693 && (TREE_CODE (t) != FUNCTION_DECL
5694 || !decl_function_context (t))
5695 /* Same as nested functions above but for types. Types that
5696 are local to a function will be fixed in
5697 decls_for_scope. */
5698 && (!RECORD_OR_UNION_TYPE_P (t)
5699 || !TYPE_CONTEXT (t)
5700 || TREE_CODE (TYPE_CONTEXT (t)) != FUNCTION_DECL)
5701 /* FIXME debug-early: Allow late limbo DIE creation for LTO,
5702 especially in the ltrans stage, but once we implement LTO
5703 dwarf streaming, we should remove this exception. */
5704 && !in_lto_p)
5706 fprintf (stderr, "symbol ended up in limbo too late:");
5707 debug_generic_stmt (t);
5708 gcc_unreachable ();
5711 limbo_node = ggc_cleared_alloc<limbo_die_node> ();
5712 limbo_node->die = die;
5713 limbo_node->created_for = t;
5714 limbo_node->next = limbo_die_list;
5715 limbo_die_list = limbo_node;
5718 return die;
5721 /* Return the DIE associated with the given type specifier. */
5723 static inline dw_die_ref
5724 lookup_type_die (tree type)
5726 dw_die_ref die = TYPE_SYMTAB_DIE (type);
5727 if (die && die->removed)
5729 TYPE_SYMTAB_DIE (type) = NULL;
5730 return NULL;
5732 return die;
5735 /* Given a TYPE_DIE representing the type TYPE, if TYPE is an
5736 anonymous type named by the typedef TYPE_DIE, return the DIE of the
5737 anonymous type instead the one of the naming typedef. */
5739 static inline dw_die_ref
5740 strip_naming_typedef (tree type, dw_die_ref type_die)
5742 if (type
5743 && TREE_CODE (type) == RECORD_TYPE
5744 && type_die
5745 && type_die->die_tag == DW_TAG_typedef
5746 && is_naming_typedef_decl (TYPE_NAME (type)))
5747 type_die = get_AT_ref (type_die, DW_AT_type);
5748 return type_die;
5751 /* Like lookup_type_die, but if type is an anonymous type named by a
5752 typedef[1], return the DIE of the anonymous type instead the one of
5753 the naming typedef. This is because in gen_typedef_die, we did
5754 equate the anonymous struct named by the typedef with the DIE of
5755 the naming typedef. So by default, lookup_type_die on an anonymous
5756 struct yields the DIE of the naming typedef.
5758 [1]: Read the comment of is_naming_typedef_decl to learn about what
5759 a naming typedef is. */
5761 static inline dw_die_ref
5762 lookup_type_die_strip_naming_typedef (tree type)
5764 dw_die_ref die = lookup_type_die (type);
5765 return strip_naming_typedef (type, die);
5768 /* Equate a DIE to a given type specifier. */
5770 static inline void
5771 equate_type_number_to_die (tree type, dw_die_ref type_die)
5773 TYPE_SYMTAB_DIE (type) = type_die;
5776 /* Returns a hash value for X (which really is a die_struct). */
5778 inline hashval_t
5779 decl_die_hasher::hash (die_node *x)
5781 return (hashval_t) x->decl_id;
5784 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y. */
5786 inline bool
5787 decl_die_hasher::equal (die_node *x, tree y)
5789 return (x->decl_id == DECL_UID (y));
5792 /* Return the DIE associated with a given declaration. */
5794 static inline dw_die_ref
5795 lookup_decl_die (tree decl)
5797 dw_die_ref *die = decl_die_table->find_slot_with_hash (decl, DECL_UID (decl),
5798 NO_INSERT);
5799 if (!die)
5800 return NULL;
5801 if ((*die)->removed)
5803 decl_die_table->clear_slot (die);
5804 return NULL;
5806 return *die;
5810 /* For DECL which might have early dwarf output query a SYMBOL + OFFSET
5811 style reference. Return true if we found one refering to a DIE for
5812 DECL, otherwise return false. */
5814 static bool
5815 dwarf2out_die_ref_for_decl (tree decl, const char **sym,
5816 unsigned HOST_WIDE_INT *off)
5818 dw_die_ref die;
5820 if (flag_wpa && !decl_die_table)
5821 return false;
5823 if (TREE_CODE (decl) == BLOCK)
5824 die = BLOCK_DIE (decl);
5825 else
5826 die = lookup_decl_die (decl);
5827 if (!die)
5828 return false;
5830 /* During WPA stage we currently use DIEs to store the
5831 decl <-> label + offset map. That's quite inefficient but it
5832 works for now. */
5833 if (flag_wpa)
5835 dw_die_ref ref = get_AT_ref (die, DW_AT_abstract_origin);
5836 if (!ref)
5838 gcc_assert (die == comp_unit_die ());
5839 return false;
5841 *off = ref->die_offset;
5842 *sym = ref->die_id.die_symbol;
5843 return true;
5846 /* Similar to get_ref_die_offset_label, but using the "correct"
5847 label. */
5848 *off = die->die_offset;
5849 while (die->die_parent)
5850 die = die->die_parent;
5851 /* For the containing CU DIE we compute a die_symbol in
5852 compute_comp_unit_symbol. */
5853 gcc_assert (die->die_tag == DW_TAG_compile_unit
5854 && die->die_id.die_symbol != NULL);
5855 *sym = die->die_id.die_symbol;
5856 return true;
5859 /* Add a reference of kind ATTR_KIND to a DIE at SYMBOL + OFFSET to DIE. */
5861 static void
5862 add_AT_external_die_ref (dw_die_ref die, enum dwarf_attribute attr_kind,
5863 const char *symbol, HOST_WIDE_INT offset)
5865 /* Create a fake DIE that contains the reference. Don't use
5866 new_die because we don't want to end up in the limbo list. */
5867 dw_die_ref ref = new_die_raw (die->die_tag);
5868 ref->die_id.die_symbol = IDENTIFIER_POINTER (get_identifier (symbol));
5869 ref->die_offset = offset;
5870 ref->with_offset = 1;
5871 add_AT_die_ref (die, attr_kind, ref);
5874 /* Create a DIE for DECL if required and add a reference to a DIE
5875 at SYMBOL + OFFSET which contains attributes dumped early. */
5877 static void
5878 dwarf2out_register_external_die (tree decl, const char *sym,
5879 unsigned HOST_WIDE_INT off)
5881 if (debug_info_level == DINFO_LEVEL_NONE)
5882 return;
5884 if (flag_wpa && !decl_die_table)
5885 decl_die_table = hash_table<decl_die_hasher>::create_ggc (1000);
5887 dw_die_ref die
5888 = TREE_CODE (decl) == BLOCK ? BLOCK_DIE (decl) : lookup_decl_die (decl);
5889 gcc_assert (!die);
5891 tree ctx;
5892 dw_die_ref parent = NULL;
5893 /* Need to lookup a DIE for the decls context - the containing
5894 function or translation unit. */
5895 if (TREE_CODE (decl) == BLOCK)
5897 ctx = BLOCK_SUPERCONTEXT (decl);
5898 /* ??? We do not output DIEs for all scopes thus skip as
5899 many DIEs as needed. */
5900 while (TREE_CODE (ctx) == BLOCK
5901 && !BLOCK_DIE (ctx))
5902 ctx = BLOCK_SUPERCONTEXT (ctx);
5904 else
5905 ctx = DECL_CONTEXT (decl);
5906 while (ctx && TYPE_P (ctx))
5907 ctx = TYPE_CONTEXT (ctx);
5908 if (ctx)
5910 if (TREE_CODE (ctx) == BLOCK)
5911 parent = BLOCK_DIE (ctx);
5912 else if (TREE_CODE (ctx) == TRANSLATION_UNIT_DECL
5913 /* Keep the 1:1 association during WPA. */
5914 && !flag_wpa)
5915 /* Otherwise all late annotations go to the main CU which
5916 imports the original CUs. */
5917 parent = comp_unit_die ();
5918 else if (TREE_CODE (ctx) == FUNCTION_DECL
5919 && TREE_CODE (decl) != PARM_DECL
5920 && TREE_CODE (decl) != BLOCK)
5921 /* Leave function local entities parent determination to when
5922 we process scope vars. */
5924 else
5925 parent = lookup_decl_die (ctx);
5927 else
5928 /* In some cases the FEs fail to set DECL_CONTEXT properly.
5929 Handle this case gracefully by globalizing stuff. */
5930 parent = comp_unit_die ();
5931 /* Create a DIE "stub". */
5932 switch (TREE_CODE (decl))
5934 case TRANSLATION_UNIT_DECL:
5935 if (! flag_wpa)
5937 die = comp_unit_die ();
5938 dw_die_ref import = new_die (DW_TAG_imported_unit, die, NULL_TREE);
5939 add_AT_external_die_ref (import, DW_AT_import, sym, off);
5940 /* We re-target all CU decls to the LTRANS CU DIE, so no need
5941 to create a DIE for the original CUs. */
5942 return;
5944 /* Keep the 1:1 association during WPA. */
5945 die = new_die (DW_TAG_compile_unit, NULL, decl);
5946 break;
5947 case NAMESPACE_DECL:
5948 if (is_fortran (decl))
5949 die = new_die (DW_TAG_module, parent, decl);
5950 else
5951 die = new_die (DW_TAG_namespace, parent, decl);
5952 break;
5953 case FUNCTION_DECL:
5954 die = new_die (DW_TAG_subprogram, parent, decl);
5955 break;
5956 case VAR_DECL:
5957 die = new_die (DW_TAG_variable, parent, decl);
5958 break;
5959 case RESULT_DECL:
5960 die = new_die (DW_TAG_variable, parent, decl);
5961 break;
5962 case PARM_DECL:
5963 die = new_die (DW_TAG_formal_parameter, parent, decl);
5964 break;
5965 case CONST_DECL:
5966 die = new_die (DW_TAG_constant, parent, decl);
5967 break;
5968 case LABEL_DECL:
5969 die = new_die (DW_TAG_label, parent, decl);
5970 break;
5971 case BLOCK:
5972 die = new_die (DW_TAG_lexical_block, parent, decl);
5973 break;
5974 default:
5975 gcc_unreachable ();
5977 if (TREE_CODE (decl) == BLOCK)
5978 BLOCK_DIE (decl) = die;
5979 else
5980 equate_decl_number_to_die (decl, die);
5982 /* Add a reference to the DIE providing early debug at $sym + off. */
5983 add_AT_external_die_ref (die, DW_AT_abstract_origin, sym, off);
5986 /* Returns a hash value for X (which really is a var_loc_list). */
5988 inline hashval_t
5989 decl_loc_hasher::hash (var_loc_list *x)
5991 return (hashval_t) x->decl_id;
5994 /* Return nonzero if decl_id of var_loc_list X is the same as
5995 UID of decl *Y. */
5997 inline bool
5998 decl_loc_hasher::equal (var_loc_list *x, const_tree y)
6000 return (x->decl_id == DECL_UID (y));
6003 /* Return the var_loc list associated with a given declaration. */
6005 static inline var_loc_list *
6006 lookup_decl_loc (const_tree decl)
6008 if (!decl_loc_table)
6009 return NULL;
6010 return decl_loc_table->find_with_hash (decl, DECL_UID (decl));
6013 /* Returns a hash value for X (which really is a cached_dw_loc_list_list). */
6015 inline hashval_t
6016 dw_loc_list_hasher::hash (cached_dw_loc_list *x)
6018 return (hashval_t) x->decl_id;
6021 /* Return nonzero if decl_id of cached_dw_loc_list X is the same as
6022 UID of decl *Y. */
6024 inline bool
6025 dw_loc_list_hasher::equal (cached_dw_loc_list *x, const_tree y)
6027 return (x->decl_id == DECL_UID (y));
6030 /* Equate a DIE to a particular declaration. */
6032 static void
6033 equate_decl_number_to_die (tree decl, dw_die_ref decl_die)
6035 unsigned int decl_id = DECL_UID (decl);
6037 *decl_die_table->find_slot_with_hash (decl, decl_id, INSERT) = decl_die;
6038 decl_die->decl_id = decl_id;
6041 /* Return how many bits covers PIECE EXPR_LIST. */
6043 static HOST_WIDE_INT
6044 decl_piece_bitsize (rtx piece)
6046 int ret = (int) GET_MODE (piece);
6047 if (ret)
6048 return ret;
6049 gcc_assert (GET_CODE (XEXP (piece, 0)) == CONCAT
6050 && CONST_INT_P (XEXP (XEXP (piece, 0), 0)));
6051 return INTVAL (XEXP (XEXP (piece, 0), 0));
6054 /* Return pointer to the location of location note in PIECE EXPR_LIST. */
6056 static rtx *
6057 decl_piece_varloc_ptr (rtx piece)
6059 if ((int) GET_MODE (piece))
6060 return &XEXP (piece, 0);
6061 else
6062 return &XEXP (XEXP (piece, 0), 1);
6065 /* Create an EXPR_LIST for location note LOC_NOTE covering BITSIZE bits.
6066 Next is the chain of following piece nodes. */
6068 static rtx_expr_list *
6069 decl_piece_node (rtx loc_note, HOST_WIDE_INT bitsize, rtx next)
6071 if (bitsize > 0 && bitsize <= (int) MAX_MACHINE_MODE)
6072 return alloc_EXPR_LIST (bitsize, loc_note, next);
6073 else
6074 return alloc_EXPR_LIST (0, gen_rtx_CONCAT (VOIDmode,
6075 GEN_INT (bitsize),
6076 loc_note), next);
6079 /* Return rtx that should be stored into loc field for
6080 LOC_NOTE and BITPOS/BITSIZE. */
6082 static rtx
6083 construct_piece_list (rtx loc_note, HOST_WIDE_INT bitpos,
6084 HOST_WIDE_INT bitsize)
6086 if (bitsize != -1)
6088 loc_note = decl_piece_node (loc_note, bitsize, NULL_RTX);
6089 if (bitpos != 0)
6090 loc_note = decl_piece_node (NULL_RTX, bitpos, loc_note);
6092 return loc_note;
6095 /* This function either modifies location piece list *DEST in
6096 place (if SRC and INNER is NULL), or copies location piece list
6097 *SRC to *DEST while modifying it. Location BITPOS is modified
6098 to contain LOC_NOTE, any pieces overlapping it are removed resp.
6099 not copied and if needed some padding around it is added.
6100 When modifying in place, DEST should point to EXPR_LIST where
6101 earlier pieces cover PIECE_BITPOS bits, when copying SRC points
6102 to the start of the whole list and INNER points to the EXPR_LIST
6103 where earlier pieces cover PIECE_BITPOS bits. */
6105 static void
6106 adjust_piece_list (rtx *dest, rtx *src, rtx *inner,
6107 HOST_WIDE_INT bitpos, HOST_WIDE_INT piece_bitpos,
6108 HOST_WIDE_INT bitsize, rtx loc_note)
6110 HOST_WIDE_INT diff;
6111 bool copy = inner != NULL;
6113 if (copy)
6115 /* First copy all nodes preceding the current bitpos. */
6116 while (src != inner)
6118 *dest = decl_piece_node (*decl_piece_varloc_ptr (*src),
6119 decl_piece_bitsize (*src), NULL_RTX);
6120 dest = &XEXP (*dest, 1);
6121 src = &XEXP (*src, 1);
6124 /* Add padding if needed. */
6125 if (bitpos != piece_bitpos)
6127 *dest = decl_piece_node (NULL_RTX, bitpos - piece_bitpos,
6128 copy ? NULL_RTX : *dest);
6129 dest = &XEXP (*dest, 1);
6131 else if (*dest && decl_piece_bitsize (*dest) == bitsize)
6133 gcc_assert (!copy);
6134 /* A piece with correct bitpos and bitsize already exist,
6135 just update the location for it and return. */
6136 *decl_piece_varloc_ptr (*dest) = loc_note;
6137 return;
6139 /* Add the piece that changed. */
6140 *dest = decl_piece_node (loc_note, bitsize, copy ? NULL_RTX : *dest);
6141 dest = &XEXP (*dest, 1);
6142 /* Skip over pieces that overlap it. */
6143 diff = bitpos - piece_bitpos + bitsize;
6144 if (!copy)
6145 src = dest;
6146 while (diff > 0 && *src)
6148 rtx piece = *src;
6149 diff -= decl_piece_bitsize (piece);
6150 if (copy)
6151 src = &XEXP (piece, 1);
6152 else
6154 *src = XEXP (piece, 1);
6155 free_EXPR_LIST_node (piece);
6158 /* Add padding if needed. */
6159 if (diff < 0 && *src)
6161 if (!copy)
6162 dest = src;
6163 *dest = decl_piece_node (NULL_RTX, -diff, copy ? NULL_RTX : *dest);
6164 dest = &XEXP (*dest, 1);
6166 if (!copy)
6167 return;
6168 /* Finally copy all nodes following it. */
6169 while (*src)
6171 *dest = decl_piece_node (*decl_piece_varloc_ptr (*src),
6172 decl_piece_bitsize (*src), NULL_RTX);
6173 dest = &XEXP (*dest, 1);
6174 src = &XEXP (*src, 1);
6178 /* Add a variable location node to the linked list for DECL. */
6180 static struct var_loc_node *
6181 add_var_loc_to_decl (tree decl, rtx loc_note, const char *label, var_loc_view view)
6183 unsigned int decl_id;
6184 var_loc_list *temp;
6185 struct var_loc_node *loc = NULL;
6186 HOST_WIDE_INT bitsize = -1, bitpos = -1;
6188 if (VAR_P (decl) && DECL_HAS_DEBUG_EXPR_P (decl))
6190 tree realdecl = DECL_DEBUG_EXPR (decl);
6191 if (handled_component_p (realdecl)
6192 || (TREE_CODE (realdecl) == MEM_REF
6193 && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR))
6195 bool reverse;
6196 tree innerdecl = get_ref_base_and_extent_hwi (realdecl, &bitpos,
6197 &bitsize, &reverse);
6198 if (!innerdecl
6199 || !DECL_P (innerdecl)
6200 || DECL_IGNORED_P (innerdecl)
6201 || TREE_STATIC (innerdecl)
6202 || bitsize == 0
6203 || bitpos + bitsize > 256)
6204 return NULL;
6205 decl = innerdecl;
6209 decl_id = DECL_UID (decl);
6210 var_loc_list **slot
6211 = decl_loc_table->find_slot_with_hash (decl, decl_id, INSERT);
6212 if (*slot == NULL)
6214 temp = ggc_cleared_alloc<var_loc_list> ();
6215 temp->decl_id = decl_id;
6216 *slot = temp;
6218 else
6219 temp = *slot;
6221 /* For PARM_DECLs try to keep around the original incoming value,
6222 even if that means we'll emit a zero-range .debug_loc entry. */
6223 if (temp->last
6224 && temp->first == temp->last
6225 && TREE_CODE (decl) == PARM_DECL
6226 && NOTE_P (temp->first->loc)
6227 && NOTE_VAR_LOCATION_DECL (temp->first->loc) == decl
6228 && DECL_INCOMING_RTL (decl)
6229 && NOTE_VAR_LOCATION_LOC (temp->first->loc)
6230 && GET_CODE (NOTE_VAR_LOCATION_LOC (temp->first->loc))
6231 == GET_CODE (DECL_INCOMING_RTL (decl))
6232 && prev_real_insn (as_a<rtx_insn *> (temp->first->loc)) == NULL_RTX
6233 && (bitsize != -1
6234 || !rtx_equal_p (NOTE_VAR_LOCATION_LOC (temp->first->loc),
6235 NOTE_VAR_LOCATION_LOC (loc_note))
6236 || (NOTE_VAR_LOCATION_STATUS (temp->first->loc)
6237 != NOTE_VAR_LOCATION_STATUS (loc_note))))
6239 loc = ggc_cleared_alloc<var_loc_node> ();
6240 temp->first->next = loc;
6241 temp->last = loc;
6242 loc->loc = construct_piece_list (loc_note, bitpos, bitsize);
6244 else if (temp->last)
6246 struct var_loc_node *last = temp->last, *unused = NULL;
6247 rtx *piece_loc = NULL, last_loc_note;
6248 HOST_WIDE_INT piece_bitpos = 0;
6249 if (last->next)
6251 last = last->next;
6252 gcc_assert (last->next == NULL);
6254 if (bitsize != -1 && GET_CODE (last->loc) == EXPR_LIST)
6256 piece_loc = &last->loc;
6259 HOST_WIDE_INT cur_bitsize = decl_piece_bitsize (*piece_loc);
6260 if (piece_bitpos + cur_bitsize > bitpos)
6261 break;
6262 piece_bitpos += cur_bitsize;
6263 piece_loc = &XEXP (*piece_loc, 1);
6265 while (*piece_loc);
6267 /* TEMP->LAST here is either pointer to the last but one or
6268 last element in the chained list, LAST is pointer to the
6269 last element. */
6270 if (label && strcmp (last->label, label) == 0 && last->view == view)
6272 /* For SRA optimized variables if there weren't any real
6273 insns since last note, just modify the last node. */
6274 if (piece_loc != NULL)
6276 adjust_piece_list (piece_loc, NULL, NULL,
6277 bitpos, piece_bitpos, bitsize, loc_note);
6278 return NULL;
6280 /* If the last note doesn't cover any instructions, remove it. */
6281 if (temp->last != last)
6283 temp->last->next = NULL;
6284 unused = last;
6285 last = temp->last;
6286 gcc_assert (strcmp (last->label, label) != 0 || last->view != view);
6288 else
6290 gcc_assert (temp->first == temp->last
6291 || (temp->first->next == temp->last
6292 && TREE_CODE (decl) == PARM_DECL));
6293 memset (temp->last, '\0', sizeof (*temp->last));
6294 temp->last->loc = construct_piece_list (loc_note, bitpos, bitsize);
6295 return temp->last;
6298 if (bitsize == -1 && NOTE_P (last->loc))
6299 last_loc_note = last->loc;
6300 else if (piece_loc != NULL
6301 && *piece_loc != NULL_RTX
6302 && piece_bitpos == bitpos
6303 && decl_piece_bitsize (*piece_loc) == bitsize)
6304 last_loc_note = *decl_piece_varloc_ptr (*piece_loc);
6305 else
6306 last_loc_note = NULL_RTX;
6307 /* If the current location is the same as the end of the list,
6308 and either both or neither of the locations is uninitialized,
6309 we have nothing to do. */
6310 if (last_loc_note == NULL_RTX
6311 || (!rtx_equal_p (NOTE_VAR_LOCATION_LOC (last_loc_note),
6312 NOTE_VAR_LOCATION_LOC (loc_note)))
6313 || ((NOTE_VAR_LOCATION_STATUS (last_loc_note)
6314 != NOTE_VAR_LOCATION_STATUS (loc_note))
6315 && ((NOTE_VAR_LOCATION_STATUS (last_loc_note)
6316 == VAR_INIT_STATUS_UNINITIALIZED)
6317 || (NOTE_VAR_LOCATION_STATUS (loc_note)
6318 == VAR_INIT_STATUS_UNINITIALIZED))))
6320 /* Add LOC to the end of list and update LAST. If the last
6321 element of the list has been removed above, reuse its
6322 memory for the new node, otherwise allocate a new one. */
6323 if (unused)
6325 loc = unused;
6326 memset (loc, '\0', sizeof (*loc));
6328 else
6329 loc = ggc_cleared_alloc<var_loc_node> ();
6330 if (bitsize == -1 || piece_loc == NULL)
6331 loc->loc = construct_piece_list (loc_note, bitpos, bitsize);
6332 else
6333 adjust_piece_list (&loc->loc, &last->loc, piece_loc,
6334 bitpos, piece_bitpos, bitsize, loc_note);
6335 last->next = loc;
6336 /* Ensure TEMP->LAST will point either to the new last but one
6337 element of the chain, or to the last element in it. */
6338 if (last != temp->last)
6339 temp->last = last;
6341 else if (unused)
6342 ggc_free (unused);
6344 else
6346 loc = ggc_cleared_alloc<var_loc_node> ();
6347 temp->first = loc;
6348 temp->last = loc;
6349 loc->loc = construct_piece_list (loc_note, bitpos, bitsize);
6351 return loc;
6354 /* Keep track of the number of spaces used to indent the
6355 output of the debugging routines that print the structure of
6356 the DIE internal representation. */
6357 static int print_indent;
6359 /* Indent the line the number of spaces given by print_indent. */
6361 static inline void
6362 print_spaces (FILE *outfile)
6364 fprintf (outfile, "%*s", print_indent, "");
6367 /* Print a type signature in hex. */
6369 static inline void
6370 print_signature (FILE *outfile, char *sig)
6372 int i;
6374 for (i = 0; i < DWARF_TYPE_SIGNATURE_SIZE; i++)
6375 fprintf (outfile, "%02x", sig[i] & 0xff);
6378 static inline void
6379 print_discr_value (FILE *outfile, dw_discr_value *discr_value)
6381 if (discr_value->pos)
6382 fprintf (outfile, HOST_WIDE_INT_PRINT_UNSIGNED, discr_value->v.sval);
6383 else
6384 fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, discr_value->v.uval);
6387 static void print_loc_descr (dw_loc_descr_ref, FILE *);
6389 /* Print the value associated to the VAL DWARF value node to OUTFILE. If
6390 RECURSE, output location descriptor operations. */
6392 static void
6393 print_dw_val (dw_val_node *val, bool recurse, FILE *outfile)
6395 switch (val->val_class)
6397 case dw_val_class_addr:
6398 fprintf (outfile, "address");
6399 break;
6400 case dw_val_class_offset:
6401 fprintf (outfile, "offset");
6402 break;
6403 case dw_val_class_loc:
6404 fprintf (outfile, "location descriptor");
6405 if (val->v.val_loc == NULL)
6406 fprintf (outfile, " -> <null>\n");
6407 else if (recurse)
6409 fprintf (outfile, ":\n");
6410 print_indent += 4;
6411 print_loc_descr (val->v.val_loc, outfile);
6412 print_indent -= 4;
6414 else
6415 fprintf (outfile, " (%p)\n", (void *) val->v.val_loc);
6416 break;
6417 case dw_val_class_loc_list:
6418 fprintf (outfile, "location list -> label:%s",
6419 val->v.val_loc_list->ll_symbol);
6420 break;
6421 case dw_val_class_view_list:
6422 val = view_list_to_loc_list_val_node (val);
6423 fprintf (outfile, "location list with views -> labels:%s and %s",
6424 val->v.val_loc_list->ll_symbol,
6425 val->v.val_loc_list->vl_symbol);
6426 break;
6427 case dw_val_class_range_list:
6428 fprintf (outfile, "range list");
6429 break;
6430 case dw_val_class_const:
6431 case dw_val_class_const_implicit:
6432 fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, val->v.val_int);
6433 break;
6434 case dw_val_class_unsigned_const:
6435 case dw_val_class_unsigned_const_implicit:
6436 fprintf (outfile, HOST_WIDE_INT_PRINT_UNSIGNED, val->v.val_unsigned);
6437 break;
6438 case dw_val_class_const_double:
6439 fprintf (outfile, "constant (" HOST_WIDE_INT_PRINT_DEC","\
6440 HOST_WIDE_INT_PRINT_UNSIGNED")",
6441 val->v.val_double.high,
6442 val->v.val_double.low);
6443 break;
6444 case dw_val_class_wide_int:
6446 int i = val->v.val_wide->get_len ();
6447 fprintf (outfile, "constant (");
6448 gcc_assert (i > 0);
6449 if (val->v.val_wide->elt (i - 1) == 0)
6450 fprintf (outfile, "0x");
6451 fprintf (outfile, HOST_WIDE_INT_PRINT_HEX,
6452 val->v.val_wide->elt (--i));
6453 while (--i >= 0)
6454 fprintf (outfile, HOST_WIDE_INT_PRINT_PADDED_HEX,
6455 val->v.val_wide->elt (i));
6456 fprintf (outfile, ")");
6457 break;
6459 case dw_val_class_vec:
6460 fprintf (outfile, "floating-point or vector constant");
6461 break;
6462 case dw_val_class_flag:
6463 fprintf (outfile, "%u", val->v.val_flag);
6464 break;
6465 case dw_val_class_die_ref:
6466 if (val->v.val_die_ref.die != NULL)
6468 dw_die_ref die = val->v.val_die_ref.die;
6470 if (die->comdat_type_p)
6472 fprintf (outfile, "die -> signature: ");
6473 print_signature (outfile,
6474 die->die_id.die_type_node->signature);
6476 else if (die->die_id.die_symbol)
6478 fprintf (outfile, "die -> label: %s", die->die_id.die_symbol);
6479 if (die->with_offset)
6480 fprintf (outfile, " + %ld", die->die_offset);
6482 else
6483 fprintf (outfile, "die -> %ld", die->die_offset);
6484 fprintf (outfile, " (%p)", (void *) die);
6486 else
6487 fprintf (outfile, "die -> <null>");
6488 break;
6489 case dw_val_class_vms_delta:
6490 fprintf (outfile, "delta: @slotcount(%s-%s)",
6491 val->v.val_vms_delta.lbl2, val->v.val_vms_delta.lbl1);
6492 break;
6493 case dw_val_class_symview:
6494 fprintf (outfile, "view: %s", val->v.val_symbolic_view);
6495 break;
6496 case dw_val_class_lbl_id:
6497 case dw_val_class_lineptr:
6498 case dw_val_class_macptr:
6499 case dw_val_class_loclistsptr:
6500 case dw_val_class_high_pc:
6501 fprintf (outfile, "label: %s", val->v.val_lbl_id);
6502 break;
6503 case dw_val_class_str:
6504 if (val->v.val_str->str != NULL)
6505 fprintf (outfile, "\"%s\"", val->v.val_str->str);
6506 else
6507 fprintf (outfile, "<null>");
6508 break;
6509 case dw_val_class_file:
6510 case dw_val_class_file_implicit:
6511 fprintf (outfile, "\"%s\" (%d)", val->v.val_file->filename,
6512 val->v.val_file->emitted_number);
6513 break;
6514 case dw_val_class_data8:
6516 int i;
6518 for (i = 0; i < 8; i++)
6519 fprintf (outfile, "%02x", val->v.val_data8[i]);
6520 break;
6522 case dw_val_class_discr_value:
6523 print_discr_value (outfile, &val->v.val_discr_value);
6524 break;
6525 case dw_val_class_discr_list:
6526 for (dw_discr_list_ref node = val->v.val_discr_list;
6527 node != NULL;
6528 node = node->dw_discr_next)
6530 if (node->dw_discr_range)
6532 fprintf (outfile, " .. ");
6533 print_discr_value (outfile, &node->dw_discr_lower_bound);
6534 print_discr_value (outfile, &node->dw_discr_upper_bound);
6536 else
6537 print_discr_value (outfile, &node->dw_discr_lower_bound);
6539 if (node->dw_discr_next != NULL)
6540 fprintf (outfile, " | ");
6542 default:
6543 break;
6547 /* Likewise, for a DIE attribute. */
6549 static void
6550 print_attribute (dw_attr_node *a, bool recurse, FILE *outfile)
6552 print_dw_val (&a->dw_attr_val, recurse, outfile);
6556 /* Print the list of operands in the LOC location description to OUTFILE. This
6557 routine is a debugging aid only. */
6559 static void
6560 print_loc_descr (dw_loc_descr_ref loc, FILE *outfile)
6562 dw_loc_descr_ref l = loc;
6564 if (loc == NULL)
6566 print_spaces (outfile);
6567 fprintf (outfile, "<null>\n");
6568 return;
6571 for (l = loc; l != NULL; l = l->dw_loc_next)
6573 print_spaces (outfile);
6574 fprintf (outfile, "(%p) %s",
6575 (void *) l,
6576 dwarf_stack_op_name (l->dw_loc_opc));
6577 if (l->dw_loc_oprnd1.val_class != dw_val_class_none)
6579 fprintf (outfile, " ");
6580 print_dw_val (&l->dw_loc_oprnd1, false, outfile);
6582 if (l->dw_loc_oprnd2.val_class != dw_val_class_none)
6584 fprintf (outfile, ", ");
6585 print_dw_val (&l->dw_loc_oprnd2, false, outfile);
6587 fprintf (outfile, "\n");
6591 /* Print the information associated with a given DIE, and its children.
6592 This routine is a debugging aid only. */
6594 static void
6595 print_die (dw_die_ref die, FILE *outfile)
6597 dw_attr_node *a;
6598 dw_die_ref c;
6599 unsigned ix;
6601 print_spaces (outfile);
6602 fprintf (outfile, "DIE %4ld: %s (%p)\n",
6603 die->die_offset, dwarf_tag_name (die->die_tag),
6604 (void*) die);
6605 print_spaces (outfile);
6606 fprintf (outfile, " abbrev id: %lu", die->die_abbrev);
6607 fprintf (outfile, " offset: %ld", die->die_offset);
6608 fprintf (outfile, " mark: %d\n", die->die_mark);
6610 if (die->comdat_type_p)
6612 print_spaces (outfile);
6613 fprintf (outfile, " signature: ");
6614 print_signature (outfile, die->die_id.die_type_node->signature);
6615 fprintf (outfile, "\n");
6618 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
6620 print_spaces (outfile);
6621 fprintf (outfile, " %s: ", dwarf_attr_name (a->dw_attr));
6623 print_attribute (a, true, outfile);
6624 fprintf (outfile, "\n");
6627 if (die->die_child != NULL)
6629 print_indent += 4;
6630 FOR_EACH_CHILD (die, c, print_die (c, outfile));
6631 print_indent -= 4;
6633 if (print_indent == 0)
6634 fprintf (outfile, "\n");
6637 /* Print the list of operations in the LOC location description. */
6639 DEBUG_FUNCTION void
6640 debug_dwarf_loc_descr (dw_loc_descr_ref loc)
6642 print_loc_descr (loc, stderr);
6645 /* Print the information collected for a given DIE. */
6647 DEBUG_FUNCTION void
6648 debug_dwarf_die (dw_die_ref die)
6650 print_die (die, stderr);
6653 DEBUG_FUNCTION void
6654 debug (die_struct &ref)
6656 print_die (&ref, stderr);
6659 DEBUG_FUNCTION void
6660 debug (die_struct *ptr)
6662 if (ptr)
6663 debug (*ptr);
6664 else
6665 fprintf (stderr, "<nil>\n");
6669 /* Print all DWARF information collected for the compilation unit.
6670 This routine is a debugging aid only. */
6672 DEBUG_FUNCTION void
6673 debug_dwarf (void)
6675 print_indent = 0;
6676 print_die (comp_unit_die (), stderr);
6679 /* Verify the DIE tree structure. */
6681 DEBUG_FUNCTION void
6682 verify_die (dw_die_ref die)
6684 gcc_assert (!die->die_mark);
6685 if (die->die_parent == NULL
6686 && die->die_sib == NULL)
6687 return;
6688 /* Verify the die_sib list is cyclic. */
6689 dw_die_ref x = die;
6692 x->die_mark = 1;
6693 x = x->die_sib;
6695 while (x && !x->die_mark);
6696 gcc_assert (x == die);
6697 x = die;
6700 /* Verify all dies have the same parent. */
6701 gcc_assert (x->die_parent == die->die_parent);
6702 if (x->die_child)
6704 /* Verify the child has the proper parent and recurse. */
6705 gcc_assert (x->die_child->die_parent == x);
6706 verify_die (x->die_child);
6708 x->die_mark = 0;
6709 x = x->die_sib;
6711 while (x && x->die_mark);
6714 /* Sanity checks on DIEs. */
6716 static void
6717 check_die (dw_die_ref die)
6719 unsigned ix;
6720 dw_attr_node *a;
6721 bool inline_found = false;
6722 int n_location = 0, n_low_pc = 0, n_high_pc = 0, n_artificial = 0;
6723 int n_decl_line = 0, n_decl_column = 0, n_decl_file = 0;
6724 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
6726 switch (a->dw_attr)
6728 case DW_AT_inline:
6729 if (a->dw_attr_val.v.val_unsigned)
6730 inline_found = true;
6731 break;
6732 case DW_AT_location:
6733 ++n_location;
6734 break;
6735 case DW_AT_low_pc:
6736 ++n_low_pc;
6737 break;
6738 case DW_AT_high_pc:
6739 ++n_high_pc;
6740 break;
6741 case DW_AT_artificial:
6742 ++n_artificial;
6743 break;
6744 case DW_AT_decl_column:
6745 ++n_decl_column;
6746 break;
6747 case DW_AT_decl_line:
6748 ++n_decl_line;
6749 break;
6750 case DW_AT_decl_file:
6751 ++n_decl_file;
6752 break;
6753 default:
6754 break;
6757 if (n_location > 1 || n_low_pc > 1 || n_high_pc > 1 || n_artificial > 1
6758 || n_decl_column > 1 || n_decl_line > 1 || n_decl_file > 1)
6760 fprintf (stderr, "Duplicate attributes in DIE:\n");
6761 debug_dwarf_die (die);
6762 gcc_unreachable ();
6764 if (inline_found)
6766 /* A debugging information entry that is a member of an abstract
6767 instance tree [that has DW_AT_inline] should not contain any
6768 attributes which describe aspects of the subroutine which vary
6769 between distinct inlined expansions or distinct out-of-line
6770 expansions. */
6771 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
6772 gcc_assert (a->dw_attr != DW_AT_low_pc
6773 && a->dw_attr != DW_AT_high_pc
6774 && a->dw_attr != DW_AT_location
6775 && a->dw_attr != DW_AT_frame_base
6776 && a->dw_attr != DW_AT_call_all_calls
6777 && a->dw_attr != DW_AT_GNU_all_call_sites);
6781 #define CHECKSUM(FOO) md5_process_bytes (&(FOO), sizeof (FOO), ctx)
6782 #define CHECKSUM_BLOCK(FOO, SIZE) md5_process_bytes ((FOO), (SIZE), ctx)
6783 #define CHECKSUM_STRING(FOO) md5_process_bytes ((FOO), strlen (FOO), ctx)
6785 /* Calculate the checksum of a location expression. */
6787 static inline void
6788 loc_checksum (dw_loc_descr_ref loc, struct md5_ctx *ctx)
6790 int tem;
6791 inchash::hash hstate;
6792 hashval_t hash;
6794 tem = (loc->dtprel << 8) | ((unsigned int) loc->dw_loc_opc);
6795 CHECKSUM (tem);
6796 hash_loc_operands (loc, hstate);
6797 hash = hstate.end();
6798 CHECKSUM (hash);
6801 /* Calculate the checksum of an attribute. */
6803 static void
6804 attr_checksum (dw_attr_node *at, struct md5_ctx *ctx, int *mark)
6806 dw_loc_descr_ref loc;
6807 rtx r;
6809 CHECKSUM (at->dw_attr);
6811 /* We don't care that this was compiled with a different compiler
6812 snapshot; if the output is the same, that's what matters. */
6813 if (at->dw_attr == DW_AT_producer)
6814 return;
6816 switch (AT_class (at))
6818 case dw_val_class_const:
6819 case dw_val_class_const_implicit:
6820 CHECKSUM (at->dw_attr_val.v.val_int);
6821 break;
6822 case dw_val_class_unsigned_const:
6823 case dw_val_class_unsigned_const_implicit:
6824 CHECKSUM (at->dw_attr_val.v.val_unsigned);
6825 break;
6826 case dw_val_class_const_double:
6827 CHECKSUM (at->dw_attr_val.v.val_double);
6828 break;
6829 case dw_val_class_wide_int:
6830 CHECKSUM_BLOCK (at->dw_attr_val.v.val_wide->get_val (),
6831 get_full_len (*at->dw_attr_val.v.val_wide)
6832 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
6833 break;
6834 case dw_val_class_vec:
6835 CHECKSUM_BLOCK (at->dw_attr_val.v.val_vec.array,
6836 (at->dw_attr_val.v.val_vec.length
6837 * at->dw_attr_val.v.val_vec.elt_size));
6838 break;
6839 case dw_val_class_flag:
6840 CHECKSUM (at->dw_attr_val.v.val_flag);
6841 break;
6842 case dw_val_class_str:
6843 CHECKSUM_STRING (AT_string (at));
6844 break;
6846 case dw_val_class_addr:
6847 r = AT_addr (at);
6848 gcc_assert (GET_CODE (r) == SYMBOL_REF);
6849 CHECKSUM_STRING (XSTR (r, 0));
6850 break;
6852 case dw_val_class_offset:
6853 CHECKSUM (at->dw_attr_val.v.val_offset);
6854 break;
6856 case dw_val_class_loc:
6857 for (loc = AT_loc (at); loc; loc = loc->dw_loc_next)
6858 loc_checksum (loc, ctx);
6859 break;
6861 case dw_val_class_die_ref:
6862 die_checksum (AT_ref (at), ctx, mark);
6863 break;
6865 case dw_val_class_fde_ref:
6866 case dw_val_class_vms_delta:
6867 case dw_val_class_symview:
6868 case dw_val_class_lbl_id:
6869 case dw_val_class_lineptr:
6870 case dw_val_class_macptr:
6871 case dw_val_class_loclistsptr:
6872 case dw_val_class_high_pc:
6873 break;
6875 case dw_val_class_file:
6876 case dw_val_class_file_implicit:
6877 CHECKSUM_STRING (AT_file (at)->filename);
6878 break;
6880 case dw_val_class_data8:
6881 CHECKSUM (at->dw_attr_val.v.val_data8);
6882 break;
6884 default:
6885 break;
6889 /* Calculate the checksum of a DIE. */
6891 static void
6892 die_checksum (dw_die_ref die, struct md5_ctx *ctx, int *mark)
6894 dw_die_ref c;
6895 dw_attr_node *a;
6896 unsigned ix;
6898 /* To avoid infinite recursion. */
6899 if (die->die_mark)
6901 CHECKSUM (die->die_mark);
6902 return;
6904 die->die_mark = ++(*mark);
6906 CHECKSUM (die->die_tag);
6908 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
6909 attr_checksum (a, ctx, mark);
6911 FOR_EACH_CHILD (die, c, die_checksum (c, ctx, mark));
6914 #undef CHECKSUM
6915 #undef CHECKSUM_BLOCK
6916 #undef CHECKSUM_STRING
6918 /* For DWARF-4 types, include the trailing NULL when checksumming strings. */
6919 #define CHECKSUM(FOO) md5_process_bytes (&(FOO), sizeof (FOO), ctx)
6920 #define CHECKSUM_BLOCK(FOO, SIZE) md5_process_bytes ((FOO), (SIZE), ctx)
6921 #define CHECKSUM_STRING(FOO) md5_process_bytes ((FOO), strlen (FOO) + 1, ctx)
6922 #define CHECKSUM_SLEB128(FOO) checksum_sleb128 ((FOO), ctx)
6923 #define CHECKSUM_ULEB128(FOO) checksum_uleb128 ((FOO), ctx)
6924 #define CHECKSUM_ATTR(FOO) \
6925 if (FOO) attr_checksum_ordered (die->die_tag, (FOO), ctx, mark)
6927 /* Calculate the checksum of a number in signed LEB128 format. */
6929 static void
6930 checksum_sleb128 (HOST_WIDE_INT value, struct md5_ctx *ctx)
6932 unsigned char byte;
6933 bool more;
6935 while (1)
6937 byte = (value & 0x7f);
6938 value >>= 7;
6939 more = !((value == 0 && (byte & 0x40) == 0)
6940 || (value == -1 && (byte & 0x40) != 0));
6941 if (more)
6942 byte |= 0x80;
6943 CHECKSUM (byte);
6944 if (!more)
6945 break;
6949 /* Calculate the checksum of a number in unsigned LEB128 format. */
6951 static void
6952 checksum_uleb128 (unsigned HOST_WIDE_INT value, struct md5_ctx *ctx)
6954 while (1)
6956 unsigned char byte = (value & 0x7f);
6957 value >>= 7;
6958 if (value != 0)
6959 /* More bytes to follow. */
6960 byte |= 0x80;
6961 CHECKSUM (byte);
6962 if (value == 0)
6963 break;
6967 /* Checksum the context of the DIE. This adds the names of any
6968 surrounding namespaces or structures to the checksum. */
6970 static void
6971 checksum_die_context (dw_die_ref die, struct md5_ctx *ctx)
6973 const char *name;
6974 dw_die_ref spec;
6975 int tag = die->die_tag;
6977 if (tag != DW_TAG_namespace
6978 && tag != DW_TAG_structure_type
6979 && tag != DW_TAG_class_type)
6980 return;
6982 name = get_AT_string (die, DW_AT_name);
6984 spec = get_AT_ref (die, DW_AT_specification);
6985 if (spec != NULL)
6986 die = spec;
6988 if (die->die_parent != NULL)
6989 checksum_die_context (die->die_parent, ctx);
6991 CHECKSUM_ULEB128 ('C');
6992 CHECKSUM_ULEB128 (tag);
6993 if (name != NULL)
6994 CHECKSUM_STRING (name);
6997 /* Calculate the checksum of a location expression. */
6999 static inline void
7000 loc_checksum_ordered (dw_loc_descr_ref loc, struct md5_ctx *ctx)
7002 /* Special case for lone DW_OP_plus_uconst: checksum as if the location
7003 were emitted as a DW_FORM_sdata instead of a location expression. */
7004 if (loc->dw_loc_opc == DW_OP_plus_uconst && loc->dw_loc_next == NULL)
7006 CHECKSUM_ULEB128 (DW_FORM_sdata);
7007 CHECKSUM_SLEB128 ((HOST_WIDE_INT) loc->dw_loc_oprnd1.v.val_unsigned);
7008 return;
7011 /* Otherwise, just checksum the raw location expression. */
7012 while (loc != NULL)
7014 inchash::hash hstate;
7015 hashval_t hash;
7017 CHECKSUM_ULEB128 (loc->dtprel);
7018 CHECKSUM_ULEB128 (loc->dw_loc_opc);
7019 hash_loc_operands (loc, hstate);
7020 hash = hstate.end ();
7021 CHECKSUM (hash);
7022 loc = loc->dw_loc_next;
7026 /* Calculate the checksum of an attribute. */
7028 static void
7029 attr_checksum_ordered (enum dwarf_tag tag, dw_attr_node *at,
7030 struct md5_ctx *ctx, int *mark)
7032 dw_loc_descr_ref loc;
7033 rtx r;
7035 if (AT_class (at) == dw_val_class_die_ref)
7037 dw_die_ref target_die = AT_ref (at);
7039 /* For pointer and reference types, we checksum only the (qualified)
7040 name of the target type (if there is a name). For friend entries,
7041 we checksum only the (qualified) name of the target type or function.
7042 This allows the checksum to remain the same whether the target type
7043 is complete or not. */
7044 if ((at->dw_attr == DW_AT_type
7045 && (tag == DW_TAG_pointer_type
7046 || tag == DW_TAG_reference_type
7047 || tag == DW_TAG_rvalue_reference_type
7048 || tag == DW_TAG_ptr_to_member_type))
7049 || (at->dw_attr == DW_AT_friend
7050 && tag == DW_TAG_friend))
7052 dw_attr_node *name_attr = get_AT (target_die, DW_AT_name);
7054 if (name_attr != NULL)
7056 dw_die_ref decl = get_AT_ref (target_die, DW_AT_specification);
7058 if (decl == NULL)
7059 decl = target_die;
7060 CHECKSUM_ULEB128 ('N');
7061 CHECKSUM_ULEB128 (at->dw_attr);
7062 if (decl->die_parent != NULL)
7063 checksum_die_context (decl->die_parent, ctx);
7064 CHECKSUM_ULEB128 ('E');
7065 CHECKSUM_STRING (AT_string (name_attr));
7066 return;
7070 /* For all other references to another DIE, we check to see if the
7071 target DIE has already been visited. If it has, we emit a
7072 backward reference; if not, we descend recursively. */
7073 if (target_die->die_mark > 0)
7075 CHECKSUM_ULEB128 ('R');
7076 CHECKSUM_ULEB128 (at->dw_attr);
7077 CHECKSUM_ULEB128 (target_die->die_mark);
7079 else
7081 dw_die_ref decl = get_AT_ref (target_die, DW_AT_specification);
7083 if (decl == NULL)
7084 decl = target_die;
7085 target_die->die_mark = ++(*mark);
7086 CHECKSUM_ULEB128 ('T');
7087 CHECKSUM_ULEB128 (at->dw_attr);
7088 if (decl->die_parent != NULL)
7089 checksum_die_context (decl->die_parent, ctx);
7090 die_checksum_ordered (target_die, ctx, mark);
7092 return;
7095 CHECKSUM_ULEB128 ('A');
7096 CHECKSUM_ULEB128 (at->dw_attr);
7098 switch (AT_class (at))
7100 case dw_val_class_const:
7101 case dw_val_class_const_implicit:
7102 CHECKSUM_ULEB128 (DW_FORM_sdata);
7103 CHECKSUM_SLEB128 (at->dw_attr_val.v.val_int);
7104 break;
7106 case dw_val_class_unsigned_const:
7107 case dw_val_class_unsigned_const_implicit:
7108 CHECKSUM_ULEB128 (DW_FORM_sdata);
7109 CHECKSUM_SLEB128 ((int) at->dw_attr_val.v.val_unsigned);
7110 break;
7112 case dw_val_class_const_double:
7113 CHECKSUM_ULEB128 (DW_FORM_block);
7114 CHECKSUM_ULEB128 (sizeof (at->dw_attr_val.v.val_double));
7115 CHECKSUM (at->dw_attr_val.v.val_double);
7116 break;
7118 case dw_val_class_wide_int:
7119 CHECKSUM_ULEB128 (DW_FORM_block);
7120 CHECKSUM_ULEB128 (get_full_len (*at->dw_attr_val.v.val_wide)
7121 * HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT);
7122 CHECKSUM_BLOCK (at->dw_attr_val.v.val_wide->get_val (),
7123 get_full_len (*at->dw_attr_val.v.val_wide)
7124 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
7125 break;
7127 case dw_val_class_vec:
7128 CHECKSUM_ULEB128 (DW_FORM_block);
7129 CHECKSUM_ULEB128 (at->dw_attr_val.v.val_vec.length
7130 * at->dw_attr_val.v.val_vec.elt_size);
7131 CHECKSUM_BLOCK (at->dw_attr_val.v.val_vec.array,
7132 (at->dw_attr_val.v.val_vec.length
7133 * at->dw_attr_val.v.val_vec.elt_size));
7134 break;
7136 case dw_val_class_flag:
7137 CHECKSUM_ULEB128 (DW_FORM_flag);
7138 CHECKSUM_ULEB128 (at->dw_attr_val.v.val_flag ? 1 : 0);
7139 break;
7141 case dw_val_class_str:
7142 CHECKSUM_ULEB128 (DW_FORM_string);
7143 CHECKSUM_STRING (AT_string (at));
7144 break;
7146 case dw_val_class_addr:
7147 r = AT_addr (at);
7148 gcc_assert (GET_CODE (r) == SYMBOL_REF);
7149 CHECKSUM_ULEB128 (DW_FORM_string);
7150 CHECKSUM_STRING (XSTR (r, 0));
7151 break;
7153 case dw_val_class_offset:
7154 CHECKSUM_ULEB128 (DW_FORM_sdata);
7155 CHECKSUM_ULEB128 (at->dw_attr_val.v.val_offset);
7156 break;
7158 case dw_val_class_loc:
7159 for (loc = AT_loc (at); loc; loc = loc->dw_loc_next)
7160 loc_checksum_ordered (loc, ctx);
7161 break;
7163 case dw_val_class_fde_ref:
7164 case dw_val_class_symview:
7165 case dw_val_class_lbl_id:
7166 case dw_val_class_lineptr:
7167 case dw_val_class_macptr:
7168 case dw_val_class_loclistsptr:
7169 case dw_val_class_high_pc:
7170 break;
7172 case dw_val_class_file:
7173 case dw_val_class_file_implicit:
7174 CHECKSUM_ULEB128 (DW_FORM_string);
7175 CHECKSUM_STRING (AT_file (at)->filename);
7176 break;
7178 case dw_val_class_data8:
7179 CHECKSUM (at->dw_attr_val.v.val_data8);
7180 break;
7182 default:
7183 break;
7187 struct checksum_attributes
7189 dw_attr_node *at_name;
7190 dw_attr_node *at_type;
7191 dw_attr_node *at_friend;
7192 dw_attr_node *at_accessibility;
7193 dw_attr_node *at_address_class;
7194 dw_attr_node *at_alignment;
7195 dw_attr_node *at_allocated;
7196 dw_attr_node *at_artificial;
7197 dw_attr_node *at_associated;
7198 dw_attr_node *at_binary_scale;
7199 dw_attr_node *at_bit_offset;
7200 dw_attr_node *at_bit_size;
7201 dw_attr_node *at_bit_stride;
7202 dw_attr_node *at_byte_size;
7203 dw_attr_node *at_byte_stride;
7204 dw_attr_node *at_const_value;
7205 dw_attr_node *at_containing_type;
7206 dw_attr_node *at_count;
7207 dw_attr_node *at_data_location;
7208 dw_attr_node *at_data_member_location;
7209 dw_attr_node *at_decimal_scale;
7210 dw_attr_node *at_decimal_sign;
7211 dw_attr_node *at_default_value;
7212 dw_attr_node *at_digit_count;
7213 dw_attr_node *at_discr;
7214 dw_attr_node *at_discr_list;
7215 dw_attr_node *at_discr_value;
7216 dw_attr_node *at_encoding;
7217 dw_attr_node *at_endianity;
7218 dw_attr_node *at_explicit;
7219 dw_attr_node *at_is_optional;
7220 dw_attr_node *at_location;
7221 dw_attr_node *at_lower_bound;
7222 dw_attr_node *at_mutable;
7223 dw_attr_node *at_ordering;
7224 dw_attr_node *at_picture_string;
7225 dw_attr_node *at_prototyped;
7226 dw_attr_node *at_small;
7227 dw_attr_node *at_segment;
7228 dw_attr_node *at_string_length;
7229 dw_attr_node *at_string_length_bit_size;
7230 dw_attr_node *at_string_length_byte_size;
7231 dw_attr_node *at_threads_scaled;
7232 dw_attr_node *at_upper_bound;
7233 dw_attr_node *at_use_location;
7234 dw_attr_node *at_use_UTF8;
7235 dw_attr_node *at_variable_parameter;
7236 dw_attr_node *at_virtuality;
7237 dw_attr_node *at_visibility;
7238 dw_attr_node *at_vtable_elem_location;
7241 /* Collect the attributes that we will want to use for the checksum. */
7243 static void
7244 collect_checksum_attributes (struct checksum_attributes *attrs, dw_die_ref die)
7246 dw_attr_node *a;
7247 unsigned ix;
7249 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
7251 switch (a->dw_attr)
7253 case DW_AT_name:
7254 attrs->at_name = a;
7255 break;
7256 case DW_AT_type:
7257 attrs->at_type = a;
7258 break;
7259 case DW_AT_friend:
7260 attrs->at_friend = a;
7261 break;
7262 case DW_AT_accessibility:
7263 attrs->at_accessibility = a;
7264 break;
7265 case DW_AT_address_class:
7266 attrs->at_address_class = a;
7267 break;
7268 case DW_AT_alignment:
7269 attrs->at_alignment = a;
7270 break;
7271 case DW_AT_allocated:
7272 attrs->at_allocated = a;
7273 break;
7274 case DW_AT_artificial:
7275 attrs->at_artificial = a;
7276 break;
7277 case DW_AT_associated:
7278 attrs->at_associated = a;
7279 break;
7280 case DW_AT_binary_scale:
7281 attrs->at_binary_scale = a;
7282 break;
7283 case DW_AT_bit_offset:
7284 attrs->at_bit_offset = a;
7285 break;
7286 case DW_AT_bit_size:
7287 attrs->at_bit_size = a;
7288 break;
7289 case DW_AT_bit_stride:
7290 attrs->at_bit_stride = a;
7291 break;
7292 case DW_AT_byte_size:
7293 attrs->at_byte_size = a;
7294 break;
7295 case DW_AT_byte_stride:
7296 attrs->at_byte_stride = a;
7297 break;
7298 case DW_AT_const_value:
7299 attrs->at_const_value = a;
7300 break;
7301 case DW_AT_containing_type:
7302 attrs->at_containing_type = a;
7303 break;
7304 case DW_AT_count:
7305 attrs->at_count = a;
7306 break;
7307 case DW_AT_data_location:
7308 attrs->at_data_location = a;
7309 break;
7310 case DW_AT_data_member_location:
7311 attrs->at_data_member_location = a;
7312 break;
7313 case DW_AT_decimal_scale:
7314 attrs->at_decimal_scale = a;
7315 break;
7316 case DW_AT_decimal_sign:
7317 attrs->at_decimal_sign = a;
7318 break;
7319 case DW_AT_default_value:
7320 attrs->at_default_value = a;
7321 break;
7322 case DW_AT_digit_count:
7323 attrs->at_digit_count = a;
7324 break;
7325 case DW_AT_discr:
7326 attrs->at_discr = a;
7327 break;
7328 case DW_AT_discr_list:
7329 attrs->at_discr_list = a;
7330 break;
7331 case DW_AT_discr_value:
7332 attrs->at_discr_value = a;
7333 break;
7334 case DW_AT_encoding:
7335 attrs->at_encoding = a;
7336 break;
7337 case DW_AT_endianity:
7338 attrs->at_endianity = a;
7339 break;
7340 case DW_AT_explicit:
7341 attrs->at_explicit = a;
7342 break;
7343 case DW_AT_is_optional:
7344 attrs->at_is_optional = a;
7345 break;
7346 case DW_AT_location:
7347 attrs->at_location = a;
7348 break;
7349 case DW_AT_lower_bound:
7350 attrs->at_lower_bound = a;
7351 break;
7352 case DW_AT_mutable:
7353 attrs->at_mutable = a;
7354 break;
7355 case DW_AT_ordering:
7356 attrs->at_ordering = a;
7357 break;
7358 case DW_AT_picture_string:
7359 attrs->at_picture_string = a;
7360 break;
7361 case DW_AT_prototyped:
7362 attrs->at_prototyped = a;
7363 break;
7364 case DW_AT_small:
7365 attrs->at_small = a;
7366 break;
7367 case DW_AT_segment:
7368 attrs->at_segment = a;
7369 break;
7370 case DW_AT_string_length:
7371 attrs->at_string_length = a;
7372 break;
7373 case DW_AT_string_length_bit_size:
7374 attrs->at_string_length_bit_size = a;
7375 break;
7376 case DW_AT_string_length_byte_size:
7377 attrs->at_string_length_byte_size = a;
7378 break;
7379 case DW_AT_threads_scaled:
7380 attrs->at_threads_scaled = a;
7381 break;
7382 case DW_AT_upper_bound:
7383 attrs->at_upper_bound = a;
7384 break;
7385 case DW_AT_use_location:
7386 attrs->at_use_location = a;
7387 break;
7388 case DW_AT_use_UTF8:
7389 attrs->at_use_UTF8 = a;
7390 break;
7391 case DW_AT_variable_parameter:
7392 attrs->at_variable_parameter = a;
7393 break;
7394 case DW_AT_virtuality:
7395 attrs->at_virtuality = a;
7396 break;
7397 case DW_AT_visibility:
7398 attrs->at_visibility = a;
7399 break;
7400 case DW_AT_vtable_elem_location:
7401 attrs->at_vtable_elem_location = a;
7402 break;
7403 default:
7404 break;
7409 /* Calculate the checksum of a DIE, using an ordered subset of attributes. */
7411 static void
7412 die_checksum_ordered (dw_die_ref die, struct md5_ctx *ctx, int *mark)
7414 dw_die_ref c;
7415 dw_die_ref decl;
7416 struct checksum_attributes attrs;
7418 CHECKSUM_ULEB128 ('D');
7419 CHECKSUM_ULEB128 (die->die_tag);
7421 memset (&attrs, 0, sizeof (attrs));
7423 decl = get_AT_ref (die, DW_AT_specification);
7424 if (decl != NULL)
7425 collect_checksum_attributes (&attrs, decl);
7426 collect_checksum_attributes (&attrs, die);
7428 CHECKSUM_ATTR (attrs.at_name);
7429 CHECKSUM_ATTR (attrs.at_accessibility);
7430 CHECKSUM_ATTR (attrs.at_address_class);
7431 CHECKSUM_ATTR (attrs.at_allocated);
7432 CHECKSUM_ATTR (attrs.at_artificial);
7433 CHECKSUM_ATTR (attrs.at_associated);
7434 CHECKSUM_ATTR (attrs.at_binary_scale);
7435 CHECKSUM_ATTR (attrs.at_bit_offset);
7436 CHECKSUM_ATTR (attrs.at_bit_size);
7437 CHECKSUM_ATTR (attrs.at_bit_stride);
7438 CHECKSUM_ATTR (attrs.at_byte_size);
7439 CHECKSUM_ATTR (attrs.at_byte_stride);
7440 CHECKSUM_ATTR (attrs.at_const_value);
7441 CHECKSUM_ATTR (attrs.at_containing_type);
7442 CHECKSUM_ATTR (attrs.at_count);
7443 CHECKSUM_ATTR (attrs.at_data_location);
7444 CHECKSUM_ATTR (attrs.at_data_member_location);
7445 CHECKSUM_ATTR (attrs.at_decimal_scale);
7446 CHECKSUM_ATTR (attrs.at_decimal_sign);
7447 CHECKSUM_ATTR (attrs.at_default_value);
7448 CHECKSUM_ATTR (attrs.at_digit_count);
7449 CHECKSUM_ATTR (attrs.at_discr);
7450 CHECKSUM_ATTR (attrs.at_discr_list);
7451 CHECKSUM_ATTR (attrs.at_discr_value);
7452 CHECKSUM_ATTR (attrs.at_encoding);
7453 CHECKSUM_ATTR (attrs.at_endianity);
7454 CHECKSUM_ATTR (attrs.at_explicit);
7455 CHECKSUM_ATTR (attrs.at_is_optional);
7456 CHECKSUM_ATTR (attrs.at_location);
7457 CHECKSUM_ATTR (attrs.at_lower_bound);
7458 CHECKSUM_ATTR (attrs.at_mutable);
7459 CHECKSUM_ATTR (attrs.at_ordering);
7460 CHECKSUM_ATTR (attrs.at_picture_string);
7461 CHECKSUM_ATTR (attrs.at_prototyped);
7462 CHECKSUM_ATTR (attrs.at_small);
7463 CHECKSUM_ATTR (attrs.at_segment);
7464 CHECKSUM_ATTR (attrs.at_string_length);
7465 CHECKSUM_ATTR (attrs.at_string_length_bit_size);
7466 CHECKSUM_ATTR (attrs.at_string_length_byte_size);
7467 CHECKSUM_ATTR (attrs.at_threads_scaled);
7468 CHECKSUM_ATTR (attrs.at_upper_bound);
7469 CHECKSUM_ATTR (attrs.at_use_location);
7470 CHECKSUM_ATTR (attrs.at_use_UTF8);
7471 CHECKSUM_ATTR (attrs.at_variable_parameter);
7472 CHECKSUM_ATTR (attrs.at_virtuality);
7473 CHECKSUM_ATTR (attrs.at_visibility);
7474 CHECKSUM_ATTR (attrs.at_vtable_elem_location);
7475 CHECKSUM_ATTR (attrs.at_type);
7476 CHECKSUM_ATTR (attrs.at_friend);
7477 CHECKSUM_ATTR (attrs.at_alignment);
7479 /* Checksum the child DIEs. */
7480 c = die->die_child;
7481 if (c) do {
7482 dw_attr_node *name_attr;
7484 c = c->die_sib;
7485 name_attr = get_AT (c, DW_AT_name);
7486 if (is_template_instantiation (c))
7488 /* Ignore instantiations of member type and function templates. */
7490 else if (name_attr != NULL
7491 && (is_type_die (c) || c->die_tag == DW_TAG_subprogram))
7493 /* Use a shallow checksum for named nested types and member
7494 functions. */
7495 CHECKSUM_ULEB128 ('S');
7496 CHECKSUM_ULEB128 (c->die_tag);
7497 CHECKSUM_STRING (AT_string (name_attr));
7499 else
7501 /* Use a deep checksum for other children. */
7502 /* Mark this DIE so it gets processed when unmarking. */
7503 if (c->die_mark == 0)
7504 c->die_mark = -1;
7505 die_checksum_ordered (c, ctx, mark);
7507 } while (c != die->die_child);
7509 CHECKSUM_ULEB128 (0);
7512 /* Add a type name and tag to a hash. */
7513 static void
7514 die_odr_checksum (int tag, const char *name, md5_ctx *ctx)
7516 CHECKSUM_ULEB128 (tag);
7517 CHECKSUM_STRING (name);
7520 #undef CHECKSUM
7521 #undef CHECKSUM_STRING
7522 #undef CHECKSUM_ATTR
7523 #undef CHECKSUM_LEB128
7524 #undef CHECKSUM_ULEB128
7526 /* Generate the type signature for DIE. This is computed by generating an
7527 MD5 checksum over the DIE's tag, its relevant attributes, and its
7528 children. Attributes that are references to other DIEs are processed
7529 by recursion, using the MARK field to prevent infinite recursion.
7530 If the DIE is nested inside a namespace or another type, we also
7531 need to include that context in the signature. The lower 64 bits
7532 of the resulting MD5 checksum comprise the signature. */
7534 static void
7535 generate_type_signature (dw_die_ref die, comdat_type_node *type_node)
7537 int mark;
7538 const char *name;
7539 unsigned char checksum[16];
7540 struct md5_ctx ctx;
7541 dw_die_ref decl;
7542 dw_die_ref parent;
7544 name = get_AT_string (die, DW_AT_name);
7545 decl = get_AT_ref (die, DW_AT_specification);
7546 parent = get_die_parent (die);
7548 /* First, compute a signature for just the type name (and its surrounding
7549 context, if any. This is stored in the type unit DIE for link-time
7550 ODR (one-definition rule) checking. */
7552 if (is_cxx () && name != NULL)
7554 md5_init_ctx (&ctx);
7556 /* Checksum the names of surrounding namespaces and structures. */
7557 if (parent != NULL)
7558 checksum_die_context (parent, &ctx);
7560 /* Checksum the current DIE. */
7561 die_odr_checksum (die->die_tag, name, &ctx);
7562 md5_finish_ctx (&ctx, checksum);
7564 add_AT_data8 (type_node->root_die, DW_AT_GNU_odr_signature, &checksum[8]);
7567 /* Next, compute the complete type signature. */
7569 md5_init_ctx (&ctx);
7570 mark = 1;
7571 die->die_mark = mark;
7573 /* Checksum the names of surrounding namespaces and structures. */
7574 if (parent != NULL)
7575 checksum_die_context (parent, &ctx);
7577 /* Checksum the DIE and its children. */
7578 die_checksum_ordered (die, &ctx, &mark);
7579 unmark_all_dies (die);
7580 md5_finish_ctx (&ctx, checksum);
7582 /* Store the signature in the type node and link the type DIE and the
7583 type node together. */
7584 memcpy (type_node->signature, &checksum[16 - DWARF_TYPE_SIGNATURE_SIZE],
7585 DWARF_TYPE_SIGNATURE_SIZE);
7586 die->comdat_type_p = true;
7587 die->die_id.die_type_node = type_node;
7588 type_node->type_die = die;
7590 /* If the DIE is a specification, link its declaration to the type node
7591 as well. */
7592 if (decl != NULL)
7594 decl->comdat_type_p = true;
7595 decl->die_id.die_type_node = type_node;
7599 /* Do the location expressions look same? */
7600 static inline int
7601 same_loc_p (dw_loc_descr_ref loc1, dw_loc_descr_ref loc2, int *mark)
7603 return loc1->dw_loc_opc == loc2->dw_loc_opc
7604 && same_dw_val_p (&loc1->dw_loc_oprnd1, &loc2->dw_loc_oprnd1, mark)
7605 && same_dw_val_p (&loc1->dw_loc_oprnd2, &loc2->dw_loc_oprnd2, mark);
7608 /* Do the values look the same? */
7609 static int
7610 same_dw_val_p (const dw_val_node *v1, const dw_val_node *v2, int *mark)
7612 dw_loc_descr_ref loc1, loc2;
7613 rtx r1, r2;
7615 if (v1->val_class != v2->val_class)
7616 return 0;
7618 switch (v1->val_class)
7620 case dw_val_class_const:
7621 case dw_val_class_const_implicit:
7622 return v1->v.val_int == v2->v.val_int;
7623 case dw_val_class_unsigned_const:
7624 case dw_val_class_unsigned_const_implicit:
7625 return v1->v.val_unsigned == v2->v.val_unsigned;
7626 case dw_val_class_const_double:
7627 return v1->v.val_double.high == v2->v.val_double.high
7628 && v1->v.val_double.low == v2->v.val_double.low;
7629 case dw_val_class_wide_int:
7630 return *v1->v.val_wide == *v2->v.val_wide;
7631 case dw_val_class_vec:
7632 if (v1->v.val_vec.length != v2->v.val_vec.length
7633 || v1->v.val_vec.elt_size != v2->v.val_vec.elt_size)
7634 return 0;
7635 if (memcmp (v1->v.val_vec.array, v2->v.val_vec.array,
7636 v1->v.val_vec.length * v1->v.val_vec.elt_size))
7637 return 0;
7638 return 1;
7639 case dw_val_class_flag:
7640 return v1->v.val_flag == v2->v.val_flag;
7641 case dw_val_class_str:
7642 return !strcmp (v1->v.val_str->str, v2->v.val_str->str);
7644 case dw_val_class_addr:
7645 r1 = v1->v.val_addr;
7646 r2 = v2->v.val_addr;
7647 if (GET_CODE (r1) != GET_CODE (r2))
7648 return 0;
7649 return !rtx_equal_p (r1, r2);
7651 case dw_val_class_offset:
7652 return v1->v.val_offset == v2->v.val_offset;
7654 case dw_val_class_loc:
7655 for (loc1 = v1->v.val_loc, loc2 = v2->v.val_loc;
7656 loc1 && loc2;
7657 loc1 = loc1->dw_loc_next, loc2 = loc2->dw_loc_next)
7658 if (!same_loc_p (loc1, loc2, mark))
7659 return 0;
7660 return !loc1 && !loc2;
7662 case dw_val_class_die_ref:
7663 return same_die_p (v1->v.val_die_ref.die, v2->v.val_die_ref.die, mark);
7665 case dw_val_class_symview:
7666 return strcmp (v1->v.val_symbolic_view, v2->v.val_symbolic_view) == 0;
7668 case dw_val_class_fde_ref:
7669 case dw_val_class_vms_delta:
7670 case dw_val_class_lbl_id:
7671 case dw_val_class_lineptr:
7672 case dw_val_class_macptr:
7673 case dw_val_class_loclistsptr:
7674 case dw_val_class_high_pc:
7675 return 1;
7677 case dw_val_class_file:
7678 case dw_val_class_file_implicit:
7679 return v1->v.val_file == v2->v.val_file;
7681 case dw_val_class_data8:
7682 return !memcmp (v1->v.val_data8, v2->v.val_data8, 8);
7684 default:
7685 return 1;
7689 /* Do the attributes look the same? */
7691 static int
7692 same_attr_p (dw_attr_node *at1, dw_attr_node *at2, int *mark)
7694 if (at1->dw_attr != at2->dw_attr)
7695 return 0;
7697 /* We don't care that this was compiled with a different compiler
7698 snapshot; if the output is the same, that's what matters. */
7699 if (at1->dw_attr == DW_AT_producer)
7700 return 1;
7702 return same_dw_val_p (&at1->dw_attr_val, &at2->dw_attr_val, mark);
7705 /* Do the dies look the same? */
7707 static int
7708 same_die_p (dw_die_ref die1, dw_die_ref die2, int *mark)
7710 dw_die_ref c1, c2;
7711 dw_attr_node *a1;
7712 unsigned ix;
7714 /* To avoid infinite recursion. */
7715 if (die1->die_mark)
7716 return die1->die_mark == die2->die_mark;
7717 die1->die_mark = die2->die_mark = ++(*mark);
7719 if (die1->die_tag != die2->die_tag)
7720 return 0;
7722 if (vec_safe_length (die1->die_attr) != vec_safe_length (die2->die_attr))
7723 return 0;
7725 FOR_EACH_VEC_SAFE_ELT (die1->die_attr, ix, a1)
7726 if (!same_attr_p (a1, &(*die2->die_attr)[ix], mark))
7727 return 0;
7729 c1 = die1->die_child;
7730 c2 = die2->die_child;
7731 if (! c1)
7733 if (c2)
7734 return 0;
7736 else
7737 for (;;)
7739 if (!same_die_p (c1, c2, mark))
7740 return 0;
7741 c1 = c1->die_sib;
7742 c2 = c2->die_sib;
7743 if (c1 == die1->die_child)
7745 if (c2 == die2->die_child)
7746 break;
7747 else
7748 return 0;
7752 return 1;
7755 /* Calculate the MD5 checksum of the compilation unit DIE UNIT_DIE and its
7756 children, and set die_symbol. */
7758 static void
7759 compute_comp_unit_symbol (dw_die_ref unit_die)
7761 const char *die_name = get_AT_string (unit_die, DW_AT_name);
7762 const char *base = die_name ? lbasename (die_name) : "anonymous";
7763 char *name = XALLOCAVEC (char, strlen (base) + 64);
7764 char *p;
7765 int i, mark;
7766 unsigned char checksum[16];
7767 struct md5_ctx ctx;
7769 /* Compute the checksum of the DIE, then append part of it as hex digits to
7770 the name filename of the unit. */
7772 md5_init_ctx (&ctx);
7773 mark = 0;
7774 die_checksum (unit_die, &ctx, &mark);
7775 unmark_all_dies (unit_die);
7776 md5_finish_ctx (&ctx, checksum);
7778 /* When we this for comp_unit_die () we have a DW_AT_name that might
7779 not start with a letter but with anything valid for filenames and
7780 clean_symbol_name doesn't fix that up. Prepend 'g' if the first
7781 character is not a letter. */
7782 sprintf (name, "%s%s.", ISALPHA (*base) ? "" : "g", base);
7783 clean_symbol_name (name);
7785 p = name + strlen (name);
7786 for (i = 0; i < 4; i++)
7788 sprintf (p, "%.2x", checksum[i]);
7789 p += 2;
7792 unit_die->die_id.die_symbol = xstrdup (name);
7795 /* Returns nonzero if DIE represents a type, in the sense of TYPE_P. */
7797 static int
7798 is_type_die (dw_die_ref die)
7800 switch (die->die_tag)
7802 case DW_TAG_array_type:
7803 case DW_TAG_class_type:
7804 case DW_TAG_interface_type:
7805 case DW_TAG_enumeration_type:
7806 case DW_TAG_pointer_type:
7807 case DW_TAG_reference_type:
7808 case DW_TAG_rvalue_reference_type:
7809 case DW_TAG_string_type:
7810 case DW_TAG_structure_type:
7811 case DW_TAG_subroutine_type:
7812 case DW_TAG_union_type:
7813 case DW_TAG_ptr_to_member_type:
7814 case DW_TAG_set_type:
7815 case DW_TAG_subrange_type:
7816 case DW_TAG_base_type:
7817 case DW_TAG_const_type:
7818 case DW_TAG_file_type:
7819 case DW_TAG_packed_type:
7820 case DW_TAG_volatile_type:
7821 case DW_TAG_typedef:
7822 return 1;
7823 default:
7824 return 0;
7828 /* Returns 1 iff C is the sort of DIE that should go into a COMDAT CU.
7829 Basically, we want to choose the bits that are likely to be shared between
7830 compilations (types) and leave out the bits that are specific to individual
7831 compilations (functions). */
7833 static int
7834 is_comdat_die (dw_die_ref c)
7836 /* I think we want to leave base types and __vtbl_ptr_type in the main CU, as
7837 we do for stabs. The advantage is a greater likelihood of sharing between
7838 objects that don't include headers in the same order (and therefore would
7839 put the base types in a different comdat). jason 8/28/00 */
7841 if (c->die_tag == DW_TAG_base_type)
7842 return 0;
7844 if (c->die_tag == DW_TAG_pointer_type
7845 || c->die_tag == DW_TAG_reference_type
7846 || c->die_tag == DW_TAG_rvalue_reference_type
7847 || c->die_tag == DW_TAG_const_type
7848 || c->die_tag == DW_TAG_volatile_type)
7850 dw_die_ref t = get_AT_ref (c, DW_AT_type);
7852 return t ? is_comdat_die (t) : 0;
7855 return is_type_die (c);
7858 /* Returns true iff C is a compile-unit DIE. */
7860 static inline bool
7861 is_cu_die (dw_die_ref c)
7863 return c && (c->die_tag == DW_TAG_compile_unit
7864 || c->die_tag == DW_TAG_skeleton_unit);
7867 /* Returns true iff C is a unit DIE of some sort. */
7869 static inline bool
7870 is_unit_die (dw_die_ref c)
7872 return c && (c->die_tag == DW_TAG_compile_unit
7873 || c->die_tag == DW_TAG_partial_unit
7874 || c->die_tag == DW_TAG_type_unit
7875 || c->die_tag == DW_TAG_skeleton_unit);
7878 /* Returns true iff C is a namespace DIE. */
7880 static inline bool
7881 is_namespace_die (dw_die_ref c)
7883 return c && c->die_tag == DW_TAG_namespace;
7886 /* Returns true iff C is a class or structure DIE. */
7888 static inline bool
7889 is_class_die (dw_die_ref c)
7891 return c && (c->die_tag == DW_TAG_class_type
7892 || c->die_tag == DW_TAG_structure_type);
7895 /* Return non-zero if this DIE is a template parameter. */
7897 static inline bool
7898 is_template_parameter (dw_die_ref die)
7900 switch (die->die_tag)
7902 case DW_TAG_template_type_param:
7903 case DW_TAG_template_value_param:
7904 case DW_TAG_GNU_template_template_param:
7905 case DW_TAG_GNU_template_parameter_pack:
7906 return true;
7907 default:
7908 return false;
7912 /* Return non-zero if this DIE represents a template instantiation. */
7914 static inline bool
7915 is_template_instantiation (dw_die_ref die)
7917 dw_die_ref c;
7919 if (!is_type_die (die) && die->die_tag != DW_TAG_subprogram)
7920 return false;
7921 FOR_EACH_CHILD (die, c, if (is_template_parameter (c)) return true);
7922 return false;
7925 static char *
7926 gen_internal_sym (const char *prefix)
7928 char buf[MAX_ARTIFICIAL_LABEL_BYTES];
7930 ASM_GENERATE_INTERNAL_LABEL (buf, prefix, label_num++);
7931 return xstrdup (buf);
7934 /* Return non-zero if this DIE is a declaration. */
7936 static int
7937 is_declaration_die (dw_die_ref die)
7939 dw_attr_node *a;
7940 unsigned ix;
7942 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
7943 if (a->dw_attr == DW_AT_declaration)
7944 return 1;
7946 return 0;
7949 /* Return non-zero if this DIE is nested inside a subprogram. */
7951 static int
7952 is_nested_in_subprogram (dw_die_ref die)
7954 dw_die_ref decl = get_AT_ref (die, DW_AT_specification);
7956 if (decl == NULL)
7957 decl = die;
7958 return local_scope_p (decl);
7961 /* Return non-zero if this DIE contains a defining declaration of a
7962 subprogram. */
7964 static int
7965 contains_subprogram_definition (dw_die_ref die)
7967 dw_die_ref c;
7969 if (die->die_tag == DW_TAG_subprogram && ! is_declaration_die (die))
7970 return 1;
7971 FOR_EACH_CHILD (die, c, if (contains_subprogram_definition (c)) return 1);
7972 return 0;
7975 /* Return non-zero if this is a type DIE that should be moved to a
7976 COMDAT .debug_types section or .debug_info section with DW_UT_*type
7977 unit type. */
7979 static int
7980 should_move_die_to_comdat (dw_die_ref die)
7982 switch (die->die_tag)
7984 case DW_TAG_class_type:
7985 case DW_TAG_structure_type:
7986 case DW_TAG_enumeration_type:
7987 case DW_TAG_union_type:
7988 /* Don't move declarations, inlined instances, types nested in a
7989 subprogram, or types that contain subprogram definitions. */
7990 if (is_declaration_die (die)
7991 || get_AT (die, DW_AT_abstract_origin)
7992 || is_nested_in_subprogram (die)
7993 || contains_subprogram_definition (die))
7994 return 0;
7995 return 1;
7996 case DW_TAG_array_type:
7997 case DW_TAG_interface_type:
7998 case DW_TAG_pointer_type:
7999 case DW_TAG_reference_type:
8000 case DW_TAG_rvalue_reference_type:
8001 case DW_TAG_string_type:
8002 case DW_TAG_subroutine_type:
8003 case DW_TAG_ptr_to_member_type:
8004 case DW_TAG_set_type:
8005 case DW_TAG_subrange_type:
8006 case DW_TAG_base_type:
8007 case DW_TAG_const_type:
8008 case DW_TAG_file_type:
8009 case DW_TAG_packed_type:
8010 case DW_TAG_volatile_type:
8011 case DW_TAG_typedef:
8012 default:
8013 return 0;
8017 /* Make a clone of DIE. */
8019 static dw_die_ref
8020 clone_die (dw_die_ref die)
8022 dw_die_ref clone = new_die_raw (die->die_tag);
8023 dw_attr_node *a;
8024 unsigned ix;
8026 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8027 add_dwarf_attr (clone, a);
8029 return clone;
8032 /* Make a clone of the tree rooted at DIE. */
8034 static dw_die_ref
8035 clone_tree (dw_die_ref die)
8037 dw_die_ref c;
8038 dw_die_ref clone = clone_die (die);
8040 FOR_EACH_CHILD (die, c, add_child_die (clone, clone_tree (c)));
8042 return clone;
8045 /* Make a clone of DIE as a declaration. */
8047 static dw_die_ref
8048 clone_as_declaration (dw_die_ref die)
8050 dw_die_ref clone;
8051 dw_die_ref decl;
8052 dw_attr_node *a;
8053 unsigned ix;
8055 /* If the DIE is already a declaration, just clone it. */
8056 if (is_declaration_die (die))
8057 return clone_die (die);
8059 /* If the DIE is a specification, just clone its declaration DIE. */
8060 decl = get_AT_ref (die, DW_AT_specification);
8061 if (decl != NULL)
8063 clone = clone_die (decl);
8064 if (die->comdat_type_p)
8065 add_AT_die_ref (clone, DW_AT_signature, die);
8066 return clone;
8069 clone = new_die_raw (die->die_tag);
8071 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8073 /* We don't want to copy over all attributes.
8074 For example we don't want DW_AT_byte_size because otherwise we will no
8075 longer have a declaration and GDB will treat it as a definition. */
8077 switch (a->dw_attr)
8079 case DW_AT_abstract_origin:
8080 case DW_AT_artificial:
8081 case DW_AT_containing_type:
8082 case DW_AT_external:
8083 case DW_AT_name:
8084 case DW_AT_type:
8085 case DW_AT_virtuality:
8086 case DW_AT_linkage_name:
8087 case DW_AT_MIPS_linkage_name:
8088 add_dwarf_attr (clone, a);
8089 break;
8090 case DW_AT_byte_size:
8091 case DW_AT_alignment:
8092 default:
8093 break;
8097 if (die->comdat_type_p)
8098 add_AT_die_ref (clone, DW_AT_signature, die);
8100 add_AT_flag (clone, DW_AT_declaration, 1);
8101 return clone;
8105 /* Structure to map a DIE in one CU to its copy in a comdat type unit. */
8107 struct decl_table_entry
8109 dw_die_ref orig;
8110 dw_die_ref copy;
8113 /* Helpers to manipulate hash table of copied declarations. */
8115 /* Hashtable helpers. */
8117 struct decl_table_entry_hasher : free_ptr_hash <decl_table_entry>
8119 typedef die_struct *compare_type;
8120 static inline hashval_t hash (const decl_table_entry *);
8121 static inline bool equal (const decl_table_entry *, const die_struct *);
8124 inline hashval_t
8125 decl_table_entry_hasher::hash (const decl_table_entry *entry)
8127 return htab_hash_pointer (entry->orig);
8130 inline bool
8131 decl_table_entry_hasher::equal (const decl_table_entry *entry1,
8132 const die_struct *entry2)
8134 return entry1->orig == entry2;
8137 typedef hash_table<decl_table_entry_hasher> decl_hash_type;
8139 /* Copy DIE and its ancestors, up to, but not including, the compile unit
8140 or type unit entry, to a new tree. Adds the new tree to UNIT and returns
8141 a pointer to the copy of DIE. If DECL_TABLE is provided, it is used
8142 to check if the ancestor has already been copied into UNIT. */
8144 static dw_die_ref
8145 copy_ancestor_tree (dw_die_ref unit, dw_die_ref die,
8146 decl_hash_type *decl_table)
8148 dw_die_ref parent = die->die_parent;
8149 dw_die_ref new_parent = unit;
8150 dw_die_ref copy;
8151 decl_table_entry **slot = NULL;
8152 struct decl_table_entry *entry = NULL;
8154 if (decl_table)
8156 /* Check if the entry has already been copied to UNIT. */
8157 slot = decl_table->find_slot_with_hash (die, htab_hash_pointer (die),
8158 INSERT);
8159 if (*slot != HTAB_EMPTY_ENTRY)
8161 entry = *slot;
8162 return entry->copy;
8165 /* Record in DECL_TABLE that DIE has been copied to UNIT. */
8166 entry = XCNEW (struct decl_table_entry);
8167 entry->orig = die;
8168 entry->copy = NULL;
8169 *slot = entry;
8172 if (parent != NULL)
8174 dw_die_ref spec = get_AT_ref (parent, DW_AT_specification);
8175 if (spec != NULL)
8176 parent = spec;
8177 if (!is_unit_die (parent))
8178 new_parent = copy_ancestor_tree (unit, parent, decl_table);
8181 copy = clone_as_declaration (die);
8182 add_child_die (new_parent, copy);
8184 if (decl_table)
8186 /* Record the pointer to the copy. */
8187 entry->copy = copy;
8190 return copy;
8192 /* Copy the declaration context to the new type unit DIE. This includes
8193 any surrounding namespace or type declarations. If the DIE has an
8194 AT_specification attribute, it also includes attributes and children
8195 attached to the specification, and returns a pointer to the original
8196 parent of the declaration DIE. Returns NULL otherwise. */
8198 static dw_die_ref
8199 copy_declaration_context (dw_die_ref unit, dw_die_ref die)
8201 dw_die_ref decl;
8202 dw_die_ref new_decl;
8203 dw_die_ref orig_parent = NULL;
8205 decl = get_AT_ref (die, DW_AT_specification);
8206 if (decl == NULL)
8207 decl = die;
8208 else
8210 unsigned ix;
8211 dw_die_ref c;
8212 dw_attr_node *a;
8214 /* The original DIE will be changed to a declaration, and must
8215 be moved to be a child of the original declaration DIE. */
8216 orig_parent = decl->die_parent;
8218 /* Copy the type node pointer from the new DIE to the original
8219 declaration DIE so we can forward references later. */
8220 decl->comdat_type_p = true;
8221 decl->die_id.die_type_node = die->die_id.die_type_node;
8223 remove_AT (die, DW_AT_specification);
8225 FOR_EACH_VEC_SAFE_ELT (decl->die_attr, ix, a)
8227 if (a->dw_attr != DW_AT_name
8228 && a->dw_attr != DW_AT_declaration
8229 && a->dw_attr != DW_AT_external)
8230 add_dwarf_attr (die, a);
8233 FOR_EACH_CHILD (decl, c, add_child_die (die, clone_tree (c)));
8236 if (decl->die_parent != NULL
8237 && !is_unit_die (decl->die_parent))
8239 new_decl = copy_ancestor_tree (unit, decl, NULL);
8240 if (new_decl != NULL)
8242 remove_AT (new_decl, DW_AT_signature);
8243 add_AT_specification (die, new_decl);
8247 return orig_parent;
8250 /* Generate the skeleton ancestor tree for the given NODE, then clone
8251 the DIE and add the clone into the tree. */
8253 static void
8254 generate_skeleton_ancestor_tree (skeleton_chain_node *node)
8256 if (node->new_die != NULL)
8257 return;
8259 node->new_die = clone_as_declaration (node->old_die);
8261 if (node->parent != NULL)
8263 generate_skeleton_ancestor_tree (node->parent);
8264 add_child_die (node->parent->new_die, node->new_die);
8268 /* Generate a skeleton tree of DIEs containing any declarations that are
8269 found in the original tree. We traverse the tree looking for declaration
8270 DIEs, and construct the skeleton from the bottom up whenever we find one. */
8272 static void
8273 generate_skeleton_bottom_up (skeleton_chain_node *parent)
8275 skeleton_chain_node node;
8276 dw_die_ref c;
8277 dw_die_ref first;
8278 dw_die_ref prev = NULL;
8279 dw_die_ref next = NULL;
8281 node.parent = parent;
8283 first = c = parent->old_die->die_child;
8284 if (c)
8285 next = c->die_sib;
8286 if (c) do {
8287 if (prev == NULL || prev->die_sib == c)
8288 prev = c;
8289 c = next;
8290 next = (c == first ? NULL : c->die_sib);
8291 node.old_die = c;
8292 node.new_die = NULL;
8293 if (is_declaration_die (c))
8295 if (is_template_instantiation (c))
8297 /* Instantiated templates do not need to be cloned into the
8298 type unit. Just move the DIE and its children back to
8299 the skeleton tree (in the main CU). */
8300 remove_child_with_prev (c, prev);
8301 add_child_die (parent->new_die, c);
8302 c = prev;
8304 else if (c->comdat_type_p)
8306 /* This is the skeleton of earlier break_out_comdat_types
8307 type. Clone the existing DIE, but keep the children
8308 under the original (which is in the main CU). */
8309 dw_die_ref clone = clone_die (c);
8311 replace_child (c, clone, prev);
8312 generate_skeleton_ancestor_tree (parent);
8313 add_child_die (parent->new_die, c);
8314 c = clone;
8315 continue;
8317 else
8319 /* Clone the existing DIE, move the original to the skeleton
8320 tree (which is in the main CU), and put the clone, with
8321 all the original's children, where the original came from
8322 (which is about to be moved to the type unit). */
8323 dw_die_ref clone = clone_die (c);
8324 move_all_children (c, clone);
8326 /* If the original has a DW_AT_object_pointer attribute,
8327 it would now point to a child DIE just moved to the
8328 cloned tree, so we need to remove that attribute from
8329 the original. */
8330 remove_AT (c, DW_AT_object_pointer);
8332 replace_child (c, clone, prev);
8333 generate_skeleton_ancestor_tree (parent);
8334 add_child_die (parent->new_die, c);
8335 node.old_die = clone;
8336 node.new_die = c;
8337 c = clone;
8340 generate_skeleton_bottom_up (&node);
8341 } while (next != NULL);
8344 /* Wrapper function for generate_skeleton_bottom_up. */
8346 static dw_die_ref
8347 generate_skeleton (dw_die_ref die)
8349 skeleton_chain_node node;
8351 node.old_die = die;
8352 node.new_die = NULL;
8353 node.parent = NULL;
8355 /* If this type definition is nested inside another type,
8356 and is not an instantiation of a template, always leave
8357 at least a declaration in its place. */
8358 if (die->die_parent != NULL
8359 && is_type_die (die->die_parent)
8360 && !is_template_instantiation (die))
8361 node.new_die = clone_as_declaration (die);
8363 generate_skeleton_bottom_up (&node);
8364 return node.new_die;
8367 /* Remove the CHILD DIE from its parent, possibly replacing it with a cloned
8368 declaration. The original DIE is moved to a new compile unit so that
8369 existing references to it follow it to the new location. If any of the
8370 original DIE's descendants is a declaration, we need to replace the
8371 original DIE with a skeleton tree and move the declarations back into the
8372 skeleton tree. */
8374 static dw_die_ref
8375 remove_child_or_replace_with_skeleton (dw_die_ref unit, dw_die_ref child,
8376 dw_die_ref prev)
8378 dw_die_ref skeleton, orig_parent;
8380 /* Copy the declaration context to the type unit DIE. If the returned
8381 ORIG_PARENT is not NULL, the skeleton needs to be added as a child of
8382 that DIE. */
8383 orig_parent = copy_declaration_context (unit, child);
8385 skeleton = generate_skeleton (child);
8386 if (skeleton == NULL)
8387 remove_child_with_prev (child, prev);
8388 else
8390 skeleton->comdat_type_p = true;
8391 skeleton->die_id.die_type_node = child->die_id.die_type_node;
8393 /* If the original DIE was a specification, we need to put
8394 the skeleton under the parent DIE of the declaration.
8395 This leaves the original declaration in the tree, but
8396 it will be pruned later since there are no longer any
8397 references to it. */
8398 if (orig_parent != NULL)
8400 remove_child_with_prev (child, prev);
8401 add_child_die (orig_parent, skeleton);
8403 else
8404 replace_child (child, skeleton, prev);
8407 return skeleton;
8410 static void
8411 copy_dwarf_procs_ref_in_attrs (dw_die_ref die,
8412 comdat_type_node *type_node,
8413 hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs);
8415 /* Helper for copy_dwarf_procs_ref_in_dies. Make a copy of the DIE DWARF
8416 procedure, put it under TYPE_NODE and return the copy. Continue looking for
8417 DWARF procedure references in the DW_AT_location attribute. */
8419 static dw_die_ref
8420 copy_dwarf_procedure (dw_die_ref die,
8421 comdat_type_node *type_node,
8422 hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs)
8424 gcc_assert (die->die_tag == DW_TAG_dwarf_procedure);
8426 /* DWARF procedures are not supposed to have children... */
8427 gcc_assert (die->die_child == NULL);
8429 /* ... and they are supposed to have only one attribute: DW_AT_location. */
8430 gcc_assert (vec_safe_length (die->die_attr) == 1
8431 && ((*die->die_attr)[0].dw_attr == DW_AT_location));
8433 /* Do not copy more than once DWARF procedures. */
8434 bool existed;
8435 dw_die_ref &die_copy = copied_dwarf_procs.get_or_insert (die, &existed);
8436 if (existed)
8437 return die_copy;
8439 die_copy = clone_die (die);
8440 add_child_die (type_node->root_die, die_copy);
8441 copy_dwarf_procs_ref_in_attrs (die_copy, type_node, copied_dwarf_procs);
8442 return die_copy;
8445 /* Helper for copy_dwarf_procs_ref_in_dies. Look for references to DWARF
8446 procedures in DIE's attributes. */
8448 static void
8449 copy_dwarf_procs_ref_in_attrs (dw_die_ref die,
8450 comdat_type_node *type_node,
8451 hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs)
8453 dw_attr_node *a;
8454 unsigned i;
8456 FOR_EACH_VEC_SAFE_ELT (die->die_attr, i, a)
8458 dw_loc_descr_ref loc;
8460 if (a->dw_attr_val.val_class != dw_val_class_loc)
8461 continue;
8463 for (loc = a->dw_attr_val.v.val_loc; loc != NULL; loc = loc->dw_loc_next)
8465 switch (loc->dw_loc_opc)
8467 case DW_OP_call2:
8468 case DW_OP_call4:
8469 case DW_OP_call_ref:
8470 gcc_assert (loc->dw_loc_oprnd1.val_class
8471 == dw_val_class_die_ref);
8472 loc->dw_loc_oprnd1.v.val_die_ref.die
8473 = copy_dwarf_procedure (loc->dw_loc_oprnd1.v.val_die_ref.die,
8474 type_node,
8475 copied_dwarf_procs);
8477 default:
8478 break;
8484 /* Copy DWARF procedures that are referenced by the DIE tree to TREE_NODE and
8485 rewrite references to point to the copies.
8487 References are looked for in DIE's attributes and recursively in all its
8488 children attributes that are location descriptions. COPIED_DWARF_PROCS is a
8489 mapping from old DWARF procedures to their copy. It is used not to copy
8490 twice the same DWARF procedure under TYPE_NODE. */
8492 static void
8493 copy_dwarf_procs_ref_in_dies (dw_die_ref die,
8494 comdat_type_node *type_node,
8495 hash_map<dw_die_ref, dw_die_ref> &copied_dwarf_procs)
8497 dw_die_ref c;
8499 copy_dwarf_procs_ref_in_attrs (die, type_node, copied_dwarf_procs);
8500 FOR_EACH_CHILD (die, c, copy_dwarf_procs_ref_in_dies (c,
8501 type_node,
8502 copied_dwarf_procs));
8505 /* Traverse the DIE and set up additional .debug_types or .debug_info
8506 DW_UT_*type sections for each type worthy of being placed in a COMDAT
8507 section. */
8509 static void
8510 break_out_comdat_types (dw_die_ref die)
8512 dw_die_ref c;
8513 dw_die_ref first;
8514 dw_die_ref prev = NULL;
8515 dw_die_ref next = NULL;
8516 dw_die_ref unit = NULL;
8518 first = c = die->die_child;
8519 if (c)
8520 next = c->die_sib;
8521 if (c) do {
8522 if (prev == NULL || prev->die_sib == c)
8523 prev = c;
8524 c = next;
8525 next = (c == first ? NULL : c->die_sib);
8526 if (should_move_die_to_comdat (c))
8528 dw_die_ref replacement;
8529 comdat_type_node *type_node;
8531 /* Break out nested types into their own type units. */
8532 break_out_comdat_types (c);
8534 /* Create a new type unit DIE as the root for the new tree, and
8535 add it to the list of comdat types. */
8536 unit = new_die (DW_TAG_type_unit, NULL, NULL);
8537 add_AT_unsigned (unit, DW_AT_language,
8538 get_AT_unsigned (comp_unit_die (), DW_AT_language));
8539 type_node = ggc_cleared_alloc<comdat_type_node> ();
8540 type_node->root_die = unit;
8541 type_node->next = comdat_type_list;
8542 comdat_type_list = type_node;
8544 /* Generate the type signature. */
8545 generate_type_signature (c, type_node);
8547 /* Copy the declaration context, attributes, and children of the
8548 declaration into the new type unit DIE, then remove this DIE
8549 from the main CU (or replace it with a skeleton if necessary). */
8550 replacement = remove_child_or_replace_with_skeleton (unit, c, prev);
8551 type_node->skeleton_die = replacement;
8553 /* Add the DIE to the new compunit. */
8554 add_child_die (unit, c);
8556 /* Types can reference DWARF procedures for type size or data location
8557 expressions. Calls in DWARF expressions cannot target procedures
8558 that are not in the same section. So we must copy DWARF procedures
8559 along with this type and then rewrite references to them. */
8560 hash_map<dw_die_ref, dw_die_ref> copied_dwarf_procs;
8561 copy_dwarf_procs_ref_in_dies (c, type_node, copied_dwarf_procs);
8563 if (replacement != NULL)
8564 c = replacement;
8566 else if (c->die_tag == DW_TAG_namespace
8567 || c->die_tag == DW_TAG_class_type
8568 || c->die_tag == DW_TAG_structure_type
8569 || c->die_tag == DW_TAG_union_type)
8571 /* Look for nested types that can be broken out. */
8572 break_out_comdat_types (c);
8574 } while (next != NULL);
8577 /* Like clone_tree, but copy DW_TAG_subprogram DIEs as declarations.
8578 Enter all the cloned children into the hash table decl_table. */
8580 static dw_die_ref
8581 clone_tree_partial (dw_die_ref die, decl_hash_type *decl_table)
8583 dw_die_ref c;
8584 dw_die_ref clone;
8585 struct decl_table_entry *entry;
8586 decl_table_entry **slot;
8588 if (die->die_tag == DW_TAG_subprogram)
8589 clone = clone_as_declaration (die);
8590 else
8591 clone = clone_die (die);
8593 slot = decl_table->find_slot_with_hash (die,
8594 htab_hash_pointer (die), INSERT);
8596 /* Assert that DIE isn't in the hash table yet. If it would be there
8597 before, the ancestors would be necessarily there as well, therefore
8598 clone_tree_partial wouldn't be called. */
8599 gcc_assert (*slot == HTAB_EMPTY_ENTRY);
8601 entry = XCNEW (struct decl_table_entry);
8602 entry->orig = die;
8603 entry->copy = clone;
8604 *slot = entry;
8606 if (die->die_tag != DW_TAG_subprogram)
8607 FOR_EACH_CHILD (die, c,
8608 add_child_die (clone, clone_tree_partial (c, decl_table)));
8610 return clone;
8613 /* Walk the DIE and its children, looking for references to incomplete
8614 or trivial types that are unmarked (i.e., that are not in the current
8615 type_unit). */
8617 static void
8618 copy_decls_walk (dw_die_ref unit, dw_die_ref die, decl_hash_type *decl_table)
8620 dw_die_ref c;
8621 dw_attr_node *a;
8622 unsigned ix;
8624 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8626 if (AT_class (a) == dw_val_class_die_ref)
8628 dw_die_ref targ = AT_ref (a);
8629 decl_table_entry **slot;
8630 struct decl_table_entry *entry;
8632 if (targ->die_mark != 0 || targ->comdat_type_p)
8633 continue;
8635 slot = decl_table->find_slot_with_hash (targ,
8636 htab_hash_pointer (targ),
8637 INSERT);
8639 if (*slot != HTAB_EMPTY_ENTRY)
8641 /* TARG has already been copied, so we just need to
8642 modify the reference to point to the copy. */
8643 entry = *slot;
8644 a->dw_attr_val.v.val_die_ref.die = entry->copy;
8646 else
8648 dw_die_ref parent = unit;
8649 dw_die_ref copy = clone_die (targ);
8651 /* Record in DECL_TABLE that TARG has been copied.
8652 Need to do this now, before the recursive call,
8653 because DECL_TABLE may be expanded and SLOT
8654 would no longer be a valid pointer. */
8655 entry = XCNEW (struct decl_table_entry);
8656 entry->orig = targ;
8657 entry->copy = copy;
8658 *slot = entry;
8660 /* If TARG is not a declaration DIE, we need to copy its
8661 children. */
8662 if (!is_declaration_die (targ))
8664 FOR_EACH_CHILD (
8665 targ, c,
8666 add_child_die (copy,
8667 clone_tree_partial (c, decl_table)));
8670 /* Make sure the cloned tree is marked as part of the
8671 type unit. */
8672 mark_dies (copy);
8674 /* If TARG has surrounding context, copy its ancestor tree
8675 into the new type unit. */
8676 if (targ->die_parent != NULL
8677 && !is_unit_die (targ->die_parent))
8678 parent = copy_ancestor_tree (unit, targ->die_parent,
8679 decl_table);
8681 add_child_die (parent, copy);
8682 a->dw_attr_val.v.val_die_ref.die = copy;
8684 /* Make sure the newly-copied DIE is walked. If it was
8685 installed in a previously-added context, it won't
8686 get visited otherwise. */
8687 if (parent != unit)
8689 /* Find the highest point of the newly-added tree,
8690 mark each node along the way, and walk from there. */
8691 parent->die_mark = 1;
8692 while (parent->die_parent
8693 && parent->die_parent->die_mark == 0)
8695 parent = parent->die_parent;
8696 parent->die_mark = 1;
8698 copy_decls_walk (unit, parent, decl_table);
8704 FOR_EACH_CHILD (die, c, copy_decls_walk (unit, c, decl_table));
8707 /* Copy declarations for "unworthy" types into the new comdat section.
8708 Incomplete types, modified types, and certain other types aren't broken
8709 out into comdat sections of their own, so they don't have a signature,
8710 and we need to copy the declaration into the same section so that we
8711 don't have an external reference. */
8713 static void
8714 copy_decls_for_unworthy_types (dw_die_ref unit)
8716 mark_dies (unit);
8717 decl_hash_type decl_table (10);
8718 copy_decls_walk (unit, unit, &decl_table);
8719 unmark_dies (unit);
8722 /* Traverse the DIE and add a sibling attribute if it may have the
8723 effect of speeding up access to siblings. To save some space,
8724 avoid generating sibling attributes for DIE's without children. */
8726 static void
8727 add_sibling_attributes (dw_die_ref die)
8729 dw_die_ref c;
8731 if (! die->die_child)
8732 return;
8734 if (die->die_parent && die != die->die_parent->die_child)
8735 add_AT_die_ref (die, DW_AT_sibling, die->die_sib);
8737 FOR_EACH_CHILD (die, c, add_sibling_attributes (c));
8740 /* Output all location lists for the DIE and its children. */
8742 static void
8743 output_location_lists (dw_die_ref die)
8745 dw_die_ref c;
8746 dw_attr_node *a;
8747 unsigned ix;
8749 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8750 if (AT_class (a) == dw_val_class_loc_list)
8751 output_loc_list (AT_loc_list (a));
8753 FOR_EACH_CHILD (die, c, output_location_lists (c));
8756 /* During assign_location_list_indexes and output_loclists_offset the
8757 current index, after it the number of assigned indexes (i.e. how
8758 large the .debug_loclists* offset table should be). */
8759 static unsigned int loc_list_idx;
8761 /* Output all location list offsets for the DIE and its children. */
8763 static void
8764 output_loclists_offsets (dw_die_ref die)
8766 dw_die_ref c;
8767 dw_attr_node *a;
8768 unsigned ix;
8770 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8771 if (AT_class (a) == dw_val_class_loc_list)
8773 dw_loc_list_ref l = AT_loc_list (a);
8774 if (l->offset_emitted)
8775 continue;
8776 dw2_asm_output_delta (DWARF_OFFSET_SIZE, l->ll_symbol,
8777 loc_section_label, NULL);
8778 gcc_assert (l->hash == loc_list_idx);
8779 loc_list_idx++;
8780 l->offset_emitted = true;
8783 FOR_EACH_CHILD (die, c, output_loclists_offsets (c));
8786 /* Recursively set indexes of location lists. */
8788 static void
8789 assign_location_list_indexes (dw_die_ref die)
8791 dw_die_ref c;
8792 dw_attr_node *a;
8793 unsigned ix;
8795 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8796 if (AT_class (a) == dw_val_class_loc_list)
8798 dw_loc_list_ref list = AT_loc_list (a);
8799 if (!list->num_assigned)
8801 list->num_assigned = true;
8802 list->hash = loc_list_idx++;
8806 FOR_EACH_CHILD (die, c, assign_location_list_indexes (c));
8809 /* We want to limit the number of external references, because they are
8810 larger than local references: a relocation takes multiple words, and
8811 even a sig8 reference is always eight bytes, whereas a local reference
8812 can be as small as one byte (though DW_FORM_ref is usually 4 in GCC).
8813 So if we encounter multiple external references to the same type DIE, we
8814 make a local typedef stub for it and redirect all references there.
8816 This is the element of the hash table for keeping track of these
8817 references. */
8819 struct external_ref
8821 dw_die_ref type;
8822 dw_die_ref stub;
8823 unsigned n_refs;
8826 /* Hashtable helpers. */
8828 struct external_ref_hasher : free_ptr_hash <external_ref>
8830 static inline hashval_t hash (const external_ref *);
8831 static inline bool equal (const external_ref *, const external_ref *);
8834 inline hashval_t
8835 external_ref_hasher::hash (const external_ref *r)
8837 dw_die_ref die = r->type;
8838 hashval_t h = 0;
8840 /* We can't use the address of the DIE for hashing, because
8841 that will make the order of the stub DIEs non-deterministic. */
8842 if (! die->comdat_type_p)
8843 /* We have a symbol; use it to compute a hash. */
8844 h = htab_hash_string (die->die_id.die_symbol);
8845 else
8847 /* We have a type signature; use a subset of the bits as the hash.
8848 The 8-byte signature is at least as large as hashval_t. */
8849 comdat_type_node *type_node = die->die_id.die_type_node;
8850 memcpy (&h, type_node->signature, sizeof (h));
8852 return h;
8855 inline bool
8856 external_ref_hasher::equal (const external_ref *r1, const external_ref *r2)
8858 return r1->type == r2->type;
8861 typedef hash_table<external_ref_hasher> external_ref_hash_type;
8863 /* Return a pointer to the external_ref for references to DIE. */
8865 static struct external_ref *
8866 lookup_external_ref (external_ref_hash_type *map, dw_die_ref die)
8868 struct external_ref ref, *ref_p;
8869 external_ref **slot;
8871 ref.type = die;
8872 slot = map->find_slot (&ref, INSERT);
8873 if (*slot != HTAB_EMPTY_ENTRY)
8874 return *slot;
8876 ref_p = XCNEW (struct external_ref);
8877 ref_p->type = die;
8878 *slot = ref_p;
8879 return ref_p;
8882 /* Subroutine of optimize_external_refs, below.
8884 If we see a type skeleton, record it as our stub. If we see external
8885 references, remember how many we've seen. */
8887 static void
8888 optimize_external_refs_1 (dw_die_ref die, external_ref_hash_type *map)
8890 dw_die_ref c;
8891 dw_attr_node *a;
8892 unsigned ix;
8893 struct external_ref *ref_p;
8895 if (is_type_die (die)
8896 && (c = get_AT_ref (die, DW_AT_signature)))
8898 /* This is a local skeleton; use it for local references. */
8899 ref_p = lookup_external_ref (map, c);
8900 ref_p->stub = die;
8903 /* Scan the DIE references, and remember any that refer to DIEs from
8904 other CUs (i.e. those which are not marked). */
8905 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
8906 if (AT_class (a) == dw_val_class_die_ref
8907 && (c = AT_ref (a))->die_mark == 0
8908 && is_type_die (c))
8910 ref_p = lookup_external_ref (map, c);
8911 ref_p->n_refs++;
8914 FOR_EACH_CHILD (die, c, optimize_external_refs_1 (c, map));
8917 /* htab_traverse callback function for optimize_external_refs, below. SLOT
8918 points to an external_ref, DATA is the CU we're processing. If we don't
8919 already have a local stub, and we have multiple refs, build a stub. */
8922 dwarf2_build_local_stub (external_ref **slot, dw_die_ref data)
8924 struct external_ref *ref_p = *slot;
8926 if (ref_p->stub == NULL && ref_p->n_refs > 1 && !dwarf_strict)
8928 /* We have multiple references to this type, so build a small stub.
8929 Both of these forms are a bit dodgy from the perspective of the
8930 DWARF standard, since technically they should have names. */
8931 dw_die_ref cu = data;
8932 dw_die_ref type = ref_p->type;
8933 dw_die_ref stub = NULL;
8935 if (type->comdat_type_p)
8937 /* If we refer to this type via sig8, use AT_signature. */
8938 stub = new_die (type->die_tag, cu, NULL_TREE);
8939 add_AT_die_ref (stub, DW_AT_signature, type);
8941 else
8943 /* Otherwise, use a typedef with no name. */
8944 stub = new_die (DW_TAG_typedef, cu, NULL_TREE);
8945 add_AT_die_ref (stub, DW_AT_type, type);
8948 stub->die_mark++;
8949 ref_p->stub = stub;
8951 return 1;
8954 /* DIE is a unit; look through all the DIE references to see if there are
8955 any external references to types, and if so, create local stubs for
8956 them which will be applied in build_abbrev_table. This is useful because
8957 references to local DIEs are smaller. */
8959 static external_ref_hash_type *
8960 optimize_external_refs (dw_die_ref die)
8962 external_ref_hash_type *map = new external_ref_hash_type (10);
8963 optimize_external_refs_1 (die, map);
8964 map->traverse <dw_die_ref, dwarf2_build_local_stub> (die);
8965 return map;
8968 /* The following 3 variables are temporaries that are computed only during the
8969 build_abbrev_table call and used and released during the following
8970 optimize_abbrev_table call. */
8972 /* First abbrev_id that can be optimized based on usage. */
8973 static unsigned int abbrev_opt_start;
8975 /* Maximum abbrev_id of a base type plus one (we can't optimize DIEs with
8976 abbrev_id smaller than this, because they must be already sized
8977 during build_abbrev_table). */
8978 static unsigned int abbrev_opt_base_type_end;
8980 /* Vector of usage counts during build_abbrev_table. Indexed by
8981 abbrev_id - abbrev_opt_start. */
8982 static vec<unsigned int> abbrev_usage_count;
8984 /* Vector of all DIEs added with die_abbrev >= abbrev_opt_start. */
8985 static vec<dw_die_ref> sorted_abbrev_dies;
8987 /* The format of each DIE (and its attribute value pairs) is encoded in an
8988 abbreviation table. This routine builds the abbreviation table and assigns
8989 a unique abbreviation id for each abbreviation entry. The children of each
8990 die are visited recursively. */
8992 static void
8993 build_abbrev_table (dw_die_ref die, external_ref_hash_type *extern_map)
8995 unsigned int abbrev_id = 0;
8996 dw_die_ref c;
8997 dw_attr_node *a;
8998 unsigned ix;
8999 dw_die_ref abbrev;
9001 /* Scan the DIE references, and replace any that refer to
9002 DIEs from other CUs (i.e. those which are not marked) with
9003 the local stubs we built in optimize_external_refs. */
9004 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9005 if (AT_class (a) == dw_val_class_die_ref
9006 && (c = AT_ref (a))->die_mark == 0)
9008 struct external_ref *ref_p;
9009 gcc_assert (AT_ref (a)->comdat_type_p || AT_ref (a)->die_id.die_symbol);
9011 ref_p = lookup_external_ref (extern_map, c);
9012 if (ref_p->stub && ref_p->stub != die)
9013 change_AT_die_ref (a, ref_p->stub);
9014 else
9015 /* We aren't changing this reference, so mark it external. */
9016 set_AT_ref_external (a, 1);
9019 FOR_EACH_VEC_SAFE_ELT (abbrev_die_table, abbrev_id, abbrev)
9021 dw_attr_node *die_a, *abbrev_a;
9022 unsigned ix;
9023 bool ok = true;
9025 if (abbrev_id == 0)
9026 continue;
9027 if (abbrev->die_tag != die->die_tag)
9028 continue;
9029 if ((abbrev->die_child != NULL) != (die->die_child != NULL))
9030 continue;
9032 if (vec_safe_length (abbrev->die_attr) != vec_safe_length (die->die_attr))
9033 continue;
9035 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, die_a)
9037 abbrev_a = &(*abbrev->die_attr)[ix];
9038 if ((abbrev_a->dw_attr != die_a->dw_attr)
9039 || (value_format (abbrev_a) != value_format (die_a)))
9041 ok = false;
9042 break;
9045 if (ok)
9046 break;
9049 if (abbrev_id >= vec_safe_length (abbrev_die_table))
9051 vec_safe_push (abbrev_die_table, die);
9052 if (abbrev_opt_start)
9053 abbrev_usage_count.safe_push (0);
9055 if (abbrev_opt_start && abbrev_id >= abbrev_opt_start)
9057 abbrev_usage_count[abbrev_id - abbrev_opt_start]++;
9058 sorted_abbrev_dies.safe_push (die);
9061 die->die_abbrev = abbrev_id;
9062 FOR_EACH_CHILD (die, c, build_abbrev_table (c, extern_map));
9065 /* Callback function for sorted_abbrev_dies vector sorting. We sort
9066 by die_abbrev's usage count, from the most commonly used
9067 abbreviation to the least. */
9069 static int
9070 die_abbrev_cmp (const void *p1, const void *p2)
9072 dw_die_ref die1 = *(const dw_die_ref *) p1;
9073 dw_die_ref die2 = *(const dw_die_ref *) p2;
9075 gcc_checking_assert (die1->die_abbrev >= abbrev_opt_start);
9076 gcc_checking_assert (die2->die_abbrev >= abbrev_opt_start);
9078 if (die1->die_abbrev >= abbrev_opt_base_type_end
9079 && die2->die_abbrev >= abbrev_opt_base_type_end)
9081 if (abbrev_usage_count[die1->die_abbrev - abbrev_opt_start]
9082 > abbrev_usage_count[die2->die_abbrev - abbrev_opt_start])
9083 return -1;
9084 if (abbrev_usage_count[die1->die_abbrev - abbrev_opt_start]
9085 < abbrev_usage_count[die2->die_abbrev - abbrev_opt_start])
9086 return 1;
9089 /* Stabilize the sort. */
9090 if (die1->die_abbrev < die2->die_abbrev)
9091 return -1;
9092 if (die1->die_abbrev > die2->die_abbrev)
9093 return 1;
9095 return 0;
9098 /* Convert dw_val_class_const and dw_val_class_unsigned_const class attributes
9099 of DIEs in between sorted_abbrev_dies[first_id] and abbrev_dies[end_id - 1]
9100 into dw_val_class_const_implicit or
9101 dw_val_class_unsigned_const_implicit. */
9103 static void
9104 optimize_implicit_const (unsigned int first_id, unsigned int end,
9105 vec<bool> &implicit_consts)
9107 /* It never makes sense if there is just one DIE using the abbreviation. */
9108 if (end < first_id + 2)
9109 return;
9111 dw_attr_node *a;
9112 unsigned ix, i;
9113 dw_die_ref die = sorted_abbrev_dies[first_id];
9114 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9115 if (implicit_consts[ix])
9117 enum dw_val_class new_class = dw_val_class_none;
9118 switch (AT_class (a))
9120 case dw_val_class_unsigned_const:
9121 if ((HOST_WIDE_INT) AT_unsigned (a) < 0)
9122 continue;
9124 /* The .debug_abbrev section will grow by
9125 size_of_sleb128 (AT_unsigned (a)) and we avoid the constants
9126 in all the DIEs using that abbreviation. */
9127 if (constant_size (AT_unsigned (a)) * (end - first_id)
9128 <= (unsigned) size_of_sleb128 (AT_unsigned (a)))
9129 continue;
9131 new_class = dw_val_class_unsigned_const_implicit;
9132 break;
9134 case dw_val_class_const:
9135 new_class = dw_val_class_const_implicit;
9136 break;
9138 case dw_val_class_file:
9139 new_class = dw_val_class_file_implicit;
9140 break;
9142 default:
9143 continue;
9145 for (i = first_id; i < end; i++)
9146 (*sorted_abbrev_dies[i]->die_attr)[ix].dw_attr_val.val_class
9147 = new_class;
9151 /* Attempt to optimize abbreviation table from abbrev_opt_start
9152 abbreviation above. */
9154 static void
9155 optimize_abbrev_table (void)
9157 if (abbrev_opt_start
9158 && vec_safe_length (abbrev_die_table) > abbrev_opt_start
9159 && (dwarf_version >= 5 || vec_safe_length (abbrev_die_table) > 127))
9161 auto_vec<bool, 32> implicit_consts;
9162 sorted_abbrev_dies.qsort (die_abbrev_cmp);
9164 unsigned int abbrev_id = abbrev_opt_start - 1;
9165 unsigned int first_id = ~0U;
9166 unsigned int last_abbrev_id = 0;
9167 unsigned int i;
9168 dw_die_ref die;
9169 if (abbrev_opt_base_type_end > abbrev_opt_start)
9170 abbrev_id = abbrev_opt_base_type_end - 1;
9171 /* Reassign abbreviation ids from abbrev_opt_start above, so that
9172 most commonly used abbreviations come first. */
9173 FOR_EACH_VEC_ELT (sorted_abbrev_dies, i, die)
9175 dw_attr_node *a;
9176 unsigned ix;
9178 /* If calc_base_type_die_sizes has been called, the CU and
9179 base types after it can't be optimized, because we've already
9180 calculated their DIE offsets. We've sorted them first. */
9181 if (die->die_abbrev < abbrev_opt_base_type_end)
9182 continue;
9183 if (die->die_abbrev != last_abbrev_id)
9185 last_abbrev_id = die->die_abbrev;
9186 if (dwarf_version >= 5 && first_id != ~0U)
9187 optimize_implicit_const (first_id, i, implicit_consts);
9188 abbrev_id++;
9189 (*abbrev_die_table)[abbrev_id] = die;
9190 if (dwarf_version >= 5)
9192 first_id = i;
9193 implicit_consts.truncate (0);
9195 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9196 switch (AT_class (a))
9198 case dw_val_class_const:
9199 case dw_val_class_unsigned_const:
9200 case dw_val_class_file:
9201 implicit_consts.safe_push (true);
9202 break;
9203 default:
9204 implicit_consts.safe_push (false);
9205 break;
9209 else if (dwarf_version >= 5)
9211 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9212 if (!implicit_consts[ix])
9213 continue;
9214 else
9216 dw_attr_node *other_a
9217 = &(*(*abbrev_die_table)[abbrev_id]->die_attr)[ix];
9218 if (!dw_val_equal_p (&a->dw_attr_val,
9219 &other_a->dw_attr_val))
9220 implicit_consts[ix] = false;
9223 die->die_abbrev = abbrev_id;
9225 gcc_assert (abbrev_id == vec_safe_length (abbrev_die_table) - 1);
9226 if (dwarf_version >= 5 && first_id != ~0U)
9227 optimize_implicit_const (first_id, i, implicit_consts);
9230 abbrev_opt_start = 0;
9231 abbrev_opt_base_type_end = 0;
9232 abbrev_usage_count.release ();
9233 sorted_abbrev_dies.release ();
9236 /* Return the power-of-two number of bytes necessary to represent VALUE. */
9238 static int
9239 constant_size (unsigned HOST_WIDE_INT value)
9241 int log;
9243 if (value == 0)
9244 log = 0;
9245 else
9246 log = floor_log2 (value);
9248 log = log / 8;
9249 log = 1 << (floor_log2 (log) + 1);
9251 return log;
9254 /* Return the size of a DIE as it is represented in the
9255 .debug_info section. */
9257 static unsigned long
9258 size_of_die (dw_die_ref die)
9260 unsigned long size = 0;
9261 dw_attr_node *a;
9262 unsigned ix;
9263 enum dwarf_form form;
9265 size += size_of_uleb128 (die->die_abbrev);
9266 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9268 switch (AT_class (a))
9270 case dw_val_class_addr:
9271 if (dwarf_split_debug_info && AT_index (a) != NOT_INDEXED)
9273 gcc_assert (AT_index (a) != NO_INDEX_ASSIGNED);
9274 size += size_of_uleb128 (AT_index (a));
9276 else
9277 size += DWARF2_ADDR_SIZE;
9278 break;
9279 case dw_val_class_offset:
9280 size += DWARF_OFFSET_SIZE;
9281 break;
9282 case dw_val_class_loc:
9284 unsigned long lsize = size_of_locs (AT_loc (a));
9286 /* Block length. */
9287 if (dwarf_version >= 4)
9288 size += size_of_uleb128 (lsize);
9289 else
9290 size += constant_size (lsize);
9291 size += lsize;
9293 break;
9294 case dw_val_class_loc_list:
9295 case dw_val_class_view_list:
9296 if (dwarf_split_debug_info && dwarf_version >= 5)
9298 gcc_assert (AT_loc_list (a)->num_assigned);
9299 size += size_of_uleb128 (AT_loc_list (a)->hash);
9301 else
9302 size += DWARF_OFFSET_SIZE;
9303 break;
9304 case dw_val_class_range_list:
9305 if (value_format (a) == DW_FORM_rnglistx)
9307 gcc_assert (rnglist_idx);
9308 dw_ranges *r = &(*ranges_table)[a->dw_attr_val.v.val_offset];
9309 size += size_of_uleb128 (r->idx);
9311 else
9312 size += DWARF_OFFSET_SIZE;
9313 break;
9314 case dw_val_class_const:
9315 size += size_of_sleb128 (AT_int (a));
9316 break;
9317 case dw_val_class_unsigned_const:
9319 int csize = constant_size (AT_unsigned (a));
9320 if (dwarf_version == 3
9321 && a->dw_attr == DW_AT_data_member_location
9322 && csize >= 4)
9323 size += size_of_uleb128 (AT_unsigned (a));
9324 else
9325 size += csize;
9327 break;
9328 case dw_val_class_symview:
9329 if (symview_upper_bound <= 0xff)
9330 size += 1;
9331 else if (symview_upper_bound <= 0xffff)
9332 size += 2;
9333 else if (symview_upper_bound <= 0xffffffff)
9334 size += 4;
9335 else
9336 size += 8;
9337 break;
9338 case dw_val_class_const_implicit:
9339 case dw_val_class_unsigned_const_implicit:
9340 case dw_val_class_file_implicit:
9341 /* These occupy no size in the DIE, just an extra sleb128 in
9342 .debug_abbrev. */
9343 break;
9344 case dw_val_class_const_double:
9345 size += HOST_BITS_PER_DOUBLE_INT / HOST_BITS_PER_CHAR;
9346 if (HOST_BITS_PER_WIDE_INT >= DWARF_LARGEST_DATA_FORM_BITS)
9347 size++; /* block */
9348 break;
9349 case dw_val_class_wide_int:
9350 size += (get_full_len (*a->dw_attr_val.v.val_wide)
9351 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
9352 if (get_full_len (*a->dw_attr_val.v.val_wide)
9353 * HOST_BITS_PER_WIDE_INT > DWARF_LARGEST_DATA_FORM_BITS)
9354 size++; /* block */
9355 break;
9356 case dw_val_class_vec:
9357 size += constant_size (a->dw_attr_val.v.val_vec.length
9358 * a->dw_attr_val.v.val_vec.elt_size)
9359 + a->dw_attr_val.v.val_vec.length
9360 * a->dw_attr_val.v.val_vec.elt_size; /* block */
9361 break;
9362 case dw_val_class_flag:
9363 if (dwarf_version >= 4)
9364 /* Currently all add_AT_flag calls pass in 1 as last argument,
9365 so DW_FORM_flag_present can be used. If that ever changes,
9366 we'll need to use DW_FORM_flag and have some optimization
9367 in build_abbrev_table that will change those to
9368 DW_FORM_flag_present if it is set to 1 in all DIEs using
9369 the same abbrev entry. */
9370 gcc_assert (a->dw_attr_val.v.val_flag == 1);
9371 else
9372 size += 1;
9373 break;
9374 case dw_val_class_die_ref:
9375 if (AT_ref_external (a))
9377 /* In DWARF4, we use DW_FORM_ref_sig8; for earlier versions
9378 we use DW_FORM_ref_addr. In DWARF2, DW_FORM_ref_addr
9379 is sized by target address length, whereas in DWARF3
9380 it's always sized as an offset. */
9381 if (use_debug_types)
9382 size += DWARF_TYPE_SIGNATURE_SIZE;
9383 else if (dwarf_version == 2)
9384 size += DWARF2_ADDR_SIZE;
9385 else
9386 size += DWARF_OFFSET_SIZE;
9388 else
9389 size += DWARF_OFFSET_SIZE;
9390 break;
9391 case dw_val_class_fde_ref:
9392 size += DWARF_OFFSET_SIZE;
9393 break;
9394 case dw_val_class_lbl_id:
9395 if (dwarf_split_debug_info && AT_index (a) != NOT_INDEXED)
9397 gcc_assert (AT_index (a) != NO_INDEX_ASSIGNED);
9398 size += size_of_uleb128 (AT_index (a));
9400 else
9401 size += DWARF2_ADDR_SIZE;
9402 break;
9403 case dw_val_class_lineptr:
9404 case dw_val_class_macptr:
9405 case dw_val_class_loclistsptr:
9406 size += DWARF_OFFSET_SIZE;
9407 break;
9408 case dw_val_class_str:
9409 form = AT_string_form (a);
9410 if (form == DW_FORM_strp || form == DW_FORM_line_strp)
9411 size += DWARF_OFFSET_SIZE;
9412 else if (form == DW_FORM_GNU_str_index)
9413 size += size_of_uleb128 (AT_index (a));
9414 else
9415 size += strlen (a->dw_attr_val.v.val_str->str) + 1;
9416 break;
9417 case dw_val_class_file:
9418 size += constant_size (maybe_emit_file (a->dw_attr_val.v.val_file));
9419 break;
9420 case dw_val_class_data8:
9421 size += 8;
9422 break;
9423 case dw_val_class_vms_delta:
9424 size += DWARF_OFFSET_SIZE;
9425 break;
9426 case dw_val_class_high_pc:
9427 size += DWARF2_ADDR_SIZE;
9428 break;
9429 case dw_val_class_discr_value:
9430 size += size_of_discr_value (&a->dw_attr_val.v.val_discr_value);
9431 break;
9432 case dw_val_class_discr_list:
9434 unsigned block_size = size_of_discr_list (AT_discr_list (a));
9436 /* This is a block, so we have the block length and then its
9437 data. */
9438 size += constant_size (block_size) + block_size;
9440 break;
9441 default:
9442 gcc_unreachable ();
9446 return size;
9449 /* Size the debugging information associated with a given DIE. Visits the
9450 DIE's children recursively. Updates the global variable next_die_offset, on
9451 each time through. Uses the current value of next_die_offset to update the
9452 die_offset field in each DIE. */
9454 static void
9455 calc_die_sizes (dw_die_ref die)
9457 dw_die_ref c;
9459 gcc_assert (die->die_offset == 0
9460 || (unsigned long int) die->die_offset == next_die_offset);
9461 die->die_offset = next_die_offset;
9462 next_die_offset += size_of_die (die);
9464 FOR_EACH_CHILD (die, c, calc_die_sizes (c));
9466 if (die->die_child != NULL)
9467 /* Count the null byte used to terminate sibling lists. */
9468 next_die_offset += 1;
9471 /* Size just the base type children at the start of the CU.
9472 This is needed because build_abbrev needs to size locs
9473 and sizing of type based stack ops needs to know die_offset
9474 values for the base types. */
9476 static void
9477 calc_base_type_die_sizes (void)
9479 unsigned long die_offset = (dwarf_split_debug_info
9480 ? DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE
9481 : DWARF_COMPILE_UNIT_HEADER_SIZE);
9482 unsigned int i;
9483 dw_die_ref base_type;
9484 #if ENABLE_ASSERT_CHECKING
9485 dw_die_ref prev = comp_unit_die ()->die_child;
9486 #endif
9488 die_offset += size_of_die (comp_unit_die ());
9489 for (i = 0; base_types.iterate (i, &base_type); i++)
9491 #if ENABLE_ASSERT_CHECKING
9492 gcc_assert (base_type->die_offset == 0
9493 && prev->die_sib == base_type
9494 && base_type->die_child == NULL
9495 && base_type->die_abbrev);
9496 prev = base_type;
9497 #endif
9498 if (abbrev_opt_start
9499 && base_type->die_abbrev >= abbrev_opt_base_type_end)
9500 abbrev_opt_base_type_end = base_type->die_abbrev + 1;
9501 base_type->die_offset = die_offset;
9502 die_offset += size_of_die (base_type);
9506 /* Set the marks for a die and its children. We do this so
9507 that we know whether or not a reference needs to use FORM_ref_addr; only
9508 DIEs in the same CU will be marked. We used to clear out the offset
9509 and use that as the flag, but ran into ordering problems. */
9511 static void
9512 mark_dies (dw_die_ref die)
9514 dw_die_ref c;
9516 gcc_assert (!die->die_mark);
9518 die->die_mark = 1;
9519 FOR_EACH_CHILD (die, c, mark_dies (c));
9522 /* Clear the marks for a die and its children. */
9524 static void
9525 unmark_dies (dw_die_ref die)
9527 dw_die_ref c;
9529 if (! use_debug_types)
9530 gcc_assert (die->die_mark);
9532 die->die_mark = 0;
9533 FOR_EACH_CHILD (die, c, unmark_dies (c));
9536 /* Clear the marks for a die, its children and referred dies. */
9538 static void
9539 unmark_all_dies (dw_die_ref die)
9541 dw_die_ref c;
9542 dw_attr_node *a;
9543 unsigned ix;
9545 if (!die->die_mark)
9546 return;
9547 die->die_mark = 0;
9549 FOR_EACH_CHILD (die, c, unmark_all_dies (c));
9551 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
9552 if (AT_class (a) == dw_val_class_die_ref)
9553 unmark_all_dies (AT_ref (a));
9556 /* Calculate if the entry should appear in the final output file. It may be
9557 from a pruned a type. */
9559 static bool
9560 include_pubname_in_output (vec<pubname_entry, va_gc> *table, pubname_entry *p)
9562 /* By limiting gnu pubnames to definitions only, gold can generate a
9563 gdb index without entries for declarations, which don't include
9564 enough information to be useful. */
9565 if (debug_generate_pub_sections == 2 && is_declaration_die (p->die))
9566 return false;
9568 if (table == pubname_table)
9570 /* Enumerator names are part of the pubname table, but the
9571 parent DW_TAG_enumeration_type die may have been pruned.
9572 Don't output them if that is the case. */
9573 if (p->die->die_tag == DW_TAG_enumerator &&
9574 (p->die->die_parent == NULL
9575 || !p->die->die_parent->die_perennial_p))
9576 return false;
9578 /* Everything else in the pubname table is included. */
9579 return true;
9582 /* The pubtypes table shouldn't include types that have been
9583 pruned. */
9584 return (p->die->die_offset != 0
9585 || !flag_eliminate_unused_debug_types);
9588 /* Return the size of the .debug_pubnames or .debug_pubtypes table
9589 generated for the compilation unit. */
9591 static unsigned long
9592 size_of_pubnames (vec<pubname_entry, va_gc> *names)
9594 unsigned long size;
9595 unsigned i;
9596 pubname_entry *p;
9597 int space_for_flags = (debug_generate_pub_sections == 2) ? 1 : 0;
9599 size = DWARF_PUBNAMES_HEADER_SIZE;
9600 FOR_EACH_VEC_ELT (*names, i, p)
9601 if (include_pubname_in_output (names, p))
9602 size += strlen (p->name) + DWARF_OFFSET_SIZE + 1 + space_for_flags;
9604 size += DWARF_OFFSET_SIZE;
9605 return size;
9608 /* Return the size of the information in the .debug_aranges section. */
9610 static unsigned long
9611 size_of_aranges (void)
9613 unsigned long size;
9615 size = DWARF_ARANGES_HEADER_SIZE;
9617 /* Count the address/length pair for this compilation unit. */
9618 if (text_section_used)
9619 size += 2 * DWARF2_ADDR_SIZE;
9620 if (cold_text_section_used)
9621 size += 2 * DWARF2_ADDR_SIZE;
9622 if (have_multiple_function_sections)
9624 unsigned fde_idx;
9625 dw_fde_ref fde;
9627 FOR_EACH_VEC_ELT (*fde_vec, fde_idx, fde)
9629 if (DECL_IGNORED_P (fde->decl))
9630 continue;
9631 if (!fde->in_std_section)
9632 size += 2 * DWARF2_ADDR_SIZE;
9633 if (fde->dw_fde_second_begin && !fde->second_in_std_section)
9634 size += 2 * DWARF2_ADDR_SIZE;
9638 /* Count the two zero words used to terminated the address range table. */
9639 size += 2 * DWARF2_ADDR_SIZE;
9640 return size;
9643 /* Select the encoding of an attribute value. */
9645 static enum dwarf_form
9646 value_format (dw_attr_node *a)
9648 switch (AT_class (a))
9650 case dw_val_class_addr:
9651 /* Only very few attributes allow DW_FORM_addr. */
9652 switch (a->dw_attr)
9654 case DW_AT_low_pc:
9655 case DW_AT_high_pc:
9656 case DW_AT_entry_pc:
9657 case DW_AT_trampoline:
9658 return (AT_index (a) == NOT_INDEXED
9659 ? DW_FORM_addr : DW_FORM_GNU_addr_index);
9660 default:
9661 break;
9663 switch (DWARF2_ADDR_SIZE)
9665 case 1:
9666 return DW_FORM_data1;
9667 case 2:
9668 return DW_FORM_data2;
9669 case 4:
9670 return DW_FORM_data4;
9671 case 8:
9672 return DW_FORM_data8;
9673 default:
9674 gcc_unreachable ();
9676 case dw_val_class_loc_list:
9677 case dw_val_class_view_list:
9678 if (dwarf_split_debug_info
9679 && dwarf_version >= 5
9680 && AT_loc_list (a)->num_assigned)
9681 return DW_FORM_loclistx;
9682 /* FALLTHRU */
9683 case dw_val_class_range_list:
9684 /* For range lists in DWARF 5, use DW_FORM_rnglistx from .debug_info.dwo
9685 but in .debug_info use DW_FORM_sec_offset, which is shorter if we
9686 care about sizes of .debug* sections in shared libraries and
9687 executables and don't take into account relocations that affect just
9688 relocatable objects - for DW_FORM_rnglistx we'd have to emit offset
9689 table in the .debug_rnglists section. */
9690 if (dwarf_split_debug_info
9691 && dwarf_version >= 5
9692 && AT_class (a) == dw_val_class_range_list
9693 && rnglist_idx
9694 && a->dw_attr_val.val_entry != RELOCATED_OFFSET)
9695 return DW_FORM_rnglistx;
9696 if (dwarf_version >= 4)
9697 return DW_FORM_sec_offset;
9698 /* FALLTHRU */
9699 case dw_val_class_vms_delta:
9700 case dw_val_class_offset:
9701 switch (DWARF_OFFSET_SIZE)
9703 case 4:
9704 return DW_FORM_data4;
9705 case 8:
9706 return DW_FORM_data8;
9707 default:
9708 gcc_unreachable ();
9710 case dw_val_class_loc:
9711 if (dwarf_version >= 4)
9712 return DW_FORM_exprloc;
9713 switch (constant_size (size_of_locs (AT_loc (a))))
9715 case 1:
9716 return DW_FORM_block1;
9717 case 2:
9718 return DW_FORM_block2;
9719 case 4:
9720 return DW_FORM_block4;
9721 default:
9722 gcc_unreachable ();
9724 case dw_val_class_const:
9725 return DW_FORM_sdata;
9726 case dw_val_class_unsigned_const:
9727 switch (constant_size (AT_unsigned (a)))
9729 case 1:
9730 return DW_FORM_data1;
9731 case 2:
9732 return DW_FORM_data2;
9733 case 4:
9734 /* In DWARF3 DW_AT_data_member_location with
9735 DW_FORM_data4 or DW_FORM_data8 is a loclistptr, not
9736 constant, so we need to use DW_FORM_udata if we need
9737 a large constant. */
9738 if (dwarf_version == 3 && a->dw_attr == DW_AT_data_member_location)
9739 return DW_FORM_udata;
9740 return DW_FORM_data4;
9741 case 8:
9742 if (dwarf_version == 3 && a->dw_attr == DW_AT_data_member_location)
9743 return DW_FORM_udata;
9744 return DW_FORM_data8;
9745 default:
9746 gcc_unreachable ();
9748 case dw_val_class_const_implicit:
9749 case dw_val_class_unsigned_const_implicit:
9750 case dw_val_class_file_implicit:
9751 return DW_FORM_implicit_const;
9752 case dw_val_class_const_double:
9753 switch (HOST_BITS_PER_WIDE_INT)
9755 case 8:
9756 return DW_FORM_data2;
9757 case 16:
9758 return DW_FORM_data4;
9759 case 32:
9760 return DW_FORM_data8;
9761 case 64:
9762 if (dwarf_version >= 5)
9763 return DW_FORM_data16;
9764 /* FALLTHRU */
9765 default:
9766 return DW_FORM_block1;
9768 case dw_val_class_wide_int:
9769 switch (get_full_len (*a->dw_attr_val.v.val_wide) * HOST_BITS_PER_WIDE_INT)
9771 case 8:
9772 return DW_FORM_data1;
9773 case 16:
9774 return DW_FORM_data2;
9775 case 32:
9776 return DW_FORM_data4;
9777 case 64:
9778 return DW_FORM_data8;
9779 case 128:
9780 if (dwarf_version >= 5)
9781 return DW_FORM_data16;
9782 /* FALLTHRU */
9783 default:
9784 return DW_FORM_block1;
9786 case dw_val_class_symview:
9787 /* ??? We might use uleb128, but then we'd have to compute
9788 .debug_info offsets in the assembler. */
9789 if (symview_upper_bound <= 0xff)
9790 return DW_FORM_data1;
9791 else if (symview_upper_bound <= 0xffff)
9792 return DW_FORM_data2;
9793 else if (symview_upper_bound <= 0xffffffff)
9794 return DW_FORM_data4;
9795 else
9796 return DW_FORM_data8;
9797 case dw_val_class_vec:
9798 switch (constant_size (a->dw_attr_val.v.val_vec.length
9799 * a->dw_attr_val.v.val_vec.elt_size))
9801 case 1:
9802 return DW_FORM_block1;
9803 case 2:
9804 return DW_FORM_block2;
9805 case 4:
9806 return DW_FORM_block4;
9807 default:
9808 gcc_unreachable ();
9810 case dw_val_class_flag:
9811 if (dwarf_version >= 4)
9813 /* Currently all add_AT_flag calls pass in 1 as last argument,
9814 so DW_FORM_flag_present can be used. If that ever changes,
9815 we'll need to use DW_FORM_flag and have some optimization
9816 in build_abbrev_table that will change those to
9817 DW_FORM_flag_present if it is set to 1 in all DIEs using
9818 the same abbrev entry. */
9819 gcc_assert (a->dw_attr_val.v.val_flag == 1);
9820 return DW_FORM_flag_present;
9822 return DW_FORM_flag;
9823 case dw_val_class_die_ref:
9824 if (AT_ref_external (a))
9825 return use_debug_types ? DW_FORM_ref_sig8 : DW_FORM_ref_addr;
9826 else
9827 return DW_FORM_ref;
9828 case dw_val_class_fde_ref:
9829 return DW_FORM_data;
9830 case dw_val_class_lbl_id:
9831 return (AT_index (a) == NOT_INDEXED
9832 ? DW_FORM_addr : DW_FORM_GNU_addr_index);
9833 case dw_val_class_lineptr:
9834 case dw_val_class_macptr:
9835 case dw_val_class_loclistsptr:
9836 return dwarf_version >= 4 ? DW_FORM_sec_offset : DW_FORM_data;
9837 case dw_val_class_str:
9838 return AT_string_form (a);
9839 case dw_val_class_file:
9840 switch (constant_size (maybe_emit_file (a->dw_attr_val.v.val_file)))
9842 case 1:
9843 return DW_FORM_data1;
9844 case 2:
9845 return DW_FORM_data2;
9846 case 4:
9847 return DW_FORM_data4;
9848 default:
9849 gcc_unreachable ();
9852 case dw_val_class_data8:
9853 return DW_FORM_data8;
9855 case dw_val_class_high_pc:
9856 switch (DWARF2_ADDR_SIZE)
9858 case 1:
9859 return DW_FORM_data1;
9860 case 2:
9861 return DW_FORM_data2;
9862 case 4:
9863 return DW_FORM_data4;
9864 case 8:
9865 return DW_FORM_data8;
9866 default:
9867 gcc_unreachable ();
9870 case dw_val_class_discr_value:
9871 return (a->dw_attr_val.v.val_discr_value.pos
9872 ? DW_FORM_udata
9873 : DW_FORM_sdata);
9874 case dw_val_class_discr_list:
9875 switch (constant_size (size_of_discr_list (AT_discr_list (a))))
9877 case 1:
9878 return DW_FORM_block1;
9879 case 2:
9880 return DW_FORM_block2;
9881 case 4:
9882 return DW_FORM_block4;
9883 default:
9884 gcc_unreachable ();
9887 default:
9888 gcc_unreachable ();
9892 /* Output the encoding of an attribute value. */
9894 static void
9895 output_value_format (dw_attr_node *a)
9897 enum dwarf_form form = value_format (a);
9899 dw2_asm_output_data_uleb128 (form, "(%s)", dwarf_form_name (form));
9902 /* Given a die and id, produce the appropriate abbreviations. */
9904 static void
9905 output_die_abbrevs (unsigned long abbrev_id, dw_die_ref abbrev)
9907 unsigned ix;
9908 dw_attr_node *a_attr;
9910 dw2_asm_output_data_uleb128 (abbrev_id, "(abbrev code)");
9911 dw2_asm_output_data_uleb128 (abbrev->die_tag, "(TAG: %s)",
9912 dwarf_tag_name (abbrev->die_tag));
9914 if (abbrev->die_child != NULL)
9915 dw2_asm_output_data (1, DW_children_yes, "DW_children_yes");
9916 else
9917 dw2_asm_output_data (1, DW_children_no, "DW_children_no");
9919 for (ix = 0; vec_safe_iterate (abbrev->die_attr, ix, &a_attr); ix++)
9921 dw2_asm_output_data_uleb128 (a_attr->dw_attr, "(%s)",
9922 dwarf_attr_name (a_attr->dw_attr));
9923 output_value_format (a_attr);
9924 if (value_format (a_attr) == DW_FORM_implicit_const)
9926 if (AT_class (a_attr) == dw_val_class_file_implicit)
9928 int f = maybe_emit_file (a_attr->dw_attr_val.v.val_file);
9929 const char *filename = a_attr->dw_attr_val.v.val_file->filename;
9930 dw2_asm_output_data_sleb128 (f, "(%s)", filename);
9932 else
9933 dw2_asm_output_data_sleb128 (a_attr->dw_attr_val.v.val_int, NULL);
9937 dw2_asm_output_data (1, 0, NULL);
9938 dw2_asm_output_data (1, 0, NULL);
9942 /* Output the .debug_abbrev section which defines the DIE abbreviation
9943 table. */
9945 static void
9946 output_abbrev_section (void)
9948 unsigned int abbrev_id;
9949 dw_die_ref abbrev;
9951 FOR_EACH_VEC_SAFE_ELT (abbrev_die_table, abbrev_id, abbrev)
9952 if (abbrev_id != 0)
9953 output_die_abbrevs (abbrev_id, abbrev);
9955 /* Terminate the table. */
9956 dw2_asm_output_data (1, 0, NULL);
9959 /* Return a new location list, given the begin and end range, and the
9960 expression. */
9962 static inline dw_loc_list_ref
9963 new_loc_list (dw_loc_descr_ref expr, const char *begin, var_loc_view vbegin,
9964 const char *end, var_loc_view vend,
9965 const char *section)
9967 dw_loc_list_ref retlist = ggc_cleared_alloc<dw_loc_list_node> ();
9969 retlist->begin = begin;
9970 retlist->begin_entry = NULL;
9971 retlist->end = end;
9972 retlist->expr = expr;
9973 retlist->section = section;
9974 retlist->vbegin = vbegin;
9975 retlist->vend = vend;
9977 return retlist;
9980 /* Return true iff there's any nonzero view number in the loc list. */
9982 static bool
9983 loc_list_has_views (dw_loc_list_ref list)
9985 if (!debug_variable_location_views)
9986 return false;
9988 for (dw_loc_list_ref loc = list;
9989 loc != NULL; loc = loc->dw_loc_next)
9990 if (!ZERO_VIEW_P (loc->vbegin) || !ZERO_VIEW_P (loc->vend))
9991 return true;
9993 return false;
9996 /* Generate a new internal symbol for this location list node, if it
9997 hasn't got one yet. */
9999 static inline void
10000 gen_llsym (dw_loc_list_ref list)
10002 gcc_assert (!list->ll_symbol);
10003 list->ll_symbol = gen_internal_sym ("LLST");
10005 if (!loc_list_has_views (list))
10006 return;
10008 if (dwarf2out_locviews_in_attribute ())
10010 /* Use the same label_num for the view list. */
10011 label_num--;
10012 list->vl_symbol = gen_internal_sym ("LVUS");
10014 else
10015 list->vl_symbol = list->ll_symbol;
10018 /* Generate a symbol for the list, but only if we really want to emit
10019 it as a list. */
10021 static inline void
10022 maybe_gen_llsym (dw_loc_list_ref list)
10024 if (!list || (!list->dw_loc_next && !loc_list_has_views (list)))
10025 return;
10027 gen_llsym (list);
10030 /* Determine whether or not to skip loc_list entry CURR. If we're not
10031 to skip it, and SIZEP is non-null, store the size of CURR->expr's
10032 representation in *SIZEP. */
10034 static bool
10035 skip_loc_list_entry (dw_loc_list_ref curr, unsigned long *sizep = 0)
10037 /* Don't output an entry that starts and ends at the same address. */
10038 if (strcmp (curr->begin, curr->end) == 0
10039 && curr->vbegin == curr->vend && !curr->force)
10040 return true;
10042 unsigned long size = size_of_locs (curr->expr);
10044 /* If the expression is too large, drop it on the floor. We could
10045 perhaps put it into DW_TAG_dwarf_procedure and refer to that
10046 in the expression, but >= 64KB expressions for a single value
10047 in a single range are unlikely very useful. */
10048 if (dwarf_version < 5 && size > 0xffff)
10049 return true;
10051 if (sizep)
10052 *sizep = size;
10054 return false;
10057 /* Output a view pair loclist entry for CURR, if it requires one. */
10059 static void
10060 dwarf2out_maybe_output_loclist_view_pair (dw_loc_list_ref curr)
10062 if (!dwarf2out_locviews_in_loclist ())
10063 return;
10065 if (ZERO_VIEW_P (curr->vbegin) && ZERO_VIEW_P (curr->vend))
10066 return;
10068 #ifdef DW_LLE_view_pair
10069 dw2_asm_output_data (1, DW_LLE_view_pair, "DW_LLE_view_pair");
10071 if (dwarf2out_as_locview_support)
10073 if (ZERO_VIEW_P (curr->vbegin))
10074 dw2_asm_output_data_uleb128 (0, "Location view begin");
10075 else
10077 char label[MAX_ARTIFICIAL_LABEL_BYTES];
10078 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", curr->vbegin);
10079 dw2_asm_output_symname_uleb128 (label, "Location view begin");
10082 if (ZERO_VIEW_P (curr->vend))
10083 dw2_asm_output_data_uleb128 (0, "Location view end");
10084 else
10086 char label[MAX_ARTIFICIAL_LABEL_BYTES];
10087 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", curr->vend);
10088 dw2_asm_output_symname_uleb128 (label, "Location view end");
10091 else
10093 dw2_asm_output_data_uleb128 (curr->vbegin, "Location view begin");
10094 dw2_asm_output_data_uleb128 (curr->vend, "Location view end");
10096 #endif /* DW_LLE_view_pair */
10098 return;
10101 /* Output the location list given to us. */
10103 static void
10104 output_loc_list (dw_loc_list_ref list_head)
10106 int vcount = 0, lcount = 0;
10108 if (list_head->emitted)
10109 return;
10110 list_head->emitted = true;
10112 if (list_head->vl_symbol && dwarf2out_locviews_in_attribute ())
10114 ASM_OUTPUT_LABEL (asm_out_file, list_head->vl_symbol);
10116 for (dw_loc_list_ref curr = list_head; curr != NULL;
10117 curr = curr->dw_loc_next)
10119 if (skip_loc_list_entry (curr))
10120 continue;
10122 vcount++;
10124 /* ?? dwarf_split_debug_info? */
10125 if (dwarf2out_as_locview_support)
10127 char label[MAX_ARTIFICIAL_LABEL_BYTES];
10129 if (!ZERO_VIEW_P (curr->vbegin))
10131 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", curr->vbegin);
10132 dw2_asm_output_symname_uleb128 (label,
10133 "View list begin (%s)",
10134 list_head->vl_symbol);
10136 else
10137 dw2_asm_output_data_uleb128 (0,
10138 "View list begin (%s)",
10139 list_head->vl_symbol);
10141 if (!ZERO_VIEW_P (curr->vend))
10143 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", curr->vend);
10144 dw2_asm_output_symname_uleb128 (label,
10145 "View list end (%s)",
10146 list_head->vl_symbol);
10148 else
10149 dw2_asm_output_data_uleb128 (0,
10150 "View list end (%s)",
10151 list_head->vl_symbol);
10153 else
10155 dw2_asm_output_data_uleb128 (curr->vbegin,
10156 "View list begin (%s)",
10157 list_head->vl_symbol);
10158 dw2_asm_output_data_uleb128 (curr->vend,
10159 "View list end (%s)",
10160 list_head->vl_symbol);
10165 ASM_OUTPUT_LABEL (asm_out_file, list_head->ll_symbol);
10167 const char *last_section = NULL;
10168 const char *base_label = NULL;
10170 /* Walk the location list, and output each range + expression. */
10171 for (dw_loc_list_ref curr = list_head; curr != NULL;
10172 curr = curr->dw_loc_next)
10174 unsigned long size;
10176 /* Skip this entry? If we skip it here, we must skip it in the
10177 view list above as well. */
10178 if (skip_loc_list_entry (curr, &size))
10179 continue;
10181 lcount++;
10183 if (dwarf_version >= 5)
10185 if (dwarf_split_debug_info)
10187 dwarf2out_maybe_output_loclist_view_pair (curr);
10188 /* For -gsplit-dwarf, emit DW_LLE_starx_length, which has
10189 uleb128 index into .debug_addr and uleb128 length. */
10190 dw2_asm_output_data (1, DW_LLE_startx_length,
10191 "DW_LLE_startx_length (%s)",
10192 list_head->ll_symbol);
10193 dw2_asm_output_data_uleb128 (curr->begin_entry->index,
10194 "Location list range start index "
10195 "(%s)", curr->begin);
10196 /* FIXME: This will ICE ifndef HAVE_AS_LEB128.
10197 For that case we probably need to emit DW_LLE_startx_endx,
10198 but we'd need 2 .debug_addr entries rather than just one. */
10199 dw2_asm_output_delta_uleb128 (curr->end, curr->begin,
10200 "Location list length (%s)",
10201 list_head->ll_symbol);
10203 else if (!have_multiple_function_sections && HAVE_AS_LEB128)
10205 dwarf2out_maybe_output_loclist_view_pair (curr);
10206 /* If all code is in .text section, the base address is
10207 already provided by the CU attributes. Use
10208 DW_LLE_offset_pair where both addresses are uleb128 encoded
10209 offsets against that base. */
10210 dw2_asm_output_data (1, DW_LLE_offset_pair,
10211 "DW_LLE_offset_pair (%s)",
10212 list_head->ll_symbol);
10213 dw2_asm_output_delta_uleb128 (curr->begin, curr->section,
10214 "Location list begin address (%s)",
10215 list_head->ll_symbol);
10216 dw2_asm_output_delta_uleb128 (curr->end, curr->section,
10217 "Location list end address (%s)",
10218 list_head->ll_symbol);
10220 else if (HAVE_AS_LEB128)
10222 /* Otherwise, find out how many consecutive entries could share
10223 the same base entry. If just one, emit DW_LLE_start_length,
10224 otherwise emit DW_LLE_base_address for the base address
10225 followed by a series of DW_LLE_offset_pair. */
10226 if (last_section == NULL || curr->section != last_section)
10228 dw_loc_list_ref curr2;
10229 for (curr2 = curr->dw_loc_next; curr2 != NULL;
10230 curr2 = curr2->dw_loc_next)
10232 if (strcmp (curr2->begin, curr2->end) == 0
10233 && !curr2->force)
10234 continue;
10235 break;
10237 if (curr2 == NULL || curr->section != curr2->section)
10238 last_section = NULL;
10239 else
10241 last_section = curr->section;
10242 base_label = curr->begin;
10243 dw2_asm_output_data (1, DW_LLE_base_address,
10244 "DW_LLE_base_address (%s)",
10245 list_head->ll_symbol);
10246 dw2_asm_output_addr (DWARF2_ADDR_SIZE, base_label,
10247 "Base address (%s)",
10248 list_head->ll_symbol);
10251 /* Only one entry with the same base address. Use
10252 DW_LLE_start_length with absolute address and uleb128
10253 length. */
10254 if (last_section == NULL)
10256 dwarf2out_maybe_output_loclist_view_pair (curr);
10257 dw2_asm_output_data (1, DW_LLE_start_length,
10258 "DW_LLE_start_length (%s)",
10259 list_head->ll_symbol);
10260 dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->begin,
10261 "Location list begin address (%s)",
10262 list_head->ll_symbol);
10263 dw2_asm_output_delta_uleb128 (curr->end, curr->begin,
10264 "Location list length "
10265 "(%s)", list_head->ll_symbol);
10267 /* Otherwise emit DW_LLE_offset_pair, relative to above emitted
10268 DW_LLE_base_address. */
10269 else
10271 dwarf2out_maybe_output_loclist_view_pair (curr);
10272 dw2_asm_output_data (1, DW_LLE_offset_pair,
10273 "DW_LLE_offset_pair (%s)",
10274 list_head->ll_symbol);
10275 dw2_asm_output_delta_uleb128 (curr->begin, base_label,
10276 "Location list begin address "
10277 "(%s)", list_head->ll_symbol);
10278 dw2_asm_output_delta_uleb128 (curr->end, base_label,
10279 "Location list end address "
10280 "(%s)", list_head->ll_symbol);
10283 /* The assembler does not support .uleb128 directive. Emit
10284 DW_LLE_start_end with a pair of absolute addresses. */
10285 else
10287 dwarf2out_maybe_output_loclist_view_pair (curr);
10288 dw2_asm_output_data (1, DW_LLE_start_end,
10289 "DW_LLE_start_end (%s)",
10290 list_head->ll_symbol);
10291 dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->begin,
10292 "Location list begin address (%s)",
10293 list_head->ll_symbol);
10294 dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->end,
10295 "Location list end address (%s)",
10296 list_head->ll_symbol);
10299 else if (dwarf_split_debug_info)
10301 /* For -gsplit-dwarf -gdwarf-{2,3,4} emit index into .debug_addr
10302 and 4 byte length. */
10303 dw2_asm_output_data (1, DW_LLE_GNU_start_length_entry,
10304 "Location list start/length entry (%s)",
10305 list_head->ll_symbol);
10306 dw2_asm_output_data_uleb128 (curr->begin_entry->index,
10307 "Location list range start index (%s)",
10308 curr->begin);
10309 /* The length field is 4 bytes. If we ever need to support
10310 an 8-byte length, we can add a new DW_LLE code or fall back
10311 to DW_LLE_GNU_start_end_entry. */
10312 dw2_asm_output_delta (4, curr->end, curr->begin,
10313 "Location list range length (%s)",
10314 list_head->ll_symbol);
10316 else if (!have_multiple_function_sections)
10318 /* Pair of relative addresses against start of text section. */
10319 dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->begin, curr->section,
10320 "Location list begin address (%s)",
10321 list_head->ll_symbol);
10322 dw2_asm_output_delta (DWARF2_ADDR_SIZE, curr->end, curr->section,
10323 "Location list end address (%s)",
10324 list_head->ll_symbol);
10326 else
10328 /* Pair of absolute addresses. */
10329 dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->begin,
10330 "Location list begin address (%s)",
10331 list_head->ll_symbol);
10332 dw2_asm_output_addr (DWARF2_ADDR_SIZE, curr->end,
10333 "Location list end address (%s)",
10334 list_head->ll_symbol);
10337 /* Output the block length for this list of location operations. */
10338 if (dwarf_version >= 5)
10339 dw2_asm_output_data_uleb128 (size, "Location expression size");
10340 else
10342 gcc_assert (size <= 0xffff);
10343 dw2_asm_output_data (2, size, "Location expression size");
10346 output_loc_sequence (curr->expr, -1);
10349 /* And finally list termination. */
10350 if (dwarf_version >= 5)
10351 dw2_asm_output_data (1, DW_LLE_end_of_list,
10352 "DW_LLE_end_of_list (%s)", list_head->ll_symbol);
10353 else if (dwarf_split_debug_info)
10354 dw2_asm_output_data (1, DW_LLE_GNU_end_of_list_entry,
10355 "Location list terminator (%s)",
10356 list_head->ll_symbol);
10357 else
10359 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0,
10360 "Location list terminator begin (%s)",
10361 list_head->ll_symbol);
10362 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0,
10363 "Location list terminator end (%s)",
10364 list_head->ll_symbol);
10367 gcc_assert (!list_head->vl_symbol
10368 || vcount == lcount * (dwarf2out_locviews_in_attribute () ? 1 : 0));
10371 /* Output a range_list offset into the .debug_ranges or .debug_rnglists
10372 section. Emit a relocated reference if val_entry is NULL, otherwise,
10373 emit an indirect reference. */
10375 static void
10376 output_range_list_offset (dw_attr_node *a)
10378 const char *name = dwarf_attr_name (a->dw_attr);
10380 if (a->dw_attr_val.val_entry == RELOCATED_OFFSET)
10382 if (dwarf_version >= 5)
10384 dw_ranges *r = &(*ranges_table)[a->dw_attr_val.v.val_offset];
10385 dw2_asm_output_offset (DWARF_OFFSET_SIZE, r->label,
10386 debug_ranges_section, "%s", name);
10388 else
10390 char *p = strchr (ranges_section_label, '\0');
10391 sprintf (p, "+" HOST_WIDE_INT_PRINT_HEX,
10392 a->dw_attr_val.v.val_offset * 2 * DWARF2_ADDR_SIZE);
10393 dw2_asm_output_offset (DWARF_OFFSET_SIZE, ranges_section_label,
10394 debug_ranges_section, "%s", name);
10395 *p = '\0';
10398 else if (dwarf_version >= 5)
10400 dw_ranges *r = &(*ranges_table)[a->dw_attr_val.v.val_offset];
10401 gcc_assert (rnglist_idx);
10402 dw2_asm_output_data_uleb128 (r->idx, "%s", name);
10404 else
10405 dw2_asm_output_data (DWARF_OFFSET_SIZE,
10406 a->dw_attr_val.v.val_offset * 2 * DWARF2_ADDR_SIZE,
10407 "%s (offset from %s)", name, ranges_section_label);
10410 /* Output the offset into the debug_loc section. */
10412 static void
10413 output_loc_list_offset (dw_attr_node *a)
10415 char *sym = AT_loc_list (a)->ll_symbol;
10417 gcc_assert (sym);
10418 if (!dwarf_split_debug_info)
10419 dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section,
10420 "%s", dwarf_attr_name (a->dw_attr));
10421 else if (dwarf_version >= 5)
10423 gcc_assert (AT_loc_list (a)->num_assigned);
10424 dw2_asm_output_data_uleb128 (AT_loc_list (a)->hash, "%s (%s)",
10425 dwarf_attr_name (a->dw_attr),
10426 sym);
10428 else
10429 dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label,
10430 "%s", dwarf_attr_name (a->dw_attr));
10433 /* Output the offset into the debug_loc section. */
10435 static void
10436 output_view_list_offset (dw_attr_node *a)
10438 char *sym = (*AT_loc_list_ptr (a))->vl_symbol;
10440 gcc_assert (sym);
10441 if (dwarf_split_debug_info)
10442 dw2_asm_output_delta (DWARF_OFFSET_SIZE, sym, loc_section_label,
10443 "%s", dwarf_attr_name (a->dw_attr));
10444 else
10445 dw2_asm_output_offset (DWARF_OFFSET_SIZE, sym, debug_loc_section,
10446 "%s", dwarf_attr_name (a->dw_attr));
10449 /* Output an attribute's index or value appropriately. */
10451 static void
10452 output_attr_index_or_value (dw_attr_node *a)
10454 const char *name = dwarf_attr_name (a->dw_attr);
10456 if (dwarf_split_debug_info && AT_index (a) != NOT_INDEXED)
10458 dw2_asm_output_data_uleb128 (AT_index (a), "%s", name);
10459 return;
10461 switch (AT_class (a))
10463 case dw_val_class_addr:
10464 dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, AT_addr (a), "%s", name);
10465 break;
10466 case dw_val_class_high_pc:
10467 case dw_val_class_lbl_id:
10468 dw2_asm_output_addr (DWARF2_ADDR_SIZE, AT_lbl (a), "%s", name);
10469 break;
10470 default:
10471 gcc_unreachable ();
10475 /* Output a type signature. */
10477 static inline void
10478 output_signature (const char *sig, const char *name)
10480 int i;
10482 for (i = 0; i < DWARF_TYPE_SIGNATURE_SIZE; i++)
10483 dw2_asm_output_data (1, sig[i], i == 0 ? "%s" : NULL, name);
10486 /* Output a discriminant value. */
10488 static inline void
10489 output_discr_value (dw_discr_value *discr_value, const char *name)
10491 if (discr_value->pos)
10492 dw2_asm_output_data_uleb128 (discr_value->v.uval, "%s", name);
10493 else
10494 dw2_asm_output_data_sleb128 (discr_value->v.sval, "%s", name);
10497 /* Output the DIE and its attributes. Called recursively to generate
10498 the definitions of each child DIE. */
10500 static void
10501 output_die (dw_die_ref die)
10503 dw_attr_node *a;
10504 dw_die_ref c;
10505 unsigned long size;
10506 unsigned ix;
10508 dw2_asm_output_data_uleb128 (die->die_abbrev, "(DIE (%#lx) %s)",
10509 (unsigned long)die->die_offset,
10510 dwarf_tag_name (die->die_tag));
10512 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
10514 const char *name = dwarf_attr_name (a->dw_attr);
10516 switch (AT_class (a))
10518 case dw_val_class_addr:
10519 output_attr_index_or_value (a);
10520 break;
10522 case dw_val_class_offset:
10523 dw2_asm_output_data (DWARF_OFFSET_SIZE, a->dw_attr_val.v.val_offset,
10524 "%s", name);
10525 break;
10527 case dw_val_class_range_list:
10528 output_range_list_offset (a);
10529 break;
10531 case dw_val_class_loc:
10532 size = size_of_locs (AT_loc (a));
10534 /* Output the block length for this list of location operations. */
10535 if (dwarf_version >= 4)
10536 dw2_asm_output_data_uleb128 (size, "%s", name);
10537 else
10538 dw2_asm_output_data (constant_size (size), size, "%s", name);
10540 output_loc_sequence (AT_loc (a), -1);
10541 break;
10543 case dw_val_class_const:
10544 /* ??? It would be slightly more efficient to use a scheme like is
10545 used for unsigned constants below, but gdb 4.x does not sign
10546 extend. Gdb 5.x does sign extend. */
10547 dw2_asm_output_data_sleb128 (AT_int (a), "%s", name);
10548 break;
10550 case dw_val_class_unsigned_const:
10552 int csize = constant_size (AT_unsigned (a));
10553 if (dwarf_version == 3
10554 && a->dw_attr == DW_AT_data_member_location
10555 && csize >= 4)
10556 dw2_asm_output_data_uleb128 (AT_unsigned (a), "%s", name);
10557 else
10558 dw2_asm_output_data (csize, AT_unsigned (a), "%s", name);
10560 break;
10562 case dw_val_class_symview:
10564 int vsize;
10565 if (symview_upper_bound <= 0xff)
10566 vsize = 1;
10567 else if (symview_upper_bound <= 0xffff)
10568 vsize = 2;
10569 else if (symview_upper_bound <= 0xffffffff)
10570 vsize = 4;
10571 else
10572 vsize = 8;
10573 dw2_asm_output_addr (vsize, a->dw_attr_val.v.val_symbolic_view,
10574 "%s", name);
10576 break;
10578 case dw_val_class_const_implicit:
10579 if (flag_debug_asm)
10580 fprintf (asm_out_file, "\t\t\t%s %s ("
10581 HOST_WIDE_INT_PRINT_DEC ")\n",
10582 ASM_COMMENT_START, name, AT_int (a));
10583 break;
10585 case dw_val_class_unsigned_const_implicit:
10586 if (flag_debug_asm)
10587 fprintf (asm_out_file, "\t\t\t%s %s ("
10588 HOST_WIDE_INT_PRINT_HEX ")\n",
10589 ASM_COMMENT_START, name, AT_unsigned (a));
10590 break;
10592 case dw_val_class_const_double:
10594 unsigned HOST_WIDE_INT first, second;
10596 if (HOST_BITS_PER_WIDE_INT >= DWARF_LARGEST_DATA_FORM_BITS)
10597 dw2_asm_output_data (1,
10598 HOST_BITS_PER_DOUBLE_INT
10599 / HOST_BITS_PER_CHAR,
10600 NULL);
10602 if (WORDS_BIG_ENDIAN)
10604 first = a->dw_attr_val.v.val_double.high;
10605 second = a->dw_attr_val.v.val_double.low;
10607 else
10609 first = a->dw_attr_val.v.val_double.low;
10610 second = a->dw_attr_val.v.val_double.high;
10613 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
10614 first, "%s", name);
10615 dw2_asm_output_data (HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR,
10616 second, NULL);
10618 break;
10620 case dw_val_class_wide_int:
10622 int i;
10623 int len = get_full_len (*a->dw_attr_val.v.val_wide);
10624 int l = HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
10625 if (len * HOST_BITS_PER_WIDE_INT > DWARF_LARGEST_DATA_FORM_BITS)
10626 dw2_asm_output_data (1, get_full_len (*a->dw_attr_val.v.val_wide)
10627 * l, NULL);
10629 if (WORDS_BIG_ENDIAN)
10630 for (i = len - 1; i >= 0; --i)
10632 dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i),
10633 "%s", name);
10634 name = "";
10636 else
10637 for (i = 0; i < len; ++i)
10639 dw2_asm_output_data (l, a->dw_attr_val.v.val_wide->elt (i),
10640 "%s", name);
10641 name = "";
10644 break;
10646 case dw_val_class_vec:
10648 unsigned int elt_size = a->dw_attr_val.v.val_vec.elt_size;
10649 unsigned int len = a->dw_attr_val.v.val_vec.length;
10650 unsigned int i;
10651 unsigned char *p;
10653 dw2_asm_output_data (constant_size (len * elt_size),
10654 len * elt_size, "%s", name);
10655 if (elt_size > sizeof (HOST_WIDE_INT))
10657 elt_size /= 2;
10658 len *= 2;
10660 for (i = 0, p = (unsigned char *) a->dw_attr_val.v.val_vec.array;
10661 i < len;
10662 i++, p += elt_size)
10663 dw2_asm_output_data (elt_size, extract_int (p, elt_size),
10664 "fp or vector constant word %u", i);
10665 break;
10668 case dw_val_class_flag:
10669 if (dwarf_version >= 4)
10671 /* Currently all add_AT_flag calls pass in 1 as last argument,
10672 so DW_FORM_flag_present can be used. If that ever changes,
10673 we'll need to use DW_FORM_flag and have some optimization
10674 in build_abbrev_table that will change those to
10675 DW_FORM_flag_present if it is set to 1 in all DIEs using
10676 the same abbrev entry. */
10677 gcc_assert (AT_flag (a) == 1);
10678 if (flag_debug_asm)
10679 fprintf (asm_out_file, "\t\t\t%s %s\n",
10680 ASM_COMMENT_START, name);
10681 break;
10683 dw2_asm_output_data (1, AT_flag (a), "%s", name);
10684 break;
10686 case dw_val_class_loc_list:
10687 output_loc_list_offset (a);
10688 break;
10690 case dw_val_class_view_list:
10691 output_view_list_offset (a);
10692 break;
10694 case dw_val_class_die_ref:
10695 if (AT_ref_external (a))
10697 if (AT_ref (a)->comdat_type_p)
10699 comdat_type_node *type_node
10700 = AT_ref (a)->die_id.die_type_node;
10702 gcc_assert (type_node);
10703 output_signature (type_node->signature, name);
10705 else
10707 const char *sym = AT_ref (a)->die_id.die_symbol;
10708 int size;
10710 gcc_assert (sym);
10711 /* In DWARF2, DW_FORM_ref_addr is sized by target address
10712 length, whereas in DWARF3 it's always sized as an
10713 offset. */
10714 if (dwarf_version == 2)
10715 size = DWARF2_ADDR_SIZE;
10716 else
10717 size = DWARF_OFFSET_SIZE;
10718 /* ??? We cannot unconditionally output die_offset if
10719 non-zero - others might create references to those
10720 DIEs via symbols.
10721 And we do not clear its DIE offset after outputting it
10722 (and the label refers to the actual DIEs, not the
10723 DWARF CU unit header which is when using label + offset
10724 would be the correct thing to do).
10725 ??? This is the reason for the with_offset flag. */
10726 if (AT_ref (a)->with_offset)
10727 dw2_asm_output_offset (size, sym, AT_ref (a)->die_offset,
10728 debug_info_section, "%s", name);
10729 else
10730 dw2_asm_output_offset (size, sym, debug_info_section, "%s",
10731 name);
10734 else
10736 gcc_assert (AT_ref (a)->die_offset);
10737 dw2_asm_output_data (DWARF_OFFSET_SIZE, AT_ref (a)->die_offset,
10738 "%s", name);
10740 break;
10742 case dw_val_class_fde_ref:
10744 char l1[MAX_ARTIFICIAL_LABEL_BYTES];
10746 ASM_GENERATE_INTERNAL_LABEL (l1, FDE_LABEL,
10747 a->dw_attr_val.v.val_fde_index * 2);
10748 dw2_asm_output_offset (DWARF_OFFSET_SIZE, l1, debug_frame_section,
10749 "%s", name);
10751 break;
10753 case dw_val_class_vms_delta:
10754 #ifdef ASM_OUTPUT_DWARF_VMS_DELTA
10755 dw2_asm_output_vms_delta (DWARF_OFFSET_SIZE,
10756 AT_vms_delta2 (a), AT_vms_delta1 (a),
10757 "%s", name);
10758 #else
10759 dw2_asm_output_delta (DWARF_OFFSET_SIZE,
10760 AT_vms_delta2 (a), AT_vms_delta1 (a),
10761 "%s", name);
10762 #endif
10763 break;
10765 case dw_val_class_lbl_id:
10766 output_attr_index_or_value (a);
10767 break;
10769 case dw_val_class_lineptr:
10770 dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
10771 debug_line_section, "%s", name);
10772 break;
10774 case dw_val_class_macptr:
10775 dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
10776 debug_macinfo_section, "%s", name);
10777 break;
10779 case dw_val_class_loclistsptr:
10780 dw2_asm_output_offset (DWARF_OFFSET_SIZE, AT_lbl (a),
10781 debug_loc_section, "%s", name);
10782 break;
10784 case dw_val_class_str:
10785 if (a->dw_attr_val.v.val_str->form == DW_FORM_strp)
10786 dw2_asm_output_offset (DWARF_OFFSET_SIZE,
10787 a->dw_attr_val.v.val_str->label,
10788 debug_str_section,
10789 "%s: \"%s\"", name, AT_string (a));
10790 else if (a->dw_attr_val.v.val_str->form == DW_FORM_line_strp)
10791 dw2_asm_output_offset (DWARF_OFFSET_SIZE,
10792 a->dw_attr_val.v.val_str->label,
10793 debug_line_str_section,
10794 "%s: \"%s\"", name, AT_string (a));
10795 else if (a->dw_attr_val.v.val_str->form == DW_FORM_GNU_str_index)
10796 dw2_asm_output_data_uleb128 (AT_index (a),
10797 "%s: \"%s\"", name, AT_string (a));
10798 else
10799 dw2_asm_output_nstring (AT_string (a), -1, "%s", name);
10800 break;
10802 case dw_val_class_file:
10804 int f = maybe_emit_file (a->dw_attr_val.v.val_file);
10806 dw2_asm_output_data (constant_size (f), f, "%s (%s)", name,
10807 a->dw_attr_val.v.val_file->filename);
10808 break;
10811 case dw_val_class_file_implicit:
10812 if (flag_debug_asm)
10813 fprintf (asm_out_file, "\t\t\t%s %s (%d, %s)\n",
10814 ASM_COMMENT_START, name,
10815 maybe_emit_file (a->dw_attr_val.v.val_file),
10816 a->dw_attr_val.v.val_file->filename);
10817 break;
10819 case dw_val_class_data8:
10821 int i;
10823 for (i = 0; i < 8; i++)
10824 dw2_asm_output_data (1, a->dw_attr_val.v.val_data8[i],
10825 i == 0 ? "%s" : NULL, name);
10826 break;
10829 case dw_val_class_high_pc:
10830 dw2_asm_output_delta (DWARF2_ADDR_SIZE, AT_lbl (a),
10831 get_AT_low_pc (die), "DW_AT_high_pc");
10832 break;
10834 case dw_val_class_discr_value:
10835 output_discr_value (&a->dw_attr_val.v.val_discr_value, name);
10836 break;
10838 case dw_val_class_discr_list:
10840 dw_discr_list_ref list = AT_discr_list (a);
10841 const int size = size_of_discr_list (list);
10843 /* This is a block, so output its length first. */
10844 dw2_asm_output_data (constant_size (size), size,
10845 "%s: block size", name);
10847 for (; list != NULL; list = list->dw_discr_next)
10849 /* One byte for the discriminant value descriptor, and then as
10850 many LEB128 numbers as required. */
10851 if (list->dw_discr_range)
10852 dw2_asm_output_data (1, DW_DSC_range,
10853 "%s: DW_DSC_range", name);
10854 else
10855 dw2_asm_output_data (1, DW_DSC_label,
10856 "%s: DW_DSC_label", name);
10858 output_discr_value (&list->dw_discr_lower_bound, name);
10859 if (list->dw_discr_range)
10860 output_discr_value (&list->dw_discr_upper_bound, name);
10862 break;
10865 default:
10866 gcc_unreachable ();
10870 FOR_EACH_CHILD (die, c, output_die (c));
10872 /* Add null byte to terminate sibling list. */
10873 if (die->die_child != NULL)
10874 dw2_asm_output_data (1, 0, "end of children of DIE %#lx",
10875 (unsigned long) die->die_offset);
10878 /* Output the dwarf version number. */
10880 static void
10881 output_dwarf_version ()
10883 /* ??? For now, if -gdwarf-6 is specified, we output version 5 with
10884 views in loclist. That will change eventually. */
10885 if (dwarf_version == 6)
10887 static bool once;
10888 if (!once)
10890 warning (0,
10891 "-gdwarf-6 is output as version 5 with incompatibilities");
10892 once = true;
10894 dw2_asm_output_data (2, 5, "DWARF version number");
10896 else
10897 dw2_asm_output_data (2, dwarf_version, "DWARF version number");
10900 /* Output the compilation unit that appears at the beginning of the
10901 .debug_info section, and precedes the DIE descriptions. */
10903 static void
10904 output_compilation_unit_header (enum dwarf_unit_type ut)
10906 if (!XCOFF_DEBUGGING_INFO)
10908 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
10909 dw2_asm_output_data (4, 0xffffffff,
10910 "Initial length escape value indicating 64-bit DWARF extension");
10911 dw2_asm_output_data (DWARF_OFFSET_SIZE,
10912 next_die_offset - DWARF_INITIAL_LENGTH_SIZE,
10913 "Length of Compilation Unit Info");
10916 output_dwarf_version ();
10917 if (dwarf_version >= 5)
10919 const char *name;
10920 switch (ut)
10922 case DW_UT_compile: name = "DW_UT_compile"; break;
10923 case DW_UT_type: name = "DW_UT_type"; break;
10924 case DW_UT_split_compile: name = "DW_UT_split_compile"; break;
10925 case DW_UT_split_type: name = "DW_UT_split_type"; break;
10926 default: gcc_unreachable ();
10928 dw2_asm_output_data (1, ut, "%s", name);
10929 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)");
10931 dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label,
10932 debug_abbrev_section,
10933 "Offset Into Abbrev. Section");
10934 if (dwarf_version < 5)
10935 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)");
10938 /* Output the compilation unit DIE and its children. */
10940 static void
10941 output_comp_unit (dw_die_ref die, int output_if_empty,
10942 const unsigned char *dwo_id)
10944 const char *secname, *oldsym;
10945 char *tmp;
10947 /* Unless we are outputting main CU, we may throw away empty ones. */
10948 if (!output_if_empty && die->die_child == NULL)
10949 return;
10951 /* Even if there are no children of this DIE, we must output the information
10952 about the compilation unit. Otherwise, on an empty translation unit, we
10953 will generate a present, but empty, .debug_info section. IRIX 6.5 `nm'
10954 will then complain when examining the file. First mark all the DIEs in
10955 this CU so we know which get local refs. */
10956 mark_dies (die);
10958 external_ref_hash_type *extern_map = optimize_external_refs (die);
10960 /* For now, optimize only the main CU, in order to optimize the rest
10961 we'd need to see all of them earlier. Leave the rest for post-linking
10962 tools like DWZ. */
10963 if (die == comp_unit_die ())
10964 abbrev_opt_start = vec_safe_length (abbrev_die_table);
10966 build_abbrev_table (die, extern_map);
10968 optimize_abbrev_table ();
10970 delete extern_map;
10972 /* Initialize the beginning DIE offset - and calculate sizes/offsets. */
10973 next_die_offset = (dwo_id
10974 ? DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE
10975 : DWARF_COMPILE_UNIT_HEADER_SIZE);
10976 calc_die_sizes (die);
10978 oldsym = die->die_id.die_symbol;
10979 if (oldsym && die->comdat_type_p)
10981 tmp = XALLOCAVEC (char, strlen (oldsym) + 24);
10983 sprintf (tmp, ".gnu.linkonce.wi.%s", oldsym);
10984 secname = tmp;
10985 die->die_id.die_symbol = NULL;
10986 switch_to_section (get_section (secname, SECTION_DEBUG, NULL));
10988 else
10990 switch_to_section (debug_info_section);
10991 ASM_OUTPUT_LABEL (asm_out_file, debug_info_section_label);
10992 info_section_emitted = true;
10995 /* For LTO cross unit DIE refs we want a symbol on the start of the
10996 debuginfo section, not on the CU DIE. */
10997 if ((flag_generate_lto || flag_generate_offload) && oldsym)
10999 /* ??? No way to get visibility assembled without a decl. */
11000 tree decl = build_decl (UNKNOWN_LOCATION, VAR_DECL,
11001 get_identifier (oldsym), char_type_node);
11002 TREE_PUBLIC (decl) = true;
11003 TREE_STATIC (decl) = true;
11004 DECL_ARTIFICIAL (decl) = true;
11005 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
11006 DECL_VISIBILITY_SPECIFIED (decl) = true;
11007 targetm.asm_out.assemble_visibility (decl, VISIBILITY_HIDDEN);
11008 #ifdef ASM_WEAKEN_LABEL
11009 /* We prefer a .weak because that handles duplicates from duplicate
11010 archive members in a graceful way. */
11011 ASM_WEAKEN_LABEL (asm_out_file, oldsym);
11012 #else
11013 targetm.asm_out.globalize_label (asm_out_file, oldsym);
11014 #endif
11015 ASM_OUTPUT_LABEL (asm_out_file, oldsym);
11018 /* Output debugging information. */
11019 output_compilation_unit_header (dwo_id
11020 ? DW_UT_split_compile : DW_UT_compile);
11021 if (dwarf_version >= 5)
11023 if (dwo_id != NULL)
11024 for (int i = 0; i < 8; i++)
11025 dw2_asm_output_data (1, dwo_id[i], i == 0 ? "DWO id" : NULL);
11027 output_die (die);
11029 /* Leave the marks on the main CU, so we can check them in
11030 output_pubnames. */
11031 if (oldsym)
11033 unmark_dies (die);
11034 die->die_id.die_symbol = oldsym;
11038 /* Whether to generate the DWARF accelerator tables in .debug_pubnames
11039 and .debug_pubtypes. This is configured per-target, but can be
11040 overridden by the -gpubnames or -gno-pubnames options. */
11042 static inline bool
11043 want_pubnames (void)
11045 if (debug_info_level <= DINFO_LEVEL_TERSE)
11046 return false;
11047 if (debug_generate_pub_sections != -1)
11048 return debug_generate_pub_sections;
11049 return targetm.want_debug_pub_sections;
11052 /* Add the DW_AT_GNU_pubnames and DW_AT_GNU_pubtypes attributes. */
11054 static void
11055 add_AT_pubnames (dw_die_ref die)
11057 if (want_pubnames ())
11058 add_AT_flag (die, DW_AT_GNU_pubnames, 1);
11061 /* Add a string attribute value to a skeleton DIE. */
11063 static inline void
11064 add_skeleton_AT_string (dw_die_ref die, enum dwarf_attribute attr_kind,
11065 const char *str)
11067 dw_attr_node attr;
11068 struct indirect_string_node *node;
11070 if (! skeleton_debug_str_hash)
11071 skeleton_debug_str_hash
11072 = hash_table<indirect_string_hasher>::create_ggc (10);
11074 node = find_AT_string_in_table (str, skeleton_debug_str_hash);
11075 find_string_form (node);
11076 if (node->form == DW_FORM_GNU_str_index)
11077 node->form = DW_FORM_strp;
11079 attr.dw_attr = attr_kind;
11080 attr.dw_attr_val.val_class = dw_val_class_str;
11081 attr.dw_attr_val.val_entry = NULL;
11082 attr.dw_attr_val.v.val_str = node;
11083 add_dwarf_attr (die, &attr);
11086 /* Helper function to generate top-level dies for skeleton debug_info and
11087 debug_types. */
11089 static void
11090 add_top_level_skeleton_die_attrs (dw_die_ref die)
11092 const char *dwo_file_name = concat (aux_base_name, ".dwo", NULL);
11093 const char *comp_dir = comp_dir_string ();
11095 add_skeleton_AT_string (die, dwarf_AT (DW_AT_dwo_name), dwo_file_name);
11096 if (comp_dir != NULL)
11097 add_skeleton_AT_string (die, DW_AT_comp_dir, comp_dir);
11098 add_AT_pubnames (die);
11099 add_AT_lineptr (die, DW_AT_GNU_addr_base, debug_addr_section_label);
11102 /* Output skeleton debug sections that point to the dwo file. */
11104 static void
11105 output_skeleton_debug_sections (dw_die_ref comp_unit,
11106 const unsigned char *dwo_id)
11108 /* These attributes will be found in the full debug_info section. */
11109 remove_AT (comp_unit, DW_AT_producer);
11110 remove_AT (comp_unit, DW_AT_language);
11112 switch_to_section (debug_skeleton_info_section);
11113 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_info_section_label);
11115 /* Produce the skeleton compilation-unit header. This one differs enough from
11116 a normal CU header that it's better not to call output_compilation_unit
11117 header. */
11118 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
11119 dw2_asm_output_data (4, 0xffffffff,
11120 "Initial length escape value indicating 64-bit "
11121 "DWARF extension");
11123 dw2_asm_output_data (DWARF_OFFSET_SIZE,
11124 DWARF_COMPILE_UNIT_SKELETON_HEADER_SIZE
11125 - DWARF_INITIAL_LENGTH_SIZE
11126 + size_of_die (comp_unit),
11127 "Length of Compilation Unit Info");
11128 output_dwarf_version ();
11129 if (dwarf_version >= 5)
11131 dw2_asm_output_data (1, DW_UT_skeleton, "DW_UT_skeleton");
11132 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)");
11134 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_skeleton_abbrev_section_label,
11135 debug_skeleton_abbrev_section,
11136 "Offset Into Abbrev. Section");
11137 if (dwarf_version < 5)
11138 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Pointer Size (in bytes)");
11139 else
11140 for (int i = 0; i < 8; i++)
11141 dw2_asm_output_data (1, dwo_id[i], i == 0 ? "DWO id" : NULL);
11143 comp_unit->die_abbrev = SKELETON_COMP_DIE_ABBREV;
11144 output_die (comp_unit);
11146 /* Build the skeleton debug_abbrev section. */
11147 switch_to_section (debug_skeleton_abbrev_section);
11148 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_abbrev_section_label);
11150 output_die_abbrevs (SKELETON_COMP_DIE_ABBREV, comp_unit);
11152 dw2_asm_output_data (1, 0, "end of skeleton .debug_abbrev");
11155 /* Output a comdat type unit DIE and its children. */
11157 static void
11158 output_comdat_type_unit (comdat_type_node *node)
11160 const char *secname;
11161 char *tmp;
11162 int i;
11163 #if defined (OBJECT_FORMAT_ELF)
11164 tree comdat_key;
11165 #endif
11167 /* First mark all the DIEs in this CU so we know which get local refs. */
11168 mark_dies (node->root_die);
11170 external_ref_hash_type *extern_map = optimize_external_refs (node->root_die);
11172 build_abbrev_table (node->root_die, extern_map);
11174 delete extern_map;
11175 extern_map = NULL;
11177 /* Initialize the beginning DIE offset - and calculate sizes/offsets. */
11178 next_die_offset = DWARF_COMDAT_TYPE_UNIT_HEADER_SIZE;
11179 calc_die_sizes (node->root_die);
11181 #if defined (OBJECT_FORMAT_ELF)
11182 if (dwarf_version >= 5)
11184 if (!dwarf_split_debug_info)
11185 secname = ".debug_info";
11186 else
11187 secname = ".debug_info.dwo";
11189 else if (!dwarf_split_debug_info)
11190 secname = ".debug_types";
11191 else
11192 secname = ".debug_types.dwo";
11194 tmp = XALLOCAVEC (char, 4 + DWARF_TYPE_SIGNATURE_SIZE * 2);
11195 sprintf (tmp, dwarf_version >= 5 ? "wi." : "wt.");
11196 for (i = 0; i < DWARF_TYPE_SIGNATURE_SIZE; i++)
11197 sprintf (tmp + 3 + i * 2, "%02x", node->signature[i] & 0xff);
11198 comdat_key = get_identifier (tmp);
11199 targetm.asm_out.named_section (secname,
11200 SECTION_DEBUG | SECTION_LINKONCE,
11201 comdat_key);
11202 #else
11203 tmp = XALLOCAVEC (char, 18 + DWARF_TYPE_SIGNATURE_SIZE * 2);
11204 sprintf (tmp, (dwarf_version >= 5
11205 ? ".gnu.linkonce.wi." : ".gnu.linkonce.wt."));
11206 for (i = 0; i < DWARF_TYPE_SIGNATURE_SIZE; i++)
11207 sprintf (tmp + 17 + i * 2, "%02x", node->signature[i] & 0xff);
11208 secname = tmp;
11209 switch_to_section (get_section (secname, SECTION_DEBUG, NULL));
11210 #endif
11212 /* Output debugging information. */
11213 output_compilation_unit_header (dwarf_split_debug_info
11214 ? DW_UT_split_type : DW_UT_type);
11215 output_signature (node->signature, "Type Signature");
11216 dw2_asm_output_data (DWARF_OFFSET_SIZE, node->type_die->die_offset,
11217 "Offset to Type DIE");
11218 output_die (node->root_die);
11220 unmark_dies (node->root_die);
11223 /* Return the DWARF2/3 pubname associated with a decl. */
11225 static const char *
11226 dwarf2_name (tree decl, int scope)
11228 if (DECL_NAMELESS (decl))
11229 return NULL;
11230 return lang_hooks.dwarf_name (decl, scope ? 1 : 0);
11233 /* Add a new entry to .debug_pubnames if appropriate. */
11235 static void
11236 add_pubname_string (const char *str, dw_die_ref die)
11238 pubname_entry e;
11240 e.die = die;
11241 e.name = xstrdup (str);
11242 vec_safe_push (pubname_table, e);
11245 static void
11246 add_pubname (tree decl, dw_die_ref die)
11248 if (!want_pubnames ())
11249 return;
11251 /* Don't add items to the table when we expect that the consumer will have
11252 just read the enclosing die. For example, if the consumer is looking at a
11253 class_member, it will either be inside the class already, or will have just
11254 looked up the class to find the member. Either way, searching the class is
11255 faster than searching the index. */
11256 if ((TREE_PUBLIC (decl) && !class_scope_p (die->die_parent))
11257 || is_cu_die (die->die_parent) || is_namespace_die (die->die_parent))
11259 const char *name = dwarf2_name (decl, 1);
11261 if (name)
11262 add_pubname_string (name, die);
11266 /* Add an enumerator to the pubnames section. */
11268 static void
11269 add_enumerator_pubname (const char *scope_name, dw_die_ref die)
11271 pubname_entry e;
11273 gcc_assert (scope_name);
11274 e.name = concat (scope_name, get_AT_string (die, DW_AT_name), NULL);
11275 e.die = die;
11276 vec_safe_push (pubname_table, e);
11279 /* Add a new entry to .debug_pubtypes if appropriate. */
11281 static void
11282 add_pubtype (tree decl, dw_die_ref die)
11284 pubname_entry e;
11286 if (!want_pubnames ())
11287 return;
11289 if ((TREE_PUBLIC (decl)
11290 || is_cu_die (die->die_parent) || is_namespace_die (die->die_parent))
11291 && (die->die_tag == DW_TAG_typedef || COMPLETE_TYPE_P (decl)))
11293 tree scope = NULL;
11294 const char *scope_name = "";
11295 const char *sep = is_cxx () ? "::" : ".";
11296 const char *name;
11298 scope = TYPE_P (decl) ? TYPE_CONTEXT (decl) : NULL;
11299 if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
11301 scope_name = lang_hooks.dwarf_name (scope, 1);
11302 if (scope_name != NULL && scope_name[0] != '\0')
11303 scope_name = concat (scope_name, sep, NULL);
11304 else
11305 scope_name = "";
11308 if (TYPE_P (decl))
11309 name = type_tag (decl);
11310 else
11311 name = lang_hooks.dwarf_name (decl, 1);
11313 /* If we don't have a name for the type, there's no point in adding
11314 it to the table. */
11315 if (name != NULL && name[0] != '\0')
11317 e.die = die;
11318 e.name = concat (scope_name, name, NULL);
11319 vec_safe_push (pubtype_table, e);
11322 /* Although it might be more consistent to add the pubinfo for the
11323 enumerators as their dies are created, they should only be added if the
11324 enum type meets the criteria above. So rather than re-check the parent
11325 enum type whenever an enumerator die is created, just output them all
11326 here. This isn't protected by the name conditional because anonymous
11327 enums don't have names. */
11328 if (die->die_tag == DW_TAG_enumeration_type)
11330 dw_die_ref c;
11332 FOR_EACH_CHILD (die, c, add_enumerator_pubname (scope_name, c));
11337 /* Output a single entry in the pubnames table. */
11339 static void
11340 output_pubname (dw_offset die_offset, pubname_entry *entry)
11342 dw_die_ref die = entry->die;
11343 int is_static = get_AT_flag (die, DW_AT_external) ? 0 : 1;
11345 dw2_asm_output_data (DWARF_OFFSET_SIZE, die_offset, "DIE offset");
11347 if (debug_generate_pub_sections == 2)
11349 /* This logic follows gdb's method for determining the value of the flag
11350 byte. */
11351 uint32_t flags = GDB_INDEX_SYMBOL_KIND_NONE;
11352 switch (die->die_tag)
11354 case DW_TAG_typedef:
11355 case DW_TAG_base_type:
11356 case DW_TAG_subrange_type:
11357 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags, GDB_INDEX_SYMBOL_KIND_TYPE);
11358 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, 1);
11359 break;
11360 case DW_TAG_enumerator:
11361 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags,
11362 GDB_INDEX_SYMBOL_KIND_VARIABLE);
11363 if (!is_cxx ())
11364 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, 1);
11365 break;
11366 case DW_TAG_subprogram:
11367 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags,
11368 GDB_INDEX_SYMBOL_KIND_FUNCTION);
11369 if (!is_ada ())
11370 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, is_static);
11371 break;
11372 case DW_TAG_constant:
11373 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags,
11374 GDB_INDEX_SYMBOL_KIND_VARIABLE);
11375 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, is_static);
11376 break;
11377 case DW_TAG_variable:
11378 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags,
11379 GDB_INDEX_SYMBOL_KIND_VARIABLE);
11380 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, is_static);
11381 break;
11382 case DW_TAG_namespace:
11383 case DW_TAG_imported_declaration:
11384 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags, GDB_INDEX_SYMBOL_KIND_TYPE);
11385 break;
11386 case DW_TAG_class_type:
11387 case DW_TAG_interface_type:
11388 case DW_TAG_structure_type:
11389 case DW_TAG_union_type:
11390 case DW_TAG_enumeration_type:
11391 GDB_INDEX_SYMBOL_KIND_SET_VALUE(flags, GDB_INDEX_SYMBOL_KIND_TYPE);
11392 if (!is_cxx ())
11393 GDB_INDEX_SYMBOL_STATIC_SET_VALUE(flags, 1);
11394 break;
11395 default:
11396 /* An unusual tag. Leave the flag-byte empty. */
11397 break;
11399 dw2_asm_output_data (1, flags >> GDB_INDEX_CU_BITSIZE,
11400 "GDB-index flags");
11403 dw2_asm_output_nstring (entry->name, -1, "external name");
11407 /* Output the public names table used to speed up access to externally
11408 visible names; or the public types table used to find type definitions. */
11410 static void
11411 output_pubnames (vec<pubname_entry, va_gc> *names)
11413 unsigned i;
11414 unsigned long pubnames_length = size_of_pubnames (names);
11415 pubname_entry *pub;
11417 if (!XCOFF_DEBUGGING_INFO)
11419 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
11420 dw2_asm_output_data (4, 0xffffffff,
11421 "Initial length escape value indicating 64-bit DWARF extension");
11422 dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length,
11423 "Pub Info Length");
11426 /* Version number for pubnames/pubtypes is independent of dwarf version. */
11427 dw2_asm_output_data (2, 2, "DWARF pubnames/pubtypes version");
11429 if (dwarf_split_debug_info)
11430 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_skeleton_info_section_label,
11431 debug_skeleton_info_section,
11432 "Offset of Compilation Unit Info");
11433 else
11434 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
11435 debug_info_section,
11436 "Offset of Compilation Unit Info");
11437 dw2_asm_output_data (DWARF_OFFSET_SIZE, next_die_offset,
11438 "Compilation Unit Length");
11440 FOR_EACH_VEC_ELT (*names, i, pub)
11442 if (include_pubname_in_output (names, pub))
11444 dw_offset die_offset = pub->die->die_offset;
11446 /* We shouldn't see pubnames for DIEs outside of the main CU. */
11447 if (names == pubname_table && pub->die->die_tag != DW_TAG_enumerator)
11448 gcc_assert (pub->die->die_mark);
11450 /* If we're putting types in their own .debug_types sections,
11451 the .debug_pubtypes table will still point to the compile
11452 unit (not the type unit), so we want to use the offset of
11453 the skeleton DIE (if there is one). */
11454 if (pub->die->comdat_type_p && names == pubtype_table)
11456 comdat_type_node *type_node = pub->die->die_id.die_type_node;
11458 if (type_node != NULL)
11459 die_offset = (type_node->skeleton_die != NULL
11460 ? type_node->skeleton_die->die_offset
11461 : comp_unit_die ()->die_offset);
11464 output_pubname (die_offset, pub);
11468 dw2_asm_output_data (DWARF_OFFSET_SIZE, 0, NULL);
11471 /* Output public names and types tables if necessary. */
11473 static void
11474 output_pubtables (void)
11476 if (!want_pubnames () || !info_section_emitted)
11477 return;
11479 switch_to_section (debug_pubnames_section);
11480 output_pubnames (pubname_table);
11481 /* ??? Only defined by DWARF3, but emitted by Darwin for DWARF2.
11482 It shouldn't hurt to emit it always, since pure DWARF2 consumers
11483 simply won't look for the section. */
11484 switch_to_section (debug_pubtypes_section);
11485 output_pubnames (pubtype_table);
11489 /* Output the information that goes into the .debug_aranges table.
11490 Namely, define the beginning and ending address range of the
11491 text section generated for this compilation unit. */
11493 static void
11494 output_aranges (void)
11496 unsigned i;
11497 unsigned long aranges_length = size_of_aranges ();
11499 if (!XCOFF_DEBUGGING_INFO)
11501 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
11502 dw2_asm_output_data (4, 0xffffffff,
11503 "Initial length escape value indicating 64-bit DWARF extension");
11504 dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length,
11505 "Length of Address Ranges Info");
11508 /* Version number for aranges is still 2, even up to DWARF5. */
11509 dw2_asm_output_data (2, 2, "DWARF aranges version");
11510 if (dwarf_split_debug_info)
11511 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_skeleton_info_section_label,
11512 debug_skeleton_info_section,
11513 "Offset of Compilation Unit Info");
11514 else
11515 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_info_section_label,
11516 debug_info_section,
11517 "Offset of Compilation Unit Info");
11518 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Size of Address");
11519 dw2_asm_output_data (1, 0, "Size of Segment Descriptor");
11521 /* We need to align to twice the pointer size here. */
11522 if (DWARF_ARANGES_PAD_SIZE)
11524 /* Pad using a 2 byte words so that padding is correct for any
11525 pointer size. */
11526 dw2_asm_output_data (2, 0, "Pad to %d byte boundary",
11527 2 * DWARF2_ADDR_SIZE);
11528 for (i = 2; i < (unsigned) DWARF_ARANGES_PAD_SIZE; i += 2)
11529 dw2_asm_output_data (2, 0, NULL);
11532 /* It is necessary not to output these entries if the sections were
11533 not used; if the sections were not used, the length will be 0 and
11534 the address may end up as 0 if the section is discarded by ld
11535 --gc-sections, leaving an invalid (0, 0) entry that can be
11536 confused with the terminator. */
11537 if (text_section_used)
11539 dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
11540 dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
11541 text_section_label, "Length");
11543 if (cold_text_section_used)
11545 dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label,
11546 "Address");
11547 dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label,
11548 cold_text_section_label, "Length");
11551 if (have_multiple_function_sections)
11553 unsigned fde_idx;
11554 dw_fde_ref fde;
11556 FOR_EACH_VEC_ELT (*fde_vec, fde_idx, fde)
11558 if (DECL_IGNORED_P (fde->decl))
11559 continue;
11560 if (!fde->in_std_section)
11562 dw2_asm_output_addr (DWARF2_ADDR_SIZE, fde->dw_fde_begin,
11563 "Address");
11564 dw2_asm_output_delta (DWARF2_ADDR_SIZE, fde->dw_fde_end,
11565 fde->dw_fde_begin, "Length");
11567 if (fde->dw_fde_second_begin && !fde->second_in_std_section)
11569 dw2_asm_output_addr (DWARF2_ADDR_SIZE, fde->dw_fde_second_begin,
11570 "Address");
11571 dw2_asm_output_delta (DWARF2_ADDR_SIZE, fde->dw_fde_second_end,
11572 fde->dw_fde_second_begin, "Length");
11577 /* Output the terminator words. */
11578 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
11579 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
11582 /* Add a new entry to .debug_ranges. Return its index into
11583 ranges_table vector. */
11585 static unsigned int
11586 add_ranges_num (int num, bool maybe_new_sec)
11588 dw_ranges r = { NULL, num, 0, maybe_new_sec };
11589 vec_safe_push (ranges_table, r);
11590 return vec_safe_length (ranges_table) - 1;
11593 /* Add a new entry to .debug_ranges corresponding to a block, or a
11594 range terminator if BLOCK is NULL. MAYBE_NEW_SEC is true if
11595 this entry might be in a different section from previous range. */
11597 static unsigned int
11598 add_ranges (const_tree block, bool maybe_new_sec)
11600 return add_ranges_num (block ? BLOCK_NUMBER (block) : 0, maybe_new_sec);
11603 /* Note that (*rnglist_table)[offset] is either a head of a rnglist
11604 chain, or middle entry of a chain that will be directly referred to. */
11606 static void
11607 note_rnglist_head (unsigned int offset)
11609 if (dwarf_version < 5 || (*ranges_table)[offset].label)
11610 return;
11611 (*ranges_table)[offset].label = gen_internal_sym ("LLRL");
11614 /* Add a new entry to .debug_ranges corresponding to a pair of labels.
11615 When using dwarf_split_debug_info, address attributes in dies destined
11616 for the final executable should be direct references--setting the
11617 parameter force_direct ensures this behavior. */
11619 static void
11620 add_ranges_by_labels (dw_die_ref die, const char *begin, const char *end,
11621 bool *added, bool force_direct)
11623 unsigned int in_use = vec_safe_length (ranges_by_label);
11624 unsigned int offset;
11625 dw_ranges_by_label rbl = { begin, end };
11626 vec_safe_push (ranges_by_label, rbl);
11627 offset = add_ranges_num (-(int)in_use - 1, true);
11628 if (!*added)
11630 add_AT_range_list (die, DW_AT_ranges, offset, force_direct);
11631 *added = true;
11632 note_rnglist_head (offset);
11636 /* Emit .debug_ranges section. */
11638 static void
11639 output_ranges (void)
11641 unsigned i;
11642 static const char *const start_fmt = "Offset %#x";
11643 const char *fmt = start_fmt;
11644 dw_ranges *r;
11646 switch_to_section (debug_ranges_section);
11647 ASM_OUTPUT_LABEL (asm_out_file, ranges_section_label);
11648 FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r)
11650 int block_num = r->num;
11652 if (block_num > 0)
11654 char blabel[MAX_ARTIFICIAL_LABEL_BYTES];
11655 char elabel[MAX_ARTIFICIAL_LABEL_BYTES];
11657 ASM_GENERATE_INTERNAL_LABEL (blabel, BLOCK_BEGIN_LABEL, block_num);
11658 ASM_GENERATE_INTERNAL_LABEL (elabel, BLOCK_END_LABEL, block_num);
11660 /* If all code is in the text section, then the compilation
11661 unit base address defaults to DW_AT_low_pc, which is the
11662 base of the text section. */
11663 if (!have_multiple_function_sections)
11665 dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel,
11666 text_section_label,
11667 fmt, i * 2 * DWARF2_ADDR_SIZE);
11668 dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel,
11669 text_section_label, NULL);
11672 /* Otherwise, the compilation unit base address is zero,
11673 which allows us to use absolute addresses, and not worry
11674 about whether the target supports cross-section
11675 arithmetic. */
11676 else
11678 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11679 fmt, i * 2 * DWARF2_ADDR_SIZE);
11680 dw2_asm_output_addr (DWARF2_ADDR_SIZE, elabel, NULL);
11683 fmt = NULL;
11686 /* Negative block_num stands for an index into ranges_by_label. */
11687 else if (block_num < 0)
11689 int lab_idx = - block_num - 1;
11691 if (!have_multiple_function_sections)
11693 gcc_unreachable ();
11694 #if 0
11695 /* If we ever use add_ranges_by_labels () for a single
11696 function section, all we have to do is to take out
11697 the #if 0 above. */
11698 dw2_asm_output_delta (DWARF2_ADDR_SIZE,
11699 (*ranges_by_label)[lab_idx].begin,
11700 text_section_label,
11701 fmt, i * 2 * DWARF2_ADDR_SIZE);
11702 dw2_asm_output_delta (DWARF2_ADDR_SIZE,
11703 (*ranges_by_label)[lab_idx].end,
11704 text_section_label, NULL);
11705 #endif
11707 else
11709 dw2_asm_output_addr (DWARF2_ADDR_SIZE,
11710 (*ranges_by_label)[lab_idx].begin,
11711 fmt, i * 2 * DWARF2_ADDR_SIZE);
11712 dw2_asm_output_addr (DWARF2_ADDR_SIZE,
11713 (*ranges_by_label)[lab_idx].end,
11714 NULL);
11717 else
11719 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
11720 dw2_asm_output_data (DWARF2_ADDR_SIZE, 0, NULL);
11721 fmt = start_fmt;
11726 /* Non-zero if .debug_line_str should be used for .debug_line section
11727 strings or strings that are likely shareable with those. */
11728 #define DWARF5_USE_DEBUG_LINE_STR \
11729 (!DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET \
11730 && (DEBUG_STR_SECTION_FLAGS & SECTION_MERGE) != 0 \
11731 /* FIXME: there is no .debug_line_str.dwo section, \
11732 for -gsplit-dwarf we should use DW_FORM_strx instead. */ \
11733 && !dwarf_split_debug_info)
11735 /* Assign .debug_rnglists indexes. */
11737 static void
11738 index_rnglists (void)
11740 unsigned i;
11741 dw_ranges *r;
11743 FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r)
11744 if (r->label)
11745 r->idx = rnglist_idx++;
11748 /* Emit .debug_rnglists section. */
11750 static void
11751 output_rnglists (unsigned generation)
11753 unsigned i;
11754 dw_ranges *r;
11755 char l1[MAX_ARTIFICIAL_LABEL_BYTES];
11756 char l2[MAX_ARTIFICIAL_LABEL_BYTES];
11757 char basebuf[MAX_ARTIFICIAL_LABEL_BYTES];
11759 switch_to_section (debug_ranges_section);
11760 ASM_OUTPUT_LABEL (asm_out_file, ranges_section_label);
11761 /* There are up to 4 unique ranges labels per generation.
11762 See also init_sections_and_labels. */
11763 ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_RANGES_SECTION_LABEL,
11764 2 + generation * 4);
11765 ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_RANGES_SECTION_LABEL,
11766 3 + generation * 4);
11767 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
11768 dw2_asm_output_data (4, 0xffffffff,
11769 "Initial length escape value indicating "
11770 "64-bit DWARF extension");
11771 dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
11772 "Length of Range Lists");
11773 ASM_OUTPUT_LABEL (asm_out_file, l1);
11774 output_dwarf_version ();
11775 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Address Size");
11776 dw2_asm_output_data (1, 0, "Segment Size");
11777 /* Emit the offset table only for -gsplit-dwarf. If we don't care
11778 about relocation sizes and primarily care about the size of .debug*
11779 sections in linked shared libraries and executables, then
11780 the offset table plus corresponding DW_FORM_rnglistx uleb128 indexes
11781 into it are usually larger than just DW_FORM_sec_offset offsets
11782 into the .debug_rnglists section. */
11783 dw2_asm_output_data (4, dwarf_split_debug_info ? rnglist_idx : 0,
11784 "Offset Entry Count");
11785 if (dwarf_split_debug_info)
11787 ASM_OUTPUT_LABEL (asm_out_file, ranges_base_label);
11788 FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r)
11789 if (r->label)
11790 dw2_asm_output_delta (DWARF_OFFSET_SIZE, r->label,
11791 ranges_base_label, NULL);
11794 const char *lab = "";
11795 unsigned int len = vec_safe_length (ranges_table);
11796 const char *base = NULL;
11797 FOR_EACH_VEC_SAFE_ELT (ranges_table, i, r)
11799 int block_num = r->num;
11801 if (r->label)
11803 ASM_OUTPUT_LABEL (asm_out_file, r->label);
11804 lab = r->label;
11806 if (HAVE_AS_LEB128 && (r->label || r->maybe_new_sec))
11807 base = NULL;
11808 if (block_num > 0)
11810 char blabel[MAX_ARTIFICIAL_LABEL_BYTES];
11811 char elabel[MAX_ARTIFICIAL_LABEL_BYTES];
11813 ASM_GENERATE_INTERNAL_LABEL (blabel, BLOCK_BEGIN_LABEL, block_num);
11814 ASM_GENERATE_INTERNAL_LABEL (elabel, BLOCK_END_LABEL, block_num);
11816 if (HAVE_AS_LEB128)
11818 /* If all code is in the text section, then the compilation
11819 unit base address defaults to DW_AT_low_pc, which is the
11820 base of the text section. */
11821 if (!have_multiple_function_sections)
11823 dw2_asm_output_data (1, DW_RLE_offset_pair,
11824 "DW_RLE_offset_pair (%s)", lab);
11825 dw2_asm_output_delta_uleb128 (blabel, text_section_label,
11826 "Range begin address (%s)", lab);
11827 dw2_asm_output_delta_uleb128 (elabel, text_section_label,
11828 "Range end address (%s)", lab);
11829 continue;
11831 if (base == NULL)
11833 dw_ranges *r2 = NULL;
11834 if (i < len - 1)
11835 r2 = &(*ranges_table)[i + 1];
11836 if (r2
11837 && r2->num != 0
11838 && r2->label == NULL
11839 && !r2->maybe_new_sec)
11841 dw2_asm_output_data (1, DW_RLE_base_address,
11842 "DW_RLE_base_address (%s)", lab);
11843 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11844 "Base address (%s)", lab);
11845 strcpy (basebuf, blabel);
11846 base = basebuf;
11849 if (base)
11851 dw2_asm_output_data (1, DW_RLE_offset_pair,
11852 "DW_RLE_offset_pair (%s)", lab);
11853 dw2_asm_output_delta_uleb128 (blabel, base,
11854 "Range begin address (%s)", lab);
11855 dw2_asm_output_delta_uleb128 (elabel, base,
11856 "Range end address (%s)", lab);
11857 continue;
11859 dw2_asm_output_data (1, DW_RLE_start_length,
11860 "DW_RLE_start_length (%s)", lab);
11861 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11862 "Range begin address (%s)", lab);
11863 dw2_asm_output_delta_uleb128 (elabel, blabel,
11864 "Range length (%s)", lab);
11866 else
11868 dw2_asm_output_data (1, DW_RLE_start_end,
11869 "DW_RLE_start_end (%s)", lab);
11870 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11871 "Range begin address (%s)", lab);
11872 dw2_asm_output_addr (DWARF2_ADDR_SIZE, elabel,
11873 "Range end address (%s)", lab);
11877 /* Negative block_num stands for an index into ranges_by_label. */
11878 else if (block_num < 0)
11880 int lab_idx = - block_num - 1;
11881 const char *blabel = (*ranges_by_label)[lab_idx].begin;
11882 const char *elabel = (*ranges_by_label)[lab_idx].end;
11884 if (!have_multiple_function_sections)
11885 gcc_unreachable ();
11886 if (HAVE_AS_LEB128)
11888 dw2_asm_output_data (1, DW_RLE_start_length,
11889 "DW_RLE_start_length (%s)", lab);
11890 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11891 "Range begin address (%s)", lab);
11892 dw2_asm_output_delta_uleb128 (elabel, blabel,
11893 "Range length (%s)", lab);
11895 else
11897 dw2_asm_output_data (1, DW_RLE_start_end,
11898 "DW_RLE_start_end (%s)", lab);
11899 dw2_asm_output_addr (DWARF2_ADDR_SIZE, blabel,
11900 "Range begin address (%s)", lab);
11901 dw2_asm_output_addr (DWARF2_ADDR_SIZE, elabel,
11902 "Range end address (%s)", lab);
11905 else
11906 dw2_asm_output_data (1, DW_RLE_end_of_list,
11907 "DW_RLE_end_of_list (%s)", lab);
11909 ASM_OUTPUT_LABEL (asm_out_file, l2);
11912 /* Data structure containing information about input files. */
11913 struct file_info
11915 const char *path; /* Complete file name. */
11916 const char *fname; /* File name part. */
11917 int length; /* Length of entire string. */
11918 struct dwarf_file_data * file_idx; /* Index in input file table. */
11919 int dir_idx; /* Index in directory table. */
11922 /* Data structure containing information about directories with source
11923 files. */
11924 struct dir_info
11926 const char *path; /* Path including directory name. */
11927 int length; /* Path length. */
11928 int prefix; /* Index of directory entry which is a prefix. */
11929 int count; /* Number of files in this directory. */
11930 int dir_idx; /* Index of directory used as base. */
11933 /* Callback function for file_info comparison. We sort by looking at
11934 the directories in the path. */
11936 static int
11937 file_info_cmp (const void *p1, const void *p2)
11939 const struct file_info *const s1 = (const struct file_info *) p1;
11940 const struct file_info *const s2 = (const struct file_info *) p2;
11941 const unsigned char *cp1;
11942 const unsigned char *cp2;
11944 /* Take care of file names without directories. We need to make sure that
11945 we return consistent values to qsort since some will get confused if
11946 we return the same value when identical operands are passed in opposite
11947 orders. So if neither has a directory, return 0 and otherwise return
11948 1 or -1 depending on which one has the directory. */
11949 if ((s1->path == s1->fname || s2->path == s2->fname))
11950 return (s2->path == s2->fname) - (s1->path == s1->fname);
11952 cp1 = (const unsigned char *) s1->path;
11953 cp2 = (const unsigned char *) s2->path;
11955 while (1)
11957 ++cp1;
11958 ++cp2;
11959 /* Reached the end of the first path? If so, handle like above. */
11960 if ((cp1 == (const unsigned char *) s1->fname)
11961 || (cp2 == (const unsigned char *) s2->fname))
11962 return ((cp2 == (const unsigned char *) s2->fname)
11963 - (cp1 == (const unsigned char *) s1->fname));
11965 /* Character of current path component the same? */
11966 else if (*cp1 != *cp2)
11967 return *cp1 - *cp2;
11971 struct file_name_acquire_data
11973 struct file_info *files;
11974 int used_files;
11975 int max_files;
11978 /* Traversal function for the hash table. */
11981 file_name_acquire (dwarf_file_data **slot, file_name_acquire_data *fnad)
11983 struct dwarf_file_data *d = *slot;
11984 struct file_info *fi;
11985 const char *f;
11987 gcc_assert (fnad->max_files >= d->emitted_number);
11989 if (! d->emitted_number)
11990 return 1;
11992 gcc_assert (fnad->max_files != fnad->used_files);
11994 fi = fnad->files + fnad->used_files++;
11996 /* Skip all leading "./". */
11997 f = d->filename;
11998 while (f[0] == '.' && IS_DIR_SEPARATOR (f[1]))
11999 f += 2;
12001 /* Create a new array entry. */
12002 fi->path = f;
12003 fi->length = strlen (f);
12004 fi->file_idx = d;
12006 /* Search for the file name part. */
12007 f = strrchr (f, DIR_SEPARATOR);
12008 #if defined (DIR_SEPARATOR_2)
12010 char *g = strrchr (fi->path, DIR_SEPARATOR_2);
12012 if (g != NULL)
12014 if (f == NULL || f < g)
12015 f = g;
12018 #endif
12020 fi->fname = f == NULL ? fi->path : f + 1;
12021 return 1;
12024 /* Helper function for output_file_names. Emit a FORM encoded
12025 string STR, with assembly comment start ENTRY_KIND and
12026 index IDX */
12028 static void
12029 output_line_string (enum dwarf_form form, const char *str,
12030 const char *entry_kind, unsigned int idx)
12032 switch (form)
12034 case DW_FORM_string:
12035 dw2_asm_output_nstring (str, -1, "%s: %#x", entry_kind, idx);
12036 break;
12037 case DW_FORM_line_strp:
12038 if (!debug_line_str_hash)
12039 debug_line_str_hash
12040 = hash_table<indirect_string_hasher>::create_ggc (10);
12042 struct indirect_string_node *node;
12043 node = find_AT_string_in_table (str, debug_line_str_hash);
12044 set_indirect_string (node);
12045 node->form = form;
12046 dw2_asm_output_offset (DWARF_OFFSET_SIZE, node->label,
12047 debug_line_str_section, "%s: %#x: \"%s\"",
12048 entry_kind, 0, node->str);
12049 break;
12050 default:
12051 gcc_unreachable ();
12055 /* Output the directory table and the file name table. We try to minimize
12056 the total amount of memory needed. A heuristic is used to avoid large
12057 slowdowns with many input files. */
12059 static void
12060 output_file_names (void)
12062 struct file_name_acquire_data fnad;
12063 int numfiles;
12064 struct file_info *files;
12065 struct dir_info *dirs;
12066 int *saved;
12067 int *savehere;
12068 int *backmap;
12069 int ndirs;
12070 int idx_offset;
12071 int i;
12073 if (!last_emitted_file)
12075 if (dwarf_version >= 5)
12077 dw2_asm_output_data (1, 0, "Directory entry format count");
12078 dw2_asm_output_data_uleb128 (0, "Directories count");
12079 dw2_asm_output_data (1, 0, "File name entry format count");
12080 dw2_asm_output_data_uleb128 (0, "File names count");
12082 else
12084 dw2_asm_output_data (1, 0, "End directory table");
12085 dw2_asm_output_data (1, 0, "End file name table");
12087 return;
12090 numfiles = last_emitted_file->emitted_number;
12092 /* Allocate the various arrays we need. */
12093 files = XALLOCAVEC (struct file_info, numfiles);
12094 dirs = XALLOCAVEC (struct dir_info, numfiles);
12096 fnad.files = files;
12097 fnad.used_files = 0;
12098 fnad.max_files = numfiles;
12099 file_table->traverse<file_name_acquire_data *, file_name_acquire> (&fnad);
12100 gcc_assert (fnad.used_files == fnad.max_files);
12102 qsort (files, numfiles, sizeof (files[0]), file_info_cmp);
12104 /* Find all the different directories used. */
12105 dirs[0].path = files[0].path;
12106 dirs[0].length = files[0].fname - files[0].path;
12107 dirs[0].prefix = -1;
12108 dirs[0].count = 1;
12109 dirs[0].dir_idx = 0;
12110 files[0].dir_idx = 0;
12111 ndirs = 1;
12113 for (i = 1; i < numfiles; i++)
12114 if (files[i].fname - files[i].path == dirs[ndirs - 1].length
12115 && memcmp (dirs[ndirs - 1].path, files[i].path,
12116 dirs[ndirs - 1].length) == 0)
12118 /* Same directory as last entry. */
12119 files[i].dir_idx = ndirs - 1;
12120 ++dirs[ndirs - 1].count;
12122 else
12124 int j;
12126 /* This is a new directory. */
12127 dirs[ndirs].path = files[i].path;
12128 dirs[ndirs].length = files[i].fname - files[i].path;
12129 dirs[ndirs].count = 1;
12130 dirs[ndirs].dir_idx = ndirs;
12131 files[i].dir_idx = ndirs;
12133 /* Search for a prefix. */
12134 dirs[ndirs].prefix = -1;
12135 for (j = 0; j < ndirs; j++)
12136 if (dirs[j].length < dirs[ndirs].length
12137 && dirs[j].length > 1
12138 && (dirs[ndirs].prefix == -1
12139 || dirs[j].length > dirs[dirs[ndirs].prefix].length)
12140 && memcmp (dirs[j].path, dirs[ndirs].path, dirs[j].length) == 0)
12141 dirs[ndirs].prefix = j;
12143 ++ndirs;
12146 /* Now to the actual work. We have to find a subset of the directories which
12147 allow expressing the file name using references to the directory table
12148 with the least amount of characters. We do not do an exhaustive search
12149 where we would have to check out every combination of every single
12150 possible prefix. Instead we use a heuristic which provides nearly optimal
12151 results in most cases and never is much off. */
12152 saved = XALLOCAVEC (int, ndirs);
12153 savehere = XALLOCAVEC (int, ndirs);
12155 memset (saved, '\0', ndirs * sizeof (saved[0]));
12156 for (i = 0; i < ndirs; i++)
12158 int j;
12159 int total;
12161 /* We can always save some space for the current directory. But this
12162 does not mean it will be enough to justify adding the directory. */
12163 savehere[i] = dirs[i].length;
12164 total = (savehere[i] - saved[i]) * dirs[i].count;
12166 for (j = i + 1; j < ndirs; j++)
12168 savehere[j] = 0;
12169 if (saved[j] < dirs[i].length)
12171 /* Determine whether the dirs[i] path is a prefix of the
12172 dirs[j] path. */
12173 int k;
12175 k = dirs[j].prefix;
12176 while (k != -1 && k != (int) i)
12177 k = dirs[k].prefix;
12179 if (k == (int) i)
12181 /* Yes it is. We can possibly save some memory by
12182 writing the filenames in dirs[j] relative to
12183 dirs[i]. */
12184 savehere[j] = dirs[i].length;
12185 total += (savehere[j] - saved[j]) * dirs[j].count;
12190 /* Check whether we can save enough to justify adding the dirs[i]
12191 directory. */
12192 if (total > dirs[i].length + 1)
12194 /* It's worthwhile adding. */
12195 for (j = i; j < ndirs; j++)
12196 if (savehere[j] > 0)
12198 /* Remember how much we saved for this directory so far. */
12199 saved[j] = savehere[j];
12201 /* Remember the prefix directory. */
12202 dirs[j].dir_idx = i;
12207 /* Emit the directory name table. */
12208 idx_offset = dirs[0].length > 0 ? 1 : 0;
12209 enum dwarf_form str_form = DW_FORM_string;
12210 enum dwarf_form idx_form = DW_FORM_udata;
12211 if (dwarf_version >= 5)
12213 const char *comp_dir = comp_dir_string ();
12214 if (comp_dir == NULL)
12215 comp_dir = "";
12216 dw2_asm_output_data (1, 1, "Directory entry format count");
12217 if (DWARF5_USE_DEBUG_LINE_STR)
12218 str_form = DW_FORM_line_strp;
12219 dw2_asm_output_data_uleb128 (DW_LNCT_path, "DW_LNCT_path");
12220 dw2_asm_output_data_uleb128 (str_form, "%s",
12221 get_DW_FORM_name (str_form));
12222 dw2_asm_output_data_uleb128 (ndirs + idx_offset, "Directories count");
12223 if (str_form == DW_FORM_string)
12225 dw2_asm_output_nstring (comp_dir, -1, "Directory Entry: %#x", 0);
12226 for (i = 1 - idx_offset; i < ndirs; i++)
12227 dw2_asm_output_nstring (dirs[i].path,
12228 dirs[i].length
12229 - !DWARF2_DIR_SHOULD_END_WITH_SEPARATOR,
12230 "Directory Entry: %#x", i + idx_offset);
12232 else
12234 output_line_string (str_form, comp_dir, "Directory Entry", 0);
12235 for (i = 1 - idx_offset; i < ndirs; i++)
12237 const char *str
12238 = ggc_alloc_string (dirs[i].path,
12239 dirs[i].length
12240 - !DWARF2_DIR_SHOULD_END_WITH_SEPARATOR);
12241 output_line_string (str_form, str, "Directory Entry",
12242 (unsigned) i + idx_offset);
12246 else
12248 for (i = 1 - idx_offset; i < ndirs; i++)
12249 dw2_asm_output_nstring (dirs[i].path,
12250 dirs[i].length
12251 - !DWARF2_DIR_SHOULD_END_WITH_SEPARATOR,
12252 "Directory Entry: %#x", i + idx_offset);
12254 dw2_asm_output_data (1, 0, "End directory table");
12257 /* We have to emit them in the order of emitted_number since that's
12258 used in the debug info generation. To do this efficiently we
12259 generate a back-mapping of the indices first. */
12260 backmap = XALLOCAVEC (int, numfiles);
12261 for (i = 0; i < numfiles; i++)
12262 backmap[files[i].file_idx->emitted_number - 1] = i;
12264 if (dwarf_version >= 5)
12266 const char *filename0 = get_AT_string (comp_unit_die (), DW_AT_name);
12267 if (filename0 == NULL)
12268 filename0 = "";
12269 /* DW_LNCT_directory_index can use DW_FORM_udata, DW_FORM_data1 and
12270 DW_FORM_data2. Choose one based on the number of directories
12271 and how much space would they occupy in each encoding.
12272 If we have at most 256 directories, all indexes fit into
12273 a single byte, so DW_FORM_data1 is most compact (if there
12274 are at most 128 directories, DW_FORM_udata would be as
12275 compact as that, but not shorter and slower to decode). */
12276 if (ndirs + idx_offset <= 256)
12277 idx_form = DW_FORM_data1;
12278 /* If there are more than 65536 directories, we have to use
12279 DW_FORM_udata, DW_FORM_data2 can't refer to them.
12280 Otherwise, compute what space would occupy if all the indexes
12281 used DW_FORM_udata - sum - and compare that to how large would
12282 be DW_FORM_data2 encoding, and pick the more efficient one. */
12283 else if (ndirs + idx_offset <= 65536)
12285 unsigned HOST_WIDE_INT sum = 1;
12286 for (i = 0; i < numfiles; i++)
12288 int file_idx = backmap[i];
12289 int dir_idx = dirs[files[file_idx].dir_idx].dir_idx;
12290 sum += size_of_uleb128 (dir_idx);
12292 if (sum >= HOST_WIDE_INT_UC (2) * (numfiles + 1))
12293 idx_form = DW_FORM_data2;
12295 #ifdef VMS_DEBUGGING_INFO
12296 dw2_asm_output_data (1, 4, "File name entry format count");
12297 #else
12298 dw2_asm_output_data (1, 2, "File name entry format count");
12299 #endif
12300 dw2_asm_output_data_uleb128 (DW_LNCT_path, "DW_LNCT_path");
12301 dw2_asm_output_data_uleb128 (str_form, "%s",
12302 get_DW_FORM_name (str_form));
12303 dw2_asm_output_data_uleb128 (DW_LNCT_directory_index,
12304 "DW_LNCT_directory_index");
12305 dw2_asm_output_data_uleb128 (idx_form, "%s",
12306 get_DW_FORM_name (idx_form));
12307 #ifdef VMS_DEBUGGING_INFO
12308 dw2_asm_output_data_uleb128 (DW_LNCT_timestamp, "DW_LNCT_timestamp");
12309 dw2_asm_output_data_uleb128 (DW_FORM_udata, "DW_FORM_udata");
12310 dw2_asm_output_data_uleb128 (DW_LNCT_size, "DW_LNCT_size");
12311 dw2_asm_output_data_uleb128 (DW_FORM_udata, "DW_FORM_udata");
12312 #endif
12313 dw2_asm_output_data_uleb128 (numfiles + 1, "File names count");
12315 output_line_string (str_form, filename0, "File Entry", 0);
12317 /* Include directory index. */
12318 if (idx_form != DW_FORM_udata)
12319 dw2_asm_output_data (idx_form == DW_FORM_data1 ? 1 : 2,
12320 0, NULL);
12321 else
12322 dw2_asm_output_data_uleb128 (0, NULL);
12324 #ifdef VMS_DEBUGGING_INFO
12325 dw2_asm_output_data_uleb128 (0, NULL);
12326 dw2_asm_output_data_uleb128 (0, NULL);
12327 #endif
12330 /* Now write all the file names. */
12331 for (i = 0; i < numfiles; i++)
12333 int file_idx = backmap[i];
12334 int dir_idx = dirs[files[file_idx].dir_idx].dir_idx;
12336 #ifdef VMS_DEBUGGING_INFO
12337 #define MAX_VMS_VERSION_LEN 6 /* ";32768" */
12339 /* Setting these fields can lead to debugger miscomparisons,
12340 but VMS Debug requires them to be set correctly. */
12342 int ver;
12343 long long cdt;
12344 long siz;
12345 int maxfilelen = (strlen (files[file_idx].path)
12346 + dirs[dir_idx].length
12347 + MAX_VMS_VERSION_LEN + 1);
12348 char *filebuf = XALLOCAVEC (char, maxfilelen);
12350 vms_file_stats_name (files[file_idx].path, 0, 0, 0, &ver);
12351 snprintf (filebuf, maxfilelen, "%s;%d",
12352 files[file_idx].path + dirs[dir_idx].length, ver);
12354 output_line_string (str_form, filebuf, "File Entry", (unsigned) i + 1);
12356 /* Include directory index. */
12357 if (dwarf_version >= 5 && idx_form != DW_FORM_udata)
12358 dw2_asm_output_data (idx_form == DW_FORM_data1 ? 1 : 2,
12359 dir_idx + idx_offset, NULL);
12360 else
12361 dw2_asm_output_data_uleb128 (dir_idx + idx_offset, NULL);
12363 /* Modification time. */
12364 dw2_asm_output_data_uleb128 ((vms_file_stats_name (files[file_idx].path,
12365 &cdt, 0, 0, 0) == 0)
12366 ? cdt : 0, NULL);
12368 /* File length in bytes. */
12369 dw2_asm_output_data_uleb128 ((vms_file_stats_name (files[file_idx].path,
12370 0, &siz, 0, 0) == 0)
12371 ? siz : 0, NULL);
12372 #else
12373 output_line_string (str_form,
12374 files[file_idx].path + dirs[dir_idx].length,
12375 "File Entry", (unsigned) i + 1);
12377 /* Include directory index. */
12378 if (dwarf_version >= 5 && idx_form != DW_FORM_udata)
12379 dw2_asm_output_data (idx_form == DW_FORM_data1 ? 1 : 2,
12380 dir_idx + idx_offset, NULL);
12381 else
12382 dw2_asm_output_data_uleb128 (dir_idx + idx_offset, NULL);
12384 if (dwarf_version >= 5)
12385 continue;
12387 /* Modification time. */
12388 dw2_asm_output_data_uleb128 (0, NULL);
12390 /* File length in bytes. */
12391 dw2_asm_output_data_uleb128 (0, NULL);
12392 #endif /* VMS_DEBUGGING_INFO */
12395 if (dwarf_version < 5)
12396 dw2_asm_output_data (1, 0, "End file name table");
12400 /* Output one line number table into the .debug_line section. */
12402 static void
12403 output_one_line_info_table (dw_line_info_table *table)
12405 char line_label[MAX_ARTIFICIAL_LABEL_BYTES];
12406 unsigned int current_line = 1;
12407 bool current_is_stmt = DWARF_LINE_DEFAULT_IS_STMT_START;
12408 dw_line_info_entry *ent, *prev_addr;
12409 size_t i;
12410 unsigned int view;
12412 view = 0;
12414 FOR_EACH_VEC_SAFE_ELT (table->entries, i, ent)
12416 switch (ent->opcode)
12418 case LI_set_address:
12419 /* ??? Unfortunately, we have little choice here currently, and
12420 must always use the most general form. GCC does not know the
12421 address delta itself, so we can't use DW_LNS_advance_pc. Many
12422 ports do have length attributes which will give an upper bound
12423 on the address range. We could perhaps use length attributes
12424 to determine when it is safe to use DW_LNS_fixed_advance_pc. */
12425 ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, ent->val);
12427 view = 0;
12429 /* This can handle any delta. This takes
12430 4+DWARF2_ADDR_SIZE bytes. */
12431 dw2_asm_output_data (1, 0, "set address %s%s", line_label,
12432 debug_variable_location_views
12433 ? ", reset view to 0" : "");
12434 dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
12435 dw2_asm_output_data (1, DW_LNE_set_address, NULL);
12436 dw2_asm_output_addr (DWARF2_ADDR_SIZE, line_label, NULL);
12438 prev_addr = ent;
12439 break;
12441 case LI_adv_address:
12443 ASM_GENERATE_INTERNAL_LABEL (line_label, LINE_CODE_LABEL, ent->val);
12444 char prev_label[MAX_ARTIFICIAL_LABEL_BYTES];
12445 ASM_GENERATE_INTERNAL_LABEL (prev_label, LINE_CODE_LABEL, prev_addr->val);
12447 view++;
12449 dw2_asm_output_data (1, DW_LNS_fixed_advance_pc, "fixed advance PC, increment view to %i", view);
12450 dw2_asm_output_delta (2, line_label, prev_label,
12451 "from %s to %s", prev_label, line_label);
12453 prev_addr = ent;
12454 break;
12457 case LI_set_line:
12458 if (ent->val == current_line)
12460 /* We still need to start a new row, so output a copy insn. */
12461 dw2_asm_output_data (1, DW_LNS_copy,
12462 "copy line %u", current_line);
12464 else
12466 int line_offset = ent->val - current_line;
12467 int line_delta = line_offset - DWARF_LINE_BASE;
12469 current_line = ent->val;
12470 if (line_delta >= 0 && line_delta < (DWARF_LINE_RANGE - 1))
12472 /* This can handle deltas from -10 to 234, using the current
12473 definitions of DWARF_LINE_BASE and DWARF_LINE_RANGE.
12474 This takes 1 byte. */
12475 dw2_asm_output_data (1, DWARF_LINE_OPCODE_BASE + line_delta,
12476 "line %u", current_line);
12478 else
12480 /* This can handle any delta. This takes at least 4 bytes,
12481 depending on the value being encoded. */
12482 dw2_asm_output_data (1, DW_LNS_advance_line,
12483 "advance to line %u", current_line);
12484 dw2_asm_output_data_sleb128 (line_offset, NULL);
12485 dw2_asm_output_data (1, DW_LNS_copy, NULL);
12488 break;
12490 case LI_set_file:
12491 dw2_asm_output_data (1, DW_LNS_set_file, "set file %u", ent->val);
12492 dw2_asm_output_data_uleb128 (ent->val, "%u", ent->val);
12493 break;
12495 case LI_set_column:
12496 dw2_asm_output_data (1, DW_LNS_set_column, "column %u", ent->val);
12497 dw2_asm_output_data_uleb128 (ent->val, "%u", ent->val);
12498 break;
12500 case LI_negate_stmt:
12501 current_is_stmt = !current_is_stmt;
12502 dw2_asm_output_data (1, DW_LNS_negate_stmt,
12503 "is_stmt %d", current_is_stmt);
12504 break;
12506 case LI_set_prologue_end:
12507 dw2_asm_output_data (1, DW_LNS_set_prologue_end,
12508 "set prologue end");
12509 break;
12511 case LI_set_epilogue_begin:
12512 dw2_asm_output_data (1, DW_LNS_set_epilogue_begin,
12513 "set epilogue begin");
12514 break;
12516 case LI_set_discriminator:
12517 dw2_asm_output_data (1, 0, "discriminator %u", ent->val);
12518 dw2_asm_output_data_uleb128 (1 + size_of_uleb128 (ent->val), NULL);
12519 dw2_asm_output_data (1, DW_LNE_set_discriminator, NULL);
12520 dw2_asm_output_data_uleb128 (ent->val, NULL);
12521 break;
12525 /* Emit debug info for the address of the end of the table. */
12526 dw2_asm_output_data (1, 0, "set address %s", table->end_label);
12527 dw2_asm_output_data_uleb128 (1 + DWARF2_ADDR_SIZE, NULL);
12528 dw2_asm_output_data (1, DW_LNE_set_address, NULL);
12529 dw2_asm_output_addr (DWARF2_ADDR_SIZE, table->end_label, NULL);
12531 dw2_asm_output_data (1, 0, "end sequence");
12532 dw2_asm_output_data_uleb128 (1, NULL);
12533 dw2_asm_output_data (1, DW_LNE_end_sequence, NULL);
12536 /* Output the source line number correspondence information. This
12537 information goes into the .debug_line section. */
12539 static void
12540 output_line_info (bool prologue_only)
12542 static unsigned int generation;
12543 char l1[MAX_ARTIFICIAL_LABEL_BYTES], l2[MAX_ARTIFICIAL_LABEL_BYTES];
12544 char p1[MAX_ARTIFICIAL_LABEL_BYTES], p2[MAX_ARTIFICIAL_LABEL_BYTES];
12545 bool saw_one = false;
12546 int opc;
12548 ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, generation);
12549 ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, generation);
12550 ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, generation);
12551 ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, generation++);
12553 if (!XCOFF_DEBUGGING_INFO)
12555 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
12556 dw2_asm_output_data (4, 0xffffffff,
12557 "Initial length escape value indicating 64-bit DWARF extension");
12558 dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
12559 "Length of Source Line Info");
12562 ASM_OUTPUT_LABEL (asm_out_file, l1);
12564 output_dwarf_version ();
12565 if (dwarf_version >= 5)
12567 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Address Size");
12568 dw2_asm_output_data (1, 0, "Segment Size");
12570 dw2_asm_output_delta (DWARF_OFFSET_SIZE, p2, p1, "Prolog Length");
12571 ASM_OUTPUT_LABEL (asm_out_file, p1);
12573 /* Define the architecture-dependent minimum instruction length (in bytes).
12574 In this implementation of DWARF, this field is used for information
12575 purposes only. Since GCC generates assembly language, we have no
12576 a priori knowledge of how many instruction bytes are generated for each
12577 source line, and therefore can use only the DW_LNE_set_address and
12578 DW_LNS_fixed_advance_pc line information commands. Accordingly, we fix
12579 this as '1', which is "correct enough" for all architectures,
12580 and don't let the target override. */
12581 dw2_asm_output_data (1, 1, "Minimum Instruction Length");
12583 if (dwarf_version >= 4)
12584 dw2_asm_output_data (1, DWARF_LINE_DEFAULT_MAX_OPS_PER_INSN,
12585 "Maximum Operations Per Instruction");
12586 dw2_asm_output_data (1, DWARF_LINE_DEFAULT_IS_STMT_START,
12587 "Default is_stmt_start flag");
12588 dw2_asm_output_data (1, DWARF_LINE_BASE,
12589 "Line Base Value (Special Opcodes)");
12590 dw2_asm_output_data (1, DWARF_LINE_RANGE,
12591 "Line Range Value (Special Opcodes)");
12592 dw2_asm_output_data (1, DWARF_LINE_OPCODE_BASE,
12593 "Special Opcode Base");
12595 for (opc = 1; opc < DWARF_LINE_OPCODE_BASE; opc++)
12597 int n_op_args;
12598 switch (opc)
12600 case DW_LNS_advance_pc:
12601 case DW_LNS_advance_line:
12602 case DW_LNS_set_file:
12603 case DW_LNS_set_column:
12604 case DW_LNS_fixed_advance_pc:
12605 case DW_LNS_set_isa:
12606 n_op_args = 1;
12607 break;
12608 default:
12609 n_op_args = 0;
12610 break;
12613 dw2_asm_output_data (1, n_op_args, "opcode: %#x has %d args",
12614 opc, n_op_args);
12617 /* Write out the information about the files we use. */
12618 output_file_names ();
12619 ASM_OUTPUT_LABEL (asm_out_file, p2);
12620 if (prologue_only)
12622 /* Output the marker for the end of the line number info. */
12623 ASM_OUTPUT_LABEL (asm_out_file, l2);
12624 return;
12627 if (separate_line_info)
12629 dw_line_info_table *table;
12630 size_t i;
12632 FOR_EACH_VEC_ELT (*separate_line_info, i, table)
12633 if (table->in_use)
12635 output_one_line_info_table (table);
12636 saw_one = true;
12639 if (cold_text_section_line_info && cold_text_section_line_info->in_use)
12641 output_one_line_info_table (cold_text_section_line_info);
12642 saw_one = true;
12645 /* ??? Some Darwin linkers crash on a .debug_line section with no
12646 sequences. Further, merely a DW_LNE_end_sequence entry is not
12647 sufficient -- the address column must also be initialized.
12648 Make sure to output at least one set_address/end_sequence pair,
12649 choosing .text since that section is always present. */
12650 if (text_section_line_info->in_use || !saw_one)
12651 output_one_line_info_table (text_section_line_info);
12653 /* Output the marker for the end of the line number info. */
12654 ASM_OUTPUT_LABEL (asm_out_file, l2);
12657 /* Return true if DW_AT_endianity should be emitted according to REVERSE. */
12659 static inline bool
12660 need_endianity_attribute_p (bool reverse)
12662 return reverse && (dwarf_version >= 3 || !dwarf_strict);
12665 /* Given a pointer to a tree node for some base type, return a pointer to
12666 a DIE that describes the given type. REVERSE is true if the type is
12667 to be interpreted in the reverse storage order wrt the target order.
12669 This routine must only be called for GCC type nodes that correspond to
12670 Dwarf base (fundamental) types. */
12672 static dw_die_ref
12673 base_type_die (tree type, bool reverse)
12675 dw_die_ref base_type_result;
12676 enum dwarf_type encoding;
12677 bool fpt_used = false;
12678 struct fixed_point_type_info fpt_info;
12679 tree type_bias = NULL_TREE;
12681 /* If this is a subtype that should not be emitted as a subrange type,
12682 use the base type. See subrange_type_for_debug_p. */
12683 if (TREE_CODE (type) == INTEGER_TYPE && TREE_TYPE (type) != NULL_TREE)
12684 type = TREE_TYPE (type);
12686 switch (TREE_CODE (type))
12688 case INTEGER_TYPE:
12689 if ((dwarf_version >= 4 || !dwarf_strict)
12690 && TYPE_NAME (type)
12691 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
12692 && DECL_IS_BUILTIN (TYPE_NAME (type))
12693 && DECL_NAME (TYPE_NAME (type)))
12695 const char *name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
12696 if (strcmp (name, "char16_t") == 0
12697 || strcmp (name, "char32_t") == 0)
12699 encoding = DW_ATE_UTF;
12700 break;
12703 if ((dwarf_version >= 3 || !dwarf_strict)
12704 && lang_hooks.types.get_fixed_point_type_info)
12706 memset (&fpt_info, 0, sizeof (fpt_info));
12707 if (lang_hooks.types.get_fixed_point_type_info (type, &fpt_info))
12709 fpt_used = true;
12710 encoding = ((TYPE_UNSIGNED (type))
12711 ? DW_ATE_unsigned_fixed
12712 : DW_ATE_signed_fixed);
12713 break;
12716 if (TYPE_STRING_FLAG (type))
12718 if (TYPE_UNSIGNED (type))
12719 encoding = DW_ATE_unsigned_char;
12720 else
12721 encoding = DW_ATE_signed_char;
12723 else if (TYPE_UNSIGNED (type))
12724 encoding = DW_ATE_unsigned;
12725 else
12726 encoding = DW_ATE_signed;
12728 if (!dwarf_strict
12729 && lang_hooks.types.get_type_bias)
12730 type_bias = lang_hooks.types.get_type_bias (type);
12731 break;
12733 case REAL_TYPE:
12734 if (DECIMAL_FLOAT_MODE_P (TYPE_MODE (type)))
12736 if (dwarf_version >= 3 || !dwarf_strict)
12737 encoding = DW_ATE_decimal_float;
12738 else
12739 encoding = DW_ATE_lo_user;
12741 else
12742 encoding = DW_ATE_float;
12743 break;
12745 case FIXED_POINT_TYPE:
12746 if (!(dwarf_version >= 3 || !dwarf_strict))
12747 encoding = DW_ATE_lo_user;
12748 else if (TYPE_UNSIGNED (type))
12749 encoding = DW_ATE_unsigned_fixed;
12750 else
12751 encoding = DW_ATE_signed_fixed;
12752 break;
12754 /* Dwarf2 doesn't know anything about complex ints, so use
12755 a user defined type for it. */
12756 case COMPLEX_TYPE:
12757 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
12758 encoding = DW_ATE_complex_float;
12759 else
12760 encoding = DW_ATE_lo_user;
12761 break;
12763 case BOOLEAN_TYPE:
12764 /* GNU FORTRAN/Ada/C++ BOOLEAN type. */
12765 encoding = DW_ATE_boolean;
12766 break;
12768 default:
12769 /* No other TREE_CODEs are Dwarf fundamental types. */
12770 gcc_unreachable ();
12773 base_type_result = new_die_raw (DW_TAG_base_type);
12775 add_AT_unsigned (base_type_result, DW_AT_byte_size,
12776 int_size_in_bytes (type));
12777 add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
12779 if (need_endianity_attribute_p (reverse))
12780 add_AT_unsigned (base_type_result, DW_AT_endianity,
12781 BYTES_BIG_ENDIAN ? DW_END_little : DW_END_big);
12783 add_alignment_attribute (base_type_result, type);
12785 if (fpt_used)
12787 switch (fpt_info.scale_factor_kind)
12789 case fixed_point_scale_factor_binary:
12790 add_AT_int (base_type_result, DW_AT_binary_scale,
12791 fpt_info.scale_factor.binary);
12792 break;
12794 case fixed_point_scale_factor_decimal:
12795 add_AT_int (base_type_result, DW_AT_decimal_scale,
12796 fpt_info.scale_factor.decimal);
12797 break;
12799 case fixed_point_scale_factor_arbitrary:
12800 /* Arbitrary scale factors cannot be described in standard DWARF,
12801 yet. */
12802 if (!dwarf_strict)
12804 /* Describe the scale factor as a rational constant. */
12805 const dw_die_ref scale_factor
12806 = new_die (DW_TAG_constant, comp_unit_die (), type);
12808 add_AT_unsigned (scale_factor, DW_AT_GNU_numerator,
12809 fpt_info.scale_factor.arbitrary.numerator);
12810 add_AT_int (scale_factor, DW_AT_GNU_denominator,
12811 fpt_info.scale_factor.arbitrary.denominator);
12813 add_AT_die_ref (base_type_result, DW_AT_small, scale_factor);
12815 break;
12817 default:
12818 gcc_unreachable ();
12822 if (type_bias)
12823 add_scalar_info (base_type_result, DW_AT_GNU_bias, type_bias,
12824 dw_scalar_form_constant
12825 | dw_scalar_form_exprloc
12826 | dw_scalar_form_reference,
12827 NULL);
12829 return base_type_result;
12832 /* A C++ function with deduced return type can have a TEMPLATE_TYPE_PARM
12833 named 'auto' in its type: return true for it, false otherwise. */
12835 static inline bool
12836 is_cxx_auto (tree type)
12838 if (is_cxx ())
12840 tree name = TYPE_IDENTIFIER (type);
12841 if (name == get_identifier ("auto")
12842 || name == get_identifier ("decltype(auto)"))
12843 return true;
12845 return false;
12848 /* Given a pointer to an arbitrary ..._TYPE tree node, return nonzero if the
12849 given input type is a Dwarf "fundamental" type. Otherwise return null. */
12851 static inline int
12852 is_base_type (tree type)
12854 switch (TREE_CODE (type))
12856 case INTEGER_TYPE:
12857 case REAL_TYPE:
12858 case FIXED_POINT_TYPE:
12859 case COMPLEX_TYPE:
12860 case BOOLEAN_TYPE:
12861 case POINTER_BOUNDS_TYPE:
12862 return 1;
12864 case VOID_TYPE:
12865 case ARRAY_TYPE:
12866 case RECORD_TYPE:
12867 case UNION_TYPE:
12868 case QUAL_UNION_TYPE:
12869 case ENUMERAL_TYPE:
12870 case FUNCTION_TYPE:
12871 case METHOD_TYPE:
12872 case POINTER_TYPE:
12873 case REFERENCE_TYPE:
12874 case NULLPTR_TYPE:
12875 case OFFSET_TYPE:
12876 case LANG_TYPE:
12877 case VECTOR_TYPE:
12878 return 0;
12880 default:
12881 if (is_cxx_auto (type))
12882 return 0;
12883 gcc_unreachable ();
12886 return 0;
12889 /* Given a pointer to a tree node, assumed to be some kind of a ..._TYPE
12890 node, return the size in bits for the type if it is a constant, or else
12891 return the alignment for the type if the type's size is not constant, or
12892 else return BITS_PER_WORD if the type actually turns out to be an
12893 ERROR_MARK node. */
12895 static inline unsigned HOST_WIDE_INT
12896 simple_type_size_in_bits (const_tree type)
12898 if (TREE_CODE (type) == ERROR_MARK)
12899 return BITS_PER_WORD;
12900 else if (TYPE_SIZE (type) == NULL_TREE)
12901 return 0;
12902 else if (tree_fits_uhwi_p (TYPE_SIZE (type)))
12903 return tree_to_uhwi (TYPE_SIZE (type));
12904 else
12905 return TYPE_ALIGN (type);
12908 /* Similarly, but return an offset_int instead of UHWI. */
12910 static inline offset_int
12911 offset_int_type_size_in_bits (const_tree type)
12913 if (TREE_CODE (type) == ERROR_MARK)
12914 return BITS_PER_WORD;
12915 else if (TYPE_SIZE (type) == NULL_TREE)
12916 return 0;
12917 else if (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST)
12918 return wi::to_offset (TYPE_SIZE (type));
12919 else
12920 return TYPE_ALIGN (type);
12923 /* Given a pointer to a tree node for a subrange type, return a pointer
12924 to a DIE that describes the given type. */
12926 static dw_die_ref
12927 subrange_type_die (tree type, tree low, tree high, tree bias,
12928 dw_die_ref context_die)
12930 dw_die_ref subrange_die;
12931 const HOST_WIDE_INT size_in_bytes = int_size_in_bytes (type);
12933 if (context_die == NULL)
12934 context_die = comp_unit_die ();
12936 subrange_die = new_die (DW_TAG_subrange_type, context_die, type);
12938 if (int_size_in_bytes (TREE_TYPE (type)) != size_in_bytes)
12940 /* The size of the subrange type and its base type do not match,
12941 so we need to generate a size attribute for the subrange type. */
12942 add_AT_unsigned (subrange_die, DW_AT_byte_size, size_in_bytes);
12945 add_alignment_attribute (subrange_die, type);
12947 if (low)
12948 add_bound_info (subrange_die, DW_AT_lower_bound, low, NULL);
12949 if (high)
12950 add_bound_info (subrange_die, DW_AT_upper_bound, high, NULL);
12951 if (bias && !dwarf_strict)
12952 add_scalar_info (subrange_die, DW_AT_GNU_bias, bias,
12953 dw_scalar_form_constant
12954 | dw_scalar_form_exprloc
12955 | dw_scalar_form_reference,
12956 NULL);
12958 return subrange_die;
12961 /* Returns the (const and/or volatile) cv_qualifiers associated with
12962 the decl node. This will normally be augmented with the
12963 cv_qualifiers of the underlying type in add_type_attribute. */
12965 static int
12966 decl_quals (const_tree decl)
12968 return ((TREE_READONLY (decl)
12969 /* The C++ front-end correctly marks reference-typed
12970 variables as readonly, but from a language (and debug
12971 info) standpoint they are not const-qualified. */
12972 && TREE_CODE (TREE_TYPE (decl)) != REFERENCE_TYPE
12973 ? TYPE_QUAL_CONST : TYPE_UNQUALIFIED)
12974 | (TREE_THIS_VOLATILE (decl)
12975 ? TYPE_QUAL_VOLATILE : TYPE_UNQUALIFIED));
12978 /* Determine the TYPE whose qualifiers match the largest strict subset
12979 of the given TYPE_QUALS, and return its qualifiers. Ignore all
12980 qualifiers outside QUAL_MASK. */
12982 static int
12983 get_nearest_type_subqualifiers (tree type, int type_quals, int qual_mask)
12985 tree t;
12986 int best_rank = 0, best_qual = 0, max_rank;
12988 type_quals &= qual_mask;
12989 max_rank = popcount_hwi (type_quals) - 1;
12991 for (t = TYPE_MAIN_VARIANT (type); t && best_rank < max_rank;
12992 t = TYPE_NEXT_VARIANT (t))
12994 int q = TYPE_QUALS (t) & qual_mask;
12996 if ((q & type_quals) == q && q != type_quals
12997 && check_base_type (t, type))
12999 int rank = popcount_hwi (q);
13001 if (rank > best_rank)
13003 best_rank = rank;
13004 best_qual = q;
13009 return best_qual;
13012 struct dwarf_qual_info_t { int q; enum dwarf_tag t; };
13013 static const dwarf_qual_info_t dwarf_qual_info[] =
13015 { TYPE_QUAL_CONST, DW_TAG_const_type },
13016 { TYPE_QUAL_VOLATILE, DW_TAG_volatile_type },
13017 { TYPE_QUAL_RESTRICT, DW_TAG_restrict_type },
13018 { TYPE_QUAL_ATOMIC, DW_TAG_atomic_type }
13020 static const unsigned int dwarf_qual_info_size
13021 = sizeof (dwarf_qual_info) / sizeof (dwarf_qual_info[0]);
13023 /* If DIE is a qualified DIE of some base DIE with the same parent,
13024 return the base DIE, otherwise return NULL. Set MASK to the
13025 qualifiers added compared to the returned DIE. */
13027 static dw_die_ref
13028 qualified_die_p (dw_die_ref die, int *mask, unsigned int depth)
13030 unsigned int i;
13031 for (i = 0; i < dwarf_qual_info_size; i++)
13032 if (die->die_tag == dwarf_qual_info[i].t)
13033 break;
13034 if (i == dwarf_qual_info_size)
13035 return NULL;
13036 if (vec_safe_length (die->die_attr) != 1)
13037 return NULL;
13038 dw_die_ref type = get_AT_ref (die, DW_AT_type);
13039 if (type == NULL || type->die_parent != die->die_parent)
13040 return NULL;
13041 *mask |= dwarf_qual_info[i].q;
13042 if (depth)
13044 dw_die_ref ret = qualified_die_p (type, mask, depth - 1);
13045 if (ret)
13046 return ret;
13048 return type;
13051 /* Given a pointer to an arbitrary ..._TYPE tree node, return a debugging
13052 entry that chains the modifiers specified by CV_QUALS in front of the
13053 given type. REVERSE is true if the type is to be interpreted in the
13054 reverse storage order wrt the target order. */
13056 static dw_die_ref
13057 modified_type_die (tree type, int cv_quals, bool reverse,
13058 dw_die_ref context_die)
13060 enum tree_code code = TREE_CODE (type);
13061 dw_die_ref mod_type_die;
13062 dw_die_ref sub_die = NULL;
13063 tree item_type = NULL;
13064 tree qualified_type;
13065 tree name, low, high;
13066 dw_die_ref mod_scope;
13067 /* Only these cv-qualifiers are currently handled. */
13068 const int cv_qual_mask = (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE
13069 | TYPE_QUAL_RESTRICT | TYPE_QUAL_ATOMIC |
13070 ENCODE_QUAL_ADDR_SPACE(~0U));
13071 const bool reverse_base_type
13072 = need_endianity_attribute_p (reverse) && is_base_type (type);
13074 if (code == ERROR_MARK)
13075 return NULL;
13077 if (lang_hooks.types.get_debug_type)
13079 tree debug_type = lang_hooks.types.get_debug_type (type);
13081 if (debug_type != NULL_TREE && debug_type != type)
13082 return modified_type_die (debug_type, cv_quals, reverse, context_die);
13085 cv_quals &= cv_qual_mask;
13087 /* Don't emit DW_TAG_restrict_type for DWARFv2, since it is a type
13088 tag modifier (and not an attribute) old consumers won't be able
13089 to handle it. */
13090 if (dwarf_version < 3)
13091 cv_quals &= ~TYPE_QUAL_RESTRICT;
13093 /* Likewise for DW_TAG_atomic_type for DWARFv5. */
13094 if (dwarf_version < 5)
13095 cv_quals &= ~TYPE_QUAL_ATOMIC;
13097 /* See if we already have the appropriately qualified variant of
13098 this type. */
13099 qualified_type = get_qualified_type (type, cv_quals);
13101 if (qualified_type == sizetype)
13103 /* Try not to expose the internal sizetype type's name. */
13104 if (TYPE_NAME (qualified_type)
13105 && TREE_CODE (TYPE_NAME (qualified_type)) == TYPE_DECL)
13107 tree t = TREE_TYPE (TYPE_NAME (qualified_type));
13109 gcc_checking_assert (TREE_CODE (t) == INTEGER_TYPE
13110 && (TYPE_PRECISION (t)
13111 == TYPE_PRECISION (qualified_type))
13112 && (TYPE_UNSIGNED (t)
13113 == TYPE_UNSIGNED (qualified_type)));
13114 qualified_type = t;
13116 else if (qualified_type == sizetype
13117 && TREE_CODE (sizetype) == TREE_CODE (size_type_node)
13118 && TYPE_PRECISION (sizetype) == TYPE_PRECISION (size_type_node)
13119 && TYPE_UNSIGNED (sizetype) == TYPE_UNSIGNED (size_type_node))
13120 qualified_type = size_type_node;
13123 /* If we do, then we can just use its DIE, if it exists. */
13124 if (qualified_type)
13126 mod_type_die = lookup_type_die (qualified_type);
13128 /* DW_AT_endianity doesn't come from a qualifier on the type, so it is
13129 dealt with specially: the DIE with the attribute, if it exists, is
13130 placed immediately after the regular DIE for the same base type. */
13131 if (mod_type_die
13132 && (!reverse_base_type
13133 || ((mod_type_die = mod_type_die->die_sib) != NULL
13134 && get_AT_unsigned (mod_type_die, DW_AT_endianity))))
13135 return mod_type_die;
13138 name = qualified_type ? TYPE_NAME (qualified_type) : NULL;
13140 /* Handle C typedef types. */
13141 if (name
13142 && TREE_CODE (name) == TYPE_DECL
13143 && DECL_ORIGINAL_TYPE (name)
13144 && !DECL_ARTIFICIAL (name))
13146 tree dtype = TREE_TYPE (name);
13148 /* Skip the typedef for base types with DW_AT_endianity, no big deal. */
13149 if (qualified_type == dtype && !reverse_base_type)
13151 tree origin = decl_ultimate_origin (name);
13153 /* Typedef variants that have an abstract origin don't get their own
13154 type DIE (see gen_typedef_die), so fall back on the ultimate
13155 abstract origin instead. */
13156 if (origin != NULL && origin != name)
13157 return modified_type_die (TREE_TYPE (origin), cv_quals, reverse,
13158 context_die);
13160 /* For a named type, use the typedef. */
13161 gen_type_die (qualified_type, context_die);
13162 return lookup_type_die (qualified_type);
13164 else
13166 int dquals = TYPE_QUALS_NO_ADDR_SPACE (dtype);
13167 dquals &= cv_qual_mask;
13168 if ((dquals & ~cv_quals) != TYPE_UNQUALIFIED
13169 || (cv_quals == dquals && DECL_ORIGINAL_TYPE (name) != type))
13170 /* cv-unqualified version of named type. Just use
13171 the unnamed type to which it refers. */
13172 return modified_type_die (DECL_ORIGINAL_TYPE (name), cv_quals,
13173 reverse, context_die);
13174 /* Else cv-qualified version of named type; fall through. */
13178 mod_scope = scope_die_for (type, context_die);
13180 if (cv_quals)
13182 int sub_quals = 0, first_quals = 0;
13183 unsigned i;
13184 dw_die_ref first = NULL, last = NULL;
13186 /* Determine a lesser qualified type that most closely matches
13187 this one. Then generate DW_TAG_* entries for the remaining
13188 qualifiers. */
13189 sub_quals = get_nearest_type_subqualifiers (type, cv_quals,
13190 cv_qual_mask);
13191 if (sub_quals && use_debug_types)
13193 bool needed = false;
13194 /* If emitting type units, make sure the order of qualifiers
13195 is canonical. Thus, start from unqualified type if
13196 an earlier qualifier is missing in sub_quals, but some later
13197 one is present there. */
13198 for (i = 0; i < dwarf_qual_info_size; i++)
13199 if (dwarf_qual_info[i].q & cv_quals & ~sub_quals)
13200 needed = true;
13201 else if (needed && (dwarf_qual_info[i].q & cv_quals))
13203 sub_quals = 0;
13204 break;
13207 mod_type_die = modified_type_die (type, sub_quals, reverse, context_die);
13208 if (mod_scope && mod_type_die && mod_type_die->die_parent == mod_scope)
13210 /* As not all intermediate qualified DIEs have corresponding
13211 tree types, ensure that qualified DIEs in the same scope
13212 as their DW_AT_type are emitted after their DW_AT_type,
13213 only with other qualified DIEs for the same type possibly
13214 in between them. Determine the range of such qualified
13215 DIEs now (first being the base type, last being corresponding
13216 last qualified DIE for it). */
13217 unsigned int count = 0;
13218 first = qualified_die_p (mod_type_die, &first_quals,
13219 dwarf_qual_info_size);
13220 if (first == NULL)
13221 first = mod_type_die;
13222 gcc_assert ((first_quals & ~sub_quals) == 0);
13223 for (count = 0, last = first;
13224 count < (1U << dwarf_qual_info_size);
13225 count++, last = last->die_sib)
13227 int quals = 0;
13228 if (last == mod_scope->die_child)
13229 break;
13230 if (qualified_die_p (last->die_sib, &quals, dwarf_qual_info_size)
13231 != first)
13232 break;
13236 for (i = 0; i < dwarf_qual_info_size; i++)
13237 if (dwarf_qual_info[i].q & cv_quals & ~sub_quals)
13239 dw_die_ref d;
13240 if (first && first != last)
13242 for (d = first->die_sib; ; d = d->die_sib)
13244 int quals = 0;
13245 qualified_die_p (d, &quals, dwarf_qual_info_size);
13246 if (quals == (first_quals | dwarf_qual_info[i].q))
13247 break;
13248 if (d == last)
13250 d = NULL;
13251 break;
13254 if (d)
13256 mod_type_die = d;
13257 continue;
13260 if (first)
13262 d = new_die_raw (dwarf_qual_info[i].t);
13263 add_child_die_after (mod_scope, d, last);
13264 last = d;
13266 else
13267 d = new_die (dwarf_qual_info[i].t, mod_scope, type);
13268 if (mod_type_die)
13269 add_AT_die_ref (d, DW_AT_type, mod_type_die);
13270 mod_type_die = d;
13271 first_quals |= dwarf_qual_info[i].q;
13274 else if (code == POINTER_TYPE || code == REFERENCE_TYPE)
13276 dwarf_tag tag = DW_TAG_pointer_type;
13277 if (code == REFERENCE_TYPE)
13279 if (TYPE_REF_IS_RVALUE (type) && dwarf_version >= 4)
13280 tag = DW_TAG_rvalue_reference_type;
13281 else
13282 tag = DW_TAG_reference_type;
13284 mod_type_die = new_die (tag, mod_scope, type);
13286 add_AT_unsigned (mod_type_die, DW_AT_byte_size,
13287 simple_type_size_in_bits (type) / BITS_PER_UNIT);
13288 add_alignment_attribute (mod_type_die, type);
13289 item_type = TREE_TYPE (type);
13291 addr_space_t as = TYPE_ADDR_SPACE (item_type);
13292 if (!ADDR_SPACE_GENERIC_P (as))
13294 int action = targetm.addr_space.debug (as);
13295 if (action >= 0)
13297 /* Positive values indicate an address_class. */
13298 add_AT_unsigned (mod_type_die, DW_AT_address_class, action);
13300 else
13302 /* Negative values indicate an (inverted) segment base reg. */
13303 dw_loc_descr_ref d
13304 = one_reg_loc_descriptor (~action, VAR_INIT_STATUS_INITIALIZED);
13305 add_AT_loc (mod_type_die, DW_AT_segment, d);
13309 else if (code == INTEGER_TYPE
13310 && TREE_TYPE (type) != NULL_TREE
13311 && subrange_type_for_debug_p (type, &low, &high))
13313 tree bias = NULL_TREE;
13314 if (lang_hooks.types.get_type_bias)
13315 bias = lang_hooks.types.get_type_bias (type);
13316 mod_type_die = subrange_type_die (type, low, high, bias, context_die);
13317 item_type = TREE_TYPE (type);
13319 else if (is_base_type (type))
13321 mod_type_die = base_type_die (type, reverse);
13323 /* The DIE with DW_AT_endianity is placed right after the naked DIE. */
13324 if (reverse_base_type)
13326 dw_die_ref after_die
13327 = modified_type_die (type, cv_quals, false, context_die);
13328 add_child_die_after (comp_unit_die (), mod_type_die, after_die);
13330 else
13331 add_child_die (comp_unit_die (), mod_type_die);
13333 add_pubtype (type, mod_type_die);
13335 else
13337 gen_type_die (type, context_die);
13339 /* We have to get the type_main_variant here (and pass that to the
13340 `lookup_type_die' routine) because the ..._TYPE node we have
13341 might simply be a *copy* of some original type node (where the
13342 copy was created to help us keep track of typedef names) and
13343 that copy might have a different TYPE_UID from the original
13344 ..._TYPE node. */
13345 if (TREE_CODE (type) == FUNCTION_TYPE
13346 || TREE_CODE (type) == METHOD_TYPE)
13348 /* For function/method types, can't just use type_main_variant here,
13349 because that can have different ref-qualifiers for C++,
13350 but try to canonicalize. */
13351 tree main = TYPE_MAIN_VARIANT (type);
13352 for (tree t = main; t; t = TYPE_NEXT_VARIANT (t))
13353 if (TYPE_QUALS_NO_ADDR_SPACE (t) == 0
13354 && check_base_type (t, main)
13355 && check_lang_type (t, type))
13356 return lookup_type_die (t);
13357 return lookup_type_die (type);
13359 else if (TREE_CODE (type) != VECTOR_TYPE
13360 && TREE_CODE (type) != ARRAY_TYPE)
13361 return lookup_type_die (type_main_variant (type));
13362 else
13363 /* Vectors have the debugging information in the type,
13364 not the main variant. */
13365 return lookup_type_die (type);
13368 /* Builtin types don't have a DECL_ORIGINAL_TYPE. For those,
13369 don't output a DW_TAG_typedef, since there isn't one in the
13370 user's program; just attach a DW_AT_name to the type.
13371 Don't attach a DW_AT_name to DW_TAG_const_type or DW_TAG_volatile_type
13372 if the base type already has the same name. */
13373 if (name
13374 && ((TREE_CODE (name) != TYPE_DECL
13375 && (qualified_type == TYPE_MAIN_VARIANT (type)
13376 || (cv_quals == TYPE_UNQUALIFIED)))
13377 || (TREE_CODE (name) == TYPE_DECL
13378 && TREE_TYPE (name) == qualified_type
13379 && DECL_NAME (name))))
13381 if (TREE_CODE (name) == TYPE_DECL)
13382 /* Could just call add_name_and_src_coords_attributes here,
13383 but since this is a builtin type it doesn't have any
13384 useful source coordinates anyway. */
13385 name = DECL_NAME (name);
13386 add_name_attribute (mod_type_die, IDENTIFIER_POINTER (name));
13388 /* This probably indicates a bug. */
13389 else if (mod_type_die && mod_type_die->die_tag == DW_TAG_base_type)
13391 name = TYPE_IDENTIFIER (type);
13392 add_name_attribute (mod_type_die,
13393 name ? IDENTIFIER_POINTER (name) : "__unknown__");
13396 if (qualified_type && !reverse_base_type)
13397 equate_type_number_to_die (qualified_type, mod_type_die);
13399 if (item_type)
13400 /* We must do this after the equate_type_number_to_die call, in case
13401 this is a recursive type. This ensures that the modified_type_die
13402 recursion will terminate even if the type is recursive. Recursive
13403 types are possible in Ada. */
13404 sub_die = modified_type_die (item_type,
13405 TYPE_QUALS_NO_ADDR_SPACE (item_type),
13406 reverse,
13407 context_die);
13409 if (sub_die != NULL)
13410 add_AT_die_ref (mod_type_die, DW_AT_type, sub_die);
13412 add_gnat_descriptive_type_attribute (mod_type_die, type, context_die);
13413 if (TYPE_ARTIFICIAL (type))
13414 add_AT_flag (mod_type_die, DW_AT_artificial, 1);
13416 return mod_type_die;
13419 /* Generate DIEs for the generic parameters of T.
13420 T must be either a generic type or a generic function.
13421 See http://gcc.gnu.org/wiki/TemplateParmsDwarf for more. */
13423 static void
13424 gen_generic_params_dies (tree t)
13426 tree parms, args;
13427 int parms_num, i;
13428 dw_die_ref die = NULL;
13429 int non_default;
13431 if (!t || (TYPE_P (t) && !COMPLETE_TYPE_P (t)))
13432 return;
13434 if (TYPE_P (t))
13435 die = lookup_type_die (t);
13436 else if (DECL_P (t))
13437 die = lookup_decl_die (t);
13439 gcc_assert (die);
13441 parms = lang_hooks.get_innermost_generic_parms (t);
13442 if (!parms)
13443 /* T has no generic parameter. It means T is neither a generic type
13444 or function. End of story. */
13445 return;
13447 parms_num = TREE_VEC_LENGTH (parms);
13448 args = lang_hooks.get_innermost_generic_args (t);
13449 if (TREE_CHAIN (args) && TREE_CODE (TREE_CHAIN (args)) == INTEGER_CST)
13450 non_default = int_cst_value (TREE_CHAIN (args));
13451 else
13452 non_default = TREE_VEC_LENGTH (args);
13453 for (i = 0; i < parms_num; i++)
13455 tree parm, arg, arg_pack_elems;
13456 dw_die_ref parm_die;
13458 parm = TREE_VEC_ELT (parms, i);
13459 arg = TREE_VEC_ELT (args, i);
13460 arg_pack_elems = lang_hooks.types.get_argument_pack_elems (arg);
13461 gcc_assert (parm && TREE_VALUE (parm) && arg);
13463 if (parm && TREE_VALUE (parm) && arg)
13465 /* If PARM represents a template parameter pack,
13466 emit a DW_TAG_GNU_template_parameter_pack DIE, followed
13467 by DW_TAG_template_*_parameter DIEs for the argument
13468 pack elements of ARG. Note that ARG would then be
13469 an argument pack. */
13470 if (arg_pack_elems)
13471 parm_die = template_parameter_pack_die (TREE_VALUE (parm),
13472 arg_pack_elems,
13473 die);
13474 else
13475 parm_die = generic_parameter_die (TREE_VALUE (parm), arg,
13476 true /* emit name */, die);
13477 if (i >= non_default)
13478 add_AT_flag (parm_die, DW_AT_default_value, 1);
13483 /* Create and return a DIE for PARM which should be
13484 the representation of a generic type parameter.
13485 For instance, in the C++ front end, PARM would be a template parameter.
13486 ARG is the argument to PARM.
13487 EMIT_NAME_P if tree, the DIE will have DW_AT_name attribute set to the
13488 name of the PARM.
13489 PARENT_DIE is the parent DIE which the new created DIE should be added to,
13490 as a child node. */
13492 static dw_die_ref
13493 generic_parameter_die (tree parm, tree arg,
13494 bool emit_name_p,
13495 dw_die_ref parent_die)
13497 dw_die_ref tmpl_die = NULL;
13498 const char *name = NULL;
13500 if (!parm || !DECL_NAME (parm) || !arg)
13501 return NULL;
13503 /* We support non-type generic parameters and arguments,
13504 type generic parameters and arguments, as well as
13505 generic generic parameters (a.k.a. template template parameters in C++)
13506 and arguments. */
13507 if (TREE_CODE (parm) == PARM_DECL)
13508 /* PARM is a nontype generic parameter */
13509 tmpl_die = new_die (DW_TAG_template_value_param, parent_die, parm);
13510 else if (TREE_CODE (parm) == TYPE_DECL)
13511 /* PARM is a type generic parameter. */
13512 tmpl_die = new_die (DW_TAG_template_type_param, parent_die, parm);
13513 else if (lang_hooks.decls.generic_generic_parameter_decl_p (parm))
13514 /* PARM is a generic generic parameter.
13515 Its DIE is a GNU extension. It shall have a
13516 DW_AT_name attribute to represent the name of the template template
13517 parameter, and a DW_AT_GNU_template_name attribute to represent the
13518 name of the template template argument. */
13519 tmpl_die = new_die (DW_TAG_GNU_template_template_param,
13520 parent_die, parm);
13521 else
13522 gcc_unreachable ();
13524 if (tmpl_die)
13526 tree tmpl_type;
13528 /* If PARM is a generic parameter pack, it means we are
13529 emitting debug info for a template argument pack element.
13530 In other terms, ARG is a template argument pack element.
13531 In that case, we don't emit any DW_AT_name attribute for
13532 the die. */
13533 if (emit_name_p)
13535 name = IDENTIFIER_POINTER (DECL_NAME (parm));
13536 gcc_assert (name);
13537 add_AT_string (tmpl_die, DW_AT_name, name);
13540 if (!lang_hooks.decls.generic_generic_parameter_decl_p (parm))
13542 /* DWARF3, 5.6.8 says if PARM is a non-type generic parameter
13543 TMPL_DIE should have a child DW_AT_type attribute that is set
13544 to the type of the argument to PARM, which is ARG.
13545 If PARM is a type generic parameter, TMPL_DIE should have a
13546 child DW_AT_type that is set to ARG. */
13547 tmpl_type = TYPE_P (arg) ? arg : TREE_TYPE (arg);
13548 add_type_attribute (tmpl_die, tmpl_type,
13549 (TREE_THIS_VOLATILE (tmpl_type)
13550 ? TYPE_QUAL_VOLATILE : TYPE_UNQUALIFIED),
13551 false, parent_die);
13553 else
13555 /* So TMPL_DIE is a DIE representing a
13556 a generic generic template parameter, a.k.a template template
13557 parameter in C++ and arg is a template. */
13559 /* The DW_AT_GNU_template_name attribute of the DIE must be set
13560 to the name of the argument. */
13561 name = dwarf2_name (TYPE_P (arg) ? TYPE_NAME (arg) : arg, 1);
13562 if (name)
13563 add_AT_string (tmpl_die, DW_AT_GNU_template_name, name);
13566 if (TREE_CODE (parm) == PARM_DECL)
13567 /* So PARM is a non-type generic parameter.
13568 DWARF3 5.6.8 says we must set a DW_AT_const_value child
13569 attribute of TMPL_DIE which value represents the value
13570 of ARG.
13571 We must be careful here:
13572 The value of ARG might reference some function decls.
13573 We might currently be emitting debug info for a generic
13574 type and types are emitted before function decls, we don't
13575 know if the function decls referenced by ARG will actually be
13576 emitted after cgraph computations.
13577 So must defer the generation of the DW_AT_const_value to
13578 after cgraph is ready. */
13579 append_entry_to_tmpl_value_parm_die_table (tmpl_die, arg);
13582 return tmpl_die;
13585 /* Generate and return a DW_TAG_GNU_template_parameter_pack DIE representing.
13586 PARM_PACK must be a template parameter pack. The returned DIE
13587 will be child DIE of PARENT_DIE. */
13589 static dw_die_ref
13590 template_parameter_pack_die (tree parm_pack,
13591 tree parm_pack_args,
13592 dw_die_ref parent_die)
13594 dw_die_ref die;
13595 int j;
13597 gcc_assert (parent_die && parm_pack);
13599 die = new_die (DW_TAG_GNU_template_parameter_pack, parent_die, parm_pack);
13600 add_name_and_src_coords_attributes (die, parm_pack);
13601 for (j = 0; j < TREE_VEC_LENGTH (parm_pack_args); j++)
13602 generic_parameter_die (parm_pack,
13603 TREE_VEC_ELT (parm_pack_args, j),
13604 false /* Don't emit DW_AT_name */,
13605 die);
13606 return die;
13609 /* Given a pointer to an arbitrary ..._TYPE tree node, return true if it is
13610 an enumerated type. */
13612 static inline int
13613 type_is_enum (const_tree type)
13615 return TREE_CODE (type) == ENUMERAL_TYPE;
13618 /* Return the DBX register number described by a given RTL node. */
13620 static unsigned int
13621 dbx_reg_number (const_rtx rtl)
13623 unsigned regno = REGNO (rtl);
13625 gcc_assert (regno < FIRST_PSEUDO_REGISTER);
13627 #ifdef LEAF_REG_REMAP
13628 if (crtl->uses_only_leaf_regs)
13630 int leaf_reg = LEAF_REG_REMAP (regno);
13631 if (leaf_reg != -1)
13632 regno = (unsigned) leaf_reg;
13634 #endif
13636 regno = DBX_REGISTER_NUMBER (regno);
13637 gcc_assert (regno != INVALID_REGNUM);
13638 return regno;
13641 /* Optionally add a DW_OP_piece term to a location description expression.
13642 DW_OP_piece is only added if the location description expression already
13643 doesn't end with DW_OP_piece. */
13645 static void
13646 add_loc_descr_op_piece (dw_loc_descr_ref *list_head, int size)
13648 dw_loc_descr_ref loc;
13650 if (*list_head != NULL)
13652 /* Find the end of the chain. */
13653 for (loc = *list_head; loc->dw_loc_next != NULL; loc = loc->dw_loc_next)
13656 if (loc->dw_loc_opc != DW_OP_piece)
13657 loc->dw_loc_next = new_loc_descr (DW_OP_piece, size, 0);
13661 /* Return a location descriptor that designates a machine register or
13662 zero if there is none. */
13664 static dw_loc_descr_ref
13665 reg_loc_descriptor (rtx rtl, enum var_init_status initialized)
13667 rtx regs;
13669 if (REGNO (rtl) >= FIRST_PSEUDO_REGISTER)
13670 return 0;
13672 /* We only use "frame base" when we're sure we're talking about the
13673 post-prologue local stack frame. We do this by *not* running
13674 register elimination until this point, and recognizing the special
13675 argument pointer and soft frame pointer rtx's.
13676 Use DW_OP_fbreg offset DW_OP_stack_value in this case. */
13677 if ((rtl == arg_pointer_rtx || rtl == frame_pointer_rtx)
13678 && eliminate_regs (rtl, VOIDmode, NULL_RTX) != rtl)
13680 dw_loc_descr_ref result = NULL;
13682 if (dwarf_version >= 4 || !dwarf_strict)
13684 result = mem_loc_descriptor (rtl, GET_MODE (rtl), VOIDmode,
13685 initialized);
13686 if (result)
13687 add_loc_descr (&result,
13688 new_loc_descr (DW_OP_stack_value, 0, 0));
13690 return result;
13693 regs = targetm.dwarf_register_span (rtl);
13695 if (REG_NREGS (rtl) > 1 || regs)
13696 return multiple_reg_loc_descriptor (rtl, regs, initialized);
13697 else
13699 unsigned int dbx_regnum = dbx_reg_number (rtl);
13700 if (dbx_regnum == IGNORED_DWARF_REGNUM)
13701 return 0;
13702 return one_reg_loc_descriptor (dbx_regnum, initialized);
13706 /* Return a location descriptor that designates a machine register for
13707 a given hard register number. */
13709 static dw_loc_descr_ref
13710 one_reg_loc_descriptor (unsigned int regno, enum var_init_status initialized)
13712 dw_loc_descr_ref reg_loc_descr;
13714 if (regno <= 31)
13715 reg_loc_descr
13716 = new_loc_descr ((enum dwarf_location_atom) (DW_OP_reg0 + regno), 0, 0);
13717 else
13718 reg_loc_descr = new_loc_descr (DW_OP_regx, regno, 0);
13720 if (initialized == VAR_INIT_STATUS_UNINITIALIZED)
13721 add_loc_descr (&reg_loc_descr, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
13723 return reg_loc_descr;
13726 /* Given an RTL of a register, return a location descriptor that
13727 designates a value that spans more than one register. */
13729 static dw_loc_descr_ref
13730 multiple_reg_loc_descriptor (rtx rtl, rtx regs,
13731 enum var_init_status initialized)
13733 int size, i;
13734 dw_loc_descr_ref loc_result = NULL;
13736 /* Simple, contiguous registers. */
13737 if (regs == NULL_RTX)
13739 unsigned reg = REGNO (rtl);
13740 int nregs;
13742 #ifdef LEAF_REG_REMAP
13743 if (crtl->uses_only_leaf_regs)
13745 int leaf_reg = LEAF_REG_REMAP (reg);
13746 if (leaf_reg != -1)
13747 reg = (unsigned) leaf_reg;
13749 #endif
13751 gcc_assert ((unsigned) DBX_REGISTER_NUMBER (reg) == dbx_reg_number (rtl));
13752 nregs = REG_NREGS (rtl);
13754 /* At present we only track constant-sized pieces. */
13755 if (!GET_MODE_SIZE (GET_MODE (rtl)).is_constant (&size))
13756 return NULL;
13757 size /= nregs;
13759 loc_result = NULL;
13760 while (nregs--)
13762 dw_loc_descr_ref t;
13764 t = one_reg_loc_descriptor (DBX_REGISTER_NUMBER (reg),
13765 VAR_INIT_STATUS_INITIALIZED);
13766 add_loc_descr (&loc_result, t);
13767 add_loc_descr_op_piece (&loc_result, size);
13768 ++reg;
13770 return loc_result;
13773 /* Now onto stupid register sets in non contiguous locations. */
13775 gcc_assert (GET_CODE (regs) == PARALLEL);
13777 /* At present we only track constant-sized pieces. */
13778 if (!GET_MODE_SIZE (GET_MODE (XVECEXP (regs, 0, 0))).is_constant (&size))
13779 return NULL;
13780 loc_result = NULL;
13782 for (i = 0; i < XVECLEN (regs, 0); ++i)
13784 dw_loc_descr_ref t;
13786 t = one_reg_loc_descriptor (dbx_reg_number (XVECEXP (regs, 0, i)),
13787 VAR_INIT_STATUS_INITIALIZED);
13788 add_loc_descr (&loc_result, t);
13789 add_loc_descr_op_piece (&loc_result, size);
13792 if (loc_result && initialized == VAR_INIT_STATUS_UNINITIALIZED)
13793 add_loc_descr (&loc_result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
13794 return loc_result;
13797 static unsigned long size_of_int_loc_descriptor (HOST_WIDE_INT);
13799 /* Return a location descriptor that designates a constant i,
13800 as a compound operation from constant (i >> shift), constant shift
13801 and DW_OP_shl. */
13803 static dw_loc_descr_ref
13804 int_shift_loc_descriptor (HOST_WIDE_INT i, int shift)
13806 dw_loc_descr_ref ret = int_loc_descriptor (i >> shift);
13807 add_loc_descr (&ret, int_loc_descriptor (shift));
13808 add_loc_descr (&ret, new_loc_descr (DW_OP_shl, 0, 0));
13809 return ret;
13812 /* Return a location descriptor that designates constant POLY_I. */
13814 static dw_loc_descr_ref
13815 int_loc_descriptor (poly_int64 poly_i)
13817 enum dwarf_location_atom op;
13819 HOST_WIDE_INT i;
13820 if (!poly_i.is_constant (&i))
13822 /* Create location descriptions for the non-constant part and
13823 add any constant offset at the end. */
13824 dw_loc_descr_ref ret = NULL;
13825 HOST_WIDE_INT constant = poly_i.coeffs[0];
13826 for (unsigned int j = 1; j < NUM_POLY_INT_COEFFS; ++j)
13828 HOST_WIDE_INT coeff = poly_i.coeffs[j];
13829 if (coeff != 0)
13831 dw_loc_descr_ref start = ret;
13832 unsigned int factor;
13833 int bias;
13834 unsigned int regno = targetm.dwarf_poly_indeterminate_value
13835 (j, &factor, &bias);
13837 /* Add COEFF * ((REGNO / FACTOR) - BIAS) to the value:
13838 add COEFF * (REGNO / FACTOR) now and subtract
13839 COEFF * BIAS from the final constant part. */
13840 constant -= coeff * bias;
13841 add_loc_descr (&ret, new_reg_loc_descr (regno, 0));
13842 if (coeff % factor == 0)
13843 coeff /= factor;
13844 else
13846 int amount = exact_log2 (factor);
13847 gcc_assert (amount >= 0);
13848 add_loc_descr (&ret, int_loc_descriptor (amount));
13849 add_loc_descr (&ret, new_loc_descr (DW_OP_shr, 0, 0));
13851 if (coeff != 1)
13853 add_loc_descr (&ret, int_loc_descriptor (coeff));
13854 add_loc_descr (&ret, new_loc_descr (DW_OP_mul, 0, 0));
13856 if (start)
13857 add_loc_descr (&ret, new_loc_descr (DW_OP_plus, 0, 0));
13860 loc_descr_plus_const (&ret, constant);
13861 return ret;
13864 /* Pick the smallest representation of a constant, rather than just
13865 defaulting to the LEB encoding. */
13866 if (i >= 0)
13868 int clz = clz_hwi (i);
13869 int ctz = ctz_hwi (i);
13870 if (i <= 31)
13871 op = (enum dwarf_location_atom) (DW_OP_lit0 + i);
13872 else if (i <= 0xff)
13873 op = DW_OP_const1u;
13874 else if (i <= 0xffff)
13875 op = DW_OP_const2u;
13876 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 5
13877 && clz + 5 + 255 >= HOST_BITS_PER_WIDE_INT)
13878 /* DW_OP_litX DW_OP_litY DW_OP_shl takes just 3 bytes and
13879 DW_OP_litX DW_OP_const1u Y DW_OP_shl takes just 4 bytes,
13880 while DW_OP_const4u is 5 bytes. */
13881 return int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT - clz - 5);
13882 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 8
13883 && clz + 8 + 31 >= HOST_BITS_PER_WIDE_INT)
13884 /* DW_OP_const1u X DW_OP_litY DW_OP_shl takes just 4 bytes,
13885 while DW_OP_const4u is 5 bytes. */
13886 return int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT - clz - 8);
13888 else if (DWARF2_ADDR_SIZE == 4 && i > 0x7fffffff
13889 && size_of_int_loc_descriptor ((HOST_WIDE_INT) (int32_t) i)
13890 <= 4)
13892 /* As i >= 2**31, the double cast above will yield a negative number.
13893 Since wrapping is defined in DWARF expressions we can output big
13894 positive integers as small negative ones, regardless of the size
13895 of host wide ints.
13897 Here, since the evaluator will handle 32-bit values and since i >=
13898 2**31, we know it's going to be interpreted as a negative literal:
13899 store it this way if we can do better than 5 bytes this way. */
13900 return int_loc_descriptor ((HOST_WIDE_INT) (int32_t) i);
13902 else if (HOST_BITS_PER_WIDE_INT == 32 || i <= 0xffffffff)
13903 op = DW_OP_const4u;
13905 /* Past this point, i >= 0x100000000 and thus DW_OP_constu will take at
13906 least 6 bytes: see if we can do better before falling back to it. */
13907 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 8
13908 && clz + 8 + 255 >= HOST_BITS_PER_WIDE_INT)
13909 /* DW_OP_const1u X DW_OP_const1u Y DW_OP_shl takes just 5 bytes. */
13910 return int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT - clz - 8);
13911 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 16
13912 && clz + 16 + (size_of_uleb128 (i) > 5 ? 255 : 31)
13913 >= HOST_BITS_PER_WIDE_INT)
13914 /* DW_OP_const2u X DW_OP_litY DW_OP_shl takes just 5 bytes,
13915 DW_OP_const2u X DW_OP_const1u Y DW_OP_shl takes 6 bytes. */
13916 return int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT - clz - 16);
13917 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 32
13918 && clz + 32 + 31 >= HOST_BITS_PER_WIDE_INT
13919 && size_of_uleb128 (i) > 6)
13920 /* DW_OP_const4u X DW_OP_litY DW_OP_shl takes just 7 bytes. */
13921 return int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT - clz - 32);
13922 else
13923 op = DW_OP_constu;
13925 else
13927 if (i >= -0x80)
13928 op = DW_OP_const1s;
13929 else if (i >= -0x8000)
13930 op = DW_OP_const2s;
13931 else if (HOST_BITS_PER_WIDE_INT == 32 || i >= -0x80000000)
13933 if (size_of_int_loc_descriptor (i) < 5)
13935 dw_loc_descr_ref ret = int_loc_descriptor (-i);
13936 add_loc_descr (&ret, new_loc_descr (DW_OP_neg, 0, 0));
13937 return ret;
13939 op = DW_OP_const4s;
13941 else
13943 if (size_of_int_loc_descriptor (i)
13944 < (unsigned long) 1 + size_of_sleb128 (i))
13946 dw_loc_descr_ref ret = int_loc_descriptor (-i);
13947 add_loc_descr (&ret, new_loc_descr (DW_OP_neg, 0, 0));
13948 return ret;
13950 op = DW_OP_consts;
13954 return new_loc_descr (op, i, 0);
13957 /* Likewise, for unsigned constants. */
13959 static dw_loc_descr_ref
13960 uint_loc_descriptor (unsigned HOST_WIDE_INT i)
13962 const unsigned HOST_WIDE_INT max_int = INTTYPE_MAXIMUM (HOST_WIDE_INT);
13963 const unsigned HOST_WIDE_INT max_uint
13964 = INTTYPE_MAXIMUM (unsigned HOST_WIDE_INT);
13966 /* If possible, use the clever signed constants handling. */
13967 if (i <= max_int)
13968 return int_loc_descriptor ((HOST_WIDE_INT) i);
13970 /* Here, we are left with positive numbers that cannot be represented as
13971 HOST_WIDE_INT, i.e.:
13972 max (HOST_WIDE_INT) < i <= max (unsigned HOST_WIDE_INT)
13974 Using DW_OP_const4/8/./u operation to encode them consumes a lot of bytes
13975 whereas may be better to output a negative integer: thanks to integer
13976 wrapping, we know that:
13977 x = x - 2 ** DWARF2_ADDR_SIZE
13978 = x - 2 * (max (HOST_WIDE_INT) + 1)
13979 So numbers close to max (unsigned HOST_WIDE_INT) could be represented as
13980 small negative integers. Let's try that in cases it will clearly improve
13981 the encoding: there is no gain turning DW_OP_const4u into
13982 DW_OP_const4s. */
13983 if (DWARF2_ADDR_SIZE * 8 == HOST_BITS_PER_WIDE_INT
13984 && ((DWARF2_ADDR_SIZE == 4 && i > max_uint - 0x8000)
13985 || (DWARF2_ADDR_SIZE == 8 && i > max_uint - 0x80000000)))
13987 const unsigned HOST_WIDE_INT first_shift = i - max_int - 1;
13989 /* Now, -1 < first_shift <= max (HOST_WIDE_INT)
13990 i.e. 0 <= first_shift <= max (HOST_WIDE_INT). */
13991 const HOST_WIDE_INT second_shift
13992 = (HOST_WIDE_INT) first_shift - (HOST_WIDE_INT) max_int - 1;
13994 /* So we finally have:
13995 -max (HOST_WIDE_INT) - 1 <= second_shift <= -1.
13996 i.e. min (HOST_WIDE_INT) <= second_shift < 0. */
13997 return int_loc_descriptor (second_shift);
14000 /* Last chance: fallback to a simple constant operation. */
14001 return new_loc_descr
14002 ((HOST_BITS_PER_WIDE_INT == 32 || i <= 0xffffffff)
14003 ? DW_OP_const4u
14004 : DW_OP_const8u,
14005 i, 0);
14008 /* Generate and return a location description that computes the unsigned
14009 comparison of the two stack top entries (a OP b where b is the top-most
14010 entry and a is the second one). The KIND of comparison can be LT_EXPR,
14011 LE_EXPR, GT_EXPR or GE_EXPR. */
14013 static dw_loc_descr_ref
14014 uint_comparison_loc_list (enum tree_code kind)
14016 enum dwarf_location_atom op, flip_op;
14017 dw_loc_descr_ref ret, bra_node, jmp_node, tmp;
14019 switch (kind)
14021 case LT_EXPR:
14022 op = DW_OP_lt;
14023 break;
14024 case LE_EXPR:
14025 op = DW_OP_le;
14026 break;
14027 case GT_EXPR:
14028 op = DW_OP_gt;
14029 break;
14030 case GE_EXPR:
14031 op = DW_OP_ge;
14032 break;
14033 default:
14034 gcc_unreachable ();
14037 bra_node = new_loc_descr (DW_OP_bra, 0, 0);
14038 jmp_node = new_loc_descr (DW_OP_skip, 0, 0);
14040 /* Until DWARFv4, operations all work on signed integers. It is nevertheless
14041 possible to perform unsigned comparisons: we just have to distinguish
14042 three cases:
14044 1. when a and b have the same sign (as signed integers); then we should
14045 return: a OP(signed) b;
14047 2. when a is a negative signed integer while b is a positive one, then a
14048 is a greater unsigned integer than b; likewise when a and b's roles
14049 are flipped.
14051 So first, compare the sign of the two operands. */
14052 ret = new_loc_descr (DW_OP_over, 0, 0);
14053 add_loc_descr (&ret, new_loc_descr (DW_OP_over, 0, 0));
14054 add_loc_descr (&ret, new_loc_descr (DW_OP_xor, 0, 0));
14055 /* If they have different signs (i.e. they have different sign bits), then
14056 the stack top value has now the sign bit set and thus it's smaller than
14057 zero. */
14058 add_loc_descr (&ret, new_loc_descr (DW_OP_lit0, 0, 0));
14059 add_loc_descr (&ret, new_loc_descr (DW_OP_lt, 0, 0));
14060 add_loc_descr (&ret, bra_node);
14062 /* We are in case 1. At this point, we know both operands have the same
14063 sign, to it's safe to use the built-in signed comparison. */
14064 add_loc_descr (&ret, new_loc_descr (op, 0, 0));
14065 add_loc_descr (&ret, jmp_node);
14067 /* We are in case 2. Here, we know both operands do not have the same sign,
14068 so we have to flip the signed comparison. */
14069 flip_op = (kind == LT_EXPR || kind == LE_EXPR) ? DW_OP_gt : DW_OP_lt;
14070 tmp = new_loc_descr (flip_op, 0, 0);
14071 bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
14072 bra_node->dw_loc_oprnd1.v.val_loc = tmp;
14073 add_loc_descr (&ret, tmp);
14075 /* This dummy operation is necessary to make the two branches join. */
14076 tmp = new_loc_descr (DW_OP_nop, 0, 0);
14077 jmp_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
14078 jmp_node->dw_loc_oprnd1.v.val_loc = tmp;
14079 add_loc_descr (&ret, tmp);
14081 return ret;
14084 /* Likewise, but takes the location description lists (might be destructive on
14085 them). Return NULL if either is NULL or if concatenation fails. */
14087 static dw_loc_list_ref
14088 loc_list_from_uint_comparison (dw_loc_list_ref left, dw_loc_list_ref right,
14089 enum tree_code kind)
14091 if (left == NULL || right == NULL)
14092 return NULL;
14094 add_loc_list (&left, right);
14095 if (left == NULL)
14096 return NULL;
14098 add_loc_descr_to_each (left, uint_comparison_loc_list (kind));
14099 return left;
14102 /* Return size_of_locs (int_shift_loc_descriptor (i, shift))
14103 without actually allocating it. */
14105 static unsigned long
14106 size_of_int_shift_loc_descriptor (HOST_WIDE_INT i, int shift)
14108 return size_of_int_loc_descriptor (i >> shift)
14109 + size_of_int_loc_descriptor (shift)
14110 + 1;
14113 /* Return size_of_locs (int_loc_descriptor (i)) without
14114 actually allocating it. */
14116 static unsigned long
14117 size_of_int_loc_descriptor (HOST_WIDE_INT i)
14119 unsigned long s;
14121 if (i >= 0)
14123 int clz, ctz;
14124 if (i <= 31)
14125 return 1;
14126 else if (i <= 0xff)
14127 return 2;
14128 else if (i <= 0xffff)
14129 return 3;
14130 clz = clz_hwi (i);
14131 ctz = ctz_hwi (i);
14132 if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 5
14133 && clz + 5 + 255 >= HOST_BITS_PER_WIDE_INT)
14134 return size_of_int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT
14135 - clz - 5);
14136 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 8
14137 && clz + 8 + 31 >= HOST_BITS_PER_WIDE_INT)
14138 return size_of_int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT
14139 - clz - 8);
14140 else if (DWARF2_ADDR_SIZE == 4 && i > 0x7fffffff
14141 && size_of_int_loc_descriptor ((HOST_WIDE_INT) (int32_t) i)
14142 <= 4)
14143 return size_of_int_loc_descriptor ((HOST_WIDE_INT) (int32_t) i);
14144 else if (HOST_BITS_PER_WIDE_INT == 32 || i <= 0xffffffff)
14145 return 5;
14146 s = size_of_uleb128 ((unsigned HOST_WIDE_INT) i);
14147 if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 8
14148 && clz + 8 + 255 >= HOST_BITS_PER_WIDE_INT)
14149 return size_of_int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT
14150 - clz - 8);
14151 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 16
14152 && clz + 16 + (s > 5 ? 255 : 31) >= HOST_BITS_PER_WIDE_INT)
14153 return size_of_int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT
14154 - clz - 16);
14155 else if (clz + ctz >= HOST_BITS_PER_WIDE_INT - 32
14156 && clz + 32 + 31 >= HOST_BITS_PER_WIDE_INT
14157 && s > 6)
14158 return size_of_int_shift_loc_descriptor (i, HOST_BITS_PER_WIDE_INT
14159 - clz - 32);
14160 else
14161 return 1 + s;
14163 else
14165 if (i >= -0x80)
14166 return 2;
14167 else if (i >= -0x8000)
14168 return 3;
14169 else if (HOST_BITS_PER_WIDE_INT == 32 || i >= -0x80000000)
14171 if (-(unsigned HOST_WIDE_INT) i != (unsigned HOST_WIDE_INT) i)
14173 s = size_of_int_loc_descriptor (-i) + 1;
14174 if (s < 5)
14175 return s;
14177 return 5;
14179 else
14181 unsigned long r = 1 + size_of_sleb128 (i);
14182 if (-(unsigned HOST_WIDE_INT) i != (unsigned HOST_WIDE_INT) i)
14184 s = size_of_int_loc_descriptor (-i) + 1;
14185 if (s < r)
14186 return s;
14188 return r;
14193 /* Return loc description representing "address" of integer value.
14194 This can appear only as toplevel expression. */
14196 static dw_loc_descr_ref
14197 address_of_int_loc_descriptor (int size, HOST_WIDE_INT i)
14199 int litsize;
14200 dw_loc_descr_ref loc_result = NULL;
14202 if (!(dwarf_version >= 4 || !dwarf_strict))
14203 return NULL;
14205 litsize = size_of_int_loc_descriptor (i);
14206 /* Determine if DW_OP_stack_value or DW_OP_implicit_value
14207 is more compact. For DW_OP_stack_value we need:
14208 litsize + 1 (DW_OP_stack_value)
14209 and for DW_OP_implicit_value:
14210 1 (DW_OP_implicit_value) + 1 (length) + size. */
14211 if ((int) DWARF2_ADDR_SIZE >= size && litsize + 1 <= 1 + 1 + size)
14213 loc_result = int_loc_descriptor (i);
14214 add_loc_descr (&loc_result,
14215 new_loc_descr (DW_OP_stack_value, 0, 0));
14216 return loc_result;
14219 loc_result = new_loc_descr (DW_OP_implicit_value,
14220 size, 0);
14221 loc_result->dw_loc_oprnd2.val_class = dw_val_class_const;
14222 loc_result->dw_loc_oprnd2.v.val_int = i;
14223 return loc_result;
14226 /* Return a location descriptor that designates a base+offset location. */
14228 static dw_loc_descr_ref
14229 based_loc_descr (rtx reg, poly_int64 offset,
14230 enum var_init_status initialized)
14232 unsigned int regno;
14233 dw_loc_descr_ref result;
14234 dw_fde_ref fde = cfun->fde;
14236 /* We only use "frame base" when we're sure we're talking about the
14237 post-prologue local stack frame. We do this by *not* running
14238 register elimination until this point, and recognizing the special
14239 argument pointer and soft frame pointer rtx's. */
14240 if (reg == arg_pointer_rtx || reg == frame_pointer_rtx)
14242 rtx elim = (ira_use_lra_p
14243 ? lra_eliminate_regs (reg, VOIDmode, NULL_RTX)
14244 : eliminate_regs (reg, VOIDmode, NULL_RTX));
14246 if (elim != reg)
14248 elim = strip_offset_and_add (elim, &offset);
14249 gcc_assert ((SUPPORTS_STACK_ALIGNMENT
14250 && (elim == hard_frame_pointer_rtx
14251 || elim == stack_pointer_rtx))
14252 || elim == (frame_pointer_needed
14253 ? hard_frame_pointer_rtx
14254 : stack_pointer_rtx));
14256 /* If drap register is used to align stack, use frame
14257 pointer + offset to access stack variables. If stack
14258 is aligned without drap, use stack pointer + offset to
14259 access stack variables. */
14260 if (crtl->stack_realign_tried
14261 && reg == frame_pointer_rtx)
14263 int base_reg
14264 = DWARF_FRAME_REGNUM ((fde && fde->drap_reg != INVALID_REGNUM)
14265 ? HARD_FRAME_POINTER_REGNUM
14266 : REGNO (elim));
14267 return new_reg_loc_descr (base_reg, offset);
14270 gcc_assert (frame_pointer_fb_offset_valid);
14271 offset += frame_pointer_fb_offset;
14272 HOST_WIDE_INT const_offset;
14273 if (offset.is_constant (&const_offset))
14274 return new_loc_descr (DW_OP_fbreg, const_offset, 0);
14275 else
14277 dw_loc_descr_ref ret = new_loc_descr (DW_OP_fbreg, 0, 0);
14278 loc_descr_plus_const (&ret, offset);
14279 return ret;
14284 regno = REGNO (reg);
14285 #ifdef LEAF_REG_REMAP
14286 if (crtl->uses_only_leaf_regs)
14288 int leaf_reg = LEAF_REG_REMAP (regno);
14289 if (leaf_reg != -1)
14290 regno = (unsigned) leaf_reg;
14292 #endif
14293 regno = DWARF_FRAME_REGNUM (regno);
14295 HOST_WIDE_INT const_offset;
14296 if (!optimize && fde
14297 && (fde->drap_reg == regno || fde->vdrap_reg == regno)
14298 && offset.is_constant (&const_offset))
14300 /* Use cfa+offset to represent the location of arguments passed
14301 on the stack when drap is used to align stack.
14302 Only do this when not optimizing, for optimized code var-tracking
14303 is supposed to track where the arguments live and the register
14304 used as vdrap or drap in some spot might be used for something
14305 else in other part of the routine. */
14306 return new_loc_descr (DW_OP_fbreg, const_offset, 0);
14309 result = new_reg_loc_descr (regno, offset);
14311 if (initialized == VAR_INIT_STATUS_UNINITIALIZED)
14312 add_loc_descr (&result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
14314 return result;
14317 /* Return true if this RTL expression describes a base+offset calculation. */
14319 static inline int
14320 is_based_loc (const_rtx rtl)
14322 return (GET_CODE (rtl) == PLUS
14323 && ((REG_P (XEXP (rtl, 0))
14324 && REGNO (XEXP (rtl, 0)) < FIRST_PSEUDO_REGISTER
14325 && CONST_INT_P (XEXP (rtl, 1)))));
14328 /* Try to handle TLS MEMs, for which mem_loc_descriptor on XEXP (mem, 0)
14329 failed. */
14331 static dw_loc_descr_ref
14332 tls_mem_loc_descriptor (rtx mem)
14334 tree base;
14335 dw_loc_descr_ref loc_result;
14337 if (MEM_EXPR (mem) == NULL_TREE || !MEM_OFFSET_KNOWN_P (mem))
14338 return NULL;
14340 base = get_base_address (MEM_EXPR (mem));
14341 if (base == NULL
14342 || !VAR_P (base)
14343 || !DECL_THREAD_LOCAL_P (base))
14344 return NULL;
14346 loc_result = loc_descriptor_from_tree (MEM_EXPR (mem), 1, NULL);
14347 if (loc_result == NULL)
14348 return NULL;
14350 if (maybe_ne (MEM_OFFSET (mem), 0))
14351 loc_descr_plus_const (&loc_result, MEM_OFFSET (mem));
14353 return loc_result;
14356 /* Output debug info about reason why we failed to expand expression as dwarf
14357 expression. */
14359 static void
14360 expansion_failed (tree expr, rtx rtl, char const *reason)
14362 if (dump_file && (dump_flags & TDF_DETAILS))
14364 fprintf (dump_file, "Failed to expand as dwarf: ");
14365 if (expr)
14366 print_generic_expr (dump_file, expr, dump_flags);
14367 if (rtl)
14369 fprintf (dump_file, "\n");
14370 print_rtl (dump_file, rtl);
14372 fprintf (dump_file, "\nReason: %s\n", reason);
14376 /* Helper function for const_ok_for_output. */
14378 static bool
14379 const_ok_for_output_1 (rtx rtl)
14381 if (targetm.const_not_ok_for_debug_p (rtl))
14383 if (GET_CODE (rtl) != UNSPEC)
14385 expansion_failed (NULL_TREE, rtl,
14386 "Expression rejected for debug by the backend.\n");
14387 return false;
14390 /* If delegitimize_address couldn't do anything with the UNSPEC, and
14391 the target hook doesn't explicitly allow it in debug info, assume
14392 we can't express it in the debug info. */
14393 /* Don't complain about TLS UNSPECs, those are just too hard to
14394 delegitimize. Note this could be a non-decl SYMBOL_REF such as
14395 one in a constant pool entry, so testing SYMBOL_REF_TLS_MODEL
14396 rather than DECL_THREAD_LOCAL_P is not just an optimization. */
14397 if (flag_checking
14398 && (XVECLEN (rtl, 0) == 0
14399 || GET_CODE (XVECEXP (rtl, 0, 0)) != SYMBOL_REF
14400 || SYMBOL_REF_TLS_MODEL (XVECEXP (rtl, 0, 0)) == TLS_MODEL_NONE))
14401 inform (current_function_decl
14402 ? DECL_SOURCE_LOCATION (current_function_decl)
14403 : UNKNOWN_LOCATION,
14404 #if NUM_UNSPEC_VALUES > 0
14405 "non-delegitimized UNSPEC %s (%d) found in variable location",
14406 ((XINT (rtl, 1) >= 0 && XINT (rtl, 1) < NUM_UNSPEC_VALUES)
14407 ? unspec_strings[XINT (rtl, 1)] : "unknown"),
14408 XINT (rtl, 1));
14409 #else
14410 "non-delegitimized UNSPEC %d found in variable location",
14411 XINT (rtl, 1));
14412 #endif
14413 expansion_failed (NULL_TREE, rtl,
14414 "UNSPEC hasn't been delegitimized.\n");
14415 return false;
14418 if (CONST_POLY_INT_P (rtl))
14419 return false;
14421 if (targetm.const_not_ok_for_debug_p (rtl))
14423 expansion_failed (NULL_TREE, rtl,
14424 "Expression rejected for debug by the backend.\n");
14425 return false;
14428 /* FIXME: Refer to PR60655. It is possible for simplification
14429 of rtl expressions in var tracking to produce such expressions.
14430 We should really identify / validate expressions
14431 enclosed in CONST that can be handled by assemblers on various
14432 targets and only handle legitimate cases here. */
14433 switch (GET_CODE (rtl))
14435 case SYMBOL_REF:
14436 break;
14437 case NOT:
14438 case NEG:
14439 return false;
14440 default:
14441 return true;
14444 if (CONSTANT_POOL_ADDRESS_P (rtl))
14446 bool marked;
14447 get_pool_constant_mark (rtl, &marked);
14448 /* If all references to this pool constant were optimized away,
14449 it was not output and thus we can't represent it. */
14450 if (!marked)
14452 expansion_failed (NULL_TREE, rtl,
14453 "Constant was removed from constant pool.\n");
14454 return false;
14458 if (SYMBOL_REF_TLS_MODEL (rtl) != TLS_MODEL_NONE)
14459 return false;
14461 /* Avoid references to external symbols in debug info, on several targets
14462 the linker might even refuse to link when linking a shared library,
14463 and in many other cases the relocations for .debug_info/.debug_loc are
14464 dropped, so the address becomes zero anyway. Hidden symbols, guaranteed
14465 to be defined within the same shared library or executable are fine. */
14466 if (SYMBOL_REF_EXTERNAL_P (rtl))
14468 tree decl = SYMBOL_REF_DECL (rtl);
14470 if (decl == NULL || !targetm.binds_local_p (decl))
14472 expansion_failed (NULL_TREE, rtl,
14473 "Symbol not defined in current TU.\n");
14474 return false;
14478 return true;
14481 /* Return true if constant RTL can be emitted in DW_OP_addr or
14482 DW_AT_const_value. TLS SYMBOL_REFs, external SYMBOL_REFs or
14483 non-marked constant pool SYMBOL_REFs can't be referenced in it. */
14485 static bool
14486 const_ok_for_output (rtx rtl)
14488 if (GET_CODE (rtl) == SYMBOL_REF)
14489 return const_ok_for_output_1 (rtl);
14491 if (GET_CODE (rtl) == CONST)
14493 subrtx_var_iterator::array_type array;
14494 FOR_EACH_SUBRTX_VAR (iter, array, XEXP (rtl, 0), ALL)
14495 if (!const_ok_for_output_1 (*iter))
14496 return false;
14497 return true;
14500 return true;
14503 /* Return a reference to DW_TAG_base_type corresponding to MODE and UNSIGNEDP
14504 if possible, NULL otherwise. */
14506 static dw_die_ref
14507 base_type_for_mode (machine_mode mode, bool unsignedp)
14509 dw_die_ref type_die;
14510 tree type = lang_hooks.types.type_for_mode (mode, unsignedp);
14512 if (type == NULL)
14513 return NULL;
14514 switch (TREE_CODE (type))
14516 case INTEGER_TYPE:
14517 case REAL_TYPE:
14518 break;
14519 default:
14520 return NULL;
14522 type_die = lookup_type_die (type);
14523 if (!type_die)
14524 type_die = modified_type_die (type, TYPE_UNQUALIFIED, false,
14525 comp_unit_die ());
14526 if (type_die == NULL || type_die->die_tag != DW_TAG_base_type)
14527 return NULL;
14528 return type_die;
14531 /* For OP descriptor assumed to be in unsigned MODE, convert it to a unsigned
14532 type matching MODE, or, if MODE is narrower than or as wide as
14533 DWARF2_ADDR_SIZE, untyped. Return NULL if the conversion is not
14534 possible. */
14536 static dw_loc_descr_ref
14537 convert_descriptor_to_mode (scalar_int_mode mode, dw_loc_descr_ref op)
14539 machine_mode outer_mode = mode;
14540 dw_die_ref type_die;
14541 dw_loc_descr_ref cvt;
14543 if (GET_MODE_SIZE (mode) <= DWARF2_ADDR_SIZE)
14545 add_loc_descr (&op, new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0));
14546 return op;
14548 type_die = base_type_for_mode (outer_mode, 1);
14549 if (type_die == NULL)
14550 return NULL;
14551 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14552 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14553 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14554 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14555 add_loc_descr (&op, cvt);
14556 return op;
14559 /* Return location descriptor for comparison OP with operands OP0 and OP1. */
14561 static dw_loc_descr_ref
14562 compare_loc_descriptor (enum dwarf_location_atom op, dw_loc_descr_ref op0,
14563 dw_loc_descr_ref op1)
14565 dw_loc_descr_ref ret = op0;
14566 add_loc_descr (&ret, op1);
14567 add_loc_descr (&ret, new_loc_descr (op, 0, 0));
14568 if (STORE_FLAG_VALUE != 1)
14570 add_loc_descr (&ret, int_loc_descriptor (STORE_FLAG_VALUE));
14571 add_loc_descr (&ret, new_loc_descr (DW_OP_mul, 0, 0));
14573 return ret;
14576 /* Subroutine of scompare_loc_descriptor for the case in which we're
14577 comparing two scalar integer operands OP0 and OP1 that have mode OP_MODE,
14578 and in which OP_MODE is bigger than DWARF2_ADDR_SIZE. */
14580 static dw_loc_descr_ref
14581 scompare_loc_descriptor_wide (enum dwarf_location_atom op,
14582 scalar_int_mode op_mode,
14583 dw_loc_descr_ref op0, dw_loc_descr_ref op1)
14585 dw_die_ref type_die = base_type_for_mode (op_mode, 0);
14586 dw_loc_descr_ref cvt;
14588 if (type_die == NULL)
14589 return NULL;
14590 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14591 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14592 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14593 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14594 add_loc_descr (&op0, cvt);
14595 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14596 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14597 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14598 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14599 add_loc_descr (&op1, cvt);
14600 return compare_loc_descriptor (op, op0, op1);
14603 /* Subroutine of scompare_loc_descriptor for the case in which we're
14604 comparing two scalar integer operands OP0 and OP1 that have mode OP_MODE,
14605 and in which OP_MODE is smaller than DWARF2_ADDR_SIZE. */
14607 static dw_loc_descr_ref
14608 scompare_loc_descriptor_narrow (enum dwarf_location_atom op, rtx rtl,
14609 scalar_int_mode op_mode,
14610 dw_loc_descr_ref op0, dw_loc_descr_ref op1)
14612 int shift = (DWARF2_ADDR_SIZE - GET_MODE_SIZE (op_mode)) * BITS_PER_UNIT;
14613 /* For eq/ne, if the operands are known to be zero-extended,
14614 there is no need to do the fancy shifting up. */
14615 if (op == DW_OP_eq || op == DW_OP_ne)
14617 dw_loc_descr_ref last0, last1;
14618 for (last0 = op0; last0->dw_loc_next != NULL; last0 = last0->dw_loc_next)
14620 for (last1 = op1; last1->dw_loc_next != NULL; last1 = last1->dw_loc_next)
14622 /* deref_size zero extends, and for constants we can check
14623 whether they are zero extended or not. */
14624 if (((last0->dw_loc_opc == DW_OP_deref_size
14625 && last0->dw_loc_oprnd1.v.val_int <= GET_MODE_SIZE (op_mode))
14626 || (CONST_INT_P (XEXP (rtl, 0))
14627 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (rtl, 0))
14628 == (INTVAL (XEXP (rtl, 0)) & GET_MODE_MASK (op_mode))))
14629 && ((last1->dw_loc_opc == DW_OP_deref_size
14630 && last1->dw_loc_oprnd1.v.val_int <= GET_MODE_SIZE (op_mode))
14631 || (CONST_INT_P (XEXP (rtl, 1))
14632 && (unsigned HOST_WIDE_INT) INTVAL (XEXP (rtl, 1))
14633 == (INTVAL (XEXP (rtl, 1)) & GET_MODE_MASK (op_mode)))))
14634 return compare_loc_descriptor (op, op0, op1);
14636 /* EQ/NE comparison against constant in narrower type than
14637 DWARF2_ADDR_SIZE can be performed either as
14638 DW_OP_const1u <shift> DW_OP_shl DW_OP_const* <cst << shift>
14639 DW_OP_{eq,ne}
14641 DW_OP_const*u <mode_mask> DW_OP_and DW_OP_const* <cst & mode_mask>
14642 DW_OP_{eq,ne}. Pick whatever is shorter. */
14643 if (CONST_INT_P (XEXP (rtl, 1))
14644 && GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT
14645 && (size_of_int_loc_descriptor (shift) + 1
14646 + size_of_int_loc_descriptor (UINTVAL (XEXP (rtl, 1)) << shift)
14647 >= size_of_int_loc_descriptor (GET_MODE_MASK (op_mode)) + 1
14648 + size_of_int_loc_descriptor (INTVAL (XEXP (rtl, 1))
14649 & GET_MODE_MASK (op_mode))))
14651 add_loc_descr (&op0, int_loc_descriptor (GET_MODE_MASK (op_mode)));
14652 add_loc_descr (&op0, new_loc_descr (DW_OP_and, 0, 0));
14653 op1 = int_loc_descriptor (INTVAL (XEXP (rtl, 1))
14654 & GET_MODE_MASK (op_mode));
14655 return compare_loc_descriptor (op, op0, op1);
14658 add_loc_descr (&op0, int_loc_descriptor (shift));
14659 add_loc_descr (&op0, new_loc_descr (DW_OP_shl, 0, 0));
14660 if (CONST_INT_P (XEXP (rtl, 1)))
14661 op1 = int_loc_descriptor (UINTVAL (XEXP (rtl, 1)) << shift);
14662 else
14664 add_loc_descr (&op1, int_loc_descriptor (shift));
14665 add_loc_descr (&op1, new_loc_descr (DW_OP_shl, 0, 0));
14667 return compare_loc_descriptor (op, op0, op1);
14670 /* Return location descriptor for unsigned comparison OP RTL. */
14672 static dw_loc_descr_ref
14673 scompare_loc_descriptor (enum dwarf_location_atom op, rtx rtl,
14674 machine_mode mem_mode)
14676 machine_mode op_mode = GET_MODE (XEXP (rtl, 0));
14677 dw_loc_descr_ref op0, op1;
14679 if (op_mode == VOIDmode)
14680 op_mode = GET_MODE (XEXP (rtl, 1));
14681 if (op_mode == VOIDmode)
14682 return NULL;
14684 scalar_int_mode int_op_mode;
14685 if (dwarf_strict
14686 && dwarf_version < 5
14687 && (!is_a <scalar_int_mode> (op_mode, &int_op_mode)
14688 || GET_MODE_SIZE (int_op_mode) > DWARF2_ADDR_SIZE))
14689 return NULL;
14691 op0 = mem_loc_descriptor (XEXP (rtl, 0), op_mode, mem_mode,
14692 VAR_INIT_STATUS_INITIALIZED);
14693 op1 = mem_loc_descriptor (XEXP (rtl, 1), op_mode, mem_mode,
14694 VAR_INIT_STATUS_INITIALIZED);
14696 if (op0 == NULL || op1 == NULL)
14697 return NULL;
14699 if (is_a <scalar_int_mode> (op_mode, &int_op_mode))
14701 if (GET_MODE_SIZE (int_op_mode) < DWARF2_ADDR_SIZE)
14702 return scompare_loc_descriptor_narrow (op, rtl, int_op_mode, op0, op1);
14704 if (GET_MODE_SIZE (int_op_mode) > DWARF2_ADDR_SIZE)
14705 return scompare_loc_descriptor_wide (op, int_op_mode, op0, op1);
14707 return compare_loc_descriptor (op, op0, op1);
14710 /* Return location descriptor for unsigned comparison OP RTL. */
14712 static dw_loc_descr_ref
14713 ucompare_loc_descriptor (enum dwarf_location_atom op, rtx rtl,
14714 machine_mode mem_mode)
14716 dw_loc_descr_ref op0, op1;
14718 machine_mode test_op_mode = GET_MODE (XEXP (rtl, 0));
14719 if (test_op_mode == VOIDmode)
14720 test_op_mode = GET_MODE (XEXP (rtl, 1));
14722 scalar_int_mode op_mode;
14723 if (!is_a <scalar_int_mode> (test_op_mode, &op_mode))
14724 return NULL;
14726 if (dwarf_strict
14727 && dwarf_version < 5
14728 && GET_MODE_SIZE (op_mode) > DWARF2_ADDR_SIZE)
14729 return NULL;
14731 op0 = mem_loc_descriptor (XEXP (rtl, 0), op_mode, mem_mode,
14732 VAR_INIT_STATUS_INITIALIZED);
14733 op1 = mem_loc_descriptor (XEXP (rtl, 1), op_mode, mem_mode,
14734 VAR_INIT_STATUS_INITIALIZED);
14736 if (op0 == NULL || op1 == NULL)
14737 return NULL;
14739 if (GET_MODE_SIZE (op_mode) < DWARF2_ADDR_SIZE)
14741 HOST_WIDE_INT mask = GET_MODE_MASK (op_mode);
14742 dw_loc_descr_ref last0, last1;
14743 for (last0 = op0; last0->dw_loc_next != NULL; last0 = last0->dw_loc_next)
14745 for (last1 = op1; last1->dw_loc_next != NULL; last1 = last1->dw_loc_next)
14747 if (CONST_INT_P (XEXP (rtl, 0)))
14748 op0 = int_loc_descriptor (INTVAL (XEXP (rtl, 0)) & mask);
14749 /* deref_size zero extends, so no need to mask it again. */
14750 else if (last0->dw_loc_opc != DW_OP_deref_size
14751 || last0->dw_loc_oprnd1.v.val_int > GET_MODE_SIZE (op_mode))
14753 add_loc_descr (&op0, int_loc_descriptor (mask));
14754 add_loc_descr (&op0, new_loc_descr (DW_OP_and, 0, 0));
14756 if (CONST_INT_P (XEXP (rtl, 1)))
14757 op1 = int_loc_descriptor (INTVAL (XEXP (rtl, 1)) & mask);
14758 /* deref_size zero extends, so no need to mask it again. */
14759 else if (last1->dw_loc_opc != DW_OP_deref_size
14760 || last1->dw_loc_oprnd1.v.val_int > GET_MODE_SIZE (op_mode))
14762 add_loc_descr (&op1, int_loc_descriptor (mask));
14763 add_loc_descr (&op1, new_loc_descr (DW_OP_and, 0, 0));
14766 else if (GET_MODE_SIZE (op_mode) == DWARF2_ADDR_SIZE)
14768 HOST_WIDE_INT bias = 1;
14769 bias <<= (DWARF2_ADDR_SIZE * BITS_PER_UNIT - 1);
14770 add_loc_descr (&op0, new_loc_descr (DW_OP_plus_uconst, bias, 0));
14771 if (CONST_INT_P (XEXP (rtl, 1)))
14772 op1 = int_loc_descriptor ((unsigned HOST_WIDE_INT) bias
14773 + INTVAL (XEXP (rtl, 1)));
14774 else
14775 add_loc_descr (&op1, new_loc_descr (DW_OP_plus_uconst,
14776 bias, 0));
14778 return compare_loc_descriptor (op, op0, op1);
14781 /* Return location descriptor for {U,S}{MIN,MAX}. */
14783 static dw_loc_descr_ref
14784 minmax_loc_descriptor (rtx rtl, machine_mode mode,
14785 machine_mode mem_mode)
14787 enum dwarf_location_atom op;
14788 dw_loc_descr_ref op0, op1, ret;
14789 dw_loc_descr_ref bra_node, drop_node;
14791 scalar_int_mode int_mode;
14792 if (dwarf_strict
14793 && dwarf_version < 5
14794 && (!is_a <scalar_int_mode> (mode, &int_mode)
14795 || GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE))
14796 return NULL;
14798 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
14799 VAR_INIT_STATUS_INITIALIZED);
14800 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
14801 VAR_INIT_STATUS_INITIALIZED);
14803 if (op0 == NULL || op1 == NULL)
14804 return NULL;
14806 add_loc_descr (&op0, new_loc_descr (DW_OP_dup, 0, 0));
14807 add_loc_descr (&op1, new_loc_descr (DW_OP_swap, 0, 0));
14808 add_loc_descr (&op1, new_loc_descr (DW_OP_over, 0, 0));
14809 if (GET_CODE (rtl) == UMIN || GET_CODE (rtl) == UMAX)
14811 /* Checked by the caller. */
14812 int_mode = as_a <scalar_int_mode> (mode);
14813 if (GET_MODE_SIZE (int_mode) < DWARF2_ADDR_SIZE)
14815 HOST_WIDE_INT mask = GET_MODE_MASK (int_mode);
14816 add_loc_descr (&op0, int_loc_descriptor (mask));
14817 add_loc_descr (&op0, new_loc_descr (DW_OP_and, 0, 0));
14818 add_loc_descr (&op1, int_loc_descriptor (mask));
14819 add_loc_descr (&op1, new_loc_descr (DW_OP_and, 0, 0));
14821 else if (GET_MODE_SIZE (int_mode) == DWARF2_ADDR_SIZE)
14823 HOST_WIDE_INT bias = 1;
14824 bias <<= (DWARF2_ADDR_SIZE * BITS_PER_UNIT - 1);
14825 add_loc_descr (&op0, new_loc_descr (DW_OP_plus_uconst, bias, 0));
14826 add_loc_descr (&op1, new_loc_descr (DW_OP_plus_uconst, bias, 0));
14829 else if (is_a <scalar_int_mode> (mode, &int_mode)
14830 && GET_MODE_SIZE (int_mode) < DWARF2_ADDR_SIZE)
14832 int shift = (DWARF2_ADDR_SIZE - GET_MODE_SIZE (int_mode)) * BITS_PER_UNIT;
14833 add_loc_descr (&op0, int_loc_descriptor (shift));
14834 add_loc_descr (&op0, new_loc_descr (DW_OP_shl, 0, 0));
14835 add_loc_descr (&op1, int_loc_descriptor (shift));
14836 add_loc_descr (&op1, new_loc_descr (DW_OP_shl, 0, 0));
14838 else if (is_a <scalar_int_mode> (mode, &int_mode)
14839 && GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
14841 dw_die_ref type_die = base_type_for_mode (int_mode, 0);
14842 dw_loc_descr_ref cvt;
14843 if (type_die == NULL)
14844 return NULL;
14845 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14846 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14847 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14848 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14849 add_loc_descr (&op0, cvt);
14850 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14851 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14852 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14853 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14854 add_loc_descr (&op1, cvt);
14857 if (GET_CODE (rtl) == SMIN || GET_CODE (rtl) == UMIN)
14858 op = DW_OP_lt;
14859 else
14860 op = DW_OP_gt;
14861 ret = op0;
14862 add_loc_descr (&ret, op1);
14863 add_loc_descr (&ret, new_loc_descr (op, 0, 0));
14864 bra_node = new_loc_descr (DW_OP_bra, 0, 0);
14865 add_loc_descr (&ret, bra_node);
14866 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
14867 drop_node = new_loc_descr (DW_OP_drop, 0, 0);
14868 add_loc_descr (&ret, drop_node);
14869 bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
14870 bra_node->dw_loc_oprnd1.v.val_loc = drop_node;
14871 if ((GET_CODE (rtl) == SMIN || GET_CODE (rtl) == SMAX)
14872 && is_a <scalar_int_mode> (mode, &int_mode)
14873 && GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
14874 ret = convert_descriptor_to_mode (int_mode, ret);
14875 return ret;
14878 /* Helper function for mem_loc_descriptor. Perform OP binary op,
14879 but after converting arguments to type_die, afterwards
14880 convert back to unsigned. */
14882 static dw_loc_descr_ref
14883 typed_binop (enum dwarf_location_atom op, rtx rtl, dw_die_ref type_die,
14884 scalar_int_mode mode, machine_mode mem_mode)
14886 dw_loc_descr_ref cvt, op0, op1;
14888 if (type_die == NULL)
14889 return NULL;
14890 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
14891 VAR_INIT_STATUS_INITIALIZED);
14892 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
14893 VAR_INIT_STATUS_INITIALIZED);
14894 if (op0 == NULL || op1 == NULL)
14895 return NULL;
14896 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14897 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14898 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14899 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14900 add_loc_descr (&op0, cvt);
14901 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
14902 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
14903 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
14904 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
14905 add_loc_descr (&op1, cvt);
14906 add_loc_descr (&op0, op1);
14907 add_loc_descr (&op0, new_loc_descr (op, 0, 0));
14908 return convert_descriptor_to_mode (mode, op0);
14911 /* CLZ (where constV is CLZ_DEFINED_VALUE_AT_ZERO computed value,
14912 const0 is DW_OP_lit0 or corresponding typed constant,
14913 const1 is DW_OP_lit1 or corresponding typed constant
14914 and constMSB is constant with just the MSB bit set
14915 for the mode):
14916 DW_OP_dup DW_OP_bra <L1> DW_OP_drop constV DW_OP_skip <L4>
14917 L1: const0 DW_OP_swap
14918 L2: DW_OP_dup constMSB DW_OP_and DW_OP_bra <L3> const1 DW_OP_shl
14919 DW_OP_swap DW_OP_plus_uconst <1> DW_OP_swap DW_OP_skip <L2>
14920 L3: DW_OP_drop
14921 L4: DW_OP_nop
14923 CTZ is similar:
14924 DW_OP_dup DW_OP_bra <L1> DW_OP_drop constV DW_OP_skip <L4>
14925 L1: const0 DW_OP_swap
14926 L2: DW_OP_dup const1 DW_OP_and DW_OP_bra <L3> const1 DW_OP_shr
14927 DW_OP_swap DW_OP_plus_uconst <1> DW_OP_swap DW_OP_skip <L2>
14928 L3: DW_OP_drop
14929 L4: DW_OP_nop
14931 FFS is similar:
14932 DW_OP_dup DW_OP_bra <L1> DW_OP_drop const0 DW_OP_skip <L4>
14933 L1: const1 DW_OP_swap
14934 L2: DW_OP_dup const1 DW_OP_and DW_OP_bra <L3> const1 DW_OP_shr
14935 DW_OP_swap DW_OP_plus_uconst <1> DW_OP_swap DW_OP_skip <L2>
14936 L3: DW_OP_drop
14937 L4: DW_OP_nop */
14939 static dw_loc_descr_ref
14940 clz_loc_descriptor (rtx rtl, scalar_int_mode mode,
14941 machine_mode mem_mode)
14943 dw_loc_descr_ref op0, ret, tmp;
14944 HOST_WIDE_INT valv;
14945 dw_loc_descr_ref l1jump, l1label;
14946 dw_loc_descr_ref l2jump, l2label;
14947 dw_loc_descr_ref l3jump, l3label;
14948 dw_loc_descr_ref l4jump, l4label;
14949 rtx msb;
14951 if (GET_MODE (XEXP (rtl, 0)) != mode)
14952 return NULL;
14954 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
14955 VAR_INIT_STATUS_INITIALIZED);
14956 if (op0 == NULL)
14957 return NULL;
14958 ret = op0;
14959 if (GET_CODE (rtl) == CLZ)
14961 if (!CLZ_DEFINED_VALUE_AT_ZERO (mode, valv))
14962 valv = GET_MODE_BITSIZE (mode);
14964 else if (GET_CODE (rtl) == FFS)
14965 valv = 0;
14966 else if (!CTZ_DEFINED_VALUE_AT_ZERO (mode, valv))
14967 valv = GET_MODE_BITSIZE (mode);
14968 add_loc_descr (&ret, new_loc_descr (DW_OP_dup, 0, 0));
14969 l1jump = new_loc_descr (DW_OP_bra, 0, 0);
14970 add_loc_descr (&ret, l1jump);
14971 add_loc_descr (&ret, new_loc_descr (DW_OP_drop, 0, 0));
14972 tmp = mem_loc_descriptor (GEN_INT (valv), mode, mem_mode,
14973 VAR_INIT_STATUS_INITIALIZED);
14974 if (tmp == NULL)
14975 return NULL;
14976 add_loc_descr (&ret, tmp);
14977 l4jump = new_loc_descr (DW_OP_skip, 0, 0);
14978 add_loc_descr (&ret, l4jump);
14979 l1label = mem_loc_descriptor (GET_CODE (rtl) == FFS
14980 ? const1_rtx : const0_rtx,
14981 mode, mem_mode,
14982 VAR_INIT_STATUS_INITIALIZED);
14983 if (l1label == NULL)
14984 return NULL;
14985 add_loc_descr (&ret, l1label);
14986 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
14987 l2label = new_loc_descr (DW_OP_dup, 0, 0);
14988 add_loc_descr (&ret, l2label);
14989 if (GET_CODE (rtl) != CLZ)
14990 msb = const1_rtx;
14991 else if (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)
14992 msb = GEN_INT (HOST_WIDE_INT_1U
14993 << (GET_MODE_BITSIZE (mode) - 1));
14994 else
14995 msb = immed_wide_int_const
14996 (wi::set_bit_in_zero (GET_MODE_PRECISION (mode) - 1,
14997 GET_MODE_PRECISION (mode)), mode);
14998 if (GET_CODE (msb) == CONST_INT && INTVAL (msb) < 0)
14999 tmp = new_loc_descr (HOST_BITS_PER_WIDE_INT == 32
15000 ? DW_OP_const4u : HOST_BITS_PER_WIDE_INT == 64
15001 ? DW_OP_const8u : DW_OP_constu, INTVAL (msb), 0);
15002 else
15003 tmp = mem_loc_descriptor (msb, mode, mem_mode,
15004 VAR_INIT_STATUS_INITIALIZED);
15005 if (tmp == NULL)
15006 return NULL;
15007 add_loc_descr (&ret, tmp);
15008 add_loc_descr (&ret, new_loc_descr (DW_OP_and, 0, 0));
15009 l3jump = new_loc_descr (DW_OP_bra, 0, 0);
15010 add_loc_descr (&ret, l3jump);
15011 tmp = mem_loc_descriptor (const1_rtx, mode, mem_mode,
15012 VAR_INIT_STATUS_INITIALIZED);
15013 if (tmp == NULL)
15014 return NULL;
15015 add_loc_descr (&ret, tmp);
15016 add_loc_descr (&ret, new_loc_descr (GET_CODE (rtl) == CLZ
15017 ? DW_OP_shl : DW_OP_shr, 0, 0));
15018 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15019 add_loc_descr (&ret, new_loc_descr (DW_OP_plus_uconst, 1, 0));
15020 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15021 l2jump = new_loc_descr (DW_OP_skip, 0, 0);
15022 add_loc_descr (&ret, l2jump);
15023 l3label = new_loc_descr (DW_OP_drop, 0, 0);
15024 add_loc_descr (&ret, l3label);
15025 l4label = new_loc_descr (DW_OP_nop, 0, 0);
15026 add_loc_descr (&ret, l4label);
15027 l1jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15028 l1jump->dw_loc_oprnd1.v.val_loc = l1label;
15029 l2jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15030 l2jump->dw_loc_oprnd1.v.val_loc = l2label;
15031 l3jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15032 l3jump->dw_loc_oprnd1.v.val_loc = l3label;
15033 l4jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15034 l4jump->dw_loc_oprnd1.v.val_loc = l4label;
15035 return ret;
15038 /* POPCOUNT (const0 is DW_OP_lit0 or corresponding typed constant,
15039 const1 is DW_OP_lit1 or corresponding typed constant):
15040 const0 DW_OP_swap
15041 L1: DW_OP_dup DW_OP_bra <L2> DW_OP_dup DW_OP_rot const1 DW_OP_and
15042 DW_OP_plus DW_OP_swap const1 DW_OP_shr DW_OP_skip <L1>
15043 L2: DW_OP_drop
15045 PARITY is similar:
15046 L1: DW_OP_dup DW_OP_bra <L2> DW_OP_dup DW_OP_rot const1 DW_OP_and
15047 DW_OP_xor DW_OP_swap const1 DW_OP_shr DW_OP_skip <L1>
15048 L2: DW_OP_drop */
15050 static dw_loc_descr_ref
15051 popcount_loc_descriptor (rtx rtl, scalar_int_mode mode,
15052 machine_mode mem_mode)
15054 dw_loc_descr_ref op0, ret, tmp;
15055 dw_loc_descr_ref l1jump, l1label;
15056 dw_loc_descr_ref l2jump, l2label;
15058 if (GET_MODE (XEXP (rtl, 0)) != mode)
15059 return NULL;
15061 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15062 VAR_INIT_STATUS_INITIALIZED);
15063 if (op0 == NULL)
15064 return NULL;
15065 ret = op0;
15066 tmp = mem_loc_descriptor (const0_rtx, mode, mem_mode,
15067 VAR_INIT_STATUS_INITIALIZED);
15068 if (tmp == NULL)
15069 return NULL;
15070 add_loc_descr (&ret, tmp);
15071 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15072 l1label = new_loc_descr (DW_OP_dup, 0, 0);
15073 add_loc_descr (&ret, l1label);
15074 l2jump = new_loc_descr (DW_OP_bra, 0, 0);
15075 add_loc_descr (&ret, l2jump);
15076 add_loc_descr (&ret, new_loc_descr (DW_OP_dup, 0, 0));
15077 add_loc_descr (&ret, new_loc_descr (DW_OP_rot, 0, 0));
15078 tmp = mem_loc_descriptor (const1_rtx, mode, mem_mode,
15079 VAR_INIT_STATUS_INITIALIZED);
15080 if (tmp == NULL)
15081 return NULL;
15082 add_loc_descr (&ret, tmp);
15083 add_loc_descr (&ret, new_loc_descr (DW_OP_and, 0, 0));
15084 add_loc_descr (&ret, new_loc_descr (GET_CODE (rtl) == POPCOUNT
15085 ? DW_OP_plus : DW_OP_xor, 0, 0));
15086 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15087 tmp = mem_loc_descriptor (const1_rtx, mode, mem_mode,
15088 VAR_INIT_STATUS_INITIALIZED);
15089 add_loc_descr (&ret, tmp);
15090 add_loc_descr (&ret, new_loc_descr (DW_OP_shr, 0, 0));
15091 l1jump = new_loc_descr (DW_OP_skip, 0, 0);
15092 add_loc_descr (&ret, l1jump);
15093 l2label = new_loc_descr (DW_OP_drop, 0, 0);
15094 add_loc_descr (&ret, l2label);
15095 l1jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15096 l1jump->dw_loc_oprnd1.v.val_loc = l1label;
15097 l2jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15098 l2jump->dw_loc_oprnd1.v.val_loc = l2label;
15099 return ret;
15102 /* BSWAP (constS is initial shift count, either 56 or 24):
15103 constS const0
15104 L1: DW_OP_pick <2> constS DW_OP_pick <3> DW_OP_minus DW_OP_shr
15105 const255 DW_OP_and DW_OP_pick <2> DW_OP_shl DW_OP_or
15106 DW_OP_swap DW_OP_dup const0 DW_OP_eq DW_OP_bra <L2> const8
15107 DW_OP_minus DW_OP_swap DW_OP_skip <L1>
15108 L2: DW_OP_drop DW_OP_swap DW_OP_drop */
15110 static dw_loc_descr_ref
15111 bswap_loc_descriptor (rtx rtl, scalar_int_mode mode,
15112 machine_mode mem_mode)
15114 dw_loc_descr_ref op0, ret, tmp;
15115 dw_loc_descr_ref l1jump, l1label;
15116 dw_loc_descr_ref l2jump, l2label;
15118 if (BITS_PER_UNIT != 8
15119 || (GET_MODE_BITSIZE (mode) != 32
15120 && GET_MODE_BITSIZE (mode) != 64))
15121 return NULL;
15123 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15124 VAR_INIT_STATUS_INITIALIZED);
15125 if (op0 == NULL)
15126 return NULL;
15128 ret = op0;
15129 tmp = mem_loc_descriptor (GEN_INT (GET_MODE_BITSIZE (mode) - 8),
15130 mode, mem_mode,
15131 VAR_INIT_STATUS_INITIALIZED);
15132 if (tmp == NULL)
15133 return NULL;
15134 add_loc_descr (&ret, tmp);
15135 tmp = mem_loc_descriptor (const0_rtx, mode, mem_mode,
15136 VAR_INIT_STATUS_INITIALIZED);
15137 if (tmp == NULL)
15138 return NULL;
15139 add_loc_descr (&ret, tmp);
15140 l1label = new_loc_descr (DW_OP_pick, 2, 0);
15141 add_loc_descr (&ret, l1label);
15142 tmp = mem_loc_descriptor (GEN_INT (GET_MODE_BITSIZE (mode) - 8),
15143 mode, mem_mode,
15144 VAR_INIT_STATUS_INITIALIZED);
15145 add_loc_descr (&ret, tmp);
15146 add_loc_descr (&ret, new_loc_descr (DW_OP_pick, 3, 0));
15147 add_loc_descr (&ret, new_loc_descr (DW_OP_minus, 0, 0));
15148 add_loc_descr (&ret, new_loc_descr (DW_OP_shr, 0, 0));
15149 tmp = mem_loc_descriptor (GEN_INT (255), mode, mem_mode,
15150 VAR_INIT_STATUS_INITIALIZED);
15151 if (tmp == NULL)
15152 return NULL;
15153 add_loc_descr (&ret, tmp);
15154 add_loc_descr (&ret, new_loc_descr (DW_OP_and, 0, 0));
15155 add_loc_descr (&ret, new_loc_descr (DW_OP_pick, 2, 0));
15156 add_loc_descr (&ret, new_loc_descr (DW_OP_shl, 0, 0));
15157 add_loc_descr (&ret, new_loc_descr (DW_OP_or, 0, 0));
15158 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15159 add_loc_descr (&ret, new_loc_descr (DW_OP_dup, 0, 0));
15160 tmp = mem_loc_descriptor (const0_rtx, mode, mem_mode,
15161 VAR_INIT_STATUS_INITIALIZED);
15162 add_loc_descr (&ret, tmp);
15163 add_loc_descr (&ret, new_loc_descr (DW_OP_eq, 0, 0));
15164 l2jump = new_loc_descr (DW_OP_bra, 0, 0);
15165 add_loc_descr (&ret, l2jump);
15166 tmp = mem_loc_descriptor (GEN_INT (8), mode, mem_mode,
15167 VAR_INIT_STATUS_INITIALIZED);
15168 add_loc_descr (&ret, tmp);
15169 add_loc_descr (&ret, new_loc_descr (DW_OP_minus, 0, 0));
15170 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15171 l1jump = new_loc_descr (DW_OP_skip, 0, 0);
15172 add_loc_descr (&ret, l1jump);
15173 l2label = new_loc_descr (DW_OP_drop, 0, 0);
15174 add_loc_descr (&ret, l2label);
15175 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15176 add_loc_descr (&ret, new_loc_descr (DW_OP_drop, 0, 0));
15177 l1jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15178 l1jump->dw_loc_oprnd1.v.val_loc = l1label;
15179 l2jump->dw_loc_oprnd1.val_class = dw_val_class_loc;
15180 l2jump->dw_loc_oprnd1.v.val_loc = l2label;
15181 return ret;
15184 /* ROTATE (constMASK is mode mask, BITSIZE is bitsize of mode):
15185 DW_OP_over DW_OP_over DW_OP_shl [ constMASK DW_OP_and ] DW_OP_rot
15186 [ DW_OP_swap constMASK DW_OP_and DW_OP_swap ] DW_OP_neg
15187 DW_OP_plus_uconst <BITSIZE> DW_OP_shr DW_OP_or
15189 ROTATERT is similar:
15190 DW_OP_over DW_OP_over DW_OP_neg DW_OP_plus_uconst <BITSIZE>
15191 DW_OP_shl [ constMASK DW_OP_and ] DW_OP_rot
15192 [ DW_OP_swap constMASK DW_OP_and DW_OP_swap ] DW_OP_shr DW_OP_or */
15194 static dw_loc_descr_ref
15195 rotate_loc_descriptor (rtx rtl, scalar_int_mode mode,
15196 machine_mode mem_mode)
15198 rtx rtlop1 = XEXP (rtl, 1);
15199 dw_loc_descr_ref op0, op1, ret, mask[2] = { NULL, NULL };
15200 int i;
15202 if (is_narrower_int_mode (GET_MODE (rtlop1), mode))
15203 rtlop1 = gen_rtx_ZERO_EXTEND (mode, rtlop1);
15204 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15205 VAR_INIT_STATUS_INITIALIZED);
15206 op1 = mem_loc_descriptor (rtlop1, mode, mem_mode,
15207 VAR_INIT_STATUS_INITIALIZED);
15208 if (op0 == NULL || op1 == NULL)
15209 return NULL;
15210 if (GET_MODE_SIZE (mode) < DWARF2_ADDR_SIZE)
15211 for (i = 0; i < 2; i++)
15213 if (GET_MODE_BITSIZE (mode) < HOST_BITS_PER_WIDE_INT)
15214 mask[i] = mem_loc_descriptor (GEN_INT (GET_MODE_MASK (mode)),
15215 mode, mem_mode,
15216 VAR_INIT_STATUS_INITIALIZED);
15217 else if (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_WIDE_INT)
15218 mask[i] = new_loc_descr (HOST_BITS_PER_WIDE_INT == 32
15219 ? DW_OP_const4u
15220 : HOST_BITS_PER_WIDE_INT == 64
15221 ? DW_OP_const8u : DW_OP_constu,
15222 GET_MODE_MASK (mode), 0);
15223 else
15224 mask[i] = NULL;
15225 if (mask[i] == NULL)
15226 return NULL;
15227 add_loc_descr (&mask[i], new_loc_descr (DW_OP_and, 0, 0));
15229 ret = op0;
15230 add_loc_descr (&ret, op1);
15231 add_loc_descr (&ret, new_loc_descr (DW_OP_over, 0, 0));
15232 add_loc_descr (&ret, new_loc_descr (DW_OP_over, 0, 0));
15233 if (GET_CODE (rtl) == ROTATERT)
15235 add_loc_descr (&ret, new_loc_descr (DW_OP_neg, 0, 0));
15236 add_loc_descr (&ret, new_loc_descr (DW_OP_plus_uconst,
15237 GET_MODE_BITSIZE (mode), 0));
15239 add_loc_descr (&ret, new_loc_descr (DW_OP_shl, 0, 0));
15240 if (mask[0] != NULL)
15241 add_loc_descr (&ret, mask[0]);
15242 add_loc_descr (&ret, new_loc_descr (DW_OP_rot, 0, 0));
15243 if (mask[1] != NULL)
15245 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15246 add_loc_descr (&ret, mask[1]);
15247 add_loc_descr (&ret, new_loc_descr (DW_OP_swap, 0, 0));
15249 if (GET_CODE (rtl) == ROTATE)
15251 add_loc_descr (&ret, new_loc_descr (DW_OP_neg, 0, 0));
15252 add_loc_descr (&ret, new_loc_descr (DW_OP_plus_uconst,
15253 GET_MODE_BITSIZE (mode), 0));
15255 add_loc_descr (&ret, new_loc_descr (DW_OP_shr, 0, 0));
15256 add_loc_descr (&ret, new_loc_descr (DW_OP_or, 0, 0));
15257 return ret;
15260 /* Helper function for mem_loc_descriptor. Return DW_OP_GNU_parameter_ref
15261 for DEBUG_PARAMETER_REF RTL. */
15263 static dw_loc_descr_ref
15264 parameter_ref_descriptor (rtx rtl)
15266 dw_loc_descr_ref ret;
15267 dw_die_ref ref;
15269 if (dwarf_strict)
15270 return NULL;
15271 gcc_assert (TREE_CODE (DEBUG_PARAMETER_REF_DECL (rtl)) == PARM_DECL);
15272 /* With LTO during LTRANS we get the late DIE that refers to the early
15273 DIE, thus we add another indirection here. This seems to confuse
15274 gdb enough to make gcc.dg/guality/pr68860-1.c FAIL with LTO. */
15275 ref = lookup_decl_die (DEBUG_PARAMETER_REF_DECL (rtl));
15276 ret = new_loc_descr (DW_OP_GNU_parameter_ref, 0, 0);
15277 if (ref)
15279 ret->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15280 ret->dw_loc_oprnd1.v.val_die_ref.die = ref;
15281 ret->dw_loc_oprnd1.v.val_die_ref.external = 0;
15283 else
15285 ret->dw_loc_oprnd1.val_class = dw_val_class_decl_ref;
15286 ret->dw_loc_oprnd1.v.val_decl_ref = DEBUG_PARAMETER_REF_DECL (rtl);
15288 return ret;
15291 /* The following routine converts the RTL for a variable or parameter
15292 (resident in memory) into an equivalent Dwarf representation of a
15293 mechanism for getting the address of that same variable onto the top of a
15294 hypothetical "address evaluation" stack.
15296 When creating memory location descriptors, we are effectively transforming
15297 the RTL for a memory-resident object into its Dwarf postfix expression
15298 equivalent. This routine recursively descends an RTL tree, turning
15299 it into Dwarf postfix code as it goes.
15301 MODE is the mode that should be assumed for the rtl if it is VOIDmode.
15303 MEM_MODE is the mode of the memory reference, needed to handle some
15304 autoincrement addressing modes.
15306 Return 0 if we can't represent the location. */
15308 dw_loc_descr_ref
15309 mem_loc_descriptor (rtx rtl, machine_mode mode,
15310 machine_mode mem_mode,
15311 enum var_init_status initialized)
15313 dw_loc_descr_ref mem_loc_result = NULL;
15314 enum dwarf_location_atom op;
15315 dw_loc_descr_ref op0, op1;
15316 rtx inner = NULL_RTX;
15317 poly_int64 offset;
15319 if (mode == VOIDmode)
15320 mode = GET_MODE (rtl);
15322 /* Note that for a dynamically sized array, the location we will generate a
15323 description of here will be the lowest numbered location which is
15324 actually within the array. That's *not* necessarily the same as the
15325 zeroth element of the array. */
15327 rtl = targetm.delegitimize_address (rtl);
15329 if (mode != GET_MODE (rtl) && GET_MODE (rtl) != VOIDmode)
15330 return NULL;
15332 scalar_int_mode int_mode, inner_mode, op1_mode;
15333 switch (GET_CODE (rtl))
15335 case POST_INC:
15336 case POST_DEC:
15337 case POST_MODIFY:
15338 return mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode, initialized);
15340 case SUBREG:
15341 /* The case of a subreg may arise when we have a local (register)
15342 variable or a formal (register) parameter which doesn't quite fill
15343 up an entire register. For now, just assume that it is
15344 legitimate to make the Dwarf info refer to the whole register which
15345 contains the given subreg. */
15346 if (!subreg_lowpart_p (rtl))
15347 break;
15348 inner = SUBREG_REG (rtl);
15349 /* FALLTHRU */
15350 case TRUNCATE:
15351 if (inner == NULL_RTX)
15352 inner = XEXP (rtl, 0);
15353 if (is_a <scalar_int_mode> (mode, &int_mode)
15354 && is_a <scalar_int_mode> (GET_MODE (inner), &inner_mode)
15355 && (GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
15356 #ifdef POINTERS_EXTEND_UNSIGNED
15357 || (int_mode == Pmode && mem_mode != VOIDmode)
15358 #endif
15360 && GET_MODE_SIZE (inner_mode) <= DWARF2_ADDR_SIZE)
15362 mem_loc_result = mem_loc_descriptor (inner,
15363 inner_mode,
15364 mem_mode, initialized);
15365 break;
15367 if (dwarf_strict && dwarf_version < 5)
15368 break;
15369 if (is_a <scalar_int_mode> (mode, &int_mode)
15370 && is_a <scalar_int_mode> (GET_MODE (inner), &inner_mode)
15371 ? GET_MODE_SIZE (int_mode) <= GET_MODE_SIZE (inner_mode)
15372 : known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (GET_MODE (inner))))
15374 dw_die_ref type_die;
15375 dw_loc_descr_ref cvt;
15377 mem_loc_result = mem_loc_descriptor (inner,
15378 GET_MODE (inner),
15379 mem_mode, initialized);
15380 if (mem_loc_result == NULL)
15381 break;
15382 type_die = base_type_for_mode (mode, SCALAR_INT_MODE_P (mode));
15383 if (type_die == NULL)
15385 mem_loc_result = NULL;
15386 break;
15388 if (maybe_ne (GET_MODE_SIZE (mode), GET_MODE_SIZE (GET_MODE (inner))))
15389 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
15390 else
15391 cvt = new_loc_descr (dwarf_OP (DW_OP_reinterpret), 0, 0);
15392 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15393 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
15394 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
15395 add_loc_descr (&mem_loc_result, cvt);
15396 if (is_a <scalar_int_mode> (mode, &int_mode)
15397 && GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE)
15399 /* Convert it to untyped afterwards. */
15400 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
15401 add_loc_descr (&mem_loc_result, cvt);
15404 break;
15406 case REG:
15407 if (!is_a <scalar_int_mode> (mode, &int_mode)
15408 || (GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE
15409 && rtl != arg_pointer_rtx
15410 && rtl != frame_pointer_rtx
15411 #ifdef POINTERS_EXTEND_UNSIGNED
15412 && (int_mode != Pmode || mem_mode == VOIDmode)
15413 #endif
15416 dw_die_ref type_die;
15417 unsigned int dbx_regnum;
15419 if (dwarf_strict && dwarf_version < 5)
15420 break;
15421 if (REGNO (rtl) > FIRST_PSEUDO_REGISTER)
15422 break;
15423 type_die = base_type_for_mode (mode, SCALAR_INT_MODE_P (mode));
15424 if (type_die == NULL)
15425 break;
15427 dbx_regnum = dbx_reg_number (rtl);
15428 if (dbx_regnum == IGNORED_DWARF_REGNUM)
15429 break;
15430 mem_loc_result = new_loc_descr (dwarf_OP (DW_OP_regval_type),
15431 dbx_regnum, 0);
15432 mem_loc_result->dw_loc_oprnd2.val_class = dw_val_class_die_ref;
15433 mem_loc_result->dw_loc_oprnd2.v.val_die_ref.die = type_die;
15434 mem_loc_result->dw_loc_oprnd2.v.val_die_ref.external = 0;
15435 break;
15437 /* Whenever a register number forms a part of the description of the
15438 method for calculating the (dynamic) address of a memory resident
15439 object, DWARF rules require the register number be referred to as
15440 a "base register". This distinction is not based in any way upon
15441 what category of register the hardware believes the given register
15442 belongs to. This is strictly DWARF terminology we're dealing with
15443 here. Note that in cases where the location of a memory-resident
15444 data object could be expressed as: OP_ADD (OP_BASEREG (basereg),
15445 OP_CONST (0)) the actual DWARF location descriptor that we generate
15446 may just be OP_BASEREG (basereg). This may look deceptively like
15447 the object in question was allocated to a register (rather than in
15448 memory) so DWARF consumers need to be aware of the subtle
15449 distinction between OP_REG and OP_BASEREG. */
15450 if (REGNO (rtl) < FIRST_PSEUDO_REGISTER)
15451 mem_loc_result = based_loc_descr (rtl, 0, VAR_INIT_STATUS_INITIALIZED);
15452 else if (stack_realign_drap
15453 && crtl->drap_reg
15454 && crtl->args.internal_arg_pointer == rtl
15455 && REGNO (crtl->drap_reg) < FIRST_PSEUDO_REGISTER)
15457 /* If RTL is internal_arg_pointer, which has been optimized
15458 out, use DRAP instead. */
15459 mem_loc_result = based_loc_descr (crtl->drap_reg, 0,
15460 VAR_INIT_STATUS_INITIALIZED);
15462 break;
15464 case SIGN_EXTEND:
15465 case ZERO_EXTEND:
15466 if (!is_a <scalar_int_mode> (mode, &int_mode)
15467 || !is_a <scalar_int_mode> (GET_MODE (XEXP (rtl, 0)), &inner_mode))
15468 break;
15469 op0 = mem_loc_descriptor (XEXP (rtl, 0), inner_mode,
15470 mem_mode, VAR_INIT_STATUS_INITIALIZED);
15471 if (op0 == 0)
15472 break;
15473 else if (GET_CODE (rtl) == ZERO_EXTEND
15474 && GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
15475 && GET_MODE_BITSIZE (inner_mode) < HOST_BITS_PER_WIDE_INT
15476 /* If DW_OP_const{1,2,4}u won't be used, it is shorter
15477 to expand zero extend as two shifts instead of
15478 masking. */
15479 && GET_MODE_SIZE (inner_mode) <= 4)
15481 mem_loc_result = op0;
15482 add_loc_descr (&mem_loc_result,
15483 int_loc_descriptor (GET_MODE_MASK (inner_mode)));
15484 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_and, 0, 0));
15486 else if (GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE)
15488 int shift = DWARF2_ADDR_SIZE - GET_MODE_SIZE (inner_mode);
15489 shift *= BITS_PER_UNIT;
15490 if (GET_CODE (rtl) == SIGN_EXTEND)
15491 op = DW_OP_shra;
15492 else
15493 op = DW_OP_shr;
15494 mem_loc_result = op0;
15495 add_loc_descr (&mem_loc_result, int_loc_descriptor (shift));
15496 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_shl, 0, 0));
15497 add_loc_descr (&mem_loc_result, int_loc_descriptor (shift));
15498 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
15500 else if (!dwarf_strict || dwarf_version >= 5)
15502 dw_die_ref type_die1, type_die2;
15503 dw_loc_descr_ref cvt;
15505 type_die1 = base_type_for_mode (inner_mode,
15506 GET_CODE (rtl) == ZERO_EXTEND);
15507 if (type_die1 == NULL)
15508 break;
15509 type_die2 = base_type_for_mode (int_mode, 1);
15510 if (type_die2 == NULL)
15511 break;
15512 mem_loc_result = op0;
15513 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
15514 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15515 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die1;
15516 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
15517 add_loc_descr (&mem_loc_result, cvt);
15518 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
15519 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15520 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die2;
15521 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
15522 add_loc_descr (&mem_loc_result, cvt);
15524 break;
15526 case MEM:
15528 rtx new_rtl = avoid_constant_pool_reference (rtl);
15529 if (new_rtl != rtl)
15531 mem_loc_result = mem_loc_descriptor (new_rtl, mode, mem_mode,
15532 initialized);
15533 if (mem_loc_result != NULL)
15534 return mem_loc_result;
15537 mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0),
15538 get_address_mode (rtl), mode,
15539 VAR_INIT_STATUS_INITIALIZED);
15540 if (mem_loc_result == NULL)
15541 mem_loc_result = tls_mem_loc_descriptor (rtl);
15542 if (mem_loc_result != NULL)
15544 if (!is_a <scalar_int_mode> (mode, &int_mode)
15545 || GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
15547 dw_die_ref type_die;
15548 dw_loc_descr_ref deref;
15549 HOST_WIDE_INT size;
15551 if (dwarf_strict && dwarf_version < 5)
15552 return NULL;
15553 if (!GET_MODE_SIZE (mode).is_constant (&size))
15554 return NULL;
15555 type_die
15556 = base_type_for_mode (mode, SCALAR_INT_MODE_P (mode));
15557 if (type_die == NULL)
15558 return NULL;
15559 deref = new_loc_descr (dwarf_OP (DW_OP_deref_type), size, 0);
15560 deref->dw_loc_oprnd2.val_class = dw_val_class_die_ref;
15561 deref->dw_loc_oprnd2.v.val_die_ref.die = type_die;
15562 deref->dw_loc_oprnd2.v.val_die_ref.external = 0;
15563 add_loc_descr (&mem_loc_result, deref);
15565 else if (GET_MODE_SIZE (int_mode) == DWARF2_ADDR_SIZE)
15566 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0));
15567 else
15568 add_loc_descr (&mem_loc_result,
15569 new_loc_descr (DW_OP_deref_size,
15570 GET_MODE_SIZE (int_mode), 0));
15572 break;
15574 case LO_SUM:
15575 return mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode, initialized);
15577 case LABEL_REF:
15578 /* Some ports can transform a symbol ref into a label ref, because
15579 the symbol ref is too far away and has to be dumped into a constant
15580 pool. */
15581 case CONST:
15582 case SYMBOL_REF:
15583 if (!is_a <scalar_int_mode> (mode, &int_mode)
15584 || (GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE
15585 #ifdef POINTERS_EXTEND_UNSIGNED
15586 && (int_mode != Pmode || mem_mode == VOIDmode)
15587 #endif
15589 break;
15590 if (GET_CODE (rtl) == SYMBOL_REF
15591 && SYMBOL_REF_TLS_MODEL (rtl) != TLS_MODEL_NONE)
15593 dw_loc_descr_ref temp;
15595 /* If this is not defined, we have no way to emit the data. */
15596 if (!targetm.have_tls || !targetm.asm_out.output_dwarf_dtprel)
15597 break;
15599 temp = new_addr_loc_descr (rtl, dtprel_true);
15601 /* We check for DWARF 5 here because gdb did not implement
15602 DW_OP_form_tls_address until after 7.12. */
15603 mem_loc_result = new_loc_descr ((dwarf_version >= 5
15604 ? DW_OP_form_tls_address
15605 : DW_OP_GNU_push_tls_address),
15606 0, 0);
15607 add_loc_descr (&mem_loc_result, temp);
15609 break;
15612 if (!const_ok_for_output (rtl))
15614 if (GET_CODE (rtl) == CONST)
15615 switch (GET_CODE (XEXP (rtl, 0)))
15617 case NOT:
15618 op = DW_OP_not;
15619 goto try_const_unop;
15620 case NEG:
15621 op = DW_OP_neg;
15622 goto try_const_unop;
15623 try_const_unop:
15624 rtx arg;
15625 arg = XEXP (XEXP (rtl, 0), 0);
15626 if (!CONSTANT_P (arg))
15627 arg = gen_rtx_CONST (int_mode, arg);
15628 op0 = mem_loc_descriptor (arg, int_mode, mem_mode,
15629 initialized);
15630 if (op0)
15632 mem_loc_result = op0;
15633 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
15635 break;
15636 default:
15637 mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), int_mode,
15638 mem_mode, initialized);
15639 break;
15641 break;
15644 symref:
15645 mem_loc_result = new_addr_loc_descr (rtl, dtprel_false);
15646 vec_safe_push (used_rtx_array, rtl);
15647 break;
15649 case CONCAT:
15650 case CONCATN:
15651 case VAR_LOCATION:
15652 case DEBUG_IMPLICIT_PTR:
15653 expansion_failed (NULL_TREE, rtl,
15654 "CONCAT/CONCATN/VAR_LOCATION is handled only by loc_descriptor");
15655 return 0;
15657 case ENTRY_VALUE:
15658 if (dwarf_strict && dwarf_version < 5)
15659 return NULL;
15660 if (REG_P (ENTRY_VALUE_EXP (rtl)))
15662 if (!is_a <scalar_int_mode> (mode, &int_mode)
15663 || GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
15664 op0 = mem_loc_descriptor (ENTRY_VALUE_EXP (rtl), mode,
15665 VOIDmode, VAR_INIT_STATUS_INITIALIZED);
15666 else
15668 unsigned int dbx_regnum = dbx_reg_number (ENTRY_VALUE_EXP (rtl));
15669 if (dbx_regnum == IGNORED_DWARF_REGNUM)
15670 return NULL;
15671 op0 = one_reg_loc_descriptor (dbx_regnum,
15672 VAR_INIT_STATUS_INITIALIZED);
15675 else if (MEM_P (ENTRY_VALUE_EXP (rtl))
15676 && REG_P (XEXP (ENTRY_VALUE_EXP (rtl), 0)))
15678 op0 = mem_loc_descriptor (ENTRY_VALUE_EXP (rtl), mode,
15679 VOIDmode, VAR_INIT_STATUS_INITIALIZED);
15680 if (op0 && op0->dw_loc_opc == DW_OP_fbreg)
15681 return NULL;
15683 else
15684 gcc_unreachable ();
15685 if (op0 == NULL)
15686 return NULL;
15687 mem_loc_result = new_loc_descr (dwarf_OP (DW_OP_entry_value), 0, 0);
15688 mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_loc;
15689 mem_loc_result->dw_loc_oprnd1.v.val_loc = op0;
15690 break;
15692 case DEBUG_PARAMETER_REF:
15693 mem_loc_result = parameter_ref_descriptor (rtl);
15694 break;
15696 case PRE_MODIFY:
15697 /* Extract the PLUS expression nested inside and fall into
15698 PLUS code below. */
15699 rtl = XEXP (rtl, 1);
15700 goto plus;
15702 case PRE_INC:
15703 case PRE_DEC:
15704 /* Turn these into a PLUS expression and fall into the PLUS code
15705 below. */
15706 rtl = gen_rtx_PLUS (mode, XEXP (rtl, 0),
15707 gen_int_mode (GET_CODE (rtl) == PRE_INC
15708 ? GET_MODE_UNIT_SIZE (mem_mode)
15709 : -GET_MODE_UNIT_SIZE (mem_mode),
15710 mode));
15712 /* fall through */
15714 case PLUS:
15715 plus:
15716 if (is_based_loc (rtl)
15717 && is_a <scalar_int_mode> (mode, &int_mode)
15718 && (GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
15719 || XEXP (rtl, 0) == arg_pointer_rtx
15720 || XEXP (rtl, 0) == frame_pointer_rtx))
15721 mem_loc_result = based_loc_descr (XEXP (rtl, 0),
15722 INTVAL (XEXP (rtl, 1)),
15723 VAR_INIT_STATUS_INITIALIZED);
15724 else
15726 mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15727 VAR_INIT_STATUS_INITIALIZED);
15728 if (mem_loc_result == 0)
15729 break;
15731 if (CONST_INT_P (XEXP (rtl, 1))
15732 && (GET_MODE_SIZE (as_a <scalar_int_mode> (mode))
15733 <= DWARF2_ADDR_SIZE))
15734 loc_descr_plus_const (&mem_loc_result, INTVAL (XEXP (rtl, 1)));
15735 else
15737 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
15738 VAR_INIT_STATUS_INITIALIZED);
15739 if (op1 == 0)
15740 return NULL;
15741 add_loc_descr (&mem_loc_result, op1);
15742 add_loc_descr (&mem_loc_result,
15743 new_loc_descr (DW_OP_plus, 0, 0));
15746 break;
15748 /* If a pseudo-reg is optimized away, it is possible for it to
15749 be replaced with a MEM containing a multiply or shift. */
15750 case MINUS:
15751 op = DW_OP_minus;
15752 goto do_binop;
15754 case MULT:
15755 op = DW_OP_mul;
15756 goto do_binop;
15758 case DIV:
15759 if ((!dwarf_strict || dwarf_version >= 5)
15760 && is_a <scalar_int_mode> (mode, &int_mode)
15761 && GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
15763 mem_loc_result = typed_binop (DW_OP_div, rtl,
15764 base_type_for_mode (mode, 0),
15765 int_mode, mem_mode);
15766 break;
15768 op = DW_OP_div;
15769 goto do_binop;
15771 case UMOD:
15772 op = DW_OP_mod;
15773 goto do_binop;
15775 case ASHIFT:
15776 op = DW_OP_shl;
15777 goto do_shift;
15779 case ASHIFTRT:
15780 op = DW_OP_shra;
15781 goto do_shift;
15783 case LSHIFTRT:
15784 op = DW_OP_shr;
15785 goto do_shift;
15787 do_shift:
15788 if (!is_a <scalar_int_mode> (mode, &int_mode))
15789 break;
15790 op0 = mem_loc_descriptor (XEXP (rtl, 0), int_mode, mem_mode,
15791 VAR_INIT_STATUS_INITIALIZED);
15793 rtx rtlop1 = XEXP (rtl, 1);
15794 if (is_a <scalar_int_mode> (GET_MODE (rtlop1), &op1_mode)
15795 && GET_MODE_BITSIZE (op1_mode) < GET_MODE_BITSIZE (int_mode))
15796 rtlop1 = gen_rtx_ZERO_EXTEND (int_mode, rtlop1);
15797 op1 = mem_loc_descriptor (rtlop1, int_mode, mem_mode,
15798 VAR_INIT_STATUS_INITIALIZED);
15801 if (op0 == 0 || op1 == 0)
15802 break;
15804 mem_loc_result = op0;
15805 add_loc_descr (&mem_loc_result, op1);
15806 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
15807 break;
15809 case AND:
15810 op = DW_OP_and;
15811 goto do_binop;
15813 case IOR:
15814 op = DW_OP_or;
15815 goto do_binop;
15817 case XOR:
15818 op = DW_OP_xor;
15819 goto do_binop;
15821 do_binop:
15822 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15823 VAR_INIT_STATUS_INITIALIZED);
15824 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
15825 VAR_INIT_STATUS_INITIALIZED);
15827 if (op0 == 0 || op1 == 0)
15828 break;
15830 mem_loc_result = op0;
15831 add_loc_descr (&mem_loc_result, op1);
15832 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
15833 break;
15835 case MOD:
15836 if ((!dwarf_strict || dwarf_version >= 5)
15837 && is_a <scalar_int_mode> (mode, &int_mode)
15838 && GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
15840 mem_loc_result = typed_binop (DW_OP_mod, rtl,
15841 base_type_for_mode (mode, 0),
15842 int_mode, mem_mode);
15843 break;
15846 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15847 VAR_INIT_STATUS_INITIALIZED);
15848 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
15849 VAR_INIT_STATUS_INITIALIZED);
15851 if (op0 == 0 || op1 == 0)
15852 break;
15854 mem_loc_result = op0;
15855 add_loc_descr (&mem_loc_result, op1);
15856 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_over, 0, 0));
15857 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_over, 0, 0));
15858 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_div, 0, 0));
15859 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
15860 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_minus, 0, 0));
15861 break;
15863 case UDIV:
15864 if ((!dwarf_strict || dwarf_version >= 5)
15865 && is_a <scalar_int_mode> (mode, &int_mode))
15867 if (GET_MODE_SIZE (int_mode) > DWARF2_ADDR_SIZE)
15869 op = DW_OP_div;
15870 goto do_binop;
15872 mem_loc_result = typed_binop (DW_OP_div, rtl,
15873 base_type_for_mode (int_mode, 1),
15874 int_mode, mem_mode);
15876 break;
15878 case NOT:
15879 op = DW_OP_not;
15880 goto do_unop;
15882 case ABS:
15883 op = DW_OP_abs;
15884 goto do_unop;
15886 case NEG:
15887 op = DW_OP_neg;
15888 goto do_unop;
15890 do_unop:
15891 op0 = mem_loc_descriptor (XEXP (rtl, 0), mode, mem_mode,
15892 VAR_INIT_STATUS_INITIALIZED);
15894 if (op0 == 0)
15895 break;
15897 mem_loc_result = op0;
15898 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
15899 break;
15901 case CONST_INT:
15902 if (!is_a <scalar_int_mode> (mode, &int_mode)
15903 || GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
15904 #ifdef POINTERS_EXTEND_UNSIGNED
15905 || (int_mode == Pmode
15906 && mem_mode != VOIDmode
15907 && trunc_int_for_mode (INTVAL (rtl), ptr_mode) == INTVAL (rtl))
15908 #endif
15911 mem_loc_result = int_loc_descriptor (INTVAL (rtl));
15912 break;
15914 if ((!dwarf_strict || dwarf_version >= 5)
15915 && (GET_MODE_BITSIZE (int_mode) == HOST_BITS_PER_WIDE_INT
15916 || GET_MODE_BITSIZE (int_mode) == HOST_BITS_PER_DOUBLE_INT))
15918 dw_die_ref type_die = base_type_for_mode (int_mode, 1);
15919 scalar_int_mode amode;
15920 if (type_die == NULL)
15921 return NULL;
15922 if (INTVAL (rtl) >= 0
15923 && (int_mode_for_size (DWARF2_ADDR_SIZE * BITS_PER_UNIT, 0)
15924 .exists (&amode))
15925 && trunc_int_for_mode (INTVAL (rtl), amode) == INTVAL (rtl)
15926 /* const DW_OP_convert <XXX> vs.
15927 DW_OP_const_type <XXX, 1, const>. */
15928 && size_of_int_loc_descriptor (INTVAL (rtl)) + 1 + 1
15929 < (unsigned long) 1 + 1 + 1 + GET_MODE_SIZE (int_mode))
15931 mem_loc_result = int_loc_descriptor (INTVAL (rtl));
15932 op0 = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
15933 op0->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15934 op0->dw_loc_oprnd1.v.val_die_ref.die = type_die;
15935 op0->dw_loc_oprnd1.v.val_die_ref.external = 0;
15936 add_loc_descr (&mem_loc_result, op0);
15937 return mem_loc_result;
15939 mem_loc_result = new_loc_descr (dwarf_OP (DW_OP_const_type), 0,
15940 INTVAL (rtl));
15941 mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15942 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.die = type_die;
15943 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.external = 0;
15944 if (GET_MODE_BITSIZE (int_mode) == HOST_BITS_PER_WIDE_INT)
15945 mem_loc_result->dw_loc_oprnd2.val_class = dw_val_class_const;
15946 else
15948 mem_loc_result->dw_loc_oprnd2.val_class
15949 = dw_val_class_const_double;
15950 mem_loc_result->dw_loc_oprnd2.v.val_double
15951 = double_int::from_shwi (INTVAL (rtl));
15954 break;
15956 case CONST_DOUBLE:
15957 if (!dwarf_strict || dwarf_version >= 5)
15959 dw_die_ref type_die;
15961 /* Note that if TARGET_SUPPORTS_WIDE_INT == 0, a
15962 CONST_DOUBLE rtx could represent either a large integer
15963 or a floating-point constant. If TARGET_SUPPORTS_WIDE_INT != 0,
15964 the value is always a floating point constant.
15966 When it is an integer, a CONST_DOUBLE is used whenever
15967 the constant requires 2 HWIs to be adequately represented.
15968 We output CONST_DOUBLEs as blocks. */
15969 if (mode == VOIDmode
15970 || (GET_MODE (rtl) == VOIDmode
15971 && maybe_ne (GET_MODE_BITSIZE (mode),
15972 HOST_BITS_PER_DOUBLE_INT)))
15973 break;
15974 type_die = base_type_for_mode (mode, SCALAR_INT_MODE_P (mode));
15975 if (type_die == NULL)
15976 return NULL;
15977 mem_loc_result = new_loc_descr (dwarf_OP (DW_OP_const_type), 0, 0);
15978 mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
15979 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.die = type_die;
15980 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.external = 0;
15981 #if TARGET_SUPPORTS_WIDE_INT == 0
15982 if (!SCALAR_FLOAT_MODE_P (mode))
15984 mem_loc_result->dw_loc_oprnd2.val_class
15985 = dw_val_class_const_double;
15986 mem_loc_result->dw_loc_oprnd2.v.val_double
15987 = rtx_to_double_int (rtl);
15989 else
15990 #endif
15992 scalar_float_mode float_mode = as_a <scalar_float_mode> (mode);
15993 unsigned int length = GET_MODE_SIZE (float_mode);
15994 unsigned char *array = ggc_vec_alloc<unsigned char> (length);
15996 insert_float (rtl, array);
15997 mem_loc_result->dw_loc_oprnd2.val_class = dw_val_class_vec;
15998 mem_loc_result->dw_loc_oprnd2.v.val_vec.length = length / 4;
15999 mem_loc_result->dw_loc_oprnd2.v.val_vec.elt_size = 4;
16000 mem_loc_result->dw_loc_oprnd2.v.val_vec.array = array;
16003 break;
16005 case CONST_WIDE_INT:
16006 if (!dwarf_strict || dwarf_version >= 5)
16008 dw_die_ref type_die;
16010 type_die = base_type_for_mode (mode, SCALAR_INT_MODE_P (mode));
16011 if (type_die == NULL)
16012 return NULL;
16013 mem_loc_result = new_loc_descr (dwarf_OP (DW_OP_const_type), 0, 0);
16014 mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
16015 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.die = type_die;
16016 mem_loc_result->dw_loc_oprnd1.v.val_die_ref.external = 0;
16017 mem_loc_result->dw_loc_oprnd2.val_class
16018 = dw_val_class_wide_int;
16019 mem_loc_result->dw_loc_oprnd2.v.val_wide = ggc_alloc<wide_int> ();
16020 *mem_loc_result->dw_loc_oprnd2.v.val_wide = rtx_mode_t (rtl, mode);
16022 break;
16024 case CONST_POLY_INT:
16025 mem_loc_result = int_loc_descriptor (rtx_to_poly_int64 (rtl));
16026 break;
16028 case EQ:
16029 mem_loc_result = scompare_loc_descriptor (DW_OP_eq, rtl, mem_mode);
16030 break;
16032 case GE:
16033 mem_loc_result = scompare_loc_descriptor (DW_OP_ge, rtl, mem_mode);
16034 break;
16036 case GT:
16037 mem_loc_result = scompare_loc_descriptor (DW_OP_gt, rtl, mem_mode);
16038 break;
16040 case LE:
16041 mem_loc_result = scompare_loc_descriptor (DW_OP_le, rtl, mem_mode);
16042 break;
16044 case LT:
16045 mem_loc_result = scompare_loc_descriptor (DW_OP_lt, rtl, mem_mode);
16046 break;
16048 case NE:
16049 mem_loc_result = scompare_loc_descriptor (DW_OP_ne, rtl, mem_mode);
16050 break;
16052 case GEU:
16053 mem_loc_result = ucompare_loc_descriptor (DW_OP_ge, rtl, mem_mode);
16054 break;
16056 case GTU:
16057 mem_loc_result = ucompare_loc_descriptor (DW_OP_gt, rtl, mem_mode);
16058 break;
16060 case LEU:
16061 mem_loc_result = ucompare_loc_descriptor (DW_OP_le, rtl, mem_mode);
16062 break;
16064 case LTU:
16065 mem_loc_result = ucompare_loc_descriptor (DW_OP_lt, rtl, mem_mode);
16066 break;
16068 case UMIN:
16069 case UMAX:
16070 if (!SCALAR_INT_MODE_P (mode))
16071 break;
16072 /* FALLTHRU */
16073 case SMIN:
16074 case SMAX:
16075 mem_loc_result = minmax_loc_descriptor (rtl, mode, mem_mode);
16076 break;
16078 case ZERO_EXTRACT:
16079 case SIGN_EXTRACT:
16080 if (CONST_INT_P (XEXP (rtl, 1))
16081 && CONST_INT_P (XEXP (rtl, 2))
16082 && is_a <scalar_int_mode> (mode, &int_mode)
16083 && is_a <scalar_int_mode> (GET_MODE (XEXP (rtl, 0)), &inner_mode)
16084 && GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
16085 && GET_MODE_SIZE (inner_mode) <= DWARF2_ADDR_SIZE
16086 && ((unsigned) INTVAL (XEXP (rtl, 1))
16087 + (unsigned) INTVAL (XEXP (rtl, 2))
16088 <= GET_MODE_BITSIZE (int_mode)))
16090 int shift, size;
16091 op0 = mem_loc_descriptor (XEXP (rtl, 0), inner_mode,
16092 mem_mode, VAR_INIT_STATUS_INITIALIZED);
16093 if (op0 == 0)
16094 break;
16095 if (GET_CODE (rtl) == SIGN_EXTRACT)
16096 op = DW_OP_shra;
16097 else
16098 op = DW_OP_shr;
16099 mem_loc_result = op0;
16100 size = INTVAL (XEXP (rtl, 1));
16101 shift = INTVAL (XEXP (rtl, 2));
16102 if (BITS_BIG_ENDIAN)
16103 shift = GET_MODE_BITSIZE (inner_mode) - shift - size;
16104 if (shift + size != (int) DWARF2_ADDR_SIZE)
16106 add_loc_descr (&mem_loc_result,
16107 int_loc_descriptor (DWARF2_ADDR_SIZE
16108 - shift - size));
16109 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_shl, 0, 0));
16111 if (size != (int) DWARF2_ADDR_SIZE)
16113 add_loc_descr (&mem_loc_result,
16114 int_loc_descriptor (DWARF2_ADDR_SIZE - size));
16115 add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
16118 break;
16120 case IF_THEN_ELSE:
16122 dw_loc_descr_ref op2, bra_node, drop_node;
16123 op0 = mem_loc_descriptor (XEXP (rtl, 0),
16124 GET_MODE (XEXP (rtl, 0)) == VOIDmode
16125 ? word_mode : GET_MODE (XEXP (rtl, 0)),
16126 mem_mode, VAR_INIT_STATUS_INITIALIZED);
16127 op1 = mem_loc_descriptor (XEXP (rtl, 1), mode, mem_mode,
16128 VAR_INIT_STATUS_INITIALIZED);
16129 op2 = mem_loc_descriptor (XEXP (rtl, 2), mode, mem_mode,
16130 VAR_INIT_STATUS_INITIALIZED);
16131 if (op0 == NULL || op1 == NULL || op2 == NULL)
16132 break;
16134 mem_loc_result = op1;
16135 add_loc_descr (&mem_loc_result, op2);
16136 add_loc_descr (&mem_loc_result, op0);
16137 bra_node = new_loc_descr (DW_OP_bra, 0, 0);
16138 add_loc_descr (&mem_loc_result, bra_node);
16139 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_swap, 0, 0));
16140 drop_node = new_loc_descr (DW_OP_drop, 0, 0);
16141 add_loc_descr (&mem_loc_result, drop_node);
16142 bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
16143 bra_node->dw_loc_oprnd1.v.val_loc = drop_node;
16145 break;
16147 case FLOAT_EXTEND:
16148 case FLOAT_TRUNCATE:
16149 case FLOAT:
16150 case UNSIGNED_FLOAT:
16151 case FIX:
16152 case UNSIGNED_FIX:
16153 if (!dwarf_strict || dwarf_version >= 5)
16155 dw_die_ref type_die;
16156 dw_loc_descr_ref cvt;
16158 op0 = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (XEXP (rtl, 0)),
16159 mem_mode, VAR_INIT_STATUS_INITIALIZED);
16160 if (op0 == NULL)
16161 break;
16162 if (is_a <scalar_int_mode> (GET_MODE (XEXP (rtl, 0)), &int_mode)
16163 && (GET_CODE (rtl) == FLOAT
16164 || GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE))
16166 type_die = base_type_for_mode (int_mode,
16167 GET_CODE (rtl) == UNSIGNED_FLOAT);
16168 if (type_die == NULL)
16169 break;
16170 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
16171 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
16172 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
16173 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
16174 add_loc_descr (&op0, cvt);
16176 type_die = base_type_for_mode (mode, GET_CODE (rtl) == UNSIGNED_FIX);
16177 if (type_die == NULL)
16178 break;
16179 cvt = new_loc_descr (dwarf_OP (DW_OP_convert), 0, 0);
16180 cvt->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
16181 cvt->dw_loc_oprnd1.v.val_die_ref.die = type_die;
16182 cvt->dw_loc_oprnd1.v.val_die_ref.external = 0;
16183 add_loc_descr (&op0, cvt);
16184 if (is_a <scalar_int_mode> (mode, &int_mode)
16185 && (GET_CODE (rtl) == FIX
16186 || GET_MODE_SIZE (int_mode) < DWARF2_ADDR_SIZE))
16188 op0 = convert_descriptor_to_mode (int_mode, op0);
16189 if (op0 == NULL)
16190 break;
16192 mem_loc_result = op0;
16194 break;
16196 case CLZ:
16197 case CTZ:
16198 case FFS:
16199 if (is_a <scalar_int_mode> (mode, &int_mode))
16200 mem_loc_result = clz_loc_descriptor (rtl, int_mode, mem_mode);
16201 break;
16203 case POPCOUNT:
16204 case PARITY:
16205 if (is_a <scalar_int_mode> (mode, &int_mode))
16206 mem_loc_result = popcount_loc_descriptor (rtl, int_mode, mem_mode);
16207 break;
16209 case BSWAP:
16210 if (is_a <scalar_int_mode> (mode, &int_mode))
16211 mem_loc_result = bswap_loc_descriptor (rtl, int_mode, mem_mode);
16212 break;
16214 case ROTATE:
16215 case ROTATERT:
16216 if (is_a <scalar_int_mode> (mode, &int_mode))
16217 mem_loc_result = rotate_loc_descriptor (rtl, int_mode, mem_mode);
16218 break;
16220 case COMPARE:
16221 /* In theory, we could implement the above. */
16222 /* DWARF cannot represent the unsigned compare operations
16223 natively. */
16224 case SS_MULT:
16225 case US_MULT:
16226 case SS_DIV:
16227 case US_DIV:
16228 case SS_PLUS:
16229 case US_PLUS:
16230 case SS_MINUS:
16231 case US_MINUS:
16232 case SS_NEG:
16233 case US_NEG:
16234 case SS_ABS:
16235 case SS_ASHIFT:
16236 case US_ASHIFT:
16237 case SS_TRUNCATE:
16238 case US_TRUNCATE:
16239 case UNORDERED:
16240 case ORDERED:
16241 case UNEQ:
16242 case UNGE:
16243 case UNGT:
16244 case UNLE:
16245 case UNLT:
16246 case LTGT:
16247 case FRACT_CONVERT:
16248 case UNSIGNED_FRACT_CONVERT:
16249 case SAT_FRACT:
16250 case UNSIGNED_SAT_FRACT:
16251 case SQRT:
16252 case ASM_OPERANDS:
16253 case VEC_MERGE:
16254 case VEC_SELECT:
16255 case VEC_CONCAT:
16256 case VEC_DUPLICATE:
16257 case VEC_SERIES:
16258 case UNSPEC:
16259 case HIGH:
16260 case FMA:
16261 case STRICT_LOW_PART:
16262 case CONST_VECTOR:
16263 case CONST_FIXED:
16264 case CLRSB:
16265 case CLOBBER:
16266 /* If delegitimize_address couldn't do anything with the UNSPEC, we
16267 can't express it in the debug info. This can happen e.g. with some
16268 TLS UNSPECs. */
16269 break;
16271 case CONST_STRING:
16272 resolve_one_addr (&rtl);
16273 goto symref;
16275 /* RTL sequences inside PARALLEL record a series of DWARF operations for
16276 the expression. An UNSPEC rtx represents a raw DWARF operation,
16277 new_loc_descr is called for it to build the operation directly.
16278 Otherwise mem_loc_descriptor is called recursively. */
16279 case PARALLEL:
16281 int index = 0;
16282 dw_loc_descr_ref exp_result = NULL;
16284 for (; index < XVECLEN (rtl, 0); index++)
16286 rtx elem = XVECEXP (rtl, 0, index);
16287 if (GET_CODE (elem) == UNSPEC)
16289 /* Each DWARF operation UNSPEC contain two operands, if
16290 one operand is not used for the operation, const0_rtx is
16291 passed. */
16292 gcc_assert (XVECLEN (elem, 0) == 2);
16294 HOST_WIDE_INT dw_op = XINT (elem, 1);
16295 HOST_WIDE_INT oprnd1 = INTVAL (XVECEXP (elem, 0, 0));
16296 HOST_WIDE_INT oprnd2 = INTVAL (XVECEXP (elem, 0, 1));
16297 exp_result
16298 = new_loc_descr ((enum dwarf_location_atom) dw_op, oprnd1,
16299 oprnd2);
16301 else
16302 exp_result
16303 = mem_loc_descriptor (elem, mode, mem_mode,
16304 VAR_INIT_STATUS_INITIALIZED);
16306 if (!mem_loc_result)
16307 mem_loc_result = exp_result;
16308 else
16309 add_loc_descr (&mem_loc_result, exp_result);
16312 break;
16315 default:
16316 if (flag_checking)
16318 print_rtl (stderr, rtl);
16319 gcc_unreachable ();
16321 break;
16324 if (mem_loc_result && initialized == VAR_INIT_STATUS_UNINITIALIZED)
16325 add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
16327 return mem_loc_result;
16330 /* Return a descriptor that describes the concatenation of two locations.
16331 This is typically a complex variable. */
16333 static dw_loc_descr_ref
16334 concat_loc_descriptor (rtx x0, rtx x1, enum var_init_status initialized)
16336 /* At present we only track constant-sized pieces. */
16337 unsigned int size0, size1;
16338 if (!GET_MODE_SIZE (GET_MODE (x0)).is_constant (&size0)
16339 || !GET_MODE_SIZE (GET_MODE (x1)).is_constant (&size1))
16340 return 0;
16342 dw_loc_descr_ref cc_loc_result = NULL;
16343 dw_loc_descr_ref x0_ref
16344 = loc_descriptor (x0, VOIDmode, VAR_INIT_STATUS_INITIALIZED);
16345 dw_loc_descr_ref x1_ref
16346 = loc_descriptor (x1, VOIDmode, VAR_INIT_STATUS_INITIALIZED);
16348 if (x0_ref == 0 || x1_ref == 0)
16349 return 0;
16351 cc_loc_result = x0_ref;
16352 add_loc_descr_op_piece (&cc_loc_result, size0);
16354 add_loc_descr (&cc_loc_result, x1_ref);
16355 add_loc_descr_op_piece (&cc_loc_result, size1);
16357 if (initialized == VAR_INIT_STATUS_UNINITIALIZED)
16358 add_loc_descr (&cc_loc_result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
16360 return cc_loc_result;
16363 /* Return a descriptor that describes the concatenation of N
16364 locations. */
16366 static dw_loc_descr_ref
16367 concatn_loc_descriptor (rtx concatn, enum var_init_status initialized)
16369 unsigned int i;
16370 dw_loc_descr_ref cc_loc_result = NULL;
16371 unsigned int n = XVECLEN (concatn, 0);
16372 unsigned int size;
16374 for (i = 0; i < n; ++i)
16376 dw_loc_descr_ref ref;
16377 rtx x = XVECEXP (concatn, 0, i);
16379 /* At present we only track constant-sized pieces. */
16380 if (!GET_MODE_SIZE (GET_MODE (x)).is_constant (&size))
16381 return NULL;
16383 ref = loc_descriptor (x, VOIDmode, VAR_INIT_STATUS_INITIALIZED);
16384 if (ref == NULL)
16385 return NULL;
16387 add_loc_descr (&cc_loc_result, ref);
16388 add_loc_descr_op_piece (&cc_loc_result, size);
16391 if (cc_loc_result && initialized == VAR_INIT_STATUS_UNINITIALIZED)
16392 add_loc_descr (&cc_loc_result, new_loc_descr (DW_OP_GNU_uninit, 0, 0));
16394 return cc_loc_result;
16397 /* Helper function for loc_descriptor. Return DW_OP_implicit_pointer
16398 for DEBUG_IMPLICIT_PTR RTL. */
16400 static dw_loc_descr_ref
16401 implicit_ptr_descriptor (rtx rtl, HOST_WIDE_INT offset)
16403 dw_loc_descr_ref ret;
16404 dw_die_ref ref;
16406 if (dwarf_strict && dwarf_version < 5)
16407 return NULL;
16408 gcc_assert (TREE_CODE (DEBUG_IMPLICIT_PTR_DECL (rtl)) == VAR_DECL
16409 || TREE_CODE (DEBUG_IMPLICIT_PTR_DECL (rtl)) == PARM_DECL
16410 || TREE_CODE (DEBUG_IMPLICIT_PTR_DECL (rtl)) == RESULT_DECL);
16411 ref = lookup_decl_die (DEBUG_IMPLICIT_PTR_DECL (rtl));
16412 ret = new_loc_descr (dwarf_OP (DW_OP_implicit_pointer), 0, offset);
16413 ret->dw_loc_oprnd2.val_class = dw_val_class_const;
16414 if (ref)
16416 ret->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
16417 ret->dw_loc_oprnd1.v.val_die_ref.die = ref;
16418 ret->dw_loc_oprnd1.v.val_die_ref.external = 0;
16420 else
16422 ret->dw_loc_oprnd1.val_class = dw_val_class_decl_ref;
16423 ret->dw_loc_oprnd1.v.val_decl_ref = DEBUG_IMPLICIT_PTR_DECL (rtl);
16425 return ret;
16428 /* Output a proper Dwarf location descriptor for a variable or parameter
16429 which is either allocated in a register or in a memory location. For a
16430 register, we just generate an OP_REG and the register number. For a
16431 memory location we provide a Dwarf postfix expression describing how to
16432 generate the (dynamic) address of the object onto the address stack.
16434 MODE is mode of the decl if this loc_descriptor is going to be used in
16435 .debug_loc section where DW_OP_stack_value and DW_OP_implicit_value are
16436 allowed, VOIDmode otherwise.
16438 If we don't know how to describe it, return 0. */
16440 static dw_loc_descr_ref
16441 loc_descriptor (rtx rtl, machine_mode mode,
16442 enum var_init_status initialized)
16444 dw_loc_descr_ref loc_result = NULL;
16445 scalar_int_mode int_mode;
16447 switch (GET_CODE (rtl))
16449 case SUBREG:
16450 /* The case of a subreg may arise when we have a local (register)
16451 variable or a formal (register) parameter which doesn't quite fill
16452 up an entire register. For now, just assume that it is
16453 legitimate to make the Dwarf info refer to the whole register which
16454 contains the given subreg. */
16455 if (REG_P (SUBREG_REG (rtl)) && subreg_lowpart_p (rtl))
16456 loc_result = loc_descriptor (SUBREG_REG (rtl),
16457 GET_MODE (SUBREG_REG (rtl)), initialized);
16458 else
16459 goto do_default;
16460 break;
16462 case REG:
16463 loc_result = reg_loc_descriptor (rtl, initialized);
16464 break;
16466 case MEM:
16467 loc_result = mem_loc_descriptor (XEXP (rtl, 0), get_address_mode (rtl),
16468 GET_MODE (rtl), initialized);
16469 if (loc_result == NULL)
16470 loc_result = tls_mem_loc_descriptor (rtl);
16471 if (loc_result == NULL)
16473 rtx new_rtl = avoid_constant_pool_reference (rtl);
16474 if (new_rtl != rtl)
16475 loc_result = loc_descriptor (new_rtl, mode, initialized);
16477 break;
16479 case CONCAT:
16480 loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1),
16481 initialized);
16482 break;
16484 case CONCATN:
16485 loc_result = concatn_loc_descriptor (rtl, initialized);
16486 break;
16488 case VAR_LOCATION:
16489 /* Single part. */
16490 if (GET_CODE (PAT_VAR_LOCATION_LOC (rtl)) != PARALLEL)
16492 rtx loc = PAT_VAR_LOCATION_LOC (rtl);
16493 if (GET_CODE (loc) == EXPR_LIST)
16494 loc = XEXP (loc, 0);
16495 loc_result = loc_descriptor (loc, mode, initialized);
16496 break;
16499 rtl = XEXP (rtl, 1);
16500 /* FALLTHRU */
16502 case PARALLEL:
16504 rtvec par_elems = XVEC (rtl, 0);
16505 int num_elem = GET_NUM_ELEM (par_elems);
16506 machine_mode mode;
16507 int i, size;
16509 /* Create the first one, so we have something to add to. */
16510 loc_result = loc_descriptor (XEXP (RTVEC_ELT (par_elems, 0), 0),
16511 VOIDmode, initialized);
16512 if (loc_result == NULL)
16513 return NULL;
16514 mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, 0), 0));
16515 /* At present we only track constant-sized pieces. */
16516 if (!GET_MODE_SIZE (mode).is_constant (&size))
16517 return NULL;
16518 add_loc_descr_op_piece (&loc_result, size);
16519 for (i = 1; i < num_elem; i++)
16521 dw_loc_descr_ref temp;
16523 temp = loc_descriptor (XEXP (RTVEC_ELT (par_elems, i), 0),
16524 VOIDmode, initialized);
16525 if (temp == NULL)
16526 return NULL;
16527 add_loc_descr (&loc_result, temp);
16528 mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, i), 0));
16529 /* At present we only track constant-sized pieces. */
16530 if (!GET_MODE_SIZE (mode).is_constant (&size))
16531 return NULL;
16532 add_loc_descr_op_piece (&loc_result, size);
16535 break;
16537 case CONST_INT:
16538 if (mode != VOIDmode && mode != BLKmode)
16540 int_mode = as_a <scalar_int_mode> (mode);
16541 loc_result = address_of_int_loc_descriptor (GET_MODE_SIZE (int_mode),
16542 INTVAL (rtl));
16544 break;
16546 case CONST_DOUBLE:
16547 if (mode == VOIDmode)
16548 mode = GET_MODE (rtl);
16550 if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict))
16552 gcc_assert (mode == GET_MODE (rtl) || VOIDmode == GET_MODE (rtl));
16554 /* Note that a CONST_DOUBLE rtx could represent either an integer
16555 or a floating-point constant. A CONST_DOUBLE is used whenever
16556 the constant requires more than one word in order to be
16557 adequately represented. We output CONST_DOUBLEs as blocks. */
16558 scalar_mode smode = as_a <scalar_mode> (mode);
16559 loc_result = new_loc_descr (DW_OP_implicit_value,
16560 GET_MODE_SIZE (smode), 0);
16561 #if TARGET_SUPPORTS_WIDE_INT == 0
16562 if (!SCALAR_FLOAT_MODE_P (smode))
16564 loc_result->dw_loc_oprnd2.val_class = dw_val_class_const_double;
16565 loc_result->dw_loc_oprnd2.v.val_double
16566 = rtx_to_double_int (rtl);
16568 else
16569 #endif
16571 unsigned int length = GET_MODE_SIZE (smode);
16572 unsigned char *array = ggc_vec_alloc<unsigned char> (length);
16574 insert_float (rtl, array);
16575 loc_result->dw_loc_oprnd2.val_class = dw_val_class_vec;
16576 loc_result->dw_loc_oprnd2.v.val_vec.length = length / 4;
16577 loc_result->dw_loc_oprnd2.v.val_vec.elt_size = 4;
16578 loc_result->dw_loc_oprnd2.v.val_vec.array = array;
16581 break;
16583 case CONST_WIDE_INT:
16584 if (mode == VOIDmode)
16585 mode = GET_MODE (rtl);
16587 if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict))
16589 int_mode = as_a <scalar_int_mode> (mode);
16590 loc_result = new_loc_descr (DW_OP_implicit_value,
16591 GET_MODE_SIZE (int_mode), 0);
16592 loc_result->dw_loc_oprnd2.val_class = dw_val_class_wide_int;
16593 loc_result->dw_loc_oprnd2.v.val_wide = ggc_alloc<wide_int> ();
16594 *loc_result->dw_loc_oprnd2.v.val_wide = rtx_mode_t (rtl, int_mode);
16596 break;
16598 case CONST_VECTOR:
16599 if (mode == VOIDmode)
16600 mode = GET_MODE (rtl);
16602 if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict))
16604 unsigned int length;
16605 if (!CONST_VECTOR_NUNITS (rtl).is_constant (&length))
16606 return NULL;
16608 unsigned int elt_size = GET_MODE_UNIT_SIZE (GET_MODE (rtl));
16609 unsigned char *array
16610 = ggc_vec_alloc<unsigned char> (length * elt_size);
16611 unsigned int i;
16612 unsigned char *p;
16613 machine_mode imode = GET_MODE_INNER (mode);
16615 gcc_assert (mode == GET_MODE (rtl) || VOIDmode == GET_MODE (rtl));
16616 switch (GET_MODE_CLASS (mode))
16618 case MODE_VECTOR_INT:
16619 for (i = 0, p = array; i < length; i++, p += elt_size)
16621 rtx elt = CONST_VECTOR_ELT (rtl, i);
16622 insert_wide_int (rtx_mode_t (elt, imode), p, elt_size);
16624 break;
16626 case MODE_VECTOR_FLOAT:
16627 for (i = 0, p = array; i < length; i++, p += elt_size)
16629 rtx elt = CONST_VECTOR_ELT (rtl, i);
16630 insert_float (elt, p);
16632 break;
16634 default:
16635 gcc_unreachable ();
16638 loc_result = new_loc_descr (DW_OP_implicit_value,
16639 length * elt_size, 0);
16640 loc_result->dw_loc_oprnd2.val_class = dw_val_class_vec;
16641 loc_result->dw_loc_oprnd2.v.val_vec.length = length;
16642 loc_result->dw_loc_oprnd2.v.val_vec.elt_size = elt_size;
16643 loc_result->dw_loc_oprnd2.v.val_vec.array = array;
16645 break;
16647 case CONST:
16648 if (mode == VOIDmode
16649 || CONST_SCALAR_INT_P (XEXP (rtl, 0))
16650 || CONST_DOUBLE_AS_FLOAT_P (XEXP (rtl, 0))
16651 || GET_CODE (XEXP (rtl, 0)) == CONST_VECTOR)
16653 loc_result = loc_descriptor (XEXP (rtl, 0), mode, initialized);
16654 break;
16656 /* FALLTHROUGH */
16657 case SYMBOL_REF:
16658 if (!const_ok_for_output (rtl))
16659 break;
16660 /* FALLTHROUGH */
16661 case LABEL_REF:
16662 if (is_a <scalar_int_mode> (mode, &int_mode)
16663 && GET_MODE_SIZE (int_mode) == DWARF2_ADDR_SIZE
16664 && (dwarf_version >= 4 || !dwarf_strict))
16666 loc_result = new_addr_loc_descr (rtl, dtprel_false);
16667 add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0));
16668 vec_safe_push (used_rtx_array, rtl);
16670 break;
16672 case DEBUG_IMPLICIT_PTR:
16673 loc_result = implicit_ptr_descriptor (rtl, 0);
16674 break;
16676 case PLUS:
16677 if (GET_CODE (XEXP (rtl, 0)) == DEBUG_IMPLICIT_PTR
16678 && CONST_INT_P (XEXP (rtl, 1)))
16680 loc_result
16681 = implicit_ptr_descriptor (XEXP (rtl, 0), INTVAL (XEXP (rtl, 1)));
16682 break;
16684 /* FALLTHRU */
16685 do_default:
16686 default:
16687 if ((is_a <scalar_int_mode> (mode, &int_mode)
16688 && GET_MODE (rtl) == int_mode
16689 && GET_MODE_SIZE (int_mode) <= DWARF2_ADDR_SIZE
16690 && dwarf_version >= 4)
16691 || (!dwarf_strict && mode != VOIDmode && mode != BLKmode))
16693 /* Value expression. */
16694 loc_result = mem_loc_descriptor (rtl, mode, VOIDmode, initialized);
16695 if (loc_result)
16696 add_loc_descr (&loc_result,
16697 new_loc_descr (DW_OP_stack_value, 0, 0));
16699 break;
16702 return loc_result;
16705 /* We need to figure out what section we should use as the base for the
16706 address ranges where a given location is valid.
16707 1. If this particular DECL has a section associated with it, use that.
16708 2. If this function has a section associated with it, use that.
16709 3. Otherwise, use the text section.
16710 XXX: If you split a variable across multiple sections, we won't notice. */
16712 static const char *
16713 secname_for_decl (const_tree decl)
16715 const char *secname;
16717 if (VAR_OR_FUNCTION_DECL_P (decl)
16718 && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl) || TREE_STATIC (decl))
16719 && DECL_SECTION_NAME (decl))
16720 secname = DECL_SECTION_NAME (decl);
16721 else if (current_function_decl && DECL_SECTION_NAME (current_function_decl))
16722 secname = DECL_SECTION_NAME (current_function_decl);
16723 else if (cfun && in_cold_section_p)
16724 secname = crtl->subsections.cold_section_label;
16725 else
16726 secname = text_section_label;
16728 return secname;
16731 /* Return true when DECL_BY_REFERENCE is defined and set for DECL. */
16733 static bool
16734 decl_by_reference_p (tree decl)
16736 return ((TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == RESULT_DECL
16737 || VAR_P (decl))
16738 && DECL_BY_REFERENCE (decl));
16741 /* Helper function for dw_loc_list. Compute proper Dwarf location descriptor
16742 for VARLOC. */
16744 static dw_loc_descr_ref
16745 dw_loc_list_1 (tree loc, rtx varloc, int want_address,
16746 enum var_init_status initialized)
16748 int have_address = 0;
16749 dw_loc_descr_ref descr;
16750 machine_mode mode;
16752 if (want_address != 2)
16754 gcc_assert (GET_CODE (varloc) == VAR_LOCATION);
16755 /* Single part. */
16756 if (GET_CODE (PAT_VAR_LOCATION_LOC (varloc)) != PARALLEL)
16758 varloc = PAT_VAR_LOCATION_LOC (varloc);
16759 if (GET_CODE (varloc) == EXPR_LIST)
16760 varloc = XEXP (varloc, 0);
16761 mode = GET_MODE (varloc);
16762 if (MEM_P (varloc))
16764 rtx addr = XEXP (varloc, 0);
16765 descr = mem_loc_descriptor (addr, get_address_mode (varloc),
16766 mode, initialized);
16767 if (descr)
16768 have_address = 1;
16769 else
16771 rtx x = avoid_constant_pool_reference (varloc);
16772 if (x != varloc)
16773 descr = mem_loc_descriptor (x, mode, VOIDmode,
16774 initialized);
16777 else
16778 descr = mem_loc_descriptor (varloc, mode, VOIDmode, initialized);
16780 else
16781 return 0;
16783 else
16785 if (GET_CODE (varloc) == VAR_LOCATION)
16786 mode = DECL_MODE (PAT_VAR_LOCATION_DECL (varloc));
16787 else
16788 mode = DECL_MODE (loc);
16789 descr = loc_descriptor (varloc, mode, initialized);
16790 have_address = 1;
16793 if (!descr)
16794 return 0;
16796 if (want_address == 2 && !have_address
16797 && (dwarf_version >= 4 || !dwarf_strict))
16799 if (int_size_in_bytes (TREE_TYPE (loc)) > DWARF2_ADDR_SIZE)
16801 expansion_failed (loc, NULL_RTX,
16802 "DWARF address size mismatch");
16803 return 0;
16805 add_loc_descr (&descr, new_loc_descr (DW_OP_stack_value, 0, 0));
16806 have_address = 1;
16808 /* Show if we can't fill the request for an address. */
16809 if (want_address && !have_address)
16811 expansion_failed (loc, NULL_RTX,
16812 "Want address and only have value");
16813 return 0;
16816 /* If we've got an address and don't want one, dereference. */
16817 if (!want_address && have_address)
16819 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (loc));
16820 enum dwarf_location_atom op;
16822 if (size > DWARF2_ADDR_SIZE || size == -1)
16824 expansion_failed (loc, NULL_RTX,
16825 "DWARF address size mismatch");
16826 return 0;
16828 else if (size == DWARF2_ADDR_SIZE)
16829 op = DW_OP_deref;
16830 else
16831 op = DW_OP_deref_size;
16833 add_loc_descr (&descr, new_loc_descr (op, size, 0));
16836 return descr;
16839 /* Create a DW_OP_piece or DW_OP_bit_piece for bitsize, or return NULL
16840 if it is not possible. */
16842 static dw_loc_descr_ref
16843 new_loc_descr_op_bit_piece (HOST_WIDE_INT bitsize, HOST_WIDE_INT offset)
16845 if ((bitsize % BITS_PER_UNIT) == 0 && offset == 0)
16846 return new_loc_descr (DW_OP_piece, bitsize / BITS_PER_UNIT, 0);
16847 else if (dwarf_version >= 3 || !dwarf_strict)
16848 return new_loc_descr (DW_OP_bit_piece, bitsize, offset);
16849 else
16850 return NULL;
16853 /* Helper function for dw_loc_list. Compute proper Dwarf location descriptor
16854 for VAR_LOC_NOTE for variable DECL that has been optimized by SRA. */
16856 static dw_loc_descr_ref
16857 dw_sra_loc_expr (tree decl, rtx loc)
16859 rtx p;
16860 unsigned HOST_WIDE_INT padsize = 0;
16861 dw_loc_descr_ref descr, *descr_tail;
16862 unsigned HOST_WIDE_INT decl_size;
16863 rtx varloc;
16864 enum var_init_status initialized;
16866 if (DECL_SIZE (decl) == NULL
16867 || !tree_fits_uhwi_p (DECL_SIZE (decl)))
16868 return NULL;
16870 decl_size = tree_to_uhwi (DECL_SIZE (decl));
16871 descr = NULL;
16872 descr_tail = &descr;
16874 for (p = loc; p; p = XEXP (p, 1))
16876 unsigned HOST_WIDE_INT bitsize = decl_piece_bitsize (p);
16877 rtx loc_note = *decl_piece_varloc_ptr (p);
16878 dw_loc_descr_ref cur_descr;
16879 dw_loc_descr_ref *tail, last = NULL;
16880 unsigned HOST_WIDE_INT opsize = 0;
16882 if (loc_note == NULL_RTX
16883 || NOTE_VAR_LOCATION_LOC (loc_note) == NULL_RTX)
16885 padsize += bitsize;
16886 continue;
16888 initialized = NOTE_VAR_LOCATION_STATUS (loc_note);
16889 varloc = NOTE_VAR_LOCATION (loc_note);
16890 cur_descr = dw_loc_list_1 (decl, varloc, 2, initialized);
16891 if (cur_descr == NULL)
16893 padsize += bitsize;
16894 continue;
16897 /* Check that cur_descr either doesn't use
16898 DW_OP_*piece operations, or their sum is equal
16899 to bitsize. Otherwise we can't embed it. */
16900 for (tail = &cur_descr; *tail != NULL;
16901 tail = &(*tail)->dw_loc_next)
16902 if ((*tail)->dw_loc_opc == DW_OP_piece)
16904 opsize += (*tail)->dw_loc_oprnd1.v.val_unsigned
16905 * BITS_PER_UNIT;
16906 last = *tail;
16908 else if ((*tail)->dw_loc_opc == DW_OP_bit_piece)
16910 opsize += (*tail)->dw_loc_oprnd1.v.val_unsigned;
16911 last = *tail;
16914 if (last != NULL && opsize != bitsize)
16916 padsize += bitsize;
16917 /* Discard the current piece of the descriptor and release any
16918 addr_table entries it uses. */
16919 remove_loc_list_addr_table_entries (cur_descr);
16920 continue;
16923 /* If there is a hole, add DW_OP_*piece after empty DWARF
16924 expression, which means that those bits are optimized out. */
16925 if (padsize)
16927 if (padsize > decl_size)
16929 remove_loc_list_addr_table_entries (cur_descr);
16930 goto discard_descr;
16932 decl_size -= padsize;
16933 *descr_tail = new_loc_descr_op_bit_piece (padsize, 0);
16934 if (*descr_tail == NULL)
16936 remove_loc_list_addr_table_entries (cur_descr);
16937 goto discard_descr;
16939 descr_tail = &(*descr_tail)->dw_loc_next;
16940 padsize = 0;
16942 *descr_tail = cur_descr;
16943 descr_tail = tail;
16944 if (bitsize > decl_size)
16945 goto discard_descr;
16946 decl_size -= bitsize;
16947 if (last == NULL)
16949 HOST_WIDE_INT offset = 0;
16950 if (GET_CODE (varloc) == VAR_LOCATION
16951 && GET_CODE (PAT_VAR_LOCATION_LOC (varloc)) != PARALLEL)
16953 varloc = PAT_VAR_LOCATION_LOC (varloc);
16954 if (GET_CODE (varloc) == EXPR_LIST)
16955 varloc = XEXP (varloc, 0);
16959 if (GET_CODE (varloc) == CONST
16960 || GET_CODE (varloc) == SIGN_EXTEND
16961 || GET_CODE (varloc) == ZERO_EXTEND)
16962 varloc = XEXP (varloc, 0);
16963 else if (GET_CODE (varloc) == SUBREG)
16964 varloc = SUBREG_REG (varloc);
16965 else
16966 break;
16968 while (1);
16969 /* DW_OP_bit_size offset should be zero for register
16970 or implicit location descriptions and empty location
16971 descriptions, but for memory addresses needs big endian
16972 adjustment. */
16973 if (MEM_P (varloc))
16975 unsigned HOST_WIDE_INT memsize;
16976 if (!poly_uint64 (MEM_SIZE (varloc)).is_constant (&memsize))
16977 goto discard_descr;
16978 memsize *= BITS_PER_UNIT;
16979 if (memsize != bitsize)
16981 if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
16982 && (memsize > BITS_PER_WORD || bitsize > BITS_PER_WORD))
16983 goto discard_descr;
16984 if (memsize < bitsize)
16985 goto discard_descr;
16986 if (BITS_BIG_ENDIAN)
16987 offset = memsize - bitsize;
16991 *descr_tail = new_loc_descr_op_bit_piece (bitsize, offset);
16992 if (*descr_tail == NULL)
16993 goto discard_descr;
16994 descr_tail = &(*descr_tail)->dw_loc_next;
16998 /* If there were any non-empty expressions, add padding till the end of
16999 the decl. */
17000 if (descr != NULL && decl_size != 0)
17002 *descr_tail = new_loc_descr_op_bit_piece (decl_size, 0);
17003 if (*descr_tail == NULL)
17004 goto discard_descr;
17006 return descr;
17008 discard_descr:
17009 /* Discard the descriptor and release any addr_table entries it uses. */
17010 remove_loc_list_addr_table_entries (descr);
17011 return NULL;
17014 /* Return the dwarf representation of the location list LOC_LIST of
17015 DECL. WANT_ADDRESS has the same meaning as in loc_list_from_tree
17016 function. */
17018 static dw_loc_list_ref
17019 dw_loc_list (var_loc_list *loc_list, tree decl, int want_address)
17021 const char *endname, *secname;
17022 var_loc_view endview;
17023 rtx varloc;
17024 enum var_init_status initialized;
17025 struct var_loc_node *node;
17026 dw_loc_descr_ref descr;
17027 char label_id[MAX_ARTIFICIAL_LABEL_BYTES];
17028 dw_loc_list_ref list = NULL;
17029 dw_loc_list_ref *listp = &list;
17031 /* Now that we know what section we are using for a base,
17032 actually construct the list of locations.
17033 The first location information is what is passed to the
17034 function that creates the location list, and the remaining
17035 locations just get added on to that list.
17036 Note that we only know the start address for a location
17037 (IE location changes), so to build the range, we use
17038 the range [current location start, next location start].
17039 This means we have to special case the last node, and generate
17040 a range of [last location start, end of function label]. */
17042 if (cfun && crtl->has_bb_partition)
17044 bool save_in_cold_section_p = in_cold_section_p;
17045 in_cold_section_p = first_function_block_is_cold;
17046 if (loc_list->last_before_switch == NULL)
17047 in_cold_section_p = !in_cold_section_p;
17048 secname = secname_for_decl (decl);
17049 in_cold_section_p = save_in_cold_section_p;
17051 else
17052 secname = secname_for_decl (decl);
17054 for (node = loc_list->first; node; node = node->next)
17056 bool range_across_switch = false;
17057 if (GET_CODE (node->loc) == EXPR_LIST
17058 || NOTE_VAR_LOCATION_LOC (node->loc) != NULL_RTX)
17060 if (GET_CODE (node->loc) == EXPR_LIST)
17062 descr = NULL;
17063 /* This requires DW_OP_{,bit_}piece, which is not usable
17064 inside DWARF expressions. */
17065 if (want_address == 2)
17066 descr = dw_sra_loc_expr (decl, node->loc);
17068 else
17070 initialized = NOTE_VAR_LOCATION_STATUS (node->loc);
17071 varloc = NOTE_VAR_LOCATION (node->loc);
17072 descr = dw_loc_list_1 (decl, varloc, want_address, initialized);
17074 if (descr)
17076 /* If section switch happens in between node->label
17077 and node->next->label (or end of function) and
17078 we can't emit it as a single entry list,
17079 emit two ranges, first one ending at the end
17080 of first partition and second one starting at the
17081 beginning of second partition. */
17082 if (node == loc_list->last_before_switch
17083 && (node != loc_list->first || loc_list->first->next)
17084 && current_function_decl)
17086 endname = cfun->fde->dw_fde_end;
17087 endview = 0;
17088 range_across_switch = true;
17090 /* The variable has a location between NODE->LABEL and
17091 NODE->NEXT->LABEL. */
17092 else if (node->next)
17093 endname = node->next->label, endview = node->next->view;
17094 /* If the variable has a location at the last label
17095 it keeps its location until the end of function. */
17096 else if (!current_function_decl)
17097 endname = text_end_label, endview = 0;
17098 else
17100 ASM_GENERATE_INTERNAL_LABEL (label_id, FUNC_END_LABEL,
17101 current_function_funcdef_no);
17102 endname = ggc_strdup (label_id);
17103 endview = 0;
17106 *listp = new_loc_list (descr, node->label, node->view,
17107 endname, endview, secname);
17108 if (TREE_CODE (decl) == PARM_DECL
17109 && node == loc_list->first
17110 && NOTE_P (node->loc)
17111 && strcmp (node->label, endname) == 0)
17112 (*listp)->force = true;
17113 listp = &(*listp)->dw_loc_next;
17117 if (cfun
17118 && crtl->has_bb_partition
17119 && node == loc_list->last_before_switch)
17121 bool save_in_cold_section_p = in_cold_section_p;
17122 in_cold_section_p = !first_function_block_is_cold;
17123 secname = secname_for_decl (decl);
17124 in_cold_section_p = save_in_cold_section_p;
17127 if (range_across_switch)
17129 if (GET_CODE (node->loc) == EXPR_LIST)
17130 descr = dw_sra_loc_expr (decl, node->loc);
17131 else
17133 initialized = NOTE_VAR_LOCATION_STATUS (node->loc);
17134 varloc = NOTE_VAR_LOCATION (node->loc);
17135 descr = dw_loc_list_1 (decl, varloc, want_address,
17136 initialized);
17138 gcc_assert (descr);
17139 /* The variable has a location between NODE->LABEL and
17140 NODE->NEXT->LABEL. */
17141 if (node->next)
17142 endname = node->next->label, endview = node->next->view;
17143 else
17144 endname = cfun->fde->dw_fde_second_end, endview = 0;
17145 *listp = new_loc_list (descr, cfun->fde->dw_fde_second_begin, 0,
17146 endname, endview, secname);
17147 listp = &(*listp)->dw_loc_next;
17151 /* Try to avoid the overhead of a location list emitting a location
17152 expression instead, but only if we didn't have more than one
17153 location entry in the first place. If some entries were not
17154 representable, we don't want to pretend a single entry that was
17155 applies to the entire scope in which the variable is
17156 available. */
17157 if (list && loc_list->first->next)
17158 gen_llsym (list);
17159 else
17160 maybe_gen_llsym (list);
17162 return list;
17165 /* Return if the loc_list has only single element and thus can be represented
17166 as location description. */
17168 static bool
17169 single_element_loc_list_p (dw_loc_list_ref list)
17171 gcc_assert (!list->dw_loc_next || list->ll_symbol);
17172 return !list->ll_symbol;
17175 /* Duplicate a single element of location list. */
17177 static inline dw_loc_descr_ref
17178 copy_loc_descr (dw_loc_descr_ref ref)
17180 dw_loc_descr_ref copy = ggc_alloc<dw_loc_descr_node> ();
17181 memcpy (copy, ref, sizeof (dw_loc_descr_node));
17182 return copy;
17185 /* To each location in list LIST append loc descr REF. */
17187 static void
17188 add_loc_descr_to_each (dw_loc_list_ref list, dw_loc_descr_ref ref)
17190 dw_loc_descr_ref copy;
17191 add_loc_descr (&list->expr, ref);
17192 list = list->dw_loc_next;
17193 while (list)
17195 copy = copy_loc_descr (ref);
17196 add_loc_descr (&list->expr, copy);
17197 while (copy->dw_loc_next)
17198 copy = copy->dw_loc_next = copy_loc_descr (copy->dw_loc_next);
17199 list = list->dw_loc_next;
17203 /* To each location in list LIST prepend loc descr REF. */
17205 static void
17206 prepend_loc_descr_to_each (dw_loc_list_ref list, dw_loc_descr_ref ref)
17208 dw_loc_descr_ref copy;
17209 dw_loc_descr_ref ref_end = list->expr;
17210 add_loc_descr (&ref, list->expr);
17211 list->expr = ref;
17212 list = list->dw_loc_next;
17213 while (list)
17215 dw_loc_descr_ref end = list->expr;
17216 list->expr = copy = copy_loc_descr (ref);
17217 while (copy->dw_loc_next != ref_end)
17218 copy = copy->dw_loc_next = copy_loc_descr (copy->dw_loc_next);
17219 copy->dw_loc_next = end;
17220 list = list->dw_loc_next;
17224 /* Given two lists RET and LIST
17225 produce location list that is result of adding expression in LIST
17226 to expression in RET on each position in program.
17227 Might be destructive on both RET and LIST.
17229 TODO: We handle only simple cases of RET or LIST having at most one
17230 element. General case would involve sorting the lists in program order
17231 and merging them that will need some additional work.
17232 Adding that will improve quality of debug info especially for SRA-ed
17233 structures. */
17235 static void
17236 add_loc_list (dw_loc_list_ref *ret, dw_loc_list_ref list)
17238 if (!list)
17239 return;
17240 if (!*ret)
17242 *ret = list;
17243 return;
17245 if (!list->dw_loc_next)
17247 add_loc_descr_to_each (*ret, list->expr);
17248 return;
17250 if (!(*ret)->dw_loc_next)
17252 prepend_loc_descr_to_each (list, (*ret)->expr);
17253 *ret = list;
17254 return;
17256 expansion_failed (NULL_TREE, NULL_RTX,
17257 "Don't know how to merge two non-trivial"
17258 " location lists.\n");
17259 *ret = NULL;
17260 return;
17263 /* LOC is constant expression. Try a luck, look it up in constant
17264 pool and return its loc_descr of its address. */
17266 static dw_loc_descr_ref
17267 cst_pool_loc_descr (tree loc)
17269 /* Get an RTL for this, if something has been emitted. */
17270 rtx rtl = lookup_constant_def (loc);
17272 if (!rtl || !MEM_P (rtl))
17274 gcc_assert (!rtl);
17275 return 0;
17277 gcc_assert (GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF);
17279 /* TODO: We might get more coverage if we was actually delaying expansion
17280 of all expressions till end of compilation when constant pools are fully
17281 populated. */
17282 if (!TREE_ASM_WRITTEN (SYMBOL_REF_DECL (XEXP (rtl, 0))))
17284 expansion_failed (loc, NULL_RTX,
17285 "CST value in contant pool but not marked.");
17286 return 0;
17288 return mem_loc_descriptor (XEXP (rtl, 0), get_address_mode (rtl),
17289 GET_MODE (rtl), VAR_INIT_STATUS_INITIALIZED);
17292 /* Return dw_loc_list representing address of addr_expr LOC
17293 by looking for inner INDIRECT_REF expression and turning
17294 it into simple arithmetics.
17296 See loc_list_from_tree for the meaning of CONTEXT. */
17298 static dw_loc_list_ref
17299 loc_list_for_address_of_addr_expr_of_indirect_ref (tree loc, bool toplev,
17300 loc_descr_context *context)
17302 tree obj, offset;
17303 poly_int64 bitsize, bitpos, bytepos;
17304 machine_mode mode;
17305 int unsignedp, reversep, volatilep = 0;
17306 dw_loc_list_ref list_ret = NULL, list_ret1 = NULL;
17308 obj = get_inner_reference (TREE_OPERAND (loc, 0),
17309 &bitsize, &bitpos, &offset, &mode,
17310 &unsignedp, &reversep, &volatilep);
17311 STRIP_NOPS (obj);
17312 if (!multiple_p (bitpos, BITS_PER_UNIT, &bytepos))
17314 expansion_failed (loc, NULL_RTX, "bitfield access");
17315 return 0;
17317 if (!INDIRECT_REF_P (obj))
17319 expansion_failed (obj,
17320 NULL_RTX, "no indirect ref in inner refrence");
17321 return 0;
17323 if (!offset && known_eq (bitpos, 0))
17324 list_ret = loc_list_from_tree (TREE_OPERAND (obj, 0), toplev ? 2 : 1,
17325 context);
17326 else if (toplev
17327 && int_size_in_bytes (TREE_TYPE (loc)) <= DWARF2_ADDR_SIZE
17328 && (dwarf_version >= 4 || !dwarf_strict))
17330 list_ret = loc_list_from_tree (TREE_OPERAND (obj, 0), 0, context);
17331 if (!list_ret)
17332 return 0;
17333 if (offset)
17335 /* Variable offset. */
17336 list_ret1 = loc_list_from_tree (offset, 0, context);
17337 if (list_ret1 == 0)
17338 return 0;
17339 add_loc_list (&list_ret, list_ret1);
17340 if (!list_ret)
17341 return 0;
17342 add_loc_descr_to_each (list_ret,
17343 new_loc_descr (DW_OP_plus, 0, 0));
17345 HOST_WIDE_INT value;
17346 if (bytepos.is_constant (&value) && value > 0)
17347 add_loc_descr_to_each (list_ret,
17348 new_loc_descr (DW_OP_plus_uconst, value, 0));
17349 else if (maybe_ne (bytepos, 0))
17350 loc_list_plus_const (list_ret, bytepos);
17351 add_loc_descr_to_each (list_ret,
17352 new_loc_descr (DW_OP_stack_value, 0, 0));
17354 return list_ret;
17357 /* Set LOC to the next operation that is not a DW_OP_nop operation. In the case
17358 all operations from LOC are nops, move to the last one. Insert in NOPS all
17359 operations that are skipped. */
17361 static void
17362 loc_descr_to_next_no_nop (dw_loc_descr_ref &loc,
17363 hash_set<dw_loc_descr_ref> &nops)
17365 while (loc->dw_loc_next != NULL && loc->dw_loc_opc == DW_OP_nop)
17367 nops.add (loc);
17368 loc = loc->dw_loc_next;
17372 /* Helper for loc_descr_without_nops: free the location description operation
17373 P. */
17375 bool
17376 free_loc_descr (const dw_loc_descr_ref &loc, void *data ATTRIBUTE_UNUSED)
17378 ggc_free (loc);
17379 return true;
17382 /* Remove all DW_OP_nop operations from LOC except, if it exists, the one that
17383 finishes LOC. */
17385 static void
17386 loc_descr_without_nops (dw_loc_descr_ref &loc)
17388 if (loc->dw_loc_opc == DW_OP_nop && loc->dw_loc_next == NULL)
17389 return;
17391 /* Set of all DW_OP_nop operations we remove. */
17392 hash_set<dw_loc_descr_ref> nops;
17394 /* First, strip all prefix NOP operations in order to keep the head of the
17395 operations list. */
17396 loc_descr_to_next_no_nop (loc, nops);
17398 for (dw_loc_descr_ref cur = loc; cur != NULL;)
17400 /* For control flow operations: strip "prefix" nops in destination
17401 labels. */
17402 if (cur->dw_loc_oprnd1.val_class == dw_val_class_loc)
17403 loc_descr_to_next_no_nop (cur->dw_loc_oprnd1.v.val_loc, nops);
17404 if (cur->dw_loc_oprnd2.val_class == dw_val_class_loc)
17405 loc_descr_to_next_no_nop (cur->dw_loc_oprnd2.v.val_loc, nops);
17407 /* Do the same for the operations that follow, then move to the next
17408 iteration. */
17409 if (cur->dw_loc_next != NULL)
17410 loc_descr_to_next_no_nop (cur->dw_loc_next, nops);
17411 cur = cur->dw_loc_next;
17414 nops.traverse<void *, free_loc_descr> (NULL);
17418 struct dwarf_procedure_info;
17420 /* Helper structure for location descriptions generation. */
17421 struct loc_descr_context
17423 /* The type that is implicitly referenced by DW_OP_push_object_address, or
17424 NULL_TREE if DW_OP_push_object_address in invalid for this location
17425 description. This is used when processing PLACEHOLDER_EXPR nodes. */
17426 tree context_type;
17427 /* The ..._DECL node that should be translated as a
17428 DW_OP_push_object_address operation. */
17429 tree base_decl;
17430 /* Information about the DWARF procedure we are currently generating. NULL if
17431 we are not generating a DWARF procedure. */
17432 struct dwarf_procedure_info *dpi;
17433 /* True if integral PLACEHOLDER_EXPR stands for the first argument passed
17434 by consumer. Used for DW_TAG_generic_subrange attributes. */
17435 bool placeholder_arg;
17436 /* True if PLACEHOLDER_EXPR has been seen. */
17437 bool placeholder_seen;
17440 /* DWARF procedures generation
17442 DWARF expressions (aka. location descriptions) are used to encode variable
17443 things such as sizes or offsets. Such computations can have redundant parts
17444 that can be factorized in order to reduce the size of the output debug
17445 information. This is the whole point of DWARF procedures.
17447 Thanks to stor-layout.c, size and offset expressions in GENERIC trees are
17448 already factorized into functions ("size functions") in order to handle very
17449 big and complex types. Such functions are quite simple: they have integral
17450 arguments, they return an integral result and their body contains only a
17451 return statement with arithmetic expressions. This is the only kind of
17452 function we are interested in translating into DWARF procedures, here.
17454 DWARF expressions and DWARF procedure are executed using a stack, so we have
17455 to define some calling convention for them to interact. Let's say that:
17457 - Before calling a DWARF procedure, DWARF expressions must push on the stack
17458 all arguments in reverse order (right-to-left) so that when the DWARF
17459 procedure execution starts, the first argument is the top of the stack.
17461 - Then, when returning, the DWARF procedure must have consumed all arguments
17462 on the stack, must have pushed the result and touched nothing else.
17464 - Each integral argument and the result are integral types can be hold in a
17465 single stack slot.
17467 - We call "frame offset" the number of stack slots that are "under DWARF
17468 procedure control": it includes the arguments slots, the temporaries and
17469 the result slot. Thus, it is equal to the number of arguments when the
17470 procedure execution starts and must be equal to one (the result) when it
17471 returns. */
17473 /* Helper structure used when generating operations for a DWARF procedure. */
17474 struct dwarf_procedure_info
17476 /* The FUNCTION_DECL node corresponding to the DWARF procedure that is
17477 currently translated. */
17478 tree fndecl;
17479 /* The number of arguments FNDECL takes. */
17480 unsigned args_count;
17483 /* Return a pointer to a newly created DIE node for a DWARF procedure. Add
17484 LOCATION as its DW_AT_location attribute. If FNDECL is not NULL_TREE,
17485 equate it to this DIE. */
17487 static dw_die_ref
17488 new_dwarf_proc_die (dw_loc_descr_ref location, tree fndecl,
17489 dw_die_ref parent_die)
17491 dw_die_ref dwarf_proc_die;
17493 if ((dwarf_version < 3 && dwarf_strict)
17494 || location == NULL)
17495 return NULL;
17497 dwarf_proc_die = new_die (DW_TAG_dwarf_procedure, parent_die, fndecl);
17498 if (fndecl)
17499 equate_decl_number_to_die (fndecl, dwarf_proc_die);
17500 add_AT_loc (dwarf_proc_die, DW_AT_location, location);
17501 return dwarf_proc_die;
17504 /* Return whether TYPE is a supported type as a DWARF procedure argument
17505 type or return type (we handle only scalar types and pointer types that
17506 aren't wider than the DWARF expression evaluation stack. */
17508 static bool
17509 is_handled_procedure_type (tree type)
17511 return ((INTEGRAL_TYPE_P (type)
17512 || TREE_CODE (type) == OFFSET_TYPE
17513 || TREE_CODE (type) == POINTER_TYPE)
17514 && int_size_in_bytes (type) <= DWARF2_ADDR_SIZE);
17517 /* Helper for resolve_args_picking: do the same but stop when coming across
17518 visited nodes. For each node we visit, register in FRAME_OFFSETS the frame
17519 offset *before* evaluating the corresponding operation. */
17521 static bool
17522 resolve_args_picking_1 (dw_loc_descr_ref loc, unsigned initial_frame_offset,
17523 struct dwarf_procedure_info *dpi,
17524 hash_map<dw_loc_descr_ref, unsigned> &frame_offsets)
17526 /* The "frame_offset" identifier is already used to name a macro... */
17527 unsigned frame_offset_ = initial_frame_offset;
17528 dw_loc_descr_ref l;
17530 for (l = loc; l != NULL;)
17532 bool existed;
17533 unsigned &l_frame_offset = frame_offsets.get_or_insert (l, &existed);
17535 /* If we already met this node, there is nothing to compute anymore. */
17536 if (existed)
17538 /* Make sure that the stack size is consistent wherever the execution
17539 flow comes from. */
17540 gcc_assert ((unsigned) l_frame_offset == frame_offset_);
17541 break;
17543 l_frame_offset = frame_offset_;
17545 /* If needed, relocate the picking offset with respect to the frame
17546 offset. */
17547 if (l->frame_offset_rel)
17549 unsigned HOST_WIDE_INT off;
17550 switch (l->dw_loc_opc)
17552 case DW_OP_pick:
17553 off = l->dw_loc_oprnd1.v.val_unsigned;
17554 break;
17555 case DW_OP_dup:
17556 off = 0;
17557 break;
17558 case DW_OP_over:
17559 off = 1;
17560 break;
17561 default:
17562 gcc_unreachable ();
17564 /* frame_offset_ is the size of the current stack frame, including
17565 incoming arguments. Besides, the arguments are pushed
17566 right-to-left. Thus, in order to access the Nth argument from
17567 this operation node, the picking has to skip temporaries *plus*
17568 one stack slot per argument (0 for the first one, 1 for the second
17569 one, etc.).
17571 The targetted argument number (N) is already set as the operand,
17572 and the number of temporaries can be computed with:
17573 frame_offsets_ - dpi->args_count */
17574 off += frame_offset_ - dpi->args_count;
17576 /* DW_OP_pick handles only offsets from 0 to 255 (inclusive)... */
17577 if (off > 255)
17578 return false;
17580 if (off == 0)
17582 l->dw_loc_opc = DW_OP_dup;
17583 l->dw_loc_oprnd1.v.val_unsigned = 0;
17585 else if (off == 1)
17587 l->dw_loc_opc = DW_OP_over;
17588 l->dw_loc_oprnd1.v.val_unsigned = 0;
17590 else
17592 l->dw_loc_opc = DW_OP_pick;
17593 l->dw_loc_oprnd1.v.val_unsigned = off;
17597 /* Update frame_offset according to the effect the current operation has
17598 on the stack. */
17599 switch (l->dw_loc_opc)
17601 case DW_OP_deref:
17602 case DW_OP_swap:
17603 case DW_OP_rot:
17604 case DW_OP_abs:
17605 case DW_OP_neg:
17606 case DW_OP_not:
17607 case DW_OP_plus_uconst:
17608 case DW_OP_skip:
17609 case DW_OP_reg0:
17610 case DW_OP_reg1:
17611 case DW_OP_reg2:
17612 case DW_OP_reg3:
17613 case DW_OP_reg4:
17614 case DW_OP_reg5:
17615 case DW_OP_reg6:
17616 case DW_OP_reg7:
17617 case DW_OP_reg8:
17618 case DW_OP_reg9:
17619 case DW_OP_reg10:
17620 case DW_OP_reg11:
17621 case DW_OP_reg12:
17622 case DW_OP_reg13:
17623 case DW_OP_reg14:
17624 case DW_OP_reg15:
17625 case DW_OP_reg16:
17626 case DW_OP_reg17:
17627 case DW_OP_reg18:
17628 case DW_OP_reg19:
17629 case DW_OP_reg20:
17630 case DW_OP_reg21:
17631 case DW_OP_reg22:
17632 case DW_OP_reg23:
17633 case DW_OP_reg24:
17634 case DW_OP_reg25:
17635 case DW_OP_reg26:
17636 case DW_OP_reg27:
17637 case DW_OP_reg28:
17638 case DW_OP_reg29:
17639 case DW_OP_reg30:
17640 case DW_OP_reg31:
17641 case DW_OP_bregx:
17642 case DW_OP_piece:
17643 case DW_OP_deref_size:
17644 case DW_OP_nop:
17645 case DW_OP_bit_piece:
17646 case DW_OP_implicit_value:
17647 case DW_OP_stack_value:
17648 break;
17650 case DW_OP_addr:
17651 case DW_OP_const1u:
17652 case DW_OP_const1s:
17653 case DW_OP_const2u:
17654 case DW_OP_const2s:
17655 case DW_OP_const4u:
17656 case DW_OP_const4s:
17657 case DW_OP_const8u:
17658 case DW_OP_const8s:
17659 case DW_OP_constu:
17660 case DW_OP_consts:
17661 case DW_OP_dup:
17662 case DW_OP_over:
17663 case DW_OP_pick:
17664 case DW_OP_lit0:
17665 case DW_OP_lit1:
17666 case DW_OP_lit2:
17667 case DW_OP_lit3:
17668 case DW_OP_lit4:
17669 case DW_OP_lit5:
17670 case DW_OP_lit6:
17671 case DW_OP_lit7:
17672 case DW_OP_lit8:
17673 case DW_OP_lit9:
17674 case DW_OP_lit10:
17675 case DW_OP_lit11:
17676 case DW_OP_lit12:
17677 case DW_OP_lit13:
17678 case DW_OP_lit14:
17679 case DW_OP_lit15:
17680 case DW_OP_lit16:
17681 case DW_OP_lit17:
17682 case DW_OP_lit18:
17683 case DW_OP_lit19:
17684 case DW_OP_lit20:
17685 case DW_OP_lit21:
17686 case DW_OP_lit22:
17687 case DW_OP_lit23:
17688 case DW_OP_lit24:
17689 case DW_OP_lit25:
17690 case DW_OP_lit26:
17691 case DW_OP_lit27:
17692 case DW_OP_lit28:
17693 case DW_OP_lit29:
17694 case DW_OP_lit30:
17695 case DW_OP_lit31:
17696 case DW_OP_breg0:
17697 case DW_OP_breg1:
17698 case DW_OP_breg2:
17699 case DW_OP_breg3:
17700 case DW_OP_breg4:
17701 case DW_OP_breg5:
17702 case DW_OP_breg6:
17703 case DW_OP_breg7:
17704 case DW_OP_breg8:
17705 case DW_OP_breg9:
17706 case DW_OP_breg10:
17707 case DW_OP_breg11:
17708 case DW_OP_breg12:
17709 case DW_OP_breg13:
17710 case DW_OP_breg14:
17711 case DW_OP_breg15:
17712 case DW_OP_breg16:
17713 case DW_OP_breg17:
17714 case DW_OP_breg18:
17715 case DW_OP_breg19:
17716 case DW_OP_breg20:
17717 case DW_OP_breg21:
17718 case DW_OP_breg22:
17719 case DW_OP_breg23:
17720 case DW_OP_breg24:
17721 case DW_OP_breg25:
17722 case DW_OP_breg26:
17723 case DW_OP_breg27:
17724 case DW_OP_breg28:
17725 case DW_OP_breg29:
17726 case DW_OP_breg30:
17727 case DW_OP_breg31:
17728 case DW_OP_fbreg:
17729 case DW_OP_push_object_address:
17730 case DW_OP_call_frame_cfa:
17731 case DW_OP_GNU_variable_value:
17732 ++frame_offset_;
17733 break;
17735 case DW_OP_drop:
17736 case DW_OP_xderef:
17737 case DW_OP_and:
17738 case DW_OP_div:
17739 case DW_OP_minus:
17740 case DW_OP_mod:
17741 case DW_OP_mul:
17742 case DW_OP_or:
17743 case DW_OP_plus:
17744 case DW_OP_shl:
17745 case DW_OP_shr:
17746 case DW_OP_shra:
17747 case DW_OP_xor:
17748 case DW_OP_bra:
17749 case DW_OP_eq:
17750 case DW_OP_ge:
17751 case DW_OP_gt:
17752 case DW_OP_le:
17753 case DW_OP_lt:
17754 case DW_OP_ne:
17755 case DW_OP_regx:
17756 case DW_OP_xderef_size:
17757 --frame_offset_;
17758 break;
17760 case DW_OP_call2:
17761 case DW_OP_call4:
17762 case DW_OP_call_ref:
17764 dw_die_ref dwarf_proc = l->dw_loc_oprnd1.v.val_die_ref.die;
17765 int *stack_usage = dwarf_proc_stack_usage_map->get (dwarf_proc);
17767 if (stack_usage == NULL)
17768 return false;
17769 frame_offset_ += *stack_usage;
17770 break;
17773 case DW_OP_implicit_pointer:
17774 case DW_OP_entry_value:
17775 case DW_OP_const_type:
17776 case DW_OP_regval_type:
17777 case DW_OP_deref_type:
17778 case DW_OP_convert:
17779 case DW_OP_reinterpret:
17780 case DW_OP_form_tls_address:
17781 case DW_OP_GNU_push_tls_address:
17782 case DW_OP_GNU_uninit:
17783 case DW_OP_GNU_encoded_addr:
17784 case DW_OP_GNU_implicit_pointer:
17785 case DW_OP_GNU_entry_value:
17786 case DW_OP_GNU_const_type:
17787 case DW_OP_GNU_regval_type:
17788 case DW_OP_GNU_deref_type:
17789 case DW_OP_GNU_convert:
17790 case DW_OP_GNU_reinterpret:
17791 case DW_OP_GNU_parameter_ref:
17792 /* loc_list_from_tree will probably not output these operations for
17793 size functions, so assume they will not appear here. */
17794 /* Fall through... */
17796 default:
17797 gcc_unreachable ();
17800 /* Now, follow the control flow (except subroutine calls). */
17801 switch (l->dw_loc_opc)
17803 case DW_OP_bra:
17804 if (!resolve_args_picking_1 (l->dw_loc_next, frame_offset_, dpi,
17805 frame_offsets))
17806 return false;
17807 /* Fall through. */
17809 case DW_OP_skip:
17810 l = l->dw_loc_oprnd1.v.val_loc;
17811 break;
17813 case DW_OP_stack_value:
17814 return true;
17816 default:
17817 l = l->dw_loc_next;
17818 break;
17822 return true;
17825 /* Make a DFS over operations reachable through LOC (i.e. follow branch
17826 operations) in order to resolve the operand of DW_OP_pick operations that
17827 target DWARF procedure arguments (DPI). INITIAL_FRAME_OFFSET is the frame
17828 offset *before* LOC is executed. Return if all relocations were
17829 successful. */
17831 static bool
17832 resolve_args_picking (dw_loc_descr_ref loc, unsigned initial_frame_offset,
17833 struct dwarf_procedure_info *dpi)
17835 /* Associate to all visited operations the frame offset *before* evaluating
17836 this operation. */
17837 hash_map<dw_loc_descr_ref, unsigned> frame_offsets;
17839 return resolve_args_picking_1 (loc, initial_frame_offset, dpi,
17840 frame_offsets);
17843 /* Try to generate a DWARF procedure that computes the same result as FNDECL.
17844 Return NULL if it is not possible. */
17846 static dw_die_ref
17847 function_to_dwarf_procedure (tree fndecl)
17849 struct loc_descr_context ctx;
17850 struct dwarf_procedure_info dpi;
17851 dw_die_ref dwarf_proc_die;
17852 tree tree_body = DECL_SAVED_TREE (fndecl);
17853 dw_loc_descr_ref loc_body, epilogue;
17855 tree cursor;
17856 unsigned i;
17858 /* Do not generate multiple DWARF procedures for the same function
17859 declaration. */
17860 dwarf_proc_die = lookup_decl_die (fndecl);
17861 if (dwarf_proc_die != NULL)
17862 return dwarf_proc_die;
17864 /* DWARF procedures are available starting with the DWARFv3 standard. */
17865 if (dwarf_version < 3 && dwarf_strict)
17866 return NULL;
17868 /* We handle only functions for which we still have a body, that return a
17869 supported type and that takes arguments with supported types. Note that
17870 there is no point translating functions that return nothing. */
17871 if (tree_body == NULL_TREE
17872 || DECL_RESULT (fndecl) == NULL_TREE
17873 || !is_handled_procedure_type (TREE_TYPE (DECL_RESULT (fndecl))))
17874 return NULL;
17876 for (cursor = DECL_ARGUMENTS (fndecl);
17877 cursor != NULL_TREE;
17878 cursor = TREE_CHAIN (cursor))
17879 if (!is_handled_procedure_type (TREE_TYPE (cursor)))
17880 return NULL;
17882 /* Match only "expr" in: RETURN_EXPR (MODIFY_EXPR (RESULT_DECL, expr)). */
17883 if (TREE_CODE (tree_body) != RETURN_EXPR)
17884 return NULL;
17885 tree_body = TREE_OPERAND (tree_body, 0);
17886 if (TREE_CODE (tree_body) != MODIFY_EXPR
17887 || TREE_OPERAND (tree_body, 0) != DECL_RESULT (fndecl))
17888 return NULL;
17889 tree_body = TREE_OPERAND (tree_body, 1);
17891 /* Try to translate the body expression itself. Note that this will probably
17892 cause an infinite recursion if its call graph has a cycle. This is very
17893 unlikely for size functions, however, so don't bother with such things at
17894 the moment. */
17895 ctx.context_type = NULL_TREE;
17896 ctx.base_decl = NULL_TREE;
17897 ctx.dpi = &dpi;
17898 ctx.placeholder_arg = false;
17899 ctx.placeholder_seen = false;
17900 dpi.fndecl = fndecl;
17901 dpi.args_count = list_length (DECL_ARGUMENTS (fndecl));
17902 loc_body = loc_descriptor_from_tree (tree_body, 0, &ctx);
17903 if (!loc_body)
17904 return NULL;
17906 /* After evaluating all operands in "loc_body", we should still have on the
17907 stack all arguments plus the desired function result (top of the stack).
17908 Generate code in order to keep only the result in our stack frame. */
17909 epilogue = NULL;
17910 for (i = 0; i < dpi.args_count; ++i)
17912 dw_loc_descr_ref op_couple = new_loc_descr (DW_OP_swap, 0, 0);
17913 op_couple->dw_loc_next = new_loc_descr (DW_OP_drop, 0, 0);
17914 op_couple->dw_loc_next->dw_loc_next = epilogue;
17915 epilogue = op_couple;
17917 add_loc_descr (&loc_body, epilogue);
17918 if (!resolve_args_picking (loc_body, dpi.args_count, &dpi))
17919 return NULL;
17921 /* Trailing nops from loc_descriptor_from_tree (if any) cannot be removed
17922 because they are considered useful. Now there is an epilogue, they are
17923 not anymore, so give it another try. */
17924 loc_descr_without_nops (loc_body);
17926 /* fndecl may be used both as a regular DW_TAG_subprogram DIE and as
17927 a DW_TAG_dwarf_procedure, so we may have a conflict, here. It's unlikely,
17928 though, given that size functions do not come from source, so they should
17929 not have a dedicated DW_TAG_subprogram DIE. */
17930 dwarf_proc_die
17931 = new_dwarf_proc_die (loc_body, fndecl,
17932 get_context_die (DECL_CONTEXT (fndecl)));
17934 /* The called DWARF procedure consumes one stack slot per argument and
17935 returns one stack slot. */
17936 dwarf_proc_stack_usage_map->put (dwarf_proc_die, 1 - dpi.args_count);
17938 return dwarf_proc_die;
17942 /* Generate Dwarf location list representing LOC.
17943 If WANT_ADDRESS is false, expression computing LOC will be computed
17944 If WANT_ADDRESS is 1, expression computing address of LOC will be returned
17945 if WANT_ADDRESS is 2, expression computing address useable in location
17946 will be returned (i.e. DW_OP_reg can be used
17947 to refer to register values).
17949 CONTEXT provides information to customize the location descriptions
17950 generation. Its context_type field specifies what type is implicitly
17951 referenced by DW_OP_push_object_address. If it is NULL_TREE, this operation
17952 will not be generated.
17954 Its DPI field determines whether we are generating a DWARF expression for a
17955 DWARF procedure, so PARM_DECL references are processed specifically.
17957 If CONTEXT is NULL, the behavior is the same as if context_type, base_decl
17958 and dpi fields were null. */
17960 static dw_loc_list_ref
17961 loc_list_from_tree_1 (tree loc, int want_address,
17962 struct loc_descr_context *context)
17964 dw_loc_descr_ref ret = NULL, ret1 = NULL;
17965 dw_loc_list_ref list_ret = NULL, list_ret1 = NULL;
17966 int have_address = 0;
17967 enum dwarf_location_atom op;
17969 /* ??? Most of the time we do not take proper care for sign/zero
17970 extending the values properly. Hopefully this won't be a real
17971 problem... */
17973 if (context != NULL
17974 && context->base_decl == loc
17975 && want_address == 0)
17977 if (dwarf_version >= 3 || !dwarf_strict)
17978 return new_loc_list (new_loc_descr (DW_OP_push_object_address, 0, 0),
17979 NULL, 0, NULL, 0, NULL);
17980 else
17981 return NULL;
17984 switch (TREE_CODE (loc))
17986 case ERROR_MARK:
17987 expansion_failed (loc, NULL_RTX, "ERROR_MARK");
17988 return 0;
17990 case PLACEHOLDER_EXPR:
17991 /* This case involves extracting fields from an object to determine the
17992 position of other fields. It is supposed to appear only as the first
17993 operand of COMPONENT_REF nodes and to reference precisely the type
17994 that the context allows. */
17995 if (context != NULL
17996 && TREE_TYPE (loc) == context->context_type
17997 && want_address >= 1)
17999 if (dwarf_version >= 3 || !dwarf_strict)
18001 ret = new_loc_descr (DW_OP_push_object_address, 0, 0);
18002 have_address = 1;
18003 break;
18005 else
18006 return NULL;
18008 /* For DW_TAG_generic_subrange attributes, PLACEHOLDER_EXPR stands for
18009 the single argument passed by consumer. */
18010 else if (context != NULL
18011 && context->placeholder_arg
18012 && INTEGRAL_TYPE_P (TREE_TYPE (loc))
18013 && want_address == 0)
18015 ret = new_loc_descr (DW_OP_pick, 0, 0);
18016 ret->frame_offset_rel = 1;
18017 context->placeholder_seen = true;
18018 break;
18020 else
18021 expansion_failed (loc, NULL_RTX,
18022 "PLACEHOLDER_EXPR for an unexpected type");
18023 break;
18025 case CALL_EXPR:
18027 const int nargs = call_expr_nargs (loc);
18028 tree callee = get_callee_fndecl (loc);
18029 int i;
18030 dw_die_ref dwarf_proc;
18032 if (callee == NULL_TREE)
18033 goto call_expansion_failed;
18035 /* We handle only functions that return an integer. */
18036 if (!is_handled_procedure_type (TREE_TYPE (TREE_TYPE (callee))))
18037 goto call_expansion_failed;
18039 dwarf_proc = function_to_dwarf_procedure (callee);
18040 if (dwarf_proc == NULL)
18041 goto call_expansion_failed;
18043 /* Evaluate arguments right-to-left so that the first argument will
18044 be the top-most one on the stack. */
18045 for (i = nargs - 1; i >= 0; --i)
18047 dw_loc_descr_ref loc_descr
18048 = loc_descriptor_from_tree (CALL_EXPR_ARG (loc, i), 0,
18049 context);
18051 if (loc_descr == NULL)
18052 goto call_expansion_failed;
18054 add_loc_descr (&ret, loc_descr);
18057 ret1 = new_loc_descr (DW_OP_call4, 0, 0);
18058 ret1->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
18059 ret1->dw_loc_oprnd1.v.val_die_ref.die = dwarf_proc;
18060 ret1->dw_loc_oprnd1.v.val_die_ref.external = 0;
18061 add_loc_descr (&ret, ret1);
18062 break;
18064 call_expansion_failed:
18065 expansion_failed (loc, NULL_RTX, "CALL_EXPR");
18066 /* There are no opcodes for these operations. */
18067 return 0;
18070 case PREINCREMENT_EXPR:
18071 case PREDECREMENT_EXPR:
18072 case POSTINCREMENT_EXPR:
18073 case POSTDECREMENT_EXPR:
18074 expansion_failed (loc, NULL_RTX, "PRE/POST INDCREMENT/DECREMENT");
18075 /* There are no opcodes for these operations. */
18076 return 0;
18078 case ADDR_EXPR:
18079 /* If we already want an address, see if there is INDIRECT_REF inside
18080 e.g. for &this->field. */
18081 if (want_address)
18083 list_ret = loc_list_for_address_of_addr_expr_of_indirect_ref
18084 (loc, want_address == 2, context);
18085 if (list_ret)
18086 have_address = 1;
18087 else if (decl_address_ip_invariant_p (TREE_OPERAND (loc, 0))
18088 && (ret = cst_pool_loc_descr (loc)))
18089 have_address = 1;
18091 /* Otherwise, process the argument and look for the address. */
18092 if (!list_ret && !ret)
18093 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 1, context);
18094 else
18096 if (want_address)
18097 expansion_failed (loc, NULL_RTX, "need address of ADDR_EXPR");
18098 return NULL;
18100 break;
18102 case VAR_DECL:
18103 if (DECL_THREAD_LOCAL_P (loc))
18105 rtx rtl;
18106 enum dwarf_location_atom tls_op;
18107 enum dtprel_bool dtprel = dtprel_false;
18109 if (targetm.have_tls)
18111 /* If this is not defined, we have no way to emit the
18112 data. */
18113 if (!targetm.asm_out.output_dwarf_dtprel)
18114 return 0;
18116 /* The way DW_OP_GNU_push_tls_address is specified, we
18117 can only look up addresses of objects in the current
18118 module. We used DW_OP_addr as first op, but that's
18119 wrong, because DW_OP_addr is relocated by the debug
18120 info consumer, while DW_OP_GNU_push_tls_address
18121 operand shouldn't be. */
18122 if (DECL_EXTERNAL (loc) && !targetm.binds_local_p (loc))
18123 return 0;
18124 dtprel = dtprel_true;
18125 /* We check for DWARF 5 here because gdb did not implement
18126 DW_OP_form_tls_address until after 7.12. */
18127 tls_op = (dwarf_version >= 5 ? DW_OP_form_tls_address
18128 : DW_OP_GNU_push_tls_address);
18130 else
18132 if (!targetm.emutls.debug_form_tls_address
18133 || !(dwarf_version >= 3 || !dwarf_strict))
18134 return 0;
18135 /* We stuffed the control variable into the DECL_VALUE_EXPR
18136 to signal (via DECL_HAS_VALUE_EXPR_P) that the decl should
18137 no longer appear in gimple code. We used the control
18138 variable in specific so that we could pick it up here. */
18139 loc = DECL_VALUE_EXPR (loc);
18140 tls_op = DW_OP_form_tls_address;
18143 rtl = rtl_for_decl_location (loc);
18144 if (rtl == NULL_RTX)
18145 return 0;
18147 if (!MEM_P (rtl))
18148 return 0;
18149 rtl = XEXP (rtl, 0);
18150 if (! CONSTANT_P (rtl))
18151 return 0;
18153 ret = new_addr_loc_descr (rtl, dtprel);
18154 ret1 = new_loc_descr (tls_op, 0, 0);
18155 add_loc_descr (&ret, ret1);
18157 have_address = 1;
18158 break;
18160 /* FALLTHRU */
18162 case PARM_DECL:
18163 if (context != NULL && context->dpi != NULL
18164 && DECL_CONTEXT (loc) == context->dpi->fndecl)
18166 /* We are generating code for a DWARF procedure and we want to access
18167 one of its arguments: find the appropriate argument offset and let
18168 the resolve_args_picking pass compute the offset that complies
18169 with the stack frame size. */
18170 unsigned i = 0;
18171 tree cursor;
18173 for (cursor = DECL_ARGUMENTS (context->dpi->fndecl);
18174 cursor != NULL_TREE && cursor != loc;
18175 cursor = TREE_CHAIN (cursor), ++i)
18177 /* If we are translating a DWARF procedure, all referenced parameters
18178 must belong to the current function. */
18179 gcc_assert (cursor != NULL_TREE);
18181 ret = new_loc_descr (DW_OP_pick, i, 0);
18182 ret->frame_offset_rel = 1;
18183 break;
18185 /* FALLTHRU */
18187 case RESULT_DECL:
18188 if (DECL_HAS_VALUE_EXPR_P (loc))
18189 return loc_list_from_tree_1 (DECL_VALUE_EXPR (loc),
18190 want_address, context);
18191 /* FALLTHRU */
18193 case FUNCTION_DECL:
18195 rtx rtl;
18196 var_loc_list *loc_list = lookup_decl_loc (loc);
18198 if (loc_list && loc_list->first)
18200 list_ret = dw_loc_list (loc_list, loc, want_address);
18201 have_address = want_address != 0;
18202 break;
18204 rtl = rtl_for_decl_location (loc);
18205 if (rtl == NULL_RTX)
18207 if (TREE_CODE (loc) != FUNCTION_DECL
18208 && early_dwarf
18209 && current_function_decl
18210 && want_address != 1
18211 && ! DECL_IGNORED_P (loc)
18212 && (INTEGRAL_TYPE_P (TREE_TYPE (loc))
18213 || POINTER_TYPE_P (TREE_TYPE (loc)))
18214 && DECL_CONTEXT (loc) == current_function_decl
18215 && (GET_MODE_SIZE (SCALAR_INT_TYPE_MODE (TREE_TYPE (loc)))
18216 <= DWARF2_ADDR_SIZE))
18218 dw_die_ref ref = lookup_decl_die (loc);
18219 ret = new_loc_descr (DW_OP_GNU_variable_value, 0, 0);
18220 if (ref)
18222 ret->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
18223 ret->dw_loc_oprnd1.v.val_die_ref.die = ref;
18224 ret->dw_loc_oprnd1.v.val_die_ref.external = 0;
18226 else
18228 ret->dw_loc_oprnd1.val_class = dw_val_class_decl_ref;
18229 ret->dw_loc_oprnd1.v.val_decl_ref = loc;
18231 break;
18233 expansion_failed (loc, NULL_RTX, "DECL has no RTL");
18234 return 0;
18236 else if (CONST_INT_P (rtl))
18238 HOST_WIDE_INT val = INTVAL (rtl);
18239 if (TYPE_UNSIGNED (TREE_TYPE (loc)))
18240 val &= GET_MODE_MASK (DECL_MODE (loc));
18241 ret = int_loc_descriptor (val);
18243 else if (GET_CODE (rtl) == CONST_STRING)
18245 expansion_failed (loc, NULL_RTX, "CONST_STRING");
18246 return 0;
18248 else if (CONSTANT_P (rtl) && const_ok_for_output (rtl))
18249 ret = new_addr_loc_descr (rtl, dtprel_false);
18250 else
18252 machine_mode mode, mem_mode;
18254 /* Certain constructs can only be represented at top-level. */
18255 if (want_address == 2)
18257 ret = loc_descriptor (rtl, VOIDmode,
18258 VAR_INIT_STATUS_INITIALIZED);
18259 have_address = 1;
18261 else
18263 mode = GET_MODE (rtl);
18264 mem_mode = VOIDmode;
18265 if (MEM_P (rtl))
18267 mem_mode = mode;
18268 mode = get_address_mode (rtl);
18269 rtl = XEXP (rtl, 0);
18270 have_address = 1;
18272 ret = mem_loc_descriptor (rtl, mode, mem_mode,
18273 VAR_INIT_STATUS_INITIALIZED);
18275 if (!ret)
18276 expansion_failed (loc, rtl,
18277 "failed to produce loc descriptor for rtl");
18280 break;
18282 case MEM_REF:
18283 if (!integer_zerop (TREE_OPERAND (loc, 1)))
18285 have_address = 1;
18286 goto do_plus;
18288 /* Fallthru. */
18289 case INDIRECT_REF:
18290 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18291 have_address = 1;
18292 break;
18294 case TARGET_MEM_REF:
18295 case SSA_NAME:
18296 case DEBUG_EXPR_DECL:
18297 return NULL;
18299 case COMPOUND_EXPR:
18300 return loc_list_from_tree_1 (TREE_OPERAND (loc, 1), want_address,
18301 context);
18303 CASE_CONVERT:
18304 case VIEW_CONVERT_EXPR:
18305 case SAVE_EXPR:
18306 case MODIFY_EXPR:
18307 case NON_LVALUE_EXPR:
18308 return loc_list_from_tree_1 (TREE_OPERAND (loc, 0), want_address,
18309 context);
18311 case COMPONENT_REF:
18312 case BIT_FIELD_REF:
18313 case ARRAY_REF:
18314 case ARRAY_RANGE_REF:
18315 case REALPART_EXPR:
18316 case IMAGPART_EXPR:
18318 tree obj, offset;
18319 poly_int64 bitsize, bitpos, bytepos;
18320 machine_mode mode;
18321 int unsignedp, reversep, volatilep = 0;
18323 obj = get_inner_reference (loc, &bitsize, &bitpos, &offset, &mode,
18324 &unsignedp, &reversep, &volatilep);
18326 gcc_assert (obj != loc);
18328 list_ret = loc_list_from_tree_1 (obj,
18329 want_address == 2
18330 && known_eq (bitpos, 0)
18331 && !offset ? 2 : 1,
18332 context);
18333 /* TODO: We can extract value of the small expression via shifting even
18334 for nonzero bitpos. */
18335 if (list_ret == 0)
18336 return 0;
18337 if (!multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
18338 || !multiple_p (bitsize, BITS_PER_UNIT))
18340 expansion_failed (loc, NULL_RTX,
18341 "bitfield access");
18342 return 0;
18345 if (offset != NULL_TREE)
18347 /* Variable offset. */
18348 list_ret1 = loc_list_from_tree_1 (offset, 0, context);
18349 if (list_ret1 == 0)
18350 return 0;
18351 add_loc_list (&list_ret, list_ret1);
18352 if (!list_ret)
18353 return 0;
18354 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_plus, 0, 0));
18357 HOST_WIDE_INT value;
18358 if (bytepos.is_constant (&value) && value > 0)
18359 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_plus_uconst,
18360 value, 0));
18361 else if (maybe_ne (bytepos, 0))
18362 loc_list_plus_const (list_ret, bytepos);
18364 have_address = 1;
18365 break;
18368 case INTEGER_CST:
18369 if ((want_address || !tree_fits_shwi_p (loc))
18370 && (ret = cst_pool_loc_descr (loc)))
18371 have_address = 1;
18372 else if (want_address == 2
18373 && tree_fits_shwi_p (loc)
18374 && (ret = address_of_int_loc_descriptor
18375 (int_size_in_bytes (TREE_TYPE (loc)),
18376 tree_to_shwi (loc))))
18377 have_address = 1;
18378 else if (tree_fits_shwi_p (loc))
18379 ret = int_loc_descriptor (tree_to_shwi (loc));
18380 else if (tree_fits_uhwi_p (loc))
18381 ret = uint_loc_descriptor (tree_to_uhwi (loc));
18382 else
18384 expansion_failed (loc, NULL_RTX,
18385 "Integer operand is not host integer");
18386 return 0;
18388 break;
18390 case CONSTRUCTOR:
18391 case REAL_CST:
18392 case STRING_CST:
18393 case COMPLEX_CST:
18394 if ((ret = cst_pool_loc_descr (loc)))
18395 have_address = 1;
18396 else if (TREE_CODE (loc) == CONSTRUCTOR)
18398 tree type = TREE_TYPE (loc);
18399 unsigned HOST_WIDE_INT size = int_size_in_bytes (type);
18400 unsigned HOST_WIDE_INT offset = 0;
18401 unsigned HOST_WIDE_INT cnt;
18402 constructor_elt *ce;
18404 if (TREE_CODE (type) == RECORD_TYPE)
18406 /* This is very limited, but it's enough to output
18407 pointers to member functions, as long as the
18408 referenced function is defined in the current
18409 translation unit. */
18410 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (loc), cnt, ce)
18412 tree val = ce->value;
18414 tree field = ce->index;
18416 if (val)
18417 STRIP_NOPS (val);
18419 if (!field || DECL_BIT_FIELD (field))
18421 expansion_failed (loc, NULL_RTX,
18422 "bitfield in record type constructor");
18423 size = offset = (unsigned HOST_WIDE_INT)-1;
18424 ret = NULL;
18425 break;
18428 HOST_WIDE_INT fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
18429 unsigned HOST_WIDE_INT pos = int_byte_position (field);
18430 gcc_assert (pos + fieldsize <= size);
18431 if (pos < offset)
18433 expansion_failed (loc, NULL_RTX,
18434 "out-of-order fields in record constructor");
18435 size = offset = (unsigned HOST_WIDE_INT)-1;
18436 ret = NULL;
18437 break;
18439 if (pos > offset)
18441 ret1 = new_loc_descr (DW_OP_piece, pos - offset, 0);
18442 add_loc_descr (&ret, ret1);
18443 offset = pos;
18445 if (val && fieldsize != 0)
18447 ret1 = loc_descriptor_from_tree (val, want_address, context);
18448 if (!ret1)
18450 expansion_failed (loc, NULL_RTX,
18451 "unsupported expression in field");
18452 size = offset = (unsigned HOST_WIDE_INT)-1;
18453 ret = NULL;
18454 break;
18456 add_loc_descr (&ret, ret1);
18458 if (fieldsize)
18460 ret1 = new_loc_descr (DW_OP_piece, fieldsize, 0);
18461 add_loc_descr (&ret, ret1);
18462 offset = pos + fieldsize;
18466 if (offset != size)
18468 ret1 = new_loc_descr (DW_OP_piece, size - offset, 0);
18469 add_loc_descr (&ret, ret1);
18470 offset = size;
18473 have_address = !!want_address;
18475 else
18476 expansion_failed (loc, NULL_RTX,
18477 "constructor of non-record type");
18479 else
18480 /* We can construct small constants here using int_loc_descriptor. */
18481 expansion_failed (loc, NULL_RTX,
18482 "constructor or constant not in constant pool");
18483 break;
18485 case TRUTH_AND_EXPR:
18486 case TRUTH_ANDIF_EXPR:
18487 case BIT_AND_EXPR:
18488 op = DW_OP_and;
18489 goto do_binop;
18491 case TRUTH_XOR_EXPR:
18492 case BIT_XOR_EXPR:
18493 op = DW_OP_xor;
18494 goto do_binop;
18496 case TRUTH_OR_EXPR:
18497 case TRUTH_ORIF_EXPR:
18498 case BIT_IOR_EXPR:
18499 op = DW_OP_or;
18500 goto do_binop;
18502 case FLOOR_DIV_EXPR:
18503 case CEIL_DIV_EXPR:
18504 case ROUND_DIV_EXPR:
18505 case TRUNC_DIV_EXPR:
18506 case EXACT_DIV_EXPR:
18507 if (TYPE_UNSIGNED (TREE_TYPE (loc)))
18508 return 0;
18509 op = DW_OP_div;
18510 goto do_binop;
18512 case MINUS_EXPR:
18513 op = DW_OP_minus;
18514 goto do_binop;
18516 case FLOOR_MOD_EXPR:
18517 case CEIL_MOD_EXPR:
18518 case ROUND_MOD_EXPR:
18519 case TRUNC_MOD_EXPR:
18520 if (TYPE_UNSIGNED (TREE_TYPE (loc)))
18522 op = DW_OP_mod;
18523 goto do_binop;
18525 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18526 list_ret1 = loc_list_from_tree_1 (TREE_OPERAND (loc, 1), 0, context);
18527 if (list_ret == 0 || list_ret1 == 0)
18528 return 0;
18530 add_loc_list (&list_ret, list_ret1);
18531 if (list_ret == 0)
18532 return 0;
18533 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_over, 0, 0));
18534 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_over, 0, 0));
18535 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_div, 0, 0));
18536 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_mul, 0, 0));
18537 add_loc_descr_to_each (list_ret, new_loc_descr (DW_OP_minus, 0, 0));
18538 break;
18540 case MULT_EXPR:
18541 op = DW_OP_mul;
18542 goto do_binop;
18544 case LSHIFT_EXPR:
18545 op = DW_OP_shl;
18546 goto do_binop;
18548 case RSHIFT_EXPR:
18549 op = (TYPE_UNSIGNED (TREE_TYPE (loc)) ? DW_OP_shr : DW_OP_shra);
18550 goto do_binop;
18552 case POINTER_PLUS_EXPR:
18553 case PLUS_EXPR:
18554 do_plus:
18555 if (tree_fits_shwi_p (TREE_OPERAND (loc, 1)))
18557 /* Big unsigned numbers can fit in HOST_WIDE_INT but it may be
18558 smarter to encode their opposite. The DW_OP_plus_uconst operation
18559 takes 1 + X bytes, X being the size of the ULEB128 addend. On the
18560 other hand, a "<push literal>; DW_OP_minus" pattern takes 1 + Y
18561 bytes, Y being the size of the operation that pushes the opposite
18562 of the addend. So let's choose the smallest representation. */
18563 const tree tree_addend = TREE_OPERAND (loc, 1);
18564 offset_int wi_addend;
18565 HOST_WIDE_INT shwi_addend;
18566 dw_loc_descr_ref loc_naddend;
18568 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18569 if (list_ret == 0)
18570 return 0;
18572 /* Try to get the literal to push. It is the opposite of the addend,
18573 so as we rely on wrapping during DWARF evaluation, first decode
18574 the literal as a "DWARF-sized" signed number. */
18575 wi_addend = wi::to_offset (tree_addend);
18576 wi_addend = wi::sext (wi_addend, DWARF2_ADDR_SIZE * 8);
18577 shwi_addend = wi_addend.to_shwi ();
18578 loc_naddend = (shwi_addend != INTTYPE_MINIMUM (HOST_WIDE_INT))
18579 ? int_loc_descriptor (-shwi_addend)
18580 : NULL;
18582 if (loc_naddend != NULL
18583 && ((unsigned) size_of_uleb128 (shwi_addend)
18584 > size_of_loc_descr (loc_naddend)))
18586 add_loc_descr_to_each (list_ret, loc_naddend);
18587 add_loc_descr_to_each (list_ret,
18588 new_loc_descr (DW_OP_minus, 0, 0));
18590 else
18592 for (dw_loc_descr_ref loc_cur = loc_naddend; loc_cur != NULL; )
18594 loc_naddend = loc_cur;
18595 loc_cur = loc_cur->dw_loc_next;
18596 ggc_free (loc_naddend);
18598 loc_list_plus_const (list_ret, wi_addend.to_shwi ());
18600 break;
18603 op = DW_OP_plus;
18604 goto do_binop;
18606 case LE_EXPR:
18607 op = DW_OP_le;
18608 goto do_comp_binop;
18610 case GE_EXPR:
18611 op = DW_OP_ge;
18612 goto do_comp_binop;
18614 case LT_EXPR:
18615 op = DW_OP_lt;
18616 goto do_comp_binop;
18618 case GT_EXPR:
18619 op = DW_OP_gt;
18620 goto do_comp_binop;
18622 do_comp_binop:
18623 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (loc, 0))))
18625 list_ret = loc_list_from_tree (TREE_OPERAND (loc, 0), 0, context);
18626 list_ret1 = loc_list_from_tree (TREE_OPERAND (loc, 1), 0, context);
18627 list_ret = loc_list_from_uint_comparison (list_ret, list_ret1,
18628 TREE_CODE (loc));
18629 break;
18631 else
18632 goto do_binop;
18634 case EQ_EXPR:
18635 op = DW_OP_eq;
18636 goto do_binop;
18638 case NE_EXPR:
18639 op = DW_OP_ne;
18640 goto do_binop;
18642 do_binop:
18643 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18644 list_ret1 = loc_list_from_tree_1 (TREE_OPERAND (loc, 1), 0, context);
18645 if (list_ret == 0 || list_ret1 == 0)
18646 return 0;
18648 add_loc_list (&list_ret, list_ret1);
18649 if (list_ret == 0)
18650 return 0;
18651 add_loc_descr_to_each (list_ret, new_loc_descr (op, 0, 0));
18652 break;
18654 case TRUTH_NOT_EXPR:
18655 case BIT_NOT_EXPR:
18656 op = DW_OP_not;
18657 goto do_unop;
18659 case ABS_EXPR:
18660 op = DW_OP_abs;
18661 goto do_unop;
18663 case NEGATE_EXPR:
18664 op = DW_OP_neg;
18665 goto do_unop;
18667 do_unop:
18668 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18669 if (list_ret == 0)
18670 return 0;
18672 add_loc_descr_to_each (list_ret, new_loc_descr (op, 0, 0));
18673 break;
18675 case MIN_EXPR:
18676 case MAX_EXPR:
18678 const enum tree_code code =
18679 TREE_CODE (loc) == MIN_EXPR ? GT_EXPR : LT_EXPR;
18681 loc = build3 (COND_EXPR, TREE_TYPE (loc),
18682 build2 (code, integer_type_node,
18683 TREE_OPERAND (loc, 0), TREE_OPERAND (loc, 1)),
18684 TREE_OPERAND (loc, 1), TREE_OPERAND (loc, 0));
18687 /* fall through */
18689 case COND_EXPR:
18691 dw_loc_descr_ref lhs
18692 = loc_descriptor_from_tree (TREE_OPERAND (loc, 1), 0, context);
18693 dw_loc_list_ref rhs
18694 = loc_list_from_tree_1 (TREE_OPERAND (loc, 2), 0, context);
18695 dw_loc_descr_ref bra_node, jump_node, tmp;
18697 list_ret = loc_list_from_tree_1 (TREE_OPERAND (loc, 0), 0, context);
18698 if (list_ret == 0 || lhs == 0 || rhs == 0)
18699 return 0;
18701 bra_node = new_loc_descr (DW_OP_bra, 0, 0);
18702 add_loc_descr_to_each (list_ret, bra_node);
18704 add_loc_list (&list_ret, rhs);
18705 jump_node = new_loc_descr (DW_OP_skip, 0, 0);
18706 add_loc_descr_to_each (list_ret, jump_node);
18708 add_loc_descr_to_each (list_ret, lhs);
18709 bra_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
18710 bra_node->dw_loc_oprnd1.v.val_loc = lhs;
18712 /* ??? Need a node to point the skip at. Use a nop. */
18713 tmp = new_loc_descr (DW_OP_nop, 0, 0);
18714 add_loc_descr_to_each (list_ret, tmp);
18715 jump_node->dw_loc_oprnd1.val_class = dw_val_class_loc;
18716 jump_node->dw_loc_oprnd1.v.val_loc = tmp;
18718 break;
18720 case FIX_TRUNC_EXPR:
18721 return 0;
18723 default:
18724 /* Leave front-end specific codes as simply unknown. This comes
18725 up, for instance, with the C STMT_EXPR. */
18726 if ((unsigned int) TREE_CODE (loc)
18727 >= (unsigned int) LAST_AND_UNUSED_TREE_CODE)
18729 expansion_failed (loc, NULL_RTX,
18730 "language specific tree node");
18731 return 0;
18734 /* Otherwise this is a generic code; we should just lists all of
18735 these explicitly. We forgot one. */
18736 if (flag_checking)
18737 gcc_unreachable ();
18739 /* In a release build, we want to degrade gracefully: better to
18740 generate incomplete debugging information than to crash. */
18741 return NULL;
18744 if (!ret && !list_ret)
18745 return 0;
18747 if (want_address == 2 && !have_address
18748 && (dwarf_version >= 4 || !dwarf_strict))
18750 if (int_size_in_bytes (TREE_TYPE (loc)) > DWARF2_ADDR_SIZE)
18752 expansion_failed (loc, NULL_RTX,
18753 "DWARF address size mismatch");
18754 return 0;
18756 if (ret)
18757 add_loc_descr (&ret, new_loc_descr (DW_OP_stack_value, 0, 0));
18758 else
18759 add_loc_descr_to_each (list_ret,
18760 new_loc_descr (DW_OP_stack_value, 0, 0));
18761 have_address = 1;
18763 /* Show if we can't fill the request for an address. */
18764 if (want_address && !have_address)
18766 expansion_failed (loc, NULL_RTX,
18767 "Want address and only have value");
18768 return 0;
18771 gcc_assert (!ret || !list_ret);
18773 /* If we've got an address and don't want one, dereference. */
18774 if (!want_address && have_address)
18776 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (loc));
18778 if (size > DWARF2_ADDR_SIZE || size == -1)
18780 expansion_failed (loc, NULL_RTX,
18781 "DWARF address size mismatch");
18782 return 0;
18784 else if (size == DWARF2_ADDR_SIZE)
18785 op = DW_OP_deref;
18786 else
18787 op = DW_OP_deref_size;
18789 if (ret)
18790 add_loc_descr (&ret, new_loc_descr (op, size, 0));
18791 else
18792 add_loc_descr_to_each (list_ret, new_loc_descr (op, size, 0));
18794 if (ret)
18795 list_ret = new_loc_list (ret, NULL, 0, NULL, 0, NULL);
18797 return list_ret;
18800 /* Likewise, but strip useless DW_OP_nop operations in the resulting
18801 expressions. */
18803 static dw_loc_list_ref
18804 loc_list_from_tree (tree loc, int want_address,
18805 struct loc_descr_context *context)
18807 dw_loc_list_ref result = loc_list_from_tree_1 (loc, want_address, context);
18809 for (dw_loc_list_ref loc_cur = result;
18810 loc_cur != NULL; loc_cur = loc_cur->dw_loc_next)
18811 loc_descr_without_nops (loc_cur->expr);
18812 return result;
18815 /* Same as above but return only single location expression. */
18816 static dw_loc_descr_ref
18817 loc_descriptor_from_tree (tree loc, int want_address,
18818 struct loc_descr_context *context)
18820 dw_loc_list_ref ret = loc_list_from_tree (loc, want_address, context);
18821 if (!ret)
18822 return NULL;
18823 if (ret->dw_loc_next)
18825 expansion_failed (loc, NULL_RTX,
18826 "Location list where only loc descriptor needed");
18827 return NULL;
18829 return ret->expr;
18832 /* Given a value, round it up to the lowest multiple of `boundary'
18833 which is not less than the value itself. */
18835 static inline HOST_WIDE_INT
18836 ceiling (HOST_WIDE_INT value, unsigned int boundary)
18838 return (((value + boundary - 1) / boundary) * boundary);
18841 /* Given a pointer to what is assumed to be a FIELD_DECL node, return a
18842 pointer to the declared type for the relevant field variable, or return
18843 `integer_type_node' if the given node turns out to be an
18844 ERROR_MARK node. */
18846 static inline tree
18847 field_type (const_tree decl)
18849 tree type;
18851 if (TREE_CODE (decl) == ERROR_MARK)
18852 return integer_type_node;
18854 type = DECL_BIT_FIELD_TYPE (decl);
18855 if (type == NULL_TREE)
18856 type = TREE_TYPE (decl);
18858 return type;
18861 /* Given a pointer to a tree node, return the alignment in bits for
18862 it, or else return BITS_PER_WORD if the node actually turns out to
18863 be an ERROR_MARK node. */
18865 static inline unsigned
18866 simple_type_align_in_bits (const_tree type)
18868 return (TREE_CODE (type) != ERROR_MARK) ? TYPE_ALIGN (type) : BITS_PER_WORD;
18871 static inline unsigned
18872 simple_decl_align_in_bits (const_tree decl)
18874 return (TREE_CODE (decl) != ERROR_MARK) ? DECL_ALIGN (decl) : BITS_PER_WORD;
18877 /* Return the result of rounding T up to ALIGN. */
18879 static inline offset_int
18880 round_up_to_align (const offset_int &t, unsigned int align)
18882 return wi::udiv_trunc (t + align - 1, align) * align;
18885 /* Compute the size of TYPE in bytes. If possible, return NULL and store the
18886 size as an integer constant in CST_SIZE. Otherwise, if possible, return a
18887 DWARF expression that computes the size. Return NULL and set CST_SIZE to -1
18888 if we fail to return the size in one of these two forms. */
18890 static dw_loc_descr_ref
18891 type_byte_size (const_tree type, HOST_WIDE_INT *cst_size)
18893 tree tree_size;
18894 struct loc_descr_context ctx;
18896 /* Return a constant integer in priority, if possible. */
18897 *cst_size = int_size_in_bytes (type);
18898 if (*cst_size != -1)
18899 return NULL;
18901 ctx.context_type = const_cast<tree> (type);
18902 ctx.base_decl = NULL_TREE;
18903 ctx.dpi = NULL;
18904 ctx.placeholder_arg = false;
18905 ctx.placeholder_seen = false;
18907 type = TYPE_MAIN_VARIANT (type);
18908 tree_size = TYPE_SIZE_UNIT (type);
18909 return ((tree_size != NULL_TREE)
18910 ? loc_descriptor_from_tree (tree_size, 0, &ctx)
18911 : NULL);
18914 /* Helper structure for RECORD_TYPE processing. */
18915 struct vlr_context
18917 /* Root RECORD_TYPE. It is needed to generate data member location
18918 descriptions in variable-length records (VLR), but also to cope with
18919 variants, which are composed of nested structures multiplexed with
18920 QUAL_UNION_TYPE nodes. Each time such a structure is passed to a
18921 function processing a FIELD_DECL, it is required to be non null. */
18922 tree struct_type;
18923 /* When generating a variant part in a RECORD_TYPE (i.e. a nested
18924 QUAL_UNION_TYPE), this holds an expression that computes the offset for
18925 this variant part as part of the root record (in storage units). For
18926 regular records, it must be NULL_TREE. */
18927 tree variant_part_offset;
18930 /* Given a pointer to a FIELD_DECL, compute the byte offset of the lowest
18931 addressed byte of the "containing object" for the given FIELD_DECL. If
18932 possible, return a native constant through CST_OFFSET (in which case NULL is
18933 returned); otherwise return a DWARF expression that computes the offset.
18935 Set *CST_OFFSET to 0 and return NULL if we are unable to determine what
18936 that offset is, either because the argument turns out to be a pointer to an
18937 ERROR_MARK node, or because the offset expression is too complex for us.
18939 CTX is required: see the comment for VLR_CONTEXT. */
18941 static dw_loc_descr_ref
18942 field_byte_offset (const_tree decl, struct vlr_context *ctx,
18943 HOST_WIDE_INT *cst_offset)
18945 tree tree_result;
18946 dw_loc_list_ref loc_result;
18948 *cst_offset = 0;
18950 if (TREE_CODE (decl) == ERROR_MARK)
18951 return NULL;
18952 else
18953 gcc_assert (TREE_CODE (decl) == FIELD_DECL);
18955 /* We cannot handle variable bit offsets at the moment, so abort if it's the
18956 case. */
18957 if (TREE_CODE (DECL_FIELD_BIT_OFFSET (decl)) != INTEGER_CST)
18958 return NULL;
18960 #ifdef PCC_BITFIELD_TYPE_MATTERS
18961 /* We used to handle only constant offsets in all cases. Now, we handle
18962 properly dynamic byte offsets only when PCC bitfield type doesn't
18963 matter. */
18964 if (PCC_BITFIELD_TYPE_MATTERS
18965 && TREE_CODE (DECL_FIELD_OFFSET (decl)) == INTEGER_CST)
18967 offset_int object_offset_in_bits;
18968 offset_int object_offset_in_bytes;
18969 offset_int bitpos_int;
18970 tree type;
18971 tree field_size_tree;
18972 offset_int deepest_bitpos;
18973 offset_int field_size_in_bits;
18974 unsigned int type_align_in_bits;
18975 unsigned int decl_align_in_bits;
18976 offset_int type_size_in_bits;
18978 bitpos_int = wi::to_offset (bit_position (decl));
18979 type = field_type (decl);
18980 type_size_in_bits = offset_int_type_size_in_bits (type);
18981 type_align_in_bits = simple_type_align_in_bits (type);
18983 field_size_tree = DECL_SIZE (decl);
18985 /* The size could be unspecified if there was an error, or for
18986 a flexible array member. */
18987 if (!field_size_tree)
18988 field_size_tree = bitsize_zero_node;
18990 /* If the size of the field is not constant, use the type size. */
18991 if (TREE_CODE (field_size_tree) == INTEGER_CST)
18992 field_size_in_bits = wi::to_offset (field_size_tree);
18993 else
18994 field_size_in_bits = type_size_in_bits;
18996 decl_align_in_bits = simple_decl_align_in_bits (decl);
18998 /* The GCC front-end doesn't make any attempt to keep track of the
18999 starting bit offset (relative to the start of the containing
19000 structure type) of the hypothetical "containing object" for a
19001 bit-field. Thus, when computing the byte offset value for the
19002 start of the "containing object" of a bit-field, we must deduce
19003 this information on our own. This can be rather tricky to do in
19004 some cases. For example, handling the following structure type
19005 definition when compiling for an i386/i486 target (which only
19006 aligns long long's to 32-bit boundaries) can be very tricky:
19008 struct S { int field1; long long field2:31; };
19010 Fortunately, there is a simple rule-of-thumb which can be used
19011 in such cases. When compiling for an i386/i486, GCC will
19012 allocate 8 bytes for the structure shown above. It decides to
19013 do this based upon one simple rule for bit-field allocation.
19014 GCC allocates each "containing object" for each bit-field at
19015 the first (i.e. lowest addressed) legitimate alignment boundary
19016 (based upon the required minimum alignment for the declared
19017 type of the field) which it can possibly use, subject to the
19018 condition that there is still enough available space remaining
19019 in the containing object (when allocated at the selected point)
19020 to fully accommodate all of the bits of the bit-field itself.
19022 This simple rule makes it obvious why GCC allocates 8 bytes for
19023 each object of the structure type shown above. When looking
19024 for a place to allocate the "containing object" for `field2',
19025 the compiler simply tries to allocate a 64-bit "containing
19026 object" at each successive 32-bit boundary (starting at zero)
19027 until it finds a place to allocate that 64- bit field such that
19028 at least 31 contiguous (and previously unallocated) bits remain
19029 within that selected 64 bit field. (As it turns out, for the
19030 example above, the compiler finds it is OK to allocate the
19031 "containing object" 64-bit field at bit-offset zero within the
19032 structure type.)
19034 Here we attempt to work backwards from the limited set of facts
19035 we're given, and we try to deduce from those facts, where GCC
19036 must have believed that the containing object started (within
19037 the structure type). The value we deduce is then used (by the
19038 callers of this routine) to generate DW_AT_location and
19039 DW_AT_bit_offset attributes for fields (both bit-fields and, in
19040 the case of DW_AT_location, regular fields as well). */
19042 /* Figure out the bit-distance from the start of the structure to
19043 the "deepest" bit of the bit-field. */
19044 deepest_bitpos = bitpos_int + field_size_in_bits;
19046 /* This is the tricky part. Use some fancy footwork to deduce
19047 where the lowest addressed bit of the containing object must
19048 be. */
19049 object_offset_in_bits = deepest_bitpos - type_size_in_bits;
19051 /* Round up to type_align by default. This works best for
19052 bitfields. */
19053 object_offset_in_bits
19054 = round_up_to_align (object_offset_in_bits, type_align_in_bits);
19056 if (wi::gtu_p (object_offset_in_bits, bitpos_int))
19058 object_offset_in_bits = deepest_bitpos - type_size_in_bits;
19060 /* Round up to decl_align instead. */
19061 object_offset_in_bits
19062 = round_up_to_align (object_offset_in_bits, decl_align_in_bits);
19065 object_offset_in_bytes
19066 = wi::lrshift (object_offset_in_bits, LOG2_BITS_PER_UNIT);
19067 if (ctx->variant_part_offset == NULL_TREE)
19069 *cst_offset = object_offset_in_bytes.to_shwi ();
19070 return NULL;
19072 tree_result = wide_int_to_tree (sizetype, object_offset_in_bytes);
19074 else
19075 #endif /* PCC_BITFIELD_TYPE_MATTERS */
19076 tree_result = byte_position (decl);
19078 if (ctx->variant_part_offset != NULL_TREE)
19079 tree_result = fold_build2 (PLUS_EXPR, TREE_TYPE (tree_result),
19080 ctx->variant_part_offset, tree_result);
19082 /* If the byte offset is a constant, it's simplier to handle a native
19083 constant rather than a DWARF expression. */
19084 if (TREE_CODE (tree_result) == INTEGER_CST)
19086 *cst_offset = wi::to_offset (tree_result).to_shwi ();
19087 return NULL;
19089 struct loc_descr_context loc_ctx = {
19090 ctx->struct_type, /* context_type */
19091 NULL_TREE, /* base_decl */
19092 NULL, /* dpi */
19093 false, /* placeholder_arg */
19094 false /* placeholder_seen */
19096 loc_result = loc_list_from_tree (tree_result, 0, &loc_ctx);
19098 /* We want a DWARF expression: abort if we only have a location list with
19099 multiple elements. */
19100 if (!loc_result || !single_element_loc_list_p (loc_result))
19101 return NULL;
19102 else
19103 return loc_result->expr;
19106 /* The following routines define various Dwarf attributes and any data
19107 associated with them. */
19109 /* Add a location description attribute value to a DIE.
19111 This emits location attributes suitable for whole variables and
19112 whole parameters. Note that the location attributes for struct fields are
19113 generated by the routine `data_member_location_attribute' below. */
19115 static inline void
19116 add_AT_location_description (dw_die_ref die, enum dwarf_attribute attr_kind,
19117 dw_loc_list_ref descr)
19119 bool check_no_locviews = true;
19120 if (descr == 0)
19121 return;
19122 if (single_element_loc_list_p (descr))
19123 add_AT_loc (die, attr_kind, descr->expr);
19124 else
19126 add_AT_loc_list (die, attr_kind, descr);
19127 gcc_assert (descr->ll_symbol);
19128 if (attr_kind == DW_AT_location && descr->vl_symbol
19129 && dwarf2out_locviews_in_attribute ())
19131 add_AT_view_list (die, DW_AT_GNU_locviews);
19132 check_no_locviews = false;
19136 if (check_no_locviews)
19137 gcc_assert (!get_AT (die, DW_AT_GNU_locviews));
19140 /* Add DW_AT_accessibility attribute to DIE if needed. */
19142 static void
19143 add_accessibility_attribute (dw_die_ref die, tree decl)
19145 /* In DWARF3+ the default is DW_ACCESS_private only in DW_TAG_class_type
19146 children, otherwise the default is DW_ACCESS_public. In DWARF2
19147 the default has always been DW_ACCESS_public. */
19148 if (TREE_PROTECTED (decl))
19149 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
19150 else if (TREE_PRIVATE (decl))
19152 if (dwarf_version == 2
19153 || die->die_parent == NULL
19154 || die->die_parent->die_tag != DW_TAG_class_type)
19155 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_private);
19157 else if (dwarf_version > 2
19158 && die->die_parent
19159 && die->die_parent->die_tag == DW_TAG_class_type)
19160 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
19163 /* Attach the specialized form of location attribute used for data members of
19164 struct and union types. In the special case of a FIELD_DECL node which
19165 represents a bit-field, the "offset" part of this special location
19166 descriptor must indicate the distance in bytes from the lowest-addressed
19167 byte of the containing struct or union type to the lowest-addressed byte of
19168 the "containing object" for the bit-field. (See the `field_byte_offset'
19169 function above).
19171 For any given bit-field, the "containing object" is a hypothetical object
19172 (of some integral or enum type) within which the given bit-field lives. The
19173 type of this hypothetical "containing object" is always the same as the
19174 declared type of the individual bit-field itself (for GCC anyway... the
19175 DWARF spec doesn't actually mandate this). Note that it is the size (in
19176 bytes) of the hypothetical "containing object" which will be given in the
19177 DW_AT_byte_size attribute for this bit-field. (See the
19178 `byte_size_attribute' function below.) It is also used when calculating the
19179 value of the DW_AT_bit_offset attribute. (See the `bit_offset_attribute'
19180 function below.)
19182 CTX is required: see the comment for VLR_CONTEXT. */
19184 static void
19185 add_data_member_location_attribute (dw_die_ref die,
19186 tree decl,
19187 struct vlr_context *ctx)
19189 HOST_WIDE_INT offset;
19190 dw_loc_descr_ref loc_descr = 0;
19192 if (TREE_CODE (decl) == TREE_BINFO)
19194 /* We're working on the TAG_inheritance for a base class. */
19195 if (BINFO_VIRTUAL_P (decl) && is_cxx ())
19197 /* For C++ virtual bases we can't just use BINFO_OFFSET, as they
19198 aren't at a fixed offset from all (sub)objects of the same
19199 type. We need to extract the appropriate offset from our
19200 vtable. The following dwarf expression means
19202 BaseAddr = ObAddr + *((*ObAddr) - Offset)
19204 This is specific to the V3 ABI, of course. */
19206 dw_loc_descr_ref tmp;
19208 /* Make a copy of the object address. */
19209 tmp = new_loc_descr (DW_OP_dup, 0, 0);
19210 add_loc_descr (&loc_descr, tmp);
19212 /* Extract the vtable address. */
19213 tmp = new_loc_descr (DW_OP_deref, 0, 0);
19214 add_loc_descr (&loc_descr, tmp);
19216 /* Calculate the address of the offset. */
19217 offset = tree_to_shwi (BINFO_VPTR_FIELD (decl));
19218 gcc_assert (offset < 0);
19220 tmp = int_loc_descriptor (-offset);
19221 add_loc_descr (&loc_descr, tmp);
19222 tmp = new_loc_descr (DW_OP_minus, 0, 0);
19223 add_loc_descr (&loc_descr, tmp);
19225 /* Extract the offset. */
19226 tmp = new_loc_descr (DW_OP_deref, 0, 0);
19227 add_loc_descr (&loc_descr, tmp);
19229 /* Add it to the object address. */
19230 tmp = new_loc_descr (DW_OP_plus, 0, 0);
19231 add_loc_descr (&loc_descr, tmp);
19233 else
19234 offset = tree_to_shwi (BINFO_OFFSET (decl));
19236 else
19238 loc_descr = field_byte_offset (decl, ctx, &offset);
19240 /* If loc_descr is available then we know the field offset is dynamic.
19241 However, GDB does not handle dynamic field offsets very well at the
19242 moment. */
19243 if (loc_descr != NULL && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
19245 loc_descr = NULL;
19246 offset = 0;
19249 /* Data member location evalutation starts with the base address on the
19250 stack. Compute the field offset and add it to this base address. */
19251 else if (loc_descr != NULL)
19252 add_loc_descr (&loc_descr, new_loc_descr (DW_OP_plus, 0, 0));
19255 if (! loc_descr)
19257 /* While DW_AT_data_bit_offset has been added already in DWARF4,
19258 e.g. GDB only added support to it in November 2016. For DWARF5
19259 we need newer debug info consumers anyway. We might change this
19260 to dwarf_version >= 4 once most consumers catched up. */
19261 if (dwarf_version >= 5
19262 && TREE_CODE (decl) == FIELD_DECL
19263 && DECL_BIT_FIELD_TYPE (decl))
19265 tree off = bit_position (decl);
19266 if (tree_fits_uhwi_p (off) && get_AT (die, DW_AT_bit_size))
19268 remove_AT (die, DW_AT_byte_size);
19269 remove_AT (die, DW_AT_bit_offset);
19270 add_AT_unsigned (die, DW_AT_data_bit_offset, tree_to_uhwi (off));
19271 return;
19274 if (dwarf_version > 2)
19276 /* Don't need to output a location expression, just the constant. */
19277 if (offset < 0)
19278 add_AT_int (die, DW_AT_data_member_location, offset);
19279 else
19280 add_AT_unsigned (die, DW_AT_data_member_location, offset);
19281 return;
19283 else
19285 enum dwarf_location_atom op;
19287 /* The DWARF2 standard says that we should assume that the structure
19288 address is already on the stack, so we can specify a structure
19289 field address by using DW_OP_plus_uconst. */
19290 op = DW_OP_plus_uconst;
19291 loc_descr = new_loc_descr (op, offset, 0);
19295 add_AT_loc (die, DW_AT_data_member_location, loc_descr);
19298 /* Writes integer values to dw_vec_const array. */
19300 static void
19301 insert_int (HOST_WIDE_INT val, unsigned int size, unsigned char *dest)
19303 while (size != 0)
19305 *dest++ = val & 0xff;
19306 val >>= 8;
19307 --size;
19311 /* Reads integers from dw_vec_const array. Inverse of insert_int. */
19313 static HOST_WIDE_INT
19314 extract_int (const unsigned char *src, unsigned int size)
19316 HOST_WIDE_INT val = 0;
19318 src += size;
19319 while (size != 0)
19321 val <<= 8;
19322 val |= *--src & 0xff;
19323 --size;
19325 return val;
19328 /* Writes wide_int values to dw_vec_const array. */
19330 static void
19331 insert_wide_int (const wide_int &val, unsigned char *dest, int elt_size)
19333 int i;
19335 if (elt_size <= HOST_BITS_PER_WIDE_INT/BITS_PER_UNIT)
19337 insert_int ((HOST_WIDE_INT) val.elt (0), elt_size, dest);
19338 return;
19341 /* We'd have to extend this code to support odd sizes. */
19342 gcc_assert (elt_size % (HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT) == 0);
19344 int n = elt_size / (HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT);
19346 if (WORDS_BIG_ENDIAN)
19347 for (i = n - 1; i >= 0; i--)
19349 insert_int ((HOST_WIDE_INT) val.elt (i), sizeof (HOST_WIDE_INT), dest);
19350 dest += sizeof (HOST_WIDE_INT);
19352 else
19353 for (i = 0; i < n; i++)
19355 insert_int ((HOST_WIDE_INT) val.elt (i), sizeof (HOST_WIDE_INT), dest);
19356 dest += sizeof (HOST_WIDE_INT);
19360 /* Writes floating point values to dw_vec_const array. */
19362 static void
19363 insert_float (const_rtx rtl, unsigned char *array)
19365 long val[4];
19366 int i;
19367 scalar_float_mode mode = as_a <scalar_float_mode> (GET_MODE (rtl));
19369 real_to_target (val, CONST_DOUBLE_REAL_VALUE (rtl), mode);
19371 /* real_to_target puts 32-bit pieces in each long. Pack them. */
19372 for (i = 0; i < GET_MODE_SIZE (mode) / 4; i++)
19374 insert_int (val[i], 4, array);
19375 array += 4;
19379 /* Attach a DW_AT_const_value attribute for a variable or a parameter which
19380 does not have a "location" either in memory or in a register. These
19381 things can arise in GNU C when a constant is passed as an actual parameter
19382 to an inlined function. They can also arise in C++ where declared
19383 constants do not necessarily get memory "homes". */
19385 static bool
19386 add_const_value_attribute (dw_die_ref die, rtx rtl)
19388 switch (GET_CODE (rtl))
19390 case CONST_INT:
19392 HOST_WIDE_INT val = INTVAL (rtl);
19394 if (val < 0)
19395 add_AT_int (die, DW_AT_const_value, val);
19396 else
19397 add_AT_unsigned (die, DW_AT_const_value, (unsigned HOST_WIDE_INT) val);
19399 return true;
19401 case CONST_WIDE_INT:
19403 wide_int w1 = rtx_mode_t (rtl, MAX_MODE_INT);
19404 unsigned int prec = MIN (wi::min_precision (w1, UNSIGNED),
19405 (unsigned int)CONST_WIDE_INT_NUNITS (rtl) * HOST_BITS_PER_WIDE_INT);
19406 wide_int w = wi::zext (w1, prec);
19407 add_AT_wide (die, DW_AT_const_value, w);
19409 return true;
19411 case CONST_DOUBLE:
19412 /* Note that a CONST_DOUBLE rtx could represent either an integer or a
19413 floating-point constant. A CONST_DOUBLE is used whenever the
19414 constant requires more than one word in order to be adequately
19415 represented. */
19416 if (TARGET_SUPPORTS_WIDE_INT == 0
19417 && !SCALAR_FLOAT_MODE_P (GET_MODE (rtl)))
19418 add_AT_double (die, DW_AT_const_value,
19419 CONST_DOUBLE_HIGH (rtl), CONST_DOUBLE_LOW (rtl));
19420 else
19422 scalar_float_mode mode = as_a <scalar_float_mode> (GET_MODE (rtl));
19423 unsigned int length = GET_MODE_SIZE (mode);
19424 unsigned char *array = ggc_vec_alloc<unsigned char> (length);
19426 insert_float (rtl, array);
19427 add_AT_vec (die, DW_AT_const_value, length / 4, 4, array);
19429 return true;
19431 case CONST_VECTOR:
19433 unsigned int length;
19434 if (!CONST_VECTOR_NUNITS (rtl).is_constant (&length))
19435 return false;
19437 machine_mode mode = GET_MODE (rtl);
19438 unsigned int elt_size = GET_MODE_UNIT_SIZE (mode);
19439 unsigned char *array
19440 = ggc_vec_alloc<unsigned char> (length * elt_size);
19441 unsigned int i;
19442 unsigned char *p;
19443 machine_mode imode = GET_MODE_INNER (mode);
19445 switch (GET_MODE_CLASS (mode))
19447 case MODE_VECTOR_INT:
19448 for (i = 0, p = array; i < length; i++, p += elt_size)
19450 rtx elt = CONST_VECTOR_ELT (rtl, i);
19451 insert_wide_int (rtx_mode_t (elt, imode), p, elt_size);
19453 break;
19455 case MODE_VECTOR_FLOAT:
19456 for (i = 0, p = array; i < length; i++, p += elt_size)
19458 rtx elt = CONST_VECTOR_ELT (rtl, i);
19459 insert_float (elt, p);
19461 break;
19463 default:
19464 gcc_unreachable ();
19467 add_AT_vec (die, DW_AT_const_value, length, elt_size, array);
19469 return true;
19471 case CONST_STRING:
19472 if (dwarf_version >= 4 || !dwarf_strict)
19474 dw_loc_descr_ref loc_result;
19475 resolve_one_addr (&rtl);
19476 rtl_addr:
19477 loc_result = new_addr_loc_descr (rtl, dtprel_false);
19478 add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0));
19479 add_AT_loc (die, DW_AT_location, loc_result);
19480 vec_safe_push (used_rtx_array, rtl);
19481 return true;
19483 return false;
19485 case CONST:
19486 if (CONSTANT_P (XEXP (rtl, 0)))
19487 return add_const_value_attribute (die, XEXP (rtl, 0));
19488 /* FALLTHROUGH */
19489 case SYMBOL_REF:
19490 if (!const_ok_for_output (rtl))
19491 return false;
19492 /* FALLTHROUGH */
19493 case LABEL_REF:
19494 if (dwarf_version >= 4 || !dwarf_strict)
19495 goto rtl_addr;
19496 return false;
19498 case PLUS:
19499 /* In cases where an inlined instance of an inline function is passed
19500 the address of an `auto' variable (which is local to the caller) we
19501 can get a situation where the DECL_RTL of the artificial local
19502 variable (for the inlining) which acts as a stand-in for the
19503 corresponding formal parameter (of the inline function) will look
19504 like (plus:SI (reg:SI FRAME_PTR) (const_int ...)). This is not
19505 exactly a compile-time constant expression, but it isn't the address
19506 of the (artificial) local variable either. Rather, it represents the
19507 *value* which the artificial local variable always has during its
19508 lifetime. We currently have no way to represent such quasi-constant
19509 values in Dwarf, so for now we just punt and generate nothing. */
19510 return false;
19512 case HIGH:
19513 case CONST_FIXED:
19514 return false;
19516 case MEM:
19517 if (GET_CODE (XEXP (rtl, 0)) == CONST_STRING
19518 && MEM_READONLY_P (rtl)
19519 && GET_MODE (rtl) == BLKmode)
19521 add_AT_string (die, DW_AT_const_value, XSTR (XEXP (rtl, 0), 0));
19522 return true;
19524 return false;
19526 default:
19527 /* No other kinds of rtx should be possible here. */
19528 gcc_unreachable ();
19530 return false;
19533 /* Determine whether the evaluation of EXPR references any variables
19534 or functions which aren't otherwise used (and therefore may not be
19535 output). */
19536 static tree
19537 reference_to_unused (tree * tp, int * walk_subtrees,
19538 void * data ATTRIBUTE_UNUSED)
19540 if (! EXPR_P (*tp) && ! CONSTANT_CLASS_P (*tp))
19541 *walk_subtrees = 0;
19543 if (DECL_P (*tp) && ! TREE_PUBLIC (*tp) && ! TREE_USED (*tp)
19544 && ! TREE_ASM_WRITTEN (*tp))
19545 return *tp;
19546 /* ??? The C++ FE emits debug information for using decls, so
19547 putting gcc_unreachable here falls over. See PR31899. For now
19548 be conservative. */
19549 else if (!symtab->global_info_ready && VAR_OR_FUNCTION_DECL_P (*tp))
19550 return *tp;
19551 else if (VAR_P (*tp))
19553 varpool_node *node = varpool_node::get (*tp);
19554 if (!node || !node->definition)
19555 return *tp;
19557 else if (TREE_CODE (*tp) == FUNCTION_DECL
19558 && (!DECL_EXTERNAL (*tp) || DECL_DECLARED_INLINE_P (*tp)))
19560 /* The call graph machinery must have finished analyzing,
19561 optimizing and gimplifying the CU by now.
19562 So if *TP has no call graph node associated
19563 to it, it means *TP will not be emitted. */
19564 if (!cgraph_node::get (*tp))
19565 return *tp;
19567 else if (TREE_CODE (*tp) == STRING_CST && !TREE_ASM_WRITTEN (*tp))
19568 return *tp;
19570 return NULL_TREE;
19573 /* Generate an RTL constant from a decl initializer INIT with decl type TYPE,
19574 for use in a later add_const_value_attribute call. */
19576 static rtx
19577 rtl_for_decl_init (tree init, tree type)
19579 rtx rtl = NULL_RTX;
19581 STRIP_NOPS (init);
19583 /* If a variable is initialized with a string constant without embedded
19584 zeros, build CONST_STRING. */
19585 if (TREE_CODE (init) == STRING_CST && TREE_CODE (type) == ARRAY_TYPE)
19587 tree enttype = TREE_TYPE (type);
19588 tree domain = TYPE_DOMAIN (type);
19589 scalar_int_mode mode;
19591 if (is_int_mode (TYPE_MODE (enttype), &mode)
19592 && GET_MODE_SIZE (mode) == 1
19593 && domain
19594 && integer_zerop (TYPE_MIN_VALUE (domain))
19595 && compare_tree_int (TYPE_MAX_VALUE (domain),
19596 TREE_STRING_LENGTH (init) - 1) == 0
19597 && ((size_t) TREE_STRING_LENGTH (init)
19598 == strlen (TREE_STRING_POINTER (init)) + 1))
19600 rtl = gen_rtx_CONST_STRING (VOIDmode,
19601 ggc_strdup (TREE_STRING_POINTER (init)));
19602 rtl = gen_rtx_MEM (BLKmode, rtl);
19603 MEM_READONLY_P (rtl) = 1;
19606 /* Other aggregates, and complex values, could be represented using
19607 CONCAT: FIXME! */
19608 else if (AGGREGATE_TYPE_P (type)
19609 || (TREE_CODE (init) == VIEW_CONVERT_EXPR
19610 && AGGREGATE_TYPE_P (TREE_TYPE (TREE_OPERAND (init, 0))))
19611 || TREE_CODE (type) == COMPLEX_TYPE)
19613 /* Vectors only work if their mode is supported by the target.
19614 FIXME: generic vectors ought to work too. */
19615 else if (TREE_CODE (type) == VECTOR_TYPE
19616 && !VECTOR_MODE_P (TYPE_MODE (type)))
19618 /* If the initializer is something that we know will expand into an
19619 immediate RTL constant, expand it now. We must be careful not to
19620 reference variables which won't be output. */
19621 else if (initializer_constant_valid_p (init, type)
19622 && ! walk_tree (&init, reference_to_unused, NULL, NULL))
19624 /* Convert vector CONSTRUCTOR initializers to VECTOR_CST if
19625 possible. */
19626 if (TREE_CODE (type) == VECTOR_TYPE)
19627 switch (TREE_CODE (init))
19629 case VECTOR_CST:
19630 break;
19631 case CONSTRUCTOR:
19632 if (TREE_CONSTANT (init))
19634 vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (init);
19635 bool constant_p = true;
19636 tree value;
19637 unsigned HOST_WIDE_INT ix;
19639 /* Even when ctor is constant, it might contain non-*_CST
19640 elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
19641 belong into VECTOR_CST nodes. */
19642 FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
19643 if (!CONSTANT_CLASS_P (value))
19645 constant_p = false;
19646 break;
19649 if (constant_p)
19651 init = build_vector_from_ctor (type, elts);
19652 break;
19655 /* FALLTHRU */
19657 default:
19658 return NULL;
19661 rtl = expand_expr (init, NULL_RTX, VOIDmode, EXPAND_INITIALIZER);
19663 /* If expand_expr returns a MEM, it wasn't immediate. */
19664 gcc_assert (!rtl || !MEM_P (rtl));
19667 return rtl;
19670 /* Generate RTL for the variable DECL to represent its location. */
19672 static rtx
19673 rtl_for_decl_location (tree decl)
19675 rtx rtl;
19677 /* Here we have to decide where we are going to say the parameter "lives"
19678 (as far as the debugger is concerned). We only have a couple of
19679 choices. GCC provides us with DECL_RTL and with DECL_INCOMING_RTL.
19681 DECL_RTL normally indicates where the parameter lives during most of the
19682 activation of the function. If optimization is enabled however, this
19683 could be either NULL or else a pseudo-reg. Both of those cases indicate
19684 that the parameter doesn't really live anywhere (as far as the code
19685 generation parts of GCC are concerned) during most of the function's
19686 activation. That will happen (for example) if the parameter is never
19687 referenced within the function.
19689 We could just generate a location descriptor here for all non-NULL
19690 non-pseudo values of DECL_RTL and ignore all of the rest, but we can be
19691 a little nicer than that if we also consider DECL_INCOMING_RTL in cases
19692 where DECL_RTL is NULL or is a pseudo-reg.
19694 Note however that we can only get away with using DECL_INCOMING_RTL as
19695 a backup substitute for DECL_RTL in certain limited cases. In cases
19696 where DECL_ARG_TYPE (decl) indicates the same type as TREE_TYPE (decl),
19697 we can be sure that the parameter was passed using the same type as it is
19698 declared to have within the function, and that its DECL_INCOMING_RTL
19699 points us to a place where a value of that type is passed.
19701 In cases where DECL_ARG_TYPE (decl) and TREE_TYPE (decl) are different,
19702 we cannot (in general) use DECL_INCOMING_RTL as a substitute for DECL_RTL
19703 because in these cases DECL_INCOMING_RTL points us to a value of some
19704 type which is *different* from the type of the parameter itself. Thus,
19705 if we tried to use DECL_INCOMING_RTL to generate a location attribute in
19706 such cases, the debugger would end up (for example) trying to fetch a
19707 `float' from a place which actually contains the first part of a
19708 `double'. That would lead to really incorrect and confusing
19709 output at debug-time.
19711 So, in general, we *do not* use DECL_INCOMING_RTL as a backup for DECL_RTL
19712 in cases where DECL_ARG_TYPE (decl) != TREE_TYPE (decl). There
19713 are a couple of exceptions however. On little-endian machines we can
19714 get away with using DECL_INCOMING_RTL even when DECL_ARG_TYPE (decl) is
19715 not the same as TREE_TYPE (decl), but only when DECL_ARG_TYPE (decl) is
19716 an integral type that is smaller than TREE_TYPE (decl). These cases arise
19717 when (on a little-endian machine) a non-prototyped function has a
19718 parameter declared to be of type `short' or `char'. In such cases,
19719 TREE_TYPE (decl) will be `short' or `char', DECL_ARG_TYPE (decl) will
19720 be `int', and DECL_INCOMING_RTL will point to the lowest-order byte of the
19721 passed `int' value. If the debugger then uses that address to fetch
19722 a `short' or a `char' (on a little-endian machine) the result will be
19723 the correct data, so we allow for such exceptional cases below.
19725 Note that our goal here is to describe the place where the given formal
19726 parameter lives during most of the function's activation (i.e. between the
19727 end of the prologue and the start of the epilogue). We'll do that as best
19728 as we can. Note however that if the given formal parameter is modified
19729 sometime during the execution of the function, then a stack backtrace (at
19730 debug-time) will show the function as having been called with the *new*
19731 value rather than the value which was originally passed in. This happens
19732 rarely enough that it is not a major problem, but it *is* a problem, and
19733 I'd like to fix it.
19735 A future version of dwarf2out.c may generate two additional attributes for
19736 any given DW_TAG_formal_parameter DIE which will describe the "passed
19737 type" and the "passed location" for the given formal parameter in addition
19738 to the attributes we now generate to indicate the "declared type" and the
19739 "active location" for each parameter. This additional set of attributes
19740 could be used by debuggers for stack backtraces. Separately, note that
19741 sometimes DECL_RTL can be NULL and DECL_INCOMING_RTL can be NULL also.
19742 This happens (for example) for inlined-instances of inline function formal
19743 parameters which are never referenced. This really shouldn't be
19744 happening. All PARM_DECL nodes should get valid non-NULL
19745 DECL_INCOMING_RTL values. FIXME. */
19747 /* Use DECL_RTL as the "location" unless we find something better. */
19748 rtl = DECL_RTL_IF_SET (decl);
19750 /* When generating abstract instances, ignore everything except
19751 constants, symbols living in memory, and symbols living in
19752 fixed registers. */
19753 if (! reload_completed)
19755 if (rtl
19756 && (CONSTANT_P (rtl)
19757 || (MEM_P (rtl)
19758 && CONSTANT_P (XEXP (rtl, 0)))
19759 || (REG_P (rtl)
19760 && VAR_P (decl)
19761 && TREE_STATIC (decl))))
19763 rtl = targetm.delegitimize_address (rtl);
19764 return rtl;
19766 rtl = NULL_RTX;
19768 else if (TREE_CODE (decl) == PARM_DECL)
19770 if (rtl == NULL_RTX
19771 || is_pseudo_reg (rtl)
19772 || (MEM_P (rtl)
19773 && is_pseudo_reg (XEXP (rtl, 0))
19774 && DECL_INCOMING_RTL (decl)
19775 && MEM_P (DECL_INCOMING_RTL (decl))
19776 && GET_MODE (rtl) == GET_MODE (DECL_INCOMING_RTL (decl))))
19778 tree declared_type = TREE_TYPE (decl);
19779 tree passed_type = DECL_ARG_TYPE (decl);
19780 machine_mode dmode = TYPE_MODE (declared_type);
19781 machine_mode pmode = TYPE_MODE (passed_type);
19783 /* This decl represents a formal parameter which was optimized out.
19784 Note that DECL_INCOMING_RTL may be NULL in here, but we handle
19785 all cases where (rtl == NULL_RTX) just below. */
19786 if (dmode == pmode)
19787 rtl = DECL_INCOMING_RTL (decl);
19788 else if ((rtl == NULL_RTX || is_pseudo_reg (rtl))
19789 && SCALAR_INT_MODE_P (dmode)
19790 && known_le (GET_MODE_SIZE (dmode), GET_MODE_SIZE (pmode))
19791 && DECL_INCOMING_RTL (decl))
19793 rtx inc = DECL_INCOMING_RTL (decl);
19794 if (REG_P (inc))
19795 rtl = inc;
19796 else if (MEM_P (inc))
19798 if (BYTES_BIG_ENDIAN)
19799 rtl = adjust_address_nv (inc, dmode,
19800 GET_MODE_SIZE (pmode)
19801 - GET_MODE_SIZE (dmode));
19802 else
19803 rtl = inc;
19808 /* If the parm was passed in registers, but lives on the stack, then
19809 make a big endian correction if the mode of the type of the
19810 parameter is not the same as the mode of the rtl. */
19811 /* ??? This is the same series of checks that are made in dbxout.c before
19812 we reach the big endian correction code there. It isn't clear if all
19813 of these checks are necessary here, but keeping them all is the safe
19814 thing to do. */
19815 else if (MEM_P (rtl)
19816 && XEXP (rtl, 0) != const0_rtx
19817 && ! CONSTANT_P (XEXP (rtl, 0))
19818 /* Not passed in memory. */
19819 && !MEM_P (DECL_INCOMING_RTL (decl))
19820 /* Not passed by invisible reference. */
19821 && (!REG_P (XEXP (rtl, 0))
19822 || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM
19823 || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM
19824 #if !HARD_FRAME_POINTER_IS_ARG_POINTER
19825 || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM
19826 #endif
19828 /* Big endian correction check. */
19829 && BYTES_BIG_ENDIAN
19830 && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl)
19831 && known_lt (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))),
19832 UNITS_PER_WORD))
19834 machine_mode addr_mode = get_address_mode (rtl);
19835 poly_int64 offset = (UNITS_PER_WORD
19836 - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))));
19838 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
19839 plus_constant (addr_mode, XEXP (rtl, 0), offset));
19842 else if (VAR_P (decl)
19843 && rtl
19844 && MEM_P (rtl)
19845 && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl)))
19847 machine_mode addr_mode = get_address_mode (rtl);
19848 poly_int64 offset = byte_lowpart_offset (TYPE_MODE (TREE_TYPE (decl)),
19849 GET_MODE (rtl));
19851 /* If a variable is declared "register" yet is smaller than
19852 a register, then if we store the variable to memory, it
19853 looks like we're storing a register-sized value, when in
19854 fact we are not. We need to adjust the offset of the
19855 storage location to reflect the actual value's bytes,
19856 else gdb will not be able to display it. */
19857 if (maybe_ne (offset, 0))
19858 rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
19859 plus_constant (addr_mode, XEXP (rtl, 0), offset));
19862 /* A variable with no DECL_RTL but a DECL_INITIAL is a compile-time constant,
19863 and will have been substituted directly into all expressions that use it.
19864 C does not have such a concept, but C++ and other languages do. */
19865 if (!rtl && VAR_P (decl) && DECL_INITIAL (decl))
19866 rtl = rtl_for_decl_init (DECL_INITIAL (decl), TREE_TYPE (decl));
19868 if (rtl)
19869 rtl = targetm.delegitimize_address (rtl);
19871 /* If we don't look past the constant pool, we risk emitting a
19872 reference to a constant pool entry that isn't referenced from
19873 code, and thus is not emitted. */
19874 if (rtl)
19875 rtl = avoid_constant_pool_reference (rtl);
19877 /* Try harder to get a rtl. If this symbol ends up not being emitted
19878 in the current CU, resolve_addr will remove the expression referencing
19879 it. */
19880 if (rtl == NULL_RTX
19881 && VAR_P (decl)
19882 && !DECL_EXTERNAL (decl)
19883 && TREE_STATIC (decl)
19884 && DECL_NAME (decl)
19885 && !DECL_HARD_REGISTER (decl)
19886 && DECL_MODE (decl) != VOIDmode)
19888 rtl = make_decl_rtl_for_debug (decl);
19889 if (!MEM_P (rtl)
19890 || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF
19891 || SYMBOL_REF_DECL (XEXP (rtl, 0)) != decl)
19892 rtl = NULL_RTX;
19895 return rtl;
19898 /* Check whether decl is a Fortran COMMON symbol. If not, NULL_TREE is
19899 returned. If so, the decl for the COMMON block is returned, and the
19900 value is the offset into the common block for the symbol. */
19902 static tree
19903 fortran_common (tree decl, HOST_WIDE_INT *value)
19905 tree val_expr, cvar;
19906 machine_mode mode;
19907 poly_int64 bitsize, bitpos;
19908 tree offset;
19909 HOST_WIDE_INT cbitpos;
19910 int unsignedp, reversep, volatilep = 0;
19912 /* If the decl isn't a VAR_DECL, or if it isn't static, or if
19913 it does not have a value (the offset into the common area), or if it
19914 is thread local (as opposed to global) then it isn't common, and shouldn't
19915 be handled as such. */
19916 if (!VAR_P (decl)
19917 || !TREE_STATIC (decl)
19918 || !DECL_HAS_VALUE_EXPR_P (decl)
19919 || !is_fortran ())
19920 return NULL_TREE;
19922 val_expr = DECL_VALUE_EXPR (decl);
19923 if (TREE_CODE (val_expr) != COMPONENT_REF)
19924 return NULL_TREE;
19926 cvar = get_inner_reference (val_expr, &bitsize, &bitpos, &offset, &mode,
19927 &unsignedp, &reversep, &volatilep);
19929 if (cvar == NULL_TREE
19930 || !VAR_P (cvar)
19931 || DECL_ARTIFICIAL (cvar)
19932 || !TREE_PUBLIC (cvar)
19933 /* We don't expect to have to cope with variable offsets,
19934 since at present all static data must have a constant size. */
19935 || !bitpos.is_constant (&cbitpos))
19936 return NULL_TREE;
19938 *value = 0;
19939 if (offset != NULL)
19941 if (!tree_fits_shwi_p (offset))
19942 return NULL_TREE;
19943 *value = tree_to_shwi (offset);
19945 if (cbitpos != 0)
19946 *value += cbitpos / BITS_PER_UNIT;
19948 return cvar;
19951 /* Generate *either* a DW_AT_location attribute or else a DW_AT_const_value
19952 data attribute for a variable or a parameter. We generate the
19953 DW_AT_const_value attribute only in those cases where the given variable
19954 or parameter does not have a true "location" either in memory or in a
19955 register. This can happen (for example) when a constant is passed as an
19956 actual argument in a call to an inline function. (It's possible that
19957 these things can crop up in other ways also.) Note that one type of
19958 constant value which can be passed into an inlined function is a constant
19959 pointer. This can happen for example if an actual argument in an inlined
19960 function call evaluates to a compile-time constant address.
19962 CACHE_P is true if it is worth caching the location list for DECL,
19963 so that future calls can reuse it rather than regenerate it from scratch.
19964 This is true for BLOCK_NONLOCALIZED_VARS in inlined subroutines,
19965 since we will need to refer to them each time the function is inlined. */
19967 static bool
19968 add_location_or_const_value_attribute (dw_die_ref die, tree decl, bool cache_p)
19970 rtx rtl;
19971 dw_loc_list_ref list;
19972 var_loc_list *loc_list;
19973 cached_dw_loc_list *cache;
19975 if (early_dwarf)
19976 return false;
19978 if (TREE_CODE (decl) == ERROR_MARK)
19979 return false;
19981 if (get_AT (die, DW_AT_location)
19982 || get_AT (die, DW_AT_const_value))
19983 return true;
19985 gcc_assert (VAR_P (decl) || TREE_CODE (decl) == PARM_DECL
19986 || TREE_CODE (decl) == RESULT_DECL);
19988 /* Try to get some constant RTL for this decl, and use that as the value of
19989 the location. */
19991 rtl = rtl_for_decl_location (decl);
19992 if (rtl && (CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING)
19993 && add_const_value_attribute (die, rtl))
19994 return true;
19996 /* See if we have single element location list that is equivalent to
19997 a constant value. That way we are better to use add_const_value_attribute
19998 rather than expanding constant value equivalent. */
19999 loc_list = lookup_decl_loc (decl);
20000 if (loc_list
20001 && loc_list->first
20002 && loc_list->first->next == NULL
20003 && NOTE_P (loc_list->first->loc)
20004 && NOTE_VAR_LOCATION (loc_list->first->loc)
20005 && NOTE_VAR_LOCATION_LOC (loc_list->first->loc))
20007 struct var_loc_node *node;
20009 node = loc_list->first;
20010 rtl = NOTE_VAR_LOCATION_LOC (node->loc);
20011 if (GET_CODE (rtl) == EXPR_LIST)
20012 rtl = XEXP (rtl, 0);
20013 if ((CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING)
20014 && add_const_value_attribute (die, rtl))
20015 return true;
20017 /* If this decl is from BLOCK_NONLOCALIZED_VARS, we might need its
20018 list several times. See if we've already cached the contents. */
20019 list = NULL;
20020 if (loc_list == NULL || cached_dw_loc_list_table == NULL)
20021 cache_p = false;
20022 if (cache_p)
20024 cache = cached_dw_loc_list_table->find_with_hash (decl, DECL_UID (decl));
20025 if (cache)
20026 list = cache->loc_list;
20028 if (list == NULL)
20030 list = loc_list_from_tree (decl, decl_by_reference_p (decl) ? 0 : 2,
20031 NULL);
20032 /* It is usually worth caching this result if the decl is from
20033 BLOCK_NONLOCALIZED_VARS and if the list has at least two elements. */
20034 if (cache_p && list && list->dw_loc_next)
20036 cached_dw_loc_list **slot
20037 = cached_dw_loc_list_table->find_slot_with_hash (decl,
20038 DECL_UID (decl),
20039 INSERT);
20040 cache = ggc_cleared_alloc<cached_dw_loc_list> ();
20041 cache->decl_id = DECL_UID (decl);
20042 cache->loc_list = list;
20043 *slot = cache;
20046 if (list)
20048 add_AT_location_description (die, DW_AT_location, list);
20049 return true;
20051 /* None of that worked, so it must not really have a location;
20052 try adding a constant value attribute from the DECL_INITIAL. */
20053 return tree_add_const_value_attribute_for_decl (die, decl);
20056 /* Helper function for tree_add_const_value_attribute. Natively encode
20057 initializer INIT into an array. Return true if successful. */
20059 static bool
20060 native_encode_initializer (tree init, unsigned char *array, int size)
20062 tree type;
20064 if (init == NULL_TREE)
20065 return false;
20067 STRIP_NOPS (init);
20068 switch (TREE_CODE (init))
20070 case STRING_CST:
20071 type = TREE_TYPE (init);
20072 if (TREE_CODE (type) == ARRAY_TYPE)
20074 tree enttype = TREE_TYPE (type);
20075 scalar_int_mode mode;
20077 if (!is_int_mode (TYPE_MODE (enttype), &mode)
20078 || GET_MODE_SIZE (mode) != 1)
20079 return false;
20080 if (int_size_in_bytes (type) != size)
20081 return false;
20082 if (size > TREE_STRING_LENGTH (init))
20084 memcpy (array, TREE_STRING_POINTER (init),
20085 TREE_STRING_LENGTH (init));
20086 memset (array + TREE_STRING_LENGTH (init),
20087 '\0', size - TREE_STRING_LENGTH (init));
20089 else
20090 memcpy (array, TREE_STRING_POINTER (init), size);
20091 return true;
20093 return false;
20094 case CONSTRUCTOR:
20095 type = TREE_TYPE (init);
20096 if (int_size_in_bytes (type) != size)
20097 return false;
20098 if (TREE_CODE (type) == ARRAY_TYPE)
20100 HOST_WIDE_INT min_index;
20101 unsigned HOST_WIDE_INT cnt;
20102 int curpos = 0, fieldsize;
20103 constructor_elt *ce;
20105 if (TYPE_DOMAIN (type) == NULL_TREE
20106 || !tree_fits_shwi_p (TYPE_MIN_VALUE (TYPE_DOMAIN (type))))
20107 return false;
20109 fieldsize = int_size_in_bytes (TREE_TYPE (type));
20110 if (fieldsize <= 0)
20111 return false;
20113 min_index = tree_to_shwi (TYPE_MIN_VALUE (TYPE_DOMAIN (type)));
20114 memset (array, '\0', size);
20115 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (init), cnt, ce)
20117 tree val = ce->value;
20118 tree index = ce->index;
20119 int pos = curpos;
20120 if (index && TREE_CODE (index) == RANGE_EXPR)
20121 pos = (tree_to_shwi (TREE_OPERAND (index, 0)) - min_index)
20122 * fieldsize;
20123 else if (index)
20124 pos = (tree_to_shwi (index) - min_index) * fieldsize;
20126 if (val)
20128 STRIP_NOPS (val);
20129 if (!native_encode_initializer (val, array + pos, fieldsize))
20130 return false;
20132 curpos = pos + fieldsize;
20133 if (index && TREE_CODE (index) == RANGE_EXPR)
20135 int count = tree_to_shwi (TREE_OPERAND (index, 1))
20136 - tree_to_shwi (TREE_OPERAND (index, 0));
20137 while (count-- > 0)
20139 if (val)
20140 memcpy (array + curpos, array + pos, fieldsize);
20141 curpos += fieldsize;
20144 gcc_assert (curpos <= size);
20146 return true;
20148 else if (TREE_CODE (type) == RECORD_TYPE
20149 || TREE_CODE (type) == UNION_TYPE)
20151 tree field = NULL_TREE;
20152 unsigned HOST_WIDE_INT cnt;
20153 constructor_elt *ce;
20155 if (int_size_in_bytes (type) != size)
20156 return false;
20158 if (TREE_CODE (type) == RECORD_TYPE)
20159 field = TYPE_FIELDS (type);
20161 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (init), cnt, ce)
20163 tree val = ce->value;
20164 int pos, fieldsize;
20166 if (ce->index != 0)
20167 field = ce->index;
20169 if (val)
20170 STRIP_NOPS (val);
20172 if (field == NULL_TREE || DECL_BIT_FIELD (field))
20173 return false;
20175 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
20176 && TYPE_DOMAIN (TREE_TYPE (field))
20177 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
20178 return false;
20179 else if (DECL_SIZE_UNIT (field) == NULL_TREE
20180 || !tree_fits_shwi_p (DECL_SIZE_UNIT (field)))
20181 return false;
20182 fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
20183 pos = int_byte_position (field);
20184 gcc_assert (pos + fieldsize <= size);
20185 if (val && fieldsize != 0
20186 && !native_encode_initializer (val, array + pos, fieldsize))
20187 return false;
20189 return true;
20191 return false;
20192 case VIEW_CONVERT_EXPR:
20193 case NON_LVALUE_EXPR:
20194 return native_encode_initializer (TREE_OPERAND (init, 0), array, size);
20195 default:
20196 return native_encode_expr (init, array, size) == size;
20200 /* Attach a DW_AT_const_value attribute to DIE. The value of the
20201 attribute is the const value T. */
20203 static bool
20204 tree_add_const_value_attribute (dw_die_ref die, tree t)
20206 tree init;
20207 tree type = TREE_TYPE (t);
20208 rtx rtl;
20210 if (!t || !TREE_TYPE (t) || TREE_TYPE (t) == error_mark_node)
20211 return false;
20213 init = t;
20214 gcc_assert (!DECL_P (init));
20216 if (TREE_CODE (init) == INTEGER_CST)
20218 if (tree_fits_uhwi_p (init))
20220 add_AT_unsigned (die, DW_AT_const_value, tree_to_uhwi (init));
20221 return true;
20223 if (tree_fits_shwi_p (init))
20225 add_AT_int (die, DW_AT_const_value, tree_to_shwi (init));
20226 return true;
20229 if (! early_dwarf)
20231 rtl = rtl_for_decl_init (init, type);
20232 if (rtl)
20233 return add_const_value_attribute (die, rtl);
20235 /* If the host and target are sane, try harder. */
20236 if (CHAR_BIT == 8 && BITS_PER_UNIT == 8
20237 && initializer_constant_valid_p (init, type))
20239 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (init));
20240 if (size > 0 && (int) size == size)
20242 unsigned char *array = ggc_cleared_vec_alloc<unsigned char> (size);
20244 if (native_encode_initializer (init, array, size))
20246 add_AT_vec (die, DW_AT_const_value, size, 1, array);
20247 return true;
20249 ggc_free (array);
20252 return false;
20255 /* Attach a DW_AT_const_value attribute to VAR_DIE. The value of the
20256 attribute is the const value of T, where T is an integral constant
20257 variable with static storage duration
20258 (so it can't be a PARM_DECL or a RESULT_DECL). */
20260 static bool
20261 tree_add_const_value_attribute_for_decl (dw_die_ref var_die, tree decl)
20264 if (!decl
20265 || (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
20266 || (VAR_P (decl) && !TREE_STATIC (decl)))
20267 return false;
20269 if (TREE_READONLY (decl)
20270 && ! TREE_THIS_VOLATILE (decl)
20271 && DECL_INITIAL (decl))
20272 /* OK */;
20273 else
20274 return false;
20276 /* Don't add DW_AT_const_value if abstract origin already has one. */
20277 if (get_AT (var_die, DW_AT_const_value))
20278 return false;
20280 return tree_add_const_value_attribute (var_die, DECL_INITIAL (decl));
20283 /* Convert the CFI instructions for the current function into a
20284 location list. This is used for DW_AT_frame_base when we targeting
20285 a dwarf2 consumer that does not support the dwarf3
20286 DW_OP_call_frame_cfa. OFFSET is a constant to be added to all CFA
20287 expressions. */
20289 static dw_loc_list_ref
20290 convert_cfa_to_fb_loc_list (HOST_WIDE_INT offset)
20292 int ix;
20293 dw_fde_ref fde;
20294 dw_loc_list_ref list, *list_tail;
20295 dw_cfi_ref cfi;
20296 dw_cfa_location last_cfa, next_cfa;
20297 const char *start_label, *last_label, *section;
20298 dw_cfa_location remember;
20300 fde = cfun->fde;
20301 gcc_assert (fde != NULL);
20303 section = secname_for_decl (current_function_decl);
20304 list_tail = &list;
20305 list = NULL;
20307 memset (&next_cfa, 0, sizeof (next_cfa));
20308 next_cfa.reg = INVALID_REGNUM;
20309 remember = next_cfa;
20311 start_label = fde->dw_fde_begin;
20313 /* ??? Bald assumption that the CIE opcode list does not contain
20314 advance opcodes. */
20315 FOR_EACH_VEC_ELT (*cie_cfi_vec, ix, cfi)
20316 lookup_cfa_1 (cfi, &next_cfa, &remember);
20318 last_cfa = next_cfa;
20319 last_label = start_label;
20321 if (fde->dw_fde_second_begin && fde->dw_fde_switch_cfi_index == 0)
20323 /* If the first partition contained no CFI adjustments, the
20324 CIE opcodes apply to the whole first partition. */
20325 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20326 fde->dw_fde_begin, 0, fde->dw_fde_end, 0, section);
20327 list_tail =&(*list_tail)->dw_loc_next;
20328 start_label = last_label = fde->dw_fde_second_begin;
20331 FOR_EACH_VEC_SAFE_ELT (fde->dw_fde_cfi, ix, cfi)
20333 switch (cfi->dw_cfi_opc)
20335 case DW_CFA_set_loc:
20336 case DW_CFA_advance_loc1:
20337 case DW_CFA_advance_loc2:
20338 case DW_CFA_advance_loc4:
20339 if (!cfa_equal_p (&last_cfa, &next_cfa))
20341 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20342 start_label, 0, last_label, 0, section);
20344 list_tail = &(*list_tail)->dw_loc_next;
20345 last_cfa = next_cfa;
20346 start_label = last_label;
20348 last_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
20349 break;
20351 case DW_CFA_advance_loc:
20352 /* The encoding is complex enough that we should never emit this. */
20353 gcc_unreachable ();
20355 default:
20356 lookup_cfa_1 (cfi, &next_cfa, &remember);
20357 break;
20359 if (ix + 1 == fde->dw_fde_switch_cfi_index)
20361 if (!cfa_equal_p (&last_cfa, &next_cfa))
20363 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20364 start_label, 0, last_label, 0, section);
20366 list_tail = &(*list_tail)->dw_loc_next;
20367 last_cfa = next_cfa;
20368 start_label = last_label;
20370 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20371 start_label, 0, fde->dw_fde_end, 0, section);
20372 list_tail = &(*list_tail)->dw_loc_next;
20373 start_label = last_label = fde->dw_fde_second_begin;
20377 if (!cfa_equal_p (&last_cfa, &next_cfa))
20379 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20380 start_label, 0, last_label, 0, section);
20381 list_tail = &(*list_tail)->dw_loc_next;
20382 start_label = last_label;
20385 *list_tail = new_loc_list (build_cfa_loc (&next_cfa, offset),
20386 start_label, 0,
20387 fde->dw_fde_second_begin
20388 ? fde->dw_fde_second_end : fde->dw_fde_end, 0,
20389 section);
20391 maybe_gen_llsym (list);
20393 return list;
20396 /* Compute a displacement from the "steady-state frame pointer" to the
20397 frame base (often the same as the CFA), and store it in
20398 frame_pointer_fb_offset. OFFSET is added to the displacement
20399 before the latter is negated. */
20401 static void
20402 compute_frame_pointer_to_fb_displacement (poly_int64 offset)
20404 rtx reg, elim;
20406 #ifdef FRAME_POINTER_CFA_OFFSET
20407 reg = frame_pointer_rtx;
20408 offset += FRAME_POINTER_CFA_OFFSET (current_function_decl);
20409 #else
20410 reg = arg_pointer_rtx;
20411 offset += ARG_POINTER_CFA_OFFSET (current_function_decl);
20412 #endif
20414 elim = (ira_use_lra_p
20415 ? lra_eliminate_regs (reg, VOIDmode, NULL_RTX)
20416 : eliminate_regs (reg, VOIDmode, NULL_RTX));
20417 elim = strip_offset_and_add (elim, &offset);
20419 frame_pointer_fb_offset = -offset;
20421 /* ??? AVR doesn't set up valid eliminations when there is no stack frame
20422 in which to eliminate. This is because it's stack pointer isn't
20423 directly accessible as a register within the ISA. To work around
20424 this, assume that while we cannot provide a proper value for
20425 frame_pointer_fb_offset, we won't need one either. */
20426 frame_pointer_fb_offset_valid
20427 = ((SUPPORTS_STACK_ALIGNMENT
20428 && (elim == hard_frame_pointer_rtx
20429 || elim == stack_pointer_rtx))
20430 || elim == (frame_pointer_needed
20431 ? hard_frame_pointer_rtx
20432 : stack_pointer_rtx));
20435 /* Generate a DW_AT_name attribute given some string value to be included as
20436 the value of the attribute. */
20438 static void
20439 add_name_attribute (dw_die_ref die, const char *name_string)
20441 if (name_string != NULL && *name_string != 0)
20443 if (demangle_name_func)
20444 name_string = (*demangle_name_func) (name_string);
20446 add_AT_string (die, DW_AT_name, name_string);
20450 /* Retrieve the descriptive type of TYPE, if any, make sure it has a
20451 DIE and attach a DW_AT_GNAT_descriptive_type attribute to the DIE
20452 of TYPE accordingly.
20454 ??? This is a temporary measure until after we're able to generate
20455 regular DWARF for the complex Ada type system. */
20457 static void
20458 add_gnat_descriptive_type_attribute (dw_die_ref die, tree type,
20459 dw_die_ref context_die)
20461 tree dtype;
20462 dw_die_ref dtype_die;
20464 if (!lang_hooks.types.descriptive_type)
20465 return;
20467 dtype = lang_hooks.types.descriptive_type (type);
20468 if (!dtype)
20469 return;
20471 dtype_die = lookup_type_die (dtype);
20472 if (!dtype_die)
20474 gen_type_die (dtype, context_die);
20475 dtype_die = lookup_type_die (dtype);
20476 gcc_assert (dtype_die);
20479 add_AT_die_ref (die, DW_AT_GNAT_descriptive_type, dtype_die);
20482 /* Retrieve the comp_dir string suitable for use with DW_AT_comp_dir. */
20484 static const char *
20485 comp_dir_string (void)
20487 const char *wd;
20488 char *wd1;
20489 static const char *cached_wd = NULL;
20491 if (cached_wd != NULL)
20492 return cached_wd;
20494 wd = get_src_pwd ();
20495 if (wd == NULL)
20496 return NULL;
20498 if (DWARF2_DIR_SHOULD_END_WITH_SEPARATOR)
20500 int wdlen;
20502 wdlen = strlen (wd);
20503 wd1 = ggc_vec_alloc<char> (wdlen + 2);
20504 strcpy (wd1, wd);
20505 wd1 [wdlen] = DIR_SEPARATOR;
20506 wd1 [wdlen + 1] = 0;
20507 wd = wd1;
20510 cached_wd = remap_debug_filename (wd);
20511 return cached_wd;
20514 /* Generate a DW_AT_comp_dir attribute for DIE. */
20516 static void
20517 add_comp_dir_attribute (dw_die_ref die)
20519 const char * wd = comp_dir_string ();
20520 if (wd != NULL)
20521 add_AT_string (die, DW_AT_comp_dir, wd);
20524 /* Given a tree node VALUE describing a scalar attribute ATTR (i.e. a bound, a
20525 pointer computation, ...), output a representation for that bound according
20526 to the accepted FORMS (see enum dw_scalar_form) and add it to DIE. See
20527 loc_list_from_tree for the meaning of CONTEXT. */
20529 static void
20530 add_scalar_info (dw_die_ref die, enum dwarf_attribute attr, tree value,
20531 int forms, struct loc_descr_context *context)
20533 dw_die_ref context_die, decl_die;
20534 dw_loc_list_ref list;
20535 bool strip_conversions = true;
20536 bool placeholder_seen = false;
20538 while (strip_conversions)
20539 switch (TREE_CODE (value))
20541 case ERROR_MARK:
20542 case SAVE_EXPR:
20543 return;
20545 CASE_CONVERT:
20546 case VIEW_CONVERT_EXPR:
20547 value = TREE_OPERAND (value, 0);
20548 break;
20550 default:
20551 strip_conversions = false;
20552 break;
20555 /* If possible and permitted, output the attribute as a constant. */
20556 if ((forms & dw_scalar_form_constant) != 0
20557 && TREE_CODE (value) == INTEGER_CST)
20559 unsigned int prec = simple_type_size_in_bits (TREE_TYPE (value));
20561 /* If HOST_WIDE_INT is big enough then represent the bound as
20562 a constant value. We need to choose a form based on
20563 whether the type is signed or unsigned. We cannot just
20564 call add_AT_unsigned if the value itself is positive
20565 (add_AT_unsigned might add the unsigned value encoded as
20566 DW_FORM_data[1248]). Some DWARF consumers will lookup the
20567 bounds type and then sign extend any unsigned values found
20568 for signed types. This is needed only for
20569 DW_AT_{lower,upper}_bound, since for most other attributes,
20570 consumers will treat DW_FORM_data[1248] as unsigned values,
20571 regardless of the underlying type. */
20572 if (prec <= HOST_BITS_PER_WIDE_INT
20573 || tree_fits_uhwi_p (value))
20575 if (TYPE_UNSIGNED (TREE_TYPE (value)))
20576 add_AT_unsigned (die, attr, TREE_INT_CST_LOW (value));
20577 else
20578 add_AT_int (die, attr, TREE_INT_CST_LOW (value));
20580 else
20581 /* Otherwise represent the bound as an unsigned value with
20582 the precision of its type. The precision and signedness
20583 of the type will be necessary to re-interpret it
20584 unambiguously. */
20585 add_AT_wide (die, attr, wi::to_wide (value));
20586 return;
20589 /* Otherwise, if it's possible and permitted too, output a reference to
20590 another DIE. */
20591 if ((forms & dw_scalar_form_reference) != 0)
20593 tree decl = NULL_TREE;
20595 /* Some type attributes reference an outer type. For instance, the upper
20596 bound of an array may reference an embedding record (this happens in
20597 Ada). */
20598 if (TREE_CODE (value) == COMPONENT_REF
20599 && TREE_CODE (TREE_OPERAND (value, 0)) == PLACEHOLDER_EXPR
20600 && TREE_CODE (TREE_OPERAND (value, 1)) == FIELD_DECL)
20601 decl = TREE_OPERAND (value, 1);
20603 else if (VAR_P (value)
20604 || TREE_CODE (value) == PARM_DECL
20605 || TREE_CODE (value) == RESULT_DECL)
20606 decl = value;
20608 if (decl != NULL_TREE)
20610 dw_die_ref decl_die = lookup_decl_die (decl);
20612 /* ??? Can this happen, or should the variable have been bound
20613 first? Probably it can, since I imagine that we try to create
20614 the types of parameters in the order in which they exist in
20615 the list, and won't have created a forward reference to a
20616 later parameter. */
20617 if (decl_die != NULL)
20619 add_AT_die_ref (die, attr, decl_die);
20620 return;
20625 /* Last chance: try to create a stack operation procedure to evaluate the
20626 value. Do nothing if even that is not possible or permitted. */
20627 if ((forms & dw_scalar_form_exprloc) == 0)
20628 return;
20630 list = loc_list_from_tree (value, 2, context);
20631 if (context && context->placeholder_arg)
20633 placeholder_seen = context->placeholder_seen;
20634 context->placeholder_seen = false;
20636 if (list == NULL || single_element_loc_list_p (list))
20638 /* If this attribute is not a reference nor constant, it is
20639 a DWARF expression rather than location description. For that
20640 loc_list_from_tree (value, 0, &context) is needed. */
20641 dw_loc_list_ref list2 = loc_list_from_tree (value, 0, context);
20642 if (list2 && single_element_loc_list_p (list2))
20644 if (placeholder_seen)
20646 struct dwarf_procedure_info dpi;
20647 dpi.fndecl = NULL_TREE;
20648 dpi.args_count = 1;
20649 if (!resolve_args_picking (list2->expr, 1, &dpi))
20650 return;
20652 add_AT_loc (die, attr, list2->expr);
20653 return;
20657 /* If that failed to give a single element location list, fall back to
20658 outputting this as a reference... still if permitted. */
20659 if (list == NULL
20660 || (forms & dw_scalar_form_reference) == 0
20661 || placeholder_seen)
20662 return;
20664 if (current_function_decl == 0)
20665 context_die = comp_unit_die ();
20666 else
20667 context_die = lookup_decl_die (current_function_decl);
20669 decl_die = new_die (DW_TAG_variable, context_die, value);
20670 add_AT_flag (decl_die, DW_AT_artificial, 1);
20671 add_type_attribute (decl_die, TREE_TYPE (value), TYPE_QUAL_CONST, false,
20672 context_die);
20673 add_AT_location_description (decl_die, DW_AT_location, list);
20674 add_AT_die_ref (die, attr, decl_die);
20677 /* Return the default for DW_AT_lower_bound, or -1 if there is not any
20678 default. */
20680 static int
20681 lower_bound_default (void)
20683 switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
20685 case DW_LANG_C:
20686 case DW_LANG_C89:
20687 case DW_LANG_C99:
20688 case DW_LANG_C11:
20689 case DW_LANG_C_plus_plus:
20690 case DW_LANG_C_plus_plus_11:
20691 case DW_LANG_C_plus_plus_14:
20692 case DW_LANG_ObjC:
20693 case DW_LANG_ObjC_plus_plus:
20694 return 0;
20695 case DW_LANG_Fortran77:
20696 case DW_LANG_Fortran90:
20697 case DW_LANG_Fortran95:
20698 case DW_LANG_Fortran03:
20699 case DW_LANG_Fortran08:
20700 return 1;
20701 case DW_LANG_UPC:
20702 case DW_LANG_D:
20703 case DW_LANG_Python:
20704 return dwarf_version >= 4 ? 0 : -1;
20705 case DW_LANG_Ada95:
20706 case DW_LANG_Ada83:
20707 case DW_LANG_Cobol74:
20708 case DW_LANG_Cobol85:
20709 case DW_LANG_Modula2:
20710 case DW_LANG_PLI:
20711 return dwarf_version >= 4 ? 1 : -1;
20712 default:
20713 return -1;
20717 /* Given a tree node describing an array bound (either lower or upper) output
20718 a representation for that bound. */
20720 static void
20721 add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr,
20722 tree bound, struct loc_descr_context *context)
20724 int dflt;
20726 while (1)
20727 switch (TREE_CODE (bound))
20729 /* Strip all conversions. */
20730 CASE_CONVERT:
20731 case VIEW_CONVERT_EXPR:
20732 bound = TREE_OPERAND (bound, 0);
20733 break;
20735 /* All fixed-bounds are represented by INTEGER_CST nodes. Lower bounds
20736 are even omitted when they are the default. */
20737 case INTEGER_CST:
20738 /* If the value for this bound is the default one, we can even omit the
20739 attribute. */
20740 if (bound_attr == DW_AT_lower_bound
20741 && tree_fits_shwi_p (bound)
20742 && (dflt = lower_bound_default ()) != -1
20743 && tree_to_shwi (bound) == dflt)
20744 return;
20746 /* FALLTHRU */
20748 default:
20749 /* Because of the complex interaction there can be with other GNAT
20750 encodings, GDB isn't ready yet to handle proper DWARF description
20751 for self-referencial subrange bounds: let GNAT encodings do the
20752 magic in such a case. */
20753 if (is_ada ()
20754 && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL
20755 && contains_placeholder_p (bound))
20756 return;
20758 add_scalar_info (subrange_die, bound_attr, bound,
20759 dw_scalar_form_constant
20760 | dw_scalar_form_exprloc
20761 | dw_scalar_form_reference,
20762 context);
20763 return;
20767 /* Add subscript info to TYPE_DIE, describing an array TYPE, collapsing
20768 possibly nested array subscripts in a flat sequence if COLLAPSE_P is true.
20769 Note that the block of subscript information for an array type also
20770 includes information about the element type of the given array type.
20772 This function reuses previously set type and bound information if
20773 available. */
20775 static void
20776 add_subscript_info (dw_die_ref type_die, tree type, bool collapse_p)
20778 unsigned dimension_number;
20779 tree lower, upper;
20780 dw_die_ref child = type_die->die_child;
20782 for (dimension_number = 0;
20783 TREE_CODE (type) == ARRAY_TYPE && (dimension_number == 0 || collapse_p);
20784 type = TREE_TYPE (type), dimension_number++)
20786 tree domain = TYPE_DOMAIN (type);
20788 if (TYPE_STRING_FLAG (type) && is_fortran () && dimension_number > 0)
20789 break;
20791 /* Arrays come in three flavors: Unspecified bounds, fixed bounds,
20792 and (in GNU C only) variable bounds. Handle all three forms
20793 here. */
20795 /* Find and reuse a previously generated DW_TAG_subrange_type if
20796 available.
20798 For multi-dimensional arrays, as we iterate through the
20799 various dimensions in the enclosing for loop above, we also
20800 iterate through the DIE children and pick at each
20801 DW_TAG_subrange_type previously generated (if available).
20802 Each child DW_TAG_subrange_type DIE describes the range of
20803 the current dimension. At this point we should have as many
20804 DW_TAG_subrange_type's as we have dimensions in the
20805 array. */
20806 dw_die_ref subrange_die = NULL;
20807 if (child)
20808 while (1)
20810 child = child->die_sib;
20811 if (child->die_tag == DW_TAG_subrange_type)
20812 subrange_die = child;
20813 if (child == type_die->die_child)
20815 /* If we wrapped around, stop looking next time. */
20816 child = NULL;
20817 break;
20819 if (child->die_tag == DW_TAG_subrange_type)
20820 break;
20822 if (!subrange_die)
20823 subrange_die = new_die (DW_TAG_subrange_type, type_die, NULL);
20825 if (domain)
20827 /* We have an array type with specified bounds. */
20828 lower = TYPE_MIN_VALUE (domain);
20829 upper = TYPE_MAX_VALUE (domain);
20831 /* Define the index type. */
20832 if (TREE_TYPE (domain)
20833 && !get_AT (subrange_die, DW_AT_type))
20835 /* ??? This is probably an Ada unnamed subrange type. Ignore the
20836 TREE_TYPE field. We can't emit debug info for this
20837 because it is an unnamed integral type. */
20838 if (TREE_CODE (domain) == INTEGER_TYPE
20839 && TYPE_NAME (domain) == NULL_TREE
20840 && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
20841 && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
20843 else
20844 add_type_attribute (subrange_die, TREE_TYPE (domain),
20845 TYPE_UNQUALIFIED, false, type_die);
20848 /* ??? If upper is NULL, the array has unspecified length,
20849 but it does have a lower bound. This happens with Fortran
20850 dimension arr(N:*)
20851 Since the debugger is definitely going to need to know N
20852 to produce useful results, go ahead and output the lower
20853 bound solo, and hope the debugger can cope. */
20855 if (!get_AT (subrange_die, DW_AT_lower_bound))
20856 add_bound_info (subrange_die, DW_AT_lower_bound, lower, NULL);
20857 if (upper && !get_AT (subrange_die, DW_AT_upper_bound))
20858 add_bound_info (subrange_die, DW_AT_upper_bound, upper, NULL);
20861 /* Otherwise we have an array type with an unspecified length. The
20862 DWARF-2 spec does not say how to handle this; let's just leave out the
20863 bounds. */
20867 /* Add a DW_AT_byte_size attribute to DIE with TREE_NODE's size. */
20869 static void
20870 add_byte_size_attribute (dw_die_ref die, tree tree_node)
20872 dw_die_ref decl_die;
20873 HOST_WIDE_INT size;
20874 dw_loc_descr_ref size_expr = NULL;
20876 switch (TREE_CODE (tree_node))
20878 case ERROR_MARK:
20879 size = 0;
20880 break;
20881 case ENUMERAL_TYPE:
20882 case RECORD_TYPE:
20883 case UNION_TYPE:
20884 case QUAL_UNION_TYPE:
20885 if (TREE_CODE (TYPE_SIZE_UNIT (tree_node)) == VAR_DECL
20886 && (decl_die = lookup_decl_die (TYPE_SIZE_UNIT (tree_node))))
20888 add_AT_die_ref (die, DW_AT_byte_size, decl_die);
20889 return;
20891 size_expr = type_byte_size (tree_node, &size);
20892 break;
20893 case FIELD_DECL:
20894 /* For a data member of a struct or union, the DW_AT_byte_size is
20895 generally given as the number of bytes normally allocated for an
20896 object of the *declared* type of the member itself. This is true
20897 even for bit-fields. */
20898 size = int_size_in_bytes (field_type (tree_node));
20899 break;
20900 default:
20901 gcc_unreachable ();
20904 /* Support for dynamically-sized objects was introduced by DWARFv3.
20905 At the moment, GDB does not handle variable byte sizes very well,
20906 though. */
20907 if ((dwarf_version >= 3 || !dwarf_strict)
20908 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL
20909 && size_expr != NULL)
20910 add_AT_loc (die, DW_AT_byte_size, size_expr);
20912 /* Note that `size' might be -1 when we get to this point. If it is, that
20913 indicates that the byte size of the entity in question is variable and
20914 that we could not generate a DWARF expression that computes it. */
20915 if (size >= 0)
20916 add_AT_unsigned (die, DW_AT_byte_size, size);
20919 /* Add a DW_AT_alignment attribute to DIE with TREE_NODE's non-default
20920 alignment. */
20922 static void
20923 add_alignment_attribute (dw_die_ref die, tree tree_node)
20925 if (dwarf_version < 5 && dwarf_strict)
20926 return;
20928 unsigned align;
20930 if (DECL_P (tree_node))
20932 if (!DECL_USER_ALIGN (tree_node))
20933 return;
20935 align = DECL_ALIGN_UNIT (tree_node);
20937 else if (TYPE_P (tree_node))
20939 if (!TYPE_USER_ALIGN (tree_node))
20940 return;
20942 align = TYPE_ALIGN_UNIT (tree_node);
20944 else
20945 gcc_unreachable ();
20947 add_AT_unsigned (die, DW_AT_alignment, align);
20950 /* For a FIELD_DECL node which represents a bit-field, output an attribute
20951 which specifies the distance in bits from the highest order bit of the
20952 "containing object" for the bit-field to the highest order bit of the
20953 bit-field itself.
20955 For any given bit-field, the "containing object" is a hypothetical object
20956 (of some integral or enum type) within which the given bit-field lives. The
20957 type of this hypothetical "containing object" is always the same as the
20958 declared type of the individual bit-field itself. The determination of the
20959 exact location of the "containing object" for a bit-field is rather
20960 complicated. It's handled by the `field_byte_offset' function (above).
20962 CTX is required: see the comment for VLR_CONTEXT.
20964 Note that it is the size (in bytes) of the hypothetical "containing object"
20965 which will be given in the DW_AT_byte_size attribute for this bit-field.
20966 (See `byte_size_attribute' above). */
20968 static inline void
20969 add_bit_offset_attribute (dw_die_ref die, tree decl, struct vlr_context *ctx)
20971 HOST_WIDE_INT object_offset_in_bytes;
20972 tree original_type = DECL_BIT_FIELD_TYPE (decl);
20973 HOST_WIDE_INT bitpos_int;
20974 HOST_WIDE_INT highest_order_object_bit_offset;
20975 HOST_WIDE_INT highest_order_field_bit_offset;
20976 HOST_WIDE_INT bit_offset;
20978 field_byte_offset (decl, ctx, &object_offset_in_bytes);
20980 /* Must be a field and a bit field. */
20981 gcc_assert (original_type && TREE_CODE (decl) == FIELD_DECL);
20983 /* We can't yet handle bit-fields whose offsets are variable, so if we
20984 encounter such things, just return without generating any attribute
20985 whatsoever. Likewise for variable or too large size. */
20986 if (! tree_fits_shwi_p (bit_position (decl))
20987 || ! tree_fits_uhwi_p (DECL_SIZE (decl)))
20988 return;
20990 bitpos_int = int_bit_position (decl);
20992 /* Note that the bit offset is always the distance (in bits) from the
20993 highest-order bit of the "containing object" to the highest-order bit of
20994 the bit-field itself. Since the "high-order end" of any object or field
20995 is different on big-endian and little-endian machines, the computation
20996 below must take account of these differences. */
20997 highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
20998 highest_order_field_bit_offset = bitpos_int;
21000 if (! BYTES_BIG_ENDIAN)
21002 highest_order_field_bit_offset += tree_to_shwi (DECL_SIZE (decl));
21003 highest_order_object_bit_offset +=
21004 simple_type_size_in_bits (original_type);
21007 bit_offset
21008 = (! BYTES_BIG_ENDIAN
21009 ? highest_order_object_bit_offset - highest_order_field_bit_offset
21010 : highest_order_field_bit_offset - highest_order_object_bit_offset);
21012 if (bit_offset < 0)
21013 add_AT_int (die, DW_AT_bit_offset, bit_offset);
21014 else
21015 add_AT_unsigned (die, DW_AT_bit_offset, (unsigned HOST_WIDE_INT) bit_offset);
21018 /* For a FIELD_DECL node which represents a bit field, output an attribute
21019 which specifies the length in bits of the given field. */
21021 static inline void
21022 add_bit_size_attribute (dw_die_ref die, tree decl)
21024 /* Must be a field and a bit field. */
21025 gcc_assert (TREE_CODE (decl) == FIELD_DECL
21026 && DECL_BIT_FIELD_TYPE (decl));
21028 if (tree_fits_uhwi_p (DECL_SIZE (decl)))
21029 add_AT_unsigned (die, DW_AT_bit_size, tree_to_uhwi (DECL_SIZE (decl)));
21032 /* If the compiled language is ANSI C, then add a 'prototyped'
21033 attribute, if arg types are given for the parameters of a function. */
21035 static inline void
21036 add_prototyped_attribute (dw_die_ref die, tree func_type)
21038 switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
21040 case DW_LANG_C:
21041 case DW_LANG_C89:
21042 case DW_LANG_C99:
21043 case DW_LANG_C11:
21044 case DW_LANG_ObjC:
21045 if (prototype_p (func_type))
21046 add_AT_flag (die, DW_AT_prototyped, 1);
21047 break;
21048 default:
21049 break;
21053 /* Add an 'abstract_origin' attribute below a given DIE. The DIE is found
21054 by looking in the type declaration, the object declaration equate table or
21055 the block mapping. */
21057 static inline dw_die_ref
21058 add_abstract_origin_attribute (dw_die_ref die, tree origin)
21060 dw_die_ref origin_die = NULL;
21062 if (DECL_P (origin))
21064 dw_die_ref c;
21065 origin_die = lookup_decl_die (origin);
21066 /* "Unwrap" the decls DIE which we put in the imported unit context.
21067 We are looking for the abstract copy here. */
21068 if (in_lto_p
21069 && origin_die
21070 && (c = get_AT_ref (origin_die, DW_AT_abstract_origin))
21071 /* ??? Identify this better. */
21072 && c->with_offset)
21073 origin_die = c;
21075 else if (TYPE_P (origin))
21076 origin_die = lookup_type_die (origin);
21077 else if (TREE_CODE (origin) == BLOCK)
21078 origin_die = BLOCK_DIE (origin);
21080 /* XXX: Functions that are never lowered don't always have correct block
21081 trees (in the case of java, they simply have no block tree, in some other
21082 languages). For these functions, there is nothing we can really do to
21083 output correct debug info for inlined functions in all cases. Rather
21084 than die, we'll just produce deficient debug info now, in that we will
21085 have variables without a proper abstract origin. In the future, when all
21086 functions are lowered, we should re-add a gcc_assert (origin_die)
21087 here. */
21089 if (origin_die)
21090 add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
21091 return origin_die;
21094 /* We do not currently support the pure_virtual attribute. */
21096 static inline void
21097 add_pure_or_virtual_attribute (dw_die_ref die, tree func_decl)
21099 if (DECL_VINDEX (func_decl))
21101 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
21103 if (tree_fits_shwi_p (DECL_VINDEX (func_decl)))
21104 add_AT_loc (die, DW_AT_vtable_elem_location,
21105 new_loc_descr (DW_OP_constu,
21106 tree_to_shwi (DECL_VINDEX (func_decl)),
21107 0));
21109 /* GNU extension: Record what type this method came from originally. */
21110 if (debug_info_level > DINFO_LEVEL_TERSE
21111 && DECL_CONTEXT (func_decl))
21112 add_AT_die_ref (die, DW_AT_containing_type,
21113 lookup_type_die (DECL_CONTEXT (func_decl)));
21117 /* Add a DW_AT_linkage_name or DW_AT_MIPS_linkage_name attribute for the
21118 given decl. This used to be a vendor extension until after DWARF 4
21119 standardized it. */
21121 static void
21122 add_linkage_attr (dw_die_ref die, tree decl)
21124 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
21126 /* Mimic what assemble_name_raw does with a leading '*'. */
21127 if (name[0] == '*')
21128 name = &name[1];
21130 if (dwarf_version >= 4)
21131 add_AT_string (die, DW_AT_linkage_name, name);
21132 else
21133 add_AT_string (die, DW_AT_MIPS_linkage_name, name);
21136 /* Add source coordinate attributes for the given decl. */
21138 static void
21139 add_src_coords_attributes (dw_die_ref die, tree decl)
21141 expanded_location s;
21143 if (LOCATION_LOCUS (DECL_SOURCE_LOCATION (decl)) == UNKNOWN_LOCATION)
21144 return;
21145 s = expand_location (DECL_SOURCE_LOCATION (decl));
21146 add_AT_file (die, DW_AT_decl_file, lookup_filename (s.file));
21147 add_AT_unsigned (die, DW_AT_decl_line, s.line);
21148 if (debug_column_info && s.column)
21149 add_AT_unsigned (die, DW_AT_decl_column, s.column);
21152 /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl. */
21154 static void
21155 add_linkage_name_raw (dw_die_ref die, tree decl)
21157 /* Defer until we have an assembler name set. */
21158 if (!DECL_ASSEMBLER_NAME_SET_P (decl))
21160 limbo_die_node *asm_name;
21162 asm_name = ggc_cleared_alloc<limbo_die_node> ();
21163 asm_name->die = die;
21164 asm_name->created_for = decl;
21165 asm_name->next = deferred_asm_name;
21166 deferred_asm_name = asm_name;
21168 else if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
21169 add_linkage_attr (die, decl);
21172 /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl if desired. */
21174 static void
21175 add_linkage_name (dw_die_ref die, tree decl)
21177 if (debug_info_level > DINFO_LEVEL_NONE
21178 && VAR_OR_FUNCTION_DECL_P (decl)
21179 && TREE_PUBLIC (decl)
21180 && !(VAR_P (decl) && DECL_REGISTER (decl))
21181 && die->die_tag != DW_TAG_member)
21182 add_linkage_name_raw (die, decl);
21185 /* Add a DW_AT_name attribute and source coordinate attribute for the
21186 given decl, but only if it actually has a name. */
21188 static void
21189 add_name_and_src_coords_attributes (dw_die_ref die, tree decl,
21190 bool no_linkage_name)
21192 tree decl_name;
21194 decl_name = DECL_NAME (decl);
21195 if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
21197 const char *name = dwarf2_name (decl, 0);
21198 if (name)
21199 add_name_attribute (die, name);
21200 if (! DECL_ARTIFICIAL (decl))
21201 add_src_coords_attributes (die, decl);
21203 if (!no_linkage_name)
21204 add_linkage_name (die, decl);
21207 #ifdef VMS_DEBUGGING_INFO
21208 /* Get the function's name, as described by its RTL. This may be different
21209 from the DECL_NAME name used in the source file. */
21210 if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
21212 add_AT_addr (die, DW_AT_VMS_rtnbeg_pd_address,
21213 XEXP (DECL_RTL (decl), 0), false);
21214 vec_safe_push (used_rtx_array, XEXP (DECL_RTL (decl), 0));
21216 #endif /* VMS_DEBUGGING_INFO */
21219 /* Add VALUE as a DW_AT_discr_value attribute to DIE. */
21221 static void
21222 add_discr_value (dw_die_ref die, dw_discr_value *value)
21224 dw_attr_node attr;
21226 attr.dw_attr = DW_AT_discr_value;
21227 attr.dw_attr_val.val_class = dw_val_class_discr_value;
21228 attr.dw_attr_val.val_entry = NULL;
21229 attr.dw_attr_val.v.val_discr_value.pos = value->pos;
21230 if (value->pos)
21231 attr.dw_attr_val.v.val_discr_value.v.uval = value->v.uval;
21232 else
21233 attr.dw_attr_val.v.val_discr_value.v.sval = value->v.sval;
21234 add_dwarf_attr (die, &attr);
21237 /* Add DISCR_LIST as a DW_AT_discr_list to DIE. */
21239 static void
21240 add_discr_list (dw_die_ref die, dw_discr_list_ref discr_list)
21242 dw_attr_node attr;
21244 attr.dw_attr = DW_AT_discr_list;
21245 attr.dw_attr_val.val_class = dw_val_class_discr_list;
21246 attr.dw_attr_val.val_entry = NULL;
21247 attr.dw_attr_val.v.val_discr_list = discr_list;
21248 add_dwarf_attr (die, &attr);
21251 static inline dw_discr_list_ref
21252 AT_discr_list (dw_attr_node *attr)
21254 return attr->dw_attr_val.v.val_discr_list;
21257 #ifdef VMS_DEBUGGING_INFO
21258 /* Output the debug main pointer die for VMS */
21260 void
21261 dwarf2out_vms_debug_main_pointer (void)
21263 char label[MAX_ARTIFICIAL_LABEL_BYTES];
21264 dw_die_ref die;
21266 /* Allocate the VMS debug main subprogram die. */
21267 die = new_die_raw (DW_TAG_subprogram);
21268 add_name_attribute (die, VMS_DEBUG_MAIN_POINTER);
21269 ASM_GENERATE_INTERNAL_LABEL (label, PROLOGUE_END_LABEL,
21270 current_function_funcdef_no);
21271 add_AT_lbl_id (die, DW_AT_entry_pc, label);
21273 /* Make it the first child of comp_unit_die (). */
21274 die->die_parent = comp_unit_die ();
21275 if (comp_unit_die ()->die_child)
21277 die->die_sib = comp_unit_die ()->die_child->die_sib;
21278 comp_unit_die ()->die_child->die_sib = die;
21280 else
21282 die->die_sib = die;
21283 comp_unit_die ()->die_child = die;
21286 #endif /* VMS_DEBUGGING_INFO */
21288 /* Push a new declaration scope. */
21290 static void
21291 push_decl_scope (tree scope)
21293 vec_safe_push (decl_scope_table, scope);
21296 /* Pop a declaration scope. */
21298 static inline void
21299 pop_decl_scope (void)
21301 decl_scope_table->pop ();
21304 /* walk_tree helper function for uses_local_type, below. */
21306 static tree
21307 uses_local_type_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
21309 if (!TYPE_P (*tp))
21310 *walk_subtrees = 0;
21311 else
21313 tree name = TYPE_NAME (*tp);
21314 if (name && DECL_P (name) && decl_function_context (name))
21315 return *tp;
21317 return NULL_TREE;
21320 /* If TYPE involves a function-local type (including a local typedef to a
21321 non-local type), returns that type; otherwise returns NULL_TREE. */
21323 static tree
21324 uses_local_type (tree type)
21326 tree used = walk_tree_without_duplicates (&type, uses_local_type_r, NULL);
21327 return used;
21330 /* Return the DIE for the scope that immediately contains this type.
21331 Non-named types that do not involve a function-local type get global
21332 scope. Named types nested in namespaces or other types get their
21333 containing scope. All other types (i.e. function-local named types) get
21334 the current active scope. */
21336 static dw_die_ref
21337 scope_die_for (tree t, dw_die_ref context_die)
21339 dw_die_ref scope_die = NULL;
21340 tree containing_scope;
21342 /* Non-types always go in the current scope. */
21343 gcc_assert (TYPE_P (t));
21345 /* Use the scope of the typedef, rather than the scope of the type
21346 it refers to. */
21347 if (TYPE_NAME (t) && DECL_P (TYPE_NAME (t)))
21348 containing_scope = DECL_CONTEXT (TYPE_NAME (t));
21349 else
21350 containing_scope = TYPE_CONTEXT (t);
21352 /* Use the containing namespace if there is one. */
21353 if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
21355 if (context_die == lookup_decl_die (containing_scope))
21356 /* OK */;
21357 else if (debug_info_level > DINFO_LEVEL_TERSE)
21358 context_die = get_context_die (containing_scope);
21359 else
21360 containing_scope = NULL_TREE;
21363 /* Ignore function type "scopes" from the C frontend. They mean that
21364 a tagged type is local to a parmlist of a function declarator, but
21365 that isn't useful to DWARF. */
21366 if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
21367 containing_scope = NULL_TREE;
21369 if (SCOPE_FILE_SCOPE_P (containing_scope))
21371 /* If T uses a local type keep it local as well, to avoid references
21372 to function-local DIEs from outside the function. */
21373 if (current_function_decl && uses_local_type (t))
21374 scope_die = context_die;
21375 else
21376 scope_die = comp_unit_die ();
21378 else if (TYPE_P (containing_scope))
21380 /* For types, we can just look up the appropriate DIE. */
21381 if (debug_info_level > DINFO_LEVEL_TERSE)
21382 scope_die = get_context_die (containing_scope);
21383 else
21385 scope_die = lookup_type_die_strip_naming_typedef (containing_scope);
21386 if (scope_die == NULL)
21387 scope_die = comp_unit_die ();
21390 else
21391 scope_die = context_die;
21393 return scope_die;
21396 /* Returns nonzero if CONTEXT_DIE is internal to a function. */
21398 static inline int
21399 local_scope_p (dw_die_ref context_die)
21401 for (; context_die; context_die = context_die->die_parent)
21402 if (context_die->die_tag == DW_TAG_inlined_subroutine
21403 || context_die->die_tag == DW_TAG_subprogram)
21404 return 1;
21406 return 0;
21409 /* Returns nonzero if CONTEXT_DIE is a class. */
21411 static inline int
21412 class_scope_p (dw_die_ref context_die)
21414 return (context_die
21415 && (context_die->die_tag == DW_TAG_structure_type
21416 || context_die->die_tag == DW_TAG_class_type
21417 || context_die->die_tag == DW_TAG_interface_type
21418 || context_die->die_tag == DW_TAG_union_type));
21421 /* Returns nonzero if CONTEXT_DIE is a class or namespace, for deciding
21422 whether or not to treat a DIE in this context as a declaration. */
21424 static inline int
21425 class_or_namespace_scope_p (dw_die_ref context_die)
21427 return (class_scope_p (context_die)
21428 || (context_die && context_die->die_tag == DW_TAG_namespace));
21431 /* Many forms of DIEs require a "type description" attribute. This
21432 routine locates the proper "type descriptor" die for the type given
21433 by 'type' plus any additional qualifiers given by 'cv_quals', and
21434 adds a DW_AT_type attribute below the given die. */
21436 static void
21437 add_type_attribute (dw_die_ref object_die, tree type, int cv_quals,
21438 bool reverse, dw_die_ref context_die)
21440 enum tree_code code = TREE_CODE (type);
21441 dw_die_ref type_die = NULL;
21443 /* ??? If this type is an unnamed subrange type of an integral, floating-point
21444 or fixed-point type, use the inner type. This is because we have no
21445 support for unnamed types in base_type_die. This can happen if this is
21446 an Ada subrange type. Correct solution is emit a subrange type die. */
21447 if ((code == INTEGER_TYPE || code == REAL_TYPE || code == FIXED_POINT_TYPE)
21448 && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
21449 type = TREE_TYPE (type), code = TREE_CODE (type);
21451 if (code == ERROR_MARK
21452 /* Handle a special case. For functions whose return type is void, we
21453 generate *no* type attribute. (Note that no object may have type
21454 `void', so this only applies to function return types). */
21455 || code == VOID_TYPE)
21456 return;
21458 type_die = modified_type_die (type,
21459 cv_quals | TYPE_QUALS (type),
21460 reverse,
21461 context_die);
21463 if (type_die != NULL)
21464 add_AT_die_ref (object_die, DW_AT_type, type_die);
21467 /* Given an object die, add the calling convention attribute for the
21468 function call type. */
21469 static void
21470 add_calling_convention_attribute (dw_die_ref subr_die, tree decl)
21472 enum dwarf_calling_convention value = DW_CC_normal;
21474 value = ((enum dwarf_calling_convention)
21475 targetm.dwarf_calling_convention (TREE_TYPE (decl)));
21477 if (is_fortran ()
21478 && id_equal (DECL_ASSEMBLER_NAME (decl), "MAIN__"))
21480 /* DWARF 2 doesn't provide a way to identify a program's source-level
21481 entry point. DW_AT_calling_convention attributes are only meant
21482 to describe functions' calling conventions. However, lacking a
21483 better way to signal the Fortran main program, we used this for
21484 a long time, following existing custom. Now, DWARF 4 has
21485 DW_AT_main_subprogram, which we add below, but some tools still
21486 rely on the old way, which we thus keep. */
21487 value = DW_CC_program;
21489 if (dwarf_version >= 4 || !dwarf_strict)
21490 add_AT_flag (subr_die, DW_AT_main_subprogram, 1);
21493 /* Only add the attribute if the backend requests it, and
21494 is not DW_CC_normal. */
21495 if (value && (value != DW_CC_normal))
21496 add_AT_unsigned (subr_die, DW_AT_calling_convention, value);
21499 /* Given a tree pointer to a struct, class, union, or enum type node, return
21500 a pointer to the (string) tag name for the given type, or zero if the type
21501 was declared without a tag. */
21503 static const char *
21504 type_tag (const_tree type)
21506 const char *name = 0;
21508 if (TYPE_NAME (type) != 0)
21510 tree t = 0;
21512 /* Find the IDENTIFIER_NODE for the type name. */
21513 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
21514 && !TYPE_NAMELESS (type))
21515 t = TYPE_NAME (type);
21517 /* The g++ front end makes the TYPE_NAME of *each* tagged type point to
21518 a TYPE_DECL node, regardless of whether or not a `typedef' was
21519 involved. */
21520 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
21521 && ! DECL_IGNORED_P (TYPE_NAME (type)))
21523 /* We want to be extra verbose. Don't call dwarf_name if
21524 DECL_NAME isn't set. The default hook for decl_printable_name
21525 doesn't like that, and in this context it's correct to return
21526 0, instead of "<anonymous>" or the like. */
21527 if (DECL_NAME (TYPE_NAME (type))
21528 && !DECL_NAMELESS (TYPE_NAME (type)))
21529 name = lang_hooks.dwarf_name (TYPE_NAME (type), 2);
21532 /* Now get the name as a string, or invent one. */
21533 if (!name && t != 0)
21534 name = IDENTIFIER_POINTER (t);
21537 return (name == 0 || *name == '\0') ? 0 : name;
21540 /* Return the type associated with a data member, make a special check
21541 for bit field types. */
21543 static inline tree
21544 member_declared_type (const_tree member)
21546 return (DECL_BIT_FIELD_TYPE (member)
21547 ? DECL_BIT_FIELD_TYPE (member) : TREE_TYPE (member));
21550 /* Get the decl's label, as described by its RTL. This may be different
21551 from the DECL_NAME name used in the source file. */
21553 #if 0
21554 static const char *
21555 decl_start_label (tree decl)
21557 rtx x;
21558 const char *fnname;
21560 x = DECL_RTL (decl);
21561 gcc_assert (MEM_P (x));
21563 x = XEXP (x, 0);
21564 gcc_assert (GET_CODE (x) == SYMBOL_REF);
21566 fnname = XSTR (x, 0);
21567 return fnname;
21569 #endif
21571 /* For variable-length arrays that have been previously generated, but
21572 may be incomplete due to missing subscript info, fill the subscript
21573 info. Return TRUE if this is one of those cases. */
21574 static bool
21575 fill_variable_array_bounds (tree type)
21577 if (TREE_ASM_WRITTEN (type)
21578 && TREE_CODE (type) == ARRAY_TYPE
21579 && variably_modified_type_p (type, NULL))
21581 dw_die_ref array_die = lookup_type_die (type);
21582 if (!array_die)
21583 return false;
21584 add_subscript_info (array_die, type, !is_ada ());
21585 return true;
21587 return false;
21590 /* These routines generate the internal representation of the DIE's for
21591 the compilation unit. Debugging information is collected by walking
21592 the declaration trees passed in from dwarf2out_decl(). */
21594 static void
21595 gen_array_type_die (tree type, dw_die_ref context_die)
21597 dw_die_ref array_die;
21599 /* GNU compilers represent multidimensional array types as sequences of one
21600 dimensional array types whose element types are themselves array types.
21601 We sometimes squish that down to a single array_type DIE with multiple
21602 subscripts in the Dwarf debugging info. The draft Dwarf specification
21603 say that we are allowed to do this kind of compression in C, because
21604 there is no difference between an array of arrays and a multidimensional
21605 array. We don't do this for Ada to remain as close as possible to the
21606 actual representation, which is especially important against the language
21607 flexibilty wrt arrays of variable size. */
21609 bool collapse_nested_arrays = !is_ada ();
21611 if (fill_variable_array_bounds (type))
21612 return;
21614 dw_die_ref scope_die = scope_die_for (type, context_die);
21615 tree element_type;
21617 /* Emit DW_TAG_string_type for Fortran character types (with kind 1 only, as
21618 DW_TAG_string_type doesn't have DW_AT_type attribute). */
21619 if (TYPE_STRING_FLAG (type)
21620 && TREE_CODE (type) == ARRAY_TYPE
21621 && is_fortran ()
21622 && TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (char_type_node))
21624 HOST_WIDE_INT size;
21626 array_die = new_die (DW_TAG_string_type, scope_die, type);
21627 add_name_attribute (array_die, type_tag (type));
21628 equate_type_number_to_die (type, array_die);
21629 size = int_size_in_bytes (type);
21630 if (size >= 0)
21631 add_AT_unsigned (array_die, DW_AT_byte_size, size);
21632 /* ??? We can't annotate types late, but for LTO we may not
21633 generate a location early either (gfortran.dg/save_6.f90). */
21634 else if (! (early_dwarf && (flag_generate_lto || flag_generate_offload))
21635 && TYPE_DOMAIN (type) != NULL_TREE
21636 && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != NULL_TREE)
21638 tree szdecl = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
21639 tree rszdecl = szdecl;
21641 size = int_size_in_bytes (TREE_TYPE (szdecl));
21642 if (!DECL_P (szdecl))
21644 if (TREE_CODE (szdecl) == INDIRECT_REF
21645 && DECL_P (TREE_OPERAND (szdecl, 0)))
21647 rszdecl = TREE_OPERAND (szdecl, 0);
21648 if (int_size_in_bytes (TREE_TYPE (rszdecl))
21649 != DWARF2_ADDR_SIZE)
21650 size = 0;
21652 else
21653 size = 0;
21655 if (size > 0)
21657 dw_loc_list_ref loc
21658 = loc_list_from_tree (rszdecl, szdecl == rszdecl ? 2 : 0,
21659 NULL);
21660 if (loc)
21662 add_AT_location_description (array_die, DW_AT_string_length,
21663 loc);
21664 if (size != DWARF2_ADDR_SIZE)
21665 add_AT_unsigned (array_die, dwarf_version >= 5
21666 ? DW_AT_string_length_byte_size
21667 : DW_AT_byte_size, size);
21671 return;
21674 array_die = new_die (DW_TAG_array_type, scope_die, type);
21675 add_name_attribute (array_die, type_tag (type));
21676 equate_type_number_to_die (type, array_die);
21678 if (TREE_CODE (type) == VECTOR_TYPE)
21679 add_AT_flag (array_die, DW_AT_GNU_vector, 1);
21681 /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */
21682 if (is_fortran ()
21683 && TREE_CODE (type) == ARRAY_TYPE
21684 && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE
21685 && !TYPE_STRING_FLAG (TREE_TYPE (type)))
21686 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
21688 #if 0
21689 /* We default the array ordering. Debuggers will probably do the right
21690 things even if DW_AT_ordering is not present. It's not even an issue
21691 until we start to get into multidimensional arrays anyway. If a debugger
21692 is ever caught doing the Wrong Thing for multi-dimensional arrays,
21693 then we'll have to put the DW_AT_ordering attribute back in. (But if
21694 and when we find out that we need to put these in, we will only do so
21695 for multidimensional arrays. */
21696 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
21697 #endif
21699 if (TREE_CODE (type) == VECTOR_TYPE)
21701 /* For VECTOR_TYPEs we use an array die with appropriate bounds. */
21702 dw_die_ref subrange_die = new_die (DW_TAG_subrange_type, array_die, NULL);
21703 add_bound_info (subrange_die, DW_AT_lower_bound, size_zero_node, NULL);
21704 add_bound_info (subrange_die, DW_AT_upper_bound,
21705 size_int (TYPE_VECTOR_SUBPARTS (type) - 1), NULL);
21707 else
21708 add_subscript_info (array_die, type, collapse_nested_arrays);
21710 /* Add representation of the type of the elements of this array type and
21711 emit the corresponding DIE if we haven't done it already. */
21712 element_type = TREE_TYPE (type);
21713 if (collapse_nested_arrays)
21714 while (TREE_CODE (element_type) == ARRAY_TYPE)
21716 if (TYPE_STRING_FLAG (element_type) && is_fortran ())
21717 break;
21718 element_type = TREE_TYPE (element_type);
21721 add_type_attribute (array_die, element_type, TYPE_UNQUALIFIED,
21722 TREE_CODE (type) == ARRAY_TYPE
21723 && TYPE_REVERSE_STORAGE_ORDER (type),
21724 context_die);
21726 add_gnat_descriptive_type_attribute (array_die, type, context_die);
21727 if (TYPE_ARTIFICIAL (type))
21728 add_AT_flag (array_die, DW_AT_artificial, 1);
21730 if (get_AT (array_die, DW_AT_name))
21731 add_pubtype (type, array_die);
21733 add_alignment_attribute (array_die, type);
21736 /* This routine generates DIE for array with hidden descriptor, details
21737 are filled into *info by a langhook. */
21739 static void
21740 gen_descr_array_type_die (tree type, struct array_descr_info *info,
21741 dw_die_ref context_die)
21743 const dw_die_ref scope_die = scope_die_for (type, context_die);
21744 const dw_die_ref array_die = new_die (DW_TAG_array_type, scope_die, type);
21745 struct loc_descr_context context = { type, info->base_decl, NULL,
21746 false, false };
21747 enum dwarf_tag subrange_tag = DW_TAG_subrange_type;
21748 int dim;
21750 add_name_attribute (array_die, type_tag (type));
21751 equate_type_number_to_die (type, array_die);
21753 if (info->ndimensions > 1)
21754 switch (info->ordering)
21756 case array_descr_ordering_row_major:
21757 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
21758 break;
21759 case array_descr_ordering_column_major:
21760 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
21761 break;
21762 default:
21763 break;
21766 if (dwarf_version >= 3 || !dwarf_strict)
21768 if (info->data_location)
21769 add_scalar_info (array_die, DW_AT_data_location, info->data_location,
21770 dw_scalar_form_exprloc, &context);
21771 if (info->associated)
21772 add_scalar_info (array_die, DW_AT_associated, info->associated,
21773 dw_scalar_form_constant
21774 | dw_scalar_form_exprloc
21775 | dw_scalar_form_reference, &context);
21776 if (info->allocated)
21777 add_scalar_info (array_die, DW_AT_allocated, info->allocated,
21778 dw_scalar_form_constant
21779 | dw_scalar_form_exprloc
21780 | dw_scalar_form_reference, &context);
21781 if (info->stride)
21783 const enum dwarf_attribute attr
21784 = (info->stride_in_bits) ? DW_AT_bit_stride : DW_AT_byte_stride;
21785 const int forms
21786 = (info->stride_in_bits)
21787 ? dw_scalar_form_constant
21788 : (dw_scalar_form_constant
21789 | dw_scalar_form_exprloc
21790 | dw_scalar_form_reference);
21792 add_scalar_info (array_die, attr, info->stride, forms, &context);
21795 if (dwarf_version >= 5)
21797 if (info->rank)
21799 add_scalar_info (array_die, DW_AT_rank, info->rank,
21800 dw_scalar_form_constant
21801 | dw_scalar_form_exprloc, &context);
21802 subrange_tag = DW_TAG_generic_subrange;
21803 context.placeholder_arg = true;
21807 add_gnat_descriptive_type_attribute (array_die, type, context_die);
21809 for (dim = 0; dim < info->ndimensions; dim++)
21811 dw_die_ref subrange_die = new_die (subrange_tag, array_die, NULL);
21813 if (info->dimen[dim].bounds_type)
21814 add_type_attribute (subrange_die,
21815 info->dimen[dim].bounds_type, TYPE_UNQUALIFIED,
21816 false, context_die);
21817 if (info->dimen[dim].lower_bound)
21818 add_bound_info (subrange_die, DW_AT_lower_bound,
21819 info->dimen[dim].lower_bound, &context);
21820 if (info->dimen[dim].upper_bound)
21821 add_bound_info (subrange_die, DW_AT_upper_bound,
21822 info->dimen[dim].upper_bound, &context);
21823 if ((dwarf_version >= 3 || !dwarf_strict) && info->dimen[dim].stride)
21824 add_scalar_info (subrange_die, DW_AT_byte_stride,
21825 info->dimen[dim].stride,
21826 dw_scalar_form_constant
21827 | dw_scalar_form_exprloc
21828 | dw_scalar_form_reference,
21829 &context);
21832 gen_type_die (info->element_type, context_die);
21833 add_type_attribute (array_die, info->element_type, TYPE_UNQUALIFIED,
21834 TREE_CODE (type) == ARRAY_TYPE
21835 && TYPE_REVERSE_STORAGE_ORDER (type),
21836 context_die);
21838 if (get_AT (array_die, DW_AT_name))
21839 add_pubtype (type, array_die);
21841 add_alignment_attribute (array_die, type);
21844 #if 0
21845 static void
21846 gen_entry_point_die (tree decl, dw_die_ref context_die)
21848 tree origin = decl_ultimate_origin (decl);
21849 dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die, decl);
21851 if (origin != NULL)
21852 add_abstract_origin_attribute (decl_die, origin);
21853 else
21855 add_name_and_src_coords_attributes (decl_die, decl);
21856 add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
21857 TYPE_UNQUALIFIED, false, context_die);
21860 if (DECL_ABSTRACT_P (decl))
21861 equate_decl_number_to_die (decl, decl_die);
21862 else
21863 add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
21865 #endif
21867 /* Walk through the list of incomplete types again, trying once more to
21868 emit full debugging info for them. */
21870 static void
21871 retry_incomplete_types (void)
21873 set_early_dwarf s;
21874 int i;
21876 for (i = vec_safe_length (incomplete_types) - 1; i >= 0; i--)
21877 if (should_emit_struct_debug ((*incomplete_types)[i], DINFO_USAGE_DIR_USE))
21878 gen_type_die ((*incomplete_types)[i], comp_unit_die ());
21879 vec_safe_truncate (incomplete_types, 0);
21882 /* Determine what tag to use for a record type. */
21884 static enum dwarf_tag
21885 record_type_tag (tree type)
21887 if (! lang_hooks.types.classify_record)
21888 return DW_TAG_structure_type;
21890 switch (lang_hooks.types.classify_record (type))
21892 case RECORD_IS_STRUCT:
21893 return DW_TAG_structure_type;
21895 case RECORD_IS_CLASS:
21896 return DW_TAG_class_type;
21898 case RECORD_IS_INTERFACE:
21899 if (dwarf_version >= 3 || !dwarf_strict)
21900 return DW_TAG_interface_type;
21901 return DW_TAG_structure_type;
21903 default:
21904 gcc_unreachable ();
21908 /* Generate a DIE to represent an enumeration type. Note that these DIEs
21909 include all of the information about the enumeration values also. Each
21910 enumerated type name/value is listed as a child of the enumerated type
21911 DIE. */
21913 static dw_die_ref
21914 gen_enumeration_type_die (tree type, dw_die_ref context_die)
21916 dw_die_ref type_die = lookup_type_die (type);
21918 if (type_die == NULL)
21920 type_die = new_die (DW_TAG_enumeration_type,
21921 scope_die_for (type, context_die), type);
21922 equate_type_number_to_die (type, type_die);
21923 add_name_attribute (type_die, type_tag (type));
21924 if (dwarf_version >= 4 || !dwarf_strict)
21926 if (ENUM_IS_SCOPED (type))
21927 add_AT_flag (type_die, DW_AT_enum_class, 1);
21928 if (ENUM_IS_OPAQUE (type))
21929 add_AT_flag (type_die, DW_AT_declaration, 1);
21931 if (!dwarf_strict)
21932 add_AT_unsigned (type_die, DW_AT_encoding,
21933 TYPE_UNSIGNED (type)
21934 ? DW_ATE_unsigned
21935 : DW_ATE_signed);
21937 else if (! TYPE_SIZE (type))
21938 return type_die;
21939 else
21940 remove_AT (type_die, DW_AT_declaration);
21942 /* Handle a GNU C/C++ extension, i.e. incomplete enum types. If the
21943 given enum type is incomplete, do not generate the DW_AT_byte_size
21944 attribute or the DW_AT_element_list attribute. */
21945 if (TYPE_SIZE (type))
21947 tree link;
21949 TREE_ASM_WRITTEN (type) = 1;
21950 add_byte_size_attribute (type_die, type);
21951 add_alignment_attribute (type_die, type);
21952 if (dwarf_version >= 3 || !dwarf_strict)
21954 tree underlying = lang_hooks.types.enum_underlying_base_type (type);
21955 add_type_attribute (type_die, underlying, TYPE_UNQUALIFIED, false,
21956 context_die);
21958 if (TYPE_STUB_DECL (type) != NULL_TREE)
21960 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
21961 add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
21964 /* If the first reference to this type was as the return type of an
21965 inline function, then it may not have a parent. Fix this now. */
21966 if (type_die->die_parent == NULL)
21967 add_child_die (scope_die_for (type, context_die), type_die);
21969 for (link = TYPE_VALUES (type);
21970 link != NULL; link = TREE_CHAIN (link))
21972 dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die, link);
21973 tree value = TREE_VALUE (link);
21975 add_name_attribute (enum_die,
21976 IDENTIFIER_POINTER (TREE_PURPOSE (link)));
21978 if (TREE_CODE (value) == CONST_DECL)
21979 value = DECL_INITIAL (value);
21981 if (simple_type_size_in_bits (TREE_TYPE (value))
21982 <= HOST_BITS_PER_WIDE_INT || tree_fits_shwi_p (value))
21984 /* For constant forms created by add_AT_unsigned DWARF
21985 consumers (GDB, elfutils, etc.) always zero extend
21986 the value. Only when the actual value is negative
21987 do we need to use add_AT_int to generate a constant
21988 form that can represent negative values. */
21989 HOST_WIDE_INT val = TREE_INT_CST_LOW (value);
21990 if (TYPE_UNSIGNED (TREE_TYPE (value)) || val >= 0)
21991 add_AT_unsigned (enum_die, DW_AT_const_value,
21992 (unsigned HOST_WIDE_INT) val);
21993 else
21994 add_AT_int (enum_die, DW_AT_const_value, val);
21996 else
21997 /* Enumeration constants may be wider than HOST_WIDE_INT. Handle
21998 that here. TODO: This should be re-worked to use correct
21999 signed/unsigned double tags for all cases. */
22000 add_AT_wide (enum_die, DW_AT_const_value, wi::to_wide (value));
22003 add_gnat_descriptive_type_attribute (type_die, type, context_die);
22004 if (TYPE_ARTIFICIAL (type))
22005 add_AT_flag (type_die, DW_AT_artificial, 1);
22007 else
22008 add_AT_flag (type_die, DW_AT_declaration, 1);
22010 add_pubtype (type, type_die);
22012 return type_die;
22015 /* Generate a DIE to represent either a real live formal parameter decl or to
22016 represent just the type of some formal parameter position in some function
22017 type.
22019 Note that this routine is a bit unusual because its argument may be a
22020 ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
22021 represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
22022 node. If it's the former then this function is being called to output a
22023 DIE to represent a formal parameter object (or some inlining thereof). If
22024 it's the latter, then this function is only being called to output a
22025 DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
22026 argument type of some subprogram type.
22027 If EMIT_NAME_P is true, name and source coordinate attributes
22028 are emitted. */
22030 static dw_die_ref
22031 gen_formal_parameter_die (tree node, tree origin, bool emit_name_p,
22032 dw_die_ref context_die)
22034 tree node_or_origin = node ? node : origin;
22035 tree ultimate_origin;
22036 dw_die_ref parm_die = NULL;
22038 if (DECL_P (node_or_origin))
22040 parm_die = lookup_decl_die (node);
22042 /* If the contexts differ, we may not be talking about the same
22043 thing.
22044 ??? When in LTO the DIE parent is the "abstract" copy and the
22045 context_die is the specification "copy". But this whole block
22046 should eventually be no longer needed. */
22047 if (parm_die && parm_die->die_parent != context_die && !in_lto_p)
22049 if (!DECL_ABSTRACT_P (node))
22051 /* This can happen when creating an inlined instance, in
22052 which case we need to create a new DIE that will get
22053 annotated with DW_AT_abstract_origin. */
22054 parm_die = NULL;
22056 else
22057 gcc_unreachable ();
22060 if (parm_die && parm_die->die_parent == NULL)
22062 /* Check that parm_die already has the right attributes that
22063 we would have added below. If any attributes are
22064 missing, fall through to add them. */
22065 if (! DECL_ABSTRACT_P (node_or_origin)
22066 && !get_AT (parm_die, DW_AT_location)
22067 && !get_AT (parm_die, DW_AT_const_value))
22068 /* We are missing location info, and are about to add it. */
22070 else
22072 add_child_die (context_die, parm_die);
22073 return parm_die;
22078 /* If we have a previously generated DIE, use it, unless this is an
22079 concrete instance (origin != NULL), in which case we need a new
22080 DIE with a corresponding DW_AT_abstract_origin. */
22081 bool reusing_die;
22082 if (parm_die && origin == NULL)
22083 reusing_die = true;
22084 else
22086 parm_die = new_die (DW_TAG_formal_parameter, context_die, node);
22087 reusing_die = false;
22090 switch (TREE_CODE_CLASS (TREE_CODE (node_or_origin)))
22092 case tcc_declaration:
22093 ultimate_origin = decl_ultimate_origin (node_or_origin);
22094 if (node || ultimate_origin)
22095 origin = ultimate_origin;
22097 if (reusing_die)
22098 goto add_location;
22100 if (origin != NULL)
22101 add_abstract_origin_attribute (parm_die, origin);
22102 else if (emit_name_p)
22103 add_name_and_src_coords_attributes (parm_die, node);
22104 if (origin == NULL
22105 || (! DECL_ABSTRACT_P (node_or_origin)
22106 && variably_modified_type_p (TREE_TYPE (node_or_origin),
22107 decl_function_context
22108 (node_or_origin))))
22110 tree type = TREE_TYPE (node_or_origin);
22111 if (decl_by_reference_p (node_or_origin))
22112 add_type_attribute (parm_die, TREE_TYPE (type),
22113 TYPE_UNQUALIFIED,
22114 false, context_die);
22115 else
22116 add_type_attribute (parm_die, type,
22117 decl_quals (node_or_origin),
22118 false, context_die);
22120 if (origin == NULL && DECL_ARTIFICIAL (node))
22121 add_AT_flag (parm_die, DW_AT_artificial, 1);
22122 add_location:
22123 if (node && node != origin)
22124 equate_decl_number_to_die (node, parm_die);
22125 if (! DECL_ABSTRACT_P (node_or_origin))
22126 add_location_or_const_value_attribute (parm_die, node_or_origin,
22127 node == NULL);
22129 break;
22131 case tcc_type:
22132 /* We were called with some kind of a ..._TYPE node. */
22133 add_type_attribute (parm_die, node_or_origin, TYPE_UNQUALIFIED, false,
22134 context_die);
22135 break;
22137 default:
22138 gcc_unreachable ();
22141 return parm_die;
22144 /* Generate and return a DW_TAG_GNU_formal_parameter_pack. Also generate
22145 children DW_TAG_formal_parameter DIEs representing the arguments of the
22146 parameter pack.
22148 PARM_PACK must be a function parameter pack.
22149 PACK_ARG is the first argument of the parameter pack. Its TREE_CHAIN
22150 must point to the subsequent arguments of the function PACK_ARG belongs to.
22151 SUBR_DIE is the DIE of the function PACK_ARG belongs to.
22152 If NEXT_ARG is non NULL, *NEXT_ARG is set to the function argument
22153 following the last one for which a DIE was generated. */
22155 static dw_die_ref
22156 gen_formal_parameter_pack_die (tree parm_pack,
22157 tree pack_arg,
22158 dw_die_ref subr_die,
22159 tree *next_arg)
22161 tree arg;
22162 dw_die_ref parm_pack_die;
22164 gcc_assert (parm_pack
22165 && lang_hooks.function_parameter_pack_p (parm_pack)
22166 && subr_die);
22168 parm_pack_die = new_die (DW_TAG_GNU_formal_parameter_pack, subr_die, parm_pack);
22169 add_src_coords_attributes (parm_pack_die, parm_pack);
22171 for (arg = pack_arg; arg; arg = DECL_CHAIN (arg))
22173 if (! lang_hooks.decls.function_parm_expanded_from_pack_p (arg,
22174 parm_pack))
22175 break;
22176 gen_formal_parameter_die (arg, NULL,
22177 false /* Don't emit name attribute. */,
22178 parm_pack_die);
22180 if (next_arg)
22181 *next_arg = arg;
22182 return parm_pack_die;
22185 /* Generate a special type of DIE used as a stand-in for a trailing ellipsis
22186 at the end of an (ANSI prototyped) formal parameters list. */
22188 static void
22189 gen_unspecified_parameters_die (tree decl_or_type, dw_die_ref context_die)
22191 new_die (DW_TAG_unspecified_parameters, context_die, decl_or_type);
22194 /* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
22195 DW_TAG_unspecified_parameters DIE) to represent the types of the formal
22196 parameters as specified in some function type specification (except for
22197 those which appear as part of a function *definition*). */
22199 static void
22200 gen_formal_types_die (tree function_or_method_type, dw_die_ref context_die)
22202 tree link;
22203 tree formal_type = NULL;
22204 tree first_parm_type;
22205 tree arg;
22207 if (TREE_CODE (function_or_method_type) == FUNCTION_DECL)
22209 arg = DECL_ARGUMENTS (function_or_method_type);
22210 function_or_method_type = TREE_TYPE (function_or_method_type);
22212 else
22213 arg = NULL_TREE;
22215 first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
22217 /* Make our first pass over the list of formal parameter types and output a
22218 DW_TAG_formal_parameter DIE for each one. */
22219 for (link = first_parm_type; link; )
22221 dw_die_ref parm_die;
22223 formal_type = TREE_VALUE (link);
22224 if (formal_type == void_type_node)
22225 break;
22227 /* Output a (nameless) DIE to represent the formal parameter itself. */
22228 if (!POINTER_BOUNDS_TYPE_P (formal_type))
22230 parm_die = gen_formal_parameter_die (formal_type, NULL,
22231 true /* Emit name attribute. */,
22232 context_die);
22233 if (TREE_CODE (function_or_method_type) == METHOD_TYPE
22234 && link == first_parm_type)
22236 add_AT_flag (parm_die, DW_AT_artificial, 1);
22237 if (dwarf_version >= 3 || !dwarf_strict)
22238 add_AT_die_ref (context_die, DW_AT_object_pointer, parm_die);
22240 else if (arg && DECL_ARTIFICIAL (arg))
22241 add_AT_flag (parm_die, DW_AT_artificial, 1);
22244 link = TREE_CHAIN (link);
22245 if (arg)
22246 arg = DECL_CHAIN (arg);
22249 /* If this function type has an ellipsis, add a
22250 DW_TAG_unspecified_parameters DIE to the end of the parameter list. */
22251 if (formal_type != void_type_node)
22252 gen_unspecified_parameters_die (function_or_method_type, context_die);
22254 /* Make our second (and final) pass over the list of formal parameter types
22255 and output DIEs to represent those types (as necessary). */
22256 for (link = TYPE_ARG_TYPES (function_or_method_type);
22257 link && TREE_VALUE (link);
22258 link = TREE_CHAIN (link))
22259 gen_type_die (TREE_VALUE (link), context_die);
22262 /* We want to generate the DIE for TYPE so that we can generate the
22263 die for MEMBER, which has been defined; we will need to refer back
22264 to the member declaration nested within TYPE. If we're trying to
22265 generate minimal debug info for TYPE, processing TYPE won't do the
22266 trick; we need to attach the member declaration by hand. */
22268 static void
22269 gen_type_die_for_member (tree type, tree member, dw_die_ref context_die)
22271 gen_type_die (type, context_die);
22273 /* If we're trying to avoid duplicate debug info, we may not have
22274 emitted the member decl for this function. Emit it now. */
22275 if (TYPE_STUB_DECL (type)
22276 && TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
22277 && ! lookup_decl_die (member))
22279 dw_die_ref type_die;
22280 gcc_assert (!decl_ultimate_origin (member));
22282 push_decl_scope (type);
22283 type_die = lookup_type_die_strip_naming_typedef (type);
22284 if (TREE_CODE (member) == FUNCTION_DECL)
22285 gen_subprogram_die (member, type_die);
22286 else if (TREE_CODE (member) == FIELD_DECL)
22288 /* Ignore the nameless fields that are used to skip bits but handle
22289 C++ anonymous unions and structs. */
22290 if (DECL_NAME (member) != NULL_TREE
22291 || TREE_CODE (TREE_TYPE (member)) == UNION_TYPE
22292 || TREE_CODE (TREE_TYPE (member)) == RECORD_TYPE)
22294 struct vlr_context vlr_ctx = {
22295 DECL_CONTEXT (member), /* struct_type */
22296 NULL_TREE /* variant_part_offset */
22298 gen_type_die (member_declared_type (member), type_die);
22299 gen_field_die (member, &vlr_ctx, type_die);
22302 else
22303 gen_variable_die (member, NULL_TREE, type_die);
22305 pop_decl_scope ();
22309 /* Forward declare these functions, because they are mutually recursive
22310 with their set_block_* pairing functions. */
22311 static void set_decl_origin_self (tree);
22313 /* Given a pointer to some BLOCK node, if the BLOCK_ABSTRACT_ORIGIN for the
22314 given BLOCK node is NULL, set the BLOCK_ABSTRACT_ORIGIN for the node so
22315 that it points to the node itself, thus indicating that the node is its
22316 own (abstract) origin. Additionally, if the BLOCK_ABSTRACT_ORIGIN for
22317 the given node is NULL, recursively descend the decl/block tree which
22318 it is the root of, and for each other ..._DECL or BLOCK node contained
22319 therein whose DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also
22320 still NULL, set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN
22321 values to point to themselves. */
22323 static void
22324 set_block_origin_self (tree stmt)
22326 if (BLOCK_ABSTRACT_ORIGIN (stmt) == NULL_TREE)
22328 BLOCK_ABSTRACT_ORIGIN (stmt) = stmt;
22331 tree local_decl;
22333 for (local_decl = BLOCK_VARS (stmt);
22334 local_decl != NULL_TREE;
22335 local_decl = DECL_CHAIN (local_decl))
22336 /* Do not recurse on nested functions since the inlining status
22337 of parent and child can be different as per the DWARF spec. */
22338 if (TREE_CODE (local_decl) != FUNCTION_DECL
22339 && !DECL_EXTERNAL (local_decl))
22340 set_decl_origin_self (local_decl);
22344 tree subblock;
22346 for (subblock = BLOCK_SUBBLOCKS (stmt);
22347 subblock != NULL_TREE;
22348 subblock = BLOCK_CHAIN (subblock))
22349 set_block_origin_self (subblock); /* Recurse. */
22354 /* Given a pointer to some ..._DECL node, if the DECL_ABSTRACT_ORIGIN for
22355 the given ..._DECL node is NULL, set the DECL_ABSTRACT_ORIGIN for the
22356 node to so that it points to the node itself, thus indicating that the
22357 node represents its own (abstract) origin. Additionally, if the
22358 DECL_ABSTRACT_ORIGIN for the given node is NULL, recursively descend
22359 the decl/block tree of which the given node is the root of, and for
22360 each other ..._DECL or BLOCK node contained therein whose
22361 DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also still NULL,
22362 set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN values to
22363 point to themselves. */
22365 static void
22366 set_decl_origin_self (tree decl)
22368 if (DECL_ABSTRACT_ORIGIN (decl) == NULL_TREE)
22370 DECL_ABSTRACT_ORIGIN (decl) = decl;
22371 if (TREE_CODE (decl) == FUNCTION_DECL)
22373 tree arg;
22375 for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
22376 DECL_ABSTRACT_ORIGIN (arg) = arg;
22377 if (DECL_INITIAL (decl) != NULL_TREE
22378 && DECL_INITIAL (decl) != error_mark_node)
22379 set_block_origin_self (DECL_INITIAL (decl));
22384 /* Mark the early DIE for DECL as the abstract instance. */
22386 static void
22387 dwarf2out_abstract_function (tree decl)
22389 dw_die_ref old_die;
22391 /* Make sure we have the actual abstract inline, not a clone. */
22392 decl = DECL_ORIGIN (decl);
22394 if (DECL_IGNORED_P (decl))
22395 return;
22397 old_die = lookup_decl_die (decl);
22398 /* With early debug we always have an old DIE unless we are in LTO
22399 and the user did not compile but only link with debug. */
22400 if (in_lto_p && ! old_die)
22401 return;
22402 gcc_assert (old_die != NULL);
22403 if (get_AT (old_die, DW_AT_inline)
22404 || get_AT (old_die, DW_AT_abstract_origin))
22405 /* We've already generated the abstract instance. */
22406 return;
22408 /* Go ahead and put DW_AT_inline on the DIE. */
22409 if (DECL_DECLARED_INLINE_P (decl))
22411 if (cgraph_function_possibly_inlined_p (decl))
22412 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_declared_inlined);
22413 else
22414 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_declared_not_inlined);
22416 else
22418 if (cgraph_function_possibly_inlined_p (decl))
22419 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_inlined);
22420 else
22421 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_not_inlined);
22424 if (DECL_DECLARED_INLINE_P (decl)
22425 && lookup_attribute ("artificial", DECL_ATTRIBUTES (decl)))
22426 add_AT_flag (old_die, DW_AT_artificial, 1);
22428 set_decl_origin_self (decl);
22431 /* Helper function of premark_used_types() which gets called through
22432 htab_traverse.
22434 Marks the DIE of a given type in *SLOT as perennial, so it never gets
22435 marked as unused by prune_unused_types. */
22437 bool
22438 premark_used_types_helper (tree const &type, void *)
22440 dw_die_ref die;
22442 die = lookup_type_die (type);
22443 if (die != NULL)
22444 die->die_perennial_p = 1;
22445 return true;
22448 /* Helper function of premark_types_used_by_global_vars which gets called
22449 through htab_traverse.
22451 Marks the DIE of a given type in *SLOT as perennial, so it never gets
22452 marked as unused by prune_unused_types. The DIE of the type is marked
22453 only if the global variable using the type will actually be emitted. */
22456 premark_types_used_by_global_vars_helper (types_used_by_vars_entry **slot,
22457 void *)
22459 struct types_used_by_vars_entry *entry;
22460 dw_die_ref die;
22462 entry = (struct types_used_by_vars_entry *) *slot;
22463 gcc_assert (entry->type != NULL
22464 && entry->var_decl != NULL);
22465 die = lookup_type_die (entry->type);
22466 if (die)
22468 /* Ask cgraph if the global variable really is to be emitted.
22469 If yes, then we'll keep the DIE of ENTRY->TYPE. */
22470 varpool_node *node = varpool_node::get (entry->var_decl);
22471 if (node && node->definition)
22473 die->die_perennial_p = 1;
22474 /* Keep the parent DIEs as well. */
22475 while ((die = die->die_parent) && die->die_perennial_p == 0)
22476 die->die_perennial_p = 1;
22479 return 1;
22482 /* Mark all members of used_types_hash as perennial. */
22484 static void
22485 premark_used_types (struct function *fun)
22487 if (fun && fun->used_types_hash)
22488 fun->used_types_hash->traverse<void *, premark_used_types_helper> (NULL);
22491 /* Mark all members of types_used_by_vars_entry as perennial. */
22493 static void
22494 premark_types_used_by_global_vars (void)
22496 if (types_used_by_vars_hash)
22497 types_used_by_vars_hash
22498 ->traverse<void *, premark_types_used_by_global_vars_helper> (NULL);
22501 /* Generate a DW_TAG_call_site DIE in function DECL under SUBR_DIE
22502 for CA_LOC call arg loc node. */
22504 static dw_die_ref
22505 gen_call_site_die (tree decl, dw_die_ref subr_die,
22506 struct call_arg_loc_node *ca_loc)
22508 dw_die_ref stmt_die = NULL, die;
22509 tree block = ca_loc->block;
22511 while (block
22512 && block != DECL_INITIAL (decl)
22513 && TREE_CODE (block) == BLOCK)
22515 stmt_die = BLOCK_DIE (block);
22516 if (stmt_die)
22517 break;
22518 block = BLOCK_SUPERCONTEXT (block);
22520 if (stmt_die == NULL)
22521 stmt_die = subr_die;
22522 die = new_die (dwarf_TAG (DW_TAG_call_site), stmt_die, NULL_TREE);
22523 add_AT_lbl_id (die, dwarf_AT (DW_AT_call_return_pc), ca_loc->label);
22524 if (ca_loc->tail_call_p)
22525 add_AT_flag (die, dwarf_AT (DW_AT_call_tail_call), 1);
22526 if (ca_loc->symbol_ref)
22528 dw_die_ref tdie = lookup_decl_die (SYMBOL_REF_DECL (ca_loc->symbol_ref));
22529 if (tdie)
22530 add_AT_die_ref (die, dwarf_AT (DW_AT_call_origin), tdie);
22531 else
22532 add_AT_addr (die, dwarf_AT (DW_AT_call_origin), ca_loc->symbol_ref,
22533 false);
22535 return die;
22538 /* Generate a DIE to represent a declared function (either file-scope or
22539 block-local). */
22541 static void
22542 gen_subprogram_die (tree decl, dw_die_ref context_die)
22544 tree origin = decl_ultimate_origin (decl);
22545 dw_die_ref subr_die;
22546 dw_die_ref old_die = lookup_decl_die (decl);
22548 /* This function gets called multiple times for different stages of
22549 the debug process. For example, for func() in this code:
22551 namespace S
22553 void func() { ... }
22556 ...we get called 4 times. Twice in early debug and twice in
22557 late debug:
22559 Early debug
22560 -----------
22562 1. Once while generating func() within the namespace. This is
22563 the declaration. The declaration bit below is set, as the
22564 context is the namespace.
22566 A new DIE will be generated with DW_AT_declaration set.
22568 2. Once for func() itself. This is the specification. The
22569 declaration bit below is clear as the context is the CU.
22571 We will use the cached DIE from (1) to create a new DIE with
22572 DW_AT_specification pointing to the declaration in (1).
22574 Late debug via rest_of_handle_final()
22575 -------------------------------------
22577 3. Once generating func() within the namespace. This is also the
22578 declaration, as in (1), but this time we will early exit below
22579 as we have a cached DIE and a declaration needs no additional
22580 annotations (no locations), as the source declaration line
22581 info is enough.
22583 4. Once for func() itself. As in (2), this is the specification,
22584 but this time we will re-use the cached DIE, and just annotate
22585 it with the location information that should now be available.
22587 For something without namespaces, but with abstract instances, we
22588 are also called a multiple times:
22590 class Base
22592 public:
22593 Base (); // constructor declaration (1)
22596 Base::Base () { } // constructor specification (2)
22598 Early debug
22599 -----------
22601 1. Once for the Base() constructor by virtue of it being a
22602 member of the Base class. This is done via
22603 rest_of_type_compilation.
22605 This is a declaration, so a new DIE will be created with
22606 DW_AT_declaration.
22608 2. Once for the Base() constructor definition, but this time
22609 while generating the abstract instance of the base
22610 constructor (__base_ctor) which is being generated via early
22611 debug of reachable functions.
22613 Even though we have a cached version of the declaration (1),
22614 we will create a DW_AT_specification of the declaration DIE
22615 in (1).
22617 3. Once for the __base_ctor itself, but this time, we generate
22618 an DW_AT_abstract_origin version of the DW_AT_specification in
22619 (2).
22621 Late debug via rest_of_handle_final
22622 -----------------------------------
22624 4. One final time for the __base_ctor (which will have a cached
22625 DIE with DW_AT_abstract_origin created in (3). This time,
22626 we will just annotate the location information now
22627 available.
22629 int declaration = (current_function_decl != decl
22630 || class_or_namespace_scope_p (context_die));
22632 /* A declaration that has been previously dumped needs no
22633 additional information. */
22634 if (old_die && declaration)
22635 return;
22637 /* Now that the C++ front end lazily declares artificial member fns, we
22638 might need to retrofit the declaration into its class. */
22639 if (!declaration && !origin && !old_die
22640 && DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))
22641 && !class_or_namespace_scope_p (context_die)
22642 && debug_info_level > DINFO_LEVEL_TERSE)
22643 old_die = force_decl_die (decl);
22645 /* A concrete instance, tag a new DIE with DW_AT_abstract_origin. */
22646 if (origin != NULL)
22648 gcc_assert (!declaration || local_scope_p (context_die));
22650 /* Fixup die_parent for the abstract instance of a nested
22651 inline function. */
22652 if (old_die && old_die->die_parent == NULL)
22653 add_child_die (context_die, old_die);
22655 if (old_die && get_AT_ref (old_die, DW_AT_abstract_origin))
22657 /* If we have a DW_AT_abstract_origin we have a working
22658 cached version. */
22659 subr_die = old_die;
22661 else
22663 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22664 add_abstract_origin_attribute (subr_die, origin);
22665 /* This is where the actual code for a cloned function is.
22666 Let's emit linkage name attribute for it. This helps
22667 debuggers to e.g, set breakpoints into
22668 constructors/destructors when the user asks "break
22669 K::K". */
22670 add_linkage_name (subr_die, decl);
22673 /* A cached copy, possibly from early dwarf generation. Reuse as
22674 much as possible. */
22675 else if (old_die)
22677 if (!get_AT_flag (old_die, DW_AT_declaration)
22678 /* We can have a normal definition following an inline one in the
22679 case of redefinition of GNU C extern inlines.
22680 It seems reasonable to use AT_specification in this case. */
22681 && !get_AT (old_die, DW_AT_inline))
22683 /* Detect and ignore this case, where we are trying to output
22684 something we have already output. */
22685 if (get_AT (old_die, DW_AT_low_pc)
22686 || get_AT (old_die, DW_AT_ranges))
22687 return;
22689 /* If we have no location information, this must be a
22690 partially generated DIE from early dwarf generation.
22691 Fall through and generate it. */
22694 /* If the definition comes from the same place as the declaration,
22695 maybe use the old DIE. We always want the DIE for this function
22696 that has the *_pc attributes to be under comp_unit_die so the
22697 debugger can find it. We also need to do this for abstract
22698 instances of inlines, since the spec requires the out-of-line copy
22699 to have the same parent. For local class methods, this doesn't
22700 apply; we just use the old DIE. */
22701 expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
22702 struct dwarf_file_data * file_index = lookup_filename (s.file);
22703 if ((is_cu_die (old_die->die_parent)
22704 /* This condition fixes the inconsistency/ICE with the
22705 following Fortran test (or some derivative thereof) while
22706 building libgfortran:
22708 module some_m
22709 contains
22710 logical function funky (FLAG)
22711 funky = .true.
22712 end function
22713 end module
22715 || (old_die->die_parent
22716 && old_die->die_parent->die_tag == DW_TAG_module)
22717 || context_die == NULL)
22718 && (DECL_ARTIFICIAL (decl)
22719 /* The location attributes may be in the abstract origin
22720 which in the case of LTO might be not available to
22721 look at. */
22722 || get_AT (old_die, DW_AT_abstract_origin)
22723 || (get_AT_file (old_die, DW_AT_decl_file) == file_index
22724 && (get_AT_unsigned (old_die, DW_AT_decl_line)
22725 == (unsigned) s.line)
22726 && (!debug_column_info
22727 || s.column == 0
22728 || (get_AT_unsigned (old_die, DW_AT_decl_column)
22729 == (unsigned) s.column)))))
22731 subr_die = old_die;
22733 /* Clear out the declaration attribute, but leave the
22734 parameters so they can be augmented with location
22735 information later. Unless this was a declaration, in
22736 which case, wipe out the nameless parameters and recreate
22737 them further down. */
22738 if (remove_AT (subr_die, DW_AT_declaration))
22741 remove_AT (subr_die, DW_AT_object_pointer);
22742 remove_child_TAG (subr_die, DW_TAG_formal_parameter);
22745 /* Make a specification pointing to the previously built
22746 declaration. */
22747 else
22749 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22750 add_AT_specification (subr_die, old_die);
22751 add_pubname (decl, subr_die);
22752 if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
22753 add_AT_file (subr_die, DW_AT_decl_file, file_index);
22754 if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
22755 add_AT_unsigned (subr_die, DW_AT_decl_line, s.line);
22756 if (debug_column_info
22757 && s.column
22758 && (get_AT_unsigned (old_die, DW_AT_decl_column)
22759 != (unsigned) s.column))
22760 add_AT_unsigned (subr_die, DW_AT_decl_column, s.column);
22762 /* If the prototype had an 'auto' or 'decltype(auto)' return type,
22763 emit the real type on the definition die. */
22764 if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE)
22766 dw_die_ref die = get_AT_ref (old_die, DW_AT_type);
22767 if (die == auto_die || die == decltype_auto_die)
22768 add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
22769 TYPE_UNQUALIFIED, false, context_die);
22772 /* When we process the method declaration, we haven't seen
22773 the out-of-class defaulted definition yet, so we have to
22774 recheck now. */
22775 if ((dwarf_version >= 5 || ! dwarf_strict)
22776 && !get_AT (subr_die, DW_AT_defaulted))
22778 int defaulted
22779 = lang_hooks.decls.decl_dwarf_attribute (decl,
22780 DW_AT_defaulted);
22781 if (defaulted != -1)
22783 /* Other values must have been handled before. */
22784 gcc_assert (defaulted == DW_DEFAULTED_out_of_class);
22785 add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
22790 /* Create a fresh DIE for anything else. */
22791 else
22793 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22795 if (TREE_PUBLIC (decl))
22796 add_AT_flag (subr_die, DW_AT_external, 1);
22798 add_name_and_src_coords_attributes (subr_die, decl);
22799 add_pubname (decl, subr_die);
22800 if (debug_info_level > DINFO_LEVEL_TERSE)
22802 add_prototyped_attribute (subr_die, TREE_TYPE (decl));
22803 add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
22804 TYPE_UNQUALIFIED, false, context_die);
22807 add_pure_or_virtual_attribute (subr_die, decl);
22808 if (DECL_ARTIFICIAL (decl))
22809 add_AT_flag (subr_die, DW_AT_artificial, 1);
22811 if (TREE_THIS_VOLATILE (decl) && (dwarf_version >= 5 || !dwarf_strict))
22812 add_AT_flag (subr_die, DW_AT_noreturn, 1);
22814 add_alignment_attribute (subr_die, decl);
22816 add_accessibility_attribute (subr_die, decl);
22819 /* Unless we have an existing non-declaration DIE, equate the new
22820 DIE. */
22821 if (!old_die || is_declaration_die (old_die))
22822 equate_decl_number_to_die (decl, subr_die);
22824 if (declaration)
22826 if (!old_die || !get_AT (old_die, DW_AT_inline))
22828 add_AT_flag (subr_die, DW_AT_declaration, 1);
22830 /* If this is an explicit function declaration then generate
22831 a DW_AT_explicit attribute. */
22832 if ((dwarf_version >= 3 || !dwarf_strict)
22833 && lang_hooks.decls.decl_dwarf_attribute (decl,
22834 DW_AT_explicit) == 1)
22835 add_AT_flag (subr_die, DW_AT_explicit, 1);
22837 /* If this is a C++11 deleted special function member then generate
22838 a DW_AT_deleted attribute. */
22839 if ((dwarf_version >= 5 || !dwarf_strict)
22840 && lang_hooks.decls.decl_dwarf_attribute (decl,
22841 DW_AT_deleted) == 1)
22842 add_AT_flag (subr_die, DW_AT_deleted, 1);
22844 /* If this is a C++11 defaulted special function member then
22845 generate a DW_AT_defaulted attribute. */
22846 if (dwarf_version >= 5 || !dwarf_strict)
22848 int defaulted
22849 = lang_hooks.decls.decl_dwarf_attribute (decl,
22850 DW_AT_defaulted);
22851 if (defaulted != -1)
22852 add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
22855 /* If this is a C++11 non-static member function with & ref-qualifier
22856 then generate a DW_AT_reference attribute. */
22857 if ((dwarf_version >= 5 || !dwarf_strict)
22858 && lang_hooks.decls.decl_dwarf_attribute (decl,
22859 DW_AT_reference) == 1)
22860 add_AT_flag (subr_die, DW_AT_reference, 1);
22862 /* If this is a C++11 non-static member function with &&
22863 ref-qualifier then generate a DW_AT_reference attribute. */
22864 if ((dwarf_version >= 5 || !dwarf_strict)
22865 && lang_hooks.decls.decl_dwarf_attribute (decl,
22866 DW_AT_rvalue_reference)
22867 == 1)
22868 add_AT_flag (subr_die, DW_AT_rvalue_reference, 1);
22871 /* For non DECL_EXTERNALs, if range information is available, fill
22872 the DIE with it. */
22873 else if (!DECL_EXTERNAL (decl) && !early_dwarf)
22875 HOST_WIDE_INT cfa_fb_offset;
22877 struct function *fun = DECL_STRUCT_FUNCTION (decl);
22879 if (!crtl->has_bb_partition)
22881 dw_fde_ref fde = fun->fde;
22882 if (fde->dw_fde_begin)
22884 /* We have already generated the labels. */
22885 add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
22886 fde->dw_fde_end, false);
22888 else
22890 /* Create start/end labels and add the range. */
22891 char label_id_low[MAX_ARTIFICIAL_LABEL_BYTES];
22892 char label_id_high[MAX_ARTIFICIAL_LABEL_BYTES];
22893 ASM_GENERATE_INTERNAL_LABEL (label_id_low, FUNC_BEGIN_LABEL,
22894 current_function_funcdef_no);
22895 ASM_GENERATE_INTERNAL_LABEL (label_id_high, FUNC_END_LABEL,
22896 current_function_funcdef_no);
22897 add_AT_low_high_pc (subr_die, label_id_low, label_id_high,
22898 false);
22901 #if VMS_DEBUGGING_INFO
22902 /* HP OpenVMS Industry Standard 64: DWARF Extensions
22903 Section 2.3 Prologue and Epilogue Attributes:
22904 When a breakpoint is set on entry to a function, it is generally
22905 desirable for execution to be suspended, not on the very first
22906 instruction of the function, but rather at a point after the
22907 function's frame has been set up, after any language defined local
22908 declaration processing has been completed, and before execution of
22909 the first statement of the function begins. Debuggers generally
22910 cannot properly determine where this point is. Similarly for a
22911 breakpoint set on exit from a function. The prologue and epilogue
22912 attributes allow a compiler to communicate the location(s) to use. */
22915 if (fde->dw_fde_vms_end_prologue)
22916 add_AT_vms_delta (subr_die, DW_AT_HP_prologue,
22917 fde->dw_fde_begin, fde->dw_fde_vms_end_prologue);
22919 if (fde->dw_fde_vms_begin_epilogue)
22920 add_AT_vms_delta (subr_die, DW_AT_HP_epilogue,
22921 fde->dw_fde_begin, fde->dw_fde_vms_begin_epilogue);
22923 #endif
22926 else
22928 /* Generate pubnames entries for the split function code ranges. */
22929 dw_fde_ref fde = fun->fde;
22931 if (fde->dw_fde_second_begin)
22933 if (dwarf_version >= 3 || !dwarf_strict)
22935 /* We should use ranges for non-contiguous code section
22936 addresses. Use the actual code range for the initial
22937 section, since the HOT/COLD labels might precede an
22938 alignment offset. */
22939 bool range_list_added = false;
22940 add_ranges_by_labels (subr_die, fde->dw_fde_begin,
22941 fde->dw_fde_end, &range_list_added,
22942 false);
22943 add_ranges_by_labels (subr_die, fde->dw_fde_second_begin,
22944 fde->dw_fde_second_end,
22945 &range_list_added, false);
22946 if (range_list_added)
22947 add_ranges (NULL);
22949 else
22951 /* There is no real support in DW2 for this .. so we make
22952 a work-around. First, emit the pub name for the segment
22953 containing the function label. Then make and emit a
22954 simplified subprogram DIE for the second segment with the
22955 name pre-fixed by __hot/cold_sect_of_. We use the same
22956 linkage name for the second die so that gdb will find both
22957 sections when given "b foo". */
22958 const char *name = NULL;
22959 tree decl_name = DECL_NAME (decl);
22960 dw_die_ref seg_die;
22962 /* Do the 'primary' section. */
22963 add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
22964 fde->dw_fde_end, false);
22966 /* Build a minimal DIE for the secondary section. */
22967 seg_die = new_die (DW_TAG_subprogram,
22968 subr_die->die_parent, decl);
22970 if (TREE_PUBLIC (decl))
22971 add_AT_flag (seg_die, DW_AT_external, 1);
22973 if (decl_name != NULL
22974 && IDENTIFIER_POINTER (decl_name) != NULL)
22976 name = dwarf2_name (decl, 1);
22977 if (! DECL_ARTIFICIAL (decl))
22978 add_src_coords_attributes (seg_die, decl);
22980 add_linkage_name (seg_die, decl);
22982 gcc_assert (name != NULL);
22983 add_pure_or_virtual_attribute (seg_die, decl);
22984 if (DECL_ARTIFICIAL (decl))
22985 add_AT_flag (seg_die, DW_AT_artificial, 1);
22987 name = concat ("__second_sect_of_", name, NULL);
22988 add_AT_low_high_pc (seg_die, fde->dw_fde_second_begin,
22989 fde->dw_fde_second_end, false);
22990 add_name_attribute (seg_die, name);
22991 if (want_pubnames ())
22992 add_pubname_string (name, seg_die);
22995 else
22996 add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end,
22997 false);
23000 cfa_fb_offset = CFA_FRAME_BASE_OFFSET (decl);
23002 /* We define the "frame base" as the function's CFA. This is more
23003 convenient for several reasons: (1) It's stable across the prologue
23004 and epilogue, which makes it better than just a frame pointer,
23005 (2) With dwarf3, there exists a one-byte encoding that allows us
23006 to reference the .debug_frame data by proxy, but failing that,
23007 (3) We can at least reuse the code inspection and interpretation
23008 code that determines the CFA position at various points in the
23009 function. */
23010 if (dwarf_version >= 3 && targetm.debug_unwind_info () == UI_DWARF2)
23012 dw_loc_descr_ref op = new_loc_descr (DW_OP_call_frame_cfa, 0, 0);
23013 add_AT_loc (subr_die, DW_AT_frame_base, op);
23015 else
23017 dw_loc_list_ref list = convert_cfa_to_fb_loc_list (cfa_fb_offset);
23018 if (list->dw_loc_next)
23019 add_AT_loc_list (subr_die, DW_AT_frame_base, list);
23020 else
23021 add_AT_loc (subr_die, DW_AT_frame_base, list->expr);
23024 /* Compute a displacement from the "steady-state frame pointer" to
23025 the CFA. The former is what all stack slots and argument slots
23026 will reference in the rtl; the latter is what we've told the
23027 debugger about. We'll need to adjust all frame_base references
23028 by this displacement. */
23029 compute_frame_pointer_to_fb_displacement (cfa_fb_offset);
23031 if (fun->static_chain_decl)
23033 /* DWARF requires here a location expression that computes the
23034 address of the enclosing subprogram's frame base. The machinery
23035 in tree-nested.c is supposed to store this specific address in the
23036 last field of the FRAME record. */
23037 const tree frame_type
23038 = TREE_TYPE (TREE_TYPE (fun->static_chain_decl));
23039 const tree fb_decl = tree_last (TYPE_FIELDS (frame_type));
23041 tree fb_expr
23042 = build1 (INDIRECT_REF, frame_type, fun->static_chain_decl);
23043 fb_expr = build3 (COMPONENT_REF, TREE_TYPE (fb_decl),
23044 fb_expr, fb_decl, NULL_TREE);
23046 add_AT_location_description (subr_die, DW_AT_static_link,
23047 loc_list_from_tree (fb_expr, 0, NULL));
23050 resolve_variable_values ();
23053 /* Generate child dies for template paramaters. */
23054 if (early_dwarf && debug_info_level > DINFO_LEVEL_TERSE)
23055 gen_generic_params_dies (decl);
23057 /* Now output descriptions of the arguments for this function. This gets
23058 (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list
23059 for a FUNCTION_DECL doesn't indicate cases where there was a trailing
23060 `...' at the end of the formal parameter list. In order to find out if
23061 there was a trailing ellipsis or not, we must instead look at the type
23062 associated with the FUNCTION_DECL. This will be a node of type
23063 FUNCTION_TYPE. If the chain of type nodes hanging off of this
23064 FUNCTION_TYPE node ends with a void_type_node then there should *not* be
23065 an ellipsis at the end. */
23067 /* In the case where we are describing a mere function declaration, all we
23068 need to do here (and all we *can* do here) is to describe the *types* of
23069 its formal parameters. */
23070 if (debug_info_level <= DINFO_LEVEL_TERSE)
23072 else if (declaration)
23073 gen_formal_types_die (decl, subr_die);
23074 else
23076 /* Generate DIEs to represent all known formal parameters. */
23077 tree parm = DECL_ARGUMENTS (decl);
23078 tree generic_decl = early_dwarf
23079 ? lang_hooks.decls.get_generic_function_decl (decl) : NULL;
23080 tree generic_decl_parm = generic_decl
23081 ? DECL_ARGUMENTS (generic_decl)
23082 : NULL;
23084 /* Now we want to walk the list of parameters of the function and
23085 emit their relevant DIEs.
23087 We consider the case of DECL being an instance of a generic function
23088 as well as it being a normal function.
23090 If DECL is an instance of a generic function we walk the
23091 parameters of the generic function declaration _and_ the parameters of
23092 DECL itself. This is useful because we want to emit specific DIEs for
23093 function parameter packs and those are declared as part of the
23094 generic function declaration. In that particular case,
23095 the parameter pack yields a DW_TAG_GNU_formal_parameter_pack DIE.
23096 That DIE has children DIEs representing the set of arguments
23097 of the pack. Note that the set of pack arguments can be empty.
23098 In that case, the DW_TAG_GNU_formal_parameter_pack DIE will not have any
23099 children DIE.
23101 Otherwise, we just consider the parameters of DECL. */
23102 while (generic_decl_parm || parm)
23104 if (generic_decl_parm
23105 && lang_hooks.function_parameter_pack_p (generic_decl_parm))
23106 gen_formal_parameter_pack_die (generic_decl_parm,
23107 parm, subr_die,
23108 &parm);
23109 else if (parm && !POINTER_BOUNDS_P (parm))
23111 dw_die_ref parm_die = gen_decl_die (parm, NULL, NULL, subr_die);
23113 if (early_dwarf
23114 && parm == DECL_ARGUMENTS (decl)
23115 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
23116 && parm_die
23117 && (dwarf_version >= 3 || !dwarf_strict))
23118 add_AT_die_ref (subr_die, DW_AT_object_pointer, parm_die);
23120 parm = DECL_CHAIN (parm);
23122 else if (parm)
23123 parm = DECL_CHAIN (parm);
23125 if (generic_decl_parm)
23126 generic_decl_parm = DECL_CHAIN (generic_decl_parm);
23129 /* Decide whether we need an unspecified_parameters DIE at the end.
23130 There are 2 more cases to do this for: 1) the ansi ... declaration -
23131 this is detectable when the end of the arg list is not a
23132 void_type_node 2) an unprototyped function declaration (not a
23133 definition). This just means that we have no info about the
23134 parameters at all. */
23135 if (early_dwarf)
23137 if (prototype_p (TREE_TYPE (decl)))
23139 /* This is the prototyped case, check for.... */
23140 if (stdarg_p (TREE_TYPE (decl)))
23141 gen_unspecified_parameters_die (decl, subr_die);
23143 else if (DECL_INITIAL (decl) == NULL_TREE)
23144 gen_unspecified_parameters_die (decl, subr_die);
23148 if (subr_die != old_die)
23149 /* Add the calling convention attribute if requested. */
23150 add_calling_convention_attribute (subr_die, decl);
23152 /* Output Dwarf info for all of the stuff within the body of the function
23153 (if it has one - it may be just a declaration).
23155 OUTER_SCOPE is a pointer to the outermost BLOCK node created to represent
23156 a function. This BLOCK actually represents the outermost binding contour
23157 for the function, i.e. the contour in which the function's formal
23158 parameters and labels get declared. Curiously, it appears that the front
23159 end doesn't actually put the PARM_DECL nodes for the current function onto
23160 the BLOCK_VARS list for this outer scope, but are strung off of the
23161 DECL_ARGUMENTS list for the function instead.
23163 The BLOCK_VARS list for the `outer_scope' does provide us with a list of
23164 the LABEL_DECL nodes for the function however, and we output DWARF info
23165 for those in decls_for_scope. Just within the `outer_scope' there will be
23166 a BLOCK node representing the function's outermost pair of curly braces,
23167 and any blocks used for the base and member initializers of a C++
23168 constructor function. */
23169 tree outer_scope = DECL_INITIAL (decl);
23170 if (! declaration && outer_scope && TREE_CODE (outer_scope) != ERROR_MARK)
23172 int call_site_note_count = 0;
23173 int tail_call_site_note_count = 0;
23175 /* Emit a DW_TAG_variable DIE for a named return value. */
23176 if (DECL_NAME (DECL_RESULT (decl)))
23177 gen_decl_die (DECL_RESULT (decl), NULL, NULL, subr_die);
23179 /* The first time through decls_for_scope we will generate the
23180 DIEs for the locals. The second time, we fill in the
23181 location info. */
23182 decls_for_scope (outer_scope, subr_die);
23184 if (call_arg_locations && (!dwarf_strict || dwarf_version >= 5))
23186 struct call_arg_loc_node *ca_loc;
23187 for (ca_loc = call_arg_locations; ca_loc; ca_loc = ca_loc->next)
23189 dw_die_ref die = NULL;
23190 rtx tloc = NULL_RTX, tlocc = NULL_RTX;
23191 rtx arg, next_arg;
23193 for (arg = (ca_loc->call_arg_loc_note != NULL_RTX
23194 ? XEXP (ca_loc->call_arg_loc_note, 0)
23195 : NULL_RTX);
23196 arg; arg = next_arg)
23198 dw_loc_descr_ref reg, val;
23199 machine_mode mode = GET_MODE (XEXP (XEXP (arg, 0), 1));
23200 dw_die_ref cdie, tdie = NULL;
23202 next_arg = XEXP (arg, 1);
23203 if (REG_P (XEXP (XEXP (arg, 0), 0))
23204 && next_arg
23205 && MEM_P (XEXP (XEXP (next_arg, 0), 0))
23206 && REG_P (XEXP (XEXP (XEXP (next_arg, 0), 0), 0))
23207 && REGNO (XEXP (XEXP (arg, 0), 0))
23208 == REGNO (XEXP (XEXP (XEXP (next_arg, 0), 0), 0)))
23209 next_arg = XEXP (next_arg, 1);
23210 if (mode == VOIDmode)
23212 mode = GET_MODE (XEXP (XEXP (arg, 0), 0));
23213 if (mode == VOIDmode)
23214 mode = GET_MODE (XEXP (arg, 0));
23216 if (mode == VOIDmode || mode == BLKmode)
23217 continue;
23218 /* Get dynamic information about call target only if we
23219 have no static information: we cannot generate both
23220 DW_AT_call_origin and DW_AT_call_target
23221 attributes. */
23222 if (ca_loc->symbol_ref == NULL_RTX)
23224 if (XEXP (XEXP (arg, 0), 0) == pc_rtx)
23226 tloc = XEXP (XEXP (arg, 0), 1);
23227 continue;
23229 else if (GET_CODE (XEXP (XEXP (arg, 0), 0)) == CLOBBER
23230 && XEXP (XEXP (XEXP (arg, 0), 0), 0) == pc_rtx)
23232 tlocc = XEXP (XEXP (arg, 0), 1);
23233 continue;
23236 reg = NULL;
23237 if (REG_P (XEXP (XEXP (arg, 0), 0)))
23238 reg = reg_loc_descriptor (XEXP (XEXP (arg, 0), 0),
23239 VAR_INIT_STATUS_INITIALIZED);
23240 else if (MEM_P (XEXP (XEXP (arg, 0), 0)))
23242 rtx mem = XEXP (XEXP (arg, 0), 0);
23243 reg = mem_loc_descriptor (XEXP (mem, 0),
23244 get_address_mode (mem),
23245 GET_MODE (mem),
23246 VAR_INIT_STATUS_INITIALIZED);
23248 else if (GET_CODE (XEXP (XEXP (arg, 0), 0))
23249 == DEBUG_PARAMETER_REF)
23251 tree tdecl
23252 = DEBUG_PARAMETER_REF_DECL (XEXP (XEXP (arg, 0), 0));
23253 tdie = lookup_decl_die (tdecl);
23254 if (tdie == NULL)
23255 continue;
23257 else
23258 continue;
23259 if (reg == NULL
23260 && GET_CODE (XEXP (XEXP (arg, 0), 0))
23261 != DEBUG_PARAMETER_REF)
23262 continue;
23263 val = mem_loc_descriptor (XEXP (XEXP (arg, 0), 1), mode,
23264 VOIDmode,
23265 VAR_INIT_STATUS_INITIALIZED);
23266 if (val == NULL)
23267 continue;
23268 if (die == NULL)
23269 die = gen_call_site_die (decl, subr_die, ca_loc);
23270 cdie = new_die (dwarf_TAG (DW_TAG_call_site_parameter), die,
23271 NULL_TREE);
23272 if (reg != NULL)
23273 add_AT_loc (cdie, DW_AT_location, reg);
23274 else if (tdie != NULL)
23275 add_AT_die_ref (cdie, dwarf_AT (DW_AT_call_parameter),
23276 tdie);
23277 add_AT_loc (cdie, dwarf_AT (DW_AT_call_value), val);
23278 if (next_arg != XEXP (arg, 1))
23280 mode = GET_MODE (XEXP (XEXP (XEXP (arg, 1), 0), 1));
23281 if (mode == VOIDmode)
23282 mode = GET_MODE (XEXP (XEXP (XEXP (arg, 1), 0), 0));
23283 val = mem_loc_descriptor (XEXP (XEXP (XEXP (arg, 1),
23284 0), 1),
23285 mode, VOIDmode,
23286 VAR_INIT_STATUS_INITIALIZED);
23287 if (val != NULL)
23288 add_AT_loc (cdie, dwarf_AT (DW_AT_call_data_value),
23289 val);
23292 if (die == NULL
23293 && (ca_loc->symbol_ref || tloc))
23294 die = gen_call_site_die (decl, subr_die, ca_loc);
23295 if (die != NULL && (tloc != NULL_RTX || tlocc != NULL_RTX))
23297 dw_loc_descr_ref tval = NULL;
23299 if (tloc != NULL_RTX)
23300 tval = mem_loc_descriptor (tloc,
23301 GET_MODE (tloc) == VOIDmode
23302 ? Pmode : GET_MODE (tloc),
23303 VOIDmode,
23304 VAR_INIT_STATUS_INITIALIZED);
23305 if (tval)
23306 add_AT_loc (die, dwarf_AT (DW_AT_call_target), tval);
23307 else if (tlocc != NULL_RTX)
23309 tval = mem_loc_descriptor (tlocc,
23310 GET_MODE (tlocc) == VOIDmode
23311 ? Pmode : GET_MODE (tlocc),
23312 VOIDmode,
23313 VAR_INIT_STATUS_INITIALIZED);
23314 if (tval)
23315 add_AT_loc (die,
23316 dwarf_AT (DW_AT_call_target_clobbered),
23317 tval);
23320 if (die != NULL)
23322 call_site_note_count++;
23323 if (ca_loc->tail_call_p)
23324 tail_call_site_note_count++;
23328 call_arg_locations = NULL;
23329 call_arg_loc_last = NULL;
23330 if (tail_call_site_count >= 0
23331 && tail_call_site_count == tail_call_site_note_count
23332 && (!dwarf_strict || dwarf_version >= 5))
23334 if (call_site_count >= 0
23335 && call_site_count == call_site_note_count)
23336 add_AT_flag (subr_die, dwarf_AT (DW_AT_call_all_calls), 1);
23337 else
23338 add_AT_flag (subr_die, dwarf_AT (DW_AT_call_all_tail_calls), 1);
23340 call_site_count = -1;
23341 tail_call_site_count = -1;
23344 /* Mark used types after we have created DIEs for the functions scopes. */
23345 premark_used_types (DECL_STRUCT_FUNCTION (decl));
23348 /* Returns a hash value for X (which really is a die_struct). */
23350 hashval_t
23351 block_die_hasher::hash (die_struct *d)
23353 return (hashval_t) d->decl_id ^ htab_hash_pointer (d->die_parent);
23356 /* Return nonzero if decl_id and die_parent of die_struct X is the same
23357 as decl_id and die_parent of die_struct Y. */
23359 bool
23360 block_die_hasher::equal (die_struct *x, die_struct *y)
23362 return x->decl_id == y->decl_id && x->die_parent == y->die_parent;
23365 /* Hold information about markers for inlined entry points. */
23366 struct GTY ((for_user)) inline_entry_data
23368 /* The block that's the inlined_function_outer_scope for an inlined
23369 function. */
23370 tree block;
23372 /* The label at the inlined entry point. */
23373 const char *label_pfx;
23374 unsigned int label_num;
23376 /* The view number to be used as the inlined entry point. */
23377 var_loc_view view;
23380 struct inline_entry_data_hasher : ggc_ptr_hash <inline_entry_data>
23382 typedef tree compare_type;
23383 static inline hashval_t hash (const inline_entry_data *);
23384 static inline bool equal (const inline_entry_data *, const_tree);
23387 /* Hash table routines for inline_entry_data. */
23389 inline hashval_t
23390 inline_entry_data_hasher::hash (const inline_entry_data *data)
23392 return htab_hash_pointer (data->block);
23395 inline bool
23396 inline_entry_data_hasher::equal (const inline_entry_data *data,
23397 const_tree block)
23399 return data->block == block;
23402 /* Inlined entry points pending DIE creation in this compilation unit. */
23404 static GTY(()) hash_table<inline_entry_data_hasher> *inline_entry_data_table;
23407 /* Return TRUE if DECL, which may have been previously generated as
23408 OLD_DIE, is a candidate for a DW_AT_specification. DECLARATION is
23409 true if decl (or its origin) is either an extern declaration or a
23410 class/namespace scoped declaration.
23412 The declare_in_namespace support causes us to get two DIEs for one
23413 variable, both of which are declarations. We want to avoid
23414 considering one to be a specification, so we must test for
23415 DECLARATION and DW_AT_declaration. */
23416 static inline bool
23417 decl_will_get_specification_p (dw_die_ref old_die, tree decl, bool declaration)
23419 return (old_die && TREE_STATIC (decl) && !declaration
23420 && get_AT_flag (old_die, DW_AT_declaration) == 1);
23423 /* Return true if DECL is a local static. */
23425 static inline bool
23426 local_function_static (tree decl)
23428 gcc_assert (VAR_P (decl));
23429 return TREE_STATIC (decl)
23430 && DECL_CONTEXT (decl)
23431 && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL;
23434 /* Generate a DIE to represent a declared data object.
23435 Either DECL or ORIGIN must be non-null. */
23437 static void
23438 gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
23440 HOST_WIDE_INT off = 0;
23441 tree com_decl;
23442 tree decl_or_origin = decl ? decl : origin;
23443 tree ultimate_origin;
23444 dw_die_ref var_die;
23445 dw_die_ref old_die = decl ? lookup_decl_die (decl) : NULL;
23446 bool declaration = (DECL_EXTERNAL (decl_or_origin)
23447 || class_or_namespace_scope_p (context_die));
23448 bool specialization_p = false;
23449 bool no_linkage_name = false;
23451 /* While C++ inline static data members have definitions inside of the
23452 class, force the first DIE to be a declaration, then let gen_member_die
23453 reparent it to the class context and call gen_variable_die again
23454 to create the outside of the class DIE for the definition. */
23455 if (!declaration
23456 && old_die == NULL
23457 && decl
23458 && DECL_CONTEXT (decl)
23459 && TYPE_P (DECL_CONTEXT (decl))
23460 && lang_hooks.decls.decl_dwarf_attribute (decl, DW_AT_inline) != -1)
23462 declaration = true;
23463 if (dwarf_version < 5)
23464 no_linkage_name = true;
23467 ultimate_origin = decl_ultimate_origin (decl_or_origin);
23468 if (decl || ultimate_origin)
23469 origin = ultimate_origin;
23470 com_decl = fortran_common (decl_or_origin, &off);
23472 /* Symbol in common gets emitted as a child of the common block, in the form
23473 of a data member. */
23474 if (com_decl)
23476 dw_die_ref com_die;
23477 dw_loc_list_ref loc = NULL;
23478 die_node com_die_arg;
23480 var_die = lookup_decl_die (decl_or_origin);
23481 if (var_die)
23483 if (! early_dwarf && get_AT (var_die, DW_AT_location) == NULL)
23485 loc = loc_list_from_tree (com_decl, off ? 1 : 2, NULL);
23486 if (loc)
23488 if (off)
23490 /* Optimize the common case. */
23491 if (single_element_loc_list_p (loc)
23492 && loc->expr->dw_loc_opc == DW_OP_addr
23493 && loc->expr->dw_loc_next == NULL
23494 && GET_CODE (loc->expr->dw_loc_oprnd1.v.val_addr)
23495 == SYMBOL_REF)
23497 rtx x = loc->expr->dw_loc_oprnd1.v.val_addr;
23498 loc->expr->dw_loc_oprnd1.v.val_addr
23499 = plus_constant (GET_MODE (x), x , off);
23501 else
23502 loc_list_plus_const (loc, off);
23504 add_AT_location_description (var_die, DW_AT_location, loc);
23505 remove_AT (var_die, DW_AT_declaration);
23508 return;
23511 if (common_block_die_table == NULL)
23512 common_block_die_table = hash_table<block_die_hasher>::create_ggc (10);
23514 com_die_arg.decl_id = DECL_UID (com_decl);
23515 com_die_arg.die_parent = context_die;
23516 com_die = common_block_die_table->find (&com_die_arg);
23517 if (! early_dwarf)
23518 loc = loc_list_from_tree (com_decl, 2, NULL);
23519 if (com_die == NULL)
23521 const char *cnam
23522 = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl));
23523 die_node **slot;
23525 com_die = new_die (DW_TAG_common_block, context_die, decl);
23526 add_name_and_src_coords_attributes (com_die, com_decl);
23527 if (loc)
23529 add_AT_location_description (com_die, DW_AT_location, loc);
23530 /* Avoid sharing the same loc descriptor between
23531 DW_TAG_common_block and DW_TAG_variable. */
23532 loc = loc_list_from_tree (com_decl, 2, NULL);
23534 else if (DECL_EXTERNAL (decl_or_origin))
23535 add_AT_flag (com_die, DW_AT_declaration, 1);
23536 if (want_pubnames ())
23537 add_pubname_string (cnam, com_die); /* ??? needed? */
23538 com_die->decl_id = DECL_UID (com_decl);
23539 slot = common_block_die_table->find_slot (com_die, INSERT);
23540 *slot = com_die;
23542 else if (get_AT (com_die, DW_AT_location) == NULL && loc)
23544 add_AT_location_description (com_die, DW_AT_location, loc);
23545 loc = loc_list_from_tree (com_decl, 2, NULL);
23546 remove_AT (com_die, DW_AT_declaration);
23548 var_die = new_die (DW_TAG_variable, com_die, decl);
23549 add_name_and_src_coords_attributes (var_die, decl_or_origin);
23550 add_type_attribute (var_die, TREE_TYPE (decl_or_origin),
23551 decl_quals (decl_or_origin), false,
23552 context_die);
23553 add_alignment_attribute (var_die, decl);
23554 add_AT_flag (var_die, DW_AT_external, 1);
23555 if (loc)
23557 if (off)
23559 /* Optimize the common case. */
23560 if (single_element_loc_list_p (loc)
23561 && loc->expr->dw_loc_opc == DW_OP_addr
23562 && loc->expr->dw_loc_next == NULL
23563 && GET_CODE (loc->expr->dw_loc_oprnd1.v.val_addr) == SYMBOL_REF)
23565 rtx x = loc->expr->dw_loc_oprnd1.v.val_addr;
23566 loc->expr->dw_loc_oprnd1.v.val_addr
23567 = plus_constant (GET_MODE (x), x, off);
23569 else
23570 loc_list_plus_const (loc, off);
23572 add_AT_location_description (var_die, DW_AT_location, loc);
23574 else if (DECL_EXTERNAL (decl_or_origin))
23575 add_AT_flag (var_die, DW_AT_declaration, 1);
23576 if (decl)
23577 equate_decl_number_to_die (decl, var_die);
23578 return;
23581 if (old_die)
23583 if (declaration)
23585 /* A declaration that has been previously dumped, needs no
23586 further annotations, since it doesn't need location on
23587 the second pass. */
23588 return;
23590 else if (decl_will_get_specification_p (old_die, decl, declaration)
23591 && !get_AT (old_die, DW_AT_specification))
23593 /* Fall-thru so we can make a new variable die along with a
23594 DW_AT_specification. */
23596 else if (origin && old_die->die_parent != context_die)
23598 /* If we will be creating an inlined instance, we need a
23599 new DIE that will get annotated with
23600 DW_AT_abstract_origin. */
23601 gcc_assert (!DECL_ABSTRACT_P (decl));
23603 else
23605 /* If a DIE was dumped early, it still needs location info.
23606 Skip to where we fill the location bits. */
23607 var_die = old_die;
23609 /* ??? In LTRANS we cannot annotate early created variably
23610 modified type DIEs without copying them and adjusting all
23611 references to them. Thus we dumped them again. Also add a
23612 reference to them but beware of -g0 compile and -g link
23613 in which case the reference will be already present. */
23614 tree type = TREE_TYPE (decl_or_origin);
23615 if (in_lto_p
23616 && ! get_AT (var_die, DW_AT_type)
23617 && variably_modified_type_p
23618 (type, decl_function_context (decl_or_origin)))
23620 if (decl_by_reference_p (decl_or_origin))
23621 add_type_attribute (var_die, TREE_TYPE (type),
23622 TYPE_UNQUALIFIED, false, context_die);
23623 else
23624 add_type_attribute (var_die, type, decl_quals (decl_or_origin),
23625 false, context_die);
23628 goto gen_variable_die_location;
23632 /* For static data members, the declaration in the class is supposed
23633 to have DW_TAG_member tag in DWARF{3,4} and we emit it for compatibility
23634 also in DWARF2; the specification should still be DW_TAG_variable
23635 referencing the DW_TAG_member DIE. */
23636 if (declaration && class_scope_p (context_die) && dwarf_version < 5)
23637 var_die = new_die (DW_TAG_member, context_die, decl);
23638 else
23639 var_die = new_die (DW_TAG_variable, context_die, decl);
23641 if (origin != NULL)
23642 add_abstract_origin_attribute (var_die, origin);
23644 /* Loop unrolling can create multiple blocks that refer to the same
23645 static variable, so we must test for the DW_AT_declaration flag.
23647 ??? Loop unrolling/reorder_blocks should perhaps be rewritten to
23648 copy decls and set the DECL_ABSTRACT_P flag on them instead of
23649 sharing them.
23651 ??? Duplicated blocks have been rewritten to use .debug_ranges. */
23652 else if (decl_will_get_specification_p (old_die, decl, declaration))
23654 /* This is a definition of a C++ class level static. */
23655 add_AT_specification (var_die, old_die);
23656 specialization_p = true;
23657 if (DECL_NAME (decl))
23659 expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
23660 struct dwarf_file_data * file_index = lookup_filename (s.file);
23662 if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
23663 add_AT_file (var_die, DW_AT_decl_file, file_index);
23665 if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
23666 add_AT_unsigned (var_die, DW_AT_decl_line, s.line);
23668 if (debug_column_info
23669 && s.column
23670 && (get_AT_unsigned (old_die, DW_AT_decl_column)
23671 != (unsigned) s.column))
23672 add_AT_unsigned (var_die, DW_AT_decl_column, s.column);
23674 if (old_die->die_tag == DW_TAG_member)
23675 add_linkage_name (var_die, decl);
23678 else
23679 add_name_and_src_coords_attributes (var_die, decl, no_linkage_name);
23681 if ((origin == NULL && !specialization_p)
23682 || (origin != NULL
23683 && !DECL_ABSTRACT_P (decl_or_origin)
23684 && variably_modified_type_p (TREE_TYPE (decl_or_origin),
23685 decl_function_context
23686 (decl_or_origin))))
23688 tree type = TREE_TYPE (decl_or_origin);
23690 if (decl_by_reference_p (decl_or_origin))
23691 add_type_attribute (var_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
23692 context_die);
23693 else
23694 add_type_attribute (var_die, type, decl_quals (decl_or_origin), false,
23695 context_die);
23698 if (origin == NULL && !specialization_p)
23700 if (TREE_PUBLIC (decl))
23701 add_AT_flag (var_die, DW_AT_external, 1);
23703 if (DECL_ARTIFICIAL (decl))
23704 add_AT_flag (var_die, DW_AT_artificial, 1);
23706 add_alignment_attribute (var_die, decl);
23708 add_accessibility_attribute (var_die, decl);
23711 if (declaration)
23712 add_AT_flag (var_die, DW_AT_declaration, 1);
23714 if (decl && (DECL_ABSTRACT_P (decl)
23715 || !old_die || is_declaration_die (old_die)))
23716 equate_decl_number_to_die (decl, var_die);
23718 gen_variable_die_location:
23719 if (! declaration
23720 && (! DECL_ABSTRACT_P (decl_or_origin)
23721 /* Local static vars are shared between all clones/inlines,
23722 so emit DW_AT_location on the abstract DIE if DECL_RTL is
23723 already set. */
23724 || (VAR_P (decl_or_origin)
23725 && TREE_STATIC (decl_or_origin)
23726 && DECL_RTL_SET_P (decl_or_origin))))
23728 if (early_dwarf)
23729 add_pubname (decl_or_origin, var_die);
23730 else
23731 add_location_or_const_value_attribute (var_die, decl_or_origin,
23732 decl == NULL);
23734 else
23735 tree_add_const_value_attribute_for_decl (var_die, decl_or_origin);
23737 if ((dwarf_version >= 4 || !dwarf_strict)
23738 && lang_hooks.decls.decl_dwarf_attribute (decl_or_origin,
23739 DW_AT_const_expr) == 1
23740 && !get_AT (var_die, DW_AT_const_expr)
23741 && !specialization_p)
23742 add_AT_flag (var_die, DW_AT_const_expr, 1);
23744 if (!dwarf_strict)
23746 int inl = lang_hooks.decls.decl_dwarf_attribute (decl_or_origin,
23747 DW_AT_inline);
23748 if (inl != -1
23749 && !get_AT (var_die, DW_AT_inline)
23750 && !specialization_p)
23751 add_AT_unsigned (var_die, DW_AT_inline, inl);
23755 /* Generate a DIE to represent a named constant. */
23757 static void
23758 gen_const_die (tree decl, dw_die_ref context_die)
23760 dw_die_ref const_die;
23761 tree type = TREE_TYPE (decl);
23763 const_die = lookup_decl_die (decl);
23764 if (const_die)
23765 return;
23767 const_die = new_die (DW_TAG_constant, context_die, decl);
23768 equate_decl_number_to_die (decl, const_die);
23769 add_name_and_src_coords_attributes (const_die, decl);
23770 add_type_attribute (const_die, type, TYPE_QUAL_CONST, false, context_die);
23771 if (TREE_PUBLIC (decl))
23772 add_AT_flag (const_die, DW_AT_external, 1);
23773 if (DECL_ARTIFICIAL (decl))
23774 add_AT_flag (const_die, DW_AT_artificial, 1);
23775 tree_add_const_value_attribute_for_decl (const_die, decl);
23778 /* Generate a DIE to represent a label identifier. */
23780 static void
23781 gen_label_die (tree decl, dw_die_ref context_die)
23783 tree origin = decl_ultimate_origin (decl);
23784 dw_die_ref lbl_die = lookup_decl_die (decl);
23785 rtx insn;
23786 char label[MAX_ARTIFICIAL_LABEL_BYTES];
23788 if (!lbl_die)
23790 lbl_die = new_die (DW_TAG_label, context_die, decl);
23791 equate_decl_number_to_die (decl, lbl_die);
23793 if (origin != NULL)
23794 add_abstract_origin_attribute (lbl_die, origin);
23795 else
23796 add_name_and_src_coords_attributes (lbl_die, decl);
23799 if (DECL_ABSTRACT_P (decl))
23800 equate_decl_number_to_die (decl, lbl_die);
23801 else if (! early_dwarf)
23803 insn = DECL_RTL_IF_SET (decl);
23805 /* Deleted labels are programmer specified labels which have been
23806 eliminated because of various optimizations. We still emit them
23807 here so that it is possible to put breakpoints on them. */
23808 if (insn
23809 && (LABEL_P (insn)
23810 || ((NOTE_P (insn)
23811 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))))
23813 /* When optimization is enabled (via -O) some parts of the compiler
23814 (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which
23815 represent source-level labels which were explicitly declared by
23816 the user. This really shouldn't be happening though, so catch
23817 it if it ever does happen. */
23818 gcc_assert (!as_a<rtx_insn *> (insn)->deleted ());
23820 ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (insn));
23821 add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
23823 else if (insn
23824 && NOTE_P (insn)
23825 && NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL
23826 && CODE_LABEL_NUMBER (insn) != -1)
23828 ASM_GENERATE_INTERNAL_LABEL (label, "LDL", CODE_LABEL_NUMBER (insn));
23829 add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
23834 /* A helper function for gen_inlined_subroutine_die. Add source coordinate
23835 attributes to the DIE for a block STMT, to describe where the inlined
23836 function was called from. This is similar to add_src_coords_attributes. */
23838 static inline void
23839 add_call_src_coords_attributes (tree stmt, dw_die_ref die)
23841 expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (stmt));
23843 if (dwarf_version >= 3 || !dwarf_strict)
23845 add_AT_file (die, DW_AT_call_file, lookup_filename (s.file));
23846 add_AT_unsigned (die, DW_AT_call_line, s.line);
23847 if (debug_column_info && s.column)
23848 add_AT_unsigned (die, DW_AT_call_column, s.column);
23853 /* A helper function for gen_lexical_block_die and gen_inlined_subroutine_die.
23854 Add low_pc and high_pc attributes to the DIE for a block STMT. */
23856 static inline void
23857 add_high_low_attributes (tree stmt, dw_die_ref die)
23859 char label[MAX_ARTIFICIAL_LABEL_BYTES];
23861 if (inline_entry_data **iedp
23862 = !inline_entry_data_table ? NULL
23863 : inline_entry_data_table->find_slot_with_hash (stmt,
23864 htab_hash_pointer (stmt),
23865 NO_INSERT))
23867 inline_entry_data *ied = *iedp;
23868 gcc_assert (MAY_HAVE_DEBUG_MARKER_INSNS);
23869 gcc_assert (debug_inline_points);
23870 gcc_assert (inlined_function_outer_scope_p (stmt));
23872 ASM_GENERATE_INTERNAL_LABEL (label, ied->label_pfx, ied->label_num);
23873 add_AT_lbl_id (die, DW_AT_entry_pc, label);
23875 if (debug_variable_location_views && !ZERO_VIEW_P (ied->view)
23876 && !dwarf_strict)
23878 if (!output_asm_line_debug_info ())
23879 add_AT_unsigned (die, DW_AT_GNU_entry_view, ied->view);
23880 else
23882 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", ied->view);
23883 /* FIXME: this will resolve to a small number. Could we
23884 possibly emit smaller data? Ideally we'd emit a
23885 uleb128, but that would make the size of DIEs
23886 impossible for the compiler to compute, since it's
23887 the assembler that computes the value of the view
23888 label in this case. Ideally, we'd have a single form
23889 encompassing both the address and the view, and
23890 indirecting them through a table might make things
23891 easier, but even that would be more wasteful,
23892 space-wise, than what we have now. */
23893 add_AT_symview (die, DW_AT_GNU_entry_view, label);
23897 inline_entry_data_table->clear_slot (iedp);
23900 if (BLOCK_FRAGMENT_CHAIN (stmt)
23901 && (dwarf_version >= 3 || !dwarf_strict))
23903 tree chain, superblock = NULL_TREE;
23904 dw_die_ref pdie;
23905 dw_attr_node *attr = NULL;
23907 if (!debug_inline_points && inlined_function_outer_scope_p (stmt))
23909 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
23910 BLOCK_NUMBER (stmt));
23911 add_AT_lbl_id (die, DW_AT_entry_pc, label);
23914 /* Optimize duplicate .debug_ranges lists or even tails of
23915 lists. If this BLOCK has same ranges as its supercontext,
23916 lookup DW_AT_ranges attribute in the supercontext (and
23917 recursively so), verify that the ranges_table contains the
23918 right values and use it instead of adding a new .debug_range. */
23919 for (chain = stmt, pdie = die;
23920 BLOCK_SAME_RANGE (chain);
23921 chain = BLOCK_SUPERCONTEXT (chain))
23923 dw_attr_node *new_attr;
23925 pdie = pdie->die_parent;
23926 if (pdie == NULL)
23927 break;
23928 if (BLOCK_SUPERCONTEXT (chain) == NULL_TREE)
23929 break;
23930 new_attr = get_AT (pdie, DW_AT_ranges);
23931 if (new_attr == NULL
23932 || new_attr->dw_attr_val.val_class != dw_val_class_range_list)
23933 break;
23934 attr = new_attr;
23935 superblock = BLOCK_SUPERCONTEXT (chain);
23937 if (attr != NULL
23938 && ((*ranges_table)[attr->dw_attr_val.v.val_offset].num
23939 == BLOCK_NUMBER (superblock))
23940 && BLOCK_FRAGMENT_CHAIN (superblock))
23942 unsigned long off = attr->dw_attr_val.v.val_offset;
23943 unsigned long supercnt = 0, thiscnt = 0;
23944 for (chain = BLOCK_FRAGMENT_CHAIN (superblock);
23945 chain; chain = BLOCK_FRAGMENT_CHAIN (chain))
23947 ++supercnt;
23948 gcc_checking_assert ((*ranges_table)[off + supercnt].num
23949 == BLOCK_NUMBER (chain));
23951 gcc_checking_assert ((*ranges_table)[off + supercnt + 1].num == 0);
23952 for (chain = BLOCK_FRAGMENT_CHAIN (stmt);
23953 chain; chain = BLOCK_FRAGMENT_CHAIN (chain))
23954 ++thiscnt;
23955 gcc_assert (supercnt >= thiscnt);
23956 add_AT_range_list (die, DW_AT_ranges, off + supercnt - thiscnt,
23957 false);
23958 note_rnglist_head (off + supercnt - thiscnt);
23959 return;
23962 unsigned int offset = add_ranges (stmt, true);
23963 add_AT_range_list (die, DW_AT_ranges, offset, false);
23964 note_rnglist_head (offset);
23966 bool prev_in_cold = BLOCK_IN_COLD_SECTION_P (stmt);
23967 chain = BLOCK_FRAGMENT_CHAIN (stmt);
23970 add_ranges (chain, prev_in_cold != BLOCK_IN_COLD_SECTION_P (chain));
23971 prev_in_cold = BLOCK_IN_COLD_SECTION_P (chain);
23972 chain = BLOCK_FRAGMENT_CHAIN (chain);
23974 while (chain);
23975 add_ranges (NULL);
23977 else
23979 char label_high[MAX_ARTIFICIAL_LABEL_BYTES];
23980 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
23981 BLOCK_NUMBER (stmt));
23982 ASM_GENERATE_INTERNAL_LABEL (label_high, BLOCK_END_LABEL,
23983 BLOCK_NUMBER (stmt));
23984 add_AT_low_high_pc (die, label, label_high, false);
23988 /* Generate a DIE for a lexical block. */
23990 static void
23991 gen_lexical_block_die (tree stmt, dw_die_ref context_die)
23993 dw_die_ref old_die = BLOCK_DIE (stmt);
23994 dw_die_ref stmt_die = NULL;
23995 if (!old_die)
23997 stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
23998 BLOCK_DIE (stmt) = stmt_die;
24001 if (BLOCK_ABSTRACT (stmt))
24003 if (old_die)
24005 /* This must have been generated early and it won't even
24006 need location information since it's a DW_AT_inline
24007 function. */
24008 if (flag_checking)
24009 for (dw_die_ref c = context_die; c; c = c->die_parent)
24010 if (c->die_tag == DW_TAG_inlined_subroutine
24011 || c->die_tag == DW_TAG_subprogram)
24013 gcc_assert (get_AT (c, DW_AT_inline));
24014 break;
24016 return;
24019 else if (BLOCK_ABSTRACT_ORIGIN (stmt))
24021 /* If this is an inlined instance, create a new lexical die for
24022 anything below to attach DW_AT_abstract_origin to. */
24023 if (old_die)
24025 stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
24026 BLOCK_DIE (stmt) = stmt_die;
24027 old_die = NULL;
24030 tree origin = block_ultimate_origin (stmt);
24031 if (origin != NULL_TREE && origin != stmt)
24032 add_abstract_origin_attribute (stmt_die, origin);
24035 if (old_die)
24036 stmt_die = old_die;
24038 /* A non abstract block whose blocks have already been reordered
24039 should have the instruction range for this block. If so, set the
24040 high/low attributes. */
24041 if (!early_dwarf && !BLOCK_ABSTRACT (stmt) && TREE_ASM_WRITTEN (stmt))
24043 gcc_assert (stmt_die);
24044 add_high_low_attributes (stmt, stmt_die);
24047 decls_for_scope (stmt, stmt_die);
24050 /* Generate a DIE for an inlined subprogram. */
24052 static void
24053 gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die)
24055 tree decl;
24057 /* The instance of function that is effectively being inlined shall not
24058 be abstract. */
24059 gcc_assert (! BLOCK_ABSTRACT (stmt));
24061 decl = block_ultimate_origin (stmt);
24063 /* Make sure any inlined functions are known to be inlineable. */
24064 gcc_checking_assert (DECL_ABSTRACT_P (decl)
24065 || cgraph_function_possibly_inlined_p (decl));
24067 if (! BLOCK_ABSTRACT (stmt))
24069 dw_die_ref subr_die
24070 = new_die (DW_TAG_inlined_subroutine, context_die, stmt);
24072 if (call_arg_locations || debug_inline_points)
24073 BLOCK_DIE (stmt) = subr_die;
24074 add_abstract_origin_attribute (subr_die, decl);
24075 if (TREE_ASM_WRITTEN (stmt))
24076 add_high_low_attributes (stmt, subr_die);
24077 add_call_src_coords_attributes (stmt, subr_die);
24079 decls_for_scope (stmt, subr_die);
24083 /* Generate a DIE for a field in a record, or structure. CTX is required: see
24084 the comment for VLR_CONTEXT. */
24086 static void
24087 gen_field_die (tree decl, struct vlr_context *ctx, dw_die_ref context_die)
24089 dw_die_ref decl_die;
24091 if (TREE_TYPE (decl) == error_mark_node)
24092 return;
24094 decl_die = new_die (DW_TAG_member, context_die, decl);
24095 add_name_and_src_coords_attributes (decl_die, decl);
24096 add_type_attribute (decl_die, member_declared_type (decl), decl_quals (decl),
24097 TYPE_REVERSE_STORAGE_ORDER (DECL_FIELD_CONTEXT (decl)),
24098 context_die);
24100 if (DECL_BIT_FIELD_TYPE (decl))
24102 add_byte_size_attribute (decl_die, decl);
24103 add_bit_size_attribute (decl_die, decl);
24104 add_bit_offset_attribute (decl_die, decl, ctx);
24107 add_alignment_attribute (decl_die, decl);
24109 /* If we have a variant part offset, then we are supposed to process a member
24110 of a QUAL_UNION_TYPE, which is how we represent variant parts in
24111 trees. */
24112 gcc_assert (ctx->variant_part_offset == NULL_TREE
24113 || TREE_CODE (DECL_FIELD_CONTEXT (decl)) != QUAL_UNION_TYPE);
24114 if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
24115 add_data_member_location_attribute (decl_die, decl, ctx);
24117 if (DECL_ARTIFICIAL (decl))
24118 add_AT_flag (decl_die, DW_AT_artificial, 1);
24120 add_accessibility_attribute (decl_die, decl);
24122 /* Equate decl number to die, so that we can look up this decl later on. */
24123 equate_decl_number_to_die (decl, decl_die);
24126 /* Generate a DIE for a pointer to a member type. TYPE can be an
24127 OFFSET_TYPE, for a pointer to data member, or a RECORD_TYPE, for a
24128 pointer to member function. */
24130 static void
24131 gen_ptr_to_mbr_type_die (tree type, dw_die_ref context_die)
24133 if (lookup_type_die (type))
24134 return;
24136 dw_die_ref ptr_die = new_die (DW_TAG_ptr_to_member_type,
24137 scope_die_for (type, context_die), type);
24139 equate_type_number_to_die (type, ptr_die);
24140 add_AT_die_ref (ptr_die, DW_AT_containing_type,
24141 lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
24142 add_type_attribute (ptr_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
24143 context_die);
24144 add_alignment_attribute (ptr_die, type);
24146 if (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE
24147 && TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE)
24149 dw_loc_descr_ref op = new_loc_descr (DW_OP_plus, 0, 0);
24150 add_AT_loc (ptr_die, DW_AT_use_location, op);
24154 static char *producer_string;
24156 /* Return a heap allocated producer string including command line options
24157 if -grecord-gcc-switches. */
24159 static char *
24160 gen_producer_string (void)
24162 size_t j;
24163 auto_vec<const char *> switches;
24164 const char *language_string = lang_hooks.name;
24165 char *producer, *tail;
24166 const char *p;
24167 size_t len = dwarf_record_gcc_switches ? 0 : 3;
24168 size_t plen = strlen (language_string) + 1 + strlen (version_string);
24170 for (j = 1; dwarf_record_gcc_switches && j < save_decoded_options_count; j++)
24171 switch (save_decoded_options[j].opt_index)
24173 case OPT_o:
24174 case OPT_d:
24175 case OPT_dumpbase:
24176 case OPT_dumpdir:
24177 case OPT_auxbase:
24178 case OPT_auxbase_strip:
24179 case OPT_quiet:
24180 case OPT_version:
24181 case OPT_v:
24182 case OPT_w:
24183 case OPT_L:
24184 case OPT_D:
24185 case OPT_I:
24186 case OPT_U:
24187 case OPT_SPECIAL_unknown:
24188 case OPT_SPECIAL_ignore:
24189 case OPT_SPECIAL_program_name:
24190 case OPT_SPECIAL_input_file:
24191 case OPT_grecord_gcc_switches:
24192 case OPT__output_pch_:
24193 case OPT_fdiagnostics_show_location_:
24194 case OPT_fdiagnostics_show_option:
24195 case OPT_fdiagnostics_show_caret:
24196 case OPT_fdiagnostics_color_:
24197 case OPT_fverbose_asm:
24198 case OPT____:
24199 case OPT__sysroot_:
24200 case OPT_nostdinc:
24201 case OPT_nostdinc__:
24202 case OPT_fpreprocessed:
24203 case OPT_fltrans_output_list_:
24204 case OPT_fresolution_:
24205 case OPT_fdebug_prefix_map_:
24206 case OPT_fmacro_prefix_map_:
24207 case OPT_ffile_prefix_map_:
24208 case OPT_fcompare_debug:
24209 /* Ignore these. */
24210 continue;
24211 default:
24212 if (cl_options[save_decoded_options[j].opt_index].flags
24213 & CL_NO_DWARF_RECORD)
24214 continue;
24215 gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
24216 == '-');
24217 switch (save_decoded_options[j].canonical_option[0][1])
24219 case 'M':
24220 case 'i':
24221 case 'W':
24222 continue;
24223 case 'f':
24224 if (strncmp (save_decoded_options[j].canonical_option[0] + 2,
24225 "dump", 4) == 0)
24226 continue;
24227 break;
24228 default:
24229 break;
24231 switches.safe_push (save_decoded_options[j].orig_option_with_args_text);
24232 len += strlen (save_decoded_options[j].orig_option_with_args_text) + 1;
24233 break;
24236 producer = XNEWVEC (char, plen + 1 + len + 1);
24237 tail = producer;
24238 sprintf (tail, "%s %s", language_string, version_string);
24239 tail += plen;
24241 FOR_EACH_VEC_ELT (switches, j, p)
24243 len = strlen (p);
24244 *tail = ' ';
24245 memcpy (tail + 1, p, len);
24246 tail += len + 1;
24249 *tail = '\0';
24250 return producer;
24253 /* Given a C and/or C++ language/version string return the "highest".
24254 C++ is assumed to be "higher" than C in this case. Used for merging
24255 LTO translation unit languages. */
24256 static const char *
24257 highest_c_language (const char *lang1, const char *lang2)
24259 if (strcmp ("GNU C++17", lang1) == 0 || strcmp ("GNU C++17", lang2) == 0)
24260 return "GNU C++17";
24261 if (strcmp ("GNU C++14", lang1) == 0 || strcmp ("GNU C++14", lang2) == 0)
24262 return "GNU C++14";
24263 if (strcmp ("GNU C++11", lang1) == 0 || strcmp ("GNU C++11", lang2) == 0)
24264 return "GNU C++11";
24265 if (strcmp ("GNU C++98", lang1) == 0 || strcmp ("GNU C++98", lang2) == 0)
24266 return "GNU C++98";
24268 if (strcmp ("GNU C17", lang1) == 0 || strcmp ("GNU C17", lang2) == 0)
24269 return "GNU C17";
24270 if (strcmp ("GNU C11", lang1) == 0 || strcmp ("GNU C11", lang2) == 0)
24271 return "GNU C11";
24272 if (strcmp ("GNU C99", lang1) == 0 || strcmp ("GNU C99", lang2) == 0)
24273 return "GNU C99";
24274 if (strcmp ("GNU C89", lang1) == 0 || strcmp ("GNU C89", lang2) == 0)
24275 return "GNU C89";
24277 gcc_unreachable ();
24281 /* Generate the DIE for the compilation unit. */
24283 static dw_die_ref
24284 gen_compile_unit_die (const char *filename)
24286 dw_die_ref die;
24287 const char *language_string = lang_hooks.name;
24288 int language;
24290 die = new_die (DW_TAG_compile_unit, NULL, NULL);
24292 if (filename)
24294 add_name_attribute (die, filename);
24295 /* Don't add cwd for <built-in>. */
24296 if (filename[0] != '<')
24297 add_comp_dir_attribute (die);
24300 add_AT_string (die, DW_AT_producer, producer_string ? producer_string : "");
24302 /* If our producer is LTO try to figure out a common language to use
24303 from the global list of translation units. */
24304 if (strcmp (language_string, "GNU GIMPLE") == 0)
24306 unsigned i;
24307 tree t;
24308 const char *common_lang = NULL;
24310 FOR_EACH_VEC_SAFE_ELT (all_translation_units, i, t)
24312 if (!TRANSLATION_UNIT_LANGUAGE (t))
24313 continue;
24314 if (!common_lang)
24315 common_lang = TRANSLATION_UNIT_LANGUAGE (t);
24316 else if (strcmp (common_lang, TRANSLATION_UNIT_LANGUAGE (t)) == 0)
24318 else if (strncmp (common_lang, "GNU C", 5) == 0
24319 && strncmp (TRANSLATION_UNIT_LANGUAGE (t), "GNU C", 5) == 0)
24320 /* Mixing C and C++ is ok, use C++ in that case. */
24321 common_lang = highest_c_language (common_lang,
24322 TRANSLATION_UNIT_LANGUAGE (t));
24323 else
24325 /* Fall back to C. */
24326 common_lang = NULL;
24327 break;
24331 if (common_lang)
24332 language_string = common_lang;
24335 language = DW_LANG_C;
24336 if (strncmp (language_string, "GNU C", 5) == 0
24337 && ISDIGIT (language_string[5]))
24339 language = DW_LANG_C89;
24340 if (dwarf_version >= 3 || !dwarf_strict)
24342 if (strcmp (language_string, "GNU C89") != 0)
24343 language = DW_LANG_C99;
24345 if (dwarf_version >= 5 /* || !dwarf_strict */)
24346 if (strcmp (language_string, "GNU C11") == 0
24347 || strcmp (language_string, "GNU C17") == 0)
24348 language = DW_LANG_C11;
24351 else if (strncmp (language_string, "GNU C++", 7) == 0)
24353 language = DW_LANG_C_plus_plus;
24354 if (dwarf_version >= 5 /* || !dwarf_strict */)
24356 if (strcmp (language_string, "GNU C++11") == 0)
24357 language = DW_LANG_C_plus_plus_11;
24358 else if (strcmp (language_string, "GNU C++14") == 0)
24359 language = DW_LANG_C_plus_plus_14;
24360 else if (strcmp (language_string, "GNU C++17") == 0)
24361 /* For now. */
24362 language = DW_LANG_C_plus_plus_14;
24365 else if (strcmp (language_string, "GNU F77") == 0)
24366 language = DW_LANG_Fortran77;
24367 else if (dwarf_version >= 3 || !dwarf_strict)
24369 if (strcmp (language_string, "GNU Ada") == 0)
24370 language = DW_LANG_Ada95;
24371 else if (strncmp (language_string, "GNU Fortran", 11) == 0)
24373 language = DW_LANG_Fortran95;
24374 if (dwarf_version >= 5 /* || !dwarf_strict */)
24376 if (strcmp (language_string, "GNU Fortran2003") == 0)
24377 language = DW_LANG_Fortran03;
24378 else if (strcmp (language_string, "GNU Fortran2008") == 0)
24379 language = DW_LANG_Fortran08;
24382 else if (strcmp (language_string, "GNU Objective-C") == 0)
24383 language = DW_LANG_ObjC;
24384 else if (strcmp (language_string, "GNU Objective-C++") == 0)
24385 language = DW_LANG_ObjC_plus_plus;
24386 else if (dwarf_version >= 5 || !dwarf_strict)
24388 if (strcmp (language_string, "GNU Go") == 0)
24389 language = DW_LANG_Go;
24392 /* Use a degraded Fortran setting in strict DWARF2 so is_fortran works. */
24393 else if (strncmp (language_string, "GNU Fortran", 11) == 0)
24394 language = DW_LANG_Fortran90;
24396 add_AT_unsigned (die, DW_AT_language, language);
24398 switch (language)
24400 case DW_LANG_Fortran77:
24401 case DW_LANG_Fortran90:
24402 case DW_LANG_Fortran95:
24403 case DW_LANG_Fortran03:
24404 case DW_LANG_Fortran08:
24405 /* Fortran has case insensitive identifiers and the front-end
24406 lowercases everything. */
24407 add_AT_unsigned (die, DW_AT_identifier_case, DW_ID_down_case);
24408 break;
24409 default:
24410 /* The default DW_ID_case_sensitive doesn't need to be specified. */
24411 break;
24413 return die;
24416 /* Generate the DIE for a base class. */
24418 static void
24419 gen_inheritance_die (tree binfo, tree access, tree type,
24420 dw_die_ref context_die)
24422 dw_die_ref die = new_die (DW_TAG_inheritance, context_die, binfo);
24423 struct vlr_context ctx = { type, NULL };
24425 add_type_attribute (die, BINFO_TYPE (binfo), TYPE_UNQUALIFIED, false,
24426 context_die);
24427 add_data_member_location_attribute (die, binfo, &ctx);
24429 if (BINFO_VIRTUAL_P (binfo))
24430 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
24432 /* In DWARF3+ the default is DW_ACCESS_private only in DW_TAG_class_type
24433 children, otherwise the default is DW_ACCESS_public. In DWARF2
24434 the default has always been DW_ACCESS_private. */
24435 if (access == access_public_node)
24437 if (dwarf_version == 2
24438 || context_die->die_tag == DW_TAG_class_type)
24439 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
24441 else if (access == access_protected_node)
24442 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
24443 else if (dwarf_version > 2
24444 && context_die->die_tag != DW_TAG_class_type)
24445 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_private);
24448 /* Return whether DECL is a FIELD_DECL that represents the variant part of a
24449 structure. */
24450 static bool
24451 is_variant_part (tree decl)
24453 return (TREE_CODE (decl) == FIELD_DECL
24454 && TREE_CODE (TREE_TYPE (decl)) == QUAL_UNION_TYPE);
24457 /* Check that OPERAND is a reference to a field in STRUCT_TYPE. If it is,
24458 return the FIELD_DECL. Return NULL_TREE otherwise. */
24460 static tree
24461 analyze_discr_in_predicate (tree operand, tree struct_type)
24463 bool continue_stripping = true;
24464 while (continue_stripping)
24465 switch (TREE_CODE (operand))
24467 CASE_CONVERT:
24468 operand = TREE_OPERAND (operand, 0);
24469 break;
24470 default:
24471 continue_stripping = false;
24472 break;
24475 /* Match field access to members of struct_type only. */
24476 if (TREE_CODE (operand) == COMPONENT_REF
24477 && TREE_CODE (TREE_OPERAND (operand, 0)) == PLACEHOLDER_EXPR
24478 && TREE_TYPE (TREE_OPERAND (operand, 0)) == struct_type
24479 && TREE_CODE (TREE_OPERAND (operand, 1)) == FIELD_DECL)
24480 return TREE_OPERAND (operand, 1);
24481 else
24482 return NULL_TREE;
24485 /* Check that SRC is a constant integer that can be represented as a native
24486 integer constant (either signed or unsigned). If so, store it into DEST and
24487 return true. Return false otherwise. */
24489 static bool
24490 get_discr_value (tree src, dw_discr_value *dest)
24492 tree discr_type = TREE_TYPE (src);
24494 if (lang_hooks.types.get_debug_type)
24496 tree debug_type = lang_hooks.types.get_debug_type (discr_type);
24497 if (debug_type != NULL)
24498 discr_type = debug_type;
24501 if (TREE_CODE (src) != INTEGER_CST || !INTEGRAL_TYPE_P (discr_type))
24502 return false;
24504 /* Signedness can vary between the original type and the debug type. This
24505 can happen for character types in Ada for instance: the character type
24506 used for code generation can be signed, to be compatible with the C one,
24507 but from a debugger point of view, it must be unsigned. */
24508 bool is_orig_unsigned = TYPE_UNSIGNED (TREE_TYPE (src));
24509 bool is_debug_unsigned = TYPE_UNSIGNED (discr_type);
24511 if (is_orig_unsigned != is_debug_unsigned)
24512 src = fold_convert (discr_type, src);
24514 if (!(is_debug_unsigned ? tree_fits_uhwi_p (src) : tree_fits_shwi_p (src)))
24515 return false;
24517 dest->pos = is_debug_unsigned;
24518 if (is_debug_unsigned)
24519 dest->v.uval = tree_to_uhwi (src);
24520 else
24521 dest->v.sval = tree_to_shwi (src);
24523 return true;
24526 /* Try to extract synthetic properties out of VARIANT_PART_DECL, which is a
24527 FIELD_DECL in STRUCT_TYPE that represents a variant part. If unsuccessful,
24528 store NULL_TREE in DISCR_DECL. Otherwise:
24530 - store the discriminant field in STRUCT_TYPE that controls the variant
24531 part to *DISCR_DECL
24533 - put in *DISCR_LISTS_P an array where for each variant, the item
24534 represents the corresponding matching list of discriminant values.
24536 - put in *DISCR_LISTS_LENGTH the number of variants, which is the size of
24537 the above array.
24539 Note that when the array is allocated (i.e. when the analysis is
24540 successful), it is up to the caller to free the array. */
24542 static void
24543 analyze_variants_discr (tree variant_part_decl,
24544 tree struct_type,
24545 tree *discr_decl,
24546 dw_discr_list_ref **discr_lists_p,
24547 unsigned *discr_lists_length)
24549 tree variant_part_type = TREE_TYPE (variant_part_decl);
24550 tree variant;
24551 dw_discr_list_ref *discr_lists;
24552 unsigned i;
24554 /* Compute how many variants there are in this variant part. */
24555 *discr_lists_length = 0;
24556 for (variant = TYPE_FIELDS (variant_part_type);
24557 variant != NULL_TREE;
24558 variant = DECL_CHAIN (variant))
24559 ++*discr_lists_length;
24561 *discr_decl = NULL_TREE;
24562 *discr_lists_p
24563 = (dw_discr_list_ref *) xcalloc (*discr_lists_length,
24564 sizeof (**discr_lists_p));
24565 discr_lists = *discr_lists_p;
24567 /* And then analyze all variants to extract discriminant information for all
24568 of them. This analysis is conservative: as soon as we detect something we
24569 do not support, abort everything and pretend we found nothing. */
24570 for (variant = TYPE_FIELDS (variant_part_type), i = 0;
24571 variant != NULL_TREE;
24572 variant = DECL_CHAIN (variant), ++i)
24574 tree match_expr = DECL_QUALIFIER (variant);
24576 /* Now, try to analyze the predicate and deduce a discriminant for
24577 it. */
24578 if (match_expr == boolean_true_node)
24579 /* Typically happens for the default variant: it matches all cases that
24580 previous variants rejected. Don't output any matching value for
24581 this one. */
24582 continue;
24584 /* The following loop tries to iterate over each discriminant
24585 possibility: single values or ranges. */
24586 while (match_expr != NULL_TREE)
24588 tree next_round_match_expr;
24589 tree candidate_discr = NULL_TREE;
24590 dw_discr_list_ref new_node = NULL;
24592 /* Possibilities are matched one after the other by nested
24593 TRUTH_ORIF_EXPR expressions. Process the current possibility and
24594 continue with the rest at next iteration. */
24595 if (TREE_CODE (match_expr) == TRUTH_ORIF_EXPR)
24597 next_round_match_expr = TREE_OPERAND (match_expr, 0);
24598 match_expr = TREE_OPERAND (match_expr, 1);
24600 else
24601 next_round_match_expr = NULL_TREE;
24603 if (match_expr == boolean_false_node)
24604 /* This sub-expression matches nothing: just wait for the next
24605 one. */
24608 else if (TREE_CODE (match_expr) == EQ_EXPR)
24610 /* We are matching: <discr_field> == <integer_cst>
24611 This sub-expression matches a single value. */
24612 tree integer_cst = TREE_OPERAND (match_expr, 1);
24614 candidate_discr
24615 = analyze_discr_in_predicate (TREE_OPERAND (match_expr, 0),
24616 struct_type);
24618 new_node = ggc_cleared_alloc<dw_discr_list_node> ();
24619 if (!get_discr_value (integer_cst,
24620 &new_node->dw_discr_lower_bound))
24621 goto abort;
24622 new_node->dw_discr_range = false;
24625 else if (TREE_CODE (match_expr) == TRUTH_ANDIF_EXPR)
24627 /* We are matching:
24628 <discr_field> > <integer_cst>
24629 && <discr_field> < <integer_cst>.
24630 This sub-expression matches the range of values between the
24631 two matched integer constants. Note that comparisons can be
24632 inclusive or exclusive. */
24633 tree candidate_discr_1, candidate_discr_2;
24634 tree lower_cst, upper_cst;
24635 bool lower_cst_included, upper_cst_included;
24636 tree lower_op = TREE_OPERAND (match_expr, 0);
24637 tree upper_op = TREE_OPERAND (match_expr, 1);
24639 /* When the comparison is exclusive, the integer constant is not
24640 the discriminant range bound we are looking for: we will have
24641 to increment or decrement it. */
24642 if (TREE_CODE (lower_op) == GE_EXPR)
24643 lower_cst_included = true;
24644 else if (TREE_CODE (lower_op) == GT_EXPR)
24645 lower_cst_included = false;
24646 else
24647 goto abort;
24649 if (TREE_CODE (upper_op) == LE_EXPR)
24650 upper_cst_included = true;
24651 else if (TREE_CODE (upper_op) == LT_EXPR)
24652 upper_cst_included = false;
24653 else
24654 goto abort;
24656 /* Extract the discriminant from the first operand and check it
24657 is consistant with the same analysis in the second
24658 operand. */
24659 candidate_discr_1
24660 = analyze_discr_in_predicate (TREE_OPERAND (lower_op, 0),
24661 struct_type);
24662 candidate_discr_2
24663 = analyze_discr_in_predicate (TREE_OPERAND (upper_op, 0),
24664 struct_type);
24665 if (candidate_discr_1 == candidate_discr_2)
24666 candidate_discr = candidate_discr_1;
24667 else
24668 goto abort;
24670 /* Extract bounds from both. */
24671 new_node = ggc_cleared_alloc<dw_discr_list_node> ();
24672 lower_cst = TREE_OPERAND (lower_op, 1);
24673 upper_cst = TREE_OPERAND (upper_op, 1);
24675 if (!lower_cst_included)
24676 lower_cst
24677 = fold_build2 (PLUS_EXPR, TREE_TYPE (lower_cst), lower_cst,
24678 build_int_cst (TREE_TYPE (lower_cst), 1));
24679 if (!upper_cst_included)
24680 upper_cst
24681 = fold_build2 (MINUS_EXPR, TREE_TYPE (upper_cst), upper_cst,
24682 build_int_cst (TREE_TYPE (upper_cst), 1));
24684 if (!get_discr_value (lower_cst,
24685 &new_node->dw_discr_lower_bound)
24686 || !get_discr_value (upper_cst,
24687 &new_node->dw_discr_upper_bound))
24688 goto abort;
24690 new_node->dw_discr_range = true;
24693 else
24694 /* Unsupported sub-expression: we cannot determine the set of
24695 matching discriminant values. Abort everything. */
24696 goto abort;
24698 /* If the discriminant info is not consistant with what we saw so
24699 far, consider the analysis failed and abort everything. */
24700 if (candidate_discr == NULL_TREE
24701 || (*discr_decl != NULL_TREE && candidate_discr != *discr_decl))
24702 goto abort;
24703 else
24704 *discr_decl = candidate_discr;
24706 if (new_node != NULL)
24708 new_node->dw_discr_next = discr_lists[i];
24709 discr_lists[i] = new_node;
24711 match_expr = next_round_match_expr;
24715 /* If we reach this point, we could match everything we were interested
24716 in. */
24717 return;
24719 abort:
24720 /* Clean all data structure and return no result. */
24721 free (*discr_lists_p);
24722 *discr_lists_p = NULL;
24723 *discr_decl = NULL_TREE;
24726 /* Generate a DIE to represent VARIANT_PART_DECL, a variant part that is part
24727 of STRUCT_TYPE, a record type. This new DIE is emitted as the next child
24728 under CONTEXT_DIE.
24730 Variant parts are supposed to be implemented as a FIELD_DECL whose type is a
24731 QUAL_UNION_TYPE: this is the VARIANT_PART_DECL parameter. The members for
24732 this type, which are record types, represent the available variants and each
24733 has a DECL_QUALIFIER attribute. The discriminant and the discriminant
24734 values are inferred from these attributes.
24736 In trees, the offsets for the fields inside these sub-records are relative
24737 to the variant part itself, whereas the corresponding DIEs should have
24738 offset attributes that are relative to the embedding record base address.
24739 This is why the caller must provide a VARIANT_PART_OFFSET expression: it
24740 must be an expression that computes the offset of the variant part to
24741 describe in DWARF. */
24743 static void
24744 gen_variant_part (tree variant_part_decl, struct vlr_context *vlr_ctx,
24745 dw_die_ref context_die)
24747 const tree variant_part_type = TREE_TYPE (variant_part_decl);
24748 tree variant_part_offset = vlr_ctx->variant_part_offset;
24749 struct loc_descr_context ctx = {
24750 vlr_ctx->struct_type, /* context_type */
24751 NULL_TREE, /* base_decl */
24752 NULL, /* dpi */
24753 false, /* placeholder_arg */
24754 false /* placeholder_seen */
24757 /* The FIELD_DECL node in STRUCT_TYPE that acts as the discriminant, or
24758 NULL_TREE if there is no such field. */
24759 tree discr_decl = NULL_TREE;
24760 dw_discr_list_ref *discr_lists;
24761 unsigned discr_lists_length = 0;
24762 unsigned i;
24764 dw_die_ref dwarf_proc_die = NULL;
24765 dw_die_ref variant_part_die
24766 = new_die (DW_TAG_variant_part, context_die, variant_part_type);
24768 equate_decl_number_to_die (variant_part_decl, variant_part_die);
24770 analyze_variants_discr (variant_part_decl, vlr_ctx->struct_type,
24771 &discr_decl, &discr_lists, &discr_lists_length);
24773 if (discr_decl != NULL_TREE)
24775 dw_die_ref discr_die = lookup_decl_die (discr_decl);
24777 if (discr_die)
24778 add_AT_die_ref (variant_part_die, DW_AT_discr, discr_die);
24779 else
24780 /* We have no DIE for the discriminant, so just discard all
24781 discrimimant information in the output. */
24782 discr_decl = NULL_TREE;
24785 /* If the offset for this variant part is more complex than a constant,
24786 create a DWARF procedure for it so that we will not have to generate DWARF
24787 expressions for it for each member. */
24788 if (TREE_CODE (variant_part_offset) != INTEGER_CST
24789 && (dwarf_version >= 3 || !dwarf_strict))
24791 const tree dwarf_proc_fndecl
24792 = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, NULL_TREE,
24793 build_function_type (TREE_TYPE (variant_part_offset),
24794 NULL_TREE));
24795 const tree dwarf_proc_call = build_call_expr (dwarf_proc_fndecl, 0);
24796 const dw_loc_descr_ref dwarf_proc_body
24797 = loc_descriptor_from_tree (variant_part_offset, 0, &ctx);
24799 dwarf_proc_die = new_dwarf_proc_die (dwarf_proc_body,
24800 dwarf_proc_fndecl, context_die);
24801 if (dwarf_proc_die != NULL)
24802 variant_part_offset = dwarf_proc_call;
24805 /* Output DIEs for all variants. */
24806 i = 0;
24807 for (tree variant = TYPE_FIELDS (variant_part_type);
24808 variant != NULL_TREE;
24809 variant = DECL_CHAIN (variant), ++i)
24811 tree variant_type = TREE_TYPE (variant);
24812 dw_die_ref variant_die;
24814 /* All variants (i.e. members of a variant part) are supposed to be
24815 encoded as structures. Sub-variant parts are QUAL_UNION_TYPE fields
24816 under these records. */
24817 gcc_assert (TREE_CODE (variant_type) == RECORD_TYPE);
24819 variant_die = new_die (DW_TAG_variant, variant_part_die, variant_type);
24820 equate_decl_number_to_die (variant, variant_die);
24822 /* Output discriminant values this variant matches, if any. */
24823 if (discr_decl == NULL || discr_lists[i] == NULL)
24824 /* In the case we have discriminant information at all, this is
24825 probably the default variant: as the standard says, don't
24826 output any discriminant value/list attribute. */
24828 else if (discr_lists[i]->dw_discr_next == NULL
24829 && !discr_lists[i]->dw_discr_range)
24830 /* If there is only one accepted value, don't bother outputting a
24831 list. */
24832 add_discr_value (variant_die, &discr_lists[i]->dw_discr_lower_bound);
24833 else
24834 add_discr_list (variant_die, discr_lists[i]);
24836 for (tree member = TYPE_FIELDS (variant_type);
24837 member != NULL_TREE;
24838 member = DECL_CHAIN (member))
24840 struct vlr_context vlr_sub_ctx = {
24841 vlr_ctx->struct_type, /* struct_type */
24842 NULL /* variant_part_offset */
24844 if (is_variant_part (member))
24846 /* All offsets for fields inside variant parts are relative to
24847 the top-level embedding RECORD_TYPE's base address. On the
24848 other hand, offsets in GCC's types are relative to the
24849 nested-most variant part. So we have to sum offsets each time
24850 we recurse. */
24852 vlr_sub_ctx.variant_part_offset
24853 = fold_build2 (PLUS_EXPR, TREE_TYPE (variant_part_offset),
24854 variant_part_offset, byte_position (member));
24855 gen_variant_part (member, &vlr_sub_ctx, variant_die);
24857 else
24859 vlr_sub_ctx.variant_part_offset = variant_part_offset;
24860 gen_decl_die (member, NULL, &vlr_sub_ctx, variant_die);
24865 free (discr_lists);
24868 /* Generate a DIE for a class member. */
24870 static void
24871 gen_member_die (tree type, dw_die_ref context_die)
24873 tree member;
24874 tree binfo = TYPE_BINFO (type);
24876 gcc_assert (TYPE_MAIN_VARIANT (type) == type);
24878 /* If this is not an incomplete type, output descriptions of each of its
24879 members. Note that as we output the DIEs necessary to represent the
24880 members of this record or union type, we will also be trying to output
24881 DIEs to represent the *types* of those members. However the `type'
24882 function (above) will specifically avoid generating type DIEs for member
24883 types *within* the list of member DIEs for this (containing) type except
24884 for those types (of members) which are explicitly marked as also being
24885 members of this (containing) type themselves. The g++ front- end can
24886 force any given type to be treated as a member of some other (containing)
24887 type by setting the TYPE_CONTEXT of the given (member) type to point to
24888 the TREE node representing the appropriate (containing) type. */
24890 /* First output info about the base classes. */
24891 if (binfo)
24893 vec<tree, va_gc> *accesses = BINFO_BASE_ACCESSES (binfo);
24894 int i;
24895 tree base;
24897 for (i = 0; BINFO_BASE_ITERATE (binfo, i, base); i++)
24898 gen_inheritance_die (base,
24899 (accesses ? (*accesses)[i] : access_public_node),
24900 type,
24901 context_die);
24904 /* Now output info about the data members and type members. */
24905 for (member = TYPE_FIELDS (type); member; member = DECL_CHAIN (member))
24907 struct vlr_context vlr_ctx = { type, NULL_TREE };
24908 bool static_inline_p
24909 = (TREE_STATIC (member)
24910 && (lang_hooks.decls.decl_dwarf_attribute (member, DW_AT_inline)
24911 != -1));
24913 /* Ignore clones. */
24914 if (DECL_ABSTRACT_ORIGIN (member))
24915 continue;
24917 /* If we thought we were generating minimal debug info for TYPE
24918 and then changed our minds, some of the member declarations
24919 may have already been defined. Don't define them again, but
24920 do put them in the right order. */
24922 if (dw_die_ref child = lookup_decl_die (member))
24924 /* Handle inline static data members, which only have in-class
24925 declarations. */
24926 dw_die_ref ref = NULL;
24927 if (child->die_tag == DW_TAG_variable
24928 && child->die_parent == comp_unit_die ())
24930 ref = get_AT_ref (child, DW_AT_specification);
24931 /* For C++17 inline static data members followed by redundant
24932 out of class redeclaration, we might get here with
24933 child being the DIE created for the out of class
24934 redeclaration and with its DW_AT_specification being
24935 the DIE created for in-class definition. We want to
24936 reparent the latter, and don't want to create another
24937 DIE with DW_AT_specification in that case, because
24938 we already have one. */
24939 if (ref
24940 && static_inline_p
24941 && ref->die_tag == DW_TAG_variable
24942 && ref->die_parent == comp_unit_die ()
24943 && get_AT (ref, DW_AT_specification) == NULL)
24945 child = ref;
24946 ref = NULL;
24947 static_inline_p = false;
24951 if (child->die_tag == DW_TAG_variable
24952 && child->die_parent == comp_unit_die ()
24953 && ref == NULL)
24955 reparent_child (child, context_die);
24956 if (dwarf_version < 5)
24957 child->die_tag = DW_TAG_member;
24959 else
24960 splice_child_die (context_die, child);
24963 /* Do not generate standard DWARF for variant parts if we are generating
24964 the corresponding GNAT encodings: DIEs generated for both would
24965 conflict in our mappings. */
24966 else if (is_variant_part (member)
24967 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
24969 vlr_ctx.variant_part_offset = byte_position (member);
24970 gen_variant_part (member, &vlr_ctx, context_die);
24972 else
24974 vlr_ctx.variant_part_offset = NULL_TREE;
24975 gen_decl_die (member, NULL, &vlr_ctx, context_die);
24978 /* For C++ inline static data members emit immediately a DW_TAG_variable
24979 DIE that will refer to that DW_TAG_member/DW_TAG_variable through
24980 DW_AT_specification. */
24981 if (static_inline_p)
24983 int old_extern = DECL_EXTERNAL (member);
24984 DECL_EXTERNAL (member) = 0;
24985 gen_decl_die (member, NULL, NULL, comp_unit_die ());
24986 DECL_EXTERNAL (member) = old_extern;
24991 /* Generate a DIE for a structure or union type. If TYPE_DECL_SUPPRESS_DEBUG
24992 is set, we pretend that the type was never defined, so we only get the
24993 member DIEs needed by later specification DIEs. */
24995 static void
24996 gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
24997 enum debug_info_usage usage)
24999 if (TREE_ASM_WRITTEN (type))
25001 /* Fill in the bound of variable-length fields in late dwarf if
25002 still incomplete. */
25003 if (!early_dwarf && variably_modified_type_p (type, NULL))
25004 for (tree member = TYPE_FIELDS (type);
25005 member;
25006 member = DECL_CHAIN (member))
25007 fill_variable_array_bounds (TREE_TYPE (member));
25008 return;
25011 dw_die_ref type_die = lookup_type_die (type);
25012 dw_die_ref scope_die = 0;
25013 int nested = 0;
25014 int complete = (TYPE_SIZE (type)
25015 && (! TYPE_STUB_DECL (type)
25016 || ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))));
25017 int ns_decl = (context_die && context_die->die_tag == DW_TAG_namespace);
25018 complete = complete && should_emit_struct_debug (type, usage);
25020 if (type_die && ! complete)
25021 return;
25023 if (TYPE_CONTEXT (type) != NULL_TREE
25024 && (AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
25025 || TREE_CODE (TYPE_CONTEXT (type)) == NAMESPACE_DECL))
25026 nested = 1;
25028 scope_die = scope_die_for (type, context_die);
25030 /* Generate child dies for template paramaters. */
25031 if (!type_die && debug_info_level > DINFO_LEVEL_TERSE)
25032 schedule_generic_params_dies_gen (type);
25034 if (! type_die || (nested && is_cu_die (scope_die)))
25035 /* First occurrence of type or toplevel definition of nested class. */
25037 dw_die_ref old_die = type_die;
25039 type_die = new_die (TREE_CODE (type) == RECORD_TYPE
25040 ? record_type_tag (type) : DW_TAG_union_type,
25041 scope_die, type);
25042 equate_type_number_to_die (type, type_die);
25043 if (old_die)
25044 add_AT_specification (type_die, old_die);
25045 else
25046 add_name_attribute (type_die, type_tag (type));
25048 else
25049 remove_AT (type_die, DW_AT_declaration);
25051 /* If this type has been completed, then give it a byte_size attribute and
25052 then give a list of members. */
25053 if (complete && !ns_decl)
25055 /* Prevent infinite recursion in cases where the type of some member of
25056 this type is expressed in terms of this type itself. */
25057 TREE_ASM_WRITTEN (type) = 1;
25058 add_byte_size_attribute (type_die, type);
25059 add_alignment_attribute (type_die, type);
25060 if (TYPE_STUB_DECL (type) != NULL_TREE)
25062 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
25063 add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
25066 /* If the first reference to this type was as the return type of an
25067 inline function, then it may not have a parent. Fix this now. */
25068 if (type_die->die_parent == NULL)
25069 add_child_die (scope_die, type_die);
25071 push_decl_scope (type);
25072 gen_member_die (type, type_die);
25073 pop_decl_scope ();
25075 add_gnat_descriptive_type_attribute (type_die, type, context_die);
25076 if (TYPE_ARTIFICIAL (type))
25077 add_AT_flag (type_die, DW_AT_artificial, 1);
25079 /* GNU extension: Record what type our vtable lives in. */
25080 if (TYPE_VFIELD (type))
25082 tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
25084 gen_type_die (vtype, context_die);
25085 add_AT_die_ref (type_die, DW_AT_containing_type,
25086 lookup_type_die (vtype));
25089 else
25091 add_AT_flag (type_die, DW_AT_declaration, 1);
25093 /* We don't need to do this for function-local types. */
25094 if (TYPE_STUB_DECL (type)
25095 && ! decl_function_context (TYPE_STUB_DECL (type)))
25096 vec_safe_push (incomplete_types, type);
25099 if (get_AT (type_die, DW_AT_name))
25100 add_pubtype (type, type_die);
25103 /* Generate a DIE for a subroutine _type_. */
25105 static void
25106 gen_subroutine_type_die (tree type, dw_die_ref context_die)
25108 tree return_type = TREE_TYPE (type);
25109 dw_die_ref subr_die
25110 = new_die (DW_TAG_subroutine_type,
25111 scope_die_for (type, context_die), type);
25113 equate_type_number_to_die (type, subr_die);
25114 add_prototyped_attribute (subr_die, type);
25115 add_type_attribute (subr_die, return_type, TYPE_UNQUALIFIED, false,
25116 context_die);
25117 add_alignment_attribute (subr_die, type);
25118 gen_formal_types_die (type, subr_die);
25120 if (get_AT (subr_die, DW_AT_name))
25121 add_pubtype (type, subr_die);
25122 if ((dwarf_version >= 5 || !dwarf_strict)
25123 && lang_hooks.types.type_dwarf_attribute (type, DW_AT_reference) != -1)
25124 add_AT_flag (subr_die, DW_AT_reference, 1);
25125 if ((dwarf_version >= 5 || !dwarf_strict)
25126 && lang_hooks.types.type_dwarf_attribute (type,
25127 DW_AT_rvalue_reference) != -1)
25128 add_AT_flag (subr_die, DW_AT_rvalue_reference, 1);
25131 /* Generate a DIE for a type definition. */
25133 static void
25134 gen_typedef_die (tree decl, dw_die_ref context_die)
25136 dw_die_ref type_die;
25137 tree type;
25139 if (TREE_ASM_WRITTEN (decl))
25141 if (DECL_ORIGINAL_TYPE (decl))
25142 fill_variable_array_bounds (DECL_ORIGINAL_TYPE (decl));
25143 return;
25146 /* As we avoid creating DIEs for local typedefs (see decl_ultimate_origin
25147 checks in process_scope_var and modified_type_die), this should be called
25148 only for original types. */
25149 gcc_assert (decl_ultimate_origin (decl) == NULL
25150 || decl_ultimate_origin (decl) == decl);
25152 TREE_ASM_WRITTEN (decl) = 1;
25153 type_die = new_die (DW_TAG_typedef, context_die, decl);
25155 add_name_and_src_coords_attributes (type_die, decl);
25156 if (DECL_ORIGINAL_TYPE (decl))
25158 type = DECL_ORIGINAL_TYPE (decl);
25159 if (type == error_mark_node)
25160 return;
25162 gcc_assert (type != TREE_TYPE (decl));
25163 equate_type_number_to_die (TREE_TYPE (decl), type_die);
25165 else
25167 type = TREE_TYPE (decl);
25168 if (type == error_mark_node)
25169 return;
25171 if (is_naming_typedef_decl (TYPE_NAME (type)))
25173 /* Here, we are in the case of decl being a typedef naming
25174 an anonymous type, e.g:
25175 typedef struct {...} foo;
25176 In that case TREE_TYPE (decl) is not a typedef variant
25177 type and TYPE_NAME of the anonymous type is set to the
25178 TYPE_DECL of the typedef. This construct is emitted by
25179 the C++ FE.
25181 TYPE is the anonymous struct named by the typedef
25182 DECL. As we need the DW_AT_type attribute of the
25183 DW_TAG_typedef to point to the DIE of TYPE, let's
25184 generate that DIE right away. add_type_attribute
25185 called below will then pick (via lookup_type_die) that
25186 anonymous struct DIE. */
25187 if (!TREE_ASM_WRITTEN (type))
25188 gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE);
25190 /* This is a GNU Extension. We are adding a
25191 DW_AT_linkage_name attribute to the DIE of the
25192 anonymous struct TYPE. The value of that attribute
25193 is the name of the typedef decl naming the anonymous
25194 struct. This greatly eases the work of consumers of
25195 this debug info. */
25196 add_linkage_name_raw (lookup_type_die (type), decl);
25200 add_type_attribute (type_die, type, decl_quals (decl), false,
25201 context_die);
25203 if (is_naming_typedef_decl (decl))
25204 /* We want that all subsequent calls to lookup_type_die with
25205 TYPE in argument yield the DW_TAG_typedef we have just
25206 created. */
25207 equate_type_number_to_die (type, type_die);
25209 add_alignment_attribute (type_die, TREE_TYPE (decl));
25211 add_accessibility_attribute (type_die, decl);
25213 if (DECL_ABSTRACT_P (decl))
25214 equate_decl_number_to_die (decl, type_die);
25216 if (get_AT (type_die, DW_AT_name))
25217 add_pubtype (decl, type_die);
25220 /* Generate a DIE for a struct, class, enum or union type. */
25222 static void
25223 gen_tagged_type_die (tree type,
25224 dw_die_ref context_die,
25225 enum debug_info_usage usage)
25227 int need_pop;
25229 if (type == NULL_TREE
25230 || !is_tagged_type (type))
25231 return;
25233 if (TREE_ASM_WRITTEN (type))
25234 need_pop = 0;
25235 /* If this is a nested type whose containing class hasn't been written
25236 out yet, writing it out will cover this one, too. This does not apply
25237 to instantiations of member class templates; they need to be added to
25238 the containing class as they are generated. FIXME: This hurts the
25239 idea of combining type decls from multiple TUs, since we can't predict
25240 what set of template instantiations we'll get. */
25241 else if (TYPE_CONTEXT (type)
25242 && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
25243 && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
25245 gen_type_die_with_usage (TYPE_CONTEXT (type), context_die, usage);
25247 if (TREE_ASM_WRITTEN (type))
25248 return;
25250 /* If that failed, attach ourselves to the stub. */
25251 push_decl_scope (TYPE_CONTEXT (type));
25252 context_die = lookup_type_die (TYPE_CONTEXT (type));
25253 need_pop = 1;
25255 else if (TYPE_CONTEXT (type) != NULL_TREE
25256 && (TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL))
25258 /* If this type is local to a function that hasn't been written
25259 out yet, use a NULL context for now; it will be fixed up in
25260 decls_for_scope. */
25261 context_die = lookup_decl_die (TYPE_CONTEXT (type));
25262 /* A declaration DIE doesn't count; nested types need to go in the
25263 specification. */
25264 if (context_die && is_declaration_die (context_die))
25265 context_die = NULL;
25266 need_pop = 0;
25268 else
25270 context_die = declare_in_namespace (type, context_die);
25271 need_pop = 0;
25274 if (TREE_CODE (type) == ENUMERAL_TYPE)
25276 /* This might have been written out by the call to
25277 declare_in_namespace. */
25278 if (!TREE_ASM_WRITTEN (type))
25279 gen_enumeration_type_die (type, context_die);
25281 else
25282 gen_struct_or_union_type_die (type, context_die, usage);
25284 if (need_pop)
25285 pop_decl_scope ();
25287 /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
25288 it up if it is ever completed. gen_*_type_die will set it for us
25289 when appropriate. */
25292 /* Generate a type description DIE. */
25294 static void
25295 gen_type_die_with_usage (tree type, dw_die_ref context_die,
25296 enum debug_info_usage usage)
25298 struct array_descr_info info;
25300 if (type == NULL_TREE || type == error_mark_node)
25301 return;
25303 if (flag_checking && type)
25304 verify_type (type);
25306 if (TYPE_NAME (type) != NULL_TREE
25307 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
25308 && is_redundant_typedef (TYPE_NAME (type))
25309 && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
25310 /* The DECL of this type is a typedef we don't want to emit debug
25311 info for but we want debug info for its underlying typedef.
25312 This can happen for e.g, the injected-class-name of a C++
25313 type. */
25314 type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
25316 /* If TYPE is a typedef type variant, let's generate debug info
25317 for the parent typedef which TYPE is a type of. */
25318 if (typedef_variant_p (type))
25320 if (TREE_ASM_WRITTEN (type))
25321 return;
25323 tree name = TYPE_NAME (type);
25324 tree origin = decl_ultimate_origin (name);
25325 if (origin != NULL && origin != name)
25327 gen_decl_die (origin, NULL, NULL, context_die);
25328 return;
25331 /* Prevent broken recursion; we can't hand off to the same type. */
25332 gcc_assert (DECL_ORIGINAL_TYPE (name) != type);
25334 /* Give typedefs the right scope. */
25335 context_die = scope_die_for (type, context_die);
25337 TREE_ASM_WRITTEN (type) = 1;
25339 gen_decl_die (name, NULL, NULL, context_die);
25340 return;
25343 /* If type is an anonymous tagged type named by a typedef, let's
25344 generate debug info for the typedef. */
25345 if (is_naming_typedef_decl (TYPE_NAME (type)))
25347 /* Use the DIE of the containing namespace as the parent DIE of
25348 the type description DIE we want to generate. */
25349 if (DECL_CONTEXT (TYPE_NAME (type))
25350 && TREE_CODE (DECL_CONTEXT (TYPE_NAME (type))) == NAMESPACE_DECL)
25351 context_die = get_context_die (DECL_CONTEXT (TYPE_NAME (type)));
25353 gen_decl_die (TYPE_NAME (type), NULL, NULL, context_die);
25354 return;
25357 if (lang_hooks.types.get_debug_type)
25359 tree debug_type = lang_hooks.types.get_debug_type (type);
25361 if (debug_type != NULL_TREE && debug_type != type)
25363 gen_type_die_with_usage (debug_type, context_die, usage);
25364 return;
25368 /* We are going to output a DIE to represent the unqualified version
25369 of this type (i.e. without any const or volatile qualifiers) so
25370 get the main variant (i.e. the unqualified version) of this type
25371 now. (Vectors and arrays are special because the debugging info is in the
25372 cloned type itself. Similarly function/method types can contain extra
25373 ref-qualification). */
25374 if (TREE_CODE (type) == FUNCTION_TYPE
25375 || TREE_CODE (type) == METHOD_TYPE)
25377 /* For function/method types, can't use type_main_variant here,
25378 because that can have different ref-qualifiers for C++,
25379 but try to canonicalize. */
25380 tree main = TYPE_MAIN_VARIANT (type);
25381 for (tree t = main; t; t = TYPE_NEXT_VARIANT (t))
25382 if (TYPE_QUALS_NO_ADDR_SPACE (t) == 0
25383 && check_base_type (t, main)
25384 && check_lang_type (t, type))
25386 type = t;
25387 break;
25390 else if (TREE_CODE (type) != VECTOR_TYPE
25391 && TREE_CODE (type) != ARRAY_TYPE)
25392 type = type_main_variant (type);
25394 /* If this is an array type with hidden descriptor, handle it first. */
25395 if (!TREE_ASM_WRITTEN (type)
25396 && lang_hooks.types.get_array_descr_info)
25398 memset (&info, 0, sizeof (info));
25399 if (lang_hooks.types.get_array_descr_info (type, &info))
25401 /* Fortran sometimes emits array types with no dimension. */
25402 gcc_assert (info.ndimensions >= 0
25403 && (info.ndimensions
25404 <= DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN));
25405 gen_descr_array_type_die (type, &info, context_die);
25406 TREE_ASM_WRITTEN (type) = 1;
25407 return;
25411 if (TREE_ASM_WRITTEN (type))
25413 /* Variable-length types may be incomplete even if
25414 TREE_ASM_WRITTEN. For such types, fall through to
25415 gen_array_type_die() and possibly fill in
25416 DW_AT_{upper,lower}_bound attributes. */
25417 if ((TREE_CODE (type) != ARRAY_TYPE
25418 && TREE_CODE (type) != RECORD_TYPE
25419 && TREE_CODE (type) != UNION_TYPE
25420 && TREE_CODE (type) != QUAL_UNION_TYPE)
25421 || !variably_modified_type_p (type, NULL))
25422 return;
25425 switch (TREE_CODE (type))
25427 case ERROR_MARK:
25428 break;
25430 case POINTER_TYPE:
25431 case REFERENCE_TYPE:
25432 /* We must set TREE_ASM_WRITTEN in case this is a recursive type. This
25433 ensures that the gen_type_die recursion will terminate even if the
25434 type is recursive. Recursive types are possible in Ada. */
25435 /* ??? We could perhaps do this for all types before the switch
25436 statement. */
25437 TREE_ASM_WRITTEN (type) = 1;
25439 /* For these types, all that is required is that we output a DIE (or a
25440 set of DIEs) to represent the "basis" type. */
25441 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25442 DINFO_USAGE_IND_USE);
25443 break;
25445 case OFFSET_TYPE:
25446 /* This code is used for C++ pointer-to-data-member types.
25447 Output a description of the relevant class type. */
25448 gen_type_die_with_usage (TYPE_OFFSET_BASETYPE (type), context_die,
25449 DINFO_USAGE_IND_USE);
25451 /* Output a description of the type of the object pointed to. */
25452 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25453 DINFO_USAGE_IND_USE);
25455 /* Now output a DIE to represent this pointer-to-data-member type
25456 itself. */
25457 gen_ptr_to_mbr_type_die (type, context_die);
25458 break;
25460 case FUNCTION_TYPE:
25461 /* Force out return type (in case it wasn't forced out already). */
25462 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25463 DINFO_USAGE_DIR_USE);
25464 gen_subroutine_type_die (type, context_die);
25465 break;
25467 case METHOD_TYPE:
25468 /* Force out return type (in case it wasn't forced out already). */
25469 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25470 DINFO_USAGE_DIR_USE);
25471 gen_subroutine_type_die (type, context_die);
25472 break;
25474 case ARRAY_TYPE:
25475 case VECTOR_TYPE:
25476 gen_array_type_die (type, context_die);
25477 break;
25479 case ENUMERAL_TYPE:
25480 case RECORD_TYPE:
25481 case UNION_TYPE:
25482 case QUAL_UNION_TYPE:
25483 gen_tagged_type_die (type, context_die, usage);
25484 return;
25486 case VOID_TYPE:
25487 case INTEGER_TYPE:
25488 case REAL_TYPE:
25489 case FIXED_POINT_TYPE:
25490 case COMPLEX_TYPE:
25491 case BOOLEAN_TYPE:
25492 case POINTER_BOUNDS_TYPE:
25493 /* No DIEs needed for fundamental types. */
25494 break;
25496 case NULLPTR_TYPE:
25497 case LANG_TYPE:
25498 /* Just use DW_TAG_unspecified_type. */
25500 dw_die_ref type_die = lookup_type_die (type);
25501 if (type_die == NULL)
25503 tree name = TYPE_IDENTIFIER (type);
25504 type_die = new_die (DW_TAG_unspecified_type, comp_unit_die (),
25505 type);
25506 add_name_attribute (type_die, IDENTIFIER_POINTER (name));
25507 equate_type_number_to_die (type, type_die);
25510 break;
25512 default:
25513 if (is_cxx_auto (type))
25515 tree name = TYPE_IDENTIFIER (type);
25516 dw_die_ref *die = (name == get_identifier ("auto")
25517 ? &auto_die : &decltype_auto_die);
25518 if (!*die)
25520 *die = new_die (DW_TAG_unspecified_type,
25521 comp_unit_die (), NULL_TREE);
25522 add_name_attribute (*die, IDENTIFIER_POINTER (name));
25524 equate_type_number_to_die (type, *die);
25525 break;
25527 gcc_unreachable ();
25530 TREE_ASM_WRITTEN (type) = 1;
25533 static void
25534 gen_type_die (tree type, dw_die_ref context_die)
25536 if (type != error_mark_node)
25538 gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
25539 if (flag_checking)
25541 dw_die_ref die = lookup_type_die (type);
25542 if (die)
25543 check_die (die);
25548 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
25549 things which are local to the given block. */
25551 static void
25552 gen_block_die (tree stmt, dw_die_ref context_die)
25554 int must_output_die = 0;
25555 bool inlined_func;
25557 /* Ignore blocks that are NULL. */
25558 if (stmt == NULL_TREE)
25559 return;
25561 inlined_func = inlined_function_outer_scope_p (stmt);
25563 /* If the block is one fragment of a non-contiguous block, do not
25564 process the variables, since they will have been done by the
25565 origin block. Do process subblocks. */
25566 if (BLOCK_FRAGMENT_ORIGIN (stmt))
25568 tree sub;
25570 for (sub = BLOCK_SUBBLOCKS (stmt); sub; sub = BLOCK_CHAIN (sub))
25571 gen_block_die (sub, context_die);
25573 return;
25576 /* Determine if we need to output any Dwarf DIEs at all to represent this
25577 block. */
25578 if (inlined_func)
25579 /* The outer scopes for inlinings *must* always be represented. We
25580 generate DW_TAG_inlined_subroutine DIEs for them. (See below.) */
25581 must_output_die = 1;
25582 else
25584 /* Determine if this block directly contains any "significant"
25585 local declarations which we will need to output DIEs for. */
25586 if (debug_info_level > DINFO_LEVEL_TERSE)
25587 /* We are not in terse mode so *any* local declaration counts
25588 as being a "significant" one. */
25589 must_output_die = ((BLOCK_VARS (stmt) != NULL
25590 || BLOCK_NUM_NONLOCALIZED_VARS (stmt))
25591 && (TREE_USED (stmt)
25592 || TREE_ASM_WRITTEN (stmt)
25593 || BLOCK_ABSTRACT (stmt)));
25594 else if ((TREE_USED (stmt)
25595 || TREE_ASM_WRITTEN (stmt)
25596 || BLOCK_ABSTRACT (stmt))
25597 && !dwarf2out_ignore_block (stmt))
25598 must_output_die = 1;
25601 /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
25602 DIE for any block which contains no significant local declarations at
25603 all. Rather, in such cases we just call `decls_for_scope' so that any
25604 needed Dwarf info for any sub-blocks will get properly generated. Note
25605 that in terse mode, our definition of what constitutes a "significant"
25606 local declaration gets restricted to include only inlined function
25607 instances and local (nested) function definitions. */
25608 if (must_output_die)
25610 if (inlined_func)
25612 /* If STMT block is abstract, that means we have been called
25613 indirectly from dwarf2out_abstract_function.
25614 That function rightfully marks the descendent blocks (of
25615 the abstract function it is dealing with) as being abstract,
25616 precisely to prevent us from emitting any
25617 DW_TAG_inlined_subroutine DIE as a descendent
25618 of an abstract function instance. So in that case, we should
25619 not call gen_inlined_subroutine_die.
25621 Later though, when cgraph asks dwarf2out to emit info
25622 for the concrete instance of the function decl into which
25623 the concrete instance of STMT got inlined, the later will lead
25624 to the generation of a DW_TAG_inlined_subroutine DIE. */
25625 if (! BLOCK_ABSTRACT (stmt))
25626 gen_inlined_subroutine_die (stmt, context_die);
25628 else
25629 gen_lexical_block_die (stmt, context_die);
25631 else
25632 decls_for_scope (stmt, context_die);
25635 /* Process variable DECL (or variable with origin ORIGIN) within
25636 block STMT and add it to CONTEXT_DIE. */
25637 static void
25638 process_scope_var (tree stmt, tree decl, tree origin, dw_die_ref context_die)
25640 dw_die_ref die;
25641 tree decl_or_origin = decl ? decl : origin;
25643 if (TREE_CODE (decl_or_origin) == FUNCTION_DECL)
25644 die = lookup_decl_die (decl_or_origin);
25645 else if (TREE_CODE (decl_or_origin) == TYPE_DECL)
25647 if (TYPE_DECL_IS_STUB (decl_or_origin))
25648 die = lookup_type_die (TREE_TYPE (decl_or_origin));
25649 else
25650 die = lookup_decl_die (decl_or_origin);
25651 /* Avoid re-creating the DIE late if it was optimized as unused early. */
25652 if (! die && ! early_dwarf)
25653 return;
25655 else
25656 die = NULL;
25658 /* Avoid creating DIEs for local typedefs and concrete static variables that
25659 will only be pruned later. */
25660 if ((origin || decl_ultimate_origin (decl))
25661 && (TREE_CODE (decl_or_origin) == TYPE_DECL
25662 || (VAR_P (decl_or_origin) && TREE_STATIC (decl_or_origin))))
25664 origin = decl_ultimate_origin (decl_or_origin);
25665 if (decl && VAR_P (decl) && die != NULL)
25667 die = lookup_decl_die (origin);
25668 if (die != NULL)
25669 equate_decl_number_to_die (decl, die);
25671 return;
25674 if (die != NULL && die->die_parent == NULL)
25675 add_child_die (context_die, die);
25676 else if (TREE_CODE (decl_or_origin) == IMPORTED_DECL)
25678 if (early_dwarf)
25679 dwarf2out_imported_module_or_decl_1 (decl_or_origin, DECL_NAME (decl_or_origin),
25680 stmt, context_die);
25682 else
25684 if (decl && DECL_P (decl))
25686 die = lookup_decl_die (decl);
25688 /* Early created DIEs do not have a parent as the decls refer
25689 to the function as DECL_CONTEXT rather than the BLOCK. */
25690 if (die && die->die_parent == NULL)
25692 gcc_assert (in_lto_p);
25693 add_child_die (context_die, die);
25697 gen_decl_die (decl, origin, NULL, context_die);
25701 /* Generate all of the decls declared within a given scope and (recursively)
25702 all of its sub-blocks. */
25704 static void
25705 decls_for_scope (tree stmt, dw_die_ref context_die)
25707 tree decl;
25708 unsigned int i;
25709 tree subblocks;
25711 /* Ignore NULL blocks. */
25712 if (stmt == NULL_TREE)
25713 return;
25715 /* Output the DIEs to represent all of the data objects and typedefs
25716 declared directly within this block but not within any nested
25717 sub-blocks. Also, nested function and tag DIEs have been
25718 generated with a parent of NULL; fix that up now. We don't
25719 have to do this if we're at -g1. */
25720 if (debug_info_level > DINFO_LEVEL_TERSE)
25722 for (decl = BLOCK_VARS (stmt); decl != NULL; decl = DECL_CHAIN (decl))
25723 process_scope_var (stmt, decl, NULL_TREE, context_die);
25724 /* BLOCK_NONLOCALIZED_VARs simply generate DIE stubs with abstract
25725 origin - avoid doing this twice as we have no good way to see
25726 if we've done it once already. */
25727 if (! early_dwarf)
25728 for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (stmt); i++)
25730 decl = BLOCK_NONLOCALIZED_VAR (stmt, i);
25731 if (decl == current_function_decl)
25732 /* Ignore declarations of the current function, while they
25733 are declarations, gen_subprogram_die would treat them
25734 as definitions again, because they are equal to
25735 current_function_decl and endlessly recurse. */;
25736 else if (TREE_CODE (decl) == FUNCTION_DECL)
25737 process_scope_var (stmt, decl, NULL_TREE, context_die);
25738 else
25739 process_scope_var (stmt, NULL_TREE, decl, context_die);
25743 /* Even if we're at -g1, we need to process the subblocks in order to get
25744 inlined call information. */
25746 /* Output the DIEs to represent all sub-blocks (and the items declared
25747 therein) of this block. */
25748 for (subblocks = BLOCK_SUBBLOCKS (stmt);
25749 subblocks != NULL;
25750 subblocks = BLOCK_CHAIN (subblocks))
25751 gen_block_die (subblocks, context_die);
25754 /* Is this a typedef we can avoid emitting? */
25756 bool
25757 is_redundant_typedef (const_tree decl)
25759 if (TYPE_DECL_IS_STUB (decl))
25760 return true;
25762 if (DECL_ARTIFICIAL (decl)
25763 && DECL_CONTEXT (decl)
25764 && is_tagged_type (DECL_CONTEXT (decl))
25765 && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
25766 && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
25767 /* Also ignore the artificial member typedef for the class name. */
25768 return true;
25770 return false;
25773 /* Return TRUE if TYPE is a typedef that names a type for linkage
25774 purposes. This kind of typedefs is produced by the C++ FE for
25775 constructs like:
25777 typedef struct {...} foo;
25779 In that case, there is no typedef variant type produced for foo.
25780 Rather, the TREE_TYPE of the TYPE_DECL of foo is the anonymous
25781 struct type. */
25783 static bool
25784 is_naming_typedef_decl (const_tree decl)
25786 if (decl == NULL_TREE
25787 || TREE_CODE (decl) != TYPE_DECL
25788 || DECL_NAMELESS (decl)
25789 || !is_tagged_type (TREE_TYPE (decl))
25790 || DECL_IS_BUILTIN (decl)
25791 || is_redundant_typedef (decl)
25792 /* It looks like Ada produces TYPE_DECLs that are very similar
25793 to C++ naming typedefs but that have different
25794 semantics. Let's be specific to c++ for now. */
25795 || !is_cxx (decl))
25796 return FALSE;
25798 return (DECL_ORIGINAL_TYPE (decl) == NULL_TREE
25799 && TYPE_NAME (TREE_TYPE (decl)) == decl
25800 && (TYPE_STUB_DECL (TREE_TYPE (decl))
25801 != TYPE_NAME (TREE_TYPE (decl))));
25804 /* Looks up the DIE for a context. */
25806 static inline dw_die_ref
25807 lookup_context_die (tree context)
25809 if (context)
25811 /* Find die that represents this context. */
25812 if (TYPE_P (context))
25814 context = TYPE_MAIN_VARIANT (context);
25815 dw_die_ref ctx = lookup_type_die (context);
25816 if (!ctx)
25817 return NULL;
25818 return strip_naming_typedef (context, ctx);
25820 else
25821 return lookup_decl_die (context);
25823 return comp_unit_die ();
25826 /* Returns the DIE for a context. */
25828 static inline dw_die_ref
25829 get_context_die (tree context)
25831 if (context)
25833 /* Find die that represents this context. */
25834 if (TYPE_P (context))
25836 context = TYPE_MAIN_VARIANT (context);
25837 return strip_naming_typedef (context, force_type_die (context));
25839 else
25840 return force_decl_die (context);
25842 return comp_unit_die ();
25845 /* Returns the DIE for decl. A DIE will always be returned. */
25847 static dw_die_ref
25848 force_decl_die (tree decl)
25850 dw_die_ref decl_die;
25851 unsigned saved_external_flag;
25852 tree save_fn = NULL_TREE;
25853 decl_die = lookup_decl_die (decl);
25854 if (!decl_die)
25856 dw_die_ref context_die = get_context_die (DECL_CONTEXT (decl));
25858 decl_die = lookup_decl_die (decl);
25859 if (decl_die)
25860 return decl_die;
25862 switch (TREE_CODE (decl))
25864 case FUNCTION_DECL:
25865 /* Clear current_function_decl, so that gen_subprogram_die thinks
25866 that this is a declaration. At this point, we just want to force
25867 declaration die. */
25868 save_fn = current_function_decl;
25869 current_function_decl = NULL_TREE;
25870 gen_subprogram_die (decl, context_die);
25871 current_function_decl = save_fn;
25872 break;
25874 case VAR_DECL:
25875 /* Set external flag to force declaration die. Restore it after
25876 gen_decl_die() call. */
25877 saved_external_flag = DECL_EXTERNAL (decl);
25878 DECL_EXTERNAL (decl) = 1;
25879 gen_decl_die (decl, NULL, NULL, context_die);
25880 DECL_EXTERNAL (decl) = saved_external_flag;
25881 break;
25883 case NAMESPACE_DECL:
25884 if (dwarf_version >= 3 || !dwarf_strict)
25885 dwarf2out_decl (decl);
25886 else
25887 /* DWARF2 has neither DW_TAG_module, nor DW_TAG_namespace. */
25888 decl_die = comp_unit_die ();
25889 break;
25891 case TRANSLATION_UNIT_DECL:
25892 decl_die = comp_unit_die ();
25893 break;
25895 default:
25896 gcc_unreachable ();
25899 /* We should be able to find the DIE now. */
25900 if (!decl_die)
25901 decl_die = lookup_decl_die (decl);
25902 gcc_assert (decl_die);
25905 return decl_die;
25908 /* Returns the DIE for TYPE, that must not be a base type. A DIE is
25909 always returned. */
25911 static dw_die_ref
25912 force_type_die (tree type)
25914 dw_die_ref type_die;
25916 type_die = lookup_type_die (type);
25917 if (!type_die)
25919 dw_die_ref context_die = get_context_die (TYPE_CONTEXT (type));
25921 type_die = modified_type_die (type, TYPE_QUALS_NO_ADDR_SPACE (type),
25922 false, context_die);
25923 gcc_assert (type_die);
25925 return type_die;
25928 /* Force out any required namespaces to be able to output DECL,
25929 and return the new context_die for it, if it's changed. */
25931 static dw_die_ref
25932 setup_namespace_context (tree thing, dw_die_ref context_die)
25934 tree context = (DECL_P (thing)
25935 ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing));
25936 if (context && TREE_CODE (context) == NAMESPACE_DECL)
25937 /* Force out the namespace. */
25938 context_die = force_decl_die (context);
25940 return context_die;
25943 /* Emit a declaration DIE for THING (which is either a DECL or a tagged
25944 type) within its namespace, if appropriate.
25946 For compatibility with older debuggers, namespace DIEs only contain
25947 declarations; all definitions are emitted at CU scope, with
25948 DW_AT_specification pointing to the declaration (like with class
25949 members). */
25951 static dw_die_ref
25952 declare_in_namespace (tree thing, dw_die_ref context_die)
25954 dw_die_ref ns_context;
25956 if (debug_info_level <= DINFO_LEVEL_TERSE)
25957 return context_die;
25959 /* External declarations in the local scope only need to be emitted
25960 once, not once in the namespace and once in the scope.
25962 This avoids declaring the `extern' below in the
25963 namespace DIE as well as in the innermost scope:
25965 namespace S
25967 int i=5;
25968 int foo()
25970 int i=8;
25971 extern int i;
25972 return i;
25976 if (DECL_P (thing) && DECL_EXTERNAL (thing) && local_scope_p (context_die))
25977 return context_die;
25979 /* If this decl is from an inlined function, then don't try to emit it in its
25980 namespace, as we will get confused. It would have already been emitted
25981 when the abstract instance of the inline function was emitted anyways. */
25982 if (DECL_P (thing) && DECL_ABSTRACT_ORIGIN (thing))
25983 return context_die;
25985 ns_context = setup_namespace_context (thing, context_die);
25987 if (ns_context != context_die)
25989 if (is_fortran ())
25990 return ns_context;
25991 if (DECL_P (thing))
25992 gen_decl_die (thing, NULL, NULL, ns_context);
25993 else
25994 gen_type_die (thing, ns_context);
25996 return context_die;
25999 /* Generate a DIE for a namespace or namespace alias. */
26001 static void
26002 gen_namespace_die (tree decl, dw_die_ref context_die)
26004 dw_die_ref namespace_die;
26006 /* Namespace aliases have a DECL_ABSTRACT_ORIGIN of the namespace
26007 they are an alias of. */
26008 if (DECL_ABSTRACT_ORIGIN (decl) == NULL)
26010 /* Output a real namespace or module. */
26011 context_die = setup_namespace_context (decl, comp_unit_die ());
26012 namespace_die = new_die (is_fortran ()
26013 ? DW_TAG_module : DW_TAG_namespace,
26014 context_die, decl);
26015 /* For Fortran modules defined in different CU don't add src coords. */
26016 if (namespace_die->die_tag == DW_TAG_module && DECL_EXTERNAL (decl))
26018 const char *name = dwarf2_name (decl, 0);
26019 if (name)
26020 add_name_attribute (namespace_die, name);
26022 else
26023 add_name_and_src_coords_attributes (namespace_die, decl);
26024 if (DECL_EXTERNAL (decl))
26025 add_AT_flag (namespace_die, DW_AT_declaration, 1);
26026 equate_decl_number_to_die (decl, namespace_die);
26028 else
26030 /* Output a namespace alias. */
26032 /* Force out the namespace we are an alias of, if necessary. */
26033 dw_die_ref origin_die
26034 = force_decl_die (DECL_ABSTRACT_ORIGIN (decl));
26036 if (DECL_FILE_SCOPE_P (decl)
26037 || TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
26038 context_die = setup_namespace_context (decl, comp_unit_die ());
26039 /* Now create the namespace alias DIE. */
26040 namespace_die = new_die (DW_TAG_imported_declaration, context_die, decl);
26041 add_name_and_src_coords_attributes (namespace_die, decl);
26042 add_AT_die_ref (namespace_die, DW_AT_import, origin_die);
26043 equate_decl_number_to_die (decl, namespace_die);
26045 if ((dwarf_version >= 5 || !dwarf_strict)
26046 && lang_hooks.decls.decl_dwarf_attribute (decl,
26047 DW_AT_export_symbols) == 1)
26048 add_AT_flag (namespace_die, DW_AT_export_symbols, 1);
26050 /* Bypass dwarf2_name's check for DECL_NAMELESS. */
26051 if (want_pubnames ())
26052 add_pubname_string (lang_hooks.dwarf_name (decl, 1), namespace_die);
26055 /* Generate Dwarf debug information for a decl described by DECL.
26056 The return value is currently only meaningful for PARM_DECLs,
26057 for all other decls it returns NULL.
26059 If DECL is a FIELD_DECL, CTX is required: see the comment for VLR_CONTEXT.
26060 It can be NULL otherwise. */
26062 static dw_die_ref
26063 gen_decl_die (tree decl, tree origin, struct vlr_context *ctx,
26064 dw_die_ref context_die)
26066 tree decl_or_origin = decl ? decl : origin;
26067 tree class_origin = NULL, ultimate_origin;
26069 if (DECL_P (decl_or_origin) && DECL_IGNORED_P (decl_or_origin))
26070 return NULL;
26072 /* Ignore pointer bounds decls. */
26073 if (DECL_P (decl_or_origin)
26074 && TREE_TYPE (decl_or_origin)
26075 && POINTER_BOUNDS_P (decl_or_origin))
26076 return NULL;
26078 switch (TREE_CODE (decl_or_origin))
26080 case ERROR_MARK:
26081 break;
26083 case CONST_DECL:
26084 if (!is_fortran () && !is_ada ())
26086 /* The individual enumerators of an enum type get output when we output
26087 the Dwarf representation of the relevant enum type itself. */
26088 break;
26091 /* Emit its type. */
26092 gen_type_die (TREE_TYPE (decl), context_die);
26094 /* And its containing namespace. */
26095 context_die = declare_in_namespace (decl, context_die);
26097 gen_const_die (decl, context_die);
26098 break;
26100 case FUNCTION_DECL:
26101 #if 0
26102 /* FIXME */
26103 /* This doesn't work because the C frontend sets DECL_ABSTRACT_ORIGIN
26104 on local redeclarations of global functions. That seems broken. */
26105 if (current_function_decl != decl)
26106 /* This is only a declaration. */;
26107 #endif
26109 /* We should have abstract copies already and should not generate
26110 stray type DIEs in late LTO dumping. */
26111 if (! early_dwarf)
26114 /* If we're emitting a clone, emit info for the abstract instance. */
26115 else if (origin || DECL_ORIGIN (decl) != decl)
26116 dwarf2out_abstract_function (origin
26117 ? DECL_ORIGIN (origin)
26118 : DECL_ABSTRACT_ORIGIN (decl));
26120 /* If we're emitting a possibly inlined function emit it as
26121 abstract instance. */
26122 else if (cgraph_function_possibly_inlined_p (decl)
26123 && ! DECL_ABSTRACT_P (decl)
26124 && ! class_or_namespace_scope_p (context_die)
26125 /* dwarf2out_abstract_function won't emit a die if this is just
26126 a declaration. We must avoid setting DECL_ABSTRACT_ORIGIN in
26127 that case, because that works only if we have a die. */
26128 && DECL_INITIAL (decl) != NULL_TREE)
26129 dwarf2out_abstract_function (decl);
26131 /* Otherwise we're emitting the primary DIE for this decl. */
26132 else if (debug_info_level > DINFO_LEVEL_TERSE)
26134 /* Before we describe the FUNCTION_DECL itself, make sure that we
26135 have its containing type. */
26136 if (!origin)
26137 origin = decl_class_context (decl);
26138 if (origin != NULL_TREE)
26139 gen_type_die (origin, context_die);
26141 /* And its return type. */
26142 gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
26144 /* And its virtual context. */
26145 if (DECL_VINDEX (decl) != NULL_TREE)
26146 gen_type_die (DECL_CONTEXT (decl), context_die);
26148 /* Make sure we have a member DIE for decl. */
26149 if (origin != NULL_TREE)
26150 gen_type_die_for_member (origin, decl, context_die);
26152 /* And its containing namespace. */
26153 context_die = declare_in_namespace (decl, context_die);
26156 /* Now output a DIE to represent the function itself. */
26157 if (decl)
26158 gen_subprogram_die (decl, context_die);
26159 break;
26161 case TYPE_DECL:
26162 /* If we are in terse mode, don't generate any DIEs to represent any
26163 actual typedefs. */
26164 if (debug_info_level <= DINFO_LEVEL_TERSE)
26165 break;
26167 /* In the special case of a TYPE_DECL node representing the declaration
26168 of some type tag, if the given TYPE_DECL is marked as having been
26169 instantiated from some other (original) TYPE_DECL node (e.g. one which
26170 was generated within the original definition of an inline function) we
26171 used to generate a special (abbreviated) DW_TAG_structure_type,
26172 DW_TAG_union_type, or DW_TAG_enumeration_type DIE here. But nothing
26173 should be actually referencing those DIEs, as variable DIEs with that
26174 type would be emitted already in the abstract origin, so it was always
26175 removed during unused type prunning. Don't add anything in this
26176 case. */
26177 if (TYPE_DECL_IS_STUB (decl) && decl_ultimate_origin (decl) != NULL_TREE)
26178 break;
26180 if (is_redundant_typedef (decl))
26181 gen_type_die (TREE_TYPE (decl), context_die);
26182 else
26183 /* Output a DIE to represent the typedef itself. */
26184 gen_typedef_die (decl, context_die);
26185 break;
26187 case LABEL_DECL:
26188 if (debug_info_level >= DINFO_LEVEL_NORMAL)
26189 gen_label_die (decl, context_die);
26190 break;
26192 case VAR_DECL:
26193 case RESULT_DECL:
26194 /* If we are in terse mode, don't generate any DIEs to represent any
26195 variable declarations or definitions. */
26196 if (debug_info_level <= DINFO_LEVEL_TERSE)
26197 break;
26199 /* Avoid generating stray type DIEs during late dwarf dumping.
26200 All types have been dumped early. */
26201 if (early_dwarf
26202 /* ??? But in LTRANS we cannot annotate early created variably
26203 modified type DIEs without copying them and adjusting all
26204 references to them. Dump them again as happens for inlining
26205 which copies both the decl and the types. */
26206 /* ??? And even non-LTO needs to re-visit type DIEs to fill
26207 in VLA bound information for example. */
26208 || (decl && variably_modified_type_p (TREE_TYPE (decl),
26209 current_function_decl)))
26211 /* Output any DIEs that are needed to specify the type of this data
26212 object. */
26213 if (decl_by_reference_p (decl_or_origin))
26214 gen_type_die (TREE_TYPE (TREE_TYPE (decl_or_origin)), context_die);
26215 else
26216 gen_type_die (TREE_TYPE (decl_or_origin), context_die);
26219 if (early_dwarf)
26221 /* And its containing type. */
26222 class_origin = decl_class_context (decl_or_origin);
26223 if (class_origin != NULL_TREE)
26224 gen_type_die_for_member (class_origin, decl_or_origin, context_die);
26226 /* And its containing namespace. */
26227 context_die = declare_in_namespace (decl_or_origin, context_die);
26230 /* Now output the DIE to represent the data object itself. This gets
26231 complicated because of the possibility that the VAR_DECL really
26232 represents an inlined instance of a formal parameter for an inline
26233 function. */
26234 ultimate_origin = decl_ultimate_origin (decl_or_origin);
26235 if (ultimate_origin != NULL_TREE
26236 && TREE_CODE (ultimate_origin) == PARM_DECL)
26237 gen_formal_parameter_die (decl, origin,
26238 true /* Emit name attribute. */,
26239 context_die);
26240 else
26241 gen_variable_die (decl, origin, context_die);
26242 break;
26244 case FIELD_DECL:
26245 gcc_assert (ctx != NULL && ctx->struct_type != NULL);
26246 /* Ignore the nameless fields that are used to skip bits but handle C++
26247 anonymous unions and structs. */
26248 if (DECL_NAME (decl) != NULL_TREE
26249 || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
26250 || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
26252 gen_type_die (member_declared_type (decl), context_die);
26253 gen_field_die (decl, ctx, context_die);
26255 break;
26257 case PARM_DECL:
26258 /* Avoid generating stray type DIEs during late dwarf dumping.
26259 All types have been dumped early. */
26260 if (early_dwarf
26261 /* ??? But in LTRANS we cannot annotate early created variably
26262 modified type DIEs without copying them and adjusting all
26263 references to them. Dump them again as happens for inlining
26264 which copies both the decl and the types. */
26265 /* ??? And even non-LTO needs to re-visit type DIEs to fill
26266 in VLA bound information for example. */
26267 || (decl && variably_modified_type_p (TREE_TYPE (decl),
26268 current_function_decl)))
26270 if (DECL_BY_REFERENCE (decl_or_origin))
26271 gen_type_die (TREE_TYPE (TREE_TYPE (decl_or_origin)), context_die);
26272 else
26273 gen_type_die (TREE_TYPE (decl_or_origin), context_die);
26275 return gen_formal_parameter_die (decl, origin,
26276 true /* Emit name attribute. */,
26277 context_die);
26279 case NAMESPACE_DECL:
26280 if (dwarf_version >= 3 || !dwarf_strict)
26281 gen_namespace_die (decl, context_die);
26282 break;
26284 case IMPORTED_DECL:
26285 dwarf2out_imported_module_or_decl_1 (decl, DECL_NAME (decl),
26286 DECL_CONTEXT (decl), context_die);
26287 break;
26289 case NAMELIST_DECL:
26290 gen_namelist_decl (DECL_NAME (decl), context_die,
26291 NAMELIST_DECL_ASSOCIATED_DECL (decl));
26292 break;
26294 default:
26295 /* Probably some frontend-internal decl. Assume we don't care. */
26296 gcc_assert ((int)TREE_CODE (decl) > NUM_TREE_CODES);
26297 break;
26300 return NULL;
26303 /* Output initial debug information for global DECL. Called at the
26304 end of the parsing process.
26306 This is the initial debug generation process. As such, the DIEs
26307 generated may be incomplete. A later debug generation pass
26308 (dwarf2out_late_global_decl) will augment the information generated
26309 in this pass (e.g., with complete location info). */
26311 static void
26312 dwarf2out_early_global_decl (tree decl)
26314 set_early_dwarf s;
26316 /* gen_decl_die() will set DECL_ABSTRACT because
26317 cgraph_function_possibly_inlined_p() returns true. This is in
26318 turn will cause DW_AT_inline attributes to be set.
26320 This happens because at early dwarf generation, there is no
26321 cgraph information, causing cgraph_function_possibly_inlined_p()
26322 to return true. Trick cgraph_function_possibly_inlined_p()
26323 while we generate dwarf early. */
26324 bool save = symtab->global_info_ready;
26325 symtab->global_info_ready = true;
26327 /* We don't handle TYPE_DECLs. If required, they'll be reached via
26328 other DECLs and they can point to template types or other things
26329 that dwarf2out can't handle when done via dwarf2out_decl. */
26330 if (TREE_CODE (decl) != TYPE_DECL
26331 && TREE_CODE (decl) != PARM_DECL)
26333 if (TREE_CODE (decl) == FUNCTION_DECL)
26335 tree save_fndecl = current_function_decl;
26337 /* For nested functions, make sure we have DIEs for the parents first
26338 so that all nested DIEs are generated at the proper scope in the
26339 first shot. */
26340 tree context = decl_function_context (decl);
26341 if (context != NULL)
26343 dw_die_ref context_die = lookup_decl_die (context);
26344 current_function_decl = context;
26346 /* Avoid emitting DIEs multiple times, but still process CONTEXT
26347 enough so that it lands in its own context. This avoids type
26348 pruning issues later on. */
26349 if (context_die == NULL || is_declaration_die (context_die))
26350 dwarf2out_decl (context);
26353 /* Emit an abstract origin of a function first. This happens
26354 with C++ constructor clones for example and makes
26355 dwarf2out_abstract_function happy which requires the early
26356 DIE of the abstract instance to be present. */
26357 tree origin = DECL_ABSTRACT_ORIGIN (decl);
26358 dw_die_ref origin_die;
26359 if (origin != NULL
26360 /* Do not emit the DIE multiple times but make sure to
26361 process it fully here in case we just saw a declaration. */
26362 && ((origin_die = lookup_decl_die (origin)) == NULL
26363 || is_declaration_die (origin_die)))
26365 current_function_decl = origin;
26366 dwarf2out_decl (origin);
26369 /* Emit the DIE for decl but avoid doing that multiple times. */
26370 dw_die_ref old_die;
26371 if ((old_die = lookup_decl_die (decl)) == NULL
26372 || is_declaration_die (old_die))
26374 current_function_decl = decl;
26375 dwarf2out_decl (decl);
26378 current_function_decl = save_fndecl;
26380 else
26381 dwarf2out_decl (decl);
26383 symtab->global_info_ready = save;
26386 /* Return whether EXPR is an expression with the following pattern:
26387 INDIRECT_REF (NOP_EXPR (INTEGER_CST)). */
26389 static bool
26390 is_trivial_indirect_ref (tree expr)
26392 if (expr == NULL_TREE || TREE_CODE (expr) != INDIRECT_REF)
26393 return false;
26395 tree nop = TREE_OPERAND (expr, 0);
26396 if (nop == NULL_TREE || TREE_CODE (nop) != NOP_EXPR)
26397 return false;
26399 tree int_cst = TREE_OPERAND (nop, 0);
26400 return int_cst != NULL_TREE && TREE_CODE (int_cst) == INTEGER_CST;
26403 /* Output debug information for global decl DECL. Called from
26404 toplev.c after compilation proper has finished. */
26406 static void
26407 dwarf2out_late_global_decl (tree decl)
26409 /* Fill-in any location information we were unable to determine
26410 on the first pass. */
26411 if (VAR_P (decl) && !POINTER_BOUNDS_P (decl))
26413 dw_die_ref die = lookup_decl_die (decl);
26415 /* We may have to generate early debug late for LTO in case debug
26416 was not enabled at compile-time or the target doesn't support
26417 the LTO early debug scheme. */
26418 if (! die && in_lto_p)
26420 dwarf2out_decl (decl);
26421 die = lookup_decl_die (decl);
26424 if (die)
26426 /* We get called via the symtab code invoking late_global_decl
26427 for symbols that are optimized out.
26429 Do not add locations for those, except if they have a
26430 DECL_VALUE_EXPR, in which case they are relevant for debuggers.
26431 Still don't add a location if the DECL_VALUE_EXPR is not a trivial
26432 INDIRECT_REF expression, as this could generate relocations to
26433 text symbols in LTO object files, which is invalid. */
26434 varpool_node *node = varpool_node::get (decl);
26435 if ((! node || ! node->definition)
26436 && ! (DECL_HAS_VALUE_EXPR_P (decl)
26437 && is_trivial_indirect_ref (DECL_VALUE_EXPR (decl))))
26438 tree_add_const_value_attribute_for_decl (die, decl);
26439 else
26440 add_location_or_const_value_attribute (die, decl, false);
26445 /* Output debug information for type decl DECL. Called from toplev.c
26446 and from language front ends (to record built-in types). */
26447 static void
26448 dwarf2out_type_decl (tree decl, int local)
26450 if (!local)
26452 set_early_dwarf s;
26453 dwarf2out_decl (decl);
26457 /* Output debug information for imported module or decl DECL.
26458 NAME is non-NULL name in the lexical block if the decl has been renamed.
26459 LEXICAL_BLOCK is the lexical block (which TREE_CODE is a BLOCK)
26460 that DECL belongs to.
26461 LEXICAL_BLOCK_DIE is the DIE of LEXICAL_BLOCK. */
26462 static void
26463 dwarf2out_imported_module_or_decl_1 (tree decl,
26464 tree name,
26465 tree lexical_block,
26466 dw_die_ref lexical_block_die)
26468 expanded_location xloc;
26469 dw_die_ref imported_die = NULL;
26470 dw_die_ref at_import_die;
26472 if (TREE_CODE (decl) == IMPORTED_DECL)
26474 xloc = expand_location (DECL_SOURCE_LOCATION (decl));
26475 decl = IMPORTED_DECL_ASSOCIATED_DECL (decl);
26476 gcc_assert (decl);
26478 else
26479 xloc = expand_location (input_location);
26481 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL)
26483 at_import_die = force_type_die (TREE_TYPE (decl));
26484 /* For namespace N { typedef void T; } using N::T; base_type_die
26485 returns NULL, but DW_TAG_imported_declaration requires
26486 the DW_AT_import tag. Force creation of DW_TAG_typedef. */
26487 if (!at_import_die)
26489 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
26490 gen_typedef_die (decl, get_context_die (DECL_CONTEXT (decl)));
26491 at_import_die = lookup_type_die (TREE_TYPE (decl));
26492 gcc_assert (at_import_die);
26495 else
26497 at_import_die = lookup_decl_die (decl);
26498 if (!at_import_die)
26500 /* If we're trying to avoid duplicate debug info, we may not have
26501 emitted the member decl for this field. Emit it now. */
26502 if (TREE_CODE (decl) == FIELD_DECL)
26504 tree type = DECL_CONTEXT (decl);
26506 if (TYPE_CONTEXT (type)
26507 && TYPE_P (TYPE_CONTEXT (type))
26508 && !should_emit_struct_debug (TYPE_CONTEXT (type),
26509 DINFO_USAGE_DIR_USE))
26510 return;
26511 gen_type_die_for_member (type, decl,
26512 get_context_die (TYPE_CONTEXT (type)));
26514 if (TREE_CODE (decl) == NAMELIST_DECL)
26515 at_import_die = gen_namelist_decl (DECL_NAME (decl),
26516 get_context_die (DECL_CONTEXT (decl)),
26517 NULL_TREE);
26518 else
26519 at_import_die = force_decl_die (decl);
26523 if (TREE_CODE (decl) == NAMESPACE_DECL)
26525 if (dwarf_version >= 3 || !dwarf_strict)
26526 imported_die = new_die (DW_TAG_imported_module,
26527 lexical_block_die,
26528 lexical_block);
26529 else
26530 return;
26532 else
26533 imported_die = new_die (DW_TAG_imported_declaration,
26534 lexical_block_die,
26535 lexical_block);
26537 add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file));
26538 add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line);
26539 if (debug_column_info && xloc.column)
26540 add_AT_unsigned (imported_die, DW_AT_decl_column, xloc.column);
26541 if (name)
26542 add_AT_string (imported_die, DW_AT_name,
26543 IDENTIFIER_POINTER (name));
26544 add_AT_die_ref (imported_die, DW_AT_import, at_import_die);
26547 /* Output debug information for imported module or decl DECL.
26548 NAME is non-NULL name in context if the decl has been renamed.
26549 CHILD is true if decl is one of the renamed decls as part of
26550 importing whole module.
26551 IMPLICIT is set if this hook is called for an implicit import
26552 such as inline namespace. */
26554 static void
26555 dwarf2out_imported_module_or_decl (tree decl, tree name, tree context,
26556 bool child, bool implicit)
26558 /* dw_die_ref at_import_die; */
26559 dw_die_ref scope_die;
26561 if (debug_info_level <= DINFO_LEVEL_TERSE)
26562 return;
26564 gcc_assert (decl);
26566 /* For DWARF5, just DW_AT_export_symbols on the DW_TAG_namespace
26567 should be enough, for DWARF4 and older even if we emit as extension
26568 DW_AT_export_symbols add the implicit DW_TAG_imported_module anyway
26569 for the benefit of consumers unaware of DW_AT_export_symbols. */
26570 if (implicit
26571 && dwarf_version >= 5
26572 && lang_hooks.decls.decl_dwarf_attribute (decl,
26573 DW_AT_export_symbols) == 1)
26574 return;
26576 set_early_dwarf s;
26578 /* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
26579 We need decl DIE for reference and scope die. First, get DIE for the decl
26580 itself. */
26582 /* Get the scope die for decl context. Use comp_unit_die for global module
26583 or decl. If die is not found for non globals, force new die. */
26584 if (context
26585 && TYPE_P (context)
26586 && !should_emit_struct_debug (context, DINFO_USAGE_DIR_USE))
26587 return;
26589 scope_die = get_context_die (context);
26591 if (child)
26593 /* DW_TAG_imported_module was introduced in the DWARFv3 specification, so
26594 there is nothing we can do, here. */
26595 if (dwarf_version < 3 && dwarf_strict)
26596 return;
26598 gcc_assert (scope_die->die_child);
26599 gcc_assert (scope_die->die_child->die_tag == DW_TAG_imported_module);
26600 gcc_assert (TREE_CODE (decl) != NAMESPACE_DECL);
26601 scope_die = scope_die->die_child;
26604 /* OK, now we have DIEs for decl as well as scope. Emit imported die. */
26605 dwarf2out_imported_module_or_decl_1 (decl, name, context, scope_die);
26608 /* Output debug information for namelists. */
26610 static dw_die_ref
26611 gen_namelist_decl (tree name, dw_die_ref scope_die, tree item_decls)
26613 dw_die_ref nml_die, nml_item_die, nml_item_ref_die;
26614 tree value;
26615 unsigned i;
26617 if (debug_info_level <= DINFO_LEVEL_TERSE)
26618 return NULL;
26620 gcc_assert (scope_die != NULL);
26621 nml_die = new_die (DW_TAG_namelist, scope_die, NULL);
26622 add_AT_string (nml_die, DW_AT_name, IDENTIFIER_POINTER (name));
26624 /* If there are no item_decls, we have a nondefining namelist, e.g.
26625 with USE association; hence, set DW_AT_declaration. */
26626 if (item_decls == NULL_TREE)
26628 add_AT_flag (nml_die, DW_AT_declaration, 1);
26629 return nml_die;
26632 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (item_decls), i, value)
26634 nml_item_ref_die = lookup_decl_die (value);
26635 if (!nml_item_ref_die)
26636 nml_item_ref_die = force_decl_die (value);
26638 nml_item_die = new_die (DW_TAG_namelist_item, nml_die, NULL);
26639 add_AT_die_ref (nml_item_die, DW_AT_namelist_items, nml_item_ref_die);
26641 return nml_die;
26645 /* Write the debugging output for DECL and return the DIE. */
26647 static void
26648 dwarf2out_decl (tree decl)
26650 dw_die_ref context_die = comp_unit_die ();
26652 switch (TREE_CODE (decl))
26654 case ERROR_MARK:
26655 return;
26657 case FUNCTION_DECL:
26658 /* If we're a nested function, initially use a parent of NULL; if we're
26659 a plain function, this will be fixed up in decls_for_scope. If
26660 we're a method, it will be ignored, since we already have a DIE. */
26661 if (decl_function_context (decl)
26662 /* But if we're in terse mode, we don't care about scope. */
26663 && debug_info_level > DINFO_LEVEL_TERSE)
26664 context_die = NULL;
26665 break;
26667 case VAR_DECL:
26668 /* For local statics lookup proper context die. */
26669 if (local_function_static (decl))
26670 context_die = lookup_decl_die (DECL_CONTEXT (decl));
26672 /* If we are in terse mode, don't generate any DIEs to represent any
26673 variable declarations or definitions. */
26674 if (debug_info_level <= DINFO_LEVEL_TERSE)
26675 return;
26676 break;
26678 case CONST_DECL:
26679 if (debug_info_level <= DINFO_LEVEL_TERSE)
26680 return;
26681 if (!is_fortran () && !is_ada ())
26682 return;
26683 if (TREE_STATIC (decl) && decl_function_context (decl))
26684 context_die = lookup_decl_die (DECL_CONTEXT (decl));
26685 break;
26687 case NAMESPACE_DECL:
26688 case IMPORTED_DECL:
26689 if (debug_info_level <= DINFO_LEVEL_TERSE)
26690 return;
26691 if (lookup_decl_die (decl) != NULL)
26692 return;
26693 break;
26695 case TYPE_DECL:
26696 /* Don't emit stubs for types unless they are needed by other DIEs. */
26697 if (TYPE_DECL_SUPPRESS_DEBUG (decl))
26698 return;
26700 /* Don't bother trying to generate any DIEs to represent any of the
26701 normal built-in types for the language we are compiling. */
26702 if (DECL_IS_BUILTIN (decl))
26703 return;
26705 /* If we are in terse mode, don't generate any DIEs for types. */
26706 if (debug_info_level <= DINFO_LEVEL_TERSE)
26707 return;
26709 /* If we're a function-scope tag, initially use a parent of NULL;
26710 this will be fixed up in decls_for_scope. */
26711 if (decl_function_context (decl))
26712 context_die = NULL;
26714 break;
26716 case NAMELIST_DECL:
26717 break;
26719 default:
26720 return;
26723 gen_decl_die (decl, NULL, NULL, context_die);
26725 if (flag_checking)
26727 dw_die_ref die = lookup_decl_die (decl);
26728 if (die)
26729 check_die (die);
26733 /* Write the debugging output for DECL. */
26735 static void
26736 dwarf2out_function_decl (tree decl)
26738 dwarf2out_decl (decl);
26739 call_arg_locations = NULL;
26740 call_arg_loc_last = NULL;
26741 call_site_count = -1;
26742 tail_call_site_count = -1;
26743 decl_loc_table->empty ();
26744 cached_dw_loc_list_table->empty ();
26747 /* Output a marker (i.e. a label) for the beginning of the generated code for
26748 a lexical block. */
26750 static void
26751 dwarf2out_begin_block (unsigned int line ATTRIBUTE_UNUSED,
26752 unsigned int blocknum)
26754 switch_to_section (current_function_section ());
26755 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
26758 /* Output a marker (i.e. a label) for the end of the generated code for a
26759 lexical block. */
26761 static void
26762 dwarf2out_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int blocknum)
26764 switch_to_section (current_function_section ());
26765 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
26768 /* Returns nonzero if it is appropriate not to emit any debugging
26769 information for BLOCK, because it doesn't contain any instructions.
26771 Don't allow this for blocks with nested functions or local classes
26772 as we would end up with orphans, and in the presence of scheduling
26773 we may end up calling them anyway. */
26775 static bool
26776 dwarf2out_ignore_block (const_tree block)
26778 tree decl;
26779 unsigned int i;
26781 for (decl = BLOCK_VARS (block); decl; decl = DECL_CHAIN (decl))
26782 if (TREE_CODE (decl) == FUNCTION_DECL
26783 || (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)))
26784 return 0;
26785 for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (block); i++)
26787 decl = BLOCK_NONLOCALIZED_VAR (block, i);
26788 if (TREE_CODE (decl) == FUNCTION_DECL
26789 || (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)))
26790 return 0;
26793 return 1;
26796 /* Hash table routines for file_hash. */
26798 bool
26799 dwarf_file_hasher::equal (dwarf_file_data *p1, const char *p2)
26801 return filename_cmp (p1->filename, p2) == 0;
26804 hashval_t
26805 dwarf_file_hasher::hash (dwarf_file_data *p)
26807 return htab_hash_string (p->filename);
26810 /* Lookup FILE_NAME (in the list of filenames that we know about here in
26811 dwarf2out.c) and return its "index". The index of each (known) filename is
26812 just a unique number which is associated with only that one filename. We
26813 need such numbers for the sake of generating labels (in the .debug_sfnames
26814 section) and references to those files numbers (in the .debug_srcinfo
26815 and .debug_macinfo sections). If the filename given as an argument is not
26816 found in our current list, add it to the list and assign it the next
26817 available unique index number. */
26819 static struct dwarf_file_data *
26820 lookup_filename (const char *file_name)
26822 struct dwarf_file_data * created;
26824 if (!file_name)
26825 return NULL;
26827 dwarf_file_data **slot
26828 = file_table->find_slot_with_hash (file_name, htab_hash_string (file_name),
26829 INSERT);
26830 if (*slot)
26831 return *slot;
26833 created = ggc_alloc<dwarf_file_data> ();
26834 created->filename = file_name;
26835 created->emitted_number = 0;
26836 *slot = created;
26837 return created;
26840 /* If the assembler will construct the file table, then translate the compiler
26841 internal file table number into the assembler file table number, and emit
26842 a .file directive if we haven't already emitted one yet. The file table
26843 numbers are different because we prune debug info for unused variables and
26844 types, which may include filenames. */
26846 static int
26847 maybe_emit_file (struct dwarf_file_data * fd)
26849 if (! fd->emitted_number)
26851 if (last_emitted_file)
26852 fd->emitted_number = last_emitted_file->emitted_number + 1;
26853 else
26854 fd->emitted_number = 1;
26855 last_emitted_file = fd;
26857 if (output_asm_line_debug_info ())
26859 fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
26860 output_quoted_string (asm_out_file,
26861 remap_debug_filename (fd->filename));
26862 fputc ('\n', asm_out_file);
26866 return fd->emitted_number;
26869 /* Schedule generation of a DW_AT_const_value attribute to DIE.
26870 That generation should happen after function debug info has been
26871 generated. The value of the attribute is the constant value of ARG. */
26873 static void
26874 append_entry_to_tmpl_value_parm_die_table (dw_die_ref die, tree arg)
26876 die_arg_entry entry;
26878 if (!die || !arg)
26879 return;
26881 gcc_assert (early_dwarf);
26883 if (!tmpl_value_parm_die_table)
26884 vec_alloc (tmpl_value_parm_die_table, 32);
26886 entry.die = die;
26887 entry.arg = arg;
26888 vec_safe_push (tmpl_value_parm_die_table, entry);
26891 /* Return TRUE if T is an instance of generic type, FALSE
26892 otherwise. */
26894 static bool
26895 generic_type_p (tree t)
26897 if (t == NULL_TREE || !TYPE_P (t))
26898 return false;
26899 return lang_hooks.get_innermost_generic_parms (t) != NULL_TREE;
26902 /* Schedule the generation of the generic parameter dies for the
26903 instance of generic type T. The proper generation itself is later
26904 done by gen_scheduled_generic_parms_dies. */
26906 static void
26907 schedule_generic_params_dies_gen (tree t)
26909 if (!generic_type_p (t))
26910 return;
26912 gcc_assert (early_dwarf);
26914 if (!generic_type_instances)
26915 vec_alloc (generic_type_instances, 256);
26917 vec_safe_push (generic_type_instances, t);
26920 /* Add a DW_AT_const_value attribute to DIEs that were scheduled
26921 by append_entry_to_tmpl_value_parm_die_table. This function must
26922 be called after function DIEs have been generated. */
26924 static void
26925 gen_remaining_tmpl_value_param_die_attribute (void)
26927 if (tmpl_value_parm_die_table)
26929 unsigned i, j;
26930 die_arg_entry *e;
26932 /* We do this in two phases - first get the cases we can
26933 handle during early-finish, preserving those we cannot
26934 (containing symbolic constants where we don't yet know
26935 whether we are going to output the referenced symbols).
26936 For those we try again at late-finish. */
26937 j = 0;
26938 FOR_EACH_VEC_ELT (*tmpl_value_parm_die_table, i, e)
26940 if (!e->die->removed
26941 && !tree_add_const_value_attribute (e->die, e->arg))
26943 dw_loc_descr_ref loc = NULL;
26944 if (! early_dwarf
26945 && (dwarf_version >= 5 || !dwarf_strict))
26946 loc = loc_descriptor_from_tree (e->arg, 2, NULL);
26947 if (loc)
26948 add_AT_loc (e->die, DW_AT_location, loc);
26949 else
26950 (*tmpl_value_parm_die_table)[j++] = *e;
26953 tmpl_value_parm_die_table->truncate (j);
26957 /* Generate generic parameters DIEs for instances of generic types
26958 that have been previously scheduled by
26959 schedule_generic_params_dies_gen. This function must be called
26960 after all the types of the CU have been laid out. */
26962 static void
26963 gen_scheduled_generic_parms_dies (void)
26965 unsigned i;
26966 tree t;
26968 if (!generic_type_instances)
26969 return;
26971 FOR_EACH_VEC_ELT (*generic_type_instances, i, t)
26972 if (COMPLETE_TYPE_P (t))
26973 gen_generic_params_dies (t);
26975 generic_type_instances = NULL;
26979 /* Replace DW_AT_name for the decl with name. */
26981 static void
26982 dwarf2out_set_name (tree decl, tree name)
26984 dw_die_ref die;
26985 dw_attr_node *attr;
26986 const char *dname;
26988 die = TYPE_SYMTAB_DIE (decl);
26989 if (!die)
26990 return;
26992 dname = dwarf2_name (name, 0);
26993 if (!dname)
26994 return;
26996 attr = get_AT (die, DW_AT_name);
26997 if (attr)
26999 struct indirect_string_node *node;
27001 node = find_AT_string (dname);
27002 /* replace the string. */
27003 attr->dw_attr_val.v.val_str = node;
27006 else
27007 add_name_attribute (die, dname);
27010 /* True if before or during processing of the first function being emitted. */
27011 static bool in_first_function_p = true;
27012 /* True if loc_note during dwarf2out_var_location call might still be
27013 before first real instruction at address equal to .Ltext0. */
27014 static bool maybe_at_text_label_p = true;
27015 /* One above highest N where .LVLN label might be equal to .Ltext0 label. */
27016 static unsigned int first_loclabel_num_not_at_text_label;
27018 /* Look ahead for a real insn, or for a begin stmt marker. */
27020 static rtx_insn *
27021 dwarf2out_next_real_insn (rtx_insn *loc_note)
27023 rtx_insn *next_real = NEXT_INSN (loc_note);
27025 while (next_real)
27026 if (INSN_P (next_real))
27027 break;
27028 else
27029 next_real = NEXT_INSN (next_real);
27031 return next_real;
27034 /* Called by the final INSN scan whenever we see a var location. We
27035 use it to drop labels in the right places, and throw the location in
27036 our lookup table. */
27038 static void
27039 dwarf2out_var_location (rtx_insn *loc_note)
27041 char loclabel[MAX_ARTIFICIAL_LABEL_BYTES + 2];
27042 struct var_loc_node *newloc;
27043 rtx_insn *next_real, *next_note;
27044 rtx_insn *call_insn = NULL;
27045 static const char *last_label;
27046 static const char *last_postcall_label;
27047 static bool last_in_cold_section_p;
27048 static rtx_insn *expected_next_loc_note;
27049 tree decl;
27050 bool var_loc_p;
27051 var_loc_view view = 0;
27053 if (!NOTE_P (loc_note))
27055 if (CALL_P (loc_note))
27057 maybe_reset_location_view (loc_note, cur_line_info_table);
27058 call_site_count++;
27059 if (SIBLING_CALL_P (loc_note))
27060 tail_call_site_count++;
27061 if (find_reg_note (loc_note, REG_CALL_ARG_LOCATION, NULL_RTX))
27063 call_insn = loc_note;
27064 loc_note = NULL;
27065 var_loc_p = false;
27067 next_real = dwarf2out_next_real_insn (call_insn);
27068 next_note = NULL;
27069 cached_next_real_insn = NULL;
27070 goto create_label;
27072 if (optimize == 0 && !flag_var_tracking)
27074 /* When the var-tracking pass is not running, there is no note
27075 for indirect calls whose target is compile-time known. In this
27076 case, process such calls specifically so that we generate call
27077 sites for them anyway. */
27078 rtx x = PATTERN (loc_note);
27079 if (GET_CODE (x) == PARALLEL)
27080 x = XVECEXP (x, 0, 0);
27081 if (GET_CODE (x) == SET)
27082 x = SET_SRC (x);
27083 if (GET_CODE (x) == CALL)
27084 x = XEXP (x, 0);
27085 if (!MEM_P (x)
27086 || GET_CODE (XEXP (x, 0)) != SYMBOL_REF
27087 || !SYMBOL_REF_DECL (XEXP (x, 0))
27088 || (TREE_CODE (SYMBOL_REF_DECL (XEXP (x, 0)))
27089 != FUNCTION_DECL))
27091 call_insn = loc_note;
27092 loc_note = NULL;
27093 var_loc_p = false;
27095 next_real = dwarf2out_next_real_insn (call_insn);
27096 next_note = NULL;
27097 cached_next_real_insn = NULL;
27098 goto create_label;
27102 else if (!debug_variable_location_views)
27103 gcc_unreachable ();
27104 else
27105 maybe_reset_location_view (loc_note, cur_line_info_table);
27107 return;
27110 var_loc_p = NOTE_KIND (loc_note) == NOTE_INSN_VAR_LOCATION;
27111 if (var_loc_p && !DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
27112 return;
27114 /* Optimize processing a large consecutive sequence of location
27115 notes so we don't spend too much time in next_real_insn. If the
27116 next insn is another location note, remember the next_real_insn
27117 calculation for next time. */
27118 next_real = cached_next_real_insn;
27119 if (next_real)
27121 if (expected_next_loc_note != loc_note)
27122 next_real = NULL;
27125 next_note = NEXT_INSN (loc_note);
27126 if (! next_note
27127 || next_note->deleted ()
27128 || ! NOTE_P (next_note)
27129 || (NOTE_KIND (next_note) != NOTE_INSN_VAR_LOCATION
27130 && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT
27131 && NOTE_KIND (next_note) != NOTE_INSN_INLINE_ENTRY))
27132 next_note = NULL;
27134 if (! next_real)
27135 next_real = dwarf2out_next_real_insn (loc_note);
27137 if (next_note)
27139 expected_next_loc_note = next_note;
27140 cached_next_real_insn = next_real;
27142 else
27143 cached_next_real_insn = NULL;
27145 /* If there are no instructions which would be affected by this note,
27146 don't do anything. */
27147 if (var_loc_p
27148 && next_real == NULL_RTX
27149 && !NOTE_DURING_CALL_P (loc_note))
27150 return;
27152 create_label:
27154 if (next_real == NULL_RTX)
27155 next_real = get_last_insn ();
27157 /* If there were any real insns between note we processed last time
27158 and this note (or if it is the first note), clear
27159 last_{,postcall_}label so that they are not reused this time. */
27160 if (last_var_location_insn == NULL_RTX
27161 || last_var_location_insn != next_real
27162 || last_in_cold_section_p != in_cold_section_p)
27164 last_label = NULL;
27165 last_postcall_label = NULL;
27168 if (var_loc_p)
27170 const char *label
27171 = NOTE_DURING_CALL_P (loc_note) ? last_postcall_label : last_label;
27172 view = cur_line_info_table->view;
27173 decl = NOTE_VAR_LOCATION_DECL (loc_note);
27174 newloc = add_var_loc_to_decl (decl, loc_note, label, view);
27175 if (newloc == NULL)
27176 return;
27178 else
27180 decl = NULL_TREE;
27181 newloc = NULL;
27184 /* If there were no real insns between note we processed last time
27185 and this note, use the label we emitted last time. Otherwise
27186 create a new label and emit it. */
27187 if (last_label == NULL)
27189 ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", loclabel_num);
27190 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LVL", loclabel_num);
27191 loclabel_num++;
27192 last_label = ggc_strdup (loclabel);
27193 /* See if loclabel might be equal to .Ltext0. If yes,
27194 bump first_loclabel_num_not_at_text_label. */
27195 if (!have_multiple_function_sections
27196 && in_first_function_p
27197 && maybe_at_text_label_p)
27199 static rtx_insn *last_start;
27200 rtx_insn *insn;
27201 for (insn = loc_note; insn; insn = previous_insn (insn))
27202 if (insn == last_start)
27203 break;
27204 else if (!NONDEBUG_INSN_P (insn))
27205 continue;
27206 else
27208 rtx body = PATTERN (insn);
27209 if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
27210 continue;
27211 /* Inline asm could occupy zero bytes. */
27212 else if (GET_CODE (body) == ASM_INPUT
27213 || asm_noperands (body) >= 0)
27214 continue;
27215 #ifdef HAVE_ATTR_length /* ??? We don't include insn-attr.h. */
27216 else if (HAVE_ATTR_length && get_attr_min_length (insn) == 0)
27217 continue;
27218 #endif
27219 else
27221 /* Assume insn has non-zero length. */
27222 maybe_at_text_label_p = false;
27223 break;
27226 if (maybe_at_text_label_p)
27228 last_start = loc_note;
27229 first_loclabel_num_not_at_text_label = loclabel_num;
27234 gcc_assert ((loc_note == NULL_RTX && call_insn != NULL_RTX)
27235 || (loc_note != NULL_RTX && call_insn == NULL_RTX));
27237 if (!var_loc_p)
27239 struct call_arg_loc_node *ca_loc
27240 = ggc_cleared_alloc<call_arg_loc_node> ();
27241 rtx_insn *prev = call_insn;
27243 ca_loc->call_arg_loc_note
27244 = find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX);
27245 ca_loc->next = NULL;
27246 ca_loc->label = last_label;
27247 gcc_assert (prev
27248 && (CALL_P (prev)
27249 || (NONJUMP_INSN_P (prev)
27250 && GET_CODE (PATTERN (prev)) == SEQUENCE
27251 && CALL_P (XVECEXP (PATTERN (prev), 0, 0)))));
27252 if (!CALL_P (prev))
27253 prev = as_a <rtx_sequence *> (PATTERN (prev))->insn (0);
27254 ca_loc->tail_call_p = SIBLING_CALL_P (prev);
27256 /* Look for a SYMBOL_REF in the "prev" instruction. */
27257 rtx x = get_call_rtx_from (PATTERN (prev));
27258 if (x)
27260 /* Try to get the call symbol, if any. */
27261 if (MEM_P (XEXP (x, 0)))
27262 x = XEXP (x, 0);
27263 /* First, look for a memory access to a symbol_ref. */
27264 if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
27265 && SYMBOL_REF_DECL (XEXP (x, 0))
27266 && TREE_CODE (SYMBOL_REF_DECL (XEXP (x, 0))) == FUNCTION_DECL)
27267 ca_loc->symbol_ref = XEXP (x, 0);
27268 /* Otherwise, look at a compile-time known user-level function
27269 declaration. */
27270 else if (MEM_P (x)
27271 && MEM_EXPR (x)
27272 && TREE_CODE (MEM_EXPR (x)) == FUNCTION_DECL)
27273 ca_loc->symbol_ref = XEXP (DECL_RTL (MEM_EXPR (x)), 0);
27276 ca_loc->block = insn_scope (prev);
27277 if (call_arg_locations)
27278 call_arg_loc_last->next = ca_loc;
27279 else
27280 call_arg_locations = ca_loc;
27281 call_arg_loc_last = ca_loc;
27283 else if (loc_note != NULL_RTX && !NOTE_DURING_CALL_P (loc_note))
27285 newloc->label = last_label;
27286 newloc->view = view;
27288 else
27290 if (!last_postcall_label)
27292 sprintf (loclabel, "%s-1", last_label);
27293 last_postcall_label = ggc_strdup (loclabel);
27295 newloc->label = last_postcall_label;
27296 /* ??? This view is at last_label, not last_label-1, but we
27297 could only assume view at last_label-1 is zero if we could
27298 assume calls always have length greater than one. This is
27299 probably true in general, though there might be a rare
27300 exception to this rule, e.g. if a call insn is optimized out
27301 by target magic. Then, even the -1 in the label will be
27302 wrong, which might invalidate the range. Anyway, using view,
27303 though technically possibly incorrect, will work as far as
27304 ranges go: since L-1 is in the middle of the call insn,
27305 (L-1).0 and (L-1).V shouldn't make any difference, and having
27306 the loclist entry refer to the .loc entry might be useful, so
27307 leave it like this. */
27308 newloc->view = view;
27311 if (var_loc_p && flag_debug_asm)
27313 const char *name, *sep, *patstr;
27314 if (decl && DECL_NAME (decl))
27315 name = IDENTIFIER_POINTER (DECL_NAME (decl));
27316 else
27317 name = "";
27318 if (NOTE_VAR_LOCATION_LOC (loc_note))
27320 sep = " => ";
27321 patstr = str_pattern_slim (NOTE_VAR_LOCATION_LOC (loc_note));
27323 else
27325 sep = " ";
27326 patstr = "RESET";
27328 fprintf (asm_out_file, "\t%s DEBUG %s%s%s\n", ASM_COMMENT_START,
27329 name, sep, patstr);
27332 last_var_location_insn = next_real;
27333 last_in_cold_section_p = in_cold_section_p;
27336 /* Check whether BLOCK, a lexical block, is nested within OUTER, or is
27337 OUTER itself. If BOTHWAYS, check not only that BLOCK can reach
27338 OUTER through BLOCK_SUPERCONTEXT links, but also that there is a
27339 path from OUTER to BLOCK through BLOCK_SUBBLOCKs and
27340 BLOCK_FRAGMENT_ORIGIN links. */
27341 static bool
27342 block_within_block_p (tree block, tree outer, bool bothways)
27344 if (block == outer)
27345 return true;
27347 /* Quickly check that OUTER is up BLOCK's supercontext chain. */
27348 for (tree context = BLOCK_SUPERCONTEXT (block);
27349 context != outer;
27350 context = BLOCK_SUPERCONTEXT (context))
27351 if (!context || TREE_CODE (context) != BLOCK)
27352 return false;
27354 if (!bothways)
27355 return true;
27357 /* Now check that each block is actually referenced by its
27358 parent. */
27359 for (tree context = BLOCK_SUPERCONTEXT (block); ;
27360 context = BLOCK_SUPERCONTEXT (context))
27362 if (BLOCK_FRAGMENT_ORIGIN (context))
27364 gcc_assert (!BLOCK_SUBBLOCKS (context));
27365 context = BLOCK_FRAGMENT_ORIGIN (context);
27367 for (tree sub = BLOCK_SUBBLOCKS (context);
27368 sub != block;
27369 sub = BLOCK_CHAIN (sub))
27370 if (!sub)
27371 return false;
27372 if (context == outer)
27373 return true;
27374 else
27375 block = context;
27379 /* Called during final while assembling the marker of the entry point
27380 for an inlined function. */
27382 static void
27383 dwarf2out_inline_entry (tree block)
27385 gcc_assert (debug_inline_points);
27387 /* If we can't represent it, don't bother. */
27388 if (!(dwarf_version >= 3 || !dwarf_strict))
27389 return;
27391 gcc_assert (DECL_P (block_ultimate_origin (block)));
27393 /* Sanity check the block tree. This would catch a case in which
27394 BLOCK got removed from the tree reachable from the outermost
27395 lexical block, but got retained in markers. It would still link
27396 back to its parents, but some ancestor would be missing a link
27397 down the path to the sub BLOCK. If the block got removed, its
27398 BLOCK_NUMBER will not be a usable value. */
27399 if (flag_checking)
27400 gcc_assert (block_within_block_p (block,
27401 DECL_INITIAL (current_function_decl),
27402 true));
27404 gcc_assert (inlined_function_outer_scope_p (block));
27405 gcc_assert (!BLOCK_DIE (block));
27407 if (BLOCK_FRAGMENT_ORIGIN (block))
27408 block = BLOCK_FRAGMENT_ORIGIN (block);
27409 /* Can the entry point ever not be at the beginning of an
27410 unfragmented lexical block? */
27411 else if (!(BLOCK_FRAGMENT_CHAIN (block)
27412 || (cur_line_info_table
27413 && !ZERO_VIEW_P (cur_line_info_table->view))))
27414 return;
27416 if (!inline_entry_data_table)
27417 inline_entry_data_table
27418 = hash_table<inline_entry_data_hasher>::create_ggc (10);
27421 inline_entry_data **iedp
27422 = inline_entry_data_table->find_slot_with_hash (block,
27423 htab_hash_pointer (block),
27424 INSERT);
27425 if (*iedp)
27426 /* ??? Ideally, we'd record all entry points for the same inlined
27427 function (some may have been duplicated by e.g. unrolling), but
27428 we have no way to represent that ATM. */
27429 return;
27431 inline_entry_data *ied = *iedp = ggc_cleared_alloc<inline_entry_data> ();
27432 ied->block = block;
27433 ied->label_pfx = BLOCK_INLINE_ENTRY_LABEL;
27434 ied->label_num = BLOCK_NUMBER (block);
27435 if (cur_line_info_table)
27436 ied->view = cur_line_info_table->view;
27438 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27440 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_INLINE_ENTRY_LABEL,
27441 BLOCK_NUMBER (block));
27442 ASM_OUTPUT_LABEL (asm_out_file, label);
27445 /* Called from finalize_size_functions for size functions so that their body
27446 can be encoded in the debug info to describe the layout of variable-length
27447 structures. */
27449 static void
27450 dwarf2out_size_function (tree decl)
27452 function_to_dwarf_procedure (decl);
27455 /* Note in one location list that text section has changed. */
27458 var_location_switch_text_section_1 (var_loc_list **slot, void *)
27460 var_loc_list *list = *slot;
27461 if (list->first)
27462 list->last_before_switch
27463 = list->last->next ? list->last->next : list->last;
27464 return 1;
27467 /* Note in all location lists that text section has changed. */
27469 static void
27470 var_location_switch_text_section (void)
27472 if (decl_loc_table == NULL)
27473 return;
27475 decl_loc_table->traverse<void *, var_location_switch_text_section_1> (NULL);
27478 /* Create a new line number table. */
27480 static dw_line_info_table *
27481 new_line_info_table (void)
27483 dw_line_info_table *table;
27485 table = ggc_cleared_alloc<dw_line_info_table> ();
27486 table->file_num = 1;
27487 table->line_num = 1;
27488 table->is_stmt = DWARF_LINE_DEFAULT_IS_STMT_START;
27489 FORCE_RESET_NEXT_VIEW (table->view);
27490 table->symviews_since_reset = 0;
27492 return table;
27495 /* Lookup the "current" table into which we emit line info, so
27496 that we don't have to do it for every source line. */
27498 static void
27499 set_cur_line_info_table (section *sec)
27501 dw_line_info_table *table;
27503 if (sec == text_section)
27504 table = text_section_line_info;
27505 else if (sec == cold_text_section)
27507 table = cold_text_section_line_info;
27508 if (!table)
27510 cold_text_section_line_info = table = new_line_info_table ();
27511 table->end_label = cold_end_label;
27514 else
27516 const char *end_label;
27518 if (crtl->has_bb_partition)
27520 if (in_cold_section_p)
27521 end_label = crtl->subsections.cold_section_end_label;
27522 else
27523 end_label = crtl->subsections.hot_section_end_label;
27525 else
27527 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27528 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL,
27529 current_function_funcdef_no);
27530 end_label = ggc_strdup (label);
27533 table = new_line_info_table ();
27534 table->end_label = end_label;
27536 vec_safe_push (separate_line_info, table);
27539 if (output_asm_line_debug_info ())
27540 table->is_stmt = (cur_line_info_table
27541 ? cur_line_info_table->is_stmt
27542 : DWARF_LINE_DEFAULT_IS_STMT_START);
27543 cur_line_info_table = table;
27547 /* We need to reset the locations at the beginning of each
27548 function. We can't do this in the end_function hook, because the
27549 declarations that use the locations won't have been output when
27550 that hook is called. Also compute have_multiple_function_sections here. */
27552 static void
27553 dwarf2out_begin_function (tree fun)
27555 section *sec = function_section (fun);
27557 if (sec != text_section)
27558 have_multiple_function_sections = true;
27560 if (crtl->has_bb_partition && !cold_text_section)
27562 gcc_assert (current_function_decl == fun);
27563 cold_text_section = unlikely_text_section ();
27564 switch_to_section (cold_text_section);
27565 ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
27566 switch_to_section (sec);
27569 dwarf2out_note_section_used ();
27570 call_site_count = 0;
27571 tail_call_site_count = 0;
27573 set_cur_line_info_table (sec);
27574 FORCE_RESET_NEXT_VIEW (cur_line_info_table->view);
27577 /* Helper function of dwarf2out_end_function, called only after emitting
27578 the very first function into assembly. Check if some .debug_loc range
27579 might end with a .LVL* label that could be equal to .Ltext0.
27580 In that case we must force using absolute addresses in .debug_loc ranges,
27581 because this range could be .LVLN-.Ltext0 .. .LVLM-.Ltext0 for
27582 .LVLN == .LVLM == .Ltext0, thus 0 .. 0, which is a .debug_loc
27583 list terminator.
27584 Set have_multiple_function_sections to true in that case and
27585 terminate htab traversal. */
27588 find_empty_loc_ranges_at_text_label (var_loc_list **slot, int)
27590 var_loc_list *entry = *slot;
27591 struct var_loc_node *node;
27593 node = entry->first;
27594 if (node && node->next && node->next->label)
27596 unsigned int i;
27597 const char *label = node->next->label;
27598 char loclabel[MAX_ARTIFICIAL_LABEL_BYTES];
27600 for (i = 0; i < first_loclabel_num_not_at_text_label; i++)
27602 ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", i);
27603 if (strcmp (label, loclabel) == 0)
27605 have_multiple_function_sections = true;
27606 return 0;
27610 return 1;
27613 /* Hook called after emitting a function into assembly.
27614 This does something only for the very first function emitted. */
27616 static void
27617 dwarf2out_end_function (unsigned int)
27619 if (in_first_function_p
27620 && !have_multiple_function_sections
27621 && first_loclabel_num_not_at_text_label
27622 && decl_loc_table)
27623 decl_loc_table->traverse<int, find_empty_loc_ranges_at_text_label> (0);
27624 in_first_function_p = false;
27625 maybe_at_text_label_p = false;
27628 /* Temporary holder for dwarf2out_register_main_translation_unit. Used to let
27629 front-ends register a translation unit even before dwarf2out_init is
27630 called. */
27631 static tree main_translation_unit = NULL_TREE;
27633 /* Hook called by front-ends after they built their main translation unit.
27634 Associate comp_unit_die to UNIT. */
27636 static void
27637 dwarf2out_register_main_translation_unit (tree unit)
27639 gcc_assert (TREE_CODE (unit) == TRANSLATION_UNIT_DECL
27640 && main_translation_unit == NULL_TREE);
27641 main_translation_unit = unit;
27642 /* If dwarf2out_init has not been called yet, it will perform the association
27643 itself looking at main_translation_unit. */
27644 if (decl_die_table != NULL)
27645 equate_decl_number_to_die (unit, comp_unit_die ());
27648 /* Add OPCODE+VAL as an entry at the end of the opcode array in TABLE. */
27650 static void
27651 push_dw_line_info_entry (dw_line_info_table *table,
27652 enum dw_line_info_opcode opcode, unsigned int val)
27654 dw_line_info_entry e;
27655 e.opcode = opcode;
27656 e.val = val;
27657 vec_safe_push (table->entries, e);
27660 /* Output a label to mark the beginning of a source code line entry
27661 and record information relating to this source line, in
27662 'line_info_table' for later output of the .debug_line section. */
27663 /* ??? The discriminator parameter ought to be unsigned. */
27665 static void
27666 dwarf2out_source_line (unsigned int line, unsigned int column,
27667 const char *filename,
27668 int discriminator, bool is_stmt)
27670 unsigned int file_num;
27671 dw_line_info_table *table;
27672 static var_loc_view lvugid;
27674 if (debug_info_level < DINFO_LEVEL_TERSE)
27675 return;
27677 table = cur_line_info_table;
27679 if (line == 0)
27681 if (debug_variable_location_views
27682 && output_asm_line_debug_info ()
27683 && table && !RESETTING_VIEW_P (table->view))
27685 /* If we're using the assembler to compute view numbers, we
27686 can't issue a .loc directive for line zero, so we can't
27687 get a view number at this point. We might attempt to
27688 compute it from the previous view, or equate it to a
27689 subsequent view (though it might not be there!), but
27690 since we're omitting the line number entry, we might as
27691 well omit the view number as well. That means pretending
27692 it's a view number zero, which might very well turn out
27693 to be correct. ??? Extend the assembler so that the
27694 compiler could emit e.g. ".locview .LVU#", to output a
27695 view without changing line number information. We'd then
27696 have to count it in symviews_since_reset; when it's omitted,
27697 it doesn't count. */
27698 if (!zero_view_p)
27699 zero_view_p = BITMAP_GGC_ALLOC ();
27700 bitmap_set_bit (zero_view_p, table->view);
27701 if (flag_debug_asm)
27703 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27704 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", table->view);
27705 fprintf (asm_out_file, "\t%s line 0, omitted view ",
27706 ASM_COMMENT_START);
27707 assemble_name (asm_out_file, label);
27708 putc ('\n', asm_out_file);
27710 table->view = ++lvugid;
27712 return;
27715 /* The discriminator column was added in dwarf4. Simplify the below
27716 by simply removing it if we're not supposed to output it. */
27717 if (dwarf_version < 4 && dwarf_strict)
27718 discriminator = 0;
27720 if (!debug_column_info)
27721 column = 0;
27723 file_num = maybe_emit_file (lookup_filename (filename));
27725 /* ??? TODO: Elide duplicate line number entries. Traditionally,
27726 the debugger has used the second (possibly duplicate) line number
27727 at the beginning of the function to mark the end of the prologue.
27728 We could eliminate any other duplicates within the function. For
27729 Dwarf3, we ought to include the DW_LNS_set_prologue_end mark in
27730 that second line number entry. */
27731 /* Recall that this end-of-prologue indication is *not* the same thing
27732 as the end_prologue debug hook. The NOTE_INSN_PROLOGUE_END note,
27733 to which the hook corresponds, follows the last insn that was
27734 emitted by gen_prologue. What we need is to precede the first insn
27735 that had been emitted after NOTE_INSN_FUNCTION_BEG, i.e. the first
27736 insn that corresponds to something the user wrote. These may be
27737 very different locations once scheduling is enabled. */
27739 if (0 && file_num == table->file_num
27740 && line == table->line_num
27741 && column == table->column_num
27742 && discriminator == table->discrim_num
27743 && is_stmt == table->is_stmt)
27744 return;
27746 switch_to_section (current_function_section ());
27748 /* If requested, emit something human-readable. */
27749 if (flag_debug_asm)
27751 if (debug_column_info)
27752 fprintf (asm_out_file, "\t%s %s:%d:%d\n", ASM_COMMENT_START,
27753 filename, line, column);
27754 else
27755 fprintf (asm_out_file, "\t%s %s:%d\n", ASM_COMMENT_START,
27756 filename, line);
27759 if (output_asm_line_debug_info ())
27761 /* Emit the .loc directive understood by GNU as. */
27762 /* "\t.loc %u %u 0 is_stmt %u discriminator %u",
27763 file_num, line, is_stmt, discriminator */
27764 fputs ("\t.loc ", asm_out_file);
27765 fprint_ul (asm_out_file, file_num);
27766 putc (' ', asm_out_file);
27767 fprint_ul (asm_out_file, line);
27768 putc (' ', asm_out_file);
27769 fprint_ul (asm_out_file, column);
27771 if (is_stmt != table->is_stmt)
27773 fputs (" is_stmt ", asm_out_file);
27774 putc (is_stmt ? '1' : '0', asm_out_file);
27776 if (SUPPORTS_DISCRIMINATOR && discriminator != 0)
27778 gcc_assert (discriminator > 0);
27779 fputs (" discriminator ", asm_out_file);
27780 fprint_ul (asm_out_file, (unsigned long) discriminator);
27782 if (debug_variable_location_views)
27784 if (!RESETTING_VIEW_P (table->view))
27786 table->symviews_since_reset++;
27787 if (table->symviews_since_reset > symview_upper_bound)
27788 symview_upper_bound = table->symviews_since_reset;
27789 /* When we're using the assembler to compute view
27790 numbers, we output symbolic labels after "view" in
27791 .loc directives, and the assembler will set them for
27792 us, so that we can refer to the view numbers in
27793 location lists. The only exceptions are when we know
27794 a view will be zero: "-0" is a forced reset, used
27795 e.g. in the beginning of functions, whereas "0" tells
27796 the assembler to check that there was a PC change
27797 since the previous view, in a way that implicitly
27798 resets the next view. */
27799 fputs (" view ", asm_out_file);
27800 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27801 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", table->view);
27802 assemble_name (asm_out_file, label);
27803 table->view = ++lvugid;
27805 else
27807 table->symviews_since_reset = 0;
27808 if (FORCE_RESETTING_VIEW_P (table->view))
27809 fputs (" view -0", asm_out_file);
27810 else
27811 fputs (" view 0", asm_out_file);
27812 /* Mark the present view as a zero view. Earlier debug
27813 binds may have already added its id to loclists to be
27814 emitted later, so we can't reuse the id for something
27815 else. However, it's good to know whether a view is
27816 known to be zero, because then we may be able to
27817 optimize out locviews that are all zeros, so take
27818 note of it in zero_view_p. */
27819 if (!zero_view_p)
27820 zero_view_p = BITMAP_GGC_ALLOC ();
27821 bitmap_set_bit (zero_view_p, lvugid);
27822 table->view = ++lvugid;
27825 putc ('\n', asm_out_file);
27827 else
27829 unsigned int label_num = ++line_info_label_num;
27831 targetm.asm_out.internal_label (asm_out_file, LINE_CODE_LABEL, label_num);
27833 if (debug_variable_location_views && !RESETTING_VIEW_P (table->view))
27834 push_dw_line_info_entry (table, LI_adv_address, label_num);
27835 else
27836 push_dw_line_info_entry (table, LI_set_address, label_num);
27837 if (debug_variable_location_views)
27839 bool resetting = FORCE_RESETTING_VIEW_P (table->view);
27840 if (resetting)
27841 table->view = 0;
27843 if (flag_debug_asm)
27844 fprintf (asm_out_file, "\t%s view %s%d\n",
27845 ASM_COMMENT_START,
27846 resetting ? "-" : "",
27847 table->view);
27849 table->view++;
27851 if (file_num != table->file_num)
27852 push_dw_line_info_entry (table, LI_set_file, file_num);
27853 if (discriminator != table->discrim_num)
27854 push_dw_line_info_entry (table, LI_set_discriminator, discriminator);
27855 if (is_stmt != table->is_stmt)
27856 push_dw_line_info_entry (table, LI_negate_stmt, 0);
27857 push_dw_line_info_entry (table, LI_set_line, line);
27858 if (debug_column_info)
27859 push_dw_line_info_entry (table, LI_set_column, column);
27862 table->file_num = file_num;
27863 table->line_num = line;
27864 table->column_num = column;
27865 table->discrim_num = discriminator;
27866 table->is_stmt = is_stmt;
27867 table->in_use = true;
27870 /* Record the beginning of a new source file. */
27872 static void
27873 dwarf2out_start_source_file (unsigned int lineno, const char *filename)
27875 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27877 macinfo_entry e;
27878 e.code = DW_MACINFO_start_file;
27879 e.lineno = lineno;
27880 e.info = ggc_strdup (filename);
27881 vec_safe_push (macinfo_table, e);
27885 /* Record the end of a source file. */
27887 static void
27888 dwarf2out_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED)
27890 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27892 macinfo_entry e;
27893 e.code = DW_MACINFO_end_file;
27894 e.lineno = lineno;
27895 e.info = NULL;
27896 vec_safe_push (macinfo_table, e);
27900 /* Called from debug_define in toplev.c. The `buffer' parameter contains
27901 the tail part of the directive line, i.e. the part which is past the
27902 initial whitespace, #, whitespace, directive-name, whitespace part. */
27904 static void
27905 dwarf2out_define (unsigned int lineno ATTRIBUTE_UNUSED,
27906 const char *buffer ATTRIBUTE_UNUSED)
27908 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27910 macinfo_entry e;
27911 /* Insert a dummy first entry to be able to optimize the whole
27912 predefined macro block using DW_MACRO_import. */
27913 if (macinfo_table->is_empty () && lineno <= 1)
27915 e.code = 0;
27916 e.lineno = 0;
27917 e.info = NULL;
27918 vec_safe_push (macinfo_table, e);
27920 e.code = DW_MACINFO_define;
27921 e.lineno = lineno;
27922 e.info = ggc_strdup (buffer);
27923 vec_safe_push (macinfo_table, e);
27927 /* Called from debug_undef in toplev.c. The `buffer' parameter contains
27928 the tail part of the directive line, i.e. the part which is past the
27929 initial whitespace, #, whitespace, directive-name, whitespace part. */
27931 static void
27932 dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED,
27933 const char *buffer ATTRIBUTE_UNUSED)
27935 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27937 macinfo_entry e;
27938 /* Insert a dummy first entry to be able to optimize the whole
27939 predefined macro block using DW_MACRO_import. */
27940 if (macinfo_table->is_empty () && lineno <= 1)
27942 e.code = 0;
27943 e.lineno = 0;
27944 e.info = NULL;
27945 vec_safe_push (macinfo_table, e);
27947 e.code = DW_MACINFO_undef;
27948 e.lineno = lineno;
27949 e.info = ggc_strdup (buffer);
27950 vec_safe_push (macinfo_table, e);
27954 /* Helpers to manipulate hash table of CUs. */
27956 struct macinfo_entry_hasher : nofree_ptr_hash <macinfo_entry>
27958 static inline hashval_t hash (const macinfo_entry *);
27959 static inline bool equal (const macinfo_entry *, const macinfo_entry *);
27962 inline hashval_t
27963 macinfo_entry_hasher::hash (const macinfo_entry *entry)
27965 return htab_hash_string (entry->info);
27968 inline bool
27969 macinfo_entry_hasher::equal (const macinfo_entry *entry1,
27970 const macinfo_entry *entry2)
27972 return !strcmp (entry1->info, entry2->info);
27975 typedef hash_table<macinfo_entry_hasher> macinfo_hash_type;
27977 /* Output a single .debug_macinfo entry. */
27979 static void
27980 output_macinfo_op (macinfo_entry *ref)
27982 int file_num;
27983 size_t len;
27984 struct indirect_string_node *node;
27985 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27986 struct dwarf_file_data *fd;
27988 switch (ref->code)
27990 case DW_MACINFO_start_file:
27991 fd = lookup_filename (ref->info);
27992 file_num = maybe_emit_file (fd);
27993 dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file");
27994 dw2_asm_output_data_uleb128 (ref->lineno,
27995 "Included from line number %lu",
27996 (unsigned long) ref->lineno);
27997 dw2_asm_output_data_uleb128 (file_num, "file %s", ref->info);
27998 break;
27999 case DW_MACINFO_end_file:
28000 dw2_asm_output_data (1, DW_MACINFO_end_file, "End file");
28001 break;
28002 case DW_MACINFO_define:
28003 case DW_MACINFO_undef:
28004 len = strlen (ref->info) + 1;
28005 if (!dwarf_strict
28006 && len > DWARF_OFFSET_SIZE
28007 && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET
28008 && (debug_str_section->common.flags & SECTION_MERGE) != 0)
28010 ref->code = ref->code == DW_MACINFO_define
28011 ? DW_MACRO_define_strp : DW_MACRO_undef_strp;
28012 output_macinfo_op (ref);
28013 return;
28015 dw2_asm_output_data (1, ref->code,
28016 ref->code == DW_MACINFO_define
28017 ? "Define macro" : "Undefine macro");
28018 dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu",
28019 (unsigned long) ref->lineno);
28020 dw2_asm_output_nstring (ref->info, -1, "The macro");
28021 break;
28022 case DW_MACRO_define_strp:
28023 case DW_MACRO_undef_strp:
28024 node = find_AT_string (ref->info);
28025 gcc_assert (node
28026 && (node->form == DW_FORM_strp
28027 || node->form == DW_FORM_GNU_str_index));
28028 dw2_asm_output_data (1, ref->code,
28029 ref->code == DW_MACRO_define_strp
28030 ? "Define macro strp"
28031 : "Undefine macro strp");
28032 dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu",
28033 (unsigned long) ref->lineno);
28034 if (node->form == DW_FORM_strp)
28035 dw2_asm_output_offset (DWARF_OFFSET_SIZE, node->label,
28036 debug_str_section, "The macro: \"%s\"",
28037 ref->info);
28038 else
28039 dw2_asm_output_data_uleb128 (node->index, "The macro: \"%s\"",
28040 ref->info);
28041 break;
28042 case DW_MACRO_import:
28043 dw2_asm_output_data (1, ref->code, "Import");
28044 ASM_GENERATE_INTERNAL_LABEL (label,
28045 DEBUG_MACRO_SECTION_LABEL,
28046 ref->lineno + macinfo_label_base);
28047 dw2_asm_output_offset (DWARF_OFFSET_SIZE, label, NULL, NULL);
28048 break;
28049 default:
28050 fprintf (asm_out_file, "%s unrecognized macinfo code %lu\n",
28051 ASM_COMMENT_START, (unsigned long) ref->code);
28052 break;
28056 /* Attempt to make a sequence of define/undef macinfo ops shareable with
28057 other compilation unit .debug_macinfo sections. IDX is the first
28058 index of a define/undef, return the number of ops that should be
28059 emitted in a comdat .debug_macinfo section and emit
28060 a DW_MACRO_import entry referencing it.
28061 If the define/undef entry should be emitted normally, return 0. */
28063 static unsigned
28064 optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files,
28065 macinfo_hash_type **macinfo_htab)
28067 macinfo_entry *first, *second, *cur, *inc;
28068 char linebuf[sizeof (HOST_WIDE_INT) * 3 + 1];
28069 unsigned char checksum[16];
28070 struct md5_ctx ctx;
28071 char *grp_name, *tail;
28072 const char *base;
28073 unsigned int i, count, encoded_filename_len, linebuf_len;
28074 macinfo_entry **slot;
28076 first = &(*macinfo_table)[idx];
28077 second = &(*macinfo_table)[idx + 1];
28079 /* Optimize only if there are at least two consecutive define/undef ops,
28080 and either all of them are before first DW_MACINFO_start_file
28081 with lineno {0,1} (i.e. predefined macro block), or all of them are
28082 in some included header file. */
28083 if (second->code != DW_MACINFO_define && second->code != DW_MACINFO_undef)
28084 return 0;
28085 if (vec_safe_is_empty (files))
28087 if (first->lineno > 1 || second->lineno > 1)
28088 return 0;
28090 else if (first->lineno == 0)
28091 return 0;
28093 /* Find the last define/undef entry that can be grouped together
28094 with first and at the same time compute md5 checksum of their
28095 codes, linenumbers and strings. */
28096 md5_init_ctx (&ctx);
28097 for (i = idx; macinfo_table->iterate (i, &cur); i++)
28098 if (cur->code != DW_MACINFO_define && cur->code != DW_MACINFO_undef)
28099 break;
28100 else if (vec_safe_is_empty (files) && cur->lineno > 1)
28101 break;
28102 else
28104 unsigned char code = cur->code;
28105 md5_process_bytes (&code, 1, &ctx);
28106 checksum_uleb128 (cur->lineno, &ctx);
28107 md5_process_bytes (cur->info, strlen (cur->info) + 1, &ctx);
28109 md5_finish_ctx (&ctx, checksum);
28110 count = i - idx;
28112 /* From the containing include filename (if any) pick up just
28113 usable characters from its basename. */
28114 if (vec_safe_is_empty (files))
28115 base = "";
28116 else
28117 base = lbasename (files->last ().info);
28118 for (encoded_filename_len = 0, i = 0; base[i]; i++)
28119 if (ISIDNUM (base[i]) || base[i] == '.')
28120 encoded_filename_len++;
28121 /* Count . at the end. */
28122 if (encoded_filename_len)
28123 encoded_filename_len++;
28125 sprintf (linebuf, HOST_WIDE_INT_PRINT_UNSIGNED, first->lineno);
28126 linebuf_len = strlen (linebuf);
28128 /* The group name format is: wmN.[<encoded filename>.]<lineno>.<md5sum> */
28129 grp_name = XALLOCAVEC (char, 4 + encoded_filename_len + linebuf_len + 1
28130 + 16 * 2 + 1);
28131 memcpy (grp_name, DWARF_OFFSET_SIZE == 4 ? "wm4." : "wm8.", 4);
28132 tail = grp_name + 4;
28133 if (encoded_filename_len)
28135 for (i = 0; base[i]; i++)
28136 if (ISIDNUM (base[i]) || base[i] == '.')
28137 *tail++ = base[i];
28138 *tail++ = '.';
28140 memcpy (tail, linebuf, linebuf_len);
28141 tail += linebuf_len;
28142 *tail++ = '.';
28143 for (i = 0; i < 16; i++)
28144 sprintf (tail + i * 2, "%02x", checksum[i] & 0xff);
28146 /* Construct a macinfo_entry for DW_MACRO_import
28147 in the empty vector entry before the first define/undef. */
28148 inc = &(*macinfo_table)[idx - 1];
28149 inc->code = DW_MACRO_import;
28150 inc->lineno = 0;
28151 inc->info = ggc_strdup (grp_name);
28152 if (!*macinfo_htab)
28153 *macinfo_htab = new macinfo_hash_type (10);
28154 /* Avoid emitting duplicates. */
28155 slot = (*macinfo_htab)->find_slot (inc, INSERT);
28156 if (*slot != NULL)
28158 inc->code = 0;
28159 inc->info = NULL;
28160 /* If such an entry has been used before, just emit
28161 a DW_MACRO_import op. */
28162 inc = *slot;
28163 output_macinfo_op (inc);
28164 /* And clear all macinfo_entry in the range to avoid emitting them
28165 in the second pass. */
28166 for (i = idx; macinfo_table->iterate (i, &cur) && i < idx + count; i++)
28168 cur->code = 0;
28169 cur->info = NULL;
28172 else
28174 *slot = inc;
28175 inc->lineno = (*macinfo_htab)->elements ();
28176 output_macinfo_op (inc);
28178 return count;
28181 /* Save any strings needed by the macinfo table in the debug str
28182 table. All strings must be collected into the table by the time
28183 index_string is called. */
28185 static void
28186 save_macinfo_strings (void)
28188 unsigned len;
28189 unsigned i;
28190 macinfo_entry *ref;
28192 for (i = 0; macinfo_table && macinfo_table->iterate (i, &ref); i++)
28194 switch (ref->code)
28196 /* Match the logic in output_macinfo_op to decide on
28197 indirect strings. */
28198 case DW_MACINFO_define:
28199 case DW_MACINFO_undef:
28200 len = strlen (ref->info) + 1;
28201 if (!dwarf_strict
28202 && len > DWARF_OFFSET_SIZE
28203 && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET
28204 && (debug_str_section->common.flags & SECTION_MERGE) != 0)
28205 set_indirect_string (find_AT_string (ref->info));
28206 break;
28207 case DW_MACRO_define_strp:
28208 case DW_MACRO_undef_strp:
28209 set_indirect_string (find_AT_string (ref->info));
28210 break;
28211 default:
28212 break;
28217 /* Output macinfo section(s). */
28219 static void
28220 output_macinfo (const char *debug_line_label, bool early_lto_debug)
28222 unsigned i;
28223 unsigned long length = vec_safe_length (macinfo_table);
28224 macinfo_entry *ref;
28225 vec<macinfo_entry, va_gc> *files = NULL;
28226 macinfo_hash_type *macinfo_htab = NULL;
28227 char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
28229 if (! length)
28230 return;
28232 /* output_macinfo* uses these interchangeably. */
28233 gcc_assert ((int) DW_MACINFO_define == (int) DW_MACRO_define
28234 && (int) DW_MACINFO_undef == (int) DW_MACRO_undef
28235 && (int) DW_MACINFO_start_file == (int) DW_MACRO_start_file
28236 && (int) DW_MACINFO_end_file == (int) DW_MACRO_end_file);
28238 /* AIX Assembler inserts the length, so adjust the reference to match the
28239 offset expected by debuggers. */
28240 strcpy (dl_section_ref, debug_line_label);
28241 if (XCOFF_DEBUGGING_INFO)
28242 strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
28244 /* For .debug_macro emit the section header. */
28245 if (!dwarf_strict || dwarf_version >= 5)
28247 dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4,
28248 "DWARF macro version number");
28249 if (DWARF_OFFSET_SIZE == 8)
28250 dw2_asm_output_data (1, 3, "Flags: 64-bit, lineptr present");
28251 else
28252 dw2_asm_output_data (1, 2, "Flags: 32-bit, lineptr present");
28253 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_line_label,
28254 debug_line_section, NULL);
28257 /* In the first loop, it emits the primary .debug_macinfo section
28258 and after each emitted op the macinfo_entry is cleared.
28259 If a longer range of define/undef ops can be optimized using
28260 DW_MACRO_import, the DW_MACRO_import op is emitted and kept in
28261 the vector before the first define/undef in the range and the
28262 whole range of define/undef ops is not emitted and kept. */
28263 for (i = 0; macinfo_table->iterate (i, &ref); i++)
28265 switch (ref->code)
28267 case DW_MACINFO_start_file:
28268 vec_safe_push (files, *ref);
28269 break;
28270 case DW_MACINFO_end_file:
28271 if (!vec_safe_is_empty (files))
28272 files->pop ();
28273 break;
28274 case DW_MACINFO_define:
28275 case DW_MACINFO_undef:
28276 if ((!dwarf_strict || dwarf_version >= 5)
28277 && HAVE_COMDAT_GROUP
28278 && vec_safe_length (files) != 1
28279 && i > 0
28280 && i + 1 < length
28281 && (*macinfo_table)[i - 1].code == 0)
28283 unsigned count = optimize_macinfo_range (i, files, &macinfo_htab);
28284 if (count)
28286 i += count - 1;
28287 continue;
28290 break;
28291 case 0:
28292 /* A dummy entry may be inserted at the beginning to be able
28293 to optimize the whole block of predefined macros. */
28294 if (i == 0)
28295 continue;
28296 default:
28297 break;
28299 output_macinfo_op (ref);
28300 ref->info = NULL;
28301 ref->code = 0;
28304 if (!macinfo_htab)
28305 return;
28307 /* Save the number of transparent includes so we can adjust the
28308 label number for the fat LTO object DWARF. */
28309 unsigned macinfo_label_base_adj = macinfo_htab->elements ();
28311 delete macinfo_htab;
28312 macinfo_htab = NULL;
28314 /* If any DW_MACRO_import were used, on those DW_MACRO_import entries
28315 terminate the current chain and switch to a new comdat .debug_macinfo
28316 section and emit the define/undef entries within it. */
28317 for (i = 0; macinfo_table->iterate (i, &ref); i++)
28318 switch (ref->code)
28320 case 0:
28321 continue;
28322 case DW_MACRO_import:
28324 char label[MAX_ARTIFICIAL_LABEL_BYTES];
28325 tree comdat_key = get_identifier (ref->info);
28326 /* Terminate the previous .debug_macinfo section. */
28327 dw2_asm_output_data (1, 0, "End compilation unit");
28328 targetm.asm_out.named_section (debug_macinfo_section_name,
28329 SECTION_DEBUG
28330 | SECTION_LINKONCE
28331 | (early_lto_debug
28332 ? SECTION_EXCLUDE : 0),
28333 comdat_key);
28334 ASM_GENERATE_INTERNAL_LABEL (label,
28335 DEBUG_MACRO_SECTION_LABEL,
28336 ref->lineno + macinfo_label_base);
28337 ASM_OUTPUT_LABEL (asm_out_file, label);
28338 ref->code = 0;
28339 ref->info = NULL;
28340 dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4,
28341 "DWARF macro version number");
28342 if (DWARF_OFFSET_SIZE == 8)
28343 dw2_asm_output_data (1, 1, "Flags: 64-bit");
28344 else
28345 dw2_asm_output_data (1, 0, "Flags: 32-bit");
28347 break;
28348 case DW_MACINFO_define:
28349 case DW_MACINFO_undef:
28350 output_macinfo_op (ref);
28351 ref->code = 0;
28352 ref->info = NULL;
28353 break;
28354 default:
28355 gcc_unreachable ();
28358 macinfo_label_base += macinfo_label_base_adj;
28361 /* Initialize the various sections and labels for dwarf output and prefix
28362 them with PREFIX if non-NULL. Returns the generation (zero based
28363 number of times function was called). */
28365 static unsigned
28366 init_sections_and_labels (bool early_lto_debug)
28368 /* As we may get called multiple times have a generation count for
28369 labels. */
28370 static unsigned generation = 0;
28372 if (early_lto_debug)
28374 if (!dwarf_split_debug_info)
28376 debug_info_section = get_section (DEBUG_LTO_INFO_SECTION,
28377 SECTION_DEBUG | SECTION_EXCLUDE,
28378 NULL);
28379 debug_abbrev_section = get_section (DEBUG_LTO_ABBREV_SECTION,
28380 SECTION_DEBUG | SECTION_EXCLUDE,
28381 NULL);
28382 debug_macinfo_section_name
28383 = ((dwarf_strict && dwarf_version < 5)
28384 ? DEBUG_LTO_MACINFO_SECTION : DEBUG_LTO_MACRO_SECTION);
28385 debug_macinfo_section = get_section (debug_macinfo_section_name,
28386 SECTION_DEBUG
28387 | SECTION_EXCLUDE, NULL);
28388 /* For macro info we have to refer to a debug_line section, so
28389 similar to split-dwarf emit a skeleton one for early debug. */
28390 debug_skeleton_line_section
28391 = get_section (DEBUG_LTO_LINE_SECTION,
28392 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28393 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28394 DEBUG_SKELETON_LINE_SECTION_LABEL,
28395 generation);
28397 else
28399 /* ??? Which of the following do we need early? */
28400 debug_info_section = get_section (DEBUG_LTO_DWO_INFO_SECTION,
28401 SECTION_DEBUG | SECTION_EXCLUDE,
28402 NULL);
28403 debug_abbrev_section = get_section (DEBUG_LTO_DWO_ABBREV_SECTION,
28404 SECTION_DEBUG | SECTION_EXCLUDE,
28405 NULL);
28406 debug_skeleton_info_section = get_section (DEBUG_LTO_INFO_SECTION,
28407 SECTION_DEBUG
28408 | SECTION_EXCLUDE, NULL);
28409 debug_skeleton_abbrev_section
28410 = get_section (DEBUG_LTO_ABBREV_SECTION,
28411 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28412 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_abbrev_section_label,
28413 DEBUG_SKELETON_ABBREV_SECTION_LABEL,
28414 generation);
28416 /* Somewhat confusing detail: The skeleton_[abbrev|info] sections
28417 stay in the main .o, but the skeleton_line goes into the split
28418 off dwo. */
28419 debug_skeleton_line_section
28420 = get_section (DEBUG_LTO_LINE_SECTION,
28421 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28422 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28423 DEBUG_SKELETON_LINE_SECTION_LABEL,
28424 generation);
28425 debug_str_offsets_section
28426 = get_section (DEBUG_LTO_DWO_STR_OFFSETS_SECTION,
28427 SECTION_DEBUG | SECTION_EXCLUDE,
28428 NULL);
28429 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_info_section_label,
28430 DEBUG_SKELETON_INFO_SECTION_LABEL,
28431 generation);
28432 debug_str_dwo_section = get_section (DEBUG_LTO_STR_DWO_SECTION,
28433 DEBUG_STR_DWO_SECTION_FLAGS,
28434 NULL);
28435 debug_macinfo_section_name
28436 = ((dwarf_strict && dwarf_version < 5)
28437 ? DEBUG_LTO_DWO_MACINFO_SECTION : DEBUG_LTO_DWO_MACRO_SECTION);
28438 debug_macinfo_section = get_section (debug_macinfo_section_name,
28439 SECTION_DEBUG | SECTION_EXCLUDE,
28440 NULL);
28442 debug_str_section = get_section (DEBUG_LTO_STR_SECTION,
28443 DEBUG_STR_SECTION_FLAGS
28444 | SECTION_EXCLUDE, NULL);
28445 if (!dwarf_split_debug_info && !dwarf2out_as_loc_support)
28446 debug_line_str_section
28447 = get_section (DEBUG_LTO_LINE_STR_SECTION,
28448 DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL);
28450 else
28452 if (!dwarf_split_debug_info)
28454 debug_info_section = get_section (DEBUG_INFO_SECTION,
28455 SECTION_DEBUG, NULL);
28456 debug_abbrev_section = get_section (DEBUG_ABBREV_SECTION,
28457 SECTION_DEBUG, NULL);
28458 debug_loc_section = get_section (dwarf_version >= 5
28459 ? DEBUG_LOCLISTS_SECTION
28460 : DEBUG_LOC_SECTION,
28461 SECTION_DEBUG, NULL);
28462 debug_macinfo_section_name
28463 = ((dwarf_strict && dwarf_version < 5)
28464 ? DEBUG_MACINFO_SECTION : DEBUG_MACRO_SECTION);
28465 debug_macinfo_section = get_section (debug_macinfo_section_name,
28466 SECTION_DEBUG, NULL);
28468 else
28470 debug_info_section = get_section (DEBUG_DWO_INFO_SECTION,
28471 SECTION_DEBUG | SECTION_EXCLUDE,
28472 NULL);
28473 debug_abbrev_section = get_section (DEBUG_DWO_ABBREV_SECTION,
28474 SECTION_DEBUG | SECTION_EXCLUDE,
28475 NULL);
28476 debug_addr_section = get_section (DEBUG_ADDR_SECTION,
28477 SECTION_DEBUG, NULL);
28478 debug_skeleton_info_section = get_section (DEBUG_INFO_SECTION,
28479 SECTION_DEBUG, NULL);
28480 debug_skeleton_abbrev_section = get_section (DEBUG_ABBREV_SECTION,
28481 SECTION_DEBUG, NULL);
28482 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_abbrev_section_label,
28483 DEBUG_SKELETON_ABBREV_SECTION_LABEL,
28484 generation);
28486 /* Somewhat confusing detail: The skeleton_[abbrev|info] sections
28487 stay in the main .o, but the skeleton_line goes into the
28488 split off dwo. */
28489 debug_skeleton_line_section
28490 = get_section (DEBUG_DWO_LINE_SECTION,
28491 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28492 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28493 DEBUG_SKELETON_LINE_SECTION_LABEL,
28494 generation);
28495 debug_str_offsets_section
28496 = get_section (DEBUG_DWO_STR_OFFSETS_SECTION,
28497 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28498 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_info_section_label,
28499 DEBUG_SKELETON_INFO_SECTION_LABEL,
28500 generation);
28501 debug_loc_section = get_section (dwarf_version >= 5
28502 ? DEBUG_DWO_LOCLISTS_SECTION
28503 : DEBUG_DWO_LOC_SECTION,
28504 SECTION_DEBUG | SECTION_EXCLUDE,
28505 NULL);
28506 debug_str_dwo_section = get_section (DEBUG_STR_DWO_SECTION,
28507 DEBUG_STR_DWO_SECTION_FLAGS,
28508 NULL);
28509 debug_macinfo_section_name
28510 = ((dwarf_strict && dwarf_version < 5)
28511 ? DEBUG_DWO_MACINFO_SECTION : DEBUG_DWO_MACRO_SECTION);
28512 debug_macinfo_section = get_section (debug_macinfo_section_name,
28513 SECTION_DEBUG | SECTION_EXCLUDE,
28514 NULL);
28516 debug_aranges_section = get_section (DEBUG_ARANGES_SECTION,
28517 SECTION_DEBUG, NULL);
28518 debug_line_section = get_section (DEBUG_LINE_SECTION,
28519 SECTION_DEBUG, NULL);
28520 debug_pubnames_section = get_section (DEBUG_PUBNAMES_SECTION,
28521 SECTION_DEBUG, NULL);
28522 debug_pubtypes_section = get_section (DEBUG_PUBTYPES_SECTION,
28523 SECTION_DEBUG, NULL);
28524 debug_str_section = get_section (DEBUG_STR_SECTION,
28525 DEBUG_STR_SECTION_FLAGS, NULL);
28526 if (!dwarf_split_debug_info && !output_asm_line_debug_info ())
28527 debug_line_str_section = get_section (DEBUG_LINE_STR_SECTION,
28528 DEBUG_STR_SECTION_FLAGS, NULL);
28530 debug_ranges_section = get_section (dwarf_version >= 5
28531 ? DEBUG_RNGLISTS_SECTION
28532 : DEBUG_RANGES_SECTION,
28533 SECTION_DEBUG, NULL);
28534 debug_frame_section = get_section (DEBUG_FRAME_SECTION,
28535 SECTION_DEBUG, NULL);
28538 ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
28539 DEBUG_ABBREV_SECTION_LABEL, generation);
28540 ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
28541 DEBUG_INFO_SECTION_LABEL, generation);
28542 info_section_emitted = false;
28543 ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
28544 DEBUG_LINE_SECTION_LABEL, generation);
28545 /* There are up to 4 unique ranges labels per generation.
28546 See also output_rnglists. */
28547 ASM_GENERATE_INTERNAL_LABEL (ranges_section_label,
28548 DEBUG_RANGES_SECTION_LABEL, generation * 4);
28549 if (dwarf_version >= 5 && dwarf_split_debug_info)
28550 ASM_GENERATE_INTERNAL_LABEL (ranges_base_label,
28551 DEBUG_RANGES_SECTION_LABEL,
28552 1 + generation * 4);
28553 ASM_GENERATE_INTERNAL_LABEL (debug_addr_section_label,
28554 DEBUG_ADDR_SECTION_LABEL, generation);
28555 ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label,
28556 (dwarf_strict && dwarf_version < 5)
28557 ? DEBUG_MACINFO_SECTION_LABEL
28558 : DEBUG_MACRO_SECTION_LABEL, generation);
28559 ASM_GENERATE_INTERNAL_LABEL (loc_section_label, DEBUG_LOC_SECTION_LABEL,
28560 generation);
28562 ++generation;
28563 return generation - 1;
28566 /* Set up for Dwarf output at the start of compilation. */
28568 static void
28569 dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
28571 /* Allocate the file_table. */
28572 file_table = hash_table<dwarf_file_hasher>::create_ggc (50);
28574 #ifndef DWARF2_LINENO_DEBUGGING_INFO
28575 /* Allocate the decl_die_table. */
28576 decl_die_table = hash_table<decl_die_hasher>::create_ggc (10);
28578 /* Allocate the decl_loc_table. */
28579 decl_loc_table = hash_table<decl_loc_hasher>::create_ggc (10);
28581 /* Allocate the cached_dw_loc_list_table. */
28582 cached_dw_loc_list_table = hash_table<dw_loc_list_hasher>::create_ggc (10);
28584 /* Allocate the initial hunk of the decl_scope_table. */
28585 vec_alloc (decl_scope_table, 256);
28587 /* Allocate the initial hunk of the abbrev_die_table. */
28588 vec_alloc (abbrev_die_table, 256);
28589 /* Zero-th entry is allocated, but unused. */
28590 abbrev_die_table->quick_push (NULL);
28592 /* Allocate the dwarf_proc_stack_usage_map. */
28593 dwarf_proc_stack_usage_map = new hash_map<dw_die_ref, int>;
28595 /* Allocate the pubtypes and pubnames vectors. */
28596 vec_alloc (pubname_table, 32);
28597 vec_alloc (pubtype_table, 32);
28599 vec_alloc (incomplete_types, 64);
28601 vec_alloc (used_rtx_array, 32);
28603 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
28604 vec_alloc (macinfo_table, 64);
28605 #endif
28607 /* If front-ends already registered a main translation unit but we were not
28608 ready to perform the association, do this now. */
28609 if (main_translation_unit != NULL_TREE)
28610 equate_decl_number_to_die (main_translation_unit, comp_unit_die ());
28613 /* Called before compile () starts outputtting functions, variables
28614 and toplevel asms into assembly. */
28616 static void
28617 dwarf2out_assembly_start (void)
28619 if (text_section_line_info)
28620 return;
28622 #ifndef DWARF2_LINENO_DEBUGGING_INFO
28623 ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
28624 ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
28625 ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label,
28626 COLD_TEXT_SECTION_LABEL, 0);
28627 ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
28629 switch_to_section (text_section);
28630 ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
28631 #endif
28633 /* Make sure the line number table for .text always exists. */
28634 text_section_line_info = new_line_info_table ();
28635 text_section_line_info->end_label = text_end_label;
28637 #ifdef DWARF2_LINENO_DEBUGGING_INFO
28638 cur_line_info_table = text_section_line_info;
28639 #endif
28641 if (HAVE_GAS_CFI_SECTIONS_DIRECTIVE
28642 && dwarf2out_do_cfi_asm ()
28643 && !dwarf2out_do_eh_frame ())
28644 fprintf (asm_out_file, "\t.cfi_sections\t.debug_frame\n");
28647 /* A helper function for dwarf2out_finish called through
28648 htab_traverse. Assign a string its index. All strings must be
28649 collected into the table by the time index_string is called,
28650 because the indexing code relies on htab_traverse to traverse nodes
28651 in the same order for each run. */
28654 index_string (indirect_string_node **h, unsigned int *index)
28656 indirect_string_node *node = *h;
28658 find_string_form (node);
28659 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28661 gcc_assert (node->index == NO_INDEX_ASSIGNED);
28662 node->index = *index;
28663 *index += 1;
28665 return 1;
28668 /* A helper function for output_indirect_strings called through
28669 htab_traverse. Output the offset to a string and update the
28670 current offset. */
28673 output_index_string_offset (indirect_string_node **h, unsigned int *offset)
28675 indirect_string_node *node = *h;
28677 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28679 /* Assert that this node has been assigned an index. */
28680 gcc_assert (node->index != NO_INDEX_ASSIGNED
28681 && node->index != NOT_INDEXED);
28682 dw2_asm_output_data (DWARF_OFFSET_SIZE, *offset,
28683 "indexed string 0x%x: %s", node->index, node->str);
28684 *offset += strlen (node->str) + 1;
28686 return 1;
28689 /* A helper function for dwarf2out_finish called through
28690 htab_traverse. Output the indexed string. */
28693 output_index_string (indirect_string_node **h, unsigned int *cur_idx)
28695 struct indirect_string_node *node = *h;
28697 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28699 /* Assert that the strings are output in the same order as their
28700 indexes were assigned. */
28701 gcc_assert (*cur_idx == node->index);
28702 assemble_string (node->str, strlen (node->str) + 1);
28703 *cur_idx += 1;
28705 return 1;
28708 /* A helper function for dwarf2out_finish called through
28709 htab_traverse. Emit one queued .debug_str string. */
28712 output_indirect_string (indirect_string_node **h, enum dwarf_form form)
28714 struct indirect_string_node *node = *h;
28716 node->form = find_string_form (node);
28717 if (node->form == form && node->refcount > 0)
28719 ASM_OUTPUT_LABEL (asm_out_file, node->label);
28720 assemble_string (node->str, strlen (node->str) + 1);
28723 return 1;
28726 /* Output the indexed string table. */
28728 static void
28729 output_indirect_strings (void)
28731 switch_to_section (debug_str_section);
28732 if (!dwarf_split_debug_info)
28733 debug_str_hash->traverse<enum dwarf_form,
28734 output_indirect_string> (DW_FORM_strp);
28735 else
28737 unsigned int offset = 0;
28738 unsigned int cur_idx = 0;
28740 if (skeleton_debug_str_hash)
28741 skeleton_debug_str_hash->traverse<enum dwarf_form,
28742 output_indirect_string> (DW_FORM_strp);
28744 switch_to_section (debug_str_offsets_section);
28745 debug_str_hash->traverse_noresize
28746 <unsigned int *, output_index_string_offset> (&offset);
28747 switch_to_section (debug_str_dwo_section);
28748 debug_str_hash->traverse_noresize<unsigned int *, output_index_string>
28749 (&cur_idx);
28753 /* Callback for htab_traverse to assign an index to an entry in the
28754 table, and to write that entry to the .debug_addr section. */
28757 output_addr_table_entry (addr_table_entry **slot, unsigned int *cur_index)
28759 addr_table_entry *entry = *slot;
28761 if (entry->refcount == 0)
28763 gcc_assert (entry->index == NO_INDEX_ASSIGNED
28764 || entry->index == NOT_INDEXED);
28765 return 1;
28768 gcc_assert (entry->index == *cur_index);
28769 (*cur_index)++;
28771 switch (entry->kind)
28773 case ate_kind_rtx:
28774 dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, entry->addr.rtl,
28775 "0x%x", entry->index);
28776 break;
28777 case ate_kind_rtx_dtprel:
28778 gcc_assert (targetm.asm_out.output_dwarf_dtprel);
28779 targetm.asm_out.output_dwarf_dtprel (asm_out_file,
28780 DWARF2_ADDR_SIZE,
28781 entry->addr.rtl);
28782 fputc ('\n', asm_out_file);
28783 break;
28784 case ate_kind_label:
28785 dw2_asm_output_addr (DWARF2_ADDR_SIZE, entry->addr.label,
28786 "0x%x", entry->index);
28787 break;
28788 default:
28789 gcc_unreachable ();
28791 return 1;
28794 /* Produce the .debug_addr section. */
28796 static void
28797 output_addr_table (void)
28799 unsigned int index = 0;
28800 if (addr_index_table == NULL || addr_index_table->size () == 0)
28801 return;
28803 switch_to_section (debug_addr_section);
28804 addr_index_table
28805 ->traverse_noresize<unsigned int *, output_addr_table_entry> (&index);
28808 #if ENABLE_ASSERT_CHECKING
28809 /* Verify that all marks are clear. */
28811 static void
28812 verify_marks_clear (dw_die_ref die)
28814 dw_die_ref c;
28816 gcc_assert (! die->die_mark);
28817 FOR_EACH_CHILD (die, c, verify_marks_clear (c));
28819 #endif /* ENABLE_ASSERT_CHECKING */
28821 /* Clear the marks for a die and its children.
28822 Be cool if the mark isn't set. */
28824 static void
28825 prune_unmark_dies (dw_die_ref die)
28827 dw_die_ref c;
28829 if (die->die_mark)
28830 die->die_mark = 0;
28831 FOR_EACH_CHILD (die, c, prune_unmark_dies (c));
28834 /* Given LOC that is referenced by a DIE we're marking as used, find all
28835 referenced DWARF procedures it references and mark them as used. */
28837 static void
28838 prune_unused_types_walk_loc_descr (dw_loc_descr_ref loc)
28840 for (; loc != NULL; loc = loc->dw_loc_next)
28841 switch (loc->dw_loc_opc)
28843 case DW_OP_implicit_pointer:
28844 case DW_OP_convert:
28845 case DW_OP_reinterpret:
28846 case DW_OP_GNU_implicit_pointer:
28847 case DW_OP_GNU_convert:
28848 case DW_OP_GNU_reinterpret:
28849 if (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref)
28850 prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
28851 break;
28852 case DW_OP_GNU_variable_value:
28853 if (loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
28855 dw_die_ref ref
28856 = lookup_decl_die (loc->dw_loc_oprnd1.v.val_decl_ref);
28857 if (ref == NULL)
28858 break;
28859 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
28860 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
28861 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
28863 /* FALLTHRU */
28864 case DW_OP_call2:
28865 case DW_OP_call4:
28866 case DW_OP_call_ref:
28867 case DW_OP_const_type:
28868 case DW_OP_GNU_const_type:
28869 case DW_OP_GNU_parameter_ref:
28870 gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref);
28871 prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
28872 break;
28873 case DW_OP_regval_type:
28874 case DW_OP_deref_type:
28875 case DW_OP_GNU_regval_type:
28876 case DW_OP_GNU_deref_type:
28877 gcc_assert (loc->dw_loc_oprnd2.val_class == dw_val_class_die_ref);
28878 prune_unused_types_mark (loc->dw_loc_oprnd2.v.val_die_ref.die, 1);
28879 break;
28880 case DW_OP_entry_value:
28881 case DW_OP_GNU_entry_value:
28882 gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_loc);
28883 prune_unused_types_walk_loc_descr (loc->dw_loc_oprnd1.v.val_loc);
28884 break;
28885 default:
28886 break;
28890 /* Given DIE that we're marking as used, find any other dies
28891 it references as attributes and mark them as used. */
28893 static void
28894 prune_unused_types_walk_attribs (dw_die_ref die)
28896 dw_attr_node *a;
28897 unsigned ix;
28899 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
28901 switch (AT_class (a))
28903 /* Make sure DWARF procedures referenced by location descriptions will
28904 get emitted. */
28905 case dw_val_class_loc:
28906 prune_unused_types_walk_loc_descr (AT_loc (a));
28907 break;
28908 case dw_val_class_loc_list:
28909 for (dw_loc_list_ref list = AT_loc_list (a);
28910 list != NULL;
28911 list = list->dw_loc_next)
28912 prune_unused_types_walk_loc_descr (list->expr);
28913 break;
28915 case dw_val_class_view_list:
28916 /* This points to a loc_list in another attribute, so it's
28917 already covered. */
28918 break;
28920 case dw_val_class_die_ref:
28921 /* A reference to another DIE.
28922 Make sure that it will get emitted.
28923 If it was broken out into a comdat group, don't follow it. */
28924 if (! AT_ref (a)->comdat_type_p
28925 || a->dw_attr == DW_AT_specification)
28926 prune_unused_types_mark (a->dw_attr_val.v.val_die_ref.die, 1);
28927 break;
28929 case dw_val_class_str:
28930 /* Set the string's refcount to 0 so that prune_unused_types_mark
28931 accounts properly for it. */
28932 a->dw_attr_val.v.val_str->refcount = 0;
28933 break;
28935 default:
28936 break;
28941 /* Mark the generic parameters and arguments children DIEs of DIE. */
28943 static void
28944 prune_unused_types_mark_generic_parms_dies (dw_die_ref die)
28946 dw_die_ref c;
28948 if (die == NULL || die->die_child == NULL)
28949 return;
28950 c = die->die_child;
28953 if (is_template_parameter (c))
28954 prune_unused_types_mark (c, 1);
28955 c = c->die_sib;
28956 } while (c && c != die->die_child);
28959 /* Mark DIE as being used. If DOKIDS is true, then walk down
28960 to DIE's children. */
28962 static void
28963 prune_unused_types_mark (dw_die_ref die, int dokids)
28965 dw_die_ref c;
28967 if (die->die_mark == 0)
28969 /* We haven't done this node yet. Mark it as used. */
28970 die->die_mark = 1;
28971 /* If this is the DIE of a generic type instantiation,
28972 mark the children DIEs that describe its generic parms and
28973 args. */
28974 prune_unused_types_mark_generic_parms_dies (die);
28976 /* We also have to mark its parents as used.
28977 (But we don't want to mark our parent's kids due to this,
28978 unless it is a class.) */
28979 if (die->die_parent)
28980 prune_unused_types_mark (die->die_parent,
28981 class_scope_p (die->die_parent));
28983 /* Mark any referenced nodes. */
28984 prune_unused_types_walk_attribs (die);
28986 /* If this node is a specification,
28987 also mark the definition, if it exists. */
28988 if (get_AT_flag (die, DW_AT_declaration) && die->die_definition)
28989 prune_unused_types_mark (die->die_definition, 1);
28992 if (dokids && die->die_mark != 2)
28994 /* We need to walk the children, but haven't done so yet.
28995 Remember that we've walked the kids. */
28996 die->die_mark = 2;
28998 /* If this is an array type, we need to make sure our
28999 kids get marked, even if they're types. If we're
29000 breaking out types into comdat sections, do this
29001 for all type definitions. */
29002 if (die->die_tag == DW_TAG_array_type
29003 || (use_debug_types
29004 && is_type_die (die) && ! is_declaration_die (die)))
29005 FOR_EACH_CHILD (die, c, prune_unused_types_mark (c, 1));
29006 else
29007 FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
29011 /* For local classes, look if any static member functions were emitted
29012 and if so, mark them. */
29014 static void
29015 prune_unused_types_walk_local_classes (dw_die_ref die)
29017 dw_die_ref c;
29019 if (die->die_mark == 2)
29020 return;
29022 switch (die->die_tag)
29024 case DW_TAG_structure_type:
29025 case DW_TAG_union_type:
29026 case DW_TAG_class_type:
29027 break;
29029 case DW_TAG_subprogram:
29030 if (!get_AT_flag (die, DW_AT_declaration)
29031 || die->die_definition != NULL)
29032 prune_unused_types_mark (die, 1);
29033 return;
29035 default:
29036 return;
29039 /* Mark children. */
29040 FOR_EACH_CHILD (die, c, prune_unused_types_walk_local_classes (c));
29043 /* Walk the tree DIE and mark types that we actually use. */
29045 static void
29046 prune_unused_types_walk (dw_die_ref die)
29048 dw_die_ref c;
29050 /* Don't do anything if this node is already marked and
29051 children have been marked as well. */
29052 if (die->die_mark == 2)
29053 return;
29055 switch (die->die_tag)
29057 case DW_TAG_structure_type:
29058 case DW_TAG_union_type:
29059 case DW_TAG_class_type:
29060 if (die->die_perennial_p)
29061 break;
29063 for (c = die->die_parent; c; c = c->die_parent)
29064 if (c->die_tag == DW_TAG_subprogram)
29065 break;
29067 /* Finding used static member functions inside of classes
29068 is needed just for local classes, because for other classes
29069 static member function DIEs with DW_AT_specification
29070 are emitted outside of the DW_TAG_*_type. If we ever change
29071 it, we'd need to call this even for non-local classes. */
29072 if (c)
29073 prune_unused_types_walk_local_classes (die);
29075 /* It's a type node --- don't mark it. */
29076 return;
29078 case DW_TAG_const_type:
29079 case DW_TAG_packed_type:
29080 case DW_TAG_pointer_type:
29081 case DW_TAG_reference_type:
29082 case DW_TAG_rvalue_reference_type:
29083 case DW_TAG_volatile_type:
29084 case DW_TAG_typedef:
29085 case DW_TAG_array_type:
29086 case DW_TAG_interface_type:
29087 case DW_TAG_friend:
29088 case DW_TAG_enumeration_type:
29089 case DW_TAG_subroutine_type:
29090 case DW_TAG_string_type:
29091 case DW_TAG_set_type:
29092 case DW_TAG_subrange_type:
29093 case DW_TAG_ptr_to_member_type:
29094 case DW_TAG_file_type:
29095 /* Type nodes are useful only when other DIEs reference them --- don't
29096 mark them. */
29097 /* FALLTHROUGH */
29099 case DW_TAG_dwarf_procedure:
29100 /* Likewise for DWARF procedures. */
29102 if (die->die_perennial_p)
29103 break;
29105 return;
29107 default:
29108 /* Mark everything else. */
29109 break;
29112 if (die->die_mark == 0)
29114 die->die_mark = 1;
29116 /* Now, mark any dies referenced from here. */
29117 prune_unused_types_walk_attribs (die);
29120 die->die_mark = 2;
29122 /* Mark children. */
29123 FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
29126 /* Increment the string counts on strings referred to from DIE's
29127 attributes. */
29129 static void
29130 prune_unused_types_update_strings (dw_die_ref die)
29132 dw_attr_node *a;
29133 unsigned ix;
29135 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
29136 if (AT_class (a) == dw_val_class_str)
29138 struct indirect_string_node *s = a->dw_attr_val.v.val_str;
29139 s->refcount++;
29140 /* Avoid unnecessarily putting strings that are used less than
29141 twice in the hash table. */
29142 if (s->refcount
29143 == ((DEBUG_STR_SECTION_FLAGS & SECTION_MERGE) ? 1 : 2))
29145 indirect_string_node **slot
29146 = debug_str_hash->find_slot_with_hash (s->str,
29147 htab_hash_string (s->str),
29148 INSERT);
29149 gcc_assert (*slot == NULL);
29150 *slot = s;
29155 /* Mark DIE and its children as removed. */
29157 static void
29158 mark_removed (dw_die_ref die)
29160 dw_die_ref c;
29161 die->removed = true;
29162 FOR_EACH_CHILD (die, c, mark_removed (c));
29165 /* Remove from the tree DIE any dies that aren't marked. */
29167 static void
29168 prune_unused_types_prune (dw_die_ref die)
29170 dw_die_ref c;
29172 gcc_assert (die->die_mark);
29173 prune_unused_types_update_strings (die);
29175 if (! die->die_child)
29176 return;
29178 c = die->die_child;
29179 do {
29180 dw_die_ref prev = c, next;
29181 for (c = c->die_sib; ! c->die_mark; c = next)
29182 if (c == die->die_child)
29184 /* No marked children between 'prev' and the end of the list. */
29185 if (prev == c)
29186 /* No marked children at all. */
29187 die->die_child = NULL;
29188 else
29190 prev->die_sib = c->die_sib;
29191 die->die_child = prev;
29193 c->die_sib = NULL;
29194 mark_removed (c);
29195 return;
29197 else
29199 next = c->die_sib;
29200 c->die_sib = NULL;
29201 mark_removed (c);
29204 if (c != prev->die_sib)
29205 prev->die_sib = c;
29206 prune_unused_types_prune (c);
29207 } while (c != die->die_child);
29210 /* Remove dies representing declarations that we never use. */
29212 static void
29213 prune_unused_types (void)
29215 unsigned int i;
29216 limbo_die_node *node;
29217 comdat_type_node *ctnode;
29218 pubname_entry *pub;
29219 dw_die_ref base_type;
29221 #if ENABLE_ASSERT_CHECKING
29222 /* All the marks should already be clear. */
29223 verify_marks_clear (comp_unit_die ());
29224 for (node = limbo_die_list; node; node = node->next)
29225 verify_marks_clear (node->die);
29226 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29227 verify_marks_clear (ctnode->root_die);
29228 #endif /* ENABLE_ASSERT_CHECKING */
29230 /* Mark types that are used in global variables. */
29231 premark_types_used_by_global_vars ();
29233 /* Set the mark on nodes that are actually used. */
29234 prune_unused_types_walk (comp_unit_die ());
29235 for (node = limbo_die_list; node; node = node->next)
29236 prune_unused_types_walk (node->die);
29237 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29239 prune_unused_types_walk (ctnode->root_die);
29240 prune_unused_types_mark (ctnode->type_die, 1);
29243 /* Also set the mark on nodes referenced from the pubname_table. Enumerators
29244 are unusual in that they are pubnames that are the children of pubtypes.
29245 They should only be marked via their parent DW_TAG_enumeration_type die,
29246 not as roots in themselves. */
29247 FOR_EACH_VEC_ELT (*pubname_table, i, pub)
29248 if (pub->die->die_tag != DW_TAG_enumerator)
29249 prune_unused_types_mark (pub->die, 1);
29250 for (i = 0; base_types.iterate (i, &base_type); i++)
29251 prune_unused_types_mark (base_type, 1);
29253 /* For -fvar-tracking-assignments, also set the mark on nodes that could be
29254 referenced by DW_TAG_call_site DW_AT_call_origin (i.e. direct call
29255 callees). */
29256 cgraph_node *cnode;
29257 FOR_EACH_FUNCTION (cnode)
29258 if (cnode->referred_to_p (false))
29260 dw_die_ref die = lookup_decl_die (cnode->decl);
29261 if (die == NULL || die->die_mark)
29262 continue;
29263 for (cgraph_edge *e = cnode->callers; e; e = e->next_caller)
29264 if (e->caller != cnode
29265 && opt_for_fn (e->caller->decl, flag_var_tracking_assignments))
29267 prune_unused_types_mark (die, 1);
29268 break;
29272 if (debug_str_hash)
29273 debug_str_hash->empty ();
29274 if (skeleton_debug_str_hash)
29275 skeleton_debug_str_hash->empty ();
29276 prune_unused_types_prune (comp_unit_die ());
29277 for (limbo_die_node **pnode = &limbo_die_list; *pnode; )
29279 node = *pnode;
29280 if (!node->die->die_mark)
29281 *pnode = node->next;
29282 else
29284 prune_unused_types_prune (node->die);
29285 pnode = &node->next;
29288 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29289 prune_unused_types_prune (ctnode->root_die);
29291 /* Leave the marks clear. */
29292 prune_unmark_dies (comp_unit_die ());
29293 for (node = limbo_die_list; node; node = node->next)
29294 prune_unmark_dies (node->die);
29295 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29296 prune_unmark_dies (ctnode->root_die);
29299 /* Helpers to manipulate hash table of comdat type units. */
29301 struct comdat_type_hasher : nofree_ptr_hash <comdat_type_node>
29303 static inline hashval_t hash (const comdat_type_node *);
29304 static inline bool equal (const comdat_type_node *, const comdat_type_node *);
29307 inline hashval_t
29308 comdat_type_hasher::hash (const comdat_type_node *type_node)
29310 hashval_t h;
29311 memcpy (&h, type_node->signature, sizeof (h));
29312 return h;
29315 inline bool
29316 comdat_type_hasher::equal (const comdat_type_node *type_node_1,
29317 const comdat_type_node *type_node_2)
29319 return (! memcmp (type_node_1->signature, type_node_2->signature,
29320 DWARF_TYPE_SIGNATURE_SIZE));
29323 /* Move a DW_AT_{,MIPS_}linkage_name attribute just added to dw_die_ref
29324 to the location it would have been added, should we know its
29325 DECL_ASSEMBLER_NAME when we added other attributes. This will
29326 probably improve compactness of debug info, removing equivalent
29327 abbrevs, and hide any differences caused by deferring the
29328 computation of the assembler name, triggered by e.g. PCH. */
29330 static inline void
29331 move_linkage_attr (dw_die_ref die)
29333 unsigned ix = vec_safe_length (die->die_attr);
29334 dw_attr_node linkage = (*die->die_attr)[ix - 1];
29336 gcc_assert (linkage.dw_attr == DW_AT_linkage_name
29337 || linkage.dw_attr == DW_AT_MIPS_linkage_name);
29339 while (--ix > 0)
29341 dw_attr_node *prev = &(*die->die_attr)[ix - 1];
29343 if (prev->dw_attr == DW_AT_decl_line
29344 || prev->dw_attr == DW_AT_decl_column
29345 || prev->dw_attr == DW_AT_name)
29346 break;
29349 if (ix != vec_safe_length (die->die_attr) - 1)
29351 die->die_attr->pop ();
29352 die->die_attr->quick_insert (ix, linkage);
29356 /* Helper function for resolve_addr, mark DW_TAG_base_type nodes
29357 referenced from typed stack ops and count how often they are used. */
29359 static void
29360 mark_base_types (dw_loc_descr_ref loc)
29362 dw_die_ref base_type = NULL;
29364 for (; loc; loc = loc->dw_loc_next)
29366 switch (loc->dw_loc_opc)
29368 case DW_OP_regval_type:
29369 case DW_OP_deref_type:
29370 case DW_OP_GNU_regval_type:
29371 case DW_OP_GNU_deref_type:
29372 base_type = loc->dw_loc_oprnd2.v.val_die_ref.die;
29373 break;
29374 case DW_OP_convert:
29375 case DW_OP_reinterpret:
29376 case DW_OP_GNU_convert:
29377 case DW_OP_GNU_reinterpret:
29378 if (loc->dw_loc_oprnd1.val_class == dw_val_class_unsigned_const)
29379 continue;
29380 /* FALLTHRU */
29381 case DW_OP_const_type:
29382 case DW_OP_GNU_const_type:
29383 base_type = loc->dw_loc_oprnd1.v.val_die_ref.die;
29384 break;
29385 case DW_OP_entry_value:
29386 case DW_OP_GNU_entry_value:
29387 mark_base_types (loc->dw_loc_oprnd1.v.val_loc);
29388 continue;
29389 default:
29390 continue;
29392 gcc_assert (base_type->die_parent == comp_unit_die ());
29393 if (base_type->die_mark)
29394 base_type->die_mark++;
29395 else
29397 base_types.safe_push (base_type);
29398 base_type->die_mark = 1;
29403 /* Comparison function for sorting marked base types. */
29405 static int
29406 base_type_cmp (const void *x, const void *y)
29408 dw_die_ref dx = *(const dw_die_ref *) x;
29409 dw_die_ref dy = *(const dw_die_ref *) y;
29410 unsigned int byte_size1, byte_size2;
29411 unsigned int encoding1, encoding2;
29412 unsigned int align1, align2;
29413 if (dx->die_mark > dy->die_mark)
29414 return -1;
29415 if (dx->die_mark < dy->die_mark)
29416 return 1;
29417 byte_size1 = get_AT_unsigned (dx, DW_AT_byte_size);
29418 byte_size2 = get_AT_unsigned (dy, DW_AT_byte_size);
29419 if (byte_size1 < byte_size2)
29420 return 1;
29421 if (byte_size1 > byte_size2)
29422 return -1;
29423 encoding1 = get_AT_unsigned (dx, DW_AT_encoding);
29424 encoding2 = get_AT_unsigned (dy, DW_AT_encoding);
29425 if (encoding1 < encoding2)
29426 return 1;
29427 if (encoding1 > encoding2)
29428 return -1;
29429 align1 = get_AT_unsigned (dx, DW_AT_alignment);
29430 align2 = get_AT_unsigned (dy, DW_AT_alignment);
29431 if (align1 < align2)
29432 return 1;
29433 if (align1 > align2)
29434 return -1;
29435 return 0;
29438 /* Move base types marked by mark_base_types as early as possible
29439 in the CU, sorted by decreasing usage count both to make the
29440 uleb128 references as small as possible and to make sure they
29441 will have die_offset already computed by calc_die_sizes when
29442 sizes of typed stack loc ops is computed. */
29444 static void
29445 move_marked_base_types (void)
29447 unsigned int i;
29448 dw_die_ref base_type, die, c;
29450 if (base_types.is_empty ())
29451 return;
29453 /* Sort by decreasing usage count, they will be added again in that
29454 order later on. */
29455 base_types.qsort (base_type_cmp);
29456 die = comp_unit_die ();
29457 c = die->die_child;
29460 dw_die_ref prev = c;
29461 c = c->die_sib;
29462 while (c->die_mark)
29464 remove_child_with_prev (c, prev);
29465 /* As base types got marked, there must be at least
29466 one node other than DW_TAG_base_type. */
29467 gcc_assert (die->die_child != NULL);
29468 c = prev->die_sib;
29471 while (c != die->die_child);
29472 gcc_assert (die->die_child);
29473 c = die->die_child;
29474 for (i = 0; base_types.iterate (i, &base_type); i++)
29476 base_type->die_mark = 0;
29477 base_type->die_sib = c->die_sib;
29478 c->die_sib = base_type;
29479 c = base_type;
29483 /* Helper function for resolve_addr, attempt to resolve
29484 one CONST_STRING, return true if successful. Similarly verify that
29485 SYMBOL_REFs refer to variables emitted in the current CU. */
29487 static bool
29488 resolve_one_addr (rtx *addr)
29490 rtx rtl = *addr;
29492 if (GET_CODE (rtl) == CONST_STRING)
29494 size_t len = strlen (XSTR (rtl, 0)) + 1;
29495 tree t = build_string (len, XSTR (rtl, 0));
29496 tree tlen = size_int (len - 1);
29497 TREE_TYPE (t)
29498 = build_array_type (char_type_node, build_index_type (tlen));
29499 rtl = lookup_constant_def (t);
29500 if (!rtl || !MEM_P (rtl))
29501 return false;
29502 rtl = XEXP (rtl, 0);
29503 if (GET_CODE (rtl) == SYMBOL_REF
29504 && SYMBOL_REF_DECL (rtl)
29505 && !TREE_ASM_WRITTEN (SYMBOL_REF_DECL (rtl)))
29506 return false;
29507 vec_safe_push (used_rtx_array, rtl);
29508 *addr = rtl;
29509 return true;
29512 if (GET_CODE (rtl) == SYMBOL_REF
29513 && SYMBOL_REF_DECL (rtl))
29515 if (TREE_CONSTANT_POOL_ADDRESS_P (rtl))
29517 if (!TREE_ASM_WRITTEN (DECL_INITIAL (SYMBOL_REF_DECL (rtl))))
29518 return false;
29520 else if (!TREE_ASM_WRITTEN (SYMBOL_REF_DECL (rtl)))
29521 return false;
29524 if (GET_CODE (rtl) == CONST)
29526 subrtx_ptr_iterator::array_type array;
29527 FOR_EACH_SUBRTX_PTR (iter, array, &XEXP (rtl, 0), ALL)
29528 if (!resolve_one_addr (*iter))
29529 return false;
29532 return true;
29535 /* For STRING_CST, return SYMBOL_REF of its constant pool entry,
29536 if possible, and create DW_TAG_dwarf_procedure that can be referenced
29537 from DW_OP_implicit_pointer if the string hasn't been seen yet. */
29539 static rtx
29540 string_cst_pool_decl (tree t)
29542 rtx rtl = output_constant_def (t, 1);
29543 unsigned char *array;
29544 dw_loc_descr_ref l;
29545 tree decl;
29546 size_t len;
29547 dw_die_ref ref;
29549 if (!rtl || !MEM_P (rtl))
29550 return NULL_RTX;
29551 rtl = XEXP (rtl, 0);
29552 if (GET_CODE (rtl) != SYMBOL_REF
29553 || SYMBOL_REF_DECL (rtl) == NULL_TREE)
29554 return NULL_RTX;
29556 decl = SYMBOL_REF_DECL (rtl);
29557 if (!lookup_decl_die (decl))
29559 len = TREE_STRING_LENGTH (t);
29560 vec_safe_push (used_rtx_array, rtl);
29561 ref = new_die (DW_TAG_dwarf_procedure, comp_unit_die (), decl);
29562 array = ggc_vec_alloc<unsigned char> (len);
29563 memcpy (array, TREE_STRING_POINTER (t), len);
29564 l = new_loc_descr (DW_OP_implicit_value, len, 0);
29565 l->dw_loc_oprnd2.val_class = dw_val_class_vec;
29566 l->dw_loc_oprnd2.v.val_vec.length = len;
29567 l->dw_loc_oprnd2.v.val_vec.elt_size = 1;
29568 l->dw_loc_oprnd2.v.val_vec.array = array;
29569 add_AT_loc (ref, DW_AT_location, l);
29570 equate_decl_number_to_die (decl, ref);
29572 return rtl;
29575 /* Helper function of resolve_addr_in_expr. LOC is
29576 a DW_OP_addr followed by DW_OP_stack_value, either at the start
29577 of exprloc or after DW_OP_{,bit_}piece, and val_addr can't be
29578 resolved. Replace it (both DW_OP_addr and DW_OP_stack_value)
29579 with DW_OP_implicit_pointer if possible
29580 and return true, if unsuccessful, return false. */
29582 static bool
29583 optimize_one_addr_into_implicit_ptr (dw_loc_descr_ref loc)
29585 rtx rtl = loc->dw_loc_oprnd1.v.val_addr;
29586 HOST_WIDE_INT offset = 0;
29587 dw_die_ref ref = NULL;
29588 tree decl;
29590 if (GET_CODE (rtl) == CONST
29591 && GET_CODE (XEXP (rtl, 0)) == PLUS
29592 && CONST_INT_P (XEXP (XEXP (rtl, 0), 1)))
29594 offset = INTVAL (XEXP (XEXP (rtl, 0), 1));
29595 rtl = XEXP (XEXP (rtl, 0), 0);
29597 if (GET_CODE (rtl) == CONST_STRING)
29599 size_t len = strlen (XSTR (rtl, 0)) + 1;
29600 tree t = build_string (len, XSTR (rtl, 0));
29601 tree tlen = size_int (len - 1);
29603 TREE_TYPE (t)
29604 = build_array_type (char_type_node, build_index_type (tlen));
29605 rtl = string_cst_pool_decl (t);
29606 if (!rtl)
29607 return false;
29609 if (GET_CODE (rtl) == SYMBOL_REF && SYMBOL_REF_DECL (rtl))
29611 decl = SYMBOL_REF_DECL (rtl);
29612 if (VAR_P (decl) && !DECL_EXTERNAL (decl))
29614 ref = lookup_decl_die (decl);
29615 if (ref && (get_AT (ref, DW_AT_location)
29616 || get_AT (ref, DW_AT_const_value)))
29618 loc->dw_loc_opc = dwarf_OP (DW_OP_implicit_pointer);
29619 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29620 loc->dw_loc_oprnd1.val_entry = NULL;
29621 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
29622 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
29623 loc->dw_loc_next = loc->dw_loc_next->dw_loc_next;
29624 loc->dw_loc_oprnd2.v.val_int = offset;
29625 return true;
29629 return false;
29632 /* Helper function for resolve_addr, handle one location
29633 expression, return false if at least one CONST_STRING or SYMBOL_REF in
29634 the location list couldn't be resolved. */
29636 static bool
29637 resolve_addr_in_expr (dw_attr_node *a, dw_loc_descr_ref loc)
29639 dw_loc_descr_ref keep = NULL;
29640 for (dw_loc_descr_ref prev = NULL; loc; prev = loc, loc = loc->dw_loc_next)
29641 switch (loc->dw_loc_opc)
29643 case DW_OP_addr:
29644 if (!resolve_one_addr (&loc->dw_loc_oprnd1.v.val_addr))
29646 if ((prev == NULL
29647 || prev->dw_loc_opc == DW_OP_piece
29648 || prev->dw_loc_opc == DW_OP_bit_piece)
29649 && loc->dw_loc_next
29650 && loc->dw_loc_next->dw_loc_opc == DW_OP_stack_value
29651 && (!dwarf_strict || dwarf_version >= 5)
29652 && optimize_one_addr_into_implicit_ptr (loc))
29653 break;
29654 return false;
29656 break;
29657 case DW_OP_GNU_addr_index:
29658 case DW_OP_GNU_const_index:
29659 if (loc->dw_loc_opc == DW_OP_GNU_addr_index
29660 || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel))
29662 rtx rtl = loc->dw_loc_oprnd1.val_entry->addr.rtl;
29663 if (!resolve_one_addr (&rtl))
29664 return false;
29665 remove_addr_table_entry (loc->dw_loc_oprnd1.val_entry);
29666 loc->dw_loc_oprnd1.val_entry
29667 = add_addr_table_entry (rtl, ate_kind_rtx);
29669 break;
29670 case DW_OP_const4u:
29671 case DW_OP_const8u:
29672 if (loc->dtprel
29673 && !resolve_one_addr (&loc->dw_loc_oprnd1.v.val_addr))
29674 return false;
29675 break;
29676 case DW_OP_plus_uconst:
29677 if (size_of_loc_descr (loc)
29678 > size_of_int_loc_descriptor (loc->dw_loc_oprnd1.v.val_unsigned)
29680 && loc->dw_loc_oprnd1.v.val_unsigned > 0)
29682 dw_loc_descr_ref repl
29683 = int_loc_descriptor (loc->dw_loc_oprnd1.v.val_unsigned);
29684 add_loc_descr (&repl, new_loc_descr (DW_OP_plus, 0, 0));
29685 add_loc_descr (&repl, loc->dw_loc_next);
29686 *loc = *repl;
29688 break;
29689 case DW_OP_implicit_value:
29690 if (loc->dw_loc_oprnd2.val_class == dw_val_class_addr
29691 && !resolve_one_addr (&loc->dw_loc_oprnd2.v.val_addr))
29692 return false;
29693 break;
29694 case DW_OP_implicit_pointer:
29695 case DW_OP_GNU_implicit_pointer:
29696 case DW_OP_GNU_parameter_ref:
29697 case DW_OP_GNU_variable_value:
29698 if (loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
29700 dw_die_ref ref
29701 = lookup_decl_die (loc->dw_loc_oprnd1.v.val_decl_ref);
29702 if (ref == NULL)
29703 return false;
29704 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29705 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
29706 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
29708 if (loc->dw_loc_opc == DW_OP_GNU_variable_value)
29710 if (prev == NULL
29711 && loc->dw_loc_next == NULL
29712 && AT_class (a) == dw_val_class_loc)
29713 switch (a->dw_attr)
29715 /* Following attributes allow both exprloc and reference,
29716 so if the whole expression is DW_OP_GNU_variable_value
29717 alone we could transform it into reference. */
29718 case DW_AT_byte_size:
29719 case DW_AT_bit_size:
29720 case DW_AT_lower_bound:
29721 case DW_AT_upper_bound:
29722 case DW_AT_bit_stride:
29723 case DW_AT_count:
29724 case DW_AT_allocated:
29725 case DW_AT_associated:
29726 case DW_AT_byte_stride:
29727 a->dw_attr_val.val_class = dw_val_class_die_ref;
29728 a->dw_attr_val.val_entry = NULL;
29729 a->dw_attr_val.v.val_die_ref.die
29730 = loc->dw_loc_oprnd1.v.val_die_ref.die;
29731 a->dw_attr_val.v.val_die_ref.external = 0;
29732 return true;
29733 default:
29734 break;
29736 if (dwarf_strict)
29737 return false;
29739 break;
29740 case DW_OP_const_type:
29741 case DW_OP_regval_type:
29742 case DW_OP_deref_type:
29743 case DW_OP_convert:
29744 case DW_OP_reinterpret:
29745 case DW_OP_GNU_const_type:
29746 case DW_OP_GNU_regval_type:
29747 case DW_OP_GNU_deref_type:
29748 case DW_OP_GNU_convert:
29749 case DW_OP_GNU_reinterpret:
29750 while (loc->dw_loc_next
29751 && (loc->dw_loc_next->dw_loc_opc == DW_OP_convert
29752 || loc->dw_loc_next->dw_loc_opc == DW_OP_GNU_convert))
29754 dw_die_ref base1, base2;
29755 unsigned enc1, enc2, size1, size2;
29756 if (loc->dw_loc_opc == DW_OP_regval_type
29757 || loc->dw_loc_opc == DW_OP_deref_type
29758 || loc->dw_loc_opc == DW_OP_GNU_regval_type
29759 || loc->dw_loc_opc == DW_OP_GNU_deref_type)
29760 base1 = loc->dw_loc_oprnd2.v.val_die_ref.die;
29761 else if (loc->dw_loc_oprnd1.val_class
29762 == dw_val_class_unsigned_const)
29763 break;
29764 else
29765 base1 = loc->dw_loc_oprnd1.v.val_die_ref.die;
29766 if (loc->dw_loc_next->dw_loc_oprnd1.val_class
29767 == dw_val_class_unsigned_const)
29768 break;
29769 base2 = loc->dw_loc_next->dw_loc_oprnd1.v.val_die_ref.die;
29770 gcc_assert (base1->die_tag == DW_TAG_base_type
29771 && base2->die_tag == DW_TAG_base_type);
29772 enc1 = get_AT_unsigned (base1, DW_AT_encoding);
29773 enc2 = get_AT_unsigned (base2, DW_AT_encoding);
29774 size1 = get_AT_unsigned (base1, DW_AT_byte_size);
29775 size2 = get_AT_unsigned (base2, DW_AT_byte_size);
29776 if (size1 == size2
29777 && (((enc1 == DW_ATE_unsigned || enc1 == DW_ATE_signed)
29778 && (enc2 == DW_ATE_unsigned || enc2 == DW_ATE_signed)
29779 && loc != keep)
29780 || enc1 == enc2))
29782 /* Optimize away next DW_OP_convert after
29783 adjusting LOC's base type die reference. */
29784 if (loc->dw_loc_opc == DW_OP_regval_type
29785 || loc->dw_loc_opc == DW_OP_deref_type
29786 || loc->dw_loc_opc == DW_OP_GNU_regval_type
29787 || loc->dw_loc_opc == DW_OP_GNU_deref_type)
29788 loc->dw_loc_oprnd2.v.val_die_ref.die = base2;
29789 else
29790 loc->dw_loc_oprnd1.v.val_die_ref.die = base2;
29791 loc->dw_loc_next = loc->dw_loc_next->dw_loc_next;
29792 continue;
29794 /* Don't change integer DW_OP_convert after e.g. floating
29795 point typed stack entry. */
29796 else if (enc1 != DW_ATE_unsigned && enc1 != DW_ATE_signed)
29797 keep = loc->dw_loc_next;
29798 break;
29800 break;
29801 default:
29802 break;
29804 return true;
29807 /* Helper function of resolve_addr. DIE had DW_AT_location of
29808 DW_OP_addr alone, which referred to DECL in DW_OP_addr's operand
29809 and DW_OP_addr couldn't be resolved. resolve_addr has already
29810 removed the DW_AT_location attribute. This function attempts to
29811 add a new DW_AT_location attribute with DW_OP_implicit_pointer
29812 to it or DW_AT_const_value attribute, if possible. */
29814 static void
29815 optimize_location_into_implicit_ptr (dw_die_ref die, tree decl)
29817 if (!VAR_P (decl)
29818 || lookup_decl_die (decl) != die
29819 || DECL_EXTERNAL (decl)
29820 || !TREE_STATIC (decl)
29821 || DECL_INITIAL (decl) == NULL_TREE
29822 || DECL_P (DECL_INITIAL (decl))
29823 || get_AT (die, DW_AT_const_value))
29824 return;
29826 tree init = DECL_INITIAL (decl);
29827 HOST_WIDE_INT offset = 0;
29828 /* For variables that have been optimized away and thus
29829 don't have a memory location, see if we can emit
29830 DW_AT_const_value instead. */
29831 if (tree_add_const_value_attribute (die, init))
29832 return;
29833 if (dwarf_strict && dwarf_version < 5)
29834 return;
29835 /* If init is ADDR_EXPR or POINTER_PLUS_EXPR of ADDR_EXPR,
29836 and ADDR_EXPR refers to a decl that has DW_AT_location or
29837 DW_AT_const_value (but isn't addressable, otherwise
29838 resolving the original DW_OP_addr wouldn't fail), see if
29839 we can add DW_OP_implicit_pointer. */
29840 STRIP_NOPS (init);
29841 if (TREE_CODE (init) == POINTER_PLUS_EXPR
29842 && tree_fits_shwi_p (TREE_OPERAND (init, 1)))
29844 offset = tree_to_shwi (TREE_OPERAND (init, 1));
29845 init = TREE_OPERAND (init, 0);
29846 STRIP_NOPS (init);
29848 if (TREE_CODE (init) != ADDR_EXPR)
29849 return;
29850 if ((TREE_CODE (TREE_OPERAND (init, 0)) == STRING_CST
29851 && !TREE_ASM_WRITTEN (TREE_OPERAND (init, 0)))
29852 || (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL
29853 && !DECL_EXTERNAL (TREE_OPERAND (init, 0))
29854 && TREE_OPERAND (init, 0) != decl))
29856 dw_die_ref ref;
29857 dw_loc_descr_ref l;
29859 if (TREE_CODE (TREE_OPERAND (init, 0)) == STRING_CST)
29861 rtx rtl = string_cst_pool_decl (TREE_OPERAND (init, 0));
29862 if (!rtl)
29863 return;
29864 decl = SYMBOL_REF_DECL (rtl);
29866 else
29867 decl = TREE_OPERAND (init, 0);
29868 ref = lookup_decl_die (decl);
29869 if (ref == NULL
29870 || (!get_AT (ref, DW_AT_location)
29871 && !get_AT (ref, DW_AT_const_value)))
29872 return;
29873 l = new_loc_descr (dwarf_OP (DW_OP_implicit_pointer), 0, offset);
29874 l->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29875 l->dw_loc_oprnd1.v.val_die_ref.die = ref;
29876 l->dw_loc_oprnd1.v.val_die_ref.external = 0;
29877 add_AT_loc (die, DW_AT_location, l);
29881 /* Return NULL if l is a DWARF expression, or first op that is not
29882 valid DWARF expression. */
29884 static dw_loc_descr_ref
29885 non_dwarf_expression (dw_loc_descr_ref l)
29887 while (l)
29889 if (l->dw_loc_opc >= DW_OP_reg0 && l->dw_loc_opc <= DW_OP_reg31)
29890 return l;
29891 switch (l->dw_loc_opc)
29893 case DW_OP_regx:
29894 case DW_OP_implicit_value:
29895 case DW_OP_stack_value:
29896 case DW_OP_implicit_pointer:
29897 case DW_OP_GNU_implicit_pointer:
29898 case DW_OP_GNU_parameter_ref:
29899 case DW_OP_piece:
29900 case DW_OP_bit_piece:
29901 return l;
29902 default:
29903 break;
29905 l = l->dw_loc_next;
29907 return NULL;
29910 /* Return adjusted copy of EXPR:
29911 If it is empty DWARF expression, return it.
29912 If it is valid non-empty DWARF expression,
29913 return copy of EXPR with DW_OP_deref appended to it.
29914 If it is DWARF expression followed by DW_OP_reg{N,x}, return
29915 copy of the DWARF expression with DW_OP_breg{N,x} <0> appended.
29916 If it is DWARF expression followed by DW_OP_stack_value, return
29917 copy of the DWARF expression without anything appended.
29918 Otherwise, return NULL. */
29920 static dw_loc_descr_ref
29921 copy_deref_exprloc (dw_loc_descr_ref expr)
29923 dw_loc_descr_ref tail = NULL;
29925 if (expr == NULL)
29926 return NULL;
29928 dw_loc_descr_ref l = non_dwarf_expression (expr);
29929 if (l && l->dw_loc_next)
29930 return NULL;
29932 if (l)
29934 if (l->dw_loc_opc >= DW_OP_reg0 && l->dw_loc_opc <= DW_OP_reg31)
29935 tail = new_loc_descr ((enum dwarf_location_atom)
29936 (DW_OP_breg0 + (l->dw_loc_opc - DW_OP_reg0)),
29937 0, 0);
29938 else
29939 switch (l->dw_loc_opc)
29941 case DW_OP_regx:
29942 tail = new_loc_descr (DW_OP_bregx,
29943 l->dw_loc_oprnd1.v.val_unsigned, 0);
29944 break;
29945 case DW_OP_stack_value:
29946 break;
29947 default:
29948 return NULL;
29951 else
29952 tail = new_loc_descr (DW_OP_deref, 0, 0);
29954 dw_loc_descr_ref ret = NULL, *p = &ret;
29955 while (expr != l)
29957 *p = new_loc_descr (expr->dw_loc_opc, 0, 0);
29958 (*p)->dw_loc_oprnd1 = expr->dw_loc_oprnd1;
29959 (*p)->dw_loc_oprnd2 = expr->dw_loc_oprnd2;
29960 p = &(*p)->dw_loc_next;
29961 expr = expr->dw_loc_next;
29963 *p = tail;
29964 return ret;
29967 /* For DW_AT_string_length attribute with DW_OP_GNU_variable_value
29968 reference to a variable or argument, adjust it if needed and return:
29969 -1 if the DW_AT_string_length attribute and DW_AT_{string_length_,}byte_size
29970 attribute if present should be removed
29971 0 keep the attribute perhaps with minor modifications, no need to rescan
29972 1 if the attribute has been successfully adjusted. */
29974 static int
29975 optimize_string_length (dw_attr_node *a)
29977 dw_loc_descr_ref l = AT_loc (a), lv;
29978 dw_die_ref die;
29979 if (l->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
29981 tree decl = l->dw_loc_oprnd1.v.val_decl_ref;
29982 die = lookup_decl_die (decl);
29983 if (die)
29985 l->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29986 l->dw_loc_oprnd1.v.val_die_ref.die = die;
29987 l->dw_loc_oprnd1.v.val_die_ref.external = 0;
29989 else
29990 return -1;
29992 else
29993 die = l->dw_loc_oprnd1.v.val_die_ref.die;
29995 /* DWARF5 allows reference class, so we can then reference the DIE.
29996 Only do this for DW_OP_GNU_variable_value DW_OP_stack_value. */
29997 if (l->dw_loc_next != NULL && dwarf_version >= 5)
29999 a->dw_attr_val.val_class = dw_val_class_die_ref;
30000 a->dw_attr_val.val_entry = NULL;
30001 a->dw_attr_val.v.val_die_ref.die = die;
30002 a->dw_attr_val.v.val_die_ref.external = 0;
30003 return 0;
30006 dw_attr_node *av = get_AT (die, DW_AT_location);
30007 dw_loc_list_ref d;
30008 bool non_dwarf_expr = false;
30010 if (av == NULL)
30011 return dwarf_strict ? -1 : 0;
30012 switch (AT_class (av))
30014 case dw_val_class_loc_list:
30015 for (d = AT_loc_list (av); d != NULL; d = d->dw_loc_next)
30016 if (d->expr && non_dwarf_expression (d->expr))
30017 non_dwarf_expr = true;
30018 break;
30019 case dw_val_class_view_list:
30020 gcc_unreachable ();
30021 case dw_val_class_loc:
30022 lv = AT_loc (av);
30023 if (lv == NULL)
30024 return dwarf_strict ? -1 : 0;
30025 if (non_dwarf_expression (lv))
30026 non_dwarf_expr = true;
30027 break;
30028 default:
30029 return dwarf_strict ? -1 : 0;
30032 /* If it is safe to transform DW_OP_GNU_variable_value DW_OP_stack_value
30033 into DW_OP_call4 or DW_OP_GNU_variable_value into
30034 DW_OP_call4 DW_OP_deref, do so. */
30035 if (!non_dwarf_expr
30036 && (l->dw_loc_next != NULL || AT_class (av) == dw_val_class_loc))
30038 l->dw_loc_opc = DW_OP_call4;
30039 if (l->dw_loc_next)
30040 l->dw_loc_next = NULL;
30041 else
30042 l->dw_loc_next = new_loc_descr (DW_OP_deref, 0, 0);
30043 return 0;
30046 /* For DW_OP_GNU_variable_value DW_OP_stack_value, we can just
30047 copy over the DW_AT_location attribute from die to a. */
30048 if (l->dw_loc_next != NULL)
30050 a->dw_attr_val = av->dw_attr_val;
30051 return 1;
30054 dw_loc_list_ref list, *p;
30055 switch (AT_class (av))
30057 case dw_val_class_loc_list:
30058 p = &list;
30059 list = NULL;
30060 for (d = AT_loc_list (av); d != NULL; d = d->dw_loc_next)
30062 lv = copy_deref_exprloc (d->expr);
30063 if (lv)
30065 *p = new_loc_list (lv, d->begin, d->vbegin, d->end, d->vend, d->section);
30066 p = &(*p)->dw_loc_next;
30068 else if (!dwarf_strict && d->expr)
30069 return 0;
30071 if (list == NULL)
30072 return dwarf_strict ? -1 : 0;
30073 a->dw_attr_val.val_class = dw_val_class_loc_list;
30074 gen_llsym (list);
30075 *AT_loc_list_ptr (a) = list;
30076 return 1;
30077 case dw_val_class_loc:
30078 lv = copy_deref_exprloc (AT_loc (av));
30079 if (lv == NULL)
30080 return dwarf_strict ? -1 : 0;
30081 a->dw_attr_val.v.val_loc = lv;
30082 return 1;
30083 default:
30084 gcc_unreachable ();
30088 /* Resolve DW_OP_addr and DW_AT_const_value CONST_STRING arguments to
30089 an address in .rodata section if the string literal is emitted there,
30090 or remove the containing location list or replace DW_AT_const_value
30091 with DW_AT_location and empty location expression, if it isn't found
30092 in .rodata. Similarly for SYMBOL_REFs, keep only those that refer
30093 to something that has been emitted in the current CU. */
30095 static void
30096 resolve_addr (dw_die_ref die)
30098 dw_die_ref c;
30099 dw_attr_node *a;
30100 dw_loc_list_ref *curr, *start, loc;
30101 unsigned ix;
30102 bool remove_AT_byte_size = false;
30104 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30105 switch (AT_class (a))
30107 case dw_val_class_loc_list:
30108 start = curr = AT_loc_list_ptr (a);
30109 loc = *curr;
30110 gcc_assert (loc);
30111 /* The same list can be referenced more than once. See if we have
30112 already recorded the result from a previous pass. */
30113 if (loc->replaced)
30114 *curr = loc->dw_loc_next;
30115 else if (!loc->resolved_addr)
30117 /* As things stand, we do not expect or allow one die to
30118 reference a suffix of another die's location list chain.
30119 References must be identical or completely separate.
30120 There is therefore no need to cache the result of this
30121 pass on any list other than the first; doing so
30122 would lead to unnecessary writes. */
30123 while (*curr)
30125 gcc_assert (!(*curr)->replaced && !(*curr)->resolved_addr);
30126 if (!resolve_addr_in_expr (a, (*curr)->expr))
30128 dw_loc_list_ref next = (*curr)->dw_loc_next;
30129 dw_loc_descr_ref l = (*curr)->expr;
30131 if (next && (*curr)->ll_symbol)
30133 gcc_assert (!next->ll_symbol);
30134 next->ll_symbol = (*curr)->ll_symbol;
30135 next->vl_symbol = (*curr)->vl_symbol;
30137 if (dwarf_split_debug_info)
30138 remove_loc_list_addr_table_entries (l);
30139 *curr = next;
30141 else
30143 mark_base_types ((*curr)->expr);
30144 curr = &(*curr)->dw_loc_next;
30147 if (loc == *start)
30148 loc->resolved_addr = 1;
30149 else
30151 loc->replaced = 1;
30152 loc->dw_loc_next = *start;
30155 if (!*start)
30157 remove_AT (die, a->dw_attr);
30158 ix--;
30160 break;
30161 case dw_val_class_view_list:
30163 gcc_checking_assert (a->dw_attr == DW_AT_GNU_locviews);
30164 gcc_checking_assert (dwarf2out_locviews_in_attribute ());
30165 dw_val_node *llnode
30166 = view_list_to_loc_list_val_node (&a->dw_attr_val);
30167 /* If we no longer have a loclist, or it no longer needs
30168 views, drop this attribute. */
30169 if (!llnode || !llnode->v.val_loc_list->vl_symbol)
30171 remove_AT (die, a->dw_attr);
30172 ix--;
30174 break;
30176 case dw_val_class_loc:
30178 dw_loc_descr_ref l = AT_loc (a);
30179 /* DW_OP_GNU_variable_value DW_OP_stack_value or
30180 DW_OP_GNU_variable_value in DW_AT_string_length can be converted
30181 into DW_OP_call4 or DW_OP_call4 DW_OP_deref, which is standard
30182 DWARF4 unlike DW_OP_GNU_variable_value. Or for DWARF5
30183 DW_OP_GNU_variable_value DW_OP_stack_value can be replaced
30184 with DW_FORM_ref referencing the same DIE as
30185 DW_OP_GNU_variable_value used to reference. */
30186 if (a->dw_attr == DW_AT_string_length
30187 && l
30188 && l->dw_loc_opc == DW_OP_GNU_variable_value
30189 && (l->dw_loc_next == NULL
30190 || (l->dw_loc_next->dw_loc_next == NULL
30191 && l->dw_loc_next->dw_loc_opc == DW_OP_stack_value)))
30193 switch (optimize_string_length (a))
30195 case -1:
30196 remove_AT (die, a->dw_attr);
30197 ix--;
30198 /* If we drop DW_AT_string_length, we need to drop also
30199 DW_AT_{string_length_,}byte_size. */
30200 remove_AT_byte_size = true;
30201 continue;
30202 default:
30203 break;
30204 case 1:
30205 /* Even if we keep the optimized DW_AT_string_length,
30206 it might have changed AT_class, so process it again. */
30207 ix--;
30208 continue;
30211 /* For -gdwarf-2 don't attempt to optimize
30212 DW_AT_data_member_location containing
30213 DW_OP_plus_uconst - older consumers might
30214 rely on it being that op instead of a more complex,
30215 but shorter, location description. */
30216 if ((dwarf_version > 2
30217 || a->dw_attr != DW_AT_data_member_location
30218 || l == NULL
30219 || l->dw_loc_opc != DW_OP_plus_uconst
30220 || l->dw_loc_next != NULL)
30221 && !resolve_addr_in_expr (a, l))
30223 if (dwarf_split_debug_info)
30224 remove_loc_list_addr_table_entries (l);
30225 if (l != NULL
30226 && l->dw_loc_next == NULL
30227 && l->dw_loc_opc == DW_OP_addr
30228 && GET_CODE (l->dw_loc_oprnd1.v.val_addr) == SYMBOL_REF
30229 && SYMBOL_REF_DECL (l->dw_loc_oprnd1.v.val_addr)
30230 && a->dw_attr == DW_AT_location)
30232 tree decl = SYMBOL_REF_DECL (l->dw_loc_oprnd1.v.val_addr);
30233 remove_AT (die, a->dw_attr);
30234 ix--;
30235 optimize_location_into_implicit_ptr (die, decl);
30236 break;
30238 if (a->dw_attr == DW_AT_string_length)
30239 /* If we drop DW_AT_string_length, we need to drop also
30240 DW_AT_{string_length_,}byte_size. */
30241 remove_AT_byte_size = true;
30242 remove_AT (die, a->dw_attr);
30243 ix--;
30245 else
30246 mark_base_types (l);
30248 break;
30249 case dw_val_class_addr:
30250 if (a->dw_attr == DW_AT_const_value
30251 && !resolve_one_addr (&a->dw_attr_val.v.val_addr))
30253 if (AT_index (a) != NOT_INDEXED)
30254 remove_addr_table_entry (a->dw_attr_val.val_entry);
30255 remove_AT (die, a->dw_attr);
30256 ix--;
30258 if ((die->die_tag == DW_TAG_call_site
30259 && a->dw_attr == DW_AT_call_origin)
30260 || (die->die_tag == DW_TAG_GNU_call_site
30261 && a->dw_attr == DW_AT_abstract_origin))
30263 tree tdecl = SYMBOL_REF_DECL (a->dw_attr_val.v.val_addr);
30264 dw_die_ref tdie = lookup_decl_die (tdecl);
30265 dw_die_ref cdie;
30266 if (tdie == NULL
30267 && DECL_EXTERNAL (tdecl)
30268 && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE
30269 && (cdie = lookup_context_die (DECL_CONTEXT (tdecl))))
30271 dw_die_ref pdie = cdie;
30272 /* Make sure we don't add these DIEs into type units.
30273 We could emit skeleton DIEs for context (namespaces,
30274 outer structs/classes) and a skeleton DIE for the
30275 innermost context with DW_AT_signature pointing to the
30276 type unit. See PR78835. */
30277 while (pdie && pdie->die_tag != DW_TAG_type_unit)
30278 pdie = pdie->die_parent;
30279 if (pdie == NULL)
30281 /* Creating a full DIE for tdecl is overly expensive and
30282 at this point even wrong when in the LTO phase
30283 as it can end up generating new type DIEs we didn't
30284 output and thus optimize_external_refs will crash. */
30285 tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
30286 add_AT_flag (tdie, DW_AT_external, 1);
30287 add_AT_flag (tdie, DW_AT_declaration, 1);
30288 add_linkage_attr (tdie, tdecl);
30289 add_name_and_src_coords_attributes (tdie, tdecl, true);
30290 equate_decl_number_to_die (tdecl, tdie);
30293 if (tdie)
30295 a->dw_attr_val.val_class = dw_val_class_die_ref;
30296 a->dw_attr_val.v.val_die_ref.die = tdie;
30297 a->dw_attr_val.v.val_die_ref.external = 0;
30299 else
30301 if (AT_index (a) != NOT_INDEXED)
30302 remove_addr_table_entry (a->dw_attr_val.val_entry);
30303 remove_AT (die, a->dw_attr);
30304 ix--;
30307 break;
30308 default:
30309 break;
30312 if (remove_AT_byte_size)
30313 remove_AT (die, dwarf_version >= 5
30314 ? DW_AT_string_length_byte_size
30315 : DW_AT_byte_size);
30317 FOR_EACH_CHILD (die, c, resolve_addr (c));
30320 /* Helper routines for optimize_location_lists.
30321 This pass tries to share identical local lists in .debug_loc
30322 section. */
30324 /* Iteratively hash operands of LOC opcode into HSTATE. */
30326 static void
30327 hash_loc_operands (dw_loc_descr_ref loc, inchash::hash &hstate)
30329 dw_val_ref val1 = &loc->dw_loc_oprnd1;
30330 dw_val_ref val2 = &loc->dw_loc_oprnd2;
30332 switch (loc->dw_loc_opc)
30334 case DW_OP_const4u:
30335 case DW_OP_const8u:
30336 if (loc->dtprel)
30337 goto hash_addr;
30338 /* FALLTHRU */
30339 case DW_OP_const1u:
30340 case DW_OP_const1s:
30341 case DW_OP_const2u:
30342 case DW_OP_const2s:
30343 case DW_OP_const4s:
30344 case DW_OP_const8s:
30345 case DW_OP_constu:
30346 case DW_OP_consts:
30347 case DW_OP_pick:
30348 case DW_OP_plus_uconst:
30349 case DW_OP_breg0:
30350 case DW_OP_breg1:
30351 case DW_OP_breg2:
30352 case DW_OP_breg3:
30353 case DW_OP_breg4:
30354 case DW_OP_breg5:
30355 case DW_OP_breg6:
30356 case DW_OP_breg7:
30357 case DW_OP_breg8:
30358 case DW_OP_breg9:
30359 case DW_OP_breg10:
30360 case DW_OP_breg11:
30361 case DW_OP_breg12:
30362 case DW_OP_breg13:
30363 case DW_OP_breg14:
30364 case DW_OP_breg15:
30365 case DW_OP_breg16:
30366 case DW_OP_breg17:
30367 case DW_OP_breg18:
30368 case DW_OP_breg19:
30369 case DW_OP_breg20:
30370 case DW_OP_breg21:
30371 case DW_OP_breg22:
30372 case DW_OP_breg23:
30373 case DW_OP_breg24:
30374 case DW_OP_breg25:
30375 case DW_OP_breg26:
30376 case DW_OP_breg27:
30377 case DW_OP_breg28:
30378 case DW_OP_breg29:
30379 case DW_OP_breg30:
30380 case DW_OP_breg31:
30381 case DW_OP_regx:
30382 case DW_OP_fbreg:
30383 case DW_OP_piece:
30384 case DW_OP_deref_size:
30385 case DW_OP_xderef_size:
30386 hstate.add_object (val1->v.val_int);
30387 break;
30388 case DW_OP_skip:
30389 case DW_OP_bra:
30391 int offset;
30393 gcc_assert (val1->val_class == dw_val_class_loc);
30394 offset = val1->v.val_loc->dw_loc_addr - (loc->dw_loc_addr + 3);
30395 hstate.add_object (offset);
30397 break;
30398 case DW_OP_implicit_value:
30399 hstate.add_object (val1->v.val_unsigned);
30400 switch (val2->val_class)
30402 case dw_val_class_const:
30403 hstate.add_object (val2->v.val_int);
30404 break;
30405 case dw_val_class_vec:
30407 unsigned int elt_size = val2->v.val_vec.elt_size;
30408 unsigned int len = val2->v.val_vec.length;
30410 hstate.add_int (elt_size);
30411 hstate.add_int (len);
30412 hstate.add (val2->v.val_vec.array, len * elt_size);
30414 break;
30415 case dw_val_class_const_double:
30416 hstate.add_object (val2->v.val_double.low);
30417 hstate.add_object (val2->v.val_double.high);
30418 break;
30419 case dw_val_class_wide_int:
30420 hstate.add (val2->v.val_wide->get_val (),
30421 get_full_len (*val2->v.val_wide)
30422 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
30423 break;
30424 case dw_val_class_addr:
30425 inchash::add_rtx (val2->v.val_addr, hstate);
30426 break;
30427 default:
30428 gcc_unreachable ();
30430 break;
30431 case DW_OP_bregx:
30432 case DW_OP_bit_piece:
30433 hstate.add_object (val1->v.val_int);
30434 hstate.add_object (val2->v.val_int);
30435 break;
30436 case DW_OP_addr:
30437 hash_addr:
30438 if (loc->dtprel)
30440 unsigned char dtprel = 0xd1;
30441 hstate.add_object (dtprel);
30443 inchash::add_rtx (val1->v.val_addr, hstate);
30444 break;
30445 case DW_OP_GNU_addr_index:
30446 case DW_OP_GNU_const_index:
30448 if (loc->dtprel)
30450 unsigned char dtprel = 0xd1;
30451 hstate.add_object (dtprel);
30453 inchash::add_rtx (val1->val_entry->addr.rtl, hstate);
30455 break;
30456 case DW_OP_implicit_pointer:
30457 case DW_OP_GNU_implicit_pointer:
30458 hstate.add_int (val2->v.val_int);
30459 break;
30460 case DW_OP_entry_value:
30461 case DW_OP_GNU_entry_value:
30462 hstate.add_object (val1->v.val_loc);
30463 break;
30464 case DW_OP_regval_type:
30465 case DW_OP_deref_type:
30466 case DW_OP_GNU_regval_type:
30467 case DW_OP_GNU_deref_type:
30469 unsigned int byte_size
30470 = get_AT_unsigned (val2->v.val_die_ref.die, DW_AT_byte_size);
30471 unsigned int encoding
30472 = get_AT_unsigned (val2->v.val_die_ref.die, DW_AT_encoding);
30473 hstate.add_object (val1->v.val_int);
30474 hstate.add_object (byte_size);
30475 hstate.add_object (encoding);
30477 break;
30478 case DW_OP_convert:
30479 case DW_OP_reinterpret:
30480 case DW_OP_GNU_convert:
30481 case DW_OP_GNU_reinterpret:
30482 if (val1->val_class == dw_val_class_unsigned_const)
30484 hstate.add_object (val1->v.val_unsigned);
30485 break;
30487 /* FALLTHRU */
30488 case DW_OP_const_type:
30489 case DW_OP_GNU_const_type:
30491 unsigned int byte_size
30492 = get_AT_unsigned (val1->v.val_die_ref.die, DW_AT_byte_size);
30493 unsigned int encoding
30494 = get_AT_unsigned (val1->v.val_die_ref.die, DW_AT_encoding);
30495 hstate.add_object (byte_size);
30496 hstate.add_object (encoding);
30497 if (loc->dw_loc_opc != DW_OP_const_type
30498 && loc->dw_loc_opc != DW_OP_GNU_const_type)
30499 break;
30500 hstate.add_object (val2->val_class);
30501 switch (val2->val_class)
30503 case dw_val_class_const:
30504 hstate.add_object (val2->v.val_int);
30505 break;
30506 case dw_val_class_vec:
30508 unsigned int elt_size = val2->v.val_vec.elt_size;
30509 unsigned int len = val2->v.val_vec.length;
30511 hstate.add_object (elt_size);
30512 hstate.add_object (len);
30513 hstate.add (val2->v.val_vec.array, len * elt_size);
30515 break;
30516 case dw_val_class_const_double:
30517 hstate.add_object (val2->v.val_double.low);
30518 hstate.add_object (val2->v.val_double.high);
30519 break;
30520 case dw_val_class_wide_int:
30521 hstate.add (val2->v.val_wide->get_val (),
30522 get_full_len (*val2->v.val_wide)
30523 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
30524 break;
30525 default:
30526 gcc_unreachable ();
30529 break;
30531 default:
30532 /* Other codes have no operands. */
30533 break;
30537 /* Iteratively hash the whole DWARF location expression LOC into HSTATE. */
30539 static inline void
30540 hash_locs (dw_loc_descr_ref loc, inchash::hash &hstate)
30542 dw_loc_descr_ref l;
30543 bool sizes_computed = false;
30544 /* Compute sizes, so that DW_OP_skip/DW_OP_bra can be checksummed. */
30545 size_of_locs (loc);
30547 for (l = loc; l != NULL; l = l->dw_loc_next)
30549 enum dwarf_location_atom opc = l->dw_loc_opc;
30550 hstate.add_object (opc);
30551 if ((opc == DW_OP_skip || opc == DW_OP_bra) && !sizes_computed)
30553 size_of_locs (loc);
30554 sizes_computed = true;
30556 hash_loc_operands (l, hstate);
30560 /* Compute hash of the whole location list LIST_HEAD. */
30562 static inline void
30563 hash_loc_list (dw_loc_list_ref list_head)
30565 dw_loc_list_ref curr = list_head;
30566 inchash::hash hstate;
30568 for (curr = list_head; curr != NULL; curr = curr->dw_loc_next)
30570 hstate.add (curr->begin, strlen (curr->begin) + 1);
30571 hstate.add (curr->end, strlen (curr->end) + 1);
30572 hstate.add_object (curr->vbegin);
30573 hstate.add_object (curr->vend);
30574 if (curr->section)
30575 hstate.add (curr->section, strlen (curr->section) + 1);
30576 hash_locs (curr->expr, hstate);
30578 list_head->hash = hstate.end ();
30581 /* Return true if X and Y opcodes have the same operands. */
30583 static inline bool
30584 compare_loc_operands (dw_loc_descr_ref x, dw_loc_descr_ref y)
30586 dw_val_ref valx1 = &x->dw_loc_oprnd1;
30587 dw_val_ref valx2 = &x->dw_loc_oprnd2;
30588 dw_val_ref valy1 = &y->dw_loc_oprnd1;
30589 dw_val_ref valy2 = &y->dw_loc_oprnd2;
30591 switch (x->dw_loc_opc)
30593 case DW_OP_const4u:
30594 case DW_OP_const8u:
30595 if (x->dtprel)
30596 goto hash_addr;
30597 /* FALLTHRU */
30598 case DW_OP_const1u:
30599 case DW_OP_const1s:
30600 case DW_OP_const2u:
30601 case DW_OP_const2s:
30602 case DW_OP_const4s:
30603 case DW_OP_const8s:
30604 case DW_OP_constu:
30605 case DW_OP_consts:
30606 case DW_OP_pick:
30607 case DW_OP_plus_uconst:
30608 case DW_OP_breg0:
30609 case DW_OP_breg1:
30610 case DW_OP_breg2:
30611 case DW_OP_breg3:
30612 case DW_OP_breg4:
30613 case DW_OP_breg5:
30614 case DW_OP_breg6:
30615 case DW_OP_breg7:
30616 case DW_OP_breg8:
30617 case DW_OP_breg9:
30618 case DW_OP_breg10:
30619 case DW_OP_breg11:
30620 case DW_OP_breg12:
30621 case DW_OP_breg13:
30622 case DW_OP_breg14:
30623 case DW_OP_breg15:
30624 case DW_OP_breg16:
30625 case DW_OP_breg17:
30626 case DW_OP_breg18:
30627 case DW_OP_breg19:
30628 case DW_OP_breg20:
30629 case DW_OP_breg21:
30630 case DW_OP_breg22:
30631 case DW_OP_breg23:
30632 case DW_OP_breg24:
30633 case DW_OP_breg25:
30634 case DW_OP_breg26:
30635 case DW_OP_breg27:
30636 case DW_OP_breg28:
30637 case DW_OP_breg29:
30638 case DW_OP_breg30:
30639 case DW_OP_breg31:
30640 case DW_OP_regx:
30641 case DW_OP_fbreg:
30642 case DW_OP_piece:
30643 case DW_OP_deref_size:
30644 case DW_OP_xderef_size:
30645 return valx1->v.val_int == valy1->v.val_int;
30646 case DW_OP_skip:
30647 case DW_OP_bra:
30648 /* If splitting debug info, the use of DW_OP_GNU_addr_index
30649 can cause irrelevant differences in dw_loc_addr. */
30650 gcc_assert (valx1->val_class == dw_val_class_loc
30651 && valy1->val_class == dw_val_class_loc
30652 && (dwarf_split_debug_info
30653 || x->dw_loc_addr == y->dw_loc_addr));
30654 return valx1->v.val_loc->dw_loc_addr == valy1->v.val_loc->dw_loc_addr;
30655 case DW_OP_implicit_value:
30656 if (valx1->v.val_unsigned != valy1->v.val_unsigned
30657 || valx2->val_class != valy2->val_class)
30658 return false;
30659 switch (valx2->val_class)
30661 case dw_val_class_const:
30662 return valx2->v.val_int == valy2->v.val_int;
30663 case dw_val_class_vec:
30664 return valx2->v.val_vec.elt_size == valy2->v.val_vec.elt_size
30665 && valx2->v.val_vec.length == valy2->v.val_vec.length
30666 && memcmp (valx2->v.val_vec.array, valy2->v.val_vec.array,
30667 valx2->v.val_vec.elt_size
30668 * valx2->v.val_vec.length) == 0;
30669 case dw_val_class_const_double:
30670 return valx2->v.val_double.low == valy2->v.val_double.low
30671 && valx2->v.val_double.high == valy2->v.val_double.high;
30672 case dw_val_class_wide_int:
30673 return *valx2->v.val_wide == *valy2->v.val_wide;
30674 case dw_val_class_addr:
30675 return rtx_equal_p (valx2->v.val_addr, valy2->v.val_addr);
30676 default:
30677 gcc_unreachable ();
30679 case DW_OP_bregx:
30680 case DW_OP_bit_piece:
30681 return valx1->v.val_int == valy1->v.val_int
30682 && valx2->v.val_int == valy2->v.val_int;
30683 case DW_OP_addr:
30684 hash_addr:
30685 return rtx_equal_p (valx1->v.val_addr, valy1->v.val_addr);
30686 case DW_OP_GNU_addr_index:
30687 case DW_OP_GNU_const_index:
30689 rtx ax1 = valx1->val_entry->addr.rtl;
30690 rtx ay1 = valy1->val_entry->addr.rtl;
30691 return rtx_equal_p (ax1, ay1);
30693 case DW_OP_implicit_pointer:
30694 case DW_OP_GNU_implicit_pointer:
30695 return valx1->val_class == dw_val_class_die_ref
30696 && valx1->val_class == valy1->val_class
30697 && valx1->v.val_die_ref.die == valy1->v.val_die_ref.die
30698 && valx2->v.val_int == valy2->v.val_int;
30699 case DW_OP_entry_value:
30700 case DW_OP_GNU_entry_value:
30701 return compare_loc_operands (valx1->v.val_loc, valy1->v.val_loc);
30702 case DW_OP_const_type:
30703 case DW_OP_GNU_const_type:
30704 if (valx1->v.val_die_ref.die != valy1->v.val_die_ref.die
30705 || valx2->val_class != valy2->val_class)
30706 return false;
30707 switch (valx2->val_class)
30709 case dw_val_class_const:
30710 return valx2->v.val_int == valy2->v.val_int;
30711 case dw_val_class_vec:
30712 return valx2->v.val_vec.elt_size == valy2->v.val_vec.elt_size
30713 && valx2->v.val_vec.length == valy2->v.val_vec.length
30714 && memcmp (valx2->v.val_vec.array, valy2->v.val_vec.array,
30715 valx2->v.val_vec.elt_size
30716 * valx2->v.val_vec.length) == 0;
30717 case dw_val_class_const_double:
30718 return valx2->v.val_double.low == valy2->v.val_double.low
30719 && valx2->v.val_double.high == valy2->v.val_double.high;
30720 case dw_val_class_wide_int:
30721 return *valx2->v.val_wide == *valy2->v.val_wide;
30722 default:
30723 gcc_unreachable ();
30725 case DW_OP_regval_type:
30726 case DW_OP_deref_type:
30727 case DW_OP_GNU_regval_type:
30728 case DW_OP_GNU_deref_type:
30729 return valx1->v.val_int == valy1->v.val_int
30730 && valx2->v.val_die_ref.die == valy2->v.val_die_ref.die;
30731 case DW_OP_convert:
30732 case DW_OP_reinterpret:
30733 case DW_OP_GNU_convert:
30734 case DW_OP_GNU_reinterpret:
30735 if (valx1->val_class != valy1->val_class)
30736 return false;
30737 if (valx1->val_class == dw_val_class_unsigned_const)
30738 return valx1->v.val_unsigned == valy1->v.val_unsigned;
30739 return valx1->v.val_die_ref.die == valy1->v.val_die_ref.die;
30740 case DW_OP_GNU_parameter_ref:
30741 return valx1->val_class == dw_val_class_die_ref
30742 && valx1->val_class == valy1->val_class
30743 && valx1->v.val_die_ref.die == valy1->v.val_die_ref.die;
30744 default:
30745 /* Other codes have no operands. */
30746 return true;
30750 /* Return true if DWARF location expressions X and Y are the same. */
30752 static inline bool
30753 compare_locs (dw_loc_descr_ref x, dw_loc_descr_ref y)
30755 for (; x != NULL && y != NULL; x = x->dw_loc_next, y = y->dw_loc_next)
30756 if (x->dw_loc_opc != y->dw_loc_opc
30757 || x->dtprel != y->dtprel
30758 || !compare_loc_operands (x, y))
30759 break;
30760 return x == NULL && y == NULL;
30763 /* Hashtable helpers. */
30765 struct loc_list_hasher : nofree_ptr_hash <dw_loc_list_struct>
30767 static inline hashval_t hash (const dw_loc_list_struct *);
30768 static inline bool equal (const dw_loc_list_struct *,
30769 const dw_loc_list_struct *);
30772 /* Return precomputed hash of location list X. */
30774 inline hashval_t
30775 loc_list_hasher::hash (const dw_loc_list_struct *x)
30777 return x->hash;
30780 /* Return true if location lists A and B are the same. */
30782 inline bool
30783 loc_list_hasher::equal (const dw_loc_list_struct *a,
30784 const dw_loc_list_struct *b)
30786 if (a == b)
30787 return 1;
30788 if (a->hash != b->hash)
30789 return 0;
30790 for (; a != NULL && b != NULL; a = a->dw_loc_next, b = b->dw_loc_next)
30791 if (strcmp (a->begin, b->begin) != 0
30792 || strcmp (a->end, b->end) != 0
30793 || (a->section == NULL) != (b->section == NULL)
30794 || (a->section && strcmp (a->section, b->section) != 0)
30795 || a->vbegin != b->vbegin || a->vend != b->vend
30796 || !compare_locs (a->expr, b->expr))
30797 break;
30798 return a == NULL && b == NULL;
30801 typedef hash_table<loc_list_hasher> loc_list_hash_type;
30804 /* Recursively optimize location lists referenced from DIE
30805 children and share them whenever possible. */
30807 static void
30808 optimize_location_lists_1 (dw_die_ref die, loc_list_hash_type *htab)
30810 dw_die_ref c;
30811 dw_attr_node *a;
30812 unsigned ix;
30813 dw_loc_list_struct **slot;
30814 bool drop_locviews = false;
30815 bool has_locviews = false;
30817 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30818 if (AT_class (a) == dw_val_class_loc_list)
30820 dw_loc_list_ref list = AT_loc_list (a);
30821 /* TODO: perform some optimizations here, before hashing
30822 it and storing into the hash table. */
30823 hash_loc_list (list);
30824 slot = htab->find_slot_with_hash (list, list->hash, INSERT);
30825 if (*slot == NULL)
30827 *slot = list;
30828 if (loc_list_has_views (list))
30829 gcc_assert (list->vl_symbol);
30830 else if (list->vl_symbol)
30832 drop_locviews = true;
30833 list->vl_symbol = NULL;
30836 else
30838 if (list->vl_symbol && !(*slot)->vl_symbol)
30839 drop_locviews = true;
30840 a->dw_attr_val.v.val_loc_list = *slot;
30843 else if (AT_class (a) == dw_val_class_view_list)
30845 gcc_checking_assert (a->dw_attr == DW_AT_GNU_locviews);
30846 has_locviews = true;
30850 if (drop_locviews && has_locviews)
30851 remove_AT (die, DW_AT_GNU_locviews);
30853 FOR_EACH_CHILD (die, c, optimize_location_lists_1 (c, htab));
30857 /* Recursively assign each location list a unique index into the debug_addr
30858 section. */
30860 static void
30861 index_location_lists (dw_die_ref die)
30863 dw_die_ref c;
30864 dw_attr_node *a;
30865 unsigned ix;
30867 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30868 if (AT_class (a) == dw_val_class_loc_list)
30870 dw_loc_list_ref list = AT_loc_list (a);
30871 dw_loc_list_ref curr;
30872 for (curr = list; curr != NULL; curr = curr->dw_loc_next)
30874 /* Don't index an entry that has already been indexed
30875 or won't be output. */
30876 if (curr->begin_entry != NULL
30877 || skip_loc_list_entry (curr))
30878 continue;
30880 curr->begin_entry
30881 = add_addr_table_entry (xstrdup (curr->begin), ate_kind_label);
30885 FOR_EACH_CHILD (die, c, index_location_lists (c));
30888 /* Optimize location lists referenced from DIE
30889 children and share them whenever possible. */
30891 static void
30892 optimize_location_lists (dw_die_ref die)
30894 loc_list_hash_type htab (500);
30895 optimize_location_lists_1 (die, &htab);
30898 /* Traverse the limbo die list, and add parent/child links. The only
30899 dies without parents that should be here are concrete instances of
30900 inline functions, and the comp_unit_die. We can ignore the comp_unit_die.
30901 For concrete instances, we can get the parent die from the abstract
30902 instance. */
30904 static void
30905 flush_limbo_die_list (void)
30907 limbo_die_node *node;
30909 /* get_context_die calls force_decl_die, which can put new DIEs on the
30910 limbo list in LTO mode when nested functions are put in a different
30911 partition than that of their parent function. */
30912 while ((node = limbo_die_list))
30914 dw_die_ref die = node->die;
30915 limbo_die_list = node->next;
30917 if (die->die_parent == NULL)
30919 dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
30921 if (origin && origin->die_parent)
30922 add_child_die (origin->die_parent, die);
30923 else if (is_cu_die (die))
30925 else if (seen_error ())
30926 /* It's OK to be confused by errors in the input. */
30927 add_child_die (comp_unit_die (), die);
30928 else
30930 /* In certain situations, the lexical block containing a
30931 nested function can be optimized away, which results
30932 in the nested function die being orphaned. Likewise
30933 with the return type of that nested function. Force
30934 this to be a child of the containing function.
30936 It may happen that even the containing function got fully
30937 inlined and optimized out. In that case we are lost and
30938 assign the empty child. This should not be big issue as
30939 the function is likely unreachable too. */
30940 gcc_assert (node->created_for);
30942 if (DECL_P (node->created_for))
30943 origin = get_context_die (DECL_CONTEXT (node->created_for));
30944 else if (TYPE_P (node->created_for))
30945 origin = scope_die_for (node->created_for, comp_unit_die ());
30946 else
30947 origin = comp_unit_die ();
30949 add_child_die (origin, die);
30955 /* Reset DIEs so we can output them again. */
30957 static void
30958 reset_dies (dw_die_ref die)
30960 dw_die_ref c;
30962 /* Remove stuff we re-generate. */
30963 die->die_mark = 0;
30964 die->die_offset = 0;
30965 die->die_abbrev = 0;
30966 remove_AT (die, DW_AT_sibling);
30968 FOR_EACH_CHILD (die, c, reset_dies (c));
30971 /* Output stuff that dwarf requires at the end of every file,
30972 and generate the DWARF-2 debugging info. */
30974 static void
30975 dwarf2out_finish (const char *)
30977 comdat_type_node *ctnode;
30978 dw_die_ref main_comp_unit_die;
30979 unsigned char checksum[16];
30980 char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
30982 /* Flush out any latecomers to the limbo party. */
30983 flush_limbo_die_list ();
30985 if (inline_entry_data_table)
30986 gcc_assert (inline_entry_data_table->elements () == 0);
30988 if (flag_checking)
30990 verify_die (comp_unit_die ());
30991 for (limbo_die_node *node = cu_die_list; node; node = node->next)
30992 verify_die (node->die);
30995 /* We shouldn't have any symbols with delayed asm names for
30996 DIEs generated after early finish. */
30997 gcc_assert (deferred_asm_name == NULL);
30999 gen_remaining_tmpl_value_param_die_attribute ();
31001 if (flag_generate_lto || flag_generate_offload)
31003 gcc_assert (flag_fat_lto_objects || flag_generate_offload);
31005 /* Prune stuff so that dwarf2out_finish runs successfully
31006 for the fat part of the object. */
31007 reset_dies (comp_unit_die ());
31008 for (limbo_die_node *node = cu_die_list; node; node = node->next)
31009 reset_dies (node->die);
31011 hash_table<comdat_type_hasher> comdat_type_table (100);
31012 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31014 comdat_type_node **slot
31015 = comdat_type_table.find_slot (ctnode, INSERT);
31017 /* Don't reset types twice. */
31018 if (*slot != HTAB_EMPTY_ENTRY)
31019 continue;
31021 /* Add a pointer to the line table for the main compilation unit
31022 so that the debugger can make sense of DW_AT_decl_file
31023 attributes. */
31024 if (debug_info_level >= DINFO_LEVEL_TERSE)
31025 reset_dies (ctnode->root_die);
31027 *slot = ctnode;
31030 /* Reset die CU symbol so we don't output it twice. */
31031 comp_unit_die ()->die_id.die_symbol = NULL;
31033 /* Remove DW_AT_macro from the early output. */
31034 if (have_macinfo)
31035 remove_AT (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE);
31037 /* Remove indirect string decisions. */
31038 debug_str_hash->traverse<void *, reset_indirect_string> (NULL);
31041 #if ENABLE_ASSERT_CHECKING
31043 dw_die_ref die = comp_unit_die (), c;
31044 FOR_EACH_CHILD (die, c, gcc_assert (! c->die_mark));
31046 #endif
31047 resolve_addr (comp_unit_die ());
31048 move_marked_base_types ();
31050 /* Initialize sections and labels used for actual assembler output. */
31051 unsigned generation = init_sections_and_labels (false);
31053 /* Traverse the DIE's and add sibling attributes to those DIE's that
31054 have children. */
31055 add_sibling_attributes (comp_unit_die ());
31056 limbo_die_node *node;
31057 for (node = cu_die_list; node; node = node->next)
31058 add_sibling_attributes (node->die);
31059 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31060 add_sibling_attributes (ctnode->root_die);
31062 /* When splitting DWARF info, we put some attributes in the
31063 skeleton compile_unit DIE that remains in the .o, while
31064 most attributes go in the DWO compile_unit_die. */
31065 if (dwarf_split_debug_info)
31067 limbo_die_node *cu;
31068 main_comp_unit_die = gen_compile_unit_die (NULL);
31069 if (dwarf_version >= 5)
31070 main_comp_unit_die->die_tag = DW_TAG_skeleton_unit;
31071 cu = limbo_die_list;
31072 gcc_assert (cu->die == main_comp_unit_die);
31073 limbo_die_list = limbo_die_list->next;
31074 cu->next = cu_die_list;
31075 cu_die_list = cu;
31077 else
31078 main_comp_unit_die = comp_unit_die ();
31080 /* Output a terminator label for the .text section. */
31081 switch_to_section (text_section);
31082 targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
31083 if (cold_text_section)
31085 switch_to_section (cold_text_section);
31086 targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0);
31089 /* We can only use the low/high_pc attributes if all of the code was
31090 in .text. */
31091 if (!have_multiple_function_sections
31092 || (dwarf_version < 3 && dwarf_strict))
31094 /* Don't add if the CU has no associated code. */
31095 if (text_section_used)
31096 add_AT_low_high_pc (main_comp_unit_die, text_section_label,
31097 text_end_label, true);
31099 else
31101 unsigned fde_idx;
31102 dw_fde_ref fde;
31103 bool range_list_added = false;
31105 if (text_section_used)
31106 add_ranges_by_labels (main_comp_unit_die, text_section_label,
31107 text_end_label, &range_list_added, true);
31108 if (cold_text_section_used)
31109 add_ranges_by_labels (main_comp_unit_die, cold_text_section_label,
31110 cold_end_label, &range_list_added, true);
31112 FOR_EACH_VEC_ELT (*fde_vec, fde_idx, fde)
31114 if (DECL_IGNORED_P (fde->decl))
31115 continue;
31116 if (!fde->in_std_section)
31117 add_ranges_by_labels (main_comp_unit_die, fde->dw_fde_begin,
31118 fde->dw_fde_end, &range_list_added,
31119 true);
31120 if (fde->dw_fde_second_begin && !fde->second_in_std_section)
31121 add_ranges_by_labels (main_comp_unit_die, fde->dw_fde_second_begin,
31122 fde->dw_fde_second_end, &range_list_added,
31123 true);
31126 if (range_list_added)
31128 /* We need to give .debug_loc and .debug_ranges an appropriate
31129 "base address". Use zero so that these addresses become
31130 absolute. Historically, we've emitted the unexpected
31131 DW_AT_entry_pc instead of DW_AT_low_pc for this purpose.
31132 Emit both to give time for other tools to adapt. */
31133 add_AT_addr (main_comp_unit_die, DW_AT_low_pc, const0_rtx, true);
31134 if (! dwarf_strict && dwarf_version < 4)
31135 add_AT_addr (main_comp_unit_die, DW_AT_entry_pc, const0_rtx, true);
31137 add_ranges (NULL);
31141 /* AIX Assembler inserts the length, so adjust the reference to match the
31142 offset expected by debuggers. */
31143 strcpy (dl_section_ref, debug_line_section_label);
31144 if (XCOFF_DEBUGGING_INFO)
31145 strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
31147 if (debug_info_level >= DINFO_LEVEL_TERSE)
31148 add_AT_lineptr (main_comp_unit_die, DW_AT_stmt_list,
31149 dl_section_ref);
31151 if (have_macinfo)
31152 add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
31153 macinfo_section_label);
31155 if (dwarf_split_debug_info)
31157 if (have_location_lists)
31159 if (dwarf_version >= 5)
31160 add_AT_loclistsptr (comp_unit_die (), DW_AT_loclists_base,
31161 loc_section_label);
31162 /* optimize_location_lists calculates the size of the lists,
31163 so index them first, and assign indices to the entries.
31164 Although optimize_location_lists will remove entries from
31165 the table, it only does so for duplicates, and therefore
31166 only reduces ref_counts to 1. */
31167 index_location_lists (comp_unit_die ());
31170 if (addr_index_table != NULL)
31172 unsigned int index = 0;
31173 addr_index_table
31174 ->traverse_noresize<unsigned int *, index_addr_table_entry>
31175 (&index);
31179 loc_list_idx = 0;
31180 if (have_location_lists)
31182 optimize_location_lists (comp_unit_die ());
31183 /* And finally assign indexes to the entries for -gsplit-dwarf. */
31184 if (dwarf_version >= 5 && dwarf_split_debug_info)
31185 assign_location_list_indexes (comp_unit_die ());
31188 save_macinfo_strings ();
31190 if (dwarf_split_debug_info)
31192 unsigned int index = 0;
31194 /* Add attributes common to skeleton compile_units and
31195 type_units. Because these attributes include strings, it
31196 must be done before freezing the string table. Top-level
31197 skeleton die attrs are added when the skeleton type unit is
31198 created, so ensure it is created by this point. */
31199 add_top_level_skeleton_die_attrs (main_comp_unit_die);
31200 debug_str_hash->traverse_noresize<unsigned int *, index_string> (&index);
31203 /* Output all of the compilation units. We put the main one last so that
31204 the offsets are available to output_pubnames. */
31205 for (node = cu_die_list; node; node = node->next)
31206 output_comp_unit (node->die, 0, NULL);
31208 hash_table<comdat_type_hasher> comdat_type_table (100);
31209 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31211 comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);
31213 /* Don't output duplicate types. */
31214 if (*slot != HTAB_EMPTY_ENTRY)
31215 continue;
31217 /* Add a pointer to the line table for the main compilation unit
31218 so that the debugger can make sense of DW_AT_decl_file
31219 attributes. */
31220 if (debug_info_level >= DINFO_LEVEL_TERSE)
31221 add_AT_lineptr (ctnode->root_die, DW_AT_stmt_list,
31222 (!dwarf_split_debug_info
31223 ? dl_section_ref
31224 : debug_skeleton_line_section_label));
31226 output_comdat_type_unit (ctnode);
31227 *slot = ctnode;
31230 if (dwarf_split_debug_info)
31232 int mark;
31233 struct md5_ctx ctx;
31235 if (dwarf_version >= 5 && !vec_safe_is_empty (ranges_table))
31236 index_rnglists ();
31238 /* Compute a checksum of the comp_unit to use as the dwo_id. */
31239 md5_init_ctx (&ctx);
31240 mark = 0;
31241 die_checksum (comp_unit_die (), &ctx, &mark);
31242 unmark_all_dies (comp_unit_die ());
31243 md5_finish_ctx (&ctx, checksum);
31245 if (dwarf_version < 5)
31247 /* Use the first 8 bytes of the checksum as the dwo_id,
31248 and add it to both comp-unit DIEs. */
31249 add_AT_data8 (main_comp_unit_die, DW_AT_GNU_dwo_id, checksum);
31250 add_AT_data8 (comp_unit_die (), DW_AT_GNU_dwo_id, checksum);
31253 /* Add the base offset of the ranges table to the skeleton
31254 comp-unit DIE. */
31255 if (!vec_safe_is_empty (ranges_table))
31257 if (dwarf_version >= 5)
31258 add_AT_lineptr (main_comp_unit_die, DW_AT_rnglists_base,
31259 ranges_base_label);
31260 else
31261 add_AT_lineptr (main_comp_unit_die, DW_AT_GNU_ranges_base,
31262 ranges_section_label);
31265 switch_to_section (debug_addr_section);
31266 ASM_OUTPUT_LABEL (asm_out_file, debug_addr_section_label);
31267 output_addr_table ();
31270 /* Output the main compilation unit if non-empty or if .debug_macinfo
31271 or .debug_macro will be emitted. */
31272 output_comp_unit (comp_unit_die (), have_macinfo,
31273 dwarf_split_debug_info ? checksum : NULL);
31275 if (dwarf_split_debug_info && info_section_emitted)
31276 output_skeleton_debug_sections (main_comp_unit_die, checksum);
31278 /* Output the abbreviation table. */
31279 if (vec_safe_length (abbrev_die_table) != 1)
31281 switch_to_section (debug_abbrev_section);
31282 ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
31283 output_abbrev_section ();
31286 /* Output location list section if necessary. */
31287 if (have_location_lists)
31289 char l1[MAX_ARTIFICIAL_LABEL_BYTES];
31290 char l2[MAX_ARTIFICIAL_LABEL_BYTES];
31291 /* Output the location lists info. */
31292 switch_to_section (debug_loc_section);
31293 if (dwarf_version >= 5)
31295 ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 1);
31296 ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 2);
31297 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
31298 dw2_asm_output_data (4, 0xffffffff,
31299 "Initial length escape value indicating "
31300 "64-bit DWARF extension");
31301 dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
31302 "Length of Location Lists");
31303 ASM_OUTPUT_LABEL (asm_out_file, l1);
31304 output_dwarf_version ();
31305 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Address Size");
31306 dw2_asm_output_data (1, 0, "Segment Size");
31307 dw2_asm_output_data (4, dwarf_split_debug_info ? loc_list_idx : 0,
31308 "Offset Entry Count");
31310 ASM_OUTPUT_LABEL (asm_out_file, loc_section_label);
31311 if (dwarf_version >= 5 && dwarf_split_debug_info)
31313 unsigned int save_loc_list_idx = loc_list_idx;
31314 loc_list_idx = 0;
31315 output_loclists_offsets (comp_unit_die ());
31316 gcc_assert (save_loc_list_idx == loc_list_idx);
31318 output_location_lists (comp_unit_die ());
31319 if (dwarf_version >= 5)
31320 ASM_OUTPUT_LABEL (asm_out_file, l2);
31323 output_pubtables ();
31325 /* Output the address range information if a CU (.debug_info section)
31326 was emitted. We output an empty table even if we had no functions
31327 to put in it. This because the consumer has no way to tell the
31328 difference between an empty table that we omitted and failure to
31329 generate a table that would have contained data. */
31330 if (info_section_emitted)
31332 switch_to_section (debug_aranges_section);
31333 output_aranges ();
31336 /* Output ranges section if necessary. */
31337 if (!vec_safe_is_empty (ranges_table))
31339 if (dwarf_version >= 5)
31340 output_rnglists (generation);
31341 else
31342 output_ranges ();
31345 /* Have to end the macro section. */
31346 if (have_macinfo)
31348 switch_to_section (debug_macinfo_section);
31349 ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
31350 output_macinfo (!dwarf_split_debug_info ? debug_line_section_label
31351 : debug_skeleton_line_section_label, false);
31352 dw2_asm_output_data (1, 0, "End compilation unit");
31355 /* Output the source line correspondence table. We must do this
31356 even if there is no line information. Otherwise, on an empty
31357 translation unit, we will generate a present, but empty,
31358 .debug_info section. IRIX 6.5 `nm' will then complain when
31359 examining the file. This is done late so that any filenames
31360 used by the debug_info section are marked as 'used'. */
31361 switch_to_section (debug_line_section);
31362 ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
31363 if (! output_asm_line_debug_info ())
31364 output_line_info (false);
31366 if (dwarf_split_debug_info && info_section_emitted)
31368 switch_to_section (debug_skeleton_line_section);
31369 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
31370 output_line_info (true);
31373 /* If we emitted any indirect strings, output the string table too. */
31374 if (debug_str_hash || skeleton_debug_str_hash)
31375 output_indirect_strings ();
31376 if (debug_line_str_hash)
31378 switch_to_section (debug_line_str_section);
31379 const enum dwarf_form form = DW_FORM_line_strp;
31380 debug_line_str_hash->traverse<enum dwarf_form,
31381 output_indirect_string> (form);
31384 /* ??? Move lvugid out of dwarf2out_source_line and reset it too? */
31385 symview_upper_bound = 0;
31386 if (zero_view_p)
31387 bitmap_clear (zero_view_p);
31390 /* Returns a hash value for X (which really is a variable_value_struct). */
31392 inline hashval_t
31393 variable_value_hasher::hash (variable_value_struct *x)
31395 return (hashval_t) x->decl_id;
31398 /* Return nonzero if decl_id of variable_value_struct X is the same as
31399 UID of decl Y. */
31401 inline bool
31402 variable_value_hasher::equal (variable_value_struct *x, tree y)
31404 return x->decl_id == DECL_UID (y);
31407 /* Helper function for resolve_variable_value, handle
31408 DW_OP_GNU_variable_value in one location expression.
31409 Return true if exprloc has been changed into loclist. */
31411 static bool
31412 resolve_variable_value_in_expr (dw_attr_node *a, dw_loc_descr_ref loc)
31414 dw_loc_descr_ref next;
31415 for (dw_loc_descr_ref prev = NULL; loc; prev = loc, loc = next)
31417 next = loc->dw_loc_next;
31418 if (loc->dw_loc_opc != DW_OP_GNU_variable_value
31419 || loc->dw_loc_oprnd1.val_class != dw_val_class_decl_ref)
31420 continue;
31422 tree decl = loc->dw_loc_oprnd1.v.val_decl_ref;
31423 if (DECL_CONTEXT (decl) != current_function_decl)
31424 continue;
31426 dw_die_ref ref = lookup_decl_die (decl);
31427 if (ref)
31429 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31430 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31431 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31432 continue;
31434 dw_loc_list_ref l = loc_list_from_tree (decl, 0, NULL);
31435 if (l == NULL)
31436 continue;
31437 if (l->dw_loc_next)
31439 if (AT_class (a) != dw_val_class_loc)
31440 continue;
31441 switch (a->dw_attr)
31443 /* Following attributes allow both exprloc and loclist
31444 classes, so we can change them into a loclist. */
31445 case DW_AT_location:
31446 case DW_AT_string_length:
31447 case DW_AT_return_addr:
31448 case DW_AT_data_member_location:
31449 case DW_AT_frame_base:
31450 case DW_AT_segment:
31451 case DW_AT_static_link:
31452 case DW_AT_use_location:
31453 case DW_AT_vtable_elem_location:
31454 if (prev)
31456 prev->dw_loc_next = NULL;
31457 prepend_loc_descr_to_each (l, AT_loc (a));
31459 if (next)
31460 add_loc_descr_to_each (l, next);
31461 a->dw_attr_val.val_class = dw_val_class_loc_list;
31462 a->dw_attr_val.val_entry = NULL;
31463 a->dw_attr_val.v.val_loc_list = l;
31464 have_location_lists = true;
31465 return true;
31466 /* Following attributes allow both exprloc and reference,
31467 so if the whole expression is DW_OP_GNU_variable_value alone
31468 we could transform it into reference. */
31469 case DW_AT_byte_size:
31470 case DW_AT_bit_size:
31471 case DW_AT_lower_bound:
31472 case DW_AT_upper_bound:
31473 case DW_AT_bit_stride:
31474 case DW_AT_count:
31475 case DW_AT_allocated:
31476 case DW_AT_associated:
31477 case DW_AT_byte_stride:
31478 if (prev == NULL && next == NULL)
31479 break;
31480 /* FALLTHRU */
31481 default:
31482 if (dwarf_strict)
31483 continue;
31484 break;
31486 /* Create DW_TAG_variable that we can refer to. */
31487 gen_decl_die (decl, NULL_TREE, NULL,
31488 lookup_decl_die (current_function_decl));
31489 ref = lookup_decl_die (decl);
31490 if (ref)
31492 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31493 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31494 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31496 continue;
31498 if (prev)
31500 prev->dw_loc_next = l->expr;
31501 add_loc_descr (&prev->dw_loc_next, next);
31502 free_loc_descr (loc, NULL);
31503 next = prev->dw_loc_next;
31505 else
31507 memcpy (loc, l->expr, sizeof (dw_loc_descr_node));
31508 add_loc_descr (&loc, next);
31509 next = loc;
31511 loc = prev;
31513 return false;
31516 /* Attempt to resolve DW_OP_GNU_variable_value using loc_list_from_tree. */
31518 static void
31519 resolve_variable_value (dw_die_ref die)
31521 dw_attr_node *a;
31522 dw_loc_list_ref loc;
31523 unsigned ix;
31525 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
31526 switch (AT_class (a))
31528 case dw_val_class_loc:
31529 if (!resolve_variable_value_in_expr (a, AT_loc (a)))
31530 break;
31531 /* FALLTHRU */
31532 case dw_val_class_loc_list:
31533 loc = AT_loc_list (a);
31534 gcc_assert (loc);
31535 for (; loc; loc = loc->dw_loc_next)
31536 resolve_variable_value_in_expr (a, loc->expr);
31537 break;
31538 default:
31539 break;
31543 /* Attempt to optimize DW_OP_GNU_variable_value refering to
31544 temporaries in the current function. */
31546 static void
31547 resolve_variable_values (void)
31549 if (!variable_value_hash || !current_function_decl)
31550 return;
31552 struct variable_value_struct *node
31553 = variable_value_hash->find_with_hash (current_function_decl,
31554 DECL_UID (current_function_decl));
31556 if (node == NULL)
31557 return;
31559 unsigned int i;
31560 dw_die_ref die;
31561 FOR_EACH_VEC_SAFE_ELT (node->dies, i, die)
31562 resolve_variable_value (die);
31565 /* Helper function for note_variable_value, handle one location
31566 expression. */
31568 static void
31569 note_variable_value_in_expr (dw_die_ref die, dw_loc_descr_ref loc)
31571 for (; loc; loc = loc->dw_loc_next)
31572 if (loc->dw_loc_opc == DW_OP_GNU_variable_value
31573 && loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
31575 tree decl = loc->dw_loc_oprnd1.v.val_decl_ref;
31576 dw_die_ref ref = lookup_decl_die (decl);
31577 if (! ref && (flag_generate_lto || flag_generate_offload))
31579 /* ??? This is somewhat a hack because we do not create DIEs
31580 for variables not in BLOCK trees early but when generating
31581 early LTO output we need the dw_val_class_decl_ref to be
31582 fully resolved. For fat LTO objects we'd also like to
31583 undo this after LTO dwarf output. */
31584 gcc_assert (DECL_CONTEXT (decl));
31585 dw_die_ref ctx = lookup_decl_die (DECL_CONTEXT (decl));
31586 gcc_assert (ctx != NULL);
31587 gen_decl_die (decl, NULL_TREE, NULL, ctx);
31588 ref = lookup_decl_die (decl);
31589 gcc_assert (ref != NULL);
31591 if (ref)
31593 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31594 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31595 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31596 continue;
31598 if (VAR_P (decl)
31599 && DECL_CONTEXT (decl)
31600 && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
31601 && lookup_decl_die (DECL_CONTEXT (decl)))
31603 if (!variable_value_hash)
31604 variable_value_hash
31605 = hash_table<variable_value_hasher>::create_ggc (10);
31607 tree fndecl = DECL_CONTEXT (decl);
31608 struct variable_value_struct *node;
31609 struct variable_value_struct **slot
31610 = variable_value_hash->find_slot_with_hash (fndecl,
31611 DECL_UID (fndecl),
31612 INSERT);
31613 if (*slot == NULL)
31615 node = ggc_cleared_alloc<variable_value_struct> ();
31616 node->decl_id = DECL_UID (fndecl);
31617 *slot = node;
31619 else
31620 node = *slot;
31622 vec_safe_push (node->dies, die);
31627 /* Walk the tree DIE and note DIEs with DW_OP_GNU_variable_value still
31628 with dw_val_class_decl_ref operand. */
31630 static void
31631 note_variable_value (dw_die_ref die)
31633 dw_die_ref c;
31634 dw_attr_node *a;
31635 dw_loc_list_ref loc;
31636 unsigned ix;
31638 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
31639 switch (AT_class (a))
31641 case dw_val_class_loc_list:
31642 loc = AT_loc_list (a);
31643 gcc_assert (loc);
31644 if (!loc->noted_variable_value)
31646 loc->noted_variable_value = 1;
31647 for (; loc; loc = loc->dw_loc_next)
31648 note_variable_value_in_expr (die, loc->expr);
31650 break;
31651 case dw_val_class_loc:
31652 note_variable_value_in_expr (die, AT_loc (a));
31653 break;
31654 default:
31655 break;
31658 /* Mark children. */
31659 FOR_EACH_CHILD (die, c, note_variable_value (c));
31662 /* Perform any cleanups needed after the early debug generation pass
31663 has run. */
31665 static void
31666 dwarf2out_early_finish (const char *filename)
31668 set_early_dwarf s;
31670 /* PCH might result in DW_AT_producer string being restored from the
31671 header compilation, so always fill it with empty string initially
31672 and overwrite only here. */
31673 dw_attr_node *producer = get_AT (comp_unit_die (), DW_AT_producer);
31674 producer_string = gen_producer_string ();
31675 producer->dw_attr_val.v.val_str->refcount--;
31676 producer->dw_attr_val.v.val_str = find_AT_string (producer_string);
31678 /* Add the name for the main input file now. We delayed this from
31679 dwarf2out_init to avoid complications with PCH. */
31680 add_name_attribute (comp_unit_die (), remap_debug_filename (filename));
31681 add_comp_dir_attribute (comp_unit_die ());
31683 /* When emitting DWARF5 .debug_line_str, move DW_AT_name and
31684 DW_AT_comp_dir into .debug_line_str section. */
31685 if (!dwarf2out_as_loc_support
31686 && dwarf_version >= 5
31687 && DWARF5_USE_DEBUG_LINE_STR)
31689 for (int i = 0; i < 2; i++)
31691 dw_attr_node *a = get_AT (comp_unit_die (),
31692 i ? DW_AT_comp_dir : DW_AT_name);
31693 if (a == NULL
31694 || AT_class (a) != dw_val_class_str
31695 || strlen (AT_string (a)) + 1 <= DWARF_OFFSET_SIZE)
31696 continue;
31698 if (! debug_line_str_hash)
31699 debug_line_str_hash
31700 = hash_table<indirect_string_hasher>::create_ggc (10);
31702 struct indirect_string_node *node
31703 = find_AT_string_in_table (AT_string (a), debug_line_str_hash);
31704 set_indirect_string (node);
31705 node->form = DW_FORM_line_strp;
31706 a->dw_attr_val.v.val_str->refcount--;
31707 a->dw_attr_val.v.val_str = node;
31711 /* With LTO early dwarf was really finished at compile-time, so make
31712 sure to adjust the phase after annotating the LTRANS CU DIE. */
31713 if (in_lto_p)
31715 early_dwarf_finished = true;
31716 return;
31719 /* Walk through the list of incomplete types again, trying once more to
31720 emit full debugging info for them. */
31721 retry_incomplete_types ();
31723 /* The point here is to flush out the limbo list so that it is empty
31724 and we don't need to stream it for LTO. */
31725 flush_limbo_die_list ();
31727 gen_scheduled_generic_parms_dies ();
31728 gen_remaining_tmpl_value_param_die_attribute ();
31730 /* Add DW_AT_linkage_name for all deferred DIEs. */
31731 for (limbo_die_node *node = deferred_asm_name; node; node = node->next)
31733 tree decl = node->created_for;
31734 if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)
31735 /* A missing DECL_ASSEMBLER_NAME can be a constant DIE that
31736 ended up in deferred_asm_name before we knew it was
31737 constant and never written to disk. */
31738 && DECL_ASSEMBLER_NAME (decl))
31740 add_linkage_attr (node->die, decl);
31741 move_linkage_attr (node->die);
31744 deferred_asm_name = NULL;
31746 if (flag_eliminate_unused_debug_types)
31747 prune_unused_types ();
31749 /* Generate separate COMDAT sections for type DIEs. */
31750 if (use_debug_types)
31752 break_out_comdat_types (comp_unit_die ());
31754 /* Each new type_unit DIE was added to the limbo die list when created.
31755 Since these have all been added to comdat_type_list, clear the
31756 limbo die list. */
31757 limbo_die_list = NULL;
31759 /* For each new comdat type unit, copy declarations for incomplete
31760 types to make the new unit self-contained (i.e., no direct
31761 references to the main compile unit). */
31762 for (comdat_type_node *ctnode = comdat_type_list;
31763 ctnode != NULL; ctnode = ctnode->next)
31764 copy_decls_for_unworthy_types (ctnode->root_die);
31765 copy_decls_for_unworthy_types (comp_unit_die ());
31767 /* In the process of copying declarations from one unit to another,
31768 we may have left some declarations behind that are no longer
31769 referenced. Prune them. */
31770 prune_unused_types ();
31773 /* Traverse the DIE's and note DIEs with DW_OP_GNU_variable_value still
31774 with dw_val_class_decl_ref operand. */
31775 note_variable_value (comp_unit_die ());
31776 for (limbo_die_node *node = cu_die_list; node; node = node->next)
31777 note_variable_value (node->die);
31778 for (comdat_type_node *ctnode = comdat_type_list; ctnode != NULL;
31779 ctnode = ctnode->next)
31780 note_variable_value (ctnode->root_die);
31781 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31782 note_variable_value (node->die);
31784 /* The AT_pubnames attribute needs to go in all skeleton dies, including
31785 both the main_cu and all skeleton TUs. Making this call unconditional
31786 would end up either adding a second copy of the AT_pubnames attribute, or
31787 requiring a special case in add_top_level_skeleton_die_attrs. */
31788 if (!dwarf_split_debug_info)
31789 add_AT_pubnames (comp_unit_die ());
31791 /* The early debug phase is now finished. */
31792 early_dwarf_finished = true;
31794 /* Do not generate DWARF assembler now when not producing LTO bytecode. */
31795 if (!flag_generate_lto && !flag_generate_offload)
31796 return;
31798 /* Now as we are going to output for LTO initialize sections and labels
31799 to the LTO variants. We don't need a random-seed postfix as other
31800 LTO sections as linking the LTO debug sections into one in a partial
31801 link is fine. */
31802 init_sections_and_labels (true);
31804 /* The output below is modeled after dwarf2out_finish with all
31805 location related output removed and some LTO specific changes.
31806 Some refactoring might make both smaller and easier to match up. */
31808 /* Traverse the DIE's and add add sibling attributes to those DIE's
31809 that have children. */
31810 add_sibling_attributes (comp_unit_die ());
31811 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31812 add_sibling_attributes (node->die);
31813 for (comdat_type_node *ctnode = comdat_type_list;
31814 ctnode != NULL; ctnode = ctnode->next)
31815 add_sibling_attributes (ctnode->root_die);
31817 if (have_macinfo)
31818 add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
31819 macinfo_section_label);
31821 save_macinfo_strings ();
31823 if (dwarf_split_debug_info)
31825 unsigned int index = 0;
31826 debug_str_hash->traverse_noresize<unsigned int *, index_string> (&index);
31829 /* Output all of the compilation units. We put the main one last so that
31830 the offsets are available to output_pubnames. */
31831 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31832 output_comp_unit (node->die, 0, NULL);
31834 hash_table<comdat_type_hasher> comdat_type_table (100);
31835 for (comdat_type_node *ctnode = comdat_type_list;
31836 ctnode != NULL; ctnode = ctnode->next)
31838 comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);
31840 /* Don't output duplicate types. */
31841 if (*slot != HTAB_EMPTY_ENTRY)
31842 continue;
31844 /* Add a pointer to the line table for the main compilation unit
31845 so that the debugger can make sense of DW_AT_decl_file
31846 attributes. */
31847 if (debug_info_level >= DINFO_LEVEL_TERSE)
31848 add_AT_lineptr (ctnode->root_die, DW_AT_stmt_list,
31849 (!dwarf_split_debug_info
31850 ? debug_line_section_label
31851 : debug_skeleton_line_section_label));
31853 output_comdat_type_unit (ctnode);
31854 *slot = ctnode;
31857 /* Stick a unique symbol to the main debuginfo section. */
31858 compute_comp_unit_symbol (comp_unit_die ());
31860 /* Output the main compilation unit. We always need it if only for
31861 the CU symbol. */
31862 output_comp_unit (comp_unit_die (), true, NULL);
31864 /* Output the abbreviation table. */
31865 if (vec_safe_length (abbrev_die_table) != 1)
31867 switch_to_section (debug_abbrev_section);
31868 ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
31869 output_abbrev_section ();
31872 /* Have to end the macro section. */
31873 if (have_macinfo)
31875 /* We have to save macinfo state if we need to output it again
31876 for the FAT part of the object. */
31877 vec<macinfo_entry, va_gc> *saved_macinfo_table = macinfo_table;
31878 if (flag_fat_lto_objects)
31879 macinfo_table = macinfo_table->copy ();
31881 switch_to_section (debug_macinfo_section);
31882 ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
31883 output_macinfo (debug_skeleton_line_section_label, true);
31884 dw2_asm_output_data (1, 0, "End compilation unit");
31886 /* Emit a skeleton debug_line section. */
31887 switch_to_section (debug_skeleton_line_section);
31888 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
31889 output_line_info (true);
31891 if (flag_fat_lto_objects)
31893 vec_free (macinfo_table);
31894 macinfo_table = saved_macinfo_table;
31899 /* If we emitted any indirect strings, output the string table too. */
31900 if (debug_str_hash || skeleton_debug_str_hash)
31901 output_indirect_strings ();
31903 /* Switch back to the text section. */
31904 switch_to_section (text_section);
31907 /* Reset all state within dwarf2out.c so that we can rerun the compiler
31908 within the same process. For use by toplev::finalize. */
31910 void
31911 dwarf2out_c_finalize (void)
31913 last_var_location_insn = NULL;
31914 cached_next_real_insn = NULL;
31915 used_rtx_array = NULL;
31916 incomplete_types = NULL;
31917 decl_scope_table = NULL;
31918 debug_info_section = NULL;
31919 debug_skeleton_info_section = NULL;
31920 debug_abbrev_section = NULL;
31921 debug_skeleton_abbrev_section = NULL;
31922 debug_aranges_section = NULL;
31923 debug_addr_section = NULL;
31924 debug_macinfo_section = NULL;
31925 debug_line_section = NULL;
31926 debug_skeleton_line_section = NULL;
31927 debug_loc_section = NULL;
31928 debug_pubnames_section = NULL;
31929 debug_pubtypes_section = NULL;
31930 debug_str_section = NULL;
31931 debug_line_str_section = NULL;
31932 debug_str_dwo_section = NULL;
31933 debug_str_offsets_section = NULL;
31934 debug_ranges_section = NULL;
31935 debug_frame_section = NULL;
31936 fde_vec = NULL;
31937 debug_str_hash = NULL;
31938 debug_line_str_hash = NULL;
31939 skeleton_debug_str_hash = NULL;
31940 dw2_string_counter = 0;
31941 have_multiple_function_sections = false;
31942 text_section_used = false;
31943 cold_text_section_used = false;
31944 cold_text_section = NULL;
31945 current_unit_personality = NULL;
31947 early_dwarf = false;
31948 early_dwarf_finished = false;
31950 next_die_offset = 0;
31951 single_comp_unit_die = NULL;
31952 comdat_type_list = NULL;
31953 limbo_die_list = NULL;
31954 file_table = NULL;
31955 decl_die_table = NULL;
31956 common_block_die_table = NULL;
31957 decl_loc_table = NULL;
31958 call_arg_locations = NULL;
31959 call_arg_loc_last = NULL;
31960 call_site_count = -1;
31961 tail_call_site_count = -1;
31962 cached_dw_loc_list_table = NULL;
31963 abbrev_die_table = NULL;
31964 delete dwarf_proc_stack_usage_map;
31965 dwarf_proc_stack_usage_map = NULL;
31966 line_info_label_num = 0;
31967 cur_line_info_table = NULL;
31968 text_section_line_info = NULL;
31969 cold_text_section_line_info = NULL;
31970 separate_line_info = NULL;
31971 info_section_emitted = false;
31972 pubname_table = NULL;
31973 pubtype_table = NULL;
31974 macinfo_table = NULL;
31975 ranges_table = NULL;
31976 ranges_by_label = NULL;
31977 rnglist_idx = 0;
31978 have_location_lists = false;
31979 loclabel_num = 0;
31980 poc_label_num = 0;
31981 last_emitted_file = NULL;
31982 label_num = 0;
31983 tmpl_value_parm_die_table = NULL;
31984 generic_type_instances = NULL;
31985 frame_pointer_fb_offset = 0;
31986 frame_pointer_fb_offset_valid = false;
31987 base_types.release ();
31988 XDELETEVEC (producer_string);
31989 producer_string = NULL;
31992 #include "gt-dwarf2out.h"