2018-03-23 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / dwarf2out.c
blob049be713391b23be5c73e2a437481deea2c0ad3f
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 && !(early_dwarf && (flag_generate_lto || flag_generate_offload))
19882 && VAR_P (decl)
19883 && !DECL_EXTERNAL (decl)
19884 && TREE_STATIC (decl)
19885 && DECL_NAME (decl)
19886 && !DECL_HARD_REGISTER (decl)
19887 && DECL_MODE (decl) != VOIDmode)
19889 rtl = make_decl_rtl_for_debug (decl);
19890 if (!MEM_P (rtl)
19891 || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF
19892 || SYMBOL_REF_DECL (XEXP (rtl, 0)) != decl)
19893 rtl = NULL_RTX;
19896 return rtl;
19899 /* Check whether decl is a Fortran COMMON symbol. If not, NULL_TREE is
19900 returned. If so, the decl for the COMMON block is returned, and the
19901 value is the offset into the common block for the symbol. */
19903 static tree
19904 fortran_common (tree decl, HOST_WIDE_INT *value)
19906 tree val_expr, cvar;
19907 machine_mode mode;
19908 poly_int64 bitsize, bitpos;
19909 tree offset;
19910 HOST_WIDE_INT cbitpos;
19911 int unsignedp, reversep, volatilep = 0;
19913 /* If the decl isn't a VAR_DECL, or if it isn't static, or if
19914 it does not have a value (the offset into the common area), or if it
19915 is thread local (as opposed to global) then it isn't common, and shouldn't
19916 be handled as such. */
19917 if (!VAR_P (decl)
19918 || !TREE_STATIC (decl)
19919 || !DECL_HAS_VALUE_EXPR_P (decl)
19920 || !is_fortran ())
19921 return NULL_TREE;
19923 val_expr = DECL_VALUE_EXPR (decl);
19924 if (TREE_CODE (val_expr) != COMPONENT_REF)
19925 return NULL_TREE;
19927 cvar = get_inner_reference (val_expr, &bitsize, &bitpos, &offset, &mode,
19928 &unsignedp, &reversep, &volatilep);
19930 if (cvar == NULL_TREE
19931 || !VAR_P (cvar)
19932 || DECL_ARTIFICIAL (cvar)
19933 || !TREE_PUBLIC (cvar)
19934 /* We don't expect to have to cope with variable offsets,
19935 since at present all static data must have a constant size. */
19936 || !bitpos.is_constant (&cbitpos))
19937 return NULL_TREE;
19939 *value = 0;
19940 if (offset != NULL)
19942 if (!tree_fits_shwi_p (offset))
19943 return NULL_TREE;
19944 *value = tree_to_shwi (offset);
19946 if (cbitpos != 0)
19947 *value += cbitpos / BITS_PER_UNIT;
19949 return cvar;
19952 /* Generate *either* a DW_AT_location attribute or else a DW_AT_const_value
19953 data attribute for a variable or a parameter. We generate the
19954 DW_AT_const_value attribute only in those cases where the given variable
19955 or parameter does not have a true "location" either in memory or in a
19956 register. This can happen (for example) when a constant is passed as an
19957 actual argument in a call to an inline function. (It's possible that
19958 these things can crop up in other ways also.) Note that one type of
19959 constant value which can be passed into an inlined function is a constant
19960 pointer. This can happen for example if an actual argument in an inlined
19961 function call evaluates to a compile-time constant address.
19963 CACHE_P is true if it is worth caching the location list for DECL,
19964 so that future calls can reuse it rather than regenerate it from scratch.
19965 This is true for BLOCK_NONLOCALIZED_VARS in inlined subroutines,
19966 since we will need to refer to them each time the function is inlined. */
19968 static bool
19969 add_location_or_const_value_attribute (dw_die_ref die, tree decl, bool cache_p)
19971 rtx rtl;
19972 dw_loc_list_ref list;
19973 var_loc_list *loc_list;
19974 cached_dw_loc_list *cache;
19976 if (early_dwarf)
19977 return false;
19979 if (TREE_CODE (decl) == ERROR_MARK)
19980 return false;
19982 if (get_AT (die, DW_AT_location)
19983 || get_AT (die, DW_AT_const_value))
19984 return true;
19986 gcc_assert (VAR_P (decl) || TREE_CODE (decl) == PARM_DECL
19987 || TREE_CODE (decl) == RESULT_DECL);
19989 /* Try to get some constant RTL for this decl, and use that as the value of
19990 the location. */
19992 rtl = rtl_for_decl_location (decl);
19993 if (rtl && (CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING)
19994 && add_const_value_attribute (die, rtl))
19995 return true;
19997 /* See if we have single element location list that is equivalent to
19998 a constant value. That way we are better to use add_const_value_attribute
19999 rather than expanding constant value equivalent. */
20000 loc_list = lookup_decl_loc (decl);
20001 if (loc_list
20002 && loc_list->first
20003 && loc_list->first->next == NULL
20004 && NOTE_P (loc_list->first->loc)
20005 && NOTE_VAR_LOCATION (loc_list->first->loc)
20006 && NOTE_VAR_LOCATION_LOC (loc_list->first->loc))
20008 struct var_loc_node *node;
20010 node = loc_list->first;
20011 rtl = NOTE_VAR_LOCATION_LOC (node->loc);
20012 if (GET_CODE (rtl) == EXPR_LIST)
20013 rtl = XEXP (rtl, 0);
20014 if ((CONSTANT_P (rtl) || GET_CODE (rtl) == CONST_STRING)
20015 && add_const_value_attribute (die, rtl))
20016 return true;
20018 /* If this decl is from BLOCK_NONLOCALIZED_VARS, we might need its
20019 list several times. See if we've already cached the contents. */
20020 list = NULL;
20021 if (loc_list == NULL || cached_dw_loc_list_table == NULL)
20022 cache_p = false;
20023 if (cache_p)
20025 cache = cached_dw_loc_list_table->find_with_hash (decl, DECL_UID (decl));
20026 if (cache)
20027 list = cache->loc_list;
20029 if (list == NULL)
20031 list = loc_list_from_tree (decl, decl_by_reference_p (decl) ? 0 : 2,
20032 NULL);
20033 /* It is usually worth caching this result if the decl is from
20034 BLOCK_NONLOCALIZED_VARS and if the list has at least two elements. */
20035 if (cache_p && list && list->dw_loc_next)
20037 cached_dw_loc_list **slot
20038 = cached_dw_loc_list_table->find_slot_with_hash (decl,
20039 DECL_UID (decl),
20040 INSERT);
20041 cache = ggc_cleared_alloc<cached_dw_loc_list> ();
20042 cache->decl_id = DECL_UID (decl);
20043 cache->loc_list = list;
20044 *slot = cache;
20047 if (list)
20049 add_AT_location_description (die, DW_AT_location, list);
20050 return true;
20052 /* None of that worked, so it must not really have a location;
20053 try adding a constant value attribute from the DECL_INITIAL. */
20054 return tree_add_const_value_attribute_for_decl (die, decl);
20057 /* Helper function for tree_add_const_value_attribute. Natively encode
20058 initializer INIT into an array. Return true if successful. */
20060 static bool
20061 native_encode_initializer (tree init, unsigned char *array, int size)
20063 tree type;
20065 if (init == NULL_TREE)
20066 return false;
20068 STRIP_NOPS (init);
20069 switch (TREE_CODE (init))
20071 case STRING_CST:
20072 type = TREE_TYPE (init);
20073 if (TREE_CODE (type) == ARRAY_TYPE)
20075 tree enttype = TREE_TYPE (type);
20076 scalar_int_mode mode;
20078 if (!is_int_mode (TYPE_MODE (enttype), &mode)
20079 || GET_MODE_SIZE (mode) != 1)
20080 return false;
20081 if (int_size_in_bytes (type) != size)
20082 return false;
20083 if (size > TREE_STRING_LENGTH (init))
20085 memcpy (array, TREE_STRING_POINTER (init),
20086 TREE_STRING_LENGTH (init));
20087 memset (array + TREE_STRING_LENGTH (init),
20088 '\0', size - TREE_STRING_LENGTH (init));
20090 else
20091 memcpy (array, TREE_STRING_POINTER (init), size);
20092 return true;
20094 return false;
20095 case CONSTRUCTOR:
20096 type = TREE_TYPE (init);
20097 if (int_size_in_bytes (type) != size)
20098 return false;
20099 if (TREE_CODE (type) == ARRAY_TYPE)
20101 HOST_WIDE_INT min_index;
20102 unsigned HOST_WIDE_INT cnt;
20103 int curpos = 0, fieldsize;
20104 constructor_elt *ce;
20106 if (TYPE_DOMAIN (type) == NULL_TREE
20107 || !tree_fits_shwi_p (TYPE_MIN_VALUE (TYPE_DOMAIN (type))))
20108 return false;
20110 fieldsize = int_size_in_bytes (TREE_TYPE (type));
20111 if (fieldsize <= 0)
20112 return false;
20114 min_index = tree_to_shwi (TYPE_MIN_VALUE (TYPE_DOMAIN (type)));
20115 memset (array, '\0', size);
20116 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (init), cnt, ce)
20118 tree val = ce->value;
20119 tree index = ce->index;
20120 int pos = curpos;
20121 if (index && TREE_CODE (index) == RANGE_EXPR)
20122 pos = (tree_to_shwi (TREE_OPERAND (index, 0)) - min_index)
20123 * fieldsize;
20124 else if (index)
20125 pos = (tree_to_shwi (index) - min_index) * fieldsize;
20127 if (val)
20129 STRIP_NOPS (val);
20130 if (!native_encode_initializer (val, array + pos, fieldsize))
20131 return false;
20133 curpos = pos + fieldsize;
20134 if (index && TREE_CODE (index) == RANGE_EXPR)
20136 int count = tree_to_shwi (TREE_OPERAND (index, 1))
20137 - tree_to_shwi (TREE_OPERAND (index, 0));
20138 while (count-- > 0)
20140 if (val)
20141 memcpy (array + curpos, array + pos, fieldsize);
20142 curpos += fieldsize;
20145 gcc_assert (curpos <= size);
20147 return true;
20149 else if (TREE_CODE (type) == RECORD_TYPE
20150 || TREE_CODE (type) == UNION_TYPE)
20152 tree field = NULL_TREE;
20153 unsigned HOST_WIDE_INT cnt;
20154 constructor_elt *ce;
20156 if (int_size_in_bytes (type) != size)
20157 return false;
20159 if (TREE_CODE (type) == RECORD_TYPE)
20160 field = TYPE_FIELDS (type);
20162 FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (init), cnt, ce)
20164 tree val = ce->value;
20165 int pos, fieldsize;
20167 if (ce->index != 0)
20168 field = ce->index;
20170 if (val)
20171 STRIP_NOPS (val);
20173 if (field == NULL_TREE || DECL_BIT_FIELD (field))
20174 return false;
20176 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE
20177 && TYPE_DOMAIN (TREE_TYPE (field))
20178 && ! TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (field))))
20179 return false;
20180 else if (DECL_SIZE_UNIT (field) == NULL_TREE
20181 || !tree_fits_shwi_p (DECL_SIZE_UNIT (field)))
20182 return false;
20183 fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
20184 pos = int_byte_position (field);
20185 gcc_assert (pos + fieldsize <= size);
20186 if (val && fieldsize != 0
20187 && !native_encode_initializer (val, array + pos, fieldsize))
20188 return false;
20190 return true;
20192 return false;
20193 case VIEW_CONVERT_EXPR:
20194 case NON_LVALUE_EXPR:
20195 return native_encode_initializer (TREE_OPERAND (init, 0), array, size);
20196 default:
20197 return native_encode_expr (init, array, size) == size;
20201 /* Attach a DW_AT_const_value attribute to DIE. The value of the
20202 attribute is the const value T. */
20204 static bool
20205 tree_add_const_value_attribute (dw_die_ref die, tree t)
20207 tree init;
20208 tree type = TREE_TYPE (t);
20209 rtx rtl;
20211 if (!t || !TREE_TYPE (t) || TREE_TYPE (t) == error_mark_node)
20212 return false;
20214 init = t;
20215 gcc_assert (!DECL_P (init));
20217 if (TREE_CODE (init) == INTEGER_CST)
20219 if (tree_fits_uhwi_p (init))
20221 add_AT_unsigned (die, DW_AT_const_value, tree_to_uhwi (init));
20222 return true;
20224 if (tree_fits_shwi_p (init))
20226 add_AT_int (die, DW_AT_const_value, tree_to_shwi (init));
20227 return true;
20230 if (! early_dwarf)
20232 rtl = rtl_for_decl_init (init, type);
20233 if (rtl)
20234 return add_const_value_attribute (die, rtl);
20236 /* If the host and target are sane, try harder. */
20237 if (CHAR_BIT == 8 && BITS_PER_UNIT == 8
20238 && initializer_constant_valid_p (init, type))
20240 HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (init));
20241 if (size > 0 && (int) size == size)
20243 unsigned char *array = ggc_cleared_vec_alloc<unsigned char> (size);
20245 if (native_encode_initializer (init, array, size))
20247 add_AT_vec (die, DW_AT_const_value, size, 1, array);
20248 return true;
20250 ggc_free (array);
20253 return false;
20256 /* Attach a DW_AT_const_value attribute to VAR_DIE. The value of the
20257 attribute is the const value of T, where T is an integral constant
20258 variable with static storage duration
20259 (so it can't be a PARM_DECL or a RESULT_DECL). */
20261 static bool
20262 tree_add_const_value_attribute_for_decl (dw_die_ref var_die, tree decl)
20265 if (!decl
20266 || (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
20267 || (VAR_P (decl) && !TREE_STATIC (decl)))
20268 return false;
20270 if (TREE_READONLY (decl)
20271 && ! TREE_THIS_VOLATILE (decl)
20272 && DECL_INITIAL (decl))
20273 /* OK */;
20274 else
20275 return false;
20277 /* Don't add DW_AT_const_value if abstract origin already has one. */
20278 if (get_AT (var_die, DW_AT_const_value))
20279 return false;
20281 return tree_add_const_value_attribute (var_die, DECL_INITIAL (decl));
20284 /* Convert the CFI instructions for the current function into a
20285 location list. This is used for DW_AT_frame_base when we targeting
20286 a dwarf2 consumer that does not support the dwarf3
20287 DW_OP_call_frame_cfa. OFFSET is a constant to be added to all CFA
20288 expressions. */
20290 static dw_loc_list_ref
20291 convert_cfa_to_fb_loc_list (HOST_WIDE_INT offset)
20293 int ix;
20294 dw_fde_ref fde;
20295 dw_loc_list_ref list, *list_tail;
20296 dw_cfi_ref cfi;
20297 dw_cfa_location last_cfa, next_cfa;
20298 const char *start_label, *last_label, *section;
20299 dw_cfa_location remember;
20301 fde = cfun->fde;
20302 gcc_assert (fde != NULL);
20304 section = secname_for_decl (current_function_decl);
20305 list_tail = &list;
20306 list = NULL;
20308 memset (&next_cfa, 0, sizeof (next_cfa));
20309 next_cfa.reg = INVALID_REGNUM;
20310 remember = next_cfa;
20312 start_label = fde->dw_fde_begin;
20314 /* ??? Bald assumption that the CIE opcode list does not contain
20315 advance opcodes. */
20316 FOR_EACH_VEC_ELT (*cie_cfi_vec, ix, cfi)
20317 lookup_cfa_1 (cfi, &next_cfa, &remember);
20319 last_cfa = next_cfa;
20320 last_label = start_label;
20322 if (fde->dw_fde_second_begin && fde->dw_fde_switch_cfi_index == 0)
20324 /* If the first partition contained no CFI adjustments, the
20325 CIE opcodes apply to the whole first partition. */
20326 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20327 fde->dw_fde_begin, 0, fde->dw_fde_end, 0, section);
20328 list_tail =&(*list_tail)->dw_loc_next;
20329 start_label = last_label = fde->dw_fde_second_begin;
20332 FOR_EACH_VEC_SAFE_ELT (fde->dw_fde_cfi, ix, cfi)
20334 switch (cfi->dw_cfi_opc)
20336 case DW_CFA_set_loc:
20337 case DW_CFA_advance_loc1:
20338 case DW_CFA_advance_loc2:
20339 case DW_CFA_advance_loc4:
20340 if (!cfa_equal_p (&last_cfa, &next_cfa))
20342 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20343 start_label, 0, last_label, 0, section);
20345 list_tail = &(*list_tail)->dw_loc_next;
20346 last_cfa = next_cfa;
20347 start_label = last_label;
20349 last_label = cfi->dw_cfi_oprnd1.dw_cfi_addr;
20350 break;
20352 case DW_CFA_advance_loc:
20353 /* The encoding is complex enough that we should never emit this. */
20354 gcc_unreachable ();
20356 default:
20357 lookup_cfa_1 (cfi, &next_cfa, &remember);
20358 break;
20360 if (ix + 1 == fde->dw_fde_switch_cfi_index)
20362 if (!cfa_equal_p (&last_cfa, &next_cfa))
20364 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20365 start_label, 0, last_label, 0, section);
20367 list_tail = &(*list_tail)->dw_loc_next;
20368 last_cfa = next_cfa;
20369 start_label = last_label;
20371 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20372 start_label, 0, fde->dw_fde_end, 0, section);
20373 list_tail = &(*list_tail)->dw_loc_next;
20374 start_label = last_label = fde->dw_fde_second_begin;
20378 if (!cfa_equal_p (&last_cfa, &next_cfa))
20380 *list_tail = new_loc_list (build_cfa_loc (&last_cfa, offset),
20381 start_label, 0, last_label, 0, section);
20382 list_tail = &(*list_tail)->dw_loc_next;
20383 start_label = last_label;
20386 *list_tail = new_loc_list (build_cfa_loc (&next_cfa, offset),
20387 start_label, 0,
20388 fde->dw_fde_second_begin
20389 ? fde->dw_fde_second_end : fde->dw_fde_end, 0,
20390 section);
20392 maybe_gen_llsym (list);
20394 return list;
20397 /* Compute a displacement from the "steady-state frame pointer" to the
20398 frame base (often the same as the CFA), and store it in
20399 frame_pointer_fb_offset. OFFSET is added to the displacement
20400 before the latter is negated. */
20402 static void
20403 compute_frame_pointer_to_fb_displacement (poly_int64 offset)
20405 rtx reg, elim;
20407 #ifdef FRAME_POINTER_CFA_OFFSET
20408 reg = frame_pointer_rtx;
20409 offset += FRAME_POINTER_CFA_OFFSET (current_function_decl);
20410 #else
20411 reg = arg_pointer_rtx;
20412 offset += ARG_POINTER_CFA_OFFSET (current_function_decl);
20413 #endif
20415 elim = (ira_use_lra_p
20416 ? lra_eliminate_regs (reg, VOIDmode, NULL_RTX)
20417 : eliminate_regs (reg, VOIDmode, NULL_RTX));
20418 elim = strip_offset_and_add (elim, &offset);
20420 frame_pointer_fb_offset = -offset;
20422 /* ??? AVR doesn't set up valid eliminations when there is no stack frame
20423 in which to eliminate. This is because it's stack pointer isn't
20424 directly accessible as a register within the ISA. To work around
20425 this, assume that while we cannot provide a proper value for
20426 frame_pointer_fb_offset, we won't need one either. */
20427 frame_pointer_fb_offset_valid
20428 = ((SUPPORTS_STACK_ALIGNMENT
20429 && (elim == hard_frame_pointer_rtx
20430 || elim == stack_pointer_rtx))
20431 || elim == (frame_pointer_needed
20432 ? hard_frame_pointer_rtx
20433 : stack_pointer_rtx));
20436 /* Generate a DW_AT_name attribute given some string value to be included as
20437 the value of the attribute. */
20439 static void
20440 add_name_attribute (dw_die_ref die, const char *name_string)
20442 if (name_string != NULL && *name_string != 0)
20444 if (demangle_name_func)
20445 name_string = (*demangle_name_func) (name_string);
20447 add_AT_string (die, DW_AT_name, name_string);
20451 /* Retrieve the descriptive type of TYPE, if any, make sure it has a
20452 DIE and attach a DW_AT_GNAT_descriptive_type attribute to the DIE
20453 of TYPE accordingly.
20455 ??? This is a temporary measure until after we're able to generate
20456 regular DWARF for the complex Ada type system. */
20458 static void
20459 add_gnat_descriptive_type_attribute (dw_die_ref die, tree type,
20460 dw_die_ref context_die)
20462 tree dtype;
20463 dw_die_ref dtype_die;
20465 if (!lang_hooks.types.descriptive_type)
20466 return;
20468 dtype = lang_hooks.types.descriptive_type (type);
20469 if (!dtype)
20470 return;
20472 dtype_die = lookup_type_die (dtype);
20473 if (!dtype_die)
20475 gen_type_die (dtype, context_die);
20476 dtype_die = lookup_type_die (dtype);
20477 gcc_assert (dtype_die);
20480 add_AT_die_ref (die, DW_AT_GNAT_descriptive_type, dtype_die);
20483 /* Retrieve the comp_dir string suitable for use with DW_AT_comp_dir. */
20485 static const char *
20486 comp_dir_string (void)
20488 const char *wd;
20489 char *wd1;
20490 static const char *cached_wd = NULL;
20492 if (cached_wd != NULL)
20493 return cached_wd;
20495 wd = get_src_pwd ();
20496 if (wd == NULL)
20497 return NULL;
20499 if (DWARF2_DIR_SHOULD_END_WITH_SEPARATOR)
20501 int wdlen;
20503 wdlen = strlen (wd);
20504 wd1 = ggc_vec_alloc<char> (wdlen + 2);
20505 strcpy (wd1, wd);
20506 wd1 [wdlen] = DIR_SEPARATOR;
20507 wd1 [wdlen + 1] = 0;
20508 wd = wd1;
20511 cached_wd = remap_debug_filename (wd);
20512 return cached_wd;
20515 /* Generate a DW_AT_comp_dir attribute for DIE. */
20517 static void
20518 add_comp_dir_attribute (dw_die_ref die)
20520 const char * wd = comp_dir_string ();
20521 if (wd != NULL)
20522 add_AT_string (die, DW_AT_comp_dir, wd);
20525 /* Given a tree node VALUE describing a scalar attribute ATTR (i.e. a bound, a
20526 pointer computation, ...), output a representation for that bound according
20527 to the accepted FORMS (see enum dw_scalar_form) and add it to DIE. See
20528 loc_list_from_tree for the meaning of CONTEXT. */
20530 static void
20531 add_scalar_info (dw_die_ref die, enum dwarf_attribute attr, tree value,
20532 int forms, struct loc_descr_context *context)
20534 dw_die_ref context_die, decl_die;
20535 dw_loc_list_ref list;
20536 bool strip_conversions = true;
20537 bool placeholder_seen = false;
20539 while (strip_conversions)
20540 switch (TREE_CODE (value))
20542 case ERROR_MARK:
20543 case SAVE_EXPR:
20544 return;
20546 CASE_CONVERT:
20547 case VIEW_CONVERT_EXPR:
20548 value = TREE_OPERAND (value, 0);
20549 break;
20551 default:
20552 strip_conversions = false;
20553 break;
20556 /* If possible and permitted, output the attribute as a constant. */
20557 if ((forms & dw_scalar_form_constant) != 0
20558 && TREE_CODE (value) == INTEGER_CST)
20560 unsigned int prec = simple_type_size_in_bits (TREE_TYPE (value));
20562 /* If HOST_WIDE_INT is big enough then represent the bound as
20563 a constant value. We need to choose a form based on
20564 whether the type is signed or unsigned. We cannot just
20565 call add_AT_unsigned if the value itself is positive
20566 (add_AT_unsigned might add the unsigned value encoded as
20567 DW_FORM_data[1248]). Some DWARF consumers will lookup the
20568 bounds type and then sign extend any unsigned values found
20569 for signed types. This is needed only for
20570 DW_AT_{lower,upper}_bound, since for most other attributes,
20571 consumers will treat DW_FORM_data[1248] as unsigned values,
20572 regardless of the underlying type. */
20573 if (prec <= HOST_BITS_PER_WIDE_INT
20574 || tree_fits_uhwi_p (value))
20576 if (TYPE_UNSIGNED (TREE_TYPE (value)))
20577 add_AT_unsigned (die, attr, TREE_INT_CST_LOW (value));
20578 else
20579 add_AT_int (die, attr, TREE_INT_CST_LOW (value));
20581 else
20582 /* Otherwise represent the bound as an unsigned value with
20583 the precision of its type. The precision and signedness
20584 of the type will be necessary to re-interpret it
20585 unambiguously. */
20586 add_AT_wide (die, attr, wi::to_wide (value));
20587 return;
20590 /* Otherwise, if it's possible and permitted too, output a reference to
20591 another DIE. */
20592 if ((forms & dw_scalar_form_reference) != 0)
20594 tree decl = NULL_TREE;
20596 /* Some type attributes reference an outer type. For instance, the upper
20597 bound of an array may reference an embedding record (this happens in
20598 Ada). */
20599 if (TREE_CODE (value) == COMPONENT_REF
20600 && TREE_CODE (TREE_OPERAND (value, 0)) == PLACEHOLDER_EXPR
20601 && TREE_CODE (TREE_OPERAND (value, 1)) == FIELD_DECL)
20602 decl = TREE_OPERAND (value, 1);
20604 else if (VAR_P (value)
20605 || TREE_CODE (value) == PARM_DECL
20606 || TREE_CODE (value) == RESULT_DECL)
20607 decl = value;
20609 if (decl != NULL_TREE)
20611 dw_die_ref decl_die = lookup_decl_die (decl);
20613 /* ??? Can this happen, or should the variable have been bound
20614 first? Probably it can, since I imagine that we try to create
20615 the types of parameters in the order in which they exist in
20616 the list, and won't have created a forward reference to a
20617 later parameter. */
20618 if (decl_die != NULL)
20620 add_AT_die_ref (die, attr, decl_die);
20621 return;
20626 /* Last chance: try to create a stack operation procedure to evaluate the
20627 value. Do nothing if even that is not possible or permitted. */
20628 if ((forms & dw_scalar_form_exprloc) == 0)
20629 return;
20631 list = loc_list_from_tree (value, 2, context);
20632 if (context && context->placeholder_arg)
20634 placeholder_seen = context->placeholder_seen;
20635 context->placeholder_seen = false;
20637 if (list == NULL || single_element_loc_list_p (list))
20639 /* If this attribute is not a reference nor constant, it is
20640 a DWARF expression rather than location description. For that
20641 loc_list_from_tree (value, 0, &context) is needed. */
20642 dw_loc_list_ref list2 = loc_list_from_tree (value, 0, context);
20643 if (list2 && single_element_loc_list_p (list2))
20645 if (placeholder_seen)
20647 struct dwarf_procedure_info dpi;
20648 dpi.fndecl = NULL_TREE;
20649 dpi.args_count = 1;
20650 if (!resolve_args_picking (list2->expr, 1, &dpi))
20651 return;
20653 add_AT_loc (die, attr, list2->expr);
20654 return;
20658 /* If that failed to give a single element location list, fall back to
20659 outputting this as a reference... still if permitted. */
20660 if (list == NULL
20661 || (forms & dw_scalar_form_reference) == 0
20662 || placeholder_seen)
20663 return;
20665 if (current_function_decl == 0)
20666 context_die = comp_unit_die ();
20667 else
20668 context_die = lookup_decl_die (current_function_decl);
20670 decl_die = new_die (DW_TAG_variable, context_die, value);
20671 add_AT_flag (decl_die, DW_AT_artificial, 1);
20672 add_type_attribute (decl_die, TREE_TYPE (value), TYPE_QUAL_CONST, false,
20673 context_die);
20674 add_AT_location_description (decl_die, DW_AT_location, list);
20675 add_AT_die_ref (die, attr, decl_die);
20678 /* Return the default for DW_AT_lower_bound, or -1 if there is not any
20679 default. */
20681 static int
20682 lower_bound_default (void)
20684 switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
20686 case DW_LANG_C:
20687 case DW_LANG_C89:
20688 case DW_LANG_C99:
20689 case DW_LANG_C11:
20690 case DW_LANG_C_plus_plus:
20691 case DW_LANG_C_plus_plus_11:
20692 case DW_LANG_C_plus_plus_14:
20693 case DW_LANG_ObjC:
20694 case DW_LANG_ObjC_plus_plus:
20695 return 0;
20696 case DW_LANG_Fortran77:
20697 case DW_LANG_Fortran90:
20698 case DW_LANG_Fortran95:
20699 case DW_LANG_Fortran03:
20700 case DW_LANG_Fortran08:
20701 return 1;
20702 case DW_LANG_UPC:
20703 case DW_LANG_D:
20704 case DW_LANG_Python:
20705 return dwarf_version >= 4 ? 0 : -1;
20706 case DW_LANG_Ada95:
20707 case DW_LANG_Ada83:
20708 case DW_LANG_Cobol74:
20709 case DW_LANG_Cobol85:
20710 case DW_LANG_Modula2:
20711 case DW_LANG_PLI:
20712 return dwarf_version >= 4 ? 1 : -1;
20713 default:
20714 return -1;
20718 /* Given a tree node describing an array bound (either lower or upper) output
20719 a representation for that bound. */
20721 static void
20722 add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr,
20723 tree bound, struct loc_descr_context *context)
20725 int dflt;
20727 while (1)
20728 switch (TREE_CODE (bound))
20730 /* Strip all conversions. */
20731 CASE_CONVERT:
20732 case VIEW_CONVERT_EXPR:
20733 bound = TREE_OPERAND (bound, 0);
20734 break;
20736 /* All fixed-bounds are represented by INTEGER_CST nodes. Lower bounds
20737 are even omitted when they are the default. */
20738 case INTEGER_CST:
20739 /* If the value for this bound is the default one, we can even omit the
20740 attribute. */
20741 if (bound_attr == DW_AT_lower_bound
20742 && tree_fits_shwi_p (bound)
20743 && (dflt = lower_bound_default ()) != -1
20744 && tree_to_shwi (bound) == dflt)
20745 return;
20747 /* FALLTHRU */
20749 default:
20750 /* Because of the complex interaction there can be with other GNAT
20751 encodings, GDB isn't ready yet to handle proper DWARF description
20752 for self-referencial subrange bounds: let GNAT encodings do the
20753 magic in such a case. */
20754 if (is_ada ()
20755 && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL
20756 && contains_placeholder_p (bound))
20757 return;
20759 add_scalar_info (subrange_die, bound_attr, bound,
20760 dw_scalar_form_constant
20761 | dw_scalar_form_exprloc
20762 | dw_scalar_form_reference,
20763 context);
20764 return;
20768 /* Add subscript info to TYPE_DIE, describing an array TYPE, collapsing
20769 possibly nested array subscripts in a flat sequence if COLLAPSE_P is true.
20770 Note that the block of subscript information for an array type also
20771 includes information about the element type of the given array type.
20773 This function reuses previously set type and bound information if
20774 available. */
20776 static void
20777 add_subscript_info (dw_die_ref type_die, tree type, bool collapse_p)
20779 unsigned dimension_number;
20780 tree lower, upper;
20781 dw_die_ref child = type_die->die_child;
20783 for (dimension_number = 0;
20784 TREE_CODE (type) == ARRAY_TYPE && (dimension_number == 0 || collapse_p);
20785 type = TREE_TYPE (type), dimension_number++)
20787 tree domain = TYPE_DOMAIN (type);
20789 if (TYPE_STRING_FLAG (type) && is_fortran () && dimension_number > 0)
20790 break;
20792 /* Arrays come in three flavors: Unspecified bounds, fixed bounds,
20793 and (in GNU C only) variable bounds. Handle all three forms
20794 here. */
20796 /* Find and reuse a previously generated DW_TAG_subrange_type if
20797 available.
20799 For multi-dimensional arrays, as we iterate through the
20800 various dimensions in the enclosing for loop above, we also
20801 iterate through the DIE children and pick at each
20802 DW_TAG_subrange_type previously generated (if available).
20803 Each child DW_TAG_subrange_type DIE describes the range of
20804 the current dimension. At this point we should have as many
20805 DW_TAG_subrange_type's as we have dimensions in the
20806 array. */
20807 dw_die_ref subrange_die = NULL;
20808 if (child)
20809 while (1)
20811 child = child->die_sib;
20812 if (child->die_tag == DW_TAG_subrange_type)
20813 subrange_die = child;
20814 if (child == type_die->die_child)
20816 /* If we wrapped around, stop looking next time. */
20817 child = NULL;
20818 break;
20820 if (child->die_tag == DW_TAG_subrange_type)
20821 break;
20823 if (!subrange_die)
20824 subrange_die = new_die (DW_TAG_subrange_type, type_die, NULL);
20826 if (domain)
20828 /* We have an array type with specified bounds. */
20829 lower = TYPE_MIN_VALUE (domain);
20830 upper = TYPE_MAX_VALUE (domain);
20832 /* Define the index type. */
20833 if (TREE_TYPE (domain)
20834 && !get_AT (subrange_die, DW_AT_type))
20836 /* ??? This is probably an Ada unnamed subrange type. Ignore the
20837 TREE_TYPE field. We can't emit debug info for this
20838 because it is an unnamed integral type. */
20839 if (TREE_CODE (domain) == INTEGER_TYPE
20840 && TYPE_NAME (domain) == NULL_TREE
20841 && TREE_CODE (TREE_TYPE (domain)) == INTEGER_TYPE
20842 && TYPE_NAME (TREE_TYPE (domain)) == NULL_TREE)
20844 else
20845 add_type_attribute (subrange_die, TREE_TYPE (domain),
20846 TYPE_UNQUALIFIED, false, type_die);
20849 /* ??? If upper is NULL, the array has unspecified length,
20850 but it does have a lower bound. This happens with Fortran
20851 dimension arr(N:*)
20852 Since the debugger is definitely going to need to know N
20853 to produce useful results, go ahead and output the lower
20854 bound solo, and hope the debugger can cope. */
20856 if (!get_AT (subrange_die, DW_AT_lower_bound))
20857 add_bound_info (subrange_die, DW_AT_lower_bound, lower, NULL);
20858 if (upper && !get_AT (subrange_die, DW_AT_upper_bound))
20859 add_bound_info (subrange_die, DW_AT_upper_bound, upper, NULL);
20862 /* Otherwise we have an array type with an unspecified length. The
20863 DWARF-2 spec does not say how to handle this; let's just leave out the
20864 bounds. */
20868 /* Add a DW_AT_byte_size attribute to DIE with TREE_NODE's size. */
20870 static void
20871 add_byte_size_attribute (dw_die_ref die, tree tree_node)
20873 dw_die_ref decl_die;
20874 HOST_WIDE_INT size;
20875 dw_loc_descr_ref size_expr = NULL;
20877 switch (TREE_CODE (tree_node))
20879 case ERROR_MARK:
20880 size = 0;
20881 break;
20882 case ENUMERAL_TYPE:
20883 case RECORD_TYPE:
20884 case UNION_TYPE:
20885 case QUAL_UNION_TYPE:
20886 if (TREE_CODE (TYPE_SIZE_UNIT (tree_node)) == VAR_DECL
20887 && (decl_die = lookup_decl_die (TYPE_SIZE_UNIT (tree_node))))
20889 add_AT_die_ref (die, DW_AT_byte_size, decl_die);
20890 return;
20892 size_expr = type_byte_size (tree_node, &size);
20893 break;
20894 case FIELD_DECL:
20895 /* For a data member of a struct or union, the DW_AT_byte_size is
20896 generally given as the number of bytes normally allocated for an
20897 object of the *declared* type of the member itself. This is true
20898 even for bit-fields. */
20899 size = int_size_in_bytes (field_type (tree_node));
20900 break;
20901 default:
20902 gcc_unreachable ();
20905 /* Support for dynamically-sized objects was introduced by DWARFv3.
20906 At the moment, GDB does not handle variable byte sizes very well,
20907 though. */
20908 if ((dwarf_version >= 3 || !dwarf_strict)
20909 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL
20910 && size_expr != NULL)
20911 add_AT_loc (die, DW_AT_byte_size, size_expr);
20913 /* Note that `size' might be -1 when we get to this point. If it is, that
20914 indicates that the byte size of the entity in question is variable and
20915 that we could not generate a DWARF expression that computes it. */
20916 if (size >= 0)
20917 add_AT_unsigned (die, DW_AT_byte_size, size);
20920 /* Add a DW_AT_alignment attribute to DIE with TREE_NODE's non-default
20921 alignment. */
20923 static void
20924 add_alignment_attribute (dw_die_ref die, tree tree_node)
20926 if (dwarf_version < 5 && dwarf_strict)
20927 return;
20929 unsigned align;
20931 if (DECL_P (tree_node))
20933 if (!DECL_USER_ALIGN (tree_node))
20934 return;
20936 align = DECL_ALIGN_UNIT (tree_node);
20938 else if (TYPE_P (tree_node))
20940 if (!TYPE_USER_ALIGN (tree_node))
20941 return;
20943 align = TYPE_ALIGN_UNIT (tree_node);
20945 else
20946 gcc_unreachable ();
20948 add_AT_unsigned (die, DW_AT_alignment, align);
20951 /* For a FIELD_DECL node which represents a bit-field, output an attribute
20952 which specifies the distance in bits from the highest order bit of the
20953 "containing object" for the bit-field to the highest order bit of the
20954 bit-field itself.
20956 For any given bit-field, the "containing object" is a hypothetical object
20957 (of some integral or enum type) within which the given bit-field lives. The
20958 type of this hypothetical "containing object" is always the same as the
20959 declared type of the individual bit-field itself. The determination of the
20960 exact location of the "containing object" for a bit-field is rather
20961 complicated. It's handled by the `field_byte_offset' function (above).
20963 CTX is required: see the comment for VLR_CONTEXT.
20965 Note that it is the size (in bytes) of the hypothetical "containing object"
20966 which will be given in the DW_AT_byte_size attribute for this bit-field.
20967 (See `byte_size_attribute' above). */
20969 static inline void
20970 add_bit_offset_attribute (dw_die_ref die, tree decl, struct vlr_context *ctx)
20972 HOST_WIDE_INT object_offset_in_bytes;
20973 tree original_type = DECL_BIT_FIELD_TYPE (decl);
20974 HOST_WIDE_INT bitpos_int;
20975 HOST_WIDE_INT highest_order_object_bit_offset;
20976 HOST_WIDE_INT highest_order_field_bit_offset;
20977 HOST_WIDE_INT bit_offset;
20979 field_byte_offset (decl, ctx, &object_offset_in_bytes);
20981 /* Must be a field and a bit field. */
20982 gcc_assert (original_type && TREE_CODE (decl) == FIELD_DECL);
20984 /* We can't yet handle bit-fields whose offsets are variable, so if we
20985 encounter such things, just return without generating any attribute
20986 whatsoever. Likewise for variable or too large size. */
20987 if (! tree_fits_shwi_p (bit_position (decl))
20988 || ! tree_fits_uhwi_p (DECL_SIZE (decl)))
20989 return;
20991 bitpos_int = int_bit_position (decl);
20993 /* Note that the bit offset is always the distance (in bits) from the
20994 highest-order bit of the "containing object" to the highest-order bit of
20995 the bit-field itself. Since the "high-order end" of any object or field
20996 is different on big-endian and little-endian machines, the computation
20997 below must take account of these differences. */
20998 highest_order_object_bit_offset = object_offset_in_bytes * BITS_PER_UNIT;
20999 highest_order_field_bit_offset = bitpos_int;
21001 if (! BYTES_BIG_ENDIAN)
21003 highest_order_field_bit_offset += tree_to_shwi (DECL_SIZE (decl));
21004 highest_order_object_bit_offset +=
21005 simple_type_size_in_bits (original_type);
21008 bit_offset
21009 = (! BYTES_BIG_ENDIAN
21010 ? highest_order_object_bit_offset - highest_order_field_bit_offset
21011 : highest_order_field_bit_offset - highest_order_object_bit_offset);
21013 if (bit_offset < 0)
21014 add_AT_int (die, DW_AT_bit_offset, bit_offset);
21015 else
21016 add_AT_unsigned (die, DW_AT_bit_offset, (unsigned HOST_WIDE_INT) bit_offset);
21019 /* For a FIELD_DECL node which represents a bit field, output an attribute
21020 which specifies the length in bits of the given field. */
21022 static inline void
21023 add_bit_size_attribute (dw_die_ref die, tree decl)
21025 /* Must be a field and a bit field. */
21026 gcc_assert (TREE_CODE (decl) == FIELD_DECL
21027 && DECL_BIT_FIELD_TYPE (decl));
21029 if (tree_fits_uhwi_p (DECL_SIZE (decl)))
21030 add_AT_unsigned (die, DW_AT_bit_size, tree_to_uhwi (DECL_SIZE (decl)));
21033 /* If the compiled language is ANSI C, then add a 'prototyped'
21034 attribute, if arg types are given for the parameters of a function. */
21036 static inline void
21037 add_prototyped_attribute (dw_die_ref die, tree func_type)
21039 switch (get_AT_unsigned (comp_unit_die (), DW_AT_language))
21041 case DW_LANG_C:
21042 case DW_LANG_C89:
21043 case DW_LANG_C99:
21044 case DW_LANG_C11:
21045 case DW_LANG_ObjC:
21046 if (prototype_p (func_type))
21047 add_AT_flag (die, DW_AT_prototyped, 1);
21048 break;
21049 default:
21050 break;
21054 /* Add an 'abstract_origin' attribute below a given DIE. The DIE is found
21055 by looking in the type declaration, the object declaration equate table or
21056 the block mapping. */
21058 static inline dw_die_ref
21059 add_abstract_origin_attribute (dw_die_ref die, tree origin)
21061 dw_die_ref origin_die = NULL;
21063 if (DECL_P (origin))
21065 dw_die_ref c;
21066 origin_die = lookup_decl_die (origin);
21067 /* "Unwrap" the decls DIE which we put in the imported unit context.
21068 We are looking for the abstract copy here. */
21069 if (in_lto_p
21070 && origin_die
21071 && (c = get_AT_ref (origin_die, DW_AT_abstract_origin))
21072 /* ??? Identify this better. */
21073 && c->with_offset)
21074 origin_die = c;
21076 else if (TYPE_P (origin))
21077 origin_die = lookup_type_die (origin);
21078 else if (TREE_CODE (origin) == BLOCK)
21079 origin_die = BLOCK_DIE (origin);
21081 /* XXX: Functions that are never lowered don't always have correct block
21082 trees (in the case of java, they simply have no block tree, in some other
21083 languages). For these functions, there is nothing we can really do to
21084 output correct debug info for inlined functions in all cases. Rather
21085 than die, we'll just produce deficient debug info now, in that we will
21086 have variables without a proper abstract origin. In the future, when all
21087 functions are lowered, we should re-add a gcc_assert (origin_die)
21088 here. */
21090 if (origin_die)
21091 add_AT_die_ref (die, DW_AT_abstract_origin, origin_die);
21092 return origin_die;
21095 /* We do not currently support the pure_virtual attribute. */
21097 static inline void
21098 add_pure_or_virtual_attribute (dw_die_ref die, tree func_decl)
21100 if (DECL_VINDEX (func_decl))
21102 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
21104 if (tree_fits_shwi_p (DECL_VINDEX (func_decl)))
21105 add_AT_loc (die, DW_AT_vtable_elem_location,
21106 new_loc_descr (DW_OP_constu,
21107 tree_to_shwi (DECL_VINDEX (func_decl)),
21108 0));
21110 /* GNU extension: Record what type this method came from originally. */
21111 if (debug_info_level > DINFO_LEVEL_TERSE
21112 && DECL_CONTEXT (func_decl))
21113 add_AT_die_ref (die, DW_AT_containing_type,
21114 lookup_type_die (DECL_CONTEXT (func_decl)));
21118 /* Add a DW_AT_linkage_name or DW_AT_MIPS_linkage_name attribute for the
21119 given decl. This used to be a vendor extension until after DWARF 4
21120 standardized it. */
21122 static void
21123 add_linkage_attr (dw_die_ref die, tree decl)
21125 const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
21127 /* Mimic what assemble_name_raw does with a leading '*'. */
21128 if (name[0] == '*')
21129 name = &name[1];
21131 if (dwarf_version >= 4)
21132 add_AT_string (die, DW_AT_linkage_name, name);
21133 else
21134 add_AT_string (die, DW_AT_MIPS_linkage_name, name);
21137 /* Add source coordinate attributes for the given decl. */
21139 static void
21140 add_src_coords_attributes (dw_die_ref die, tree decl)
21142 expanded_location s;
21144 if (LOCATION_LOCUS (DECL_SOURCE_LOCATION (decl)) == UNKNOWN_LOCATION)
21145 return;
21146 s = expand_location (DECL_SOURCE_LOCATION (decl));
21147 add_AT_file (die, DW_AT_decl_file, lookup_filename (s.file));
21148 add_AT_unsigned (die, DW_AT_decl_line, s.line);
21149 if (debug_column_info && s.column)
21150 add_AT_unsigned (die, DW_AT_decl_column, s.column);
21153 /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl. */
21155 static void
21156 add_linkage_name_raw (dw_die_ref die, tree decl)
21158 /* Defer until we have an assembler name set. */
21159 if (!DECL_ASSEMBLER_NAME_SET_P (decl))
21161 limbo_die_node *asm_name;
21163 asm_name = ggc_cleared_alloc<limbo_die_node> ();
21164 asm_name->die = die;
21165 asm_name->created_for = decl;
21166 asm_name->next = deferred_asm_name;
21167 deferred_asm_name = asm_name;
21169 else if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
21170 add_linkage_attr (die, decl);
21173 /* Add DW_AT_{,MIPS_}linkage_name attribute for the given decl if desired. */
21175 static void
21176 add_linkage_name (dw_die_ref die, tree decl)
21178 if (debug_info_level > DINFO_LEVEL_NONE
21179 && VAR_OR_FUNCTION_DECL_P (decl)
21180 && TREE_PUBLIC (decl)
21181 && !(VAR_P (decl) && DECL_REGISTER (decl))
21182 && die->die_tag != DW_TAG_member)
21183 add_linkage_name_raw (die, decl);
21186 /* Add a DW_AT_name attribute and source coordinate attribute for the
21187 given decl, but only if it actually has a name. */
21189 static void
21190 add_name_and_src_coords_attributes (dw_die_ref die, tree decl,
21191 bool no_linkage_name)
21193 tree decl_name;
21195 decl_name = DECL_NAME (decl);
21196 if (decl_name != NULL && IDENTIFIER_POINTER (decl_name) != NULL)
21198 const char *name = dwarf2_name (decl, 0);
21199 if (name)
21200 add_name_attribute (die, name);
21201 if (! DECL_ARTIFICIAL (decl))
21202 add_src_coords_attributes (die, decl);
21204 if (!no_linkage_name)
21205 add_linkage_name (die, decl);
21208 #ifdef VMS_DEBUGGING_INFO
21209 /* Get the function's name, as described by its RTL. This may be different
21210 from the DECL_NAME name used in the source file. */
21211 if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
21213 add_AT_addr (die, DW_AT_VMS_rtnbeg_pd_address,
21214 XEXP (DECL_RTL (decl), 0), false);
21215 vec_safe_push (used_rtx_array, XEXP (DECL_RTL (decl), 0));
21217 #endif /* VMS_DEBUGGING_INFO */
21220 /* Add VALUE as a DW_AT_discr_value attribute to DIE. */
21222 static void
21223 add_discr_value (dw_die_ref die, dw_discr_value *value)
21225 dw_attr_node attr;
21227 attr.dw_attr = DW_AT_discr_value;
21228 attr.dw_attr_val.val_class = dw_val_class_discr_value;
21229 attr.dw_attr_val.val_entry = NULL;
21230 attr.dw_attr_val.v.val_discr_value.pos = value->pos;
21231 if (value->pos)
21232 attr.dw_attr_val.v.val_discr_value.v.uval = value->v.uval;
21233 else
21234 attr.dw_attr_val.v.val_discr_value.v.sval = value->v.sval;
21235 add_dwarf_attr (die, &attr);
21238 /* Add DISCR_LIST as a DW_AT_discr_list to DIE. */
21240 static void
21241 add_discr_list (dw_die_ref die, dw_discr_list_ref discr_list)
21243 dw_attr_node attr;
21245 attr.dw_attr = DW_AT_discr_list;
21246 attr.dw_attr_val.val_class = dw_val_class_discr_list;
21247 attr.dw_attr_val.val_entry = NULL;
21248 attr.dw_attr_val.v.val_discr_list = discr_list;
21249 add_dwarf_attr (die, &attr);
21252 static inline dw_discr_list_ref
21253 AT_discr_list (dw_attr_node *attr)
21255 return attr->dw_attr_val.v.val_discr_list;
21258 #ifdef VMS_DEBUGGING_INFO
21259 /* Output the debug main pointer die for VMS */
21261 void
21262 dwarf2out_vms_debug_main_pointer (void)
21264 char label[MAX_ARTIFICIAL_LABEL_BYTES];
21265 dw_die_ref die;
21267 /* Allocate the VMS debug main subprogram die. */
21268 die = new_die_raw (DW_TAG_subprogram);
21269 add_name_attribute (die, VMS_DEBUG_MAIN_POINTER);
21270 ASM_GENERATE_INTERNAL_LABEL (label, PROLOGUE_END_LABEL,
21271 current_function_funcdef_no);
21272 add_AT_lbl_id (die, DW_AT_entry_pc, label);
21274 /* Make it the first child of comp_unit_die (). */
21275 die->die_parent = comp_unit_die ();
21276 if (comp_unit_die ()->die_child)
21278 die->die_sib = comp_unit_die ()->die_child->die_sib;
21279 comp_unit_die ()->die_child->die_sib = die;
21281 else
21283 die->die_sib = die;
21284 comp_unit_die ()->die_child = die;
21287 #endif /* VMS_DEBUGGING_INFO */
21289 /* Push a new declaration scope. */
21291 static void
21292 push_decl_scope (tree scope)
21294 vec_safe_push (decl_scope_table, scope);
21297 /* Pop a declaration scope. */
21299 static inline void
21300 pop_decl_scope (void)
21302 decl_scope_table->pop ();
21305 /* walk_tree helper function for uses_local_type, below. */
21307 static tree
21308 uses_local_type_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
21310 if (!TYPE_P (*tp))
21311 *walk_subtrees = 0;
21312 else
21314 tree name = TYPE_NAME (*tp);
21315 if (name && DECL_P (name) && decl_function_context (name))
21316 return *tp;
21318 return NULL_TREE;
21321 /* If TYPE involves a function-local type (including a local typedef to a
21322 non-local type), returns that type; otherwise returns NULL_TREE. */
21324 static tree
21325 uses_local_type (tree type)
21327 tree used = walk_tree_without_duplicates (&type, uses_local_type_r, NULL);
21328 return used;
21331 /* Return the DIE for the scope that immediately contains this type.
21332 Non-named types that do not involve a function-local type get global
21333 scope. Named types nested in namespaces or other types get their
21334 containing scope. All other types (i.e. function-local named types) get
21335 the current active scope. */
21337 static dw_die_ref
21338 scope_die_for (tree t, dw_die_ref context_die)
21340 dw_die_ref scope_die = NULL;
21341 tree containing_scope;
21343 /* Non-types always go in the current scope. */
21344 gcc_assert (TYPE_P (t));
21346 /* Use the scope of the typedef, rather than the scope of the type
21347 it refers to. */
21348 if (TYPE_NAME (t) && DECL_P (TYPE_NAME (t)))
21349 containing_scope = DECL_CONTEXT (TYPE_NAME (t));
21350 else
21351 containing_scope = TYPE_CONTEXT (t);
21353 /* Use the containing namespace if there is one. */
21354 if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
21356 if (context_die == lookup_decl_die (containing_scope))
21357 /* OK */;
21358 else if (debug_info_level > DINFO_LEVEL_TERSE)
21359 context_die = get_context_die (containing_scope);
21360 else
21361 containing_scope = NULL_TREE;
21364 /* Ignore function type "scopes" from the C frontend. They mean that
21365 a tagged type is local to a parmlist of a function declarator, but
21366 that isn't useful to DWARF. */
21367 if (containing_scope && TREE_CODE (containing_scope) == FUNCTION_TYPE)
21368 containing_scope = NULL_TREE;
21370 if (SCOPE_FILE_SCOPE_P (containing_scope))
21372 /* If T uses a local type keep it local as well, to avoid references
21373 to function-local DIEs from outside the function. */
21374 if (current_function_decl && uses_local_type (t))
21375 scope_die = context_die;
21376 else
21377 scope_die = comp_unit_die ();
21379 else if (TYPE_P (containing_scope))
21381 /* For types, we can just look up the appropriate DIE. */
21382 if (debug_info_level > DINFO_LEVEL_TERSE)
21383 scope_die = get_context_die (containing_scope);
21384 else
21386 scope_die = lookup_type_die_strip_naming_typedef (containing_scope);
21387 if (scope_die == NULL)
21388 scope_die = comp_unit_die ();
21391 else
21392 scope_die = context_die;
21394 return scope_die;
21397 /* Returns nonzero if CONTEXT_DIE is internal to a function. */
21399 static inline int
21400 local_scope_p (dw_die_ref context_die)
21402 for (; context_die; context_die = context_die->die_parent)
21403 if (context_die->die_tag == DW_TAG_inlined_subroutine
21404 || context_die->die_tag == DW_TAG_subprogram)
21405 return 1;
21407 return 0;
21410 /* Returns nonzero if CONTEXT_DIE is a class. */
21412 static inline int
21413 class_scope_p (dw_die_ref context_die)
21415 return (context_die
21416 && (context_die->die_tag == DW_TAG_structure_type
21417 || context_die->die_tag == DW_TAG_class_type
21418 || context_die->die_tag == DW_TAG_interface_type
21419 || context_die->die_tag == DW_TAG_union_type));
21422 /* Returns nonzero if CONTEXT_DIE is a class or namespace, for deciding
21423 whether or not to treat a DIE in this context as a declaration. */
21425 static inline int
21426 class_or_namespace_scope_p (dw_die_ref context_die)
21428 return (class_scope_p (context_die)
21429 || (context_die && context_die->die_tag == DW_TAG_namespace));
21432 /* Many forms of DIEs require a "type description" attribute. This
21433 routine locates the proper "type descriptor" die for the type given
21434 by 'type' plus any additional qualifiers given by 'cv_quals', and
21435 adds a DW_AT_type attribute below the given die. */
21437 static void
21438 add_type_attribute (dw_die_ref object_die, tree type, int cv_quals,
21439 bool reverse, dw_die_ref context_die)
21441 enum tree_code code = TREE_CODE (type);
21442 dw_die_ref type_die = NULL;
21444 /* ??? If this type is an unnamed subrange type of an integral, floating-point
21445 or fixed-point type, use the inner type. This is because we have no
21446 support for unnamed types in base_type_die. This can happen if this is
21447 an Ada subrange type. Correct solution is emit a subrange type die. */
21448 if ((code == INTEGER_TYPE || code == REAL_TYPE || code == FIXED_POINT_TYPE)
21449 && TREE_TYPE (type) != 0 && TYPE_NAME (type) == 0)
21450 type = TREE_TYPE (type), code = TREE_CODE (type);
21452 if (code == ERROR_MARK
21453 /* Handle a special case. For functions whose return type is void, we
21454 generate *no* type attribute. (Note that no object may have type
21455 `void', so this only applies to function return types). */
21456 || code == VOID_TYPE)
21457 return;
21459 type_die = modified_type_die (type,
21460 cv_quals | TYPE_QUALS (type),
21461 reverse,
21462 context_die);
21464 if (type_die != NULL)
21465 add_AT_die_ref (object_die, DW_AT_type, type_die);
21468 /* Given an object die, add the calling convention attribute for the
21469 function call type. */
21470 static void
21471 add_calling_convention_attribute (dw_die_ref subr_die, tree decl)
21473 enum dwarf_calling_convention value = DW_CC_normal;
21475 value = ((enum dwarf_calling_convention)
21476 targetm.dwarf_calling_convention (TREE_TYPE (decl)));
21478 if (is_fortran ()
21479 && id_equal (DECL_ASSEMBLER_NAME (decl), "MAIN__"))
21481 /* DWARF 2 doesn't provide a way to identify a program's source-level
21482 entry point. DW_AT_calling_convention attributes are only meant
21483 to describe functions' calling conventions. However, lacking a
21484 better way to signal the Fortran main program, we used this for
21485 a long time, following existing custom. Now, DWARF 4 has
21486 DW_AT_main_subprogram, which we add below, but some tools still
21487 rely on the old way, which we thus keep. */
21488 value = DW_CC_program;
21490 if (dwarf_version >= 4 || !dwarf_strict)
21491 add_AT_flag (subr_die, DW_AT_main_subprogram, 1);
21494 /* Only add the attribute if the backend requests it, and
21495 is not DW_CC_normal. */
21496 if (value && (value != DW_CC_normal))
21497 add_AT_unsigned (subr_die, DW_AT_calling_convention, value);
21500 /* Given a tree pointer to a struct, class, union, or enum type node, return
21501 a pointer to the (string) tag name for the given type, or zero if the type
21502 was declared without a tag. */
21504 static const char *
21505 type_tag (const_tree type)
21507 const char *name = 0;
21509 if (TYPE_NAME (type) != 0)
21511 tree t = 0;
21513 /* Find the IDENTIFIER_NODE for the type name. */
21514 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
21515 && !TYPE_NAMELESS (type))
21516 t = TYPE_NAME (type);
21518 /* The g++ front end makes the TYPE_NAME of *each* tagged type point to
21519 a TYPE_DECL node, regardless of whether or not a `typedef' was
21520 involved. */
21521 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
21522 && ! DECL_IGNORED_P (TYPE_NAME (type)))
21524 /* We want to be extra verbose. Don't call dwarf_name if
21525 DECL_NAME isn't set. The default hook for decl_printable_name
21526 doesn't like that, and in this context it's correct to return
21527 0, instead of "<anonymous>" or the like. */
21528 if (DECL_NAME (TYPE_NAME (type))
21529 && !DECL_NAMELESS (TYPE_NAME (type)))
21530 name = lang_hooks.dwarf_name (TYPE_NAME (type), 2);
21533 /* Now get the name as a string, or invent one. */
21534 if (!name && t != 0)
21535 name = IDENTIFIER_POINTER (t);
21538 return (name == 0 || *name == '\0') ? 0 : name;
21541 /* Return the type associated with a data member, make a special check
21542 for bit field types. */
21544 static inline tree
21545 member_declared_type (const_tree member)
21547 return (DECL_BIT_FIELD_TYPE (member)
21548 ? DECL_BIT_FIELD_TYPE (member) : TREE_TYPE (member));
21551 /* Get the decl's label, as described by its RTL. This may be different
21552 from the DECL_NAME name used in the source file. */
21554 #if 0
21555 static const char *
21556 decl_start_label (tree decl)
21558 rtx x;
21559 const char *fnname;
21561 x = DECL_RTL (decl);
21562 gcc_assert (MEM_P (x));
21564 x = XEXP (x, 0);
21565 gcc_assert (GET_CODE (x) == SYMBOL_REF);
21567 fnname = XSTR (x, 0);
21568 return fnname;
21570 #endif
21572 /* For variable-length arrays that have been previously generated, but
21573 may be incomplete due to missing subscript info, fill the subscript
21574 info. Return TRUE if this is one of those cases. */
21575 static bool
21576 fill_variable_array_bounds (tree type)
21578 if (TREE_ASM_WRITTEN (type)
21579 && TREE_CODE (type) == ARRAY_TYPE
21580 && variably_modified_type_p (type, NULL))
21582 dw_die_ref array_die = lookup_type_die (type);
21583 if (!array_die)
21584 return false;
21585 add_subscript_info (array_die, type, !is_ada ());
21586 return true;
21588 return false;
21591 /* These routines generate the internal representation of the DIE's for
21592 the compilation unit. Debugging information is collected by walking
21593 the declaration trees passed in from dwarf2out_decl(). */
21595 static void
21596 gen_array_type_die (tree type, dw_die_ref context_die)
21598 dw_die_ref array_die;
21600 /* GNU compilers represent multidimensional array types as sequences of one
21601 dimensional array types whose element types are themselves array types.
21602 We sometimes squish that down to a single array_type DIE with multiple
21603 subscripts in the Dwarf debugging info. The draft Dwarf specification
21604 say that we are allowed to do this kind of compression in C, because
21605 there is no difference between an array of arrays and a multidimensional
21606 array. We don't do this for Ada to remain as close as possible to the
21607 actual representation, which is especially important against the language
21608 flexibilty wrt arrays of variable size. */
21610 bool collapse_nested_arrays = !is_ada ();
21612 if (fill_variable_array_bounds (type))
21613 return;
21615 dw_die_ref scope_die = scope_die_for (type, context_die);
21616 tree element_type;
21618 /* Emit DW_TAG_string_type for Fortran character types (with kind 1 only, as
21619 DW_TAG_string_type doesn't have DW_AT_type attribute). */
21620 if (TYPE_STRING_FLAG (type)
21621 && TREE_CODE (type) == ARRAY_TYPE
21622 && is_fortran ()
21623 && TYPE_MODE (TREE_TYPE (type)) == TYPE_MODE (char_type_node))
21625 HOST_WIDE_INT size;
21627 array_die = new_die (DW_TAG_string_type, scope_die, type);
21628 add_name_attribute (array_die, type_tag (type));
21629 equate_type_number_to_die (type, array_die);
21630 size = int_size_in_bytes (type);
21631 if (size >= 0)
21632 add_AT_unsigned (array_die, DW_AT_byte_size, size);
21633 /* ??? We can't annotate types late, but for LTO we may not
21634 generate a location early either (gfortran.dg/save_6.f90). */
21635 else if (! (early_dwarf && (flag_generate_lto || flag_generate_offload))
21636 && TYPE_DOMAIN (type) != NULL_TREE
21637 && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) != NULL_TREE)
21639 tree szdecl = TYPE_MAX_VALUE (TYPE_DOMAIN (type));
21640 tree rszdecl = szdecl;
21642 size = int_size_in_bytes (TREE_TYPE (szdecl));
21643 if (!DECL_P (szdecl))
21645 if (TREE_CODE (szdecl) == INDIRECT_REF
21646 && DECL_P (TREE_OPERAND (szdecl, 0)))
21648 rszdecl = TREE_OPERAND (szdecl, 0);
21649 if (int_size_in_bytes (TREE_TYPE (rszdecl))
21650 != DWARF2_ADDR_SIZE)
21651 size = 0;
21653 else
21654 size = 0;
21656 if (size > 0)
21658 dw_loc_list_ref loc
21659 = loc_list_from_tree (rszdecl, szdecl == rszdecl ? 2 : 0,
21660 NULL);
21661 if (loc)
21663 add_AT_location_description (array_die, DW_AT_string_length,
21664 loc);
21665 if (size != DWARF2_ADDR_SIZE)
21666 add_AT_unsigned (array_die, dwarf_version >= 5
21667 ? DW_AT_string_length_byte_size
21668 : DW_AT_byte_size, size);
21672 return;
21675 array_die = new_die (DW_TAG_array_type, scope_die, type);
21676 add_name_attribute (array_die, type_tag (type));
21677 equate_type_number_to_die (type, array_die);
21679 if (TREE_CODE (type) == VECTOR_TYPE)
21680 add_AT_flag (array_die, DW_AT_GNU_vector, 1);
21682 /* For Fortran multidimensional arrays use DW_ORD_col_major ordering. */
21683 if (is_fortran ()
21684 && TREE_CODE (type) == ARRAY_TYPE
21685 && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE
21686 && !TYPE_STRING_FLAG (TREE_TYPE (type)))
21687 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
21689 #if 0
21690 /* We default the array ordering. Debuggers will probably do the right
21691 things even if DW_AT_ordering is not present. It's not even an issue
21692 until we start to get into multidimensional arrays anyway. If a debugger
21693 is ever caught doing the Wrong Thing for multi-dimensional arrays,
21694 then we'll have to put the DW_AT_ordering attribute back in. (But if
21695 and when we find out that we need to put these in, we will only do so
21696 for multidimensional arrays. */
21697 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
21698 #endif
21700 if (TREE_CODE (type) == VECTOR_TYPE)
21702 /* For VECTOR_TYPEs we use an array die with appropriate bounds. */
21703 dw_die_ref subrange_die = new_die (DW_TAG_subrange_type, array_die, NULL);
21704 add_bound_info (subrange_die, DW_AT_lower_bound, size_zero_node, NULL);
21705 add_bound_info (subrange_die, DW_AT_upper_bound,
21706 size_int (TYPE_VECTOR_SUBPARTS (type) - 1), NULL);
21708 else
21709 add_subscript_info (array_die, type, collapse_nested_arrays);
21711 /* Add representation of the type of the elements of this array type and
21712 emit the corresponding DIE if we haven't done it already. */
21713 element_type = TREE_TYPE (type);
21714 if (collapse_nested_arrays)
21715 while (TREE_CODE (element_type) == ARRAY_TYPE)
21717 if (TYPE_STRING_FLAG (element_type) && is_fortran ())
21718 break;
21719 element_type = TREE_TYPE (element_type);
21722 add_type_attribute (array_die, element_type, TYPE_UNQUALIFIED,
21723 TREE_CODE (type) == ARRAY_TYPE
21724 && TYPE_REVERSE_STORAGE_ORDER (type),
21725 context_die);
21727 add_gnat_descriptive_type_attribute (array_die, type, context_die);
21728 if (TYPE_ARTIFICIAL (type))
21729 add_AT_flag (array_die, DW_AT_artificial, 1);
21731 if (get_AT (array_die, DW_AT_name))
21732 add_pubtype (type, array_die);
21734 add_alignment_attribute (array_die, type);
21737 /* This routine generates DIE for array with hidden descriptor, details
21738 are filled into *info by a langhook. */
21740 static void
21741 gen_descr_array_type_die (tree type, struct array_descr_info *info,
21742 dw_die_ref context_die)
21744 const dw_die_ref scope_die = scope_die_for (type, context_die);
21745 const dw_die_ref array_die = new_die (DW_TAG_array_type, scope_die, type);
21746 struct loc_descr_context context = { type, info->base_decl, NULL,
21747 false, false };
21748 enum dwarf_tag subrange_tag = DW_TAG_subrange_type;
21749 int dim;
21751 add_name_attribute (array_die, type_tag (type));
21752 equate_type_number_to_die (type, array_die);
21754 if (info->ndimensions > 1)
21755 switch (info->ordering)
21757 case array_descr_ordering_row_major:
21758 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_row_major);
21759 break;
21760 case array_descr_ordering_column_major:
21761 add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
21762 break;
21763 default:
21764 break;
21767 if (dwarf_version >= 3 || !dwarf_strict)
21769 if (info->data_location)
21770 add_scalar_info (array_die, DW_AT_data_location, info->data_location,
21771 dw_scalar_form_exprloc, &context);
21772 if (info->associated)
21773 add_scalar_info (array_die, DW_AT_associated, info->associated,
21774 dw_scalar_form_constant
21775 | dw_scalar_form_exprloc
21776 | dw_scalar_form_reference, &context);
21777 if (info->allocated)
21778 add_scalar_info (array_die, DW_AT_allocated, info->allocated,
21779 dw_scalar_form_constant
21780 | dw_scalar_form_exprloc
21781 | dw_scalar_form_reference, &context);
21782 if (info->stride)
21784 const enum dwarf_attribute attr
21785 = (info->stride_in_bits) ? DW_AT_bit_stride : DW_AT_byte_stride;
21786 const int forms
21787 = (info->stride_in_bits)
21788 ? dw_scalar_form_constant
21789 : (dw_scalar_form_constant
21790 | dw_scalar_form_exprloc
21791 | dw_scalar_form_reference);
21793 add_scalar_info (array_die, attr, info->stride, forms, &context);
21796 if (dwarf_version >= 5)
21798 if (info->rank)
21800 add_scalar_info (array_die, DW_AT_rank, info->rank,
21801 dw_scalar_form_constant
21802 | dw_scalar_form_exprloc, &context);
21803 subrange_tag = DW_TAG_generic_subrange;
21804 context.placeholder_arg = true;
21808 add_gnat_descriptive_type_attribute (array_die, type, context_die);
21810 for (dim = 0; dim < info->ndimensions; dim++)
21812 dw_die_ref subrange_die = new_die (subrange_tag, array_die, NULL);
21814 if (info->dimen[dim].bounds_type)
21815 add_type_attribute (subrange_die,
21816 info->dimen[dim].bounds_type, TYPE_UNQUALIFIED,
21817 false, context_die);
21818 if (info->dimen[dim].lower_bound)
21819 add_bound_info (subrange_die, DW_AT_lower_bound,
21820 info->dimen[dim].lower_bound, &context);
21821 if (info->dimen[dim].upper_bound)
21822 add_bound_info (subrange_die, DW_AT_upper_bound,
21823 info->dimen[dim].upper_bound, &context);
21824 if ((dwarf_version >= 3 || !dwarf_strict) && info->dimen[dim].stride)
21825 add_scalar_info (subrange_die, DW_AT_byte_stride,
21826 info->dimen[dim].stride,
21827 dw_scalar_form_constant
21828 | dw_scalar_form_exprloc
21829 | dw_scalar_form_reference,
21830 &context);
21833 gen_type_die (info->element_type, context_die);
21834 add_type_attribute (array_die, info->element_type, TYPE_UNQUALIFIED,
21835 TREE_CODE (type) == ARRAY_TYPE
21836 && TYPE_REVERSE_STORAGE_ORDER (type),
21837 context_die);
21839 if (get_AT (array_die, DW_AT_name))
21840 add_pubtype (type, array_die);
21842 add_alignment_attribute (array_die, type);
21845 #if 0
21846 static void
21847 gen_entry_point_die (tree decl, dw_die_ref context_die)
21849 tree origin = decl_ultimate_origin (decl);
21850 dw_die_ref decl_die = new_die (DW_TAG_entry_point, context_die, decl);
21852 if (origin != NULL)
21853 add_abstract_origin_attribute (decl_die, origin);
21854 else
21856 add_name_and_src_coords_attributes (decl_die, decl);
21857 add_type_attribute (decl_die, TREE_TYPE (TREE_TYPE (decl)),
21858 TYPE_UNQUALIFIED, false, context_die);
21861 if (DECL_ABSTRACT_P (decl))
21862 equate_decl_number_to_die (decl, decl_die);
21863 else
21864 add_AT_lbl_id (decl_die, DW_AT_low_pc, decl_start_label (decl));
21866 #endif
21868 /* Walk through the list of incomplete types again, trying once more to
21869 emit full debugging info for them. */
21871 static void
21872 retry_incomplete_types (void)
21874 set_early_dwarf s;
21875 int i;
21877 for (i = vec_safe_length (incomplete_types) - 1; i >= 0; i--)
21878 if (should_emit_struct_debug ((*incomplete_types)[i], DINFO_USAGE_DIR_USE))
21879 gen_type_die ((*incomplete_types)[i], comp_unit_die ());
21880 vec_safe_truncate (incomplete_types, 0);
21883 /* Determine what tag to use for a record type. */
21885 static enum dwarf_tag
21886 record_type_tag (tree type)
21888 if (! lang_hooks.types.classify_record)
21889 return DW_TAG_structure_type;
21891 switch (lang_hooks.types.classify_record (type))
21893 case RECORD_IS_STRUCT:
21894 return DW_TAG_structure_type;
21896 case RECORD_IS_CLASS:
21897 return DW_TAG_class_type;
21899 case RECORD_IS_INTERFACE:
21900 if (dwarf_version >= 3 || !dwarf_strict)
21901 return DW_TAG_interface_type;
21902 return DW_TAG_structure_type;
21904 default:
21905 gcc_unreachable ();
21909 /* Generate a DIE to represent an enumeration type. Note that these DIEs
21910 include all of the information about the enumeration values also. Each
21911 enumerated type name/value is listed as a child of the enumerated type
21912 DIE. */
21914 static dw_die_ref
21915 gen_enumeration_type_die (tree type, dw_die_ref context_die)
21917 dw_die_ref type_die = lookup_type_die (type);
21918 dw_die_ref orig_type_die = type_die;
21920 if (type_die == NULL)
21922 type_die = new_die (DW_TAG_enumeration_type,
21923 scope_die_for (type, context_die), type);
21924 equate_type_number_to_die (type, type_die);
21925 add_name_attribute (type_die, type_tag (type));
21926 if ((dwarf_version >= 4 || !dwarf_strict)
21927 && ENUM_IS_SCOPED (type))
21928 add_AT_flag (type_die, DW_AT_enum_class, 1);
21929 if (ENUM_IS_OPAQUE (type) && TYPE_SIZE (type))
21930 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) || ENUM_IS_OPAQUE (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 if (!ENUM_IS_OPAQUE (type))
21950 TREE_ASM_WRITTEN (type) = 1;
21951 if (!orig_type_die || !get_AT (type_die, DW_AT_byte_size))
21952 add_byte_size_attribute (type_die, type);
21953 if (!orig_type_die || !get_AT (type_die, DW_AT_alignment))
21954 add_alignment_attribute (type_die, type);
21955 if ((dwarf_version >= 3 || !dwarf_strict)
21956 && (!orig_type_die || !get_AT (type_die, DW_AT_type)))
21958 tree underlying = lang_hooks.types.enum_underlying_base_type (type);
21959 add_type_attribute (type_die, underlying, TYPE_UNQUALIFIED, false,
21960 context_die);
21962 if (TYPE_STUB_DECL (type) != NULL_TREE)
21964 if (!orig_type_die || !get_AT (type_die, DW_AT_decl_file))
21965 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
21966 if (!orig_type_die || !get_AT (type_die, DW_AT_accessibility))
21967 add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
21970 /* If the first reference to this type was as the return type of an
21971 inline function, then it may not have a parent. Fix this now. */
21972 if (type_die->die_parent == NULL)
21973 add_child_die (scope_die_for (type, context_die), type_die);
21975 for (link = TYPE_VALUES (type);
21976 link != NULL; link = TREE_CHAIN (link))
21978 dw_die_ref enum_die = new_die (DW_TAG_enumerator, type_die, link);
21979 tree value = TREE_VALUE (link);
21981 gcc_assert (!ENUM_IS_OPAQUE (type));
21982 add_name_attribute (enum_die,
21983 IDENTIFIER_POINTER (TREE_PURPOSE (link)));
21985 if (TREE_CODE (value) == CONST_DECL)
21986 value = DECL_INITIAL (value);
21988 if (simple_type_size_in_bits (TREE_TYPE (value))
21989 <= HOST_BITS_PER_WIDE_INT || tree_fits_shwi_p (value))
21991 /* For constant forms created by add_AT_unsigned DWARF
21992 consumers (GDB, elfutils, etc.) always zero extend
21993 the value. Only when the actual value is negative
21994 do we need to use add_AT_int to generate a constant
21995 form that can represent negative values. */
21996 HOST_WIDE_INT val = TREE_INT_CST_LOW (value);
21997 if (TYPE_UNSIGNED (TREE_TYPE (value)) || val >= 0)
21998 add_AT_unsigned (enum_die, DW_AT_const_value,
21999 (unsigned HOST_WIDE_INT) val);
22000 else
22001 add_AT_int (enum_die, DW_AT_const_value, val);
22003 else
22004 /* Enumeration constants may be wider than HOST_WIDE_INT. Handle
22005 that here. TODO: This should be re-worked to use correct
22006 signed/unsigned double tags for all cases. */
22007 add_AT_wide (enum_die, DW_AT_const_value, wi::to_wide (value));
22010 add_gnat_descriptive_type_attribute (type_die, type, context_die);
22011 if (TYPE_ARTIFICIAL (type)
22012 && (!orig_type_die || !get_AT (type_die, DW_AT_artificial)))
22013 add_AT_flag (type_die, DW_AT_artificial, 1);
22015 else
22016 add_AT_flag (type_die, DW_AT_declaration, 1);
22018 add_pubtype (type, type_die);
22020 return type_die;
22023 /* Generate a DIE to represent either a real live formal parameter decl or to
22024 represent just the type of some formal parameter position in some function
22025 type.
22027 Note that this routine is a bit unusual because its argument may be a
22028 ..._DECL node (i.e. either a PARM_DECL or perhaps a VAR_DECL which
22029 represents an inlining of some PARM_DECL) or else some sort of a ..._TYPE
22030 node. If it's the former then this function is being called to output a
22031 DIE to represent a formal parameter object (or some inlining thereof). If
22032 it's the latter, then this function is only being called to output a
22033 DW_TAG_formal_parameter DIE to stand as a placeholder for some formal
22034 argument type of some subprogram type.
22035 If EMIT_NAME_P is true, name and source coordinate attributes
22036 are emitted. */
22038 static dw_die_ref
22039 gen_formal_parameter_die (tree node, tree origin, bool emit_name_p,
22040 dw_die_ref context_die)
22042 tree node_or_origin = node ? node : origin;
22043 tree ultimate_origin;
22044 dw_die_ref parm_die = NULL;
22046 if (DECL_P (node_or_origin))
22048 parm_die = lookup_decl_die (node);
22050 /* If the contexts differ, we may not be talking about the same
22051 thing.
22052 ??? When in LTO the DIE parent is the "abstract" copy and the
22053 context_die is the specification "copy". But this whole block
22054 should eventually be no longer needed. */
22055 if (parm_die && parm_die->die_parent != context_die && !in_lto_p)
22057 if (!DECL_ABSTRACT_P (node))
22059 /* This can happen when creating an inlined instance, in
22060 which case we need to create a new DIE that will get
22061 annotated with DW_AT_abstract_origin. */
22062 parm_die = NULL;
22064 else
22065 gcc_unreachable ();
22068 if (parm_die && parm_die->die_parent == NULL)
22070 /* Check that parm_die already has the right attributes that
22071 we would have added below. If any attributes are
22072 missing, fall through to add them. */
22073 if (! DECL_ABSTRACT_P (node_or_origin)
22074 && !get_AT (parm_die, DW_AT_location)
22075 && !get_AT (parm_die, DW_AT_const_value))
22076 /* We are missing location info, and are about to add it. */
22078 else
22080 add_child_die (context_die, parm_die);
22081 return parm_die;
22086 /* If we have a previously generated DIE, use it, unless this is an
22087 concrete instance (origin != NULL), in which case we need a new
22088 DIE with a corresponding DW_AT_abstract_origin. */
22089 bool reusing_die;
22090 if (parm_die && origin == NULL)
22091 reusing_die = true;
22092 else
22094 parm_die = new_die (DW_TAG_formal_parameter, context_die, node);
22095 reusing_die = false;
22098 switch (TREE_CODE_CLASS (TREE_CODE (node_or_origin)))
22100 case tcc_declaration:
22101 ultimate_origin = decl_ultimate_origin (node_or_origin);
22102 if (node || ultimate_origin)
22103 origin = ultimate_origin;
22105 if (reusing_die)
22106 goto add_location;
22108 if (origin != NULL)
22109 add_abstract_origin_attribute (parm_die, origin);
22110 else if (emit_name_p)
22111 add_name_and_src_coords_attributes (parm_die, node);
22112 if (origin == NULL
22113 || (! DECL_ABSTRACT_P (node_or_origin)
22114 && variably_modified_type_p (TREE_TYPE (node_or_origin),
22115 decl_function_context
22116 (node_or_origin))))
22118 tree type = TREE_TYPE (node_or_origin);
22119 if (decl_by_reference_p (node_or_origin))
22120 add_type_attribute (parm_die, TREE_TYPE (type),
22121 TYPE_UNQUALIFIED,
22122 false, context_die);
22123 else
22124 add_type_attribute (parm_die, type,
22125 decl_quals (node_or_origin),
22126 false, context_die);
22128 if (origin == NULL && DECL_ARTIFICIAL (node))
22129 add_AT_flag (parm_die, DW_AT_artificial, 1);
22130 add_location:
22131 if (node && node != origin)
22132 equate_decl_number_to_die (node, parm_die);
22133 if (! DECL_ABSTRACT_P (node_or_origin))
22134 add_location_or_const_value_attribute (parm_die, node_or_origin,
22135 node == NULL);
22137 break;
22139 case tcc_type:
22140 /* We were called with some kind of a ..._TYPE node. */
22141 add_type_attribute (parm_die, node_or_origin, TYPE_UNQUALIFIED, false,
22142 context_die);
22143 break;
22145 default:
22146 gcc_unreachable ();
22149 return parm_die;
22152 /* Generate and return a DW_TAG_GNU_formal_parameter_pack. Also generate
22153 children DW_TAG_formal_parameter DIEs representing the arguments of the
22154 parameter pack.
22156 PARM_PACK must be a function parameter pack.
22157 PACK_ARG is the first argument of the parameter pack. Its TREE_CHAIN
22158 must point to the subsequent arguments of the function PACK_ARG belongs to.
22159 SUBR_DIE is the DIE of the function PACK_ARG belongs to.
22160 If NEXT_ARG is non NULL, *NEXT_ARG is set to the function argument
22161 following the last one for which a DIE was generated. */
22163 static dw_die_ref
22164 gen_formal_parameter_pack_die (tree parm_pack,
22165 tree pack_arg,
22166 dw_die_ref subr_die,
22167 tree *next_arg)
22169 tree arg;
22170 dw_die_ref parm_pack_die;
22172 gcc_assert (parm_pack
22173 && lang_hooks.function_parameter_pack_p (parm_pack)
22174 && subr_die);
22176 parm_pack_die = new_die (DW_TAG_GNU_formal_parameter_pack, subr_die, parm_pack);
22177 add_src_coords_attributes (parm_pack_die, parm_pack);
22179 for (arg = pack_arg; arg; arg = DECL_CHAIN (arg))
22181 if (! lang_hooks.decls.function_parm_expanded_from_pack_p (arg,
22182 parm_pack))
22183 break;
22184 gen_formal_parameter_die (arg, NULL,
22185 false /* Don't emit name attribute. */,
22186 parm_pack_die);
22188 if (next_arg)
22189 *next_arg = arg;
22190 return parm_pack_die;
22193 /* Generate a special type of DIE used as a stand-in for a trailing ellipsis
22194 at the end of an (ANSI prototyped) formal parameters list. */
22196 static void
22197 gen_unspecified_parameters_die (tree decl_or_type, dw_die_ref context_die)
22199 new_die (DW_TAG_unspecified_parameters, context_die, decl_or_type);
22202 /* Generate a list of nameless DW_TAG_formal_parameter DIEs (and perhaps a
22203 DW_TAG_unspecified_parameters DIE) to represent the types of the formal
22204 parameters as specified in some function type specification (except for
22205 those which appear as part of a function *definition*). */
22207 static void
22208 gen_formal_types_die (tree function_or_method_type, dw_die_ref context_die)
22210 tree link;
22211 tree formal_type = NULL;
22212 tree first_parm_type;
22213 tree arg;
22215 if (TREE_CODE (function_or_method_type) == FUNCTION_DECL)
22217 arg = DECL_ARGUMENTS (function_or_method_type);
22218 function_or_method_type = TREE_TYPE (function_or_method_type);
22220 else
22221 arg = NULL_TREE;
22223 first_parm_type = TYPE_ARG_TYPES (function_or_method_type);
22225 /* Make our first pass over the list of formal parameter types and output a
22226 DW_TAG_formal_parameter DIE for each one. */
22227 for (link = first_parm_type; link; )
22229 dw_die_ref parm_die;
22231 formal_type = TREE_VALUE (link);
22232 if (formal_type == void_type_node)
22233 break;
22235 /* Output a (nameless) DIE to represent the formal parameter itself. */
22236 if (!POINTER_BOUNDS_TYPE_P (formal_type))
22238 parm_die = gen_formal_parameter_die (formal_type, NULL,
22239 true /* Emit name attribute. */,
22240 context_die);
22241 if (TREE_CODE (function_or_method_type) == METHOD_TYPE
22242 && link == first_parm_type)
22244 add_AT_flag (parm_die, DW_AT_artificial, 1);
22245 if (dwarf_version >= 3 || !dwarf_strict)
22246 add_AT_die_ref (context_die, DW_AT_object_pointer, parm_die);
22248 else if (arg && DECL_ARTIFICIAL (arg))
22249 add_AT_flag (parm_die, DW_AT_artificial, 1);
22252 link = TREE_CHAIN (link);
22253 if (arg)
22254 arg = DECL_CHAIN (arg);
22257 /* If this function type has an ellipsis, add a
22258 DW_TAG_unspecified_parameters DIE to the end of the parameter list. */
22259 if (formal_type != void_type_node)
22260 gen_unspecified_parameters_die (function_or_method_type, context_die);
22262 /* Make our second (and final) pass over the list of formal parameter types
22263 and output DIEs to represent those types (as necessary). */
22264 for (link = TYPE_ARG_TYPES (function_or_method_type);
22265 link && TREE_VALUE (link);
22266 link = TREE_CHAIN (link))
22267 gen_type_die (TREE_VALUE (link), context_die);
22270 /* We want to generate the DIE for TYPE so that we can generate the
22271 die for MEMBER, which has been defined; we will need to refer back
22272 to the member declaration nested within TYPE. If we're trying to
22273 generate minimal debug info for TYPE, processing TYPE won't do the
22274 trick; we need to attach the member declaration by hand. */
22276 static void
22277 gen_type_die_for_member (tree type, tree member, dw_die_ref context_die)
22279 gen_type_die (type, context_die);
22281 /* If we're trying to avoid duplicate debug info, we may not have
22282 emitted the member decl for this function. Emit it now. */
22283 if (TYPE_STUB_DECL (type)
22284 && TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))
22285 && ! lookup_decl_die (member))
22287 dw_die_ref type_die;
22288 gcc_assert (!decl_ultimate_origin (member));
22290 push_decl_scope (type);
22291 type_die = lookup_type_die_strip_naming_typedef (type);
22292 if (TREE_CODE (member) == FUNCTION_DECL)
22293 gen_subprogram_die (member, type_die);
22294 else if (TREE_CODE (member) == FIELD_DECL)
22296 /* Ignore the nameless fields that are used to skip bits but handle
22297 C++ anonymous unions and structs. */
22298 if (DECL_NAME (member) != NULL_TREE
22299 || TREE_CODE (TREE_TYPE (member)) == UNION_TYPE
22300 || TREE_CODE (TREE_TYPE (member)) == RECORD_TYPE)
22302 struct vlr_context vlr_ctx = {
22303 DECL_CONTEXT (member), /* struct_type */
22304 NULL_TREE /* variant_part_offset */
22306 gen_type_die (member_declared_type (member), type_die);
22307 gen_field_die (member, &vlr_ctx, type_die);
22310 else
22311 gen_variable_die (member, NULL_TREE, type_die);
22313 pop_decl_scope ();
22317 /* Forward declare these functions, because they are mutually recursive
22318 with their set_block_* pairing functions. */
22319 static void set_decl_origin_self (tree);
22321 /* Given a pointer to some BLOCK node, if the BLOCK_ABSTRACT_ORIGIN for the
22322 given BLOCK node is NULL, set the BLOCK_ABSTRACT_ORIGIN for the node so
22323 that it points to the node itself, thus indicating that the node is its
22324 own (abstract) origin. Additionally, if the BLOCK_ABSTRACT_ORIGIN for
22325 the given node is NULL, recursively descend the decl/block tree which
22326 it is the root of, and for each other ..._DECL or BLOCK node contained
22327 therein whose DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also
22328 still NULL, set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN
22329 values to point to themselves. */
22331 static void
22332 set_block_origin_self (tree stmt)
22334 if (BLOCK_ABSTRACT_ORIGIN (stmt) == NULL_TREE)
22336 BLOCK_ABSTRACT_ORIGIN (stmt) = stmt;
22339 tree local_decl;
22341 for (local_decl = BLOCK_VARS (stmt);
22342 local_decl != NULL_TREE;
22343 local_decl = DECL_CHAIN (local_decl))
22344 /* Do not recurse on nested functions since the inlining status
22345 of parent and child can be different as per the DWARF spec. */
22346 if (TREE_CODE (local_decl) != FUNCTION_DECL
22347 && !DECL_EXTERNAL (local_decl))
22348 set_decl_origin_self (local_decl);
22352 tree subblock;
22354 for (subblock = BLOCK_SUBBLOCKS (stmt);
22355 subblock != NULL_TREE;
22356 subblock = BLOCK_CHAIN (subblock))
22357 set_block_origin_self (subblock); /* Recurse. */
22362 /* Given a pointer to some ..._DECL node, if the DECL_ABSTRACT_ORIGIN for
22363 the given ..._DECL node is NULL, set the DECL_ABSTRACT_ORIGIN for the
22364 node to so that it points to the node itself, thus indicating that the
22365 node represents its own (abstract) origin. Additionally, if the
22366 DECL_ABSTRACT_ORIGIN for the given node is NULL, recursively descend
22367 the decl/block tree of which the given node is the root of, and for
22368 each other ..._DECL or BLOCK node contained therein whose
22369 DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also still NULL,
22370 set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN values to
22371 point to themselves. */
22373 static void
22374 set_decl_origin_self (tree decl)
22376 if (DECL_ABSTRACT_ORIGIN (decl) == NULL_TREE)
22378 DECL_ABSTRACT_ORIGIN (decl) = decl;
22379 if (TREE_CODE (decl) == FUNCTION_DECL)
22381 tree arg;
22383 for (arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
22384 DECL_ABSTRACT_ORIGIN (arg) = arg;
22385 if (DECL_INITIAL (decl) != NULL_TREE
22386 && DECL_INITIAL (decl) != error_mark_node)
22387 set_block_origin_self (DECL_INITIAL (decl));
22392 /* Mark the early DIE for DECL as the abstract instance. */
22394 static void
22395 dwarf2out_abstract_function (tree decl)
22397 dw_die_ref old_die;
22399 /* Make sure we have the actual abstract inline, not a clone. */
22400 decl = DECL_ORIGIN (decl);
22402 if (DECL_IGNORED_P (decl))
22403 return;
22405 old_die = lookup_decl_die (decl);
22406 /* With early debug we always have an old DIE unless we are in LTO
22407 and the user did not compile but only link with debug. */
22408 if (in_lto_p && ! old_die)
22409 return;
22410 gcc_assert (old_die != NULL);
22411 if (get_AT (old_die, DW_AT_inline)
22412 || get_AT (old_die, DW_AT_abstract_origin))
22413 /* We've already generated the abstract instance. */
22414 return;
22416 /* Go ahead and put DW_AT_inline on the DIE. */
22417 if (DECL_DECLARED_INLINE_P (decl))
22419 if (cgraph_function_possibly_inlined_p (decl))
22420 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_declared_inlined);
22421 else
22422 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_declared_not_inlined);
22424 else
22426 if (cgraph_function_possibly_inlined_p (decl))
22427 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_inlined);
22428 else
22429 add_AT_unsigned (old_die, DW_AT_inline, DW_INL_not_inlined);
22432 if (DECL_DECLARED_INLINE_P (decl)
22433 && lookup_attribute ("artificial", DECL_ATTRIBUTES (decl)))
22434 add_AT_flag (old_die, DW_AT_artificial, 1);
22436 set_decl_origin_self (decl);
22439 /* Helper function of premark_used_types() which gets called through
22440 htab_traverse.
22442 Marks the DIE of a given type in *SLOT as perennial, so it never gets
22443 marked as unused by prune_unused_types. */
22445 bool
22446 premark_used_types_helper (tree const &type, void *)
22448 dw_die_ref die;
22450 die = lookup_type_die (type);
22451 if (die != NULL)
22452 die->die_perennial_p = 1;
22453 return true;
22456 /* Helper function of premark_types_used_by_global_vars which gets called
22457 through htab_traverse.
22459 Marks the DIE of a given type in *SLOT as perennial, so it never gets
22460 marked as unused by prune_unused_types. The DIE of the type is marked
22461 only if the global variable using the type will actually be emitted. */
22464 premark_types_used_by_global_vars_helper (types_used_by_vars_entry **slot,
22465 void *)
22467 struct types_used_by_vars_entry *entry;
22468 dw_die_ref die;
22470 entry = (struct types_used_by_vars_entry *) *slot;
22471 gcc_assert (entry->type != NULL
22472 && entry->var_decl != NULL);
22473 die = lookup_type_die (entry->type);
22474 if (die)
22476 /* Ask cgraph if the global variable really is to be emitted.
22477 If yes, then we'll keep the DIE of ENTRY->TYPE. */
22478 varpool_node *node = varpool_node::get (entry->var_decl);
22479 if (node && node->definition)
22481 die->die_perennial_p = 1;
22482 /* Keep the parent DIEs as well. */
22483 while ((die = die->die_parent) && die->die_perennial_p == 0)
22484 die->die_perennial_p = 1;
22487 return 1;
22490 /* Mark all members of used_types_hash as perennial. */
22492 static void
22493 premark_used_types (struct function *fun)
22495 if (fun && fun->used_types_hash)
22496 fun->used_types_hash->traverse<void *, premark_used_types_helper> (NULL);
22499 /* Mark all members of types_used_by_vars_entry as perennial. */
22501 static void
22502 premark_types_used_by_global_vars (void)
22504 if (types_used_by_vars_hash)
22505 types_used_by_vars_hash
22506 ->traverse<void *, premark_types_used_by_global_vars_helper> (NULL);
22509 /* Generate a DW_TAG_call_site DIE in function DECL under SUBR_DIE
22510 for CA_LOC call arg loc node. */
22512 static dw_die_ref
22513 gen_call_site_die (tree decl, dw_die_ref subr_die,
22514 struct call_arg_loc_node *ca_loc)
22516 dw_die_ref stmt_die = NULL, die;
22517 tree block = ca_loc->block;
22519 while (block
22520 && block != DECL_INITIAL (decl)
22521 && TREE_CODE (block) == BLOCK)
22523 stmt_die = BLOCK_DIE (block);
22524 if (stmt_die)
22525 break;
22526 block = BLOCK_SUPERCONTEXT (block);
22528 if (stmt_die == NULL)
22529 stmt_die = subr_die;
22530 die = new_die (dwarf_TAG (DW_TAG_call_site), stmt_die, NULL_TREE);
22531 add_AT_lbl_id (die, dwarf_AT (DW_AT_call_return_pc), ca_loc->label);
22532 if (ca_loc->tail_call_p)
22533 add_AT_flag (die, dwarf_AT (DW_AT_call_tail_call), 1);
22534 if (ca_loc->symbol_ref)
22536 dw_die_ref tdie = lookup_decl_die (SYMBOL_REF_DECL (ca_loc->symbol_ref));
22537 if (tdie)
22538 add_AT_die_ref (die, dwarf_AT (DW_AT_call_origin), tdie);
22539 else
22540 add_AT_addr (die, dwarf_AT (DW_AT_call_origin), ca_loc->symbol_ref,
22541 false);
22543 return die;
22546 /* Generate a DIE to represent a declared function (either file-scope or
22547 block-local). */
22549 static void
22550 gen_subprogram_die (tree decl, dw_die_ref context_die)
22552 tree origin = decl_ultimate_origin (decl);
22553 dw_die_ref subr_die;
22554 dw_die_ref old_die = lookup_decl_die (decl);
22556 /* This function gets called multiple times for different stages of
22557 the debug process. For example, for func() in this code:
22559 namespace S
22561 void func() { ... }
22564 ...we get called 4 times. Twice in early debug and twice in
22565 late debug:
22567 Early debug
22568 -----------
22570 1. Once while generating func() within the namespace. This is
22571 the declaration. The declaration bit below is set, as the
22572 context is the namespace.
22574 A new DIE will be generated with DW_AT_declaration set.
22576 2. Once for func() itself. This is the specification. The
22577 declaration bit below is clear as the context is the CU.
22579 We will use the cached DIE from (1) to create a new DIE with
22580 DW_AT_specification pointing to the declaration in (1).
22582 Late debug via rest_of_handle_final()
22583 -------------------------------------
22585 3. Once generating func() within the namespace. This is also the
22586 declaration, as in (1), but this time we will early exit below
22587 as we have a cached DIE and a declaration needs no additional
22588 annotations (no locations), as the source declaration line
22589 info is enough.
22591 4. Once for func() itself. As in (2), this is the specification,
22592 but this time we will re-use the cached DIE, and just annotate
22593 it with the location information that should now be available.
22595 For something without namespaces, but with abstract instances, we
22596 are also called a multiple times:
22598 class Base
22600 public:
22601 Base (); // constructor declaration (1)
22604 Base::Base () { } // constructor specification (2)
22606 Early debug
22607 -----------
22609 1. Once for the Base() constructor by virtue of it being a
22610 member of the Base class. This is done via
22611 rest_of_type_compilation.
22613 This is a declaration, so a new DIE will be created with
22614 DW_AT_declaration.
22616 2. Once for the Base() constructor definition, but this time
22617 while generating the abstract instance of the base
22618 constructor (__base_ctor) which is being generated via early
22619 debug of reachable functions.
22621 Even though we have a cached version of the declaration (1),
22622 we will create a DW_AT_specification of the declaration DIE
22623 in (1).
22625 3. Once for the __base_ctor itself, but this time, we generate
22626 an DW_AT_abstract_origin version of the DW_AT_specification in
22627 (2).
22629 Late debug via rest_of_handle_final
22630 -----------------------------------
22632 4. One final time for the __base_ctor (which will have a cached
22633 DIE with DW_AT_abstract_origin created in (3). This time,
22634 we will just annotate the location information now
22635 available.
22637 int declaration = (current_function_decl != decl
22638 || class_or_namespace_scope_p (context_die));
22640 /* A declaration that has been previously dumped needs no
22641 additional information. */
22642 if (old_die && declaration)
22643 return;
22645 /* Now that the C++ front end lazily declares artificial member fns, we
22646 might need to retrofit the declaration into its class. */
22647 if (!declaration && !origin && !old_die
22648 && DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))
22649 && !class_or_namespace_scope_p (context_die)
22650 && debug_info_level > DINFO_LEVEL_TERSE)
22651 old_die = force_decl_die (decl);
22653 /* A concrete instance, tag a new DIE with DW_AT_abstract_origin. */
22654 if (origin != NULL)
22656 gcc_assert (!declaration || local_scope_p (context_die));
22658 /* Fixup die_parent for the abstract instance of a nested
22659 inline function. */
22660 if (old_die && old_die->die_parent == NULL)
22661 add_child_die (context_die, old_die);
22663 if (old_die && get_AT_ref (old_die, DW_AT_abstract_origin))
22665 /* If we have a DW_AT_abstract_origin we have a working
22666 cached version. */
22667 subr_die = old_die;
22669 else
22671 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22672 add_abstract_origin_attribute (subr_die, origin);
22673 /* This is where the actual code for a cloned function is.
22674 Let's emit linkage name attribute for it. This helps
22675 debuggers to e.g, set breakpoints into
22676 constructors/destructors when the user asks "break
22677 K::K". */
22678 add_linkage_name (subr_die, decl);
22681 /* A cached copy, possibly from early dwarf generation. Reuse as
22682 much as possible. */
22683 else if (old_die)
22685 if (!get_AT_flag (old_die, DW_AT_declaration)
22686 /* We can have a normal definition following an inline one in the
22687 case of redefinition of GNU C extern inlines.
22688 It seems reasonable to use AT_specification in this case. */
22689 && !get_AT (old_die, DW_AT_inline))
22691 /* Detect and ignore this case, where we are trying to output
22692 something we have already output. */
22693 if (get_AT (old_die, DW_AT_low_pc)
22694 || get_AT (old_die, DW_AT_ranges))
22695 return;
22697 /* If we have no location information, this must be a
22698 partially generated DIE from early dwarf generation.
22699 Fall through and generate it. */
22702 /* If the definition comes from the same place as the declaration,
22703 maybe use the old DIE. We always want the DIE for this function
22704 that has the *_pc attributes to be under comp_unit_die so the
22705 debugger can find it. We also need to do this for abstract
22706 instances of inlines, since the spec requires the out-of-line copy
22707 to have the same parent. For local class methods, this doesn't
22708 apply; we just use the old DIE. */
22709 expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
22710 struct dwarf_file_data * file_index = lookup_filename (s.file);
22711 if ((is_cu_die (old_die->die_parent)
22712 /* This condition fixes the inconsistency/ICE with the
22713 following Fortran test (or some derivative thereof) while
22714 building libgfortran:
22716 module some_m
22717 contains
22718 logical function funky (FLAG)
22719 funky = .true.
22720 end function
22721 end module
22723 || (old_die->die_parent
22724 && old_die->die_parent->die_tag == DW_TAG_module)
22725 || context_die == NULL)
22726 && (DECL_ARTIFICIAL (decl)
22727 /* The location attributes may be in the abstract origin
22728 which in the case of LTO might be not available to
22729 look at. */
22730 || get_AT (old_die, DW_AT_abstract_origin)
22731 || (get_AT_file (old_die, DW_AT_decl_file) == file_index
22732 && (get_AT_unsigned (old_die, DW_AT_decl_line)
22733 == (unsigned) s.line)
22734 && (!debug_column_info
22735 || s.column == 0
22736 || (get_AT_unsigned (old_die, DW_AT_decl_column)
22737 == (unsigned) s.column)))))
22739 subr_die = old_die;
22741 /* Clear out the declaration attribute, but leave the
22742 parameters so they can be augmented with location
22743 information later. Unless this was a declaration, in
22744 which case, wipe out the nameless parameters and recreate
22745 them further down. */
22746 if (remove_AT (subr_die, DW_AT_declaration))
22749 remove_AT (subr_die, DW_AT_object_pointer);
22750 remove_child_TAG (subr_die, DW_TAG_formal_parameter);
22753 /* Make a specification pointing to the previously built
22754 declaration. */
22755 else
22757 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22758 add_AT_specification (subr_die, old_die);
22759 add_pubname (decl, subr_die);
22760 if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
22761 add_AT_file (subr_die, DW_AT_decl_file, file_index);
22762 if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
22763 add_AT_unsigned (subr_die, DW_AT_decl_line, s.line);
22764 if (debug_column_info
22765 && s.column
22766 && (get_AT_unsigned (old_die, DW_AT_decl_column)
22767 != (unsigned) s.column))
22768 add_AT_unsigned (subr_die, DW_AT_decl_column, s.column);
22770 /* If the prototype had an 'auto' or 'decltype(auto)' return type,
22771 emit the real type on the definition die. */
22772 if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE)
22774 dw_die_ref die = get_AT_ref (old_die, DW_AT_type);
22775 if (die == auto_die || die == decltype_auto_die)
22776 add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
22777 TYPE_UNQUALIFIED, false, context_die);
22780 /* When we process the method declaration, we haven't seen
22781 the out-of-class defaulted definition yet, so we have to
22782 recheck now. */
22783 if ((dwarf_version >= 5 || ! dwarf_strict)
22784 && !get_AT (subr_die, DW_AT_defaulted))
22786 int defaulted
22787 = lang_hooks.decls.decl_dwarf_attribute (decl,
22788 DW_AT_defaulted);
22789 if (defaulted != -1)
22791 /* Other values must have been handled before. */
22792 gcc_assert (defaulted == DW_DEFAULTED_out_of_class);
22793 add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
22798 /* Create a fresh DIE for anything else. */
22799 else
22801 subr_die = new_die (DW_TAG_subprogram, context_die, decl);
22803 if (TREE_PUBLIC (decl))
22804 add_AT_flag (subr_die, DW_AT_external, 1);
22806 add_name_and_src_coords_attributes (subr_die, decl);
22807 add_pubname (decl, subr_die);
22808 if (debug_info_level > DINFO_LEVEL_TERSE)
22810 add_prototyped_attribute (subr_die, TREE_TYPE (decl));
22811 add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
22812 TYPE_UNQUALIFIED, false, context_die);
22815 add_pure_or_virtual_attribute (subr_die, decl);
22816 if (DECL_ARTIFICIAL (decl))
22817 add_AT_flag (subr_die, DW_AT_artificial, 1);
22819 if (TREE_THIS_VOLATILE (decl) && (dwarf_version >= 5 || !dwarf_strict))
22820 add_AT_flag (subr_die, DW_AT_noreturn, 1);
22822 add_alignment_attribute (subr_die, decl);
22824 add_accessibility_attribute (subr_die, decl);
22827 /* Unless we have an existing non-declaration DIE, equate the new
22828 DIE. */
22829 if (!old_die || is_declaration_die (old_die))
22830 equate_decl_number_to_die (decl, subr_die);
22832 if (declaration)
22834 if (!old_die || !get_AT (old_die, DW_AT_inline))
22836 add_AT_flag (subr_die, DW_AT_declaration, 1);
22838 /* If this is an explicit function declaration then generate
22839 a DW_AT_explicit attribute. */
22840 if ((dwarf_version >= 3 || !dwarf_strict)
22841 && lang_hooks.decls.decl_dwarf_attribute (decl,
22842 DW_AT_explicit) == 1)
22843 add_AT_flag (subr_die, DW_AT_explicit, 1);
22845 /* If this is a C++11 deleted special function member then generate
22846 a DW_AT_deleted attribute. */
22847 if ((dwarf_version >= 5 || !dwarf_strict)
22848 && lang_hooks.decls.decl_dwarf_attribute (decl,
22849 DW_AT_deleted) == 1)
22850 add_AT_flag (subr_die, DW_AT_deleted, 1);
22852 /* If this is a C++11 defaulted special function member then
22853 generate a DW_AT_defaulted attribute. */
22854 if (dwarf_version >= 5 || !dwarf_strict)
22856 int defaulted
22857 = lang_hooks.decls.decl_dwarf_attribute (decl,
22858 DW_AT_defaulted);
22859 if (defaulted != -1)
22860 add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
22863 /* If this is a C++11 non-static member function with & ref-qualifier
22864 then generate a DW_AT_reference attribute. */
22865 if ((dwarf_version >= 5 || !dwarf_strict)
22866 && lang_hooks.decls.decl_dwarf_attribute (decl,
22867 DW_AT_reference) == 1)
22868 add_AT_flag (subr_die, DW_AT_reference, 1);
22870 /* If this is a C++11 non-static member function with &&
22871 ref-qualifier then generate a DW_AT_reference attribute. */
22872 if ((dwarf_version >= 5 || !dwarf_strict)
22873 && lang_hooks.decls.decl_dwarf_attribute (decl,
22874 DW_AT_rvalue_reference)
22875 == 1)
22876 add_AT_flag (subr_die, DW_AT_rvalue_reference, 1);
22879 /* For non DECL_EXTERNALs, if range information is available, fill
22880 the DIE with it. */
22881 else if (!DECL_EXTERNAL (decl) && !early_dwarf)
22883 HOST_WIDE_INT cfa_fb_offset;
22885 struct function *fun = DECL_STRUCT_FUNCTION (decl);
22887 if (!crtl->has_bb_partition)
22889 dw_fde_ref fde = fun->fde;
22890 if (fde->dw_fde_begin)
22892 /* We have already generated the labels. */
22893 add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
22894 fde->dw_fde_end, false);
22896 else
22898 /* Create start/end labels and add the range. */
22899 char label_id_low[MAX_ARTIFICIAL_LABEL_BYTES];
22900 char label_id_high[MAX_ARTIFICIAL_LABEL_BYTES];
22901 ASM_GENERATE_INTERNAL_LABEL (label_id_low, FUNC_BEGIN_LABEL,
22902 current_function_funcdef_no);
22903 ASM_GENERATE_INTERNAL_LABEL (label_id_high, FUNC_END_LABEL,
22904 current_function_funcdef_no);
22905 add_AT_low_high_pc (subr_die, label_id_low, label_id_high,
22906 false);
22909 #if VMS_DEBUGGING_INFO
22910 /* HP OpenVMS Industry Standard 64: DWARF Extensions
22911 Section 2.3 Prologue and Epilogue Attributes:
22912 When a breakpoint is set on entry to a function, it is generally
22913 desirable for execution to be suspended, not on the very first
22914 instruction of the function, but rather at a point after the
22915 function's frame has been set up, after any language defined local
22916 declaration processing has been completed, and before execution of
22917 the first statement of the function begins. Debuggers generally
22918 cannot properly determine where this point is. Similarly for a
22919 breakpoint set on exit from a function. The prologue and epilogue
22920 attributes allow a compiler to communicate the location(s) to use. */
22923 if (fde->dw_fde_vms_end_prologue)
22924 add_AT_vms_delta (subr_die, DW_AT_HP_prologue,
22925 fde->dw_fde_begin, fde->dw_fde_vms_end_prologue);
22927 if (fde->dw_fde_vms_begin_epilogue)
22928 add_AT_vms_delta (subr_die, DW_AT_HP_epilogue,
22929 fde->dw_fde_begin, fde->dw_fde_vms_begin_epilogue);
22931 #endif
22934 else
22936 /* Generate pubnames entries for the split function code ranges. */
22937 dw_fde_ref fde = fun->fde;
22939 if (fde->dw_fde_second_begin)
22941 if (dwarf_version >= 3 || !dwarf_strict)
22943 /* We should use ranges for non-contiguous code section
22944 addresses. Use the actual code range for the initial
22945 section, since the HOT/COLD labels might precede an
22946 alignment offset. */
22947 bool range_list_added = false;
22948 add_ranges_by_labels (subr_die, fde->dw_fde_begin,
22949 fde->dw_fde_end, &range_list_added,
22950 false);
22951 add_ranges_by_labels (subr_die, fde->dw_fde_second_begin,
22952 fde->dw_fde_second_end,
22953 &range_list_added, false);
22954 if (range_list_added)
22955 add_ranges (NULL);
22957 else
22959 /* There is no real support in DW2 for this .. so we make
22960 a work-around. First, emit the pub name for the segment
22961 containing the function label. Then make and emit a
22962 simplified subprogram DIE for the second segment with the
22963 name pre-fixed by __hot/cold_sect_of_. We use the same
22964 linkage name for the second die so that gdb will find both
22965 sections when given "b foo". */
22966 const char *name = NULL;
22967 tree decl_name = DECL_NAME (decl);
22968 dw_die_ref seg_die;
22970 /* Do the 'primary' section. */
22971 add_AT_low_high_pc (subr_die, fde->dw_fde_begin,
22972 fde->dw_fde_end, false);
22974 /* Build a minimal DIE for the secondary section. */
22975 seg_die = new_die (DW_TAG_subprogram,
22976 subr_die->die_parent, decl);
22978 if (TREE_PUBLIC (decl))
22979 add_AT_flag (seg_die, DW_AT_external, 1);
22981 if (decl_name != NULL
22982 && IDENTIFIER_POINTER (decl_name) != NULL)
22984 name = dwarf2_name (decl, 1);
22985 if (! DECL_ARTIFICIAL (decl))
22986 add_src_coords_attributes (seg_die, decl);
22988 add_linkage_name (seg_die, decl);
22990 gcc_assert (name != NULL);
22991 add_pure_or_virtual_attribute (seg_die, decl);
22992 if (DECL_ARTIFICIAL (decl))
22993 add_AT_flag (seg_die, DW_AT_artificial, 1);
22995 name = concat ("__second_sect_of_", name, NULL);
22996 add_AT_low_high_pc (seg_die, fde->dw_fde_second_begin,
22997 fde->dw_fde_second_end, false);
22998 add_name_attribute (seg_die, name);
22999 if (want_pubnames ())
23000 add_pubname_string (name, seg_die);
23003 else
23004 add_AT_low_high_pc (subr_die, fde->dw_fde_begin, fde->dw_fde_end,
23005 false);
23008 cfa_fb_offset = CFA_FRAME_BASE_OFFSET (decl);
23010 /* We define the "frame base" as the function's CFA. This is more
23011 convenient for several reasons: (1) It's stable across the prologue
23012 and epilogue, which makes it better than just a frame pointer,
23013 (2) With dwarf3, there exists a one-byte encoding that allows us
23014 to reference the .debug_frame data by proxy, but failing that,
23015 (3) We can at least reuse the code inspection and interpretation
23016 code that determines the CFA position at various points in the
23017 function. */
23018 if (dwarf_version >= 3 && targetm.debug_unwind_info () == UI_DWARF2)
23020 dw_loc_descr_ref op = new_loc_descr (DW_OP_call_frame_cfa, 0, 0);
23021 add_AT_loc (subr_die, DW_AT_frame_base, op);
23023 else
23025 dw_loc_list_ref list = convert_cfa_to_fb_loc_list (cfa_fb_offset);
23026 if (list->dw_loc_next)
23027 add_AT_loc_list (subr_die, DW_AT_frame_base, list);
23028 else
23029 add_AT_loc (subr_die, DW_AT_frame_base, list->expr);
23032 /* Compute a displacement from the "steady-state frame pointer" to
23033 the CFA. The former is what all stack slots and argument slots
23034 will reference in the rtl; the latter is what we've told the
23035 debugger about. We'll need to adjust all frame_base references
23036 by this displacement. */
23037 compute_frame_pointer_to_fb_displacement (cfa_fb_offset);
23039 if (fun->static_chain_decl)
23041 /* DWARF requires here a location expression that computes the
23042 address of the enclosing subprogram's frame base. The machinery
23043 in tree-nested.c is supposed to store this specific address in the
23044 last field of the FRAME record. */
23045 const tree frame_type
23046 = TREE_TYPE (TREE_TYPE (fun->static_chain_decl));
23047 const tree fb_decl = tree_last (TYPE_FIELDS (frame_type));
23049 tree fb_expr
23050 = build1 (INDIRECT_REF, frame_type, fun->static_chain_decl);
23051 fb_expr = build3 (COMPONENT_REF, TREE_TYPE (fb_decl),
23052 fb_expr, fb_decl, NULL_TREE);
23054 add_AT_location_description (subr_die, DW_AT_static_link,
23055 loc_list_from_tree (fb_expr, 0, NULL));
23058 resolve_variable_values ();
23061 /* Generate child dies for template paramaters. */
23062 if (early_dwarf && debug_info_level > DINFO_LEVEL_TERSE)
23063 gen_generic_params_dies (decl);
23065 /* Now output descriptions of the arguments for this function. This gets
23066 (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list
23067 for a FUNCTION_DECL doesn't indicate cases where there was a trailing
23068 `...' at the end of the formal parameter list. In order to find out if
23069 there was a trailing ellipsis or not, we must instead look at the type
23070 associated with the FUNCTION_DECL. This will be a node of type
23071 FUNCTION_TYPE. If the chain of type nodes hanging off of this
23072 FUNCTION_TYPE node ends with a void_type_node then there should *not* be
23073 an ellipsis at the end. */
23075 /* In the case where we are describing a mere function declaration, all we
23076 need to do here (and all we *can* do here) is to describe the *types* of
23077 its formal parameters. */
23078 if (debug_info_level <= DINFO_LEVEL_TERSE)
23080 else if (declaration)
23081 gen_formal_types_die (decl, subr_die);
23082 else
23084 /* Generate DIEs to represent all known formal parameters. */
23085 tree parm = DECL_ARGUMENTS (decl);
23086 tree generic_decl = early_dwarf
23087 ? lang_hooks.decls.get_generic_function_decl (decl) : NULL;
23088 tree generic_decl_parm = generic_decl
23089 ? DECL_ARGUMENTS (generic_decl)
23090 : NULL;
23092 /* Now we want to walk the list of parameters of the function and
23093 emit their relevant DIEs.
23095 We consider the case of DECL being an instance of a generic function
23096 as well as it being a normal function.
23098 If DECL is an instance of a generic function we walk the
23099 parameters of the generic function declaration _and_ the parameters of
23100 DECL itself. This is useful because we want to emit specific DIEs for
23101 function parameter packs and those are declared as part of the
23102 generic function declaration. In that particular case,
23103 the parameter pack yields a DW_TAG_GNU_formal_parameter_pack DIE.
23104 That DIE has children DIEs representing the set of arguments
23105 of the pack. Note that the set of pack arguments can be empty.
23106 In that case, the DW_TAG_GNU_formal_parameter_pack DIE will not have any
23107 children DIE.
23109 Otherwise, we just consider the parameters of DECL. */
23110 while (generic_decl_parm || parm)
23112 if (generic_decl_parm
23113 && lang_hooks.function_parameter_pack_p (generic_decl_parm))
23114 gen_formal_parameter_pack_die (generic_decl_parm,
23115 parm, subr_die,
23116 &parm);
23117 else if (parm && !POINTER_BOUNDS_P (parm))
23119 dw_die_ref parm_die = gen_decl_die (parm, NULL, NULL, subr_die);
23121 if (early_dwarf
23122 && parm == DECL_ARGUMENTS (decl)
23123 && TREE_CODE (TREE_TYPE (decl)) == METHOD_TYPE
23124 && parm_die
23125 && (dwarf_version >= 3 || !dwarf_strict))
23126 add_AT_die_ref (subr_die, DW_AT_object_pointer, parm_die);
23128 parm = DECL_CHAIN (parm);
23130 else if (parm)
23131 parm = DECL_CHAIN (parm);
23133 if (generic_decl_parm)
23134 generic_decl_parm = DECL_CHAIN (generic_decl_parm);
23137 /* Decide whether we need an unspecified_parameters DIE at the end.
23138 There are 2 more cases to do this for: 1) the ansi ... declaration -
23139 this is detectable when the end of the arg list is not a
23140 void_type_node 2) an unprototyped function declaration (not a
23141 definition). This just means that we have no info about the
23142 parameters at all. */
23143 if (early_dwarf)
23145 if (prototype_p (TREE_TYPE (decl)))
23147 /* This is the prototyped case, check for.... */
23148 if (stdarg_p (TREE_TYPE (decl)))
23149 gen_unspecified_parameters_die (decl, subr_die);
23151 else if (DECL_INITIAL (decl) == NULL_TREE)
23152 gen_unspecified_parameters_die (decl, subr_die);
23156 if (subr_die != old_die)
23157 /* Add the calling convention attribute if requested. */
23158 add_calling_convention_attribute (subr_die, decl);
23160 /* Output Dwarf info for all of the stuff within the body of the function
23161 (if it has one - it may be just a declaration).
23163 OUTER_SCOPE is a pointer to the outermost BLOCK node created to represent
23164 a function. This BLOCK actually represents the outermost binding contour
23165 for the function, i.e. the contour in which the function's formal
23166 parameters and labels get declared. Curiously, it appears that the front
23167 end doesn't actually put the PARM_DECL nodes for the current function onto
23168 the BLOCK_VARS list for this outer scope, but are strung off of the
23169 DECL_ARGUMENTS list for the function instead.
23171 The BLOCK_VARS list for the `outer_scope' does provide us with a list of
23172 the LABEL_DECL nodes for the function however, and we output DWARF info
23173 for those in decls_for_scope. Just within the `outer_scope' there will be
23174 a BLOCK node representing the function's outermost pair of curly braces,
23175 and any blocks used for the base and member initializers of a C++
23176 constructor function. */
23177 tree outer_scope = DECL_INITIAL (decl);
23178 if (! declaration && outer_scope && TREE_CODE (outer_scope) != ERROR_MARK)
23180 int call_site_note_count = 0;
23181 int tail_call_site_note_count = 0;
23183 /* Emit a DW_TAG_variable DIE for a named return value. */
23184 if (DECL_NAME (DECL_RESULT (decl)))
23185 gen_decl_die (DECL_RESULT (decl), NULL, NULL, subr_die);
23187 /* The first time through decls_for_scope we will generate the
23188 DIEs for the locals. The second time, we fill in the
23189 location info. */
23190 decls_for_scope (outer_scope, subr_die);
23192 if (call_arg_locations && (!dwarf_strict || dwarf_version >= 5))
23194 struct call_arg_loc_node *ca_loc;
23195 for (ca_loc = call_arg_locations; ca_loc; ca_loc = ca_loc->next)
23197 dw_die_ref die = NULL;
23198 rtx tloc = NULL_RTX, tlocc = NULL_RTX;
23199 rtx arg, next_arg;
23201 for (arg = (ca_loc->call_arg_loc_note != NULL_RTX
23202 ? XEXP (ca_loc->call_arg_loc_note, 0)
23203 : NULL_RTX);
23204 arg; arg = next_arg)
23206 dw_loc_descr_ref reg, val;
23207 machine_mode mode = GET_MODE (XEXP (XEXP (arg, 0), 1));
23208 dw_die_ref cdie, tdie = NULL;
23210 next_arg = XEXP (arg, 1);
23211 if (REG_P (XEXP (XEXP (arg, 0), 0))
23212 && next_arg
23213 && MEM_P (XEXP (XEXP (next_arg, 0), 0))
23214 && REG_P (XEXP (XEXP (XEXP (next_arg, 0), 0), 0))
23215 && REGNO (XEXP (XEXP (arg, 0), 0))
23216 == REGNO (XEXP (XEXP (XEXP (next_arg, 0), 0), 0)))
23217 next_arg = XEXP (next_arg, 1);
23218 if (mode == VOIDmode)
23220 mode = GET_MODE (XEXP (XEXP (arg, 0), 0));
23221 if (mode == VOIDmode)
23222 mode = GET_MODE (XEXP (arg, 0));
23224 if (mode == VOIDmode || mode == BLKmode)
23225 continue;
23226 /* Get dynamic information about call target only if we
23227 have no static information: we cannot generate both
23228 DW_AT_call_origin and DW_AT_call_target
23229 attributes. */
23230 if (ca_loc->symbol_ref == NULL_RTX)
23232 if (XEXP (XEXP (arg, 0), 0) == pc_rtx)
23234 tloc = XEXP (XEXP (arg, 0), 1);
23235 continue;
23237 else if (GET_CODE (XEXP (XEXP (arg, 0), 0)) == CLOBBER
23238 && XEXP (XEXP (XEXP (arg, 0), 0), 0) == pc_rtx)
23240 tlocc = XEXP (XEXP (arg, 0), 1);
23241 continue;
23244 reg = NULL;
23245 if (REG_P (XEXP (XEXP (arg, 0), 0)))
23246 reg = reg_loc_descriptor (XEXP (XEXP (arg, 0), 0),
23247 VAR_INIT_STATUS_INITIALIZED);
23248 else if (MEM_P (XEXP (XEXP (arg, 0), 0)))
23250 rtx mem = XEXP (XEXP (arg, 0), 0);
23251 reg = mem_loc_descriptor (XEXP (mem, 0),
23252 get_address_mode (mem),
23253 GET_MODE (mem),
23254 VAR_INIT_STATUS_INITIALIZED);
23256 else if (GET_CODE (XEXP (XEXP (arg, 0), 0))
23257 == DEBUG_PARAMETER_REF)
23259 tree tdecl
23260 = DEBUG_PARAMETER_REF_DECL (XEXP (XEXP (arg, 0), 0));
23261 tdie = lookup_decl_die (tdecl);
23262 if (tdie == NULL)
23263 continue;
23265 else
23266 continue;
23267 if (reg == NULL
23268 && GET_CODE (XEXP (XEXP (arg, 0), 0))
23269 != DEBUG_PARAMETER_REF)
23270 continue;
23271 val = mem_loc_descriptor (XEXP (XEXP (arg, 0), 1), mode,
23272 VOIDmode,
23273 VAR_INIT_STATUS_INITIALIZED);
23274 if (val == NULL)
23275 continue;
23276 if (die == NULL)
23277 die = gen_call_site_die (decl, subr_die, ca_loc);
23278 cdie = new_die (dwarf_TAG (DW_TAG_call_site_parameter), die,
23279 NULL_TREE);
23280 if (reg != NULL)
23281 add_AT_loc (cdie, DW_AT_location, reg);
23282 else if (tdie != NULL)
23283 add_AT_die_ref (cdie, dwarf_AT (DW_AT_call_parameter),
23284 tdie);
23285 add_AT_loc (cdie, dwarf_AT (DW_AT_call_value), val);
23286 if (next_arg != XEXP (arg, 1))
23288 mode = GET_MODE (XEXP (XEXP (XEXP (arg, 1), 0), 1));
23289 if (mode == VOIDmode)
23290 mode = GET_MODE (XEXP (XEXP (XEXP (arg, 1), 0), 0));
23291 val = mem_loc_descriptor (XEXP (XEXP (XEXP (arg, 1),
23292 0), 1),
23293 mode, VOIDmode,
23294 VAR_INIT_STATUS_INITIALIZED);
23295 if (val != NULL)
23296 add_AT_loc (cdie, dwarf_AT (DW_AT_call_data_value),
23297 val);
23300 if (die == NULL
23301 && (ca_loc->symbol_ref || tloc))
23302 die = gen_call_site_die (decl, subr_die, ca_loc);
23303 if (die != NULL && (tloc != NULL_RTX || tlocc != NULL_RTX))
23305 dw_loc_descr_ref tval = NULL;
23307 if (tloc != NULL_RTX)
23308 tval = mem_loc_descriptor (tloc,
23309 GET_MODE (tloc) == VOIDmode
23310 ? Pmode : GET_MODE (tloc),
23311 VOIDmode,
23312 VAR_INIT_STATUS_INITIALIZED);
23313 if (tval)
23314 add_AT_loc (die, dwarf_AT (DW_AT_call_target), tval);
23315 else if (tlocc != NULL_RTX)
23317 tval = mem_loc_descriptor (tlocc,
23318 GET_MODE (tlocc) == VOIDmode
23319 ? Pmode : GET_MODE (tlocc),
23320 VOIDmode,
23321 VAR_INIT_STATUS_INITIALIZED);
23322 if (tval)
23323 add_AT_loc (die,
23324 dwarf_AT (DW_AT_call_target_clobbered),
23325 tval);
23328 if (die != NULL)
23330 call_site_note_count++;
23331 if (ca_loc->tail_call_p)
23332 tail_call_site_note_count++;
23336 call_arg_locations = NULL;
23337 call_arg_loc_last = NULL;
23338 if (tail_call_site_count >= 0
23339 && tail_call_site_count == tail_call_site_note_count
23340 && (!dwarf_strict || dwarf_version >= 5))
23342 if (call_site_count >= 0
23343 && call_site_count == call_site_note_count)
23344 add_AT_flag (subr_die, dwarf_AT (DW_AT_call_all_calls), 1);
23345 else
23346 add_AT_flag (subr_die, dwarf_AT (DW_AT_call_all_tail_calls), 1);
23348 call_site_count = -1;
23349 tail_call_site_count = -1;
23352 /* Mark used types after we have created DIEs for the functions scopes. */
23353 premark_used_types (DECL_STRUCT_FUNCTION (decl));
23356 /* Returns a hash value for X (which really is a die_struct). */
23358 hashval_t
23359 block_die_hasher::hash (die_struct *d)
23361 return (hashval_t) d->decl_id ^ htab_hash_pointer (d->die_parent);
23364 /* Return nonzero if decl_id and die_parent of die_struct X is the same
23365 as decl_id and die_parent of die_struct Y. */
23367 bool
23368 block_die_hasher::equal (die_struct *x, die_struct *y)
23370 return x->decl_id == y->decl_id && x->die_parent == y->die_parent;
23373 /* Hold information about markers for inlined entry points. */
23374 struct GTY ((for_user)) inline_entry_data
23376 /* The block that's the inlined_function_outer_scope for an inlined
23377 function. */
23378 tree block;
23380 /* The label at the inlined entry point. */
23381 const char *label_pfx;
23382 unsigned int label_num;
23384 /* The view number to be used as the inlined entry point. */
23385 var_loc_view view;
23388 struct inline_entry_data_hasher : ggc_ptr_hash <inline_entry_data>
23390 typedef tree compare_type;
23391 static inline hashval_t hash (const inline_entry_data *);
23392 static inline bool equal (const inline_entry_data *, const_tree);
23395 /* Hash table routines for inline_entry_data. */
23397 inline hashval_t
23398 inline_entry_data_hasher::hash (const inline_entry_data *data)
23400 return htab_hash_pointer (data->block);
23403 inline bool
23404 inline_entry_data_hasher::equal (const inline_entry_data *data,
23405 const_tree block)
23407 return data->block == block;
23410 /* Inlined entry points pending DIE creation in this compilation unit. */
23412 static GTY(()) hash_table<inline_entry_data_hasher> *inline_entry_data_table;
23415 /* Return TRUE if DECL, which may have been previously generated as
23416 OLD_DIE, is a candidate for a DW_AT_specification. DECLARATION is
23417 true if decl (or its origin) is either an extern declaration or a
23418 class/namespace scoped declaration.
23420 The declare_in_namespace support causes us to get two DIEs for one
23421 variable, both of which are declarations. We want to avoid
23422 considering one to be a specification, so we must test for
23423 DECLARATION and DW_AT_declaration. */
23424 static inline bool
23425 decl_will_get_specification_p (dw_die_ref old_die, tree decl, bool declaration)
23427 return (old_die && TREE_STATIC (decl) && !declaration
23428 && get_AT_flag (old_die, DW_AT_declaration) == 1);
23431 /* Return true if DECL is a local static. */
23433 static inline bool
23434 local_function_static (tree decl)
23436 gcc_assert (VAR_P (decl));
23437 return TREE_STATIC (decl)
23438 && DECL_CONTEXT (decl)
23439 && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL;
23442 /* Generate a DIE to represent a declared data object.
23443 Either DECL or ORIGIN must be non-null. */
23445 static void
23446 gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
23448 HOST_WIDE_INT off = 0;
23449 tree com_decl;
23450 tree decl_or_origin = decl ? decl : origin;
23451 tree ultimate_origin;
23452 dw_die_ref var_die;
23453 dw_die_ref old_die = decl ? lookup_decl_die (decl) : NULL;
23454 bool declaration = (DECL_EXTERNAL (decl_or_origin)
23455 || class_or_namespace_scope_p (context_die));
23456 bool specialization_p = false;
23457 bool no_linkage_name = false;
23459 /* While C++ inline static data members have definitions inside of the
23460 class, force the first DIE to be a declaration, then let gen_member_die
23461 reparent it to the class context and call gen_variable_die again
23462 to create the outside of the class DIE for the definition. */
23463 if (!declaration
23464 && old_die == NULL
23465 && decl
23466 && DECL_CONTEXT (decl)
23467 && TYPE_P (DECL_CONTEXT (decl))
23468 && lang_hooks.decls.decl_dwarf_attribute (decl, DW_AT_inline) != -1)
23470 declaration = true;
23471 if (dwarf_version < 5)
23472 no_linkage_name = true;
23475 ultimate_origin = decl_ultimate_origin (decl_or_origin);
23476 if (decl || ultimate_origin)
23477 origin = ultimate_origin;
23478 com_decl = fortran_common (decl_or_origin, &off);
23480 /* Symbol in common gets emitted as a child of the common block, in the form
23481 of a data member. */
23482 if (com_decl)
23484 dw_die_ref com_die;
23485 dw_loc_list_ref loc = NULL;
23486 die_node com_die_arg;
23488 var_die = lookup_decl_die (decl_or_origin);
23489 if (var_die)
23491 if (! early_dwarf && get_AT (var_die, DW_AT_location) == NULL)
23493 loc = loc_list_from_tree (com_decl, off ? 1 : 2, NULL);
23494 if (loc)
23496 if (off)
23498 /* Optimize the common case. */
23499 if (single_element_loc_list_p (loc)
23500 && loc->expr->dw_loc_opc == DW_OP_addr
23501 && loc->expr->dw_loc_next == NULL
23502 && GET_CODE (loc->expr->dw_loc_oprnd1.v.val_addr)
23503 == SYMBOL_REF)
23505 rtx x = loc->expr->dw_loc_oprnd1.v.val_addr;
23506 loc->expr->dw_loc_oprnd1.v.val_addr
23507 = plus_constant (GET_MODE (x), x , off);
23509 else
23510 loc_list_plus_const (loc, off);
23512 add_AT_location_description (var_die, DW_AT_location, loc);
23513 remove_AT (var_die, DW_AT_declaration);
23516 return;
23519 if (common_block_die_table == NULL)
23520 common_block_die_table = hash_table<block_die_hasher>::create_ggc (10);
23522 com_die_arg.decl_id = DECL_UID (com_decl);
23523 com_die_arg.die_parent = context_die;
23524 com_die = common_block_die_table->find (&com_die_arg);
23525 if (! early_dwarf)
23526 loc = loc_list_from_tree (com_decl, 2, NULL);
23527 if (com_die == NULL)
23529 const char *cnam
23530 = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl));
23531 die_node **slot;
23533 com_die = new_die (DW_TAG_common_block, context_die, decl);
23534 add_name_and_src_coords_attributes (com_die, com_decl);
23535 if (loc)
23537 add_AT_location_description (com_die, DW_AT_location, loc);
23538 /* Avoid sharing the same loc descriptor between
23539 DW_TAG_common_block and DW_TAG_variable. */
23540 loc = loc_list_from_tree (com_decl, 2, NULL);
23542 else if (DECL_EXTERNAL (decl_or_origin))
23543 add_AT_flag (com_die, DW_AT_declaration, 1);
23544 if (want_pubnames ())
23545 add_pubname_string (cnam, com_die); /* ??? needed? */
23546 com_die->decl_id = DECL_UID (com_decl);
23547 slot = common_block_die_table->find_slot (com_die, INSERT);
23548 *slot = com_die;
23550 else if (get_AT (com_die, DW_AT_location) == NULL && loc)
23552 add_AT_location_description (com_die, DW_AT_location, loc);
23553 loc = loc_list_from_tree (com_decl, 2, NULL);
23554 remove_AT (com_die, DW_AT_declaration);
23556 var_die = new_die (DW_TAG_variable, com_die, decl);
23557 add_name_and_src_coords_attributes (var_die, decl_or_origin);
23558 add_type_attribute (var_die, TREE_TYPE (decl_or_origin),
23559 decl_quals (decl_or_origin), false,
23560 context_die);
23561 add_alignment_attribute (var_die, decl);
23562 add_AT_flag (var_die, DW_AT_external, 1);
23563 if (loc)
23565 if (off)
23567 /* Optimize the common case. */
23568 if (single_element_loc_list_p (loc)
23569 && loc->expr->dw_loc_opc == DW_OP_addr
23570 && loc->expr->dw_loc_next == NULL
23571 && GET_CODE (loc->expr->dw_loc_oprnd1.v.val_addr) == SYMBOL_REF)
23573 rtx x = loc->expr->dw_loc_oprnd1.v.val_addr;
23574 loc->expr->dw_loc_oprnd1.v.val_addr
23575 = plus_constant (GET_MODE (x), x, off);
23577 else
23578 loc_list_plus_const (loc, off);
23580 add_AT_location_description (var_die, DW_AT_location, loc);
23582 else if (DECL_EXTERNAL (decl_or_origin))
23583 add_AT_flag (var_die, DW_AT_declaration, 1);
23584 if (decl)
23585 equate_decl_number_to_die (decl, var_die);
23586 return;
23589 if (old_die)
23591 if (declaration)
23593 /* A declaration that has been previously dumped, needs no
23594 further annotations, since it doesn't need location on
23595 the second pass. */
23596 return;
23598 else if (decl_will_get_specification_p (old_die, decl, declaration)
23599 && !get_AT (old_die, DW_AT_specification))
23601 /* Fall-thru so we can make a new variable die along with a
23602 DW_AT_specification. */
23604 else if (origin && old_die->die_parent != context_die)
23606 /* If we will be creating an inlined instance, we need a
23607 new DIE that will get annotated with
23608 DW_AT_abstract_origin. */
23609 gcc_assert (!DECL_ABSTRACT_P (decl));
23611 else
23613 /* If a DIE was dumped early, it still needs location info.
23614 Skip to where we fill the location bits. */
23615 var_die = old_die;
23617 /* ??? In LTRANS we cannot annotate early created variably
23618 modified type DIEs without copying them and adjusting all
23619 references to them. Thus we dumped them again. Also add a
23620 reference to them but beware of -g0 compile and -g link
23621 in which case the reference will be already present. */
23622 tree type = TREE_TYPE (decl_or_origin);
23623 if (in_lto_p
23624 && ! get_AT (var_die, DW_AT_type)
23625 && variably_modified_type_p
23626 (type, decl_function_context (decl_or_origin)))
23628 if (decl_by_reference_p (decl_or_origin))
23629 add_type_attribute (var_die, TREE_TYPE (type),
23630 TYPE_UNQUALIFIED, false, context_die);
23631 else
23632 add_type_attribute (var_die, type, decl_quals (decl_or_origin),
23633 false, context_die);
23636 goto gen_variable_die_location;
23640 /* For static data members, the declaration in the class is supposed
23641 to have DW_TAG_member tag in DWARF{3,4} and we emit it for compatibility
23642 also in DWARF2; the specification should still be DW_TAG_variable
23643 referencing the DW_TAG_member DIE. */
23644 if (declaration && class_scope_p (context_die) && dwarf_version < 5)
23645 var_die = new_die (DW_TAG_member, context_die, decl);
23646 else
23647 var_die = new_die (DW_TAG_variable, context_die, decl);
23649 if (origin != NULL)
23650 add_abstract_origin_attribute (var_die, origin);
23652 /* Loop unrolling can create multiple blocks that refer to the same
23653 static variable, so we must test for the DW_AT_declaration flag.
23655 ??? Loop unrolling/reorder_blocks should perhaps be rewritten to
23656 copy decls and set the DECL_ABSTRACT_P flag on them instead of
23657 sharing them.
23659 ??? Duplicated blocks have been rewritten to use .debug_ranges. */
23660 else if (decl_will_get_specification_p (old_die, decl, declaration))
23662 /* This is a definition of a C++ class level static. */
23663 add_AT_specification (var_die, old_die);
23664 specialization_p = true;
23665 if (DECL_NAME (decl))
23667 expanded_location s = expand_location (DECL_SOURCE_LOCATION (decl));
23668 struct dwarf_file_data * file_index = lookup_filename (s.file);
23670 if (get_AT_file (old_die, DW_AT_decl_file) != file_index)
23671 add_AT_file (var_die, DW_AT_decl_file, file_index);
23673 if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line)
23674 add_AT_unsigned (var_die, DW_AT_decl_line, s.line);
23676 if (debug_column_info
23677 && s.column
23678 && (get_AT_unsigned (old_die, DW_AT_decl_column)
23679 != (unsigned) s.column))
23680 add_AT_unsigned (var_die, DW_AT_decl_column, s.column);
23682 if (old_die->die_tag == DW_TAG_member)
23683 add_linkage_name (var_die, decl);
23686 else
23687 add_name_and_src_coords_attributes (var_die, decl, no_linkage_name);
23689 if ((origin == NULL && !specialization_p)
23690 || (origin != NULL
23691 && !DECL_ABSTRACT_P (decl_or_origin)
23692 && variably_modified_type_p (TREE_TYPE (decl_or_origin),
23693 decl_function_context
23694 (decl_or_origin))))
23696 tree type = TREE_TYPE (decl_or_origin);
23698 if (decl_by_reference_p (decl_or_origin))
23699 add_type_attribute (var_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
23700 context_die);
23701 else
23702 add_type_attribute (var_die, type, decl_quals (decl_or_origin), false,
23703 context_die);
23706 if (origin == NULL && !specialization_p)
23708 if (TREE_PUBLIC (decl))
23709 add_AT_flag (var_die, DW_AT_external, 1);
23711 if (DECL_ARTIFICIAL (decl))
23712 add_AT_flag (var_die, DW_AT_artificial, 1);
23714 add_alignment_attribute (var_die, decl);
23716 add_accessibility_attribute (var_die, decl);
23719 if (declaration)
23720 add_AT_flag (var_die, DW_AT_declaration, 1);
23722 if (decl && (DECL_ABSTRACT_P (decl)
23723 || !old_die || is_declaration_die (old_die)))
23724 equate_decl_number_to_die (decl, var_die);
23726 gen_variable_die_location:
23727 if (! declaration
23728 && (! DECL_ABSTRACT_P (decl_or_origin)
23729 /* Local static vars are shared between all clones/inlines,
23730 so emit DW_AT_location on the abstract DIE if DECL_RTL is
23731 already set. */
23732 || (VAR_P (decl_or_origin)
23733 && TREE_STATIC (decl_or_origin)
23734 && DECL_RTL_SET_P (decl_or_origin))))
23736 if (early_dwarf)
23737 add_pubname (decl_or_origin, var_die);
23738 else
23739 add_location_or_const_value_attribute (var_die, decl_or_origin,
23740 decl == NULL);
23742 else
23743 tree_add_const_value_attribute_for_decl (var_die, decl_or_origin);
23745 if ((dwarf_version >= 4 || !dwarf_strict)
23746 && lang_hooks.decls.decl_dwarf_attribute (decl_or_origin,
23747 DW_AT_const_expr) == 1
23748 && !get_AT (var_die, DW_AT_const_expr)
23749 && !specialization_p)
23750 add_AT_flag (var_die, DW_AT_const_expr, 1);
23752 if (!dwarf_strict)
23754 int inl = lang_hooks.decls.decl_dwarf_attribute (decl_or_origin,
23755 DW_AT_inline);
23756 if (inl != -1
23757 && !get_AT (var_die, DW_AT_inline)
23758 && !specialization_p)
23759 add_AT_unsigned (var_die, DW_AT_inline, inl);
23763 /* Generate a DIE to represent a named constant. */
23765 static void
23766 gen_const_die (tree decl, dw_die_ref context_die)
23768 dw_die_ref const_die;
23769 tree type = TREE_TYPE (decl);
23771 const_die = lookup_decl_die (decl);
23772 if (const_die)
23773 return;
23775 const_die = new_die (DW_TAG_constant, context_die, decl);
23776 equate_decl_number_to_die (decl, const_die);
23777 add_name_and_src_coords_attributes (const_die, decl);
23778 add_type_attribute (const_die, type, TYPE_QUAL_CONST, false, context_die);
23779 if (TREE_PUBLIC (decl))
23780 add_AT_flag (const_die, DW_AT_external, 1);
23781 if (DECL_ARTIFICIAL (decl))
23782 add_AT_flag (const_die, DW_AT_artificial, 1);
23783 tree_add_const_value_attribute_for_decl (const_die, decl);
23786 /* Generate a DIE to represent a label identifier. */
23788 static void
23789 gen_label_die (tree decl, dw_die_ref context_die)
23791 tree origin = decl_ultimate_origin (decl);
23792 dw_die_ref lbl_die = lookup_decl_die (decl);
23793 rtx insn;
23794 char label[MAX_ARTIFICIAL_LABEL_BYTES];
23796 if (!lbl_die)
23798 lbl_die = new_die (DW_TAG_label, context_die, decl);
23799 equate_decl_number_to_die (decl, lbl_die);
23801 if (origin != NULL)
23802 add_abstract_origin_attribute (lbl_die, origin);
23803 else
23804 add_name_and_src_coords_attributes (lbl_die, decl);
23807 if (DECL_ABSTRACT_P (decl))
23808 equate_decl_number_to_die (decl, lbl_die);
23809 else if (! early_dwarf)
23811 insn = DECL_RTL_IF_SET (decl);
23813 /* Deleted labels are programmer specified labels which have been
23814 eliminated because of various optimizations. We still emit them
23815 here so that it is possible to put breakpoints on them. */
23816 if (insn
23817 && (LABEL_P (insn)
23818 || ((NOTE_P (insn)
23819 && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))))
23821 /* When optimization is enabled (via -O) some parts of the compiler
23822 (e.g. jump.c and cse.c) may try to delete CODE_LABEL insns which
23823 represent source-level labels which were explicitly declared by
23824 the user. This really shouldn't be happening though, so catch
23825 it if it ever does happen. */
23826 gcc_assert (!as_a<rtx_insn *> (insn)->deleted ());
23828 ASM_GENERATE_INTERNAL_LABEL (label, "L", CODE_LABEL_NUMBER (insn));
23829 add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
23831 else if (insn
23832 && NOTE_P (insn)
23833 && NOTE_KIND (insn) == NOTE_INSN_DELETED_DEBUG_LABEL
23834 && CODE_LABEL_NUMBER (insn) != -1)
23836 ASM_GENERATE_INTERNAL_LABEL (label, "LDL", CODE_LABEL_NUMBER (insn));
23837 add_AT_lbl_id (lbl_die, DW_AT_low_pc, label);
23842 /* A helper function for gen_inlined_subroutine_die. Add source coordinate
23843 attributes to the DIE for a block STMT, to describe where the inlined
23844 function was called from. This is similar to add_src_coords_attributes. */
23846 static inline void
23847 add_call_src_coords_attributes (tree stmt, dw_die_ref die)
23849 expanded_location s = expand_location (BLOCK_SOURCE_LOCATION (stmt));
23851 if (dwarf_version >= 3 || !dwarf_strict)
23853 add_AT_file (die, DW_AT_call_file, lookup_filename (s.file));
23854 add_AT_unsigned (die, DW_AT_call_line, s.line);
23855 if (debug_column_info && s.column)
23856 add_AT_unsigned (die, DW_AT_call_column, s.column);
23861 /* A helper function for gen_lexical_block_die and gen_inlined_subroutine_die.
23862 Add low_pc and high_pc attributes to the DIE for a block STMT. */
23864 static inline void
23865 add_high_low_attributes (tree stmt, dw_die_ref die)
23867 char label[MAX_ARTIFICIAL_LABEL_BYTES];
23869 if (inline_entry_data **iedp
23870 = !inline_entry_data_table ? NULL
23871 : inline_entry_data_table->find_slot_with_hash (stmt,
23872 htab_hash_pointer (stmt),
23873 NO_INSERT))
23875 inline_entry_data *ied = *iedp;
23876 gcc_assert (MAY_HAVE_DEBUG_MARKER_INSNS);
23877 gcc_assert (debug_inline_points);
23878 gcc_assert (inlined_function_outer_scope_p (stmt));
23880 ASM_GENERATE_INTERNAL_LABEL (label, ied->label_pfx, ied->label_num);
23881 add_AT_lbl_id (die, DW_AT_entry_pc, label);
23883 if (debug_variable_location_views && !ZERO_VIEW_P (ied->view)
23884 && !dwarf_strict)
23886 if (!output_asm_line_debug_info ())
23887 add_AT_unsigned (die, DW_AT_GNU_entry_view, ied->view);
23888 else
23890 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", ied->view);
23891 /* FIXME: this will resolve to a small number. Could we
23892 possibly emit smaller data? Ideally we'd emit a
23893 uleb128, but that would make the size of DIEs
23894 impossible for the compiler to compute, since it's
23895 the assembler that computes the value of the view
23896 label in this case. Ideally, we'd have a single form
23897 encompassing both the address and the view, and
23898 indirecting them through a table might make things
23899 easier, but even that would be more wasteful,
23900 space-wise, than what we have now. */
23901 add_AT_symview (die, DW_AT_GNU_entry_view, label);
23905 inline_entry_data_table->clear_slot (iedp);
23908 if (BLOCK_FRAGMENT_CHAIN (stmt)
23909 && (dwarf_version >= 3 || !dwarf_strict))
23911 tree chain, superblock = NULL_TREE;
23912 dw_die_ref pdie;
23913 dw_attr_node *attr = NULL;
23915 if (!debug_inline_points && inlined_function_outer_scope_p (stmt))
23917 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
23918 BLOCK_NUMBER (stmt));
23919 add_AT_lbl_id (die, DW_AT_entry_pc, label);
23922 /* Optimize duplicate .debug_ranges lists or even tails of
23923 lists. If this BLOCK has same ranges as its supercontext,
23924 lookup DW_AT_ranges attribute in the supercontext (and
23925 recursively so), verify that the ranges_table contains the
23926 right values and use it instead of adding a new .debug_range. */
23927 for (chain = stmt, pdie = die;
23928 BLOCK_SAME_RANGE (chain);
23929 chain = BLOCK_SUPERCONTEXT (chain))
23931 dw_attr_node *new_attr;
23933 pdie = pdie->die_parent;
23934 if (pdie == NULL)
23935 break;
23936 if (BLOCK_SUPERCONTEXT (chain) == NULL_TREE)
23937 break;
23938 new_attr = get_AT (pdie, DW_AT_ranges);
23939 if (new_attr == NULL
23940 || new_attr->dw_attr_val.val_class != dw_val_class_range_list)
23941 break;
23942 attr = new_attr;
23943 superblock = BLOCK_SUPERCONTEXT (chain);
23945 if (attr != NULL
23946 && ((*ranges_table)[attr->dw_attr_val.v.val_offset].num
23947 == BLOCK_NUMBER (superblock))
23948 && BLOCK_FRAGMENT_CHAIN (superblock))
23950 unsigned long off = attr->dw_attr_val.v.val_offset;
23951 unsigned long supercnt = 0, thiscnt = 0;
23952 for (chain = BLOCK_FRAGMENT_CHAIN (superblock);
23953 chain; chain = BLOCK_FRAGMENT_CHAIN (chain))
23955 ++supercnt;
23956 gcc_checking_assert ((*ranges_table)[off + supercnt].num
23957 == BLOCK_NUMBER (chain));
23959 gcc_checking_assert ((*ranges_table)[off + supercnt + 1].num == 0);
23960 for (chain = BLOCK_FRAGMENT_CHAIN (stmt);
23961 chain; chain = BLOCK_FRAGMENT_CHAIN (chain))
23962 ++thiscnt;
23963 gcc_assert (supercnt >= thiscnt);
23964 add_AT_range_list (die, DW_AT_ranges, off + supercnt - thiscnt,
23965 false);
23966 note_rnglist_head (off + supercnt - thiscnt);
23967 return;
23970 unsigned int offset = add_ranges (stmt, true);
23971 add_AT_range_list (die, DW_AT_ranges, offset, false);
23972 note_rnglist_head (offset);
23974 bool prev_in_cold = BLOCK_IN_COLD_SECTION_P (stmt);
23975 chain = BLOCK_FRAGMENT_CHAIN (stmt);
23978 add_ranges (chain, prev_in_cold != BLOCK_IN_COLD_SECTION_P (chain));
23979 prev_in_cold = BLOCK_IN_COLD_SECTION_P (chain);
23980 chain = BLOCK_FRAGMENT_CHAIN (chain);
23982 while (chain);
23983 add_ranges (NULL);
23985 else
23987 char label_high[MAX_ARTIFICIAL_LABEL_BYTES];
23988 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_BEGIN_LABEL,
23989 BLOCK_NUMBER (stmt));
23990 ASM_GENERATE_INTERNAL_LABEL (label_high, BLOCK_END_LABEL,
23991 BLOCK_NUMBER (stmt));
23992 add_AT_low_high_pc (die, label, label_high, false);
23996 /* Generate a DIE for a lexical block. */
23998 static void
23999 gen_lexical_block_die (tree stmt, dw_die_ref context_die)
24001 dw_die_ref old_die = BLOCK_DIE (stmt);
24002 dw_die_ref stmt_die = NULL;
24003 if (!old_die)
24005 stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
24006 BLOCK_DIE (stmt) = stmt_die;
24009 if (BLOCK_ABSTRACT (stmt))
24011 if (old_die)
24013 /* This must have been generated early and it won't even
24014 need location information since it's a DW_AT_inline
24015 function. */
24016 if (flag_checking)
24017 for (dw_die_ref c = context_die; c; c = c->die_parent)
24018 if (c->die_tag == DW_TAG_inlined_subroutine
24019 || c->die_tag == DW_TAG_subprogram)
24021 gcc_assert (get_AT (c, DW_AT_inline));
24022 break;
24024 return;
24027 else if (BLOCK_ABSTRACT_ORIGIN (stmt))
24029 /* If this is an inlined instance, create a new lexical die for
24030 anything below to attach DW_AT_abstract_origin to. */
24031 if (old_die)
24033 stmt_die = new_die (DW_TAG_lexical_block, context_die, stmt);
24034 BLOCK_DIE (stmt) = stmt_die;
24035 old_die = NULL;
24038 tree origin = block_ultimate_origin (stmt);
24039 if (origin != NULL_TREE && origin != stmt)
24040 add_abstract_origin_attribute (stmt_die, origin);
24043 if (old_die)
24044 stmt_die = old_die;
24046 /* A non abstract block whose blocks have already been reordered
24047 should have the instruction range for this block. If so, set the
24048 high/low attributes. */
24049 if (!early_dwarf && !BLOCK_ABSTRACT (stmt) && TREE_ASM_WRITTEN (stmt))
24051 gcc_assert (stmt_die);
24052 add_high_low_attributes (stmt, stmt_die);
24055 decls_for_scope (stmt, stmt_die);
24058 /* Generate a DIE for an inlined subprogram. */
24060 static void
24061 gen_inlined_subroutine_die (tree stmt, dw_die_ref context_die)
24063 tree decl;
24065 /* The instance of function that is effectively being inlined shall not
24066 be abstract. */
24067 gcc_assert (! BLOCK_ABSTRACT (stmt));
24069 decl = block_ultimate_origin (stmt);
24071 /* Make sure any inlined functions are known to be inlineable. */
24072 gcc_checking_assert (DECL_ABSTRACT_P (decl)
24073 || cgraph_function_possibly_inlined_p (decl));
24075 if (! BLOCK_ABSTRACT (stmt))
24077 dw_die_ref subr_die
24078 = new_die (DW_TAG_inlined_subroutine, context_die, stmt);
24080 if (call_arg_locations || debug_inline_points)
24081 BLOCK_DIE (stmt) = subr_die;
24082 add_abstract_origin_attribute (subr_die, decl);
24083 if (TREE_ASM_WRITTEN (stmt))
24084 add_high_low_attributes (stmt, subr_die);
24085 add_call_src_coords_attributes (stmt, subr_die);
24087 decls_for_scope (stmt, subr_die);
24091 /* Generate a DIE for a field in a record, or structure. CTX is required: see
24092 the comment for VLR_CONTEXT. */
24094 static void
24095 gen_field_die (tree decl, struct vlr_context *ctx, dw_die_ref context_die)
24097 dw_die_ref decl_die;
24099 if (TREE_TYPE (decl) == error_mark_node)
24100 return;
24102 decl_die = new_die (DW_TAG_member, context_die, decl);
24103 add_name_and_src_coords_attributes (decl_die, decl);
24104 add_type_attribute (decl_die, member_declared_type (decl), decl_quals (decl),
24105 TYPE_REVERSE_STORAGE_ORDER (DECL_FIELD_CONTEXT (decl)),
24106 context_die);
24108 if (DECL_BIT_FIELD_TYPE (decl))
24110 add_byte_size_attribute (decl_die, decl);
24111 add_bit_size_attribute (decl_die, decl);
24112 add_bit_offset_attribute (decl_die, decl, ctx);
24115 add_alignment_attribute (decl_die, decl);
24117 /* If we have a variant part offset, then we are supposed to process a member
24118 of a QUAL_UNION_TYPE, which is how we represent variant parts in
24119 trees. */
24120 gcc_assert (ctx->variant_part_offset == NULL_TREE
24121 || TREE_CODE (DECL_FIELD_CONTEXT (decl)) != QUAL_UNION_TYPE);
24122 if (TREE_CODE (DECL_FIELD_CONTEXT (decl)) != UNION_TYPE)
24123 add_data_member_location_attribute (decl_die, decl, ctx);
24125 if (DECL_ARTIFICIAL (decl))
24126 add_AT_flag (decl_die, DW_AT_artificial, 1);
24128 add_accessibility_attribute (decl_die, decl);
24130 /* Equate decl number to die, so that we can look up this decl later on. */
24131 equate_decl_number_to_die (decl, decl_die);
24134 /* Generate a DIE for a pointer to a member type. TYPE can be an
24135 OFFSET_TYPE, for a pointer to data member, or a RECORD_TYPE, for a
24136 pointer to member function. */
24138 static void
24139 gen_ptr_to_mbr_type_die (tree type, dw_die_ref context_die)
24141 if (lookup_type_die (type))
24142 return;
24144 dw_die_ref ptr_die = new_die (DW_TAG_ptr_to_member_type,
24145 scope_die_for (type, context_die), type);
24147 equate_type_number_to_die (type, ptr_die);
24148 add_AT_die_ref (ptr_die, DW_AT_containing_type,
24149 lookup_type_die (TYPE_OFFSET_BASETYPE (type)));
24150 add_type_attribute (ptr_die, TREE_TYPE (type), TYPE_UNQUALIFIED, false,
24151 context_die);
24152 add_alignment_attribute (ptr_die, type);
24154 if (TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE
24155 && TREE_CODE (TREE_TYPE (type)) != METHOD_TYPE)
24157 dw_loc_descr_ref op = new_loc_descr (DW_OP_plus, 0, 0);
24158 add_AT_loc (ptr_die, DW_AT_use_location, op);
24162 static char *producer_string;
24164 /* Return a heap allocated producer string including command line options
24165 if -grecord-gcc-switches. */
24167 static char *
24168 gen_producer_string (void)
24170 size_t j;
24171 auto_vec<const char *> switches;
24172 const char *language_string = lang_hooks.name;
24173 char *producer, *tail;
24174 const char *p;
24175 size_t len = dwarf_record_gcc_switches ? 0 : 3;
24176 size_t plen = strlen (language_string) + 1 + strlen (version_string);
24178 for (j = 1; dwarf_record_gcc_switches && j < save_decoded_options_count; j++)
24179 switch (save_decoded_options[j].opt_index)
24181 case OPT_o:
24182 case OPT_d:
24183 case OPT_dumpbase:
24184 case OPT_dumpdir:
24185 case OPT_auxbase:
24186 case OPT_auxbase_strip:
24187 case OPT_quiet:
24188 case OPT_version:
24189 case OPT_v:
24190 case OPT_w:
24191 case OPT_L:
24192 case OPT_D:
24193 case OPT_I:
24194 case OPT_U:
24195 case OPT_SPECIAL_unknown:
24196 case OPT_SPECIAL_ignore:
24197 case OPT_SPECIAL_program_name:
24198 case OPT_SPECIAL_input_file:
24199 case OPT_grecord_gcc_switches:
24200 case OPT__output_pch_:
24201 case OPT_fdiagnostics_show_location_:
24202 case OPT_fdiagnostics_show_option:
24203 case OPT_fdiagnostics_show_caret:
24204 case OPT_fdiagnostics_color_:
24205 case OPT_fverbose_asm:
24206 case OPT____:
24207 case OPT__sysroot_:
24208 case OPT_nostdinc:
24209 case OPT_nostdinc__:
24210 case OPT_fpreprocessed:
24211 case OPT_fltrans_output_list_:
24212 case OPT_fresolution_:
24213 case OPT_fdebug_prefix_map_:
24214 case OPT_fmacro_prefix_map_:
24215 case OPT_ffile_prefix_map_:
24216 case OPT_fcompare_debug:
24217 /* Ignore these. */
24218 continue;
24219 default:
24220 if (cl_options[save_decoded_options[j].opt_index].flags
24221 & CL_NO_DWARF_RECORD)
24222 continue;
24223 gcc_checking_assert (save_decoded_options[j].canonical_option[0][0]
24224 == '-');
24225 switch (save_decoded_options[j].canonical_option[0][1])
24227 case 'M':
24228 case 'i':
24229 case 'W':
24230 continue;
24231 case 'f':
24232 if (strncmp (save_decoded_options[j].canonical_option[0] + 2,
24233 "dump", 4) == 0)
24234 continue;
24235 break;
24236 default:
24237 break;
24239 switches.safe_push (save_decoded_options[j].orig_option_with_args_text);
24240 len += strlen (save_decoded_options[j].orig_option_with_args_text) + 1;
24241 break;
24244 producer = XNEWVEC (char, plen + 1 + len + 1);
24245 tail = producer;
24246 sprintf (tail, "%s %s", language_string, version_string);
24247 tail += plen;
24249 FOR_EACH_VEC_ELT (switches, j, p)
24251 len = strlen (p);
24252 *tail = ' ';
24253 memcpy (tail + 1, p, len);
24254 tail += len + 1;
24257 *tail = '\0';
24258 return producer;
24261 /* Given a C and/or C++ language/version string return the "highest".
24262 C++ is assumed to be "higher" than C in this case. Used for merging
24263 LTO translation unit languages. */
24264 static const char *
24265 highest_c_language (const char *lang1, const char *lang2)
24267 if (strcmp ("GNU C++17", lang1) == 0 || strcmp ("GNU C++17", lang2) == 0)
24268 return "GNU C++17";
24269 if (strcmp ("GNU C++14", lang1) == 0 || strcmp ("GNU C++14", lang2) == 0)
24270 return "GNU C++14";
24271 if (strcmp ("GNU C++11", lang1) == 0 || strcmp ("GNU C++11", lang2) == 0)
24272 return "GNU C++11";
24273 if (strcmp ("GNU C++98", lang1) == 0 || strcmp ("GNU C++98", lang2) == 0)
24274 return "GNU C++98";
24276 if (strcmp ("GNU C17", lang1) == 0 || strcmp ("GNU C17", lang2) == 0)
24277 return "GNU C17";
24278 if (strcmp ("GNU C11", lang1) == 0 || strcmp ("GNU C11", lang2) == 0)
24279 return "GNU C11";
24280 if (strcmp ("GNU C99", lang1) == 0 || strcmp ("GNU C99", lang2) == 0)
24281 return "GNU C99";
24282 if (strcmp ("GNU C89", lang1) == 0 || strcmp ("GNU C89", lang2) == 0)
24283 return "GNU C89";
24285 gcc_unreachable ();
24289 /* Generate the DIE for the compilation unit. */
24291 static dw_die_ref
24292 gen_compile_unit_die (const char *filename)
24294 dw_die_ref die;
24295 const char *language_string = lang_hooks.name;
24296 int language;
24298 die = new_die (DW_TAG_compile_unit, NULL, NULL);
24300 if (filename)
24302 add_name_attribute (die, filename);
24303 /* Don't add cwd for <built-in>. */
24304 if (filename[0] != '<')
24305 add_comp_dir_attribute (die);
24308 add_AT_string (die, DW_AT_producer, producer_string ? producer_string : "");
24310 /* If our producer is LTO try to figure out a common language to use
24311 from the global list of translation units. */
24312 if (strcmp (language_string, "GNU GIMPLE") == 0)
24314 unsigned i;
24315 tree t;
24316 const char *common_lang = NULL;
24318 FOR_EACH_VEC_SAFE_ELT (all_translation_units, i, t)
24320 if (!TRANSLATION_UNIT_LANGUAGE (t))
24321 continue;
24322 if (!common_lang)
24323 common_lang = TRANSLATION_UNIT_LANGUAGE (t);
24324 else if (strcmp (common_lang, TRANSLATION_UNIT_LANGUAGE (t)) == 0)
24326 else if (strncmp (common_lang, "GNU C", 5) == 0
24327 && strncmp (TRANSLATION_UNIT_LANGUAGE (t), "GNU C", 5) == 0)
24328 /* Mixing C and C++ is ok, use C++ in that case. */
24329 common_lang = highest_c_language (common_lang,
24330 TRANSLATION_UNIT_LANGUAGE (t));
24331 else
24333 /* Fall back to C. */
24334 common_lang = NULL;
24335 break;
24339 if (common_lang)
24340 language_string = common_lang;
24343 language = DW_LANG_C;
24344 if (strncmp (language_string, "GNU C", 5) == 0
24345 && ISDIGIT (language_string[5]))
24347 language = DW_LANG_C89;
24348 if (dwarf_version >= 3 || !dwarf_strict)
24350 if (strcmp (language_string, "GNU C89") != 0)
24351 language = DW_LANG_C99;
24353 if (dwarf_version >= 5 /* || !dwarf_strict */)
24354 if (strcmp (language_string, "GNU C11") == 0
24355 || strcmp (language_string, "GNU C17") == 0)
24356 language = DW_LANG_C11;
24359 else if (strncmp (language_string, "GNU C++", 7) == 0)
24361 language = DW_LANG_C_plus_plus;
24362 if (dwarf_version >= 5 /* || !dwarf_strict */)
24364 if (strcmp (language_string, "GNU C++11") == 0)
24365 language = DW_LANG_C_plus_plus_11;
24366 else if (strcmp (language_string, "GNU C++14") == 0)
24367 language = DW_LANG_C_plus_plus_14;
24368 else if (strcmp (language_string, "GNU C++17") == 0)
24369 /* For now. */
24370 language = DW_LANG_C_plus_plus_14;
24373 else if (strcmp (language_string, "GNU F77") == 0)
24374 language = DW_LANG_Fortran77;
24375 else if (dwarf_version >= 3 || !dwarf_strict)
24377 if (strcmp (language_string, "GNU Ada") == 0)
24378 language = DW_LANG_Ada95;
24379 else if (strncmp (language_string, "GNU Fortran", 11) == 0)
24381 language = DW_LANG_Fortran95;
24382 if (dwarf_version >= 5 /* || !dwarf_strict */)
24384 if (strcmp (language_string, "GNU Fortran2003") == 0)
24385 language = DW_LANG_Fortran03;
24386 else if (strcmp (language_string, "GNU Fortran2008") == 0)
24387 language = DW_LANG_Fortran08;
24390 else if (strcmp (language_string, "GNU Objective-C") == 0)
24391 language = DW_LANG_ObjC;
24392 else if (strcmp (language_string, "GNU Objective-C++") == 0)
24393 language = DW_LANG_ObjC_plus_plus;
24394 else if (dwarf_version >= 5 || !dwarf_strict)
24396 if (strcmp (language_string, "GNU Go") == 0)
24397 language = DW_LANG_Go;
24400 /* Use a degraded Fortran setting in strict DWARF2 so is_fortran works. */
24401 else if (strncmp (language_string, "GNU Fortran", 11) == 0)
24402 language = DW_LANG_Fortran90;
24404 add_AT_unsigned (die, DW_AT_language, language);
24406 switch (language)
24408 case DW_LANG_Fortran77:
24409 case DW_LANG_Fortran90:
24410 case DW_LANG_Fortran95:
24411 case DW_LANG_Fortran03:
24412 case DW_LANG_Fortran08:
24413 /* Fortran has case insensitive identifiers and the front-end
24414 lowercases everything. */
24415 add_AT_unsigned (die, DW_AT_identifier_case, DW_ID_down_case);
24416 break;
24417 default:
24418 /* The default DW_ID_case_sensitive doesn't need to be specified. */
24419 break;
24421 return die;
24424 /* Generate the DIE for a base class. */
24426 static void
24427 gen_inheritance_die (tree binfo, tree access, tree type,
24428 dw_die_ref context_die)
24430 dw_die_ref die = new_die (DW_TAG_inheritance, context_die, binfo);
24431 struct vlr_context ctx = { type, NULL };
24433 add_type_attribute (die, BINFO_TYPE (binfo), TYPE_UNQUALIFIED, false,
24434 context_die);
24435 add_data_member_location_attribute (die, binfo, &ctx);
24437 if (BINFO_VIRTUAL_P (binfo))
24438 add_AT_unsigned (die, DW_AT_virtuality, DW_VIRTUALITY_virtual);
24440 /* In DWARF3+ the default is DW_ACCESS_private only in DW_TAG_class_type
24441 children, otherwise the default is DW_ACCESS_public. In DWARF2
24442 the default has always been DW_ACCESS_private. */
24443 if (access == access_public_node)
24445 if (dwarf_version == 2
24446 || context_die->die_tag == DW_TAG_class_type)
24447 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_public);
24449 else if (access == access_protected_node)
24450 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_protected);
24451 else if (dwarf_version > 2
24452 && context_die->die_tag != DW_TAG_class_type)
24453 add_AT_unsigned (die, DW_AT_accessibility, DW_ACCESS_private);
24456 /* Return whether DECL is a FIELD_DECL that represents the variant part of a
24457 structure. */
24458 static bool
24459 is_variant_part (tree decl)
24461 return (TREE_CODE (decl) == FIELD_DECL
24462 && TREE_CODE (TREE_TYPE (decl)) == QUAL_UNION_TYPE);
24465 /* Check that OPERAND is a reference to a field in STRUCT_TYPE. If it is,
24466 return the FIELD_DECL. Return NULL_TREE otherwise. */
24468 static tree
24469 analyze_discr_in_predicate (tree operand, tree struct_type)
24471 bool continue_stripping = true;
24472 while (continue_stripping)
24473 switch (TREE_CODE (operand))
24475 CASE_CONVERT:
24476 operand = TREE_OPERAND (operand, 0);
24477 break;
24478 default:
24479 continue_stripping = false;
24480 break;
24483 /* Match field access to members of struct_type only. */
24484 if (TREE_CODE (operand) == COMPONENT_REF
24485 && TREE_CODE (TREE_OPERAND (operand, 0)) == PLACEHOLDER_EXPR
24486 && TREE_TYPE (TREE_OPERAND (operand, 0)) == struct_type
24487 && TREE_CODE (TREE_OPERAND (operand, 1)) == FIELD_DECL)
24488 return TREE_OPERAND (operand, 1);
24489 else
24490 return NULL_TREE;
24493 /* Check that SRC is a constant integer that can be represented as a native
24494 integer constant (either signed or unsigned). If so, store it into DEST and
24495 return true. Return false otherwise. */
24497 static bool
24498 get_discr_value (tree src, dw_discr_value *dest)
24500 tree discr_type = TREE_TYPE (src);
24502 if (lang_hooks.types.get_debug_type)
24504 tree debug_type = lang_hooks.types.get_debug_type (discr_type);
24505 if (debug_type != NULL)
24506 discr_type = debug_type;
24509 if (TREE_CODE (src) != INTEGER_CST || !INTEGRAL_TYPE_P (discr_type))
24510 return false;
24512 /* Signedness can vary between the original type and the debug type. This
24513 can happen for character types in Ada for instance: the character type
24514 used for code generation can be signed, to be compatible with the C one,
24515 but from a debugger point of view, it must be unsigned. */
24516 bool is_orig_unsigned = TYPE_UNSIGNED (TREE_TYPE (src));
24517 bool is_debug_unsigned = TYPE_UNSIGNED (discr_type);
24519 if (is_orig_unsigned != is_debug_unsigned)
24520 src = fold_convert (discr_type, src);
24522 if (!(is_debug_unsigned ? tree_fits_uhwi_p (src) : tree_fits_shwi_p (src)))
24523 return false;
24525 dest->pos = is_debug_unsigned;
24526 if (is_debug_unsigned)
24527 dest->v.uval = tree_to_uhwi (src);
24528 else
24529 dest->v.sval = tree_to_shwi (src);
24531 return true;
24534 /* Try to extract synthetic properties out of VARIANT_PART_DECL, which is a
24535 FIELD_DECL in STRUCT_TYPE that represents a variant part. If unsuccessful,
24536 store NULL_TREE in DISCR_DECL. Otherwise:
24538 - store the discriminant field in STRUCT_TYPE that controls the variant
24539 part to *DISCR_DECL
24541 - put in *DISCR_LISTS_P an array where for each variant, the item
24542 represents the corresponding matching list of discriminant values.
24544 - put in *DISCR_LISTS_LENGTH the number of variants, which is the size of
24545 the above array.
24547 Note that when the array is allocated (i.e. when the analysis is
24548 successful), it is up to the caller to free the array. */
24550 static void
24551 analyze_variants_discr (tree variant_part_decl,
24552 tree struct_type,
24553 tree *discr_decl,
24554 dw_discr_list_ref **discr_lists_p,
24555 unsigned *discr_lists_length)
24557 tree variant_part_type = TREE_TYPE (variant_part_decl);
24558 tree variant;
24559 dw_discr_list_ref *discr_lists;
24560 unsigned i;
24562 /* Compute how many variants there are in this variant part. */
24563 *discr_lists_length = 0;
24564 for (variant = TYPE_FIELDS (variant_part_type);
24565 variant != NULL_TREE;
24566 variant = DECL_CHAIN (variant))
24567 ++*discr_lists_length;
24569 *discr_decl = NULL_TREE;
24570 *discr_lists_p
24571 = (dw_discr_list_ref *) xcalloc (*discr_lists_length,
24572 sizeof (**discr_lists_p));
24573 discr_lists = *discr_lists_p;
24575 /* And then analyze all variants to extract discriminant information for all
24576 of them. This analysis is conservative: as soon as we detect something we
24577 do not support, abort everything and pretend we found nothing. */
24578 for (variant = TYPE_FIELDS (variant_part_type), i = 0;
24579 variant != NULL_TREE;
24580 variant = DECL_CHAIN (variant), ++i)
24582 tree match_expr = DECL_QUALIFIER (variant);
24584 /* Now, try to analyze the predicate and deduce a discriminant for
24585 it. */
24586 if (match_expr == boolean_true_node)
24587 /* Typically happens for the default variant: it matches all cases that
24588 previous variants rejected. Don't output any matching value for
24589 this one. */
24590 continue;
24592 /* The following loop tries to iterate over each discriminant
24593 possibility: single values or ranges. */
24594 while (match_expr != NULL_TREE)
24596 tree next_round_match_expr;
24597 tree candidate_discr = NULL_TREE;
24598 dw_discr_list_ref new_node = NULL;
24600 /* Possibilities are matched one after the other by nested
24601 TRUTH_ORIF_EXPR expressions. Process the current possibility and
24602 continue with the rest at next iteration. */
24603 if (TREE_CODE (match_expr) == TRUTH_ORIF_EXPR)
24605 next_round_match_expr = TREE_OPERAND (match_expr, 0);
24606 match_expr = TREE_OPERAND (match_expr, 1);
24608 else
24609 next_round_match_expr = NULL_TREE;
24611 if (match_expr == boolean_false_node)
24612 /* This sub-expression matches nothing: just wait for the next
24613 one. */
24616 else if (TREE_CODE (match_expr) == EQ_EXPR)
24618 /* We are matching: <discr_field> == <integer_cst>
24619 This sub-expression matches a single value. */
24620 tree integer_cst = TREE_OPERAND (match_expr, 1);
24622 candidate_discr
24623 = analyze_discr_in_predicate (TREE_OPERAND (match_expr, 0),
24624 struct_type);
24626 new_node = ggc_cleared_alloc<dw_discr_list_node> ();
24627 if (!get_discr_value (integer_cst,
24628 &new_node->dw_discr_lower_bound))
24629 goto abort;
24630 new_node->dw_discr_range = false;
24633 else if (TREE_CODE (match_expr) == TRUTH_ANDIF_EXPR)
24635 /* We are matching:
24636 <discr_field> > <integer_cst>
24637 && <discr_field> < <integer_cst>.
24638 This sub-expression matches the range of values between the
24639 two matched integer constants. Note that comparisons can be
24640 inclusive or exclusive. */
24641 tree candidate_discr_1, candidate_discr_2;
24642 tree lower_cst, upper_cst;
24643 bool lower_cst_included, upper_cst_included;
24644 tree lower_op = TREE_OPERAND (match_expr, 0);
24645 tree upper_op = TREE_OPERAND (match_expr, 1);
24647 /* When the comparison is exclusive, the integer constant is not
24648 the discriminant range bound we are looking for: we will have
24649 to increment or decrement it. */
24650 if (TREE_CODE (lower_op) == GE_EXPR)
24651 lower_cst_included = true;
24652 else if (TREE_CODE (lower_op) == GT_EXPR)
24653 lower_cst_included = false;
24654 else
24655 goto abort;
24657 if (TREE_CODE (upper_op) == LE_EXPR)
24658 upper_cst_included = true;
24659 else if (TREE_CODE (upper_op) == LT_EXPR)
24660 upper_cst_included = false;
24661 else
24662 goto abort;
24664 /* Extract the discriminant from the first operand and check it
24665 is consistant with the same analysis in the second
24666 operand. */
24667 candidate_discr_1
24668 = analyze_discr_in_predicate (TREE_OPERAND (lower_op, 0),
24669 struct_type);
24670 candidate_discr_2
24671 = analyze_discr_in_predicate (TREE_OPERAND (upper_op, 0),
24672 struct_type);
24673 if (candidate_discr_1 == candidate_discr_2)
24674 candidate_discr = candidate_discr_1;
24675 else
24676 goto abort;
24678 /* Extract bounds from both. */
24679 new_node = ggc_cleared_alloc<dw_discr_list_node> ();
24680 lower_cst = TREE_OPERAND (lower_op, 1);
24681 upper_cst = TREE_OPERAND (upper_op, 1);
24683 if (!lower_cst_included)
24684 lower_cst
24685 = fold_build2 (PLUS_EXPR, TREE_TYPE (lower_cst), lower_cst,
24686 build_int_cst (TREE_TYPE (lower_cst), 1));
24687 if (!upper_cst_included)
24688 upper_cst
24689 = fold_build2 (MINUS_EXPR, TREE_TYPE (upper_cst), upper_cst,
24690 build_int_cst (TREE_TYPE (upper_cst), 1));
24692 if (!get_discr_value (lower_cst,
24693 &new_node->dw_discr_lower_bound)
24694 || !get_discr_value (upper_cst,
24695 &new_node->dw_discr_upper_bound))
24696 goto abort;
24698 new_node->dw_discr_range = true;
24701 else
24702 /* Unsupported sub-expression: we cannot determine the set of
24703 matching discriminant values. Abort everything. */
24704 goto abort;
24706 /* If the discriminant info is not consistant with what we saw so
24707 far, consider the analysis failed and abort everything. */
24708 if (candidate_discr == NULL_TREE
24709 || (*discr_decl != NULL_TREE && candidate_discr != *discr_decl))
24710 goto abort;
24711 else
24712 *discr_decl = candidate_discr;
24714 if (new_node != NULL)
24716 new_node->dw_discr_next = discr_lists[i];
24717 discr_lists[i] = new_node;
24719 match_expr = next_round_match_expr;
24723 /* If we reach this point, we could match everything we were interested
24724 in. */
24725 return;
24727 abort:
24728 /* Clean all data structure and return no result. */
24729 free (*discr_lists_p);
24730 *discr_lists_p = NULL;
24731 *discr_decl = NULL_TREE;
24734 /* Generate a DIE to represent VARIANT_PART_DECL, a variant part that is part
24735 of STRUCT_TYPE, a record type. This new DIE is emitted as the next child
24736 under CONTEXT_DIE.
24738 Variant parts are supposed to be implemented as a FIELD_DECL whose type is a
24739 QUAL_UNION_TYPE: this is the VARIANT_PART_DECL parameter. The members for
24740 this type, which are record types, represent the available variants and each
24741 has a DECL_QUALIFIER attribute. The discriminant and the discriminant
24742 values are inferred from these attributes.
24744 In trees, the offsets for the fields inside these sub-records are relative
24745 to the variant part itself, whereas the corresponding DIEs should have
24746 offset attributes that are relative to the embedding record base address.
24747 This is why the caller must provide a VARIANT_PART_OFFSET expression: it
24748 must be an expression that computes the offset of the variant part to
24749 describe in DWARF. */
24751 static void
24752 gen_variant_part (tree variant_part_decl, struct vlr_context *vlr_ctx,
24753 dw_die_ref context_die)
24755 const tree variant_part_type = TREE_TYPE (variant_part_decl);
24756 tree variant_part_offset = vlr_ctx->variant_part_offset;
24757 struct loc_descr_context ctx = {
24758 vlr_ctx->struct_type, /* context_type */
24759 NULL_TREE, /* base_decl */
24760 NULL, /* dpi */
24761 false, /* placeholder_arg */
24762 false /* placeholder_seen */
24765 /* The FIELD_DECL node in STRUCT_TYPE that acts as the discriminant, or
24766 NULL_TREE if there is no such field. */
24767 tree discr_decl = NULL_TREE;
24768 dw_discr_list_ref *discr_lists;
24769 unsigned discr_lists_length = 0;
24770 unsigned i;
24772 dw_die_ref dwarf_proc_die = NULL;
24773 dw_die_ref variant_part_die
24774 = new_die (DW_TAG_variant_part, context_die, variant_part_type);
24776 equate_decl_number_to_die (variant_part_decl, variant_part_die);
24778 analyze_variants_discr (variant_part_decl, vlr_ctx->struct_type,
24779 &discr_decl, &discr_lists, &discr_lists_length);
24781 if (discr_decl != NULL_TREE)
24783 dw_die_ref discr_die = lookup_decl_die (discr_decl);
24785 if (discr_die)
24786 add_AT_die_ref (variant_part_die, DW_AT_discr, discr_die);
24787 else
24788 /* We have no DIE for the discriminant, so just discard all
24789 discrimimant information in the output. */
24790 discr_decl = NULL_TREE;
24793 /* If the offset for this variant part is more complex than a constant,
24794 create a DWARF procedure for it so that we will not have to generate DWARF
24795 expressions for it for each member. */
24796 if (TREE_CODE (variant_part_offset) != INTEGER_CST
24797 && (dwarf_version >= 3 || !dwarf_strict))
24799 const tree dwarf_proc_fndecl
24800 = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL, NULL_TREE,
24801 build_function_type (TREE_TYPE (variant_part_offset),
24802 NULL_TREE));
24803 const tree dwarf_proc_call = build_call_expr (dwarf_proc_fndecl, 0);
24804 const dw_loc_descr_ref dwarf_proc_body
24805 = loc_descriptor_from_tree (variant_part_offset, 0, &ctx);
24807 dwarf_proc_die = new_dwarf_proc_die (dwarf_proc_body,
24808 dwarf_proc_fndecl, context_die);
24809 if (dwarf_proc_die != NULL)
24810 variant_part_offset = dwarf_proc_call;
24813 /* Output DIEs for all variants. */
24814 i = 0;
24815 for (tree variant = TYPE_FIELDS (variant_part_type);
24816 variant != NULL_TREE;
24817 variant = DECL_CHAIN (variant), ++i)
24819 tree variant_type = TREE_TYPE (variant);
24820 dw_die_ref variant_die;
24822 /* All variants (i.e. members of a variant part) are supposed to be
24823 encoded as structures. Sub-variant parts are QUAL_UNION_TYPE fields
24824 under these records. */
24825 gcc_assert (TREE_CODE (variant_type) == RECORD_TYPE);
24827 variant_die = new_die (DW_TAG_variant, variant_part_die, variant_type);
24828 equate_decl_number_to_die (variant, variant_die);
24830 /* Output discriminant values this variant matches, if any. */
24831 if (discr_decl == NULL || discr_lists[i] == NULL)
24832 /* In the case we have discriminant information at all, this is
24833 probably the default variant: as the standard says, don't
24834 output any discriminant value/list attribute. */
24836 else if (discr_lists[i]->dw_discr_next == NULL
24837 && !discr_lists[i]->dw_discr_range)
24838 /* If there is only one accepted value, don't bother outputting a
24839 list. */
24840 add_discr_value (variant_die, &discr_lists[i]->dw_discr_lower_bound);
24841 else
24842 add_discr_list (variant_die, discr_lists[i]);
24844 for (tree member = TYPE_FIELDS (variant_type);
24845 member != NULL_TREE;
24846 member = DECL_CHAIN (member))
24848 struct vlr_context vlr_sub_ctx = {
24849 vlr_ctx->struct_type, /* struct_type */
24850 NULL /* variant_part_offset */
24852 if (is_variant_part (member))
24854 /* All offsets for fields inside variant parts are relative to
24855 the top-level embedding RECORD_TYPE's base address. On the
24856 other hand, offsets in GCC's types are relative to the
24857 nested-most variant part. So we have to sum offsets each time
24858 we recurse. */
24860 vlr_sub_ctx.variant_part_offset
24861 = fold_build2 (PLUS_EXPR, TREE_TYPE (variant_part_offset),
24862 variant_part_offset, byte_position (member));
24863 gen_variant_part (member, &vlr_sub_ctx, variant_die);
24865 else
24867 vlr_sub_ctx.variant_part_offset = variant_part_offset;
24868 gen_decl_die (member, NULL, &vlr_sub_ctx, variant_die);
24873 free (discr_lists);
24876 /* Generate a DIE for a class member. */
24878 static void
24879 gen_member_die (tree type, dw_die_ref context_die)
24881 tree member;
24882 tree binfo = TYPE_BINFO (type);
24884 gcc_assert (TYPE_MAIN_VARIANT (type) == type);
24886 /* If this is not an incomplete type, output descriptions of each of its
24887 members. Note that as we output the DIEs necessary to represent the
24888 members of this record or union type, we will also be trying to output
24889 DIEs to represent the *types* of those members. However the `type'
24890 function (above) will specifically avoid generating type DIEs for member
24891 types *within* the list of member DIEs for this (containing) type except
24892 for those types (of members) which are explicitly marked as also being
24893 members of this (containing) type themselves. The g++ front- end can
24894 force any given type to be treated as a member of some other (containing)
24895 type by setting the TYPE_CONTEXT of the given (member) type to point to
24896 the TREE node representing the appropriate (containing) type. */
24898 /* First output info about the base classes. */
24899 if (binfo)
24901 vec<tree, va_gc> *accesses = BINFO_BASE_ACCESSES (binfo);
24902 int i;
24903 tree base;
24905 for (i = 0; BINFO_BASE_ITERATE (binfo, i, base); i++)
24906 gen_inheritance_die (base,
24907 (accesses ? (*accesses)[i] : access_public_node),
24908 type,
24909 context_die);
24912 /* Now output info about the data members and type members. */
24913 for (member = TYPE_FIELDS (type); member; member = DECL_CHAIN (member))
24915 struct vlr_context vlr_ctx = { type, NULL_TREE };
24916 bool static_inline_p
24917 = (TREE_STATIC (member)
24918 && (lang_hooks.decls.decl_dwarf_attribute (member, DW_AT_inline)
24919 != -1));
24921 /* Ignore clones. */
24922 if (DECL_ABSTRACT_ORIGIN (member))
24923 continue;
24925 /* If we thought we were generating minimal debug info for TYPE
24926 and then changed our minds, some of the member declarations
24927 may have already been defined. Don't define them again, but
24928 do put them in the right order. */
24930 if (dw_die_ref child = lookup_decl_die (member))
24932 /* Handle inline static data members, which only have in-class
24933 declarations. */
24934 dw_die_ref ref = NULL;
24935 if (child->die_tag == DW_TAG_variable
24936 && child->die_parent == comp_unit_die ())
24938 ref = get_AT_ref (child, DW_AT_specification);
24939 /* For C++17 inline static data members followed by redundant
24940 out of class redeclaration, we might get here with
24941 child being the DIE created for the out of class
24942 redeclaration and with its DW_AT_specification being
24943 the DIE created for in-class definition. We want to
24944 reparent the latter, and don't want to create another
24945 DIE with DW_AT_specification in that case, because
24946 we already have one. */
24947 if (ref
24948 && static_inline_p
24949 && ref->die_tag == DW_TAG_variable
24950 && ref->die_parent == comp_unit_die ()
24951 && get_AT (ref, DW_AT_specification) == NULL)
24953 child = ref;
24954 ref = NULL;
24955 static_inline_p = false;
24959 if (child->die_tag == DW_TAG_variable
24960 && child->die_parent == comp_unit_die ()
24961 && ref == NULL)
24963 reparent_child (child, context_die);
24964 if (dwarf_version < 5)
24965 child->die_tag = DW_TAG_member;
24967 else
24968 splice_child_die (context_die, child);
24971 /* Do not generate standard DWARF for variant parts if we are generating
24972 the corresponding GNAT encodings: DIEs generated for both would
24973 conflict in our mappings. */
24974 else if (is_variant_part (member)
24975 && gnat_encodings == DWARF_GNAT_ENCODINGS_MINIMAL)
24977 vlr_ctx.variant_part_offset = byte_position (member);
24978 gen_variant_part (member, &vlr_ctx, context_die);
24980 else
24982 vlr_ctx.variant_part_offset = NULL_TREE;
24983 gen_decl_die (member, NULL, &vlr_ctx, context_die);
24986 /* For C++ inline static data members emit immediately a DW_TAG_variable
24987 DIE that will refer to that DW_TAG_member/DW_TAG_variable through
24988 DW_AT_specification. */
24989 if (static_inline_p)
24991 int old_extern = DECL_EXTERNAL (member);
24992 DECL_EXTERNAL (member) = 0;
24993 gen_decl_die (member, NULL, NULL, comp_unit_die ());
24994 DECL_EXTERNAL (member) = old_extern;
24999 /* Generate a DIE for a structure or union type. If TYPE_DECL_SUPPRESS_DEBUG
25000 is set, we pretend that the type was never defined, so we only get the
25001 member DIEs needed by later specification DIEs. */
25003 static void
25004 gen_struct_or_union_type_die (tree type, dw_die_ref context_die,
25005 enum debug_info_usage usage)
25007 if (TREE_ASM_WRITTEN (type))
25009 /* Fill in the bound of variable-length fields in late dwarf if
25010 still incomplete. */
25011 if (!early_dwarf && variably_modified_type_p (type, NULL))
25012 for (tree member = TYPE_FIELDS (type);
25013 member;
25014 member = DECL_CHAIN (member))
25015 fill_variable_array_bounds (TREE_TYPE (member));
25016 return;
25019 dw_die_ref type_die = lookup_type_die (type);
25020 dw_die_ref scope_die = 0;
25021 int nested = 0;
25022 int complete = (TYPE_SIZE (type)
25023 && (! TYPE_STUB_DECL (type)
25024 || ! TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type))));
25025 int ns_decl = (context_die && context_die->die_tag == DW_TAG_namespace);
25026 complete = complete && should_emit_struct_debug (type, usage);
25028 if (type_die && ! complete)
25029 return;
25031 if (TYPE_CONTEXT (type) != NULL_TREE
25032 && (AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
25033 || TREE_CODE (TYPE_CONTEXT (type)) == NAMESPACE_DECL))
25034 nested = 1;
25036 scope_die = scope_die_for (type, context_die);
25038 /* Generate child dies for template paramaters. */
25039 if (!type_die && debug_info_level > DINFO_LEVEL_TERSE)
25040 schedule_generic_params_dies_gen (type);
25042 if (! type_die || (nested && is_cu_die (scope_die)))
25043 /* First occurrence of type or toplevel definition of nested class. */
25045 dw_die_ref old_die = type_die;
25047 type_die = new_die (TREE_CODE (type) == RECORD_TYPE
25048 ? record_type_tag (type) : DW_TAG_union_type,
25049 scope_die, type);
25050 equate_type_number_to_die (type, type_die);
25051 if (old_die)
25052 add_AT_specification (type_die, old_die);
25053 else
25054 add_name_attribute (type_die, type_tag (type));
25056 else
25057 remove_AT (type_die, DW_AT_declaration);
25059 /* If this type has been completed, then give it a byte_size attribute and
25060 then give a list of members. */
25061 if (complete && !ns_decl)
25063 /* Prevent infinite recursion in cases where the type of some member of
25064 this type is expressed in terms of this type itself. */
25065 TREE_ASM_WRITTEN (type) = 1;
25066 add_byte_size_attribute (type_die, type);
25067 add_alignment_attribute (type_die, type);
25068 if (TYPE_STUB_DECL (type) != NULL_TREE)
25070 add_src_coords_attributes (type_die, TYPE_STUB_DECL (type));
25071 add_accessibility_attribute (type_die, TYPE_STUB_DECL (type));
25074 /* If the first reference to this type was as the return type of an
25075 inline function, then it may not have a parent. Fix this now. */
25076 if (type_die->die_parent == NULL)
25077 add_child_die (scope_die, type_die);
25079 push_decl_scope (type);
25080 gen_member_die (type, type_die);
25081 pop_decl_scope ();
25083 add_gnat_descriptive_type_attribute (type_die, type, context_die);
25084 if (TYPE_ARTIFICIAL (type))
25085 add_AT_flag (type_die, DW_AT_artificial, 1);
25087 /* GNU extension: Record what type our vtable lives in. */
25088 if (TYPE_VFIELD (type))
25090 tree vtype = DECL_FCONTEXT (TYPE_VFIELD (type));
25092 gen_type_die (vtype, context_die);
25093 add_AT_die_ref (type_die, DW_AT_containing_type,
25094 lookup_type_die (vtype));
25097 else
25099 add_AT_flag (type_die, DW_AT_declaration, 1);
25101 /* We don't need to do this for function-local types. */
25102 if (TYPE_STUB_DECL (type)
25103 && ! decl_function_context (TYPE_STUB_DECL (type)))
25104 vec_safe_push (incomplete_types, type);
25107 if (get_AT (type_die, DW_AT_name))
25108 add_pubtype (type, type_die);
25111 /* Generate a DIE for a subroutine _type_. */
25113 static void
25114 gen_subroutine_type_die (tree type, dw_die_ref context_die)
25116 tree return_type = TREE_TYPE (type);
25117 dw_die_ref subr_die
25118 = new_die (DW_TAG_subroutine_type,
25119 scope_die_for (type, context_die), type);
25121 equate_type_number_to_die (type, subr_die);
25122 add_prototyped_attribute (subr_die, type);
25123 add_type_attribute (subr_die, return_type, TYPE_UNQUALIFIED, false,
25124 context_die);
25125 add_alignment_attribute (subr_die, type);
25126 gen_formal_types_die (type, subr_die);
25128 if (get_AT (subr_die, DW_AT_name))
25129 add_pubtype (type, subr_die);
25130 if ((dwarf_version >= 5 || !dwarf_strict)
25131 && lang_hooks.types.type_dwarf_attribute (type, DW_AT_reference) != -1)
25132 add_AT_flag (subr_die, DW_AT_reference, 1);
25133 if ((dwarf_version >= 5 || !dwarf_strict)
25134 && lang_hooks.types.type_dwarf_attribute (type,
25135 DW_AT_rvalue_reference) != -1)
25136 add_AT_flag (subr_die, DW_AT_rvalue_reference, 1);
25139 /* Generate a DIE for a type definition. */
25141 static void
25142 gen_typedef_die (tree decl, dw_die_ref context_die)
25144 dw_die_ref type_die;
25145 tree type;
25147 if (TREE_ASM_WRITTEN (decl))
25149 if (DECL_ORIGINAL_TYPE (decl))
25150 fill_variable_array_bounds (DECL_ORIGINAL_TYPE (decl));
25151 return;
25154 /* As we avoid creating DIEs for local typedefs (see decl_ultimate_origin
25155 checks in process_scope_var and modified_type_die), this should be called
25156 only for original types. */
25157 gcc_assert (decl_ultimate_origin (decl) == NULL
25158 || decl_ultimate_origin (decl) == decl);
25160 TREE_ASM_WRITTEN (decl) = 1;
25161 type_die = new_die (DW_TAG_typedef, context_die, decl);
25163 add_name_and_src_coords_attributes (type_die, decl);
25164 if (DECL_ORIGINAL_TYPE (decl))
25166 type = DECL_ORIGINAL_TYPE (decl);
25167 if (type == error_mark_node)
25168 return;
25170 gcc_assert (type != TREE_TYPE (decl));
25171 equate_type_number_to_die (TREE_TYPE (decl), type_die);
25173 else
25175 type = TREE_TYPE (decl);
25176 if (type == error_mark_node)
25177 return;
25179 if (is_naming_typedef_decl (TYPE_NAME (type)))
25181 /* Here, we are in the case of decl being a typedef naming
25182 an anonymous type, e.g:
25183 typedef struct {...} foo;
25184 In that case TREE_TYPE (decl) is not a typedef variant
25185 type and TYPE_NAME of the anonymous type is set to the
25186 TYPE_DECL of the typedef. This construct is emitted by
25187 the C++ FE.
25189 TYPE is the anonymous struct named by the typedef
25190 DECL. As we need the DW_AT_type attribute of the
25191 DW_TAG_typedef to point to the DIE of TYPE, let's
25192 generate that DIE right away. add_type_attribute
25193 called below will then pick (via lookup_type_die) that
25194 anonymous struct DIE. */
25195 if (!TREE_ASM_WRITTEN (type))
25196 gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE);
25198 /* This is a GNU Extension. We are adding a
25199 DW_AT_linkage_name attribute to the DIE of the
25200 anonymous struct TYPE. The value of that attribute
25201 is the name of the typedef decl naming the anonymous
25202 struct. This greatly eases the work of consumers of
25203 this debug info. */
25204 add_linkage_name_raw (lookup_type_die (type), decl);
25208 add_type_attribute (type_die, type, decl_quals (decl), false,
25209 context_die);
25211 if (is_naming_typedef_decl (decl))
25212 /* We want that all subsequent calls to lookup_type_die with
25213 TYPE in argument yield the DW_TAG_typedef we have just
25214 created. */
25215 equate_type_number_to_die (type, type_die);
25217 add_alignment_attribute (type_die, TREE_TYPE (decl));
25219 add_accessibility_attribute (type_die, decl);
25221 if (DECL_ABSTRACT_P (decl))
25222 equate_decl_number_to_die (decl, type_die);
25224 if (get_AT (type_die, DW_AT_name))
25225 add_pubtype (decl, type_die);
25228 /* Generate a DIE for a struct, class, enum or union type. */
25230 static void
25231 gen_tagged_type_die (tree type,
25232 dw_die_ref context_die,
25233 enum debug_info_usage usage)
25235 int need_pop;
25237 if (type == NULL_TREE
25238 || !is_tagged_type (type))
25239 return;
25241 if (TREE_ASM_WRITTEN (type))
25242 need_pop = 0;
25243 /* If this is a nested type whose containing class hasn't been written
25244 out yet, writing it out will cover this one, too. This does not apply
25245 to instantiations of member class templates; they need to be added to
25246 the containing class as they are generated. FIXME: This hurts the
25247 idea of combining type decls from multiple TUs, since we can't predict
25248 what set of template instantiations we'll get. */
25249 else if (TYPE_CONTEXT (type)
25250 && AGGREGATE_TYPE_P (TYPE_CONTEXT (type))
25251 && ! TREE_ASM_WRITTEN (TYPE_CONTEXT (type)))
25253 gen_type_die_with_usage (TYPE_CONTEXT (type), context_die, usage);
25255 if (TREE_ASM_WRITTEN (type))
25256 return;
25258 /* If that failed, attach ourselves to the stub. */
25259 push_decl_scope (TYPE_CONTEXT (type));
25260 context_die = lookup_type_die (TYPE_CONTEXT (type));
25261 need_pop = 1;
25263 else if (TYPE_CONTEXT (type) != NULL_TREE
25264 && (TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL))
25266 /* If this type is local to a function that hasn't been written
25267 out yet, use a NULL context for now; it will be fixed up in
25268 decls_for_scope. */
25269 context_die = lookup_decl_die (TYPE_CONTEXT (type));
25270 /* A declaration DIE doesn't count; nested types need to go in the
25271 specification. */
25272 if (context_die && is_declaration_die (context_die))
25273 context_die = NULL;
25274 need_pop = 0;
25276 else
25278 context_die = declare_in_namespace (type, context_die);
25279 need_pop = 0;
25282 if (TREE_CODE (type) == ENUMERAL_TYPE)
25284 /* This might have been written out by the call to
25285 declare_in_namespace. */
25286 if (!TREE_ASM_WRITTEN (type))
25287 gen_enumeration_type_die (type, context_die);
25289 else
25290 gen_struct_or_union_type_die (type, context_die, usage);
25292 if (need_pop)
25293 pop_decl_scope ();
25295 /* Don't set TREE_ASM_WRITTEN on an incomplete struct; we want to fix
25296 it up if it is ever completed. gen_*_type_die will set it for us
25297 when appropriate. */
25300 /* Generate a type description DIE. */
25302 static void
25303 gen_type_die_with_usage (tree type, dw_die_ref context_die,
25304 enum debug_info_usage usage)
25306 struct array_descr_info info;
25308 if (type == NULL_TREE || type == error_mark_node)
25309 return;
25311 if (flag_checking && type)
25312 verify_type (type);
25314 if (TYPE_NAME (type) != NULL_TREE
25315 && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
25316 && is_redundant_typedef (TYPE_NAME (type))
25317 && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
25318 /* The DECL of this type is a typedef we don't want to emit debug
25319 info for but we want debug info for its underlying typedef.
25320 This can happen for e.g, the injected-class-name of a C++
25321 type. */
25322 type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
25324 /* If TYPE is a typedef type variant, let's generate debug info
25325 for the parent typedef which TYPE is a type of. */
25326 if (typedef_variant_p (type))
25328 if (TREE_ASM_WRITTEN (type))
25329 return;
25331 tree name = TYPE_NAME (type);
25332 tree origin = decl_ultimate_origin (name);
25333 if (origin != NULL && origin != name)
25335 gen_decl_die (origin, NULL, NULL, context_die);
25336 return;
25339 /* Prevent broken recursion; we can't hand off to the same type. */
25340 gcc_assert (DECL_ORIGINAL_TYPE (name) != type);
25342 /* Give typedefs the right scope. */
25343 context_die = scope_die_for (type, context_die);
25345 TREE_ASM_WRITTEN (type) = 1;
25347 gen_decl_die (name, NULL, NULL, context_die);
25348 return;
25351 /* If type is an anonymous tagged type named by a typedef, let's
25352 generate debug info for the typedef. */
25353 if (is_naming_typedef_decl (TYPE_NAME (type)))
25355 /* Use the DIE of the containing namespace as the parent DIE of
25356 the type description DIE we want to generate. */
25357 if (DECL_CONTEXT (TYPE_NAME (type))
25358 && TREE_CODE (DECL_CONTEXT (TYPE_NAME (type))) == NAMESPACE_DECL)
25359 context_die = get_context_die (DECL_CONTEXT (TYPE_NAME (type)));
25361 gen_decl_die (TYPE_NAME (type), NULL, NULL, context_die);
25362 return;
25365 if (lang_hooks.types.get_debug_type)
25367 tree debug_type = lang_hooks.types.get_debug_type (type);
25369 if (debug_type != NULL_TREE && debug_type != type)
25371 gen_type_die_with_usage (debug_type, context_die, usage);
25372 return;
25376 /* We are going to output a DIE to represent the unqualified version
25377 of this type (i.e. without any const or volatile qualifiers) so
25378 get the main variant (i.e. the unqualified version) of this type
25379 now. (Vectors and arrays are special because the debugging info is in the
25380 cloned type itself. Similarly function/method types can contain extra
25381 ref-qualification). */
25382 if (TREE_CODE (type) == FUNCTION_TYPE
25383 || TREE_CODE (type) == METHOD_TYPE)
25385 /* For function/method types, can't use type_main_variant here,
25386 because that can have different ref-qualifiers for C++,
25387 but try to canonicalize. */
25388 tree main = TYPE_MAIN_VARIANT (type);
25389 for (tree t = main; t; t = TYPE_NEXT_VARIANT (t))
25390 if (TYPE_QUALS_NO_ADDR_SPACE (t) == 0
25391 && check_base_type (t, main)
25392 && check_lang_type (t, type))
25394 type = t;
25395 break;
25398 else if (TREE_CODE (type) != VECTOR_TYPE
25399 && TREE_CODE (type) != ARRAY_TYPE)
25400 type = type_main_variant (type);
25402 /* If this is an array type with hidden descriptor, handle it first. */
25403 if (!TREE_ASM_WRITTEN (type)
25404 && lang_hooks.types.get_array_descr_info)
25406 memset (&info, 0, sizeof (info));
25407 if (lang_hooks.types.get_array_descr_info (type, &info))
25409 /* Fortran sometimes emits array types with no dimension. */
25410 gcc_assert (info.ndimensions >= 0
25411 && (info.ndimensions
25412 <= DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN));
25413 gen_descr_array_type_die (type, &info, context_die);
25414 TREE_ASM_WRITTEN (type) = 1;
25415 return;
25419 if (TREE_ASM_WRITTEN (type))
25421 /* Variable-length types may be incomplete even if
25422 TREE_ASM_WRITTEN. For such types, fall through to
25423 gen_array_type_die() and possibly fill in
25424 DW_AT_{upper,lower}_bound attributes. */
25425 if ((TREE_CODE (type) != ARRAY_TYPE
25426 && TREE_CODE (type) != RECORD_TYPE
25427 && TREE_CODE (type) != UNION_TYPE
25428 && TREE_CODE (type) != QUAL_UNION_TYPE)
25429 || !variably_modified_type_p (type, NULL))
25430 return;
25433 switch (TREE_CODE (type))
25435 case ERROR_MARK:
25436 break;
25438 case POINTER_TYPE:
25439 case REFERENCE_TYPE:
25440 /* We must set TREE_ASM_WRITTEN in case this is a recursive type. This
25441 ensures that the gen_type_die recursion will terminate even if the
25442 type is recursive. Recursive types are possible in Ada. */
25443 /* ??? We could perhaps do this for all types before the switch
25444 statement. */
25445 TREE_ASM_WRITTEN (type) = 1;
25447 /* For these types, all that is required is that we output a DIE (or a
25448 set of DIEs) to represent the "basis" type. */
25449 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25450 DINFO_USAGE_IND_USE);
25451 break;
25453 case OFFSET_TYPE:
25454 /* This code is used for C++ pointer-to-data-member types.
25455 Output a description of the relevant class type. */
25456 gen_type_die_with_usage (TYPE_OFFSET_BASETYPE (type), context_die,
25457 DINFO_USAGE_IND_USE);
25459 /* Output a description of the type of the object pointed to. */
25460 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25461 DINFO_USAGE_IND_USE);
25463 /* Now output a DIE to represent this pointer-to-data-member type
25464 itself. */
25465 gen_ptr_to_mbr_type_die (type, context_die);
25466 break;
25468 case FUNCTION_TYPE:
25469 /* Force out return type (in case it wasn't forced out already). */
25470 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25471 DINFO_USAGE_DIR_USE);
25472 gen_subroutine_type_die (type, context_die);
25473 break;
25475 case METHOD_TYPE:
25476 /* Force out return type (in case it wasn't forced out already). */
25477 gen_type_die_with_usage (TREE_TYPE (type), context_die,
25478 DINFO_USAGE_DIR_USE);
25479 gen_subroutine_type_die (type, context_die);
25480 break;
25482 case ARRAY_TYPE:
25483 case VECTOR_TYPE:
25484 gen_array_type_die (type, context_die);
25485 break;
25487 case ENUMERAL_TYPE:
25488 case RECORD_TYPE:
25489 case UNION_TYPE:
25490 case QUAL_UNION_TYPE:
25491 gen_tagged_type_die (type, context_die, usage);
25492 return;
25494 case VOID_TYPE:
25495 case INTEGER_TYPE:
25496 case REAL_TYPE:
25497 case FIXED_POINT_TYPE:
25498 case COMPLEX_TYPE:
25499 case BOOLEAN_TYPE:
25500 case POINTER_BOUNDS_TYPE:
25501 /* No DIEs needed for fundamental types. */
25502 break;
25504 case NULLPTR_TYPE:
25505 case LANG_TYPE:
25506 /* Just use DW_TAG_unspecified_type. */
25508 dw_die_ref type_die = lookup_type_die (type);
25509 if (type_die == NULL)
25511 tree name = TYPE_IDENTIFIER (type);
25512 type_die = new_die (DW_TAG_unspecified_type, comp_unit_die (),
25513 type);
25514 add_name_attribute (type_die, IDENTIFIER_POINTER (name));
25515 equate_type_number_to_die (type, type_die);
25518 break;
25520 default:
25521 if (is_cxx_auto (type))
25523 tree name = TYPE_IDENTIFIER (type);
25524 dw_die_ref *die = (name == get_identifier ("auto")
25525 ? &auto_die : &decltype_auto_die);
25526 if (!*die)
25528 *die = new_die (DW_TAG_unspecified_type,
25529 comp_unit_die (), NULL_TREE);
25530 add_name_attribute (*die, IDENTIFIER_POINTER (name));
25532 equate_type_number_to_die (type, *die);
25533 break;
25535 gcc_unreachable ();
25538 TREE_ASM_WRITTEN (type) = 1;
25541 static void
25542 gen_type_die (tree type, dw_die_ref context_die)
25544 if (type != error_mark_node)
25546 gen_type_die_with_usage (type, context_die, DINFO_USAGE_DIR_USE);
25547 if (flag_checking)
25549 dw_die_ref die = lookup_type_die (type);
25550 if (die)
25551 check_die (die);
25556 /* Generate a DW_TAG_lexical_block DIE followed by DIEs to represent all of the
25557 things which are local to the given block. */
25559 static void
25560 gen_block_die (tree stmt, dw_die_ref context_die)
25562 int must_output_die = 0;
25563 bool inlined_func;
25565 /* Ignore blocks that are NULL. */
25566 if (stmt == NULL_TREE)
25567 return;
25569 inlined_func = inlined_function_outer_scope_p (stmt);
25571 /* If the block is one fragment of a non-contiguous block, do not
25572 process the variables, since they will have been done by the
25573 origin block. Do process subblocks. */
25574 if (BLOCK_FRAGMENT_ORIGIN (stmt))
25576 tree sub;
25578 for (sub = BLOCK_SUBBLOCKS (stmt); sub; sub = BLOCK_CHAIN (sub))
25579 gen_block_die (sub, context_die);
25581 return;
25584 /* Determine if we need to output any Dwarf DIEs at all to represent this
25585 block. */
25586 if (inlined_func)
25587 /* The outer scopes for inlinings *must* always be represented. We
25588 generate DW_TAG_inlined_subroutine DIEs for them. (See below.) */
25589 must_output_die = 1;
25590 else
25592 /* Determine if this block directly contains any "significant"
25593 local declarations which we will need to output DIEs for. */
25594 if (debug_info_level > DINFO_LEVEL_TERSE)
25595 /* We are not in terse mode so *any* local declaration counts
25596 as being a "significant" one. */
25597 must_output_die = ((BLOCK_VARS (stmt) != NULL
25598 || BLOCK_NUM_NONLOCALIZED_VARS (stmt))
25599 && (TREE_USED (stmt)
25600 || TREE_ASM_WRITTEN (stmt)
25601 || BLOCK_ABSTRACT (stmt)));
25602 else if ((TREE_USED (stmt)
25603 || TREE_ASM_WRITTEN (stmt)
25604 || BLOCK_ABSTRACT (stmt))
25605 && !dwarf2out_ignore_block (stmt))
25606 must_output_die = 1;
25609 /* It would be a waste of space to generate a Dwarf DW_TAG_lexical_block
25610 DIE for any block which contains no significant local declarations at
25611 all. Rather, in such cases we just call `decls_for_scope' so that any
25612 needed Dwarf info for any sub-blocks will get properly generated. Note
25613 that in terse mode, our definition of what constitutes a "significant"
25614 local declaration gets restricted to include only inlined function
25615 instances and local (nested) function definitions. */
25616 if (must_output_die)
25618 if (inlined_func)
25620 /* If STMT block is abstract, that means we have been called
25621 indirectly from dwarf2out_abstract_function.
25622 That function rightfully marks the descendent blocks (of
25623 the abstract function it is dealing with) as being abstract,
25624 precisely to prevent us from emitting any
25625 DW_TAG_inlined_subroutine DIE as a descendent
25626 of an abstract function instance. So in that case, we should
25627 not call gen_inlined_subroutine_die.
25629 Later though, when cgraph asks dwarf2out to emit info
25630 for the concrete instance of the function decl into which
25631 the concrete instance of STMT got inlined, the later will lead
25632 to the generation of a DW_TAG_inlined_subroutine DIE. */
25633 if (! BLOCK_ABSTRACT (stmt))
25634 gen_inlined_subroutine_die (stmt, context_die);
25636 else
25637 gen_lexical_block_die (stmt, context_die);
25639 else
25640 decls_for_scope (stmt, context_die);
25643 /* Process variable DECL (or variable with origin ORIGIN) within
25644 block STMT and add it to CONTEXT_DIE. */
25645 static void
25646 process_scope_var (tree stmt, tree decl, tree origin, dw_die_ref context_die)
25648 dw_die_ref die;
25649 tree decl_or_origin = decl ? decl : origin;
25651 if (TREE_CODE (decl_or_origin) == FUNCTION_DECL)
25652 die = lookup_decl_die (decl_or_origin);
25653 else if (TREE_CODE (decl_or_origin) == TYPE_DECL)
25655 if (TYPE_DECL_IS_STUB (decl_or_origin))
25656 die = lookup_type_die (TREE_TYPE (decl_or_origin));
25657 else
25658 die = lookup_decl_die (decl_or_origin);
25659 /* Avoid re-creating the DIE late if it was optimized as unused early. */
25660 if (! die && ! early_dwarf)
25661 return;
25663 else
25664 die = NULL;
25666 /* Avoid creating DIEs for local typedefs and concrete static variables that
25667 will only be pruned later. */
25668 if ((origin || decl_ultimate_origin (decl))
25669 && (TREE_CODE (decl_or_origin) == TYPE_DECL
25670 || (VAR_P (decl_or_origin) && TREE_STATIC (decl_or_origin))))
25672 origin = decl_ultimate_origin (decl_or_origin);
25673 if (decl && VAR_P (decl) && die != NULL)
25675 die = lookup_decl_die (origin);
25676 if (die != NULL)
25677 equate_decl_number_to_die (decl, die);
25679 return;
25682 if (die != NULL && die->die_parent == NULL)
25683 add_child_die (context_die, die);
25684 else if (TREE_CODE (decl_or_origin) == IMPORTED_DECL)
25686 if (early_dwarf)
25687 dwarf2out_imported_module_or_decl_1 (decl_or_origin, DECL_NAME (decl_or_origin),
25688 stmt, context_die);
25690 else
25692 if (decl && DECL_P (decl))
25694 die = lookup_decl_die (decl);
25696 /* Early created DIEs do not have a parent as the decls refer
25697 to the function as DECL_CONTEXT rather than the BLOCK. */
25698 if (die && die->die_parent == NULL)
25700 gcc_assert (in_lto_p);
25701 add_child_die (context_die, die);
25705 gen_decl_die (decl, origin, NULL, context_die);
25709 /* Generate all of the decls declared within a given scope and (recursively)
25710 all of its sub-blocks. */
25712 static void
25713 decls_for_scope (tree stmt, dw_die_ref context_die)
25715 tree decl;
25716 unsigned int i;
25717 tree subblocks;
25719 /* Ignore NULL blocks. */
25720 if (stmt == NULL_TREE)
25721 return;
25723 /* Output the DIEs to represent all of the data objects and typedefs
25724 declared directly within this block but not within any nested
25725 sub-blocks. Also, nested function and tag DIEs have been
25726 generated with a parent of NULL; fix that up now. We don't
25727 have to do this if we're at -g1. */
25728 if (debug_info_level > DINFO_LEVEL_TERSE)
25730 for (decl = BLOCK_VARS (stmt); decl != NULL; decl = DECL_CHAIN (decl))
25731 process_scope_var (stmt, decl, NULL_TREE, context_die);
25732 /* BLOCK_NONLOCALIZED_VARs simply generate DIE stubs with abstract
25733 origin - avoid doing this twice as we have no good way to see
25734 if we've done it once already. */
25735 if (! early_dwarf)
25736 for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (stmt); i++)
25738 decl = BLOCK_NONLOCALIZED_VAR (stmt, i);
25739 if (decl == current_function_decl)
25740 /* Ignore declarations of the current function, while they
25741 are declarations, gen_subprogram_die would treat them
25742 as definitions again, because they are equal to
25743 current_function_decl and endlessly recurse. */;
25744 else if (TREE_CODE (decl) == FUNCTION_DECL)
25745 process_scope_var (stmt, decl, NULL_TREE, context_die);
25746 else
25747 process_scope_var (stmt, NULL_TREE, decl, context_die);
25751 /* Even if we're at -g1, we need to process the subblocks in order to get
25752 inlined call information. */
25754 /* Output the DIEs to represent all sub-blocks (and the items declared
25755 therein) of this block. */
25756 for (subblocks = BLOCK_SUBBLOCKS (stmt);
25757 subblocks != NULL;
25758 subblocks = BLOCK_CHAIN (subblocks))
25759 gen_block_die (subblocks, context_die);
25762 /* Is this a typedef we can avoid emitting? */
25764 bool
25765 is_redundant_typedef (const_tree decl)
25767 if (TYPE_DECL_IS_STUB (decl))
25768 return true;
25770 if (DECL_ARTIFICIAL (decl)
25771 && DECL_CONTEXT (decl)
25772 && is_tagged_type (DECL_CONTEXT (decl))
25773 && TREE_CODE (TYPE_NAME (DECL_CONTEXT (decl))) == TYPE_DECL
25774 && DECL_NAME (decl) == DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))))
25775 /* Also ignore the artificial member typedef for the class name. */
25776 return true;
25778 return false;
25781 /* Return TRUE if TYPE is a typedef that names a type for linkage
25782 purposes. This kind of typedefs is produced by the C++ FE for
25783 constructs like:
25785 typedef struct {...} foo;
25787 In that case, there is no typedef variant type produced for foo.
25788 Rather, the TREE_TYPE of the TYPE_DECL of foo is the anonymous
25789 struct type. */
25791 static bool
25792 is_naming_typedef_decl (const_tree decl)
25794 if (decl == NULL_TREE
25795 || TREE_CODE (decl) != TYPE_DECL
25796 || DECL_NAMELESS (decl)
25797 || !is_tagged_type (TREE_TYPE (decl))
25798 || DECL_IS_BUILTIN (decl)
25799 || is_redundant_typedef (decl)
25800 /* It looks like Ada produces TYPE_DECLs that are very similar
25801 to C++ naming typedefs but that have different
25802 semantics. Let's be specific to c++ for now. */
25803 || !is_cxx (decl))
25804 return FALSE;
25806 return (DECL_ORIGINAL_TYPE (decl) == NULL_TREE
25807 && TYPE_NAME (TREE_TYPE (decl)) == decl
25808 && (TYPE_STUB_DECL (TREE_TYPE (decl))
25809 != TYPE_NAME (TREE_TYPE (decl))));
25812 /* Looks up the DIE for a context. */
25814 static inline dw_die_ref
25815 lookup_context_die (tree context)
25817 if (context)
25819 /* Find die that represents this context. */
25820 if (TYPE_P (context))
25822 context = TYPE_MAIN_VARIANT (context);
25823 dw_die_ref ctx = lookup_type_die (context);
25824 if (!ctx)
25825 return NULL;
25826 return strip_naming_typedef (context, ctx);
25828 else
25829 return lookup_decl_die (context);
25831 return comp_unit_die ();
25834 /* Returns the DIE for a context. */
25836 static inline dw_die_ref
25837 get_context_die (tree context)
25839 if (context)
25841 /* Find die that represents this context. */
25842 if (TYPE_P (context))
25844 context = TYPE_MAIN_VARIANT (context);
25845 return strip_naming_typedef (context, force_type_die (context));
25847 else
25848 return force_decl_die (context);
25850 return comp_unit_die ();
25853 /* Returns the DIE for decl. A DIE will always be returned. */
25855 static dw_die_ref
25856 force_decl_die (tree decl)
25858 dw_die_ref decl_die;
25859 unsigned saved_external_flag;
25860 tree save_fn = NULL_TREE;
25861 decl_die = lookup_decl_die (decl);
25862 if (!decl_die)
25864 dw_die_ref context_die = get_context_die (DECL_CONTEXT (decl));
25866 decl_die = lookup_decl_die (decl);
25867 if (decl_die)
25868 return decl_die;
25870 switch (TREE_CODE (decl))
25872 case FUNCTION_DECL:
25873 /* Clear current_function_decl, so that gen_subprogram_die thinks
25874 that this is a declaration. At this point, we just want to force
25875 declaration die. */
25876 save_fn = current_function_decl;
25877 current_function_decl = NULL_TREE;
25878 gen_subprogram_die (decl, context_die);
25879 current_function_decl = save_fn;
25880 break;
25882 case VAR_DECL:
25883 /* Set external flag to force declaration die. Restore it after
25884 gen_decl_die() call. */
25885 saved_external_flag = DECL_EXTERNAL (decl);
25886 DECL_EXTERNAL (decl) = 1;
25887 gen_decl_die (decl, NULL, NULL, context_die);
25888 DECL_EXTERNAL (decl) = saved_external_flag;
25889 break;
25891 case NAMESPACE_DECL:
25892 if (dwarf_version >= 3 || !dwarf_strict)
25893 dwarf2out_decl (decl);
25894 else
25895 /* DWARF2 has neither DW_TAG_module, nor DW_TAG_namespace. */
25896 decl_die = comp_unit_die ();
25897 break;
25899 case TRANSLATION_UNIT_DECL:
25900 decl_die = comp_unit_die ();
25901 break;
25903 default:
25904 gcc_unreachable ();
25907 /* We should be able to find the DIE now. */
25908 if (!decl_die)
25909 decl_die = lookup_decl_die (decl);
25910 gcc_assert (decl_die);
25913 return decl_die;
25916 /* Returns the DIE for TYPE, that must not be a base type. A DIE is
25917 always returned. */
25919 static dw_die_ref
25920 force_type_die (tree type)
25922 dw_die_ref type_die;
25924 type_die = lookup_type_die (type);
25925 if (!type_die)
25927 dw_die_ref context_die = get_context_die (TYPE_CONTEXT (type));
25929 type_die = modified_type_die (type, TYPE_QUALS_NO_ADDR_SPACE (type),
25930 false, context_die);
25931 gcc_assert (type_die);
25933 return type_die;
25936 /* Force out any required namespaces to be able to output DECL,
25937 and return the new context_die for it, if it's changed. */
25939 static dw_die_ref
25940 setup_namespace_context (tree thing, dw_die_ref context_die)
25942 tree context = (DECL_P (thing)
25943 ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing));
25944 if (context && TREE_CODE (context) == NAMESPACE_DECL)
25945 /* Force out the namespace. */
25946 context_die = force_decl_die (context);
25948 return context_die;
25951 /* Emit a declaration DIE for THING (which is either a DECL or a tagged
25952 type) within its namespace, if appropriate.
25954 For compatibility with older debuggers, namespace DIEs only contain
25955 declarations; all definitions are emitted at CU scope, with
25956 DW_AT_specification pointing to the declaration (like with class
25957 members). */
25959 static dw_die_ref
25960 declare_in_namespace (tree thing, dw_die_ref context_die)
25962 dw_die_ref ns_context;
25964 if (debug_info_level <= DINFO_LEVEL_TERSE)
25965 return context_die;
25967 /* External declarations in the local scope only need to be emitted
25968 once, not once in the namespace and once in the scope.
25970 This avoids declaring the `extern' below in the
25971 namespace DIE as well as in the innermost scope:
25973 namespace S
25975 int i=5;
25976 int foo()
25978 int i=8;
25979 extern int i;
25980 return i;
25984 if (DECL_P (thing) && DECL_EXTERNAL (thing) && local_scope_p (context_die))
25985 return context_die;
25987 /* If this decl is from an inlined function, then don't try to emit it in its
25988 namespace, as we will get confused. It would have already been emitted
25989 when the abstract instance of the inline function was emitted anyways. */
25990 if (DECL_P (thing) && DECL_ABSTRACT_ORIGIN (thing))
25991 return context_die;
25993 ns_context = setup_namespace_context (thing, context_die);
25995 if (ns_context != context_die)
25997 if (is_fortran ())
25998 return ns_context;
25999 if (DECL_P (thing))
26000 gen_decl_die (thing, NULL, NULL, ns_context);
26001 else
26002 gen_type_die (thing, ns_context);
26004 return context_die;
26007 /* Generate a DIE for a namespace or namespace alias. */
26009 static void
26010 gen_namespace_die (tree decl, dw_die_ref context_die)
26012 dw_die_ref namespace_die;
26014 /* Namespace aliases have a DECL_ABSTRACT_ORIGIN of the namespace
26015 they are an alias of. */
26016 if (DECL_ABSTRACT_ORIGIN (decl) == NULL)
26018 /* Output a real namespace or module. */
26019 context_die = setup_namespace_context (decl, comp_unit_die ());
26020 namespace_die = new_die (is_fortran ()
26021 ? DW_TAG_module : DW_TAG_namespace,
26022 context_die, decl);
26023 /* For Fortran modules defined in different CU don't add src coords. */
26024 if (namespace_die->die_tag == DW_TAG_module && DECL_EXTERNAL (decl))
26026 const char *name = dwarf2_name (decl, 0);
26027 if (name)
26028 add_name_attribute (namespace_die, name);
26030 else
26031 add_name_and_src_coords_attributes (namespace_die, decl);
26032 if (DECL_EXTERNAL (decl))
26033 add_AT_flag (namespace_die, DW_AT_declaration, 1);
26034 equate_decl_number_to_die (decl, namespace_die);
26036 else
26038 /* Output a namespace alias. */
26040 /* Force out the namespace we are an alias of, if necessary. */
26041 dw_die_ref origin_die
26042 = force_decl_die (DECL_ABSTRACT_ORIGIN (decl));
26044 if (DECL_FILE_SCOPE_P (decl)
26045 || TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
26046 context_die = setup_namespace_context (decl, comp_unit_die ());
26047 /* Now create the namespace alias DIE. */
26048 namespace_die = new_die (DW_TAG_imported_declaration, context_die, decl);
26049 add_name_and_src_coords_attributes (namespace_die, decl);
26050 add_AT_die_ref (namespace_die, DW_AT_import, origin_die);
26051 equate_decl_number_to_die (decl, namespace_die);
26053 if ((dwarf_version >= 5 || !dwarf_strict)
26054 && lang_hooks.decls.decl_dwarf_attribute (decl,
26055 DW_AT_export_symbols) == 1)
26056 add_AT_flag (namespace_die, DW_AT_export_symbols, 1);
26058 /* Bypass dwarf2_name's check for DECL_NAMELESS. */
26059 if (want_pubnames ())
26060 add_pubname_string (lang_hooks.dwarf_name (decl, 1), namespace_die);
26063 /* Generate Dwarf debug information for a decl described by DECL.
26064 The return value is currently only meaningful for PARM_DECLs,
26065 for all other decls it returns NULL.
26067 If DECL is a FIELD_DECL, CTX is required: see the comment for VLR_CONTEXT.
26068 It can be NULL otherwise. */
26070 static dw_die_ref
26071 gen_decl_die (tree decl, tree origin, struct vlr_context *ctx,
26072 dw_die_ref context_die)
26074 tree decl_or_origin = decl ? decl : origin;
26075 tree class_origin = NULL, ultimate_origin;
26077 if (DECL_P (decl_or_origin) && DECL_IGNORED_P (decl_or_origin))
26078 return NULL;
26080 /* Ignore pointer bounds decls. */
26081 if (DECL_P (decl_or_origin)
26082 && TREE_TYPE (decl_or_origin)
26083 && POINTER_BOUNDS_P (decl_or_origin))
26084 return NULL;
26086 switch (TREE_CODE (decl_or_origin))
26088 case ERROR_MARK:
26089 break;
26091 case CONST_DECL:
26092 if (!is_fortran () && !is_ada ())
26094 /* The individual enumerators of an enum type get output when we output
26095 the Dwarf representation of the relevant enum type itself. */
26096 break;
26099 /* Emit its type. */
26100 gen_type_die (TREE_TYPE (decl), context_die);
26102 /* And its containing namespace. */
26103 context_die = declare_in_namespace (decl, context_die);
26105 gen_const_die (decl, context_die);
26106 break;
26108 case FUNCTION_DECL:
26109 #if 0
26110 /* FIXME */
26111 /* This doesn't work because the C frontend sets DECL_ABSTRACT_ORIGIN
26112 on local redeclarations of global functions. That seems broken. */
26113 if (current_function_decl != decl)
26114 /* This is only a declaration. */;
26115 #endif
26117 /* We should have abstract copies already and should not generate
26118 stray type DIEs in late LTO dumping. */
26119 if (! early_dwarf)
26122 /* If we're emitting a clone, emit info for the abstract instance. */
26123 else if (origin || DECL_ORIGIN (decl) != decl)
26124 dwarf2out_abstract_function (origin
26125 ? DECL_ORIGIN (origin)
26126 : DECL_ABSTRACT_ORIGIN (decl));
26128 /* If we're emitting a possibly inlined function emit it as
26129 abstract instance. */
26130 else if (cgraph_function_possibly_inlined_p (decl)
26131 && ! DECL_ABSTRACT_P (decl)
26132 && ! class_or_namespace_scope_p (context_die)
26133 /* dwarf2out_abstract_function won't emit a die if this is just
26134 a declaration. We must avoid setting DECL_ABSTRACT_ORIGIN in
26135 that case, because that works only if we have a die. */
26136 && DECL_INITIAL (decl) != NULL_TREE)
26137 dwarf2out_abstract_function (decl);
26139 /* Otherwise we're emitting the primary DIE for this decl. */
26140 else if (debug_info_level > DINFO_LEVEL_TERSE)
26142 /* Before we describe the FUNCTION_DECL itself, make sure that we
26143 have its containing type. */
26144 if (!origin)
26145 origin = decl_class_context (decl);
26146 if (origin != NULL_TREE)
26147 gen_type_die (origin, context_die);
26149 /* And its return type. */
26150 gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
26152 /* And its virtual context. */
26153 if (DECL_VINDEX (decl) != NULL_TREE)
26154 gen_type_die (DECL_CONTEXT (decl), context_die);
26156 /* Make sure we have a member DIE for decl. */
26157 if (origin != NULL_TREE)
26158 gen_type_die_for_member (origin, decl, context_die);
26160 /* And its containing namespace. */
26161 context_die = declare_in_namespace (decl, context_die);
26164 /* Now output a DIE to represent the function itself. */
26165 if (decl)
26166 gen_subprogram_die (decl, context_die);
26167 break;
26169 case TYPE_DECL:
26170 /* If we are in terse mode, don't generate any DIEs to represent any
26171 actual typedefs. */
26172 if (debug_info_level <= DINFO_LEVEL_TERSE)
26173 break;
26175 /* In the special case of a TYPE_DECL node representing the declaration
26176 of some type tag, if the given TYPE_DECL is marked as having been
26177 instantiated from some other (original) TYPE_DECL node (e.g. one which
26178 was generated within the original definition of an inline function) we
26179 used to generate a special (abbreviated) DW_TAG_structure_type,
26180 DW_TAG_union_type, or DW_TAG_enumeration_type DIE here. But nothing
26181 should be actually referencing those DIEs, as variable DIEs with that
26182 type would be emitted already in the abstract origin, so it was always
26183 removed during unused type prunning. Don't add anything in this
26184 case. */
26185 if (TYPE_DECL_IS_STUB (decl) && decl_ultimate_origin (decl) != NULL_TREE)
26186 break;
26188 if (is_redundant_typedef (decl))
26189 gen_type_die (TREE_TYPE (decl), context_die);
26190 else
26191 /* Output a DIE to represent the typedef itself. */
26192 gen_typedef_die (decl, context_die);
26193 break;
26195 case LABEL_DECL:
26196 if (debug_info_level >= DINFO_LEVEL_NORMAL)
26197 gen_label_die (decl, context_die);
26198 break;
26200 case VAR_DECL:
26201 case RESULT_DECL:
26202 /* If we are in terse mode, don't generate any DIEs to represent any
26203 variable declarations or definitions. */
26204 if (debug_info_level <= DINFO_LEVEL_TERSE)
26205 break;
26207 /* Avoid generating stray type DIEs during late dwarf dumping.
26208 All types have been dumped early. */
26209 if (early_dwarf
26210 /* ??? But in LTRANS we cannot annotate early created variably
26211 modified type DIEs without copying them and adjusting all
26212 references to them. Dump them again as happens for inlining
26213 which copies both the decl and the types. */
26214 /* ??? And even non-LTO needs to re-visit type DIEs to fill
26215 in VLA bound information for example. */
26216 || (decl && variably_modified_type_p (TREE_TYPE (decl),
26217 current_function_decl)))
26219 /* Output any DIEs that are needed to specify the type of this data
26220 object. */
26221 if (decl_by_reference_p (decl_or_origin))
26222 gen_type_die (TREE_TYPE (TREE_TYPE (decl_or_origin)), context_die);
26223 else
26224 gen_type_die (TREE_TYPE (decl_or_origin), context_die);
26227 if (early_dwarf)
26229 /* And its containing type. */
26230 class_origin = decl_class_context (decl_or_origin);
26231 if (class_origin != NULL_TREE)
26232 gen_type_die_for_member (class_origin, decl_or_origin, context_die);
26234 /* And its containing namespace. */
26235 context_die = declare_in_namespace (decl_or_origin, context_die);
26238 /* Now output the DIE to represent the data object itself. This gets
26239 complicated because of the possibility that the VAR_DECL really
26240 represents an inlined instance of a formal parameter for an inline
26241 function. */
26242 ultimate_origin = decl_ultimate_origin (decl_or_origin);
26243 if (ultimate_origin != NULL_TREE
26244 && TREE_CODE (ultimate_origin) == PARM_DECL)
26245 gen_formal_parameter_die (decl, origin,
26246 true /* Emit name attribute. */,
26247 context_die);
26248 else
26249 gen_variable_die (decl, origin, context_die);
26250 break;
26252 case FIELD_DECL:
26253 gcc_assert (ctx != NULL && ctx->struct_type != NULL);
26254 /* Ignore the nameless fields that are used to skip bits but handle C++
26255 anonymous unions and structs. */
26256 if (DECL_NAME (decl) != NULL_TREE
26257 || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
26258 || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
26260 gen_type_die (member_declared_type (decl), context_die);
26261 gen_field_die (decl, ctx, context_die);
26263 break;
26265 case PARM_DECL:
26266 /* Avoid generating stray type DIEs during late dwarf dumping.
26267 All types have been dumped early. */
26268 if (early_dwarf
26269 /* ??? But in LTRANS we cannot annotate early created variably
26270 modified type DIEs without copying them and adjusting all
26271 references to them. Dump them again as happens for inlining
26272 which copies both the decl and the types. */
26273 /* ??? And even non-LTO needs to re-visit type DIEs to fill
26274 in VLA bound information for example. */
26275 || (decl && variably_modified_type_p (TREE_TYPE (decl),
26276 current_function_decl)))
26278 if (DECL_BY_REFERENCE (decl_or_origin))
26279 gen_type_die (TREE_TYPE (TREE_TYPE (decl_or_origin)), context_die);
26280 else
26281 gen_type_die (TREE_TYPE (decl_or_origin), context_die);
26283 return gen_formal_parameter_die (decl, origin,
26284 true /* Emit name attribute. */,
26285 context_die);
26287 case NAMESPACE_DECL:
26288 if (dwarf_version >= 3 || !dwarf_strict)
26289 gen_namespace_die (decl, context_die);
26290 break;
26292 case IMPORTED_DECL:
26293 dwarf2out_imported_module_or_decl_1 (decl, DECL_NAME (decl),
26294 DECL_CONTEXT (decl), context_die);
26295 break;
26297 case NAMELIST_DECL:
26298 gen_namelist_decl (DECL_NAME (decl), context_die,
26299 NAMELIST_DECL_ASSOCIATED_DECL (decl));
26300 break;
26302 default:
26303 /* Probably some frontend-internal decl. Assume we don't care. */
26304 gcc_assert ((int)TREE_CODE (decl) > NUM_TREE_CODES);
26305 break;
26308 return NULL;
26311 /* Output initial debug information for global DECL. Called at the
26312 end of the parsing process.
26314 This is the initial debug generation process. As such, the DIEs
26315 generated may be incomplete. A later debug generation pass
26316 (dwarf2out_late_global_decl) will augment the information generated
26317 in this pass (e.g., with complete location info). */
26319 static void
26320 dwarf2out_early_global_decl (tree decl)
26322 set_early_dwarf s;
26324 /* gen_decl_die() will set DECL_ABSTRACT because
26325 cgraph_function_possibly_inlined_p() returns true. This is in
26326 turn will cause DW_AT_inline attributes to be set.
26328 This happens because at early dwarf generation, there is no
26329 cgraph information, causing cgraph_function_possibly_inlined_p()
26330 to return true. Trick cgraph_function_possibly_inlined_p()
26331 while we generate dwarf early. */
26332 bool save = symtab->global_info_ready;
26333 symtab->global_info_ready = true;
26335 /* We don't handle TYPE_DECLs. If required, they'll be reached via
26336 other DECLs and they can point to template types or other things
26337 that dwarf2out can't handle when done via dwarf2out_decl. */
26338 if (TREE_CODE (decl) != TYPE_DECL
26339 && TREE_CODE (decl) != PARM_DECL)
26341 if (TREE_CODE (decl) == FUNCTION_DECL)
26343 tree save_fndecl = current_function_decl;
26345 /* For nested functions, make sure we have DIEs for the parents first
26346 so that all nested DIEs are generated at the proper scope in the
26347 first shot. */
26348 tree context = decl_function_context (decl);
26349 if (context != NULL)
26351 dw_die_ref context_die = lookup_decl_die (context);
26352 current_function_decl = context;
26354 /* Avoid emitting DIEs multiple times, but still process CONTEXT
26355 enough so that it lands in its own context. This avoids type
26356 pruning issues later on. */
26357 if (context_die == NULL || is_declaration_die (context_die))
26358 dwarf2out_decl (context);
26361 /* Emit an abstract origin of a function first. This happens
26362 with C++ constructor clones for example and makes
26363 dwarf2out_abstract_function happy which requires the early
26364 DIE of the abstract instance to be present. */
26365 tree origin = DECL_ABSTRACT_ORIGIN (decl);
26366 dw_die_ref origin_die;
26367 if (origin != NULL
26368 /* Do not emit the DIE multiple times but make sure to
26369 process it fully here in case we just saw a declaration. */
26370 && ((origin_die = lookup_decl_die (origin)) == NULL
26371 || is_declaration_die (origin_die)))
26373 current_function_decl = origin;
26374 dwarf2out_decl (origin);
26377 /* Emit the DIE for decl but avoid doing that multiple times. */
26378 dw_die_ref old_die;
26379 if ((old_die = lookup_decl_die (decl)) == NULL
26380 || is_declaration_die (old_die))
26382 current_function_decl = decl;
26383 dwarf2out_decl (decl);
26386 current_function_decl = save_fndecl;
26388 else
26389 dwarf2out_decl (decl);
26391 symtab->global_info_ready = save;
26394 /* Return whether EXPR is an expression with the following pattern:
26395 INDIRECT_REF (NOP_EXPR (INTEGER_CST)). */
26397 static bool
26398 is_trivial_indirect_ref (tree expr)
26400 if (expr == NULL_TREE || TREE_CODE (expr) != INDIRECT_REF)
26401 return false;
26403 tree nop = TREE_OPERAND (expr, 0);
26404 if (nop == NULL_TREE || TREE_CODE (nop) != NOP_EXPR)
26405 return false;
26407 tree int_cst = TREE_OPERAND (nop, 0);
26408 return int_cst != NULL_TREE && TREE_CODE (int_cst) == INTEGER_CST;
26411 /* Output debug information for global decl DECL. Called from
26412 toplev.c after compilation proper has finished. */
26414 static void
26415 dwarf2out_late_global_decl (tree decl)
26417 /* Fill-in any location information we were unable to determine
26418 on the first pass. */
26419 if (VAR_P (decl) && !POINTER_BOUNDS_P (decl))
26421 dw_die_ref die = lookup_decl_die (decl);
26423 /* We may have to generate early debug late for LTO in case debug
26424 was not enabled at compile-time or the target doesn't support
26425 the LTO early debug scheme. */
26426 if (! die && in_lto_p)
26428 dwarf2out_decl (decl);
26429 die = lookup_decl_die (decl);
26432 if (die)
26434 /* We get called via the symtab code invoking late_global_decl
26435 for symbols that are optimized out.
26437 Do not add locations for those, except if they have a
26438 DECL_VALUE_EXPR, in which case they are relevant for debuggers.
26439 Still don't add a location if the DECL_VALUE_EXPR is not a trivial
26440 INDIRECT_REF expression, as this could generate relocations to
26441 text symbols in LTO object files, which is invalid. */
26442 varpool_node *node = varpool_node::get (decl);
26443 if ((! node || ! node->definition)
26444 && ! (DECL_HAS_VALUE_EXPR_P (decl)
26445 && is_trivial_indirect_ref (DECL_VALUE_EXPR (decl))))
26446 tree_add_const_value_attribute_for_decl (die, decl);
26447 else
26448 add_location_or_const_value_attribute (die, decl, false);
26453 /* Output debug information for type decl DECL. Called from toplev.c
26454 and from language front ends (to record built-in types). */
26455 static void
26456 dwarf2out_type_decl (tree decl, int local)
26458 if (!local)
26460 set_early_dwarf s;
26461 dwarf2out_decl (decl);
26465 /* Output debug information for imported module or decl DECL.
26466 NAME is non-NULL name in the lexical block if the decl has been renamed.
26467 LEXICAL_BLOCK is the lexical block (which TREE_CODE is a BLOCK)
26468 that DECL belongs to.
26469 LEXICAL_BLOCK_DIE is the DIE of LEXICAL_BLOCK. */
26470 static void
26471 dwarf2out_imported_module_or_decl_1 (tree decl,
26472 tree name,
26473 tree lexical_block,
26474 dw_die_ref lexical_block_die)
26476 expanded_location xloc;
26477 dw_die_ref imported_die = NULL;
26478 dw_die_ref at_import_die;
26480 if (TREE_CODE (decl) == IMPORTED_DECL)
26482 xloc = expand_location (DECL_SOURCE_LOCATION (decl));
26483 decl = IMPORTED_DECL_ASSOCIATED_DECL (decl);
26484 gcc_assert (decl);
26486 else
26487 xloc = expand_location (input_location);
26489 if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL)
26491 at_import_die = force_type_die (TREE_TYPE (decl));
26492 /* For namespace N { typedef void T; } using N::T; base_type_die
26493 returns NULL, but DW_TAG_imported_declaration requires
26494 the DW_AT_import tag. Force creation of DW_TAG_typedef. */
26495 if (!at_import_die)
26497 gcc_assert (TREE_CODE (decl) == TYPE_DECL);
26498 gen_typedef_die (decl, get_context_die (DECL_CONTEXT (decl)));
26499 at_import_die = lookup_type_die (TREE_TYPE (decl));
26500 gcc_assert (at_import_die);
26503 else
26505 at_import_die = lookup_decl_die (decl);
26506 if (!at_import_die)
26508 /* If we're trying to avoid duplicate debug info, we may not have
26509 emitted the member decl for this field. Emit it now. */
26510 if (TREE_CODE (decl) == FIELD_DECL)
26512 tree type = DECL_CONTEXT (decl);
26514 if (TYPE_CONTEXT (type)
26515 && TYPE_P (TYPE_CONTEXT (type))
26516 && !should_emit_struct_debug (TYPE_CONTEXT (type),
26517 DINFO_USAGE_DIR_USE))
26518 return;
26519 gen_type_die_for_member (type, decl,
26520 get_context_die (TYPE_CONTEXT (type)));
26522 if (TREE_CODE (decl) == NAMELIST_DECL)
26523 at_import_die = gen_namelist_decl (DECL_NAME (decl),
26524 get_context_die (DECL_CONTEXT (decl)),
26525 NULL_TREE);
26526 else
26527 at_import_die = force_decl_die (decl);
26531 if (TREE_CODE (decl) == NAMESPACE_DECL)
26533 if (dwarf_version >= 3 || !dwarf_strict)
26534 imported_die = new_die (DW_TAG_imported_module,
26535 lexical_block_die,
26536 lexical_block);
26537 else
26538 return;
26540 else
26541 imported_die = new_die (DW_TAG_imported_declaration,
26542 lexical_block_die,
26543 lexical_block);
26545 add_AT_file (imported_die, DW_AT_decl_file, lookup_filename (xloc.file));
26546 add_AT_unsigned (imported_die, DW_AT_decl_line, xloc.line);
26547 if (debug_column_info && xloc.column)
26548 add_AT_unsigned (imported_die, DW_AT_decl_column, xloc.column);
26549 if (name)
26550 add_AT_string (imported_die, DW_AT_name,
26551 IDENTIFIER_POINTER (name));
26552 add_AT_die_ref (imported_die, DW_AT_import, at_import_die);
26555 /* Output debug information for imported module or decl DECL.
26556 NAME is non-NULL name in context if the decl has been renamed.
26557 CHILD is true if decl is one of the renamed decls as part of
26558 importing whole module.
26559 IMPLICIT is set if this hook is called for an implicit import
26560 such as inline namespace. */
26562 static void
26563 dwarf2out_imported_module_or_decl (tree decl, tree name, tree context,
26564 bool child, bool implicit)
26566 /* dw_die_ref at_import_die; */
26567 dw_die_ref scope_die;
26569 if (debug_info_level <= DINFO_LEVEL_TERSE)
26570 return;
26572 gcc_assert (decl);
26574 /* For DWARF5, just DW_AT_export_symbols on the DW_TAG_namespace
26575 should be enough, for DWARF4 and older even if we emit as extension
26576 DW_AT_export_symbols add the implicit DW_TAG_imported_module anyway
26577 for the benefit of consumers unaware of DW_AT_export_symbols. */
26578 if (implicit
26579 && dwarf_version >= 5
26580 && lang_hooks.decls.decl_dwarf_attribute (decl,
26581 DW_AT_export_symbols) == 1)
26582 return;
26584 set_early_dwarf s;
26586 /* To emit DW_TAG_imported_module or DW_TAG_imported_decl, we need two DIEs.
26587 We need decl DIE for reference and scope die. First, get DIE for the decl
26588 itself. */
26590 /* Get the scope die for decl context. Use comp_unit_die for global module
26591 or decl. If die is not found for non globals, force new die. */
26592 if (context
26593 && TYPE_P (context)
26594 && !should_emit_struct_debug (context, DINFO_USAGE_DIR_USE))
26595 return;
26597 scope_die = get_context_die (context);
26599 if (child)
26601 /* DW_TAG_imported_module was introduced in the DWARFv3 specification, so
26602 there is nothing we can do, here. */
26603 if (dwarf_version < 3 && dwarf_strict)
26604 return;
26606 gcc_assert (scope_die->die_child);
26607 gcc_assert (scope_die->die_child->die_tag == DW_TAG_imported_module);
26608 gcc_assert (TREE_CODE (decl) != NAMESPACE_DECL);
26609 scope_die = scope_die->die_child;
26612 /* OK, now we have DIEs for decl as well as scope. Emit imported die. */
26613 dwarf2out_imported_module_or_decl_1 (decl, name, context, scope_die);
26616 /* Output debug information for namelists. */
26618 static dw_die_ref
26619 gen_namelist_decl (tree name, dw_die_ref scope_die, tree item_decls)
26621 dw_die_ref nml_die, nml_item_die, nml_item_ref_die;
26622 tree value;
26623 unsigned i;
26625 if (debug_info_level <= DINFO_LEVEL_TERSE)
26626 return NULL;
26628 gcc_assert (scope_die != NULL);
26629 nml_die = new_die (DW_TAG_namelist, scope_die, NULL);
26630 add_AT_string (nml_die, DW_AT_name, IDENTIFIER_POINTER (name));
26632 /* If there are no item_decls, we have a nondefining namelist, e.g.
26633 with USE association; hence, set DW_AT_declaration. */
26634 if (item_decls == NULL_TREE)
26636 add_AT_flag (nml_die, DW_AT_declaration, 1);
26637 return nml_die;
26640 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (item_decls), i, value)
26642 nml_item_ref_die = lookup_decl_die (value);
26643 if (!nml_item_ref_die)
26644 nml_item_ref_die = force_decl_die (value);
26646 nml_item_die = new_die (DW_TAG_namelist_item, nml_die, NULL);
26647 add_AT_die_ref (nml_item_die, DW_AT_namelist_items, nml_item_ref_die);
26649 return nml_die;
26653 /* Write the debugging output for DECL and return the DIE. */
26655 static void
26656 dwarf2out_decl (tree decl)
26658 dw_die_ref context_die = comp_unit_die ();
26660 switch (TREE_CODE (decl))
26662 case ERROR_MARK:
26663 return;
26665 case FUNCTION_DECL:
26666 /* If we're a nested function, initially use a parent of NULL; if we're
26667 a plain function, this will be fixed up in decls_for_scope. If
26668 we're a method, it will be ignored, since we already have a DIE. */
26669 if (decl_function_context (decl)
26670 /* But if we're in terse mode, we don't care about scope. */
26671 && debug_info_level > DINFO_LEVEL_TERSE)
26672 context_die = NULL;
26673 break;
26675 case VAR_DECL:
26676 /* For local statics lookup proper context die. */
26677 if (local_function_static (decl))
26678 context_die = lookup_decl_die (DECL_CONTEXT (decl));
26680 /* If we are in terse mode, don't generate any DIEs to represent any
26681 variable declarations or definitions. */
26682 if (debug_info_level <= DINFO_LEVEL_TERSE)
26683 return;
26684 break;
26686 case CONST_DECL:
26687 if (debug_info_level <= DINFO_LEVEL_TERSE)
26688 return;
26689 if (!is_fortran () && !is_ada ())
26690 return;
26691 if (TREE_STATIC (decl) && decl_function_context (decl))
26692 context_die = lookup_decl_die (DECL_CONTEXT (decl));
26693 break;
26695 case NAMESPACE_DECL:
26696 case IMPORTED_DECL:
26697 if (debug_info_level <= DINFO_LEVEL_TERSE)
26698 return;
26699 if (lookup_decl_die (decl) != NULL)
26700 return;
26701 break;
26703 case TYPE_DECL:
26704 /* Don't emit stubs for types unless they are needed by other DIEs. */
26705 if (TYPE_DECL_SUPPRESS_DEBUG (decl))
26706 return;
26708 /* Don't bother trying to generate any DIEs to represent any of the
26709 normal built-in types for the language we are compiling. */
26710 if (DECL_IS_BUILTIN (decl))
26711 return;
26713 /* If we are in terse mode, don't generate any DIEs for types. */
26714 if (debug_info_level <= DINFO_LEVEL_TERSE)
26715 return;
26717 /* If we're a function-scope tag, initially use a parent of NULL;
26718 this will be fixed up in decls_for_scope. */
26719 if (decl_function_context (decl))
26720 context_die = NULL;
26722 break;
26724 case NAMELIST_DECL:
26725 break;
26727 default:
26728 return;
26731 gen_decl_die (decl, NULL, NULL, context_die);
26733 if (flag_checking)
26735 dw_die_ref die = lookup_decl_die (decl);
26736 if (die)
26737 check_die (die);
26741 /* Write the debugging output for DECL. */
26743 static void
26744 dwarf2out_function_decl (tree decl)
26746 dwarf2out_decl (decl);
26747 call_arg_locations = NULL;
26748 call_arg_loc_last = NULL;
26749 call_site_count = -1;
26750 tail_call_site_count = -1;
26751 decl_loc_table->empty ();
26752 cached_dw_loc_list_table->empty ();
26755 /* Output a marker (i.e. a label) for the beginning of the generated code for
26756 a lexical block. */
26758 static void
26759 dwarf2out_begin_block (unsigned int line ATTRIBUTE_UNUSED,
26760 unsigned int blocknum)
26762 switch_to_section (current_function_section ());
26763 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_BEGIN_LABEL, blocknum);
26766 /* Output a marker (i.e. a label) for the end of the generated code for a
26767 lexical block. */
26769 static void
26770 dwarf2out_end_block (unsigned int line ATTRIBUTE_UNUSED, unsigned int blocknum)
26772 switch_to_section (current_function_section ());
26773 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, BLOCK_END_LABEL, blocknum);
26776 /* Returns nonzero if it is appropriate not to emit any debugging
26777 information for BLOCK, because it doesn't contain any instructions.
26779 Don't allow this for blocks with nested functions or local classes
26780 as we would end up with orphans, and in the presence of scheduling
26781 we may end up calling them anyway. */
26783 static bool
26784 dwarf2out_ignore_block (const_tree block)
26786 tree decl;
26787 unsigned int i;
26789 for (decl = BLOCK_VARS (block); decl; decl = DECL_CHAIN (decl))
26790 if (TREE_CODE (decl) == FUNCTION_DECL
26791 || (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)))
26792 return 0;
26793 for (i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (block); i++)
26795 decl = BLOCK_NONLOCALIZED_VAR (block, i);
26796 if (TREE_CODE (decl) == FUNCTION_DECL
26797 || (TREE_CODE (decl) == TYPE_DECL && TYPE_DECL_IS_STUB (decl)))
26798 return 0;
26801 return 1;
26804 /* Hash table routines for file_hash. */
26806 bool
26807 dwarf_file_hasher::equal (dwarf_file_data *p1, const char *p2)
26809 return filename_cmp (p1->filename, p2) == 0;
26812 hashval_t
26813 dwarf_file_hasher::hash (dwarf_file_data *p)
26815 return htab_hash_string (p->filename);
26818 /* Lookup FILE_NAME (in the list of filenames that we know about here in
26819 dwarf2out.c) and return its "index". The index of each (known) filename is
26820 just a unique number which is associated with only that one filename. We
26821 need such numbers for the sake of generating labels (in the .debug_sfnames
26822 section) and references to those files numbers (in the .debug_srcinfo
26823 and .debug_macinfo sections). If the filename given as an argument is not
26824 found in our current list, add it to the list and assign it the next
26825 available unique index number. */
26827 static struct dwarf_file_data *
26828 lookup_filename (const char *file_name)
26830 struct dwarf_file_data * created;
26832 if (!file_name)
26833 return NULL;
26835 dwarf_file_data **slot
26836 = file_table->find_slot_with_hash (file_name, htab_hash_string (file_name),
26837 INSERT);
26838 if (*slot)
26839 return *slot;
26841 created = ggc_alloc<dwarf_file_data> ();
26842 created->filename = file_name;
26843 created->emitted_number = 0;
26844 *slot = created;
26845 return created;
26848 /* If the assembler will construct the file table, then translate the compiler
26849 internal file table number into the assembler file table number, and emit
26850 a .file directive if we haven't already emitted one yet. The file table
26851 numbers are different because we prune debug info for unused variables and
26852 types, which may include filenames. */
26854 static int
26855 maybe_emit_file (struct dwarf_file_data * fd)
26857 if (! fd->emitted_number)
26859 if (last_emitted_file)
26860 fd->emitted_number = last_emitted_file->emitted_number + 1;
26861 else
26862 fd->emitted_number = 1;
26863 last_emitted_file = fd;
26865 if (output_asm_line_debug_info ())
26867 fprintf (asm_out_file, "\t.file %u ", fd->emitted_number);
26868 output_quoted_string (asm_out_file,
26869 remap_debug_filename (fd->filename));
26870 fputc ('\n', asm_out_file);
26874 return fd->emitted_number;
26877 /* Schedule generation of a DW_AT_const_value attribute to DIE.
26878 That generation should happen after function debug info has been
26879 generated. The value of the attribute is the constant value of ARG. */
26881 static void
26882 append_entry_to_tmpl_value_parm_die_table (dw_die_ref die, tree arg)
26884 die_arg_entry entry;
26886 if (!die || !arg)
26887 return;
26889 gcc_assert (early_dwarf);
26891 if (!tmpl_value_parm_die_table)
26892 vec_alloc (tmpl_value_parm_die_table, 32);
26894 entry.die = die;
26895 entry.arg = arg;
26896 vec_safe_push (tmpl_value_parm_die_table, entry);
26899 /* Return TRUE if T is an instance of generic type, FALSE
26900 otherwise. */
26902 static bool
26903 generic_type_p (tree t)
26905 if (t == NULL_TREE || !TYPE_P (t))
26906 return false;
26907 return lang_hooks.get_innermost_generic_parms (t) != NULL_TREE;
26910 /* Schedule the generation of the generic parameter dies for the
26911 instance of generic type T. The proper generation itself is later
26912 done by gen_scheduled_generic_parms_dies. */
26914 static void
26915 schedule_generic_params_dies_gen (tree t)
26917 if (!generic_type_p (t))
26918 return;
26920 gcc_assert (early_dwarf);
26922 if (!generic_type_instances)
26923 vec_alloc (generic_type_instances, 256);
26925 vec_safe_push (generic_type_instances, t);
26928 /* Add a DW_AT_const_value attribute to DIEs that were scheduled
26929 by append_entry_to_tmpl_value_parm_die_table. This function must
26930 be called after function DIEs have been generated. */
26932 static void
26933 gen_remaining_tmpl_value_param_die_attribute (void)
26935 if (tmpl_value_parm_die_table)
26937 unsigned i, j;
26938 die_arg_entry *e;
26940 /* We do this in two phases - first get the cases we can
26941 handle during early-finish, preserving those we cannot
26942 (containing symbolic constants where we don't yet know
26943 whether we are going to output the referenced symbols).
26944 For those we try again at late-finish. */
26945 j = 0;
26946 FOR_EACH_VEC_ELT (*tmpl_value_parm_die_table, i, e)
26948 if (!e->die->removed
26949 && !tree_add_const_value_attribute (e->die, e->arg))
26951 dw_loc_descr_ref loc = NULL;
26952 if (! early_dwarf
26953 && (dwarf_version >= 5 || !dwarf_strict))
26954 loc = loc_descriptor_from_tree (e->arg, 2, NULL);
26955 if (loc)
26956 add_AT_loc (e->die, DW_AT_location, loc);
26957 else
26958 (*tmpl_value_parm_die_table)[j++] = *e;
26961 tmpl_value_parm_die_table->truncate (j);
26965 /* Generate generic parameters DIEs for instances of generic types
26966 that have been previously scheduled by
26967 schedule_generic_params_dies_gen. This function must be called
26968 after all the types of the CU have been laid out. */
26970 static void
26971 gen_scheduled_generic_parms_dies (void)
26973 unsigned i;
26974 tree t;
26976 if (!generic_type_instances)
26977 return;
26979 FOR_EACH_VEC_ELT (*generic_type_instances, i, t)
26980 if (COMPLETE_TYPE_P (t))
26981 gen_generic_params_dies (t);
26983 generic_type_instances = NULL;
26987 /* Replace DW_AT_name for the decl with name. */
26989 static void
26990 dwarf2out_set_name (tree decl, tree name)
26992 dw_die_ref die;
26993 dw_attr_node *attr;
26994 const char *dname;
26996 die = TYPE_SYMTAB_DIE (decl);
26997 if (!die)
26998 return;
27000 dname = dwarf2_name (name, 0);
27001 if (!dname)
27002 return;
27004 attr = get_AT (die, DW_AT_name);
27005 if (attr)
27007 struct indirect_string_node *node;
27009 node = find_AT_string (dname);
27010 /* replace the string. */
27011 attr->dw_attr_val.v.val_str = node;
27014 else
27015 add_name_attribute (die, dname);
27018 /* True if before or during processing of the first function being emitted. */
27019 static bool in_first_function_p = true;
27020 /* True if loc_note during dwarf2out_var_location call might still be
27021 before first real instruction at address equal to .Ltext0. */
27022 static bool maybe_at_text_label_p = true;
27023 /* One above highest N where .LVLN label might be equal to .Ltext0 label. */
27024 static unsigned int first_loclabel_num_not_at_text_label;
27026 /* Look ahead for a real insn, or for a begin stmt marker. */
27028 static rtx_insn *
27029 dwarf2out_next_real_insn (rtx_insn *loc_note)
27031 rtx_insn *next_real = NEXT_INSN (loc_note);
27033 while (next_real)
27034 if (INSN_P (next_real))
27035 break;
27036 else
27037 next_real = NEXT_INSN (next_real);
27039 return next_real;
27042 /* Called by the final INSN scan whenever we see a var location. We
27043 use it to drop labels in the right places, and throw the location in
27044 our lookup table. */
27046 static void
27047 dwarf2out_var_location (rtx_insn *loc_note)
27049 char loclabel[MAX_ARTIFICIAL_LABEL_BYTES + 2];
27050 struct var_loc_node *newloc;
27051 rtx_insn *next_real, *next_note;
27052 rtx_insn *call_insn = NULL;
27053 static const char *last_label;
27054 static const char *last_postcall_label;
27055 static bool last_in_cold_section_p;
27056 static rtx_insn *expected_next_loc_note;
27057 tree decl;
27058 bool var_loc_p;
27059 var_loc_view view = 0;
27061 if (!NOTE_P (loc_note))
27063 if (CALL_P (loc_note))
27065 maybe_reset_location_view (loc_note, cur_line_info_table);
27066 call_site_count++;
27067 if (SIBLING_CALL_P (loc_note))
27068 tail_call_site_count++;
27069 if (find_reg_note (loc_note, REG_CALL_ARG_LOCATION, NULL_RTX))
27071 call_insn = loc_note;
27072 loc_note = NULL;
27073 var_loc_p = false;
27075 next_real = dwarf2out_next_real_insn (call_insn);
27076 next_note = NULL;
27077 cached_next_real_insn = NULL;
27078 goto create_label;
27080 if (optimize == 0 && !flag_var_tracking)
27082 /* When the var-tracking pass is not running, there is no note
27083 for indirect calls whose target is compile-time known. In this
27084 case, process such calls specifically so that we generate call
27085 sites for them anyway. */
27086 rtx x = PATTERN (loc_note);
27087 if (GET_CODE (x) == PARALLEL)
27088 x = XVECEXP (x, 0, 0);
27089 if (GET_CODE (x) == SET)
27090 x = SET_SRC (x);
27091 if (GET_CODE (x) == CALL)
27092 x = XEXP (x, 0);
27093 if (!MEM_P (x)
27094 || GET_CODE (XEXP (x, 0)) != SYMBOL_REF
27095 || !SYMBOL_REF_DECL (XEXP (x, 0))
27096 || (TREE_CODE (SYMBOL_REF_DECL (XEXP (x, 0)))
27097 != FUNCTION_DECL))
27099 call_insn = loc_note;
27100 loc_note = NULL;
27101 var_loc_p = false;
27103 next_real = dwarf2out_next_real_insn (call_insn);
27104 next_note = NULL;
27105 cached_next_real_insn = NULL;
27106 goto create_label;
27110 else if (!debug_variable_location_views)
27111 gcc_unreachable ();
27112 else
27113 maybe_reset_location_view (loc_note, cur_line_info_table);
27115 return;
27118 var_loc_p = NOTE_KIND (loc_note) == NOTE_INSN_VAR_LOCATION;
27119 if (var_loc_p && !DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
27120 return;
27122 /* Optimize processing a large consecutive sequence of location
27123 notes so we don't spend too much time in next_real_insn. If the
27124 next insn is another location note, remember the next_real_insn
27125 calculation for next time. */
27126 next_real = cached_next_real_insn;
27127 if (next_real)
27129 if (expected_next_loc_note != loc_note)
27130 next_real = NULL;
27133 next_note = NEXT_INSN (loc_note);
27134 if (! next_note
27135 || next_note->deleted ()
27136 || ! NOTE_P (next_note)
27137 || (NOTE_KIND (next_note) != NOTE_INSN_VAR_LOCATION
27138 && NOTE_KIND (next_note) != NOTE_INSN_BEGIN_STMT
27139 && NOTE_KIND (next_note) != NOTE_INSN_INLINE_ENTRY))
27140 next_note = NULL;
27142 if (! next_real)
27143 next_real = dwarf2out_next_real_insn (loc_note);
27145 if (next_note)
27147 expected_next_loc_note = next_note;
27148 cached_next_real_insn = next_real;
27150 else
27151 cached_next_real_insn = NULL;
27153 /* If there are no instructions which would be affected by this note,
27154 don't do anything. */
27155 if (var_loc_p
27156 && next_real == NULL_RTX
27157 && !NOTE_DURING_CALL_P (loc_note))
27158 return;
27160 create_label:
27162 if (next_real == NULL_RTX)
27163 next_real = get_last_insn ();
27165 /* If there were any real insns between note we processed last time
27166 and this note (or if it is the first note), clear
27167 last_{,postcall_}label so that they are not reused this time. */
27168 if (last_var_location_insn == NULL_RTX
27169 || last_var_location_insn != next_real
27170 || last_in_cold_section_p != in_cold_section_p)
27172 last_label = NULL;
27173 last_postcall_label = NULL;
27176 if (var_loc_p)
27178 const char *label
27179 = NOTE_DURING_CALL_P (loc_note) ? last_postcall_label : last_label;
27180 view = cur_line_info_table->view;
27181 decl = NOTE_VAR_LOCATION_DECL (loc_note);
27182 newloc = add_var_loc_to_decl (decl, loc_note, label, view);
27183 if (newloc == NULL)
27184 return;
27186 else
27188 decl = NULL_TREE;
27189 newloc = NULL;
27192 /* If there were no real insns between note we processed last time
27193 and this note, use the label we emitted last time. Otherwise
27194 create a new label and emit it. */
27195 if (last_label == NULL)
27197 ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", loclabel_num);
27198 ASM_OUTPUT_DEBUG_LABEL (asm_out_file, "LVL", loclabel_num);
27199 loclabel_num++;
27200 last_label = ggc_strdup (loclabel);
27201 /* See if loclabel might be equal to .Ltext0. If yes,
27202 bump first_loclabel_num_not_at_text_label. */
27203 if (!have_multiple_function_sections
27204 && in_first_function_p
27205 && maybe_at_text_label_p)
27207 static rtx_insn *last_start;
27208 rtx_insn *insn;
27209 for (insn = loc_note; insn; insn = previous_insn (insn))
27210 if (insn == last_start)
27211 break;
27212 else if (!NONDEBUG_INSN_P (insn))
27213 continue;
27214 else
27216 rtx body = PATTERN (insn);
27217 if (GET_CODE (body) == USE || GET_CODE (body) == CLOBBER)
27218 continue;
27219 /* Inline asm could occupy zero bytes. */
27220 else if (GET_CODE (body) == ASM_INPUT
27221 || asm_noperands (body) >= 0)
27222 continue;
27223 #ifdef HAVE_ATTR_length /* ??? We don't include insn-attr.h. */
27224 else if (HAVE_ATTR_length && get_attr_min_length (insn) == 0)
27225 continue;
27226 #endif
27227 else
27229 /* Assume insn has non-zero length. */
27230 maybe_at_text_label_p = false;
27231 break;
27234 if (maybe_at_text_label_p)
27236 last_start = loc_note;
27237 first_loclabel_num_not_at_text_label = loclabel_num;
27242 gcc_assert ((loc_note == NULL_RTX && call_insn != NULL_RTX)
27243 || (loc_note != NULL_RTX && call_insn == NULL_RTX));
27245 if (!var_loc_p)
27247 struct call_arg_loc_node *ca_loc
27248 = ggc_cleared_alloc<call_arg_loc_node> ();
27249 rtx_insn *prev = call_insn;
27251 ca_loc->call_arg_loc_note
27252 = find_reg_note (call_insn, REG_CALL_ARG_LOCATION, NULL_RTX);
27253 ca_loc->next = NULL;
27254 ca_loc->label = last_label;
27255 gcc_assert (prev
27256 && (CALL_P (prev)
27257 || (NONJUMP_INSN_P (prev)
27258 && GET_CODE (PATTERN (prev)) == SEQUENCE
27259 && CALL_P (XVECEXP (PATTERN (prev), 0, 0)))));
27260 if (!CALL_P (prev))
27261 prev = as_a <rtx_sequence *> (PATTERN (prev))->insn (0);
27262 ca_loc->tail_call_p = SIBLING_CALL_P (prev);
27264 /* Look for a SYMBOL_REF in the "prev" instruction. */
27265 rtx x = get_call_rtx_from (PATTERN (prev));
27266 if (x)
27268 /* Try to get the call symbol, if any. */
27269 if (MEM_P (XEXP (x, 0)))
27270 x = XEXP (x, 0);
27271 /* First, look for a memory access to a symbol_ref. */
27272 if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
27273 && SYMBOL_REF_DECL (XEXP (x, 0))
27274 && TREE_CODE (SYMBOL_REF_DECL (XEXP (x, 0))) == FUNCTION_DECL)
27275 ca_loc->symbol_ref = XEXP (x, 0);
27276 /* Otherwise, look at a compile-time known user-level function
27277 declaration. */
27278 else if (MEM_P (x)
27279 && MEM_EXPR (x)
27280 && TREE_CODE (MEM_EXPR (x)) == FUNCTION_DECL)
27281 ca_loc->symbol_ref = XEXP (DECL_RTL (MEM_EXPR (x)), 0);
27284 ca_loc->block = insn_scope (prev);
27285 if (call_arg_locations)
27286 call_arg_loc_last->next = ca_loc;
27287 else
27288 call_arg_locations = ca_loc;
27289 call_arg_loc_last = ca_loc;
27291 else if (loc_note != NULL_RTX && !NOTE_DURING_CALL_P (loc_note))
27293 newloc->label = last_label;
27294 newloc->view = view;
27296 else
27298 if (!last_postcall_label)
27300 sprintf (loclabel, "%s-1", last_label);
27301 last_postcall_label = ggc_strdup (loclabel);
27303 newloc->label = last_postcall_label;
27304 /* ??? This view is at last_label, not last_label-1, but we
27305 could only assume view at last_label-1 is zero if we could
27306 assume calls always have length greater than one. This is
27307 probably true in general, though there might be a rare
27308 exception to this rule, e.g. if a call insn is optimized out
27309 by target magic. Then, even the -1 in the label will be
27310 wrong, which might invalidate the range. Anyway, using view,
27311 though technically possibly incorrect, will work as far as
27312 ranges go: since L-1 is in the middle of the call insn,
27313 (L-1).0 and (L-1).V shouldn't make any difference, and having
27314 the loclist entry refer to the .loc entry might be useful, so
27315 leave it like this. */
27316 newloc->view = view;
27319 if (var_loc_p && flag_debug_asm)
27321 const char *name, *sep, *patstr;
27322 if (decl && DECL_NAME (decl))
27323 name = IDENTIFIER_POINTER (DECL_NAME (decl));
27324 else
27325 name = "";
27326 if (NOTE_VAR_LOCATION_LOC (loc_note))
27328 sep = " => ";
27329 patstr = str_pattern_slim (NOTE_VAR_LOCATION_LOC (loc_note));
27331 else
27333 sep = " ";
27334 patstr = "RESET";
27336 fprintf (asm_out_file, "\t%s DEBUG %s%s%s\n", ASM_COMMENT_START,
27337 name, sep, patstr);
27340 last_var_location_insn = next_real;
27341 last_in_cold_section_p = in_cold_section_p;
27344 /* Check whether BLOCK, a lexical block, is nested within OUTER, or is
27345 OUTER itself. If BOTHWAYS, check not only that BLOCK can reach
27346 OUTER through BLOCK_SUPERCONTEXT links, but also that there is a
27347 path from OUTER to BLOCK through BLOCK_SUBBLOCKs and
27348 BLOCK_FRAGMENT_ORIGIN links. */
27349 static bool
27350 block_within_block_p (tree block, tree outer, bool bothways)
27352 if (block == outer)
27353 return true;
27355 /* Quickly check that OUTER is up BLOCK's supercontext chain. */
27356 for (tree context = BLOCK_SUPERCONTEXT (block);
27357 context != outer;
27358 context = BLOCK_SUPERCONTEXT (context))
27359 if (!context || TREE_CODE (context) != BLOCK)
27360 return false;
27362 if (!bothways)
27363 return true;
27365 /* Now check that each block is actually referenced by its
27366 parent. */
27367 for (tree context = BLOCK_SUPERCONTEXT (block); ;
27368 context = BLOCK_SUPERCONTEXT (context))
27370 if (BLOCK_FRAGMENT_ORIGIN (context))
27372 gcc_assert (!BLOCK_SUBBLOCKS (context));
27373 context = BLOCK_FRAGMENT_ORIGIN (context);
27375 for (tree sub = BLOCK_SUBBLOCKS (context);
27376 sub != block;
27377 sub = BLOCK_CHAIN (sub))
27378 if (!sub)
27379 return false;
27380 if (context == outer)
27381 return true;
27382 else
27383 block = context;
27387 /* Called during final while assembling the marker of the entry point
27388 for an inlined function. */
27390 static void
27391 dwarf2out_inline_entry (tree block)
27393 gcc_assert (debug_inline_points);
27395 /* If we can't represent it, don't bother. */
27396 if (!(dwarf_version >= 3 || !dwarf_strict))
27397 return;
27399 gcc_assert (DECL_P (block_ultimate_origin (block)));
27401 /* Sanity check the block tree. This would catch a case in which
27402 BLOCK got removed from the tree reachable from the outermost
27403 lexical block, but got retained in markers. It would still link
27404 back to its parents, but some ancestor would be missing a link
27405 down the path to the sub BLOCK. If the block got removed, its
27406 BLOCK_NUMBER will not be a usable value. */
27407 if (flag_checking)
27408 gcc_assert (block_within_block_p (block,
27409 DECL_INITIAL (current_function_decl),
27410 true));
27412 gcc_assert (inlined_function_outer_scope_p (block));
27413 gcc_assert (!BLOCK_DIE (block));
27415 if (BLOCK_FRAGMENT_ORIGIN (block))
27416 block = BLOCK_FRAGMENT_ORIGIN (block);
27417 /* Can the entry point ever not be at the beginning of an
27418 unfragmented lexical block? */
27419 else if (!(BLOCK_FRAGMENT_CHAIN (block)
27420 || (cur_line_info_table
27421 && !ZERO_VIEW_P (cur_line_info_table->view))))
27422 return;
27424 if (!inline_entry_data_table)
27425 inline_entry_data_table
27426 = hash_table<inline_entry_data_hasher>::create_ggc (10);
27429 inline_entry_data **iedp
27430 = inline_entry_data_table->find_slot_with_hash (block,
27431 htab_hash_pointer (block),
27432 INSERT);
27433 if (*iedp)
27434 /* ??? Ideally, we'd record all entry points for the same inlined
27435 function (some may have been duplicated by e.g. unrolling), but
27436 we have no way to represent that ATM. */
27437 return;
27439 inline_entry_data *ied = *iedp = ggc_cleared_alloc<inline_entry_data> ();
27440 ied->block = block;
27441 ied->label_pfx = BLOCK_INLINE_ENTRY_LABEL;
27442 ied->label_num = BLOCK_NUMBER (block);
27443 if (cur_line_info_table)
27444 ied->view = cur_line_info_table->view;
27446 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27448 ASM_GENERATE_INTERNAL_LABEL (label, BLOCK_INLINE_ENTRY_LABEL,
27449 BLOCK_NUMBER (block));
27450 ASM_OUTPUT_LABEL (asm_out_file, label);
27453 /* Called from finalize_size_functions for size functions so that their body
27454 can be encoded in the debug info to describe the layout of variable-length
27455 structures. */
27457 static void
27458 dwarf2out_size_function (tree decl)
27460 function_to_dwarf_procedure (decl);
27463 /* Note in one location list that text section has changed. */
27466 var_location_switch_text_section_1 (var_loc_list **slot, void *)
27468 var_loc_list *list = *slot;
27469 if (list->first)
27470 list->last_before_switch
27471 = list->last->next ? list->last->next : list->last;
27472 return 1;
27475 /* Note in all location lists that text section has changed. */
27477 static void
27478 var_location_switch_text_section (void)
27480 if (decl_loc_table == NULL)
27481 return;
27483 decl_loc_table->traverse<void *, var_location_switch_text_section_1> (NULL);
27486 /* Create a new line number table. */
27488 static dw_line_info_table *
27489 new_line_info_table (void)
27491 dw_line_info_table *table;
27493 table = ggc_cleared_alloc<dw_line_info_table> ();
27494 table->file_num = 1;
27495 table->line_num = 1;
27496 table->is_stmt = DWARF_LINE_DEFAULT_IS_STMT_START;
27497 FORCE_RESET_NEXT_VIEW (table->view);
27498 table->symviews_since_reset = 0;
27500 return table;
27503 /* Lookup the "current" table into which we emit line info, so
27504 that we don't have to do it for every source line. */
27506 static void
27507 set_cur_line_info_table (section *sec)
27509 dw_line_info_table *table;
27511 if (sec == text_section)
27512 table = text_section_line_info;
27513 else if (sec == cold_text_section)
27515 table = cold_text_section_line_info;
27516 if (!table)
27518 cold_text_section_line_info = table = new_line_info_table ();
27519 table->end_label = cold_end_label;
27522 else
27524 const char *end_label;
27526 if (crtl->has_bb_partition)
27528 if (in_cold_section_p)
27529 end_label = crtl->subsections.cold_section_end_label;
27530 else
27531 end_label = crtl->subsections.hot_section_end_label;
27533 else
27535 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27536 ASM_GENERATE_INTERNAL_LABEL (label, FUNC_END_LABEL,
27537 current_function_funcdef_no);
27538 end_label = ggc_strdup (label);
27541 table = new_line_info_table ();
27542 table->end_label = end_label;
27544 vec_safe_push (separate_line_info, table);
27547 if (output_asm_line_debug_info ())
27548 table->is_stmt = (cur_line_info_table
27549 ? cur_line_info_table->is_stmt
27550 : DWARF_LINE_DEFAULT_IS_STMT_START);
27551 cur_line_info_table = table;
27555 /* We need to reset the locations at the beginning of each
27556 function. We can't do this in the end_function hook, because the
27557 declarations that use the locations won't have been output when
27558 that hook is called. Also compute have_multiple_function_sections here. */
27560 static void
27561 dwarf2out_begin_function (tree fun)
27563 section *sec = function_section (fun);
27565 if (sec != text_section)
27566 have_multiple_function_sections = true;
27568 if (crtl->has_bb_partition && !cold_text_section)
27570 gcc_assert (current_function_decl == fun);
27571 cold_text_section = unlikely_text_section ();
27572 switch_to_section (cold_text_section);
27573 ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
27574 switch_to_section (sec);
27577 dwarf2out_note_section_used ();
27578 call_site_count = 0;
27579 tail_call_site_count = 0;
27581 set_cur_line_info_table (sec);
27582 FORCE_RESET_NEXT_VIEW (cur_line_info_table->view);
27585 /* Helper function of dwarf2out_end_function, called only after emitting
27586 the very first function into assembly. Check if some .debug_loc range
27587 might end with a .LVL* label that could be equal to .Ltext0.
27588 In that case we must force using absolute addresses in .debug_loc ranges,
27589 because this range could be .LVLN-.Ltext0 .. .LVLM-.Ltext0 for
27590 .LVLN == .LVLM == .Ltext0, thus 0 .. 0, which is a .debug_loc
27591 list terminator.
27592 Set have_multiple_function_sections to true in that case and
27593 terminate htab traversal. */
27596 find_empty_loc_ranges_at_text_label (var_loc_list **slot, int)
27598 var_loc_list *entry = *slot;
27599 struct var_loc_node *node;
27601 node = entry->first;
27602 if (node && node->next && node->next->label)
27604 unsigned int i;
27605 const char *label = node->next->label;
27606 char loclabel[MAX_ARTIFICIAL_LABEL_BYTES];
27608 for (i = 0; i < first_loclabel_num_not_at_text_label; i++)
27610 ASM_GENERATE_INTERNAL_LABEL (loclabel, "LVL", i);
27611 if (strcmp (label, loclabel) == 0)
27613 have_multiple_function_sections = true;
27614 return 0;
27618 return 1;
27621 /* Hook called after emitting a function into assembly.
27622 This does something only for the very first function emitted. */
27624 static void
27625 dwarf2out_end_function (unsigned int)
27627 if (in_first_function_p
27628 && !have_multiple_function_sections
27629 && first_loclabel_num_not_at_text_label
27630 && decl_loc_table)
27631 decl_loc_table->traverse<int, find_empty_loc_ranges_at_text_label> (0);
27632 in_first_function_p = false;
27633 maybe_at_text_label_p = false;
27636 /* Temporary holder for dwarf2out_register_main_translation_unit. Used to let
27637 front-ends register a translation unit even before dwarf2out_init is
27638 called. */
27639 static tree main_translation_unit = NULL_TREE;
27641 /* Hook called by front-ends after they built their main translation unit.
27642 Associate comp_unit_die to UNIT. */
27644 static void
27645 dwarf2out_register_main_translation_unit (tree unit)
27647 gcc_assert (TREE_CODE (unit) == TRANSLATION_UNIT_DECL
27648 && main_translation_unit == NULL_TREE);
27649 main_translation_unit = unit;
27650 /* If dwarf2out_init has not been called yet, it will perform the association
27651 itself looking at main_translation_unit. */
27652 if (decl_die_table != NULL)
27653 equate_decl_number_to_die (unit, comp_unit_die ());
27656 /* Add OPCODE+VAL as an entry at the end of the opcode array in TABLE. */
27658 static void
27659 push_dw_line_info_entry (dw_line_info_table *table,
27660 enum dw_line_info_opcode opcode, unsigned int val)
27662 dw_line_info_entry e;
27663 e.opcode = opcode;
27664 e.val = val;
27665 vec_safe_push (table->entries, e);
27668 /* Output a label to mark the beginning of a source code line entry
27669 and record information relating to this source line, in
27670 'line_info_table' for later output of the .debug_line section. */
27671 /* ??? The discriminator parameter ought to be unsigned. */
27673 static void
27674 dwarf2out_source_line (unsigned int line, unsigned int column,
27675 const char *filename,
27676 int discriminator, bool is_stmt)
27678 unsigned int file_num;
27679 dw_line_info_table *table;
27680 static var_loc_view lvugid;
27682 if (debug_info_level < DINFO_LEVEL_TERSE)
27683 return;
27685 table = cur_line_info_table;
27687 if (line == 0)
27689 if (debug_variable_location_views
27690 && output_asm_line_debug_info ()
27691 && table && !RESETTING_VIEW_P (table->view))
27693 /* If we're using the assembler to compute view numbers, we
27694 can't issue a .loc directive for line zero, so we can't
27695 get a view number at this point. We might attempt to
27696 compute it from the previous view, or equate it to a
27697 subsequent view (though it might not be there!), but
27698 since we're omitting the line number entry, we might as
27699 well omit the view number as well. That means pretending
27700 it's a view number zero, which might very well turn out
27701 to be correct. ??? Extend the assembler so that the
27702 compiler could emit e.g. ".locview .LVU#", to output a
27703 view without changing line number information. We'd then
27704 have to count it in symviews_since_reset; when it's omitted,
27705 it doesn't count. */
27706 if (!zero_view_p)
27707 zero_view_p = BITMAP_GGC_ALLOC ();
27708 bitmap_set_bit (zero_view_p, table->view);
27709 if (flag_debug_asm)
27711 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27712 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", table->view);
27713 fprintf (asm_out_file, "\t%s line 0, omitted view ",
27714 ASM_COMMENT_START);
27715 assemble_name (asm_out_file, label);
27716 putc ('\n', asm_out_file);
27718 table->view = ++lvugid;
27720 return;
27723 /* The discriminator column was added in dwarf4. Simplify the below
27724 by simply removing it if we're not supposed to output it. */
27725 if (dwarf_version < 4 && dwarf_strict)
27726 discriminator = 0;
27728 if (!debug_column_info)
27729 column = 0;
27731 file_num = maybe_emit_file (lookup_filename (filename));
27733 /* ??? TODO: Elide duplicate line number entries. Traditionally,
27734 the debugger has used the second (possibly duplicate) line number
27735 at the beginning of the function to mark the end of the prologue.
27736 We could eliminate any other duplicates within the function. For
27737 Dwarf3, we ought to include the DW_LNS_set_prologue_end mark in
27738 that second line number entry. */
27739 /* Recall that this end-of-prologue indication is *not* the same thing
27740 as the end_prologue debug hook. The NOTE_INSN_PROLOGUE_END note,
27741 to which the hook corresponds, follows the last insn that was
27742 emitted by gen_prologue. What we need is to precede the first insn
27743 that had been emitted after NOTE_INSN_FUNCTION_BEG, i.e. the first
27744 insn that corresponds to something the user wrote. These may be
27745 very different locations once scheduling is enabled. */
27747 if (0 && file_num == table->file_num
27748 && line == table->line_num
27749 && column == table->column_num
27750 && discriminator == table->discrim_num
27751 && is_stmt == table->is_stmt)
27752 return;
27754 switch_to_section (current_function_section ());
27756 /* If requested, emit something human-readable. */
27757 if (flag_debug_asm)
27759 if (debug_column_info)
27760 fprintf (asm_out_file, "\t%s %s:%d:%d\n", ASM_COMMENT_START,
27761 filename, line, column);
27762 else
27763 fprintf (asm_out_file, "\t%s %s:%d\n", ASM_COMMENT_START,
27764 filename, line);
27767 if (output_asm_line_debug_info ())
27769 /* Emit the .loc directive understood by GNU as. */
27770 /* "\t.loc %u %u 0 is_stmt %u discriminator %u",
27771 file_num, line, is_stmt, discriminator */
27772 fputs ("\t.loc ", asm_out_file);
27773 fprint_ul (asm_out_file, file_num);
27774 putc (' ', asm_out_file);
27775 fprint_ul (asm_out_file, line);
27776 putc (' ', asm_out_file);
27777 fprint_ul (asm_out_file, column);
27779 if (is_stmt != table->is_stmt)
27781 fputs (" is_stmt ", asm_out_file);
27782 putc (is_stmt ? '1' : '0', asm_out_file);
27784 if (SUPPORTS_DISCRIMINATOR && discriminator != 0)
27786 gcc_assert (discriminator > 0);
27787 fputs (" discriminator ", asm_out_file);
27788 fprint_ul (asm_out_file, (unsigned long) discriminator);
27790 if (debug_variable_location_views)
27792 if (!RESETTING_VIEW_P (table->view))
27794 table->symviews_since_reset++;
27795 if (table->symviews_since_reset > symview_upper_bound)
27796 symview_upper_bound = table->symviews_since_reset;
27797 /* When we're using the assembler to compute view
27798 numbers, we output symbolic labels after "view" in
27799 .loc directives, and the assembler will set them for
27800 us, so that we can refer to the view numbers in
27801 location lists. The only exceptions are when we know
27802 a view will be zero: "-0" is a forced reset, used
27803 e.g. in the beginning of functions, whereas "0" tells
27804 the assembler to check that there was a PC change
27805 since the previous view, in a way that implicitly
27806 resets the next view. */
27807 fputs (" view ", asm_out_file);
27808 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27809 ASM_GENERATE_INTERNAL_LABEL (label, "LVU", table->view);
27810 assemble_name (asm_out_file, label);
27811 table->view = ++lvugid;
27813 else
27815 table->symviews_since_reset = 0;
27816 if (FORCE_RESETTING_VIEW_P (table->view))
27817 fputs (" view -0", asm_out_file);
27818 else
27819 fputs (" view 0", asm_out_file);
27820 /* Mark the present view as a zero view. Earlier debug
27821 binds may have already added its id to loclists to be
27822 emitted later, so we can't reuse the id for something
27823 else. However, it's good to know whether a view is
27824 known to be zero, because then we may be able to
27825 optimize out locviews that are all zeros, so take
27826 note of it in zero_view_p. */
27827 if (!zero_view_p)
27828 zero_view_p = BITMAP_GGC_ALLOC ();
27829 bitmap_set_bit (zero_view_p, lvugid);
27830 table->view = ++lvugid;
27833 putc ('\n', asm_out_file);
27835 else
27837 unsigned int label_num = ++line_info_label_num;
27839 targetm.asm_out.internal_label (asm_out_file, LINE_CODE_LABEL, label_num);
27841 if (debug_variable_location_views && !RESETTING_VIEW_P (table->view))
27842 push_dw_line_info_entry (table, LI_adv_address, label_num);
27843 else
27844 push_dw_line_info_entry (table, LI_set_address, label_num);
27845 if (debug_variable_location_views)
27847 bool resetting = FORCE_RESETTING_VIEW_P (table->view);
27848 if (resetting)
27849 table->view = 0;
27851 if (flag_debug_asm)
27852 fprintf (asm_out_file, "\t%s view %s%d\n",
27853 ASM_COMMENT_START,
27854 resetting ? "-" : "",
27855 table->view);
27857 table->view++;
27859 if (file_num != table->file_num)
27860 push_dw_line_info_entry (table, LI_set_file, file_num);
27861 if (discriminator != table->discrim_num)
27862 push_dw_line_info_entry (table, LI_set_discriminator, discriminator);
27863 if (is_stmt != table->is_stmt)
27864 push_dw_line_info_entry (table, LI_negate_stmt, 0);
27865 push_dw_line_info_entry (table, LI_set_line, line);
27866 if (debug_column_info)
27867 push_dw_line_info_entry (table, LI_set_column, column);
27870 table->file_num = file_num;
27871 table->line_num = line;
27872 table->column_num = column;
27873 table->discrim_num = discriminator;
27874 table->is_stmt = is_stmt;
27875 table->in_use = true;
27878 /* Record the beginning of a new source file. */
27880 static void
27881 dwarf2out_start_source_file (unsigned int lineno, const char *filename)
27883 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27885 macinfo_entry e;
27886 e.code = DW_MACINFO_start_file;
27887 e.lineno = lineno;
27888 e.info = ggc_strdup (filename);
27889 vec_safe_push (macinfo_table, e);
27893 /* Record the end of a source file. */
27895 static void
27896 dwarf2out_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED)
27898 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27900 macinfo_entry e;
27901 e.code = DW_MACINFO_end_file;
27902 e.lineno = lineno;
27903 e.info = NULL;
27904 vec_safe_push (macinfo_table, e);
27908 /* Called from debug_define in toplev.c. The `buffer' parameter contains
27909 the tail part of the directive line, i.e. the part which is past the
27910 initial whitespace, #, whitespace, directive-name, whitespace part. */
27912 static void
27913 dwarf2out_define (unsigned int lineno ATTRIBUTE_UNUSED,
27914 const char *buffer ATTRIBUTE_UNUSED)
27916 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27918 macinfo_entry e;
27919 /* Insert a dummy first entry to be able to optimize the whole
27920 predefined macro block using DW_MACRO_import. */
27921 if (macinfo_table->is_empty () && lineno <= 1)
27923 e.code = 0;
27924 e.lineno = 0;
27925 e.info = NULL;
27926 vec_safe_push (macinfo_table, e);
27928 e.code = DW_MACINFO_define;
27929 e.lineno = lineno;
27930 e.info = ggc_strdup (buffer);
27931 vec_safe_push (macinfo_table, e);
27935 /* Called from debug_undef in toplev.c. The `buffer' parameter contains
27936 the tail part of the directive line, i.e. the part which is past the
27937 initial whitespace, #, whitespace, directive-name, whitespace part. */
27939 static void
27940 dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED,
27941 const char *buffer ATTRIBUTE_UNUSED)
27943 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
27945 macinfo_entry e;
27946 /* Insert a dummy first entry to be able to optimize the whole
27947 predefined macro block using DW_MACRO_import. */
27948 if (macinfo_table->is_empty () && lineno <= 1)
27950 e.code = 0;
27951 e.lineno = 0;
27952 e.info = NULL;
27953 vec_safe_push (macinfo_table, e);
27955 e.code = DW_MACINFO_undef;
27956 e.lineno = lineno;
27957 e.info = ggc_strdup (buffer);
27958 vec_safe_push (macinfo_table, e);
27962 /* Helpers to manipulate hash table of CUs. */
27964 struct macinfo_entry_hasher : nofree_ptr_hash <macinfo_entry>
27966 static inline hashval_t hash (const macinfo_entry *);
27967 static inline bool equal (const macinfo_entry *, const macinfo_entry *);
27970 inline hashval_t
27971 macinfo_entry_hasher::hash (const macinfo_entry *entry)
27973 return htab_hash_string (entry->info);
27976 inline bool
27977 macinfo_entry_hasher::equal (const macinfo_entry *entry1,
27978 const macinfo_entry *entry2)
27980 return !strcmp (entry1->info, entry2->info);
27983 typedef hash_table<macinfo_entry_hasher> macinfo_hash_type;
27985 /* Output a single .debug_macinfo entry. */
27987 static void
27988 output_macinfo_op (macinfo_entry *ref)
27990 int file_num;
27991 size_t len;
27992 struct indirect_string_node *node;
27993 char label[MAX_ARTIFICIAL_LABEL_BYTES];
27994 struct dwarf_file_data *fd;
27996 switch (ref->code)
27998 case DW_MACINFO_start_file:
27999 fd = lookup_filename (ref->info);
28000 file_num = maybe_emit_file (fd);
28001 dw2_asm_output_data (1, DW_MACINFO_start_file, "Start new file");
28002 dw2_asm_output_data_uleb128 (ref->lineno,
28003 "Included from line number %lu",
28004 (unsigned long) ref->lineno);
28005 dw2_asm_output_data_uleb128 (file_num, "file %s", ref->info);
28006 break;
28007 case DW_MACINFO_end_file:
28008 dw2_asm_output_data (1, DW_MACINFO_end_file, "End file");
28009 break;
28010 case DW_MACINFO_define:
28011 case DW_MACINFO_undef:
28012 len = strlen (ref->info) + 1;
28013 if (!dwarf_strict
28014 && len > DWARF_OFFSET_SIZE
28015 && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET
28016 && (debug_str_section->common.flags & SECTION_MERGE) != 0)
28018 ref->code = ref->code == DW_MACINFO_define
28019 ? DW_MACRO_define_strp : DW_MACRO_undef_strp;
28020 output_macinfo_op (ref);
28021 return;
28023 dw2_asm_output_data (1, ref->code,
28024 ref->code == DW_MACINFO_define
28025 ? "Define macro" : "Undefine macro");
28026 dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu",
28027 (unsigned long) ref->lineno);
28028 dw2_asm_output_nstring (ref->info, -1, "The macro");
28029 break;
28030 case DW_MACRO_define_strp:
28031 case DW_MACRO_undef_strp:
28032 node = find_AT_string (ref->info);
28033 gcc_assert (node
28034 && (node->form == DW_FORM_strp
28035 || node->form == DW_FORM_GNU_str_index));
28036 dw2_asm_output_data (1, ref->code,
28037 ref->code == DW_MACRO_define_strp
28038 ? "Define macro strp"
28039 : "Undefine macro strp");
28040 dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu",
28041 (unsigned long) ref->lineno);
28042 if (node->form == DW_FORM_strp)
28043 dw2_asm_output_offset (DWARF_OFFSET_SIZE, node->label,
28044 debug_str_section, "The macro: \"%s\"",
28045 ref->info);
28046 else
28047 dw2_asm_output_data_uleb128 (node->index, "The macro: \"%s\"",
28048 ref->info);
28049 break;
28050 case DW_MACRO_import:
28051 dw2_asm_output_data (1, ref->code, "Import");
28052 ASM_GENERATE_INTERNAL_LABEL (label,
28053 DEBUG_MACRO_SECTION_LABEL,
28054 ref->lineno + macinfo_label_base);
28055 dw2_asm_output_offset (DWARF_OFFSET_SIZE, label, NULL, NULL);
28056 break;
28057 default:
28058 fprintf (asm_out_file, "%s unrecognized macinfo code %lu\n",
28059 ASM_COMMENT_START, (unsigned long) ref->code);
28060 break;
28064 /* Attempt to make a sequence of define/undef macinfo ops shareable with
28065 other compilation unit .debug_macinfo sections. IDX is the first
28066 index of a define/undef, return the number of ops that should be
28067 emitted in a comdat .debug_macinfo section and emit
28068 a DW_MACRO_import entry referencing it.
28069 If the define/undef entry should be emitted normally, return 0. */
28071 static unsigned
28072 optimize_macinfo_range (unsigned int idx, vec<macinfo_entry, va_gc> *files,
28073 macinfo_hash_type **macinfo_htab)
28075 macinfo_entry *first, *second, *cur, *inc;
28076 char linebuf[sizeof (HOST_WIDE_INT) * 3 + 1];
28077 unsigned char checksum[16];
28078 struct md5_ctx ctx;
28079 char *grp_name, *tail;
28080 const char *base;
28081 unsigned int i, count, encoded_filename_len, linebuf_len;
28082 macinfo_entry **slot;
28084 first = &(*macinfo_table)[idx];
28085 second = &(*macinfo_table)[idx + 1];
28087 /* Optimize only if there are at least two consecutive define/undef ops,
28088 and either all of them are before first DW_MACINFO_start_file
28089 with lineno {0,1} (i.e. predefined macro block), or all of them are
28090 in some included header file. */
28091 if (second->code != DW_MACINFO_define && second->code != DW_MACINFO_undef)
28092 return 0;
28093 if (vec_safe_is_empty (files))
28095 if (first->lineno > 1 || second->lineno > 1)
28096 return 0;
28098 else if (first->lineno == 0)
28099 return 0;
28101 /* Find the last define/undef entry that can be grouped together
28102 with first and at the same time compute md5 checksum of their
28103 codes, linenumbers and strings. */
28104 md5_init_ctx (&ctx);
28105 for (i = idx; macinfo_table->iterate (i, &cur); i++)
28106 if (cur->code != DW_MACINFO_define && cur->code != DW_MACINFO_undef)
28107 break;
28108 else if (vec_safe_is_empty (files) && cur->lineno > 1)
28109 break;
28110 else
28112 unsigned char code = cur->code;
28113 md5_process_bytes (&code, 1, &ctx);
28114 checksum_uleb128 (cur->lineno, &ctx);
28115 md5_process_bytes (cur->info, strlen (cur->info) + 1, &ctx);
28117 md5_finish_ctx (&ctx, checksum);
28118 count = i - idx;
28120 /* From the containing include filename (if any) pick up just
28121 usable characters from its basename. */
28122 if (vec_safe_is_empty (files))
28123 base = "";
28124 else
28125 base = lbasename (files->last ().info);
28126 for (encoded_filename_len = 0, i = 0; base[i]; i++)
28127 if (ISIDNUM (base[i]) || base[i] == '.')
28128 encoded_filename_len++;
28129 /* Count . at the end. */
28130 if (encoded_filename_len)
28131 encoded_filename_len++;
28133 sprintf (linebuf, HOST_WIDE_INT_PRINT_UNSIGNED, first->lineno);
28134 linebuf_len = strlen (linebuf);
28136 /* The group name format is: wmN.[<encoded filename>.]<lineno>.<md5sum> */
28137 grp_name = XALLOCAVEC (char, 4 + encoded_filename_len + linebuf_len + 1
28138 + 16 * 2 + 1);
28139 memcpy (grp_name, DWARF_OFFSET_SIZE == 4 ? "wm4." : "wm8.", 4);
28140 tail = grp_name + 4;
28141 if (encoded_filename_len)
28143 for (i = 0; base[i]; i++)
28144 if (ISIDNUM (base[i]) || base[i] == '.')
28145 *tail++ = base[i];
28146 *tail++ = '.';
28148 memcpy (tail, linebuf, linebuf_len);
28149 tail += linebuf_len;
28150 *tail++ = '.';
28151 for (i = 0; i < 16; i++)
28152 sprintf (tail + i * 2, "%02x", checksum[i] & 0xff);
28154 /* Construct a macinfo_entry for DW_MACRO_import
28155 in the empty vector entry before the first define/undef. */
28156 inc = &(*macinfo_table)[idx - 1];
28157 inc->code = DW_MACRO_import;
28158 inc->lineno = 0;
28159 inc->info = ggc_strdup (grp_name);
28160 if (!*macinfo_htab)
28161 *macinfo_htab = new macinfo_hash_type (10);
28162 /* Avoid emitting duplicates. */
28163 slot = (*macinfo_htab)->find_slot (inc, INSERT);
28164 if (*slot != NULL)
28166 inc->code = 0;
28167 inc->info = NULL;
28168 /* If such an entry has been used before, just emit
28169 a DW_MACRO_import op. */
28170 inc = *slot;
28171 output_macinfo_op (inc);
28172 /* And clear all macinfo_entry in the range to avoid emitting them
28173 in the second pass. */
28174 for (i = idx; macinfo_table->iterate (i, &cur) && i < idx + count; i++)
28176 cur->code = 0;
28177 cur->info = NULL;
28180 else
28182 *slot = inc;
28183 inc->lineno = (*macinfo_htab)->elements ();
28184 output_macinfo_op (inc);
28186 return count;
28189 /* Save any strings needed by the macinfo table in the debug str
28190 table. All strings must be collected into the table by the time
28191 index_string is called. */
28193 static void
28194 save_macinfo_strings (void)
28196 unsigned len;
28197 unsigned i;
28198 macinfo_entry *ref;
28200 for (i = 0; macinfo_table && macinfo_table->iterate (i, &ref); i++)
28202 switch (ref->code)
28204 /* Match the logic in output_macinfo_op to decide on
28205 indirect strings. */
28206 case DW_MACINFO_define:
28207 case DW_MACINFO_undef:
28208 len = strlen (ref->info) + 1;
28209 if (!dwarf_strict
28210 && len > DWARF_OFFSET_SIZE
28211 && !DWARF2_INDIRECT_STRING_SUPPORT_MISSING_ON_TARGET
28212 && (debug_str_section->common.flags & SECTION_MERGE) != 0)
28213 set_indirect_string (find_AT_string (ref->info));
28214 break;
28215 case DW_MACRO_define_strp:
28216 case DW_MACRO_undef_strp:
28217 set_indirect_string (find_AT_string (ref->info));
28218 break;
28219 default:
28220 break;
28225 /* Output macinfo section(s). */
28227 static void
28228 output_macinfo (const char *debug_line_label, bool early_lto_debug)
28230 unsigned i;
28231 unsigned long length = vec_safe_length (macinfo_table);
28232 macinfo_entry *ref;
28233 vec<macinfo_entry, va_gc> *files = NULL;
28234 macinfo_hash_type *macinfo_htab = NULL;
28235 char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
28237 if (! length)
28238 return;
28240 /* output_macinfo* uses these interchangeably. */
28241 gcc_assert ((int) DW_MACINFO_define == (int) DW_MACRO_define
28242 && (int) DW_MACINFO_undef == (int) DW_MACRO_undef
28243 && (int) DW_MACINFO_start_file == (int) DW_MACRO_start_file
28244 && (int) DW_MACINFO_end_file == (int) DW_MACRO_end_file);
28246 /* AIX Assembler inserts the length, so adjust the reference to match the
28247 offset expected by debuggers. */
28248 strcpy (dl_section_ref, debug_line_label);
28249 if (XCOFF_DEBUGGING_INFO)
28250 strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
28252 /* For .debug_macro emit the section header. */
28253 if (!dwarf_strict || dwarf_version >= 5)
28255 dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4,
28256 "DWARF macro version number");
28257 if (DWARF_OFFSET_SIZE == 8)
28258 dw2_asm_output_data (1, 3, "Flags: 64-bit, lineptr present");
28259 else
28260 dw2_asm_output_data (1, 2, "Flags: 32-bit, lineptr present");
28261 dw2_asm_output_offset (DWARF_OFFSET_SIZE, debug_line_label,
28262 debug_line_section, NULL);
28265 /* In the first loop, it emits the primary .debug_macinfo section
28266 and after each emitted op the macinfo_entry is cleared.
28267 If a longer range of define/undef ops can be optimized using
28268 DW_MACRO_import, the DW_MACRO_import op is emitted and kept in
28269 the vector before the first define/undef in the range and the
28270 whole range of define/undef ops is not emitted and kept. */
28271 for (i = 0; macinfo_table->iterate (i, &ref); i++)
28273 switch (ref->code)
28275 case DW_MACINFO_start_file:
28276 vec_safe_push (files, *ref);
28277 break;
28278 case DW_MACINFO_end_file:
28279 if (!vec_safe_is_empty (files))
28280 files->pop ();
28281 break;
28282 case DW_MACINFO_define:
28283 case DW_MACINFO_undef:
28284 if ((!dwarf_strict || dwarf_version >= 5)
28285 && HAVE_COMDAT_GROUP
28286 && vec_safe_length (files) != 1
28287 && i > 0
28288 && i + 1 < length
28289 && (*macinfo_table)[i - 1].code == 0)
28291 unsigned count = optimize_macinfo_range (i, files, &macinfo_htab);
28292 if (count)
28294 i += count - 1;
28295 continue;
28298 break;
28299 case 0:
28300 /* A dummy entry may be inserted at the beginning to be able
28301 to optimize the whole block of predefined macros. */
28302 if (i == 0)
28303 continue;
28304 default:
28305 break;
28307 output_macinfo_op (ref);
28308 ref->info = NULL;
28309 ref->code = 0;
28312 if (!macinfo_htab)
28313 return;
28315 /* Save the number of transparent includes so we can adjust the
28316 label number for the fat LTO object DWARF. */
28317 unsigned macinfo_label_base_adj = macinfo_htab->elements ();
28319 delete macinfo_htab;
28320 macinfo_htab = NULL;
28322 /* If any DW_MACRO_import were used, on those DW_MACRO_import entries
28323 terminate the current chain and switch to a new comdat .debug_macinfo
28324 section and emit the define/undef entries within it. */
28325 for (i = 0; macinfo_table->iterate (i, &ref); i++)
28326 switch (ref->code)
28328 case 0:
28329 continue;
28330 case DW_MACRO_import:
28332 char label[MAX_ARTIFICIAL_LABEL_BYTES];
28333 tree comdat_key = get_identifier (ref->info);
28334 /* Terminate the previous .debug_macinfo section. */
28335 dw2_asm_output_data (1, 0, "End compilation unit");
28336 targetm.asm_out.named_section (debug_macinfo_section_name,
28337 SECTION_DEBUG
28338 | SECTION_LINKONCE
28339 | (early_lto_debug
28340 ? SECTION_EXCLUDE : 0),
28341 comdat_key);
28342 ASM_GENERATE_INTERNAL_LABEL (label,
28343 DEBUG_MACRO_SECTION_LABEL,
28344 ref->lineno + macinfo_label_base);
28345 ASM_OUTPUT_LABEL (asm_out_file, label);
28346 ref->code = 0;
28347 ref->info = NULL;
28348 dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4,
28349 "DWARF macro version number");
28350 if (DWARF_OFFSET_SIZE == 8)
28351 dw2_asm_output_data (1, 1, "Flags: 64-bit");
28352 else
28353 dw2_asm_output_data (1, 0, "Flags: 32-bit");
28355 break;
28356 case DW_MACINFO_define:
28357 case DW_MACINFO_undef:
28358 output_macinfo_op (ref);
28359 ref->code = 0;
28360 ref->info = NULL;
28361 break;
28362 default:
28363 gcc_unreachable ();
28366 macinfo_label_base += macinfo_label_base_adj;
28369 /* Initialize the various sections and labels for dwarf output and prefix
28370 them with PREFIX if non-NULL. Returns the generation (zero based
28371 number of times function was called). */
28373 static unsigned
28374 init_sections_and_labels (bool early_lto_debug)
28376 /* As we may get called multiple times have a generation count for
28377 labels. */
28378 static unsigned generation = 0;
28380 if (early_lto_debug)
28382 if (!dwarf_split_debug_info)
28384 debug_info_section = get_section (DEBUG_LTO_INFO_SECTION,
28385 SECTION_DEBUG | SECTION_EXCLUDE,
28386 NULL);
28387 debug_abbrev_section = get_section (DEBUG_LTO_ABBREV_SECTION,
28388 SECTION_DEBUG | SECTION_EXCLUDE,
28389 NULL);
28390 debug_macinfo_section_name
28391 = ((dwarf_strict && dwarf_version < 5)
28392 ? DEBUG_LTO_MACINFO_SECTION : DEBUG_LTO_MACRO_SECTION);
28393 debug_macinfo_section = get_section (debug_macinfo_section_name,
28394 SECTION_DEBUG
28395 | SECTION_EXCLUDE, NULL);
28396 /* For macro info we have to refer to a debug_line section, so
28397 similar to split-dwarf emit a skeleton one for early debug. */
28398 debug_skeleton_line_section
28399 = get_section (DEBUG_LTO_LINE_SECTION,
28400 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28401 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28402 DEBUG_SKELETON_LINE_SECTION_LABEL,
28403 generation);
28405 else
28407 /* ??? Which of the following do we need early? */
28408 debug_info_section = get_section (DEBUG_LTO_DWO_INFO_SECTION,
28409 SECTION_DEBUG | SECTION_EXCLUDE,
28410 NULL);
28411 debug_abbrev_section = get_section (DEBUG_LTO_DWO_ABBREV_SECTION,
28412 SECTION_DEBUG | SECTION_EXCLUDE,
28413 NULL);
28414 debug_skeleton_info_section = get_section (DEBUG_LTO_INFO_SECTION,
28415 SECTION_DEBUG
28416 | SECTION_EXCLUDE, NULL);
28417 debug_skeleton_abbrev_section
28418 = get_section (DEBUG_LTO_ABBREV_SECTION,
28419 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28420 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_abbrev_section_label,
28421 DEBUG_SKELETON_ABBREV_SECTION_LABEL,
28422 generation);
28424 /* Somewhat confusing detail: The skeleton_[abbrev|info] sections
28425 stay in the main .o, but the skeleton_line goes into the split
28426 off dwo. */
28427 debug_skeleton_line_section
28428 = get_section (DEBUG_LTO_LINE_SECTION,
28429 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28430 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28431 DEBUG_SKELETON_LINE_SECTION_LABEL,
28432 generation);
28433 debug_str_offsets_section
28434 = get_section (DEBUG_LTO_DWO_STR_OFFSETS_SECTION,
28435 SECTION_DEBUG | SECTION_EXCLUDE,
28436 NULL);
28437 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_info_section_label,
28438 DEBUG_SKELETON_INFO_SECTION_LABEL,
28439 generation);
28440 debug_str_dwo_section = get_section (DEBUG_LTO_STR_DWO_SECTION,
28441 DEBUG_STR_DWO_SECTION_FLAGS,
28442 NULL);
28443 debug_macinfo_section_name
28444 = ((dwarf_strict && dwarf_version < 5)
28445 ? DEBUG_LTO_DWO_MACINFO_SECTION : DEBUG_LTO_DWO_MACRO_SECTION);
28446 debug_macinfo_section = get_section (debug_macinfo_section_name,
28447 SECTION_DEBUG | SECTION_EXCLUDE,
28448 NULL);
28450 debug_str_section = get_section (DEBUG_LTO_STR_SECTION,
28451 DEBUG_STR_SECTION_FLAGS
28452 | SECTION_EXCLUDE, NULL);
28453 if (!dwarf_split_debug_info && !dwarf2out_as_loc_support)
28454 debug_line_str_section
28455 = get_section (DEBUG_LTO_LINE_STR_SECTION,
28456 DEBUG_STR_SECTION_FLAGS | SECTION_EXCLUDE, NULL);
28458 else
28460 if (!dwarf_split_debug_info)
28462 debug_info_section = get_section (DEBUG_INFO_SECTION,
28463 SECTION_DEBUG, NULL);
28464 debug_abbrev_section = get_section (DEBUG_ABBREV_SECTION,
28465 SECTION_DEBUG, NULL);
28466 debug_loc_section = get_section (dwarf_version >= 5
28467 ? DEBUG_LOCLISTS_SECTION
28468 : DEBUG_LOC_SECTION,
28469 SECTION_DEBUG, NULL);
28470 debug_macinfo_section_name
28471 = ((dwarf_strict && dwarf_version < 5)
28472 ? DEBUG_MACINFO_SECTION : DEBUG_MACRO_SECTION);
28473 debug_macinfo_section = get_section (debug_macinfo_section_name,
28474 SECTION_DEBUG, NULL);
28476 else
28478 debug_info_section = get_section (DEBUG_DWO_INFO_SECTION,
28479 SECTION_DEBUG | SECTION_EXCLUDE,
28480 NULL);
28481 debug_abbrev_section = get_section (DEBUG_DWO_ABBREV_SECTION,
28482 SECTION_DEBUG | SECTION_EXCLUDE,
28483 NULL);
28484 debug_addr_section = get_section (DEBUG_ADDR_SECTION,
28485 SECTION_DEBUG, NULL);
28486 debug_skeleton_info_section = get_section (DEBUG_INFO_SECTION,
28487 SECTION_DEBUG, NULL);
28488 debug_skeleton_abbrev_section = get_section (DEBUG_ABBREV_SECTION,
28489 SECTION_DEBUG, NULL);
28490 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_abbrev_section_label,
28491 DEBUG_SKELETON_ABBREV_SECTION_LABEL,
28492 generation);
28494 /* Somewhat confusing detail: The skeleton_[abbrev|info] sections
28495 stay in the main .o, but the skeleton_line goes into the
28496 split off dwo. */
28497 debug_skeleton_line_section
28498 = get_section (DEBUG_DWO_LINE_SECTION,
28499 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28500 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_line_section_label,
28501 DEBUG_SKELETON_LINE_SECTION_LABEL,
28502 generation);
28503 debug_str_offsets_section
28504 = get_section (DEBUG_DWO_STR_OFFSETS_SECTION,
28505 SECTION_DEBUG | SECTION_EXCLUDE, NULL);
28506 ASM_GENERATE_INTERNAL_LABEL (debug_skeleton_info_section_label,
28507 DEBUG_SKELETON_INFO_SECTION_LABEL,
28508 generation);
28509 debug_loc_section = get_section (dwarf_version >= 5
28510 ? DEBUG_DWO_LOCLISTS_SECTION
28511 : DEBUG_DWO_LOC_SECTION,
28512 SECTION_DEBUG | SECTION_EXCLUDE,
28513 NULL);
28514 debug_str_dwo_section = get_section (DEBUG_STR_DWO_SECTION,
28515 DEBUG_STR_DWO_SECTION_FLAGS,
28516 NULL);
28517 debug_macinfo_section_name
28518 = ((dwarf_strict && dwarf_version < 5)
28519 ? DEBUG_DWO_MACINFO_SECTION : DEBUG_DWO_MACRO_SECTION);
28520 debug_macinfo_section = get_section (debug_macinfo_section_name,
28521 SECTION_DEBUG | SECTION_EXCLUDE,
28522 NULL);
28524 debug_aranges_section = get_section (DEBUG_ARANGES_SECTION,
28525 SECTION_DEBUG, NULL);
28526 debug_line_section = get_section (DEBUG_LINE_SECTION,
28527 SECTION_DEBUG, NULL);
28528 debug_pubnames_section = get_section (DEBUG_PUBNAMES_SECTION,
28529 SECTION_DEBUG, NULL);
28530 debug_pubtypes_section = get_section (DEBUG_PUBTYPES_SECTION,
28531 SECTION_DEBUG, NULL);
28532 debug_str_section = get_section (DEBUG_STR_SECTION,
28533 DEBUG_STR_SECTION_FLAGS, NULL);
28534 if (!dwarf_split_debug_info && !output_asm_line_debug_info ())
28535 debug_line_str_section = get_section (DEBUG_LINE_STR_SECTION,
28536 DEBUG_STR_SECTION_FLAGS, NULL);
28538 debug_ranges_section = get_section (dwarf_version >= 5
28539 ? DEBUG_RNGLISTS_SECTION
28540 : DEBUG_RANGES_SECTION,
28541 SECTION_DEBUG, NULL);
28542 debug_frame_section = get_section (DEBUG_FRAME_SECTION,
28543 SECTION_DEBUG, NULL);
28546 ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
28547 DEBUG_ABBREV_SECTION_LABEL, generation);
28548 ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
28549 DEBUG_INFO_SECTION_LABEL, generation);
28550 info_section_emitted = false;
28551 ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
28552 DEBUG_LINE_SECTION_LABEL, generation);
28553 /* There are up to 4 unique ranges labels per generation.
28554 See also output_rnglists. */
28555 ASM_GENERATE_INTERNAL_LABEL (ranges_section_label,
28556 DEBUG_RANGES_SECTION_LABEL, generation * 4);
28557 if (dwarf_version >= 5 && dwarf_split_debug_info)
28558 ASM_GENERATE_INTERNAL_LABEL (ranges_base_label,
28559 DEBUG_RANGES_SECTION_LABEL,
28560 1 + generation * 4);
28561 ASM_GENERATE_INTERNAL_LABEL (debug_addr_section_label,
28562 DEBUG_ADDR_SECTION_LABEL, generation);
28563 ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label,
28564 (dwarf_strict && dwarf_version < 5)
28565 ? DEBUG_MACINFO_SECTION_LABEL
28566 : DEBUG_MACRO_SECTION_LABEL, generation);
28567 ASM_GENERATE_INTERNAL_LABEL (loc_section_label, DEBUG_LOC_SECTION_LABEL,
28568 generation);
28570 ++generation;
28571 return generation - 1;
28574 /* Set up for Dwarf output at the start of compilation. */
28576 static void
28577 dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
28579 /* Allocate the file_table. */
28580 file_table = hash_table<dwarf_file_hasher>::create_ggc (50);
28582 #ifndef DWARF2_LINENO_DEBUGGING_INFO
28583 /* Allocate the decl_die_table. */
28584 decl_die_table = hash_table<decl_die_hasher>::create_ggc (10);
28586 /* Allocate the decl_loc_table. */
28587 decl_loc_table = hash_table<decl_loc_hasher>::create_ggc (10);
28589 /* Allocate the cached_dw_loc_list_table. */
28590 cached_dw_loc_list_table = hash_table<dw_loc_list_hasher>::create_ggc (10);
28592 /* Allocate the initial hunk of the decl_scope_table. */
28593 vec_alloc (decl_scope_table, 256);
28595 /* Allocate the initial hunk of the abbrev_die_table. */
28596 vec_alloc (abbrev_die_table, 256);
28597 /* Zero-th entry is allocated, but unused. */
28598 abbrev_die_table->quick_push (NULL);
28600 /* Allocate the dwarf_proc_stack_usage_map. */
28601 dwarf_proc_stack_usage_map = new hash_map<dw_die_ref, int>;
28603 /* Allocate the pubtypes and pubnames vectors. */
28604 vec_alloc (pubname_table, 32);
28605 vec_alloc (pubtype_table, 32);
28607 vec_alloc (incomplete_types, 64);
28609 vec_alloc (used_rtx_array, 32);
28611 if (debug_info_level >= DINFO_LEVEL_VERBOSE)
28612 vec_alloc (macinfo_table, 64);
28613 #endif
28615 /* If front-ends already registered a main translation unit but we were not
28616 ready to perform the association, do this now. */
28617 if (main_translation_unit != NULL_TREE)
28618 equate_decl_number_to_die (main_translation_unit, comp_unit_die ());
28621 /* Called before compile () starts outputtting functions, variables
28622 and toplevel asms into assembly. */
28624 static void
28625 dwarf2out_assembly_start (void)
28627 if (text_section_line_info)
28628 return;
28630 #ifndef DWARF2_LINENO_DEBUGGING_INFO
28631 ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
28632 ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0);
28633 ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label,
28634 COLD_TEXT_SECTION_LABEL, 0);
28635 ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
28637 switch_to_section (text_section);
28638 ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
28639 #endif
28641 /* Make sure the line number table for .text always exists. */
28642 text_section_line_info = new_line_info_table ();
28643 text_section_line_info->end_label = text_end_label;
28645 #ifdef DWARF2_LINENO_DEBUGGING_INFO
28646 cur_line_info_table = text_section_line_info;
28647 #endif
28649 if (HAVE_GAS_CFI_SECTIONS_DIRECTIVE
28650 && dwarf2out_do_cfi_asm ()
28651 && !dwarf2out_do_eh_frame ())
28652 fprintf (asm_out_file, "\t.cfi_sections\t.debug_frame\n");
28655 /* A helper function for dwarf2out_finish called through
28656 htab_traverse. Assign a string its index. All strings must be
28657 collected into the table by the time index_string is called,
28658 because the indexing code relies on htab_traverse to traverse nodes
28659 in the same order for each run. */
28662 index_string (indirect_string_node **h, unsigned int *index)
28664 indirect_string_node *node = *h;
28666 find_string_form (node);
28667 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28669 gcc_assert (node->index == NO_INDEX_ASSIGNED);
28670 node->index = *index;
28671 *index += 1;
28673 return 1;
28676 /* A helper function for output_indirect_strings called through
28677 htab_traverse. Output the offset to a string and update the
28678 current offset. */
28681 output_index_string_offset (indirect_string_node **h, unsigned int *offset)
28683 indirect_string_node *node = *h;
28685 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28687 /* Assert that this node has been assigned an index. */
28688 gcc_assert (node->index != NO_INDEX_ASSIGNED
28689 && node->index != NOT_INDEXED);
28690 dw2_asm_output_data (DWARF_OFFSET_SIZE, *offset,
28691 "indexed string 0x%x: %s", node->index, node->str);
28692 *offset += strlen (node->str) + 1;
28694 return 1;
28697 /* A helper function for dwarf2out_finish called through
28698 htab_traverse. Output the indexed string. */
28701 output_index_string (indirect_string_node **h, unsigned int *cur_idx)
28703 struct indirect_string_node *node = *h;
28705 if (node->form == DW_FORM_GNU_str_index && node->refcount > 0)
28707 /* Assert that the strings are output in the same order as their
28708 indexes were assigned. */
28709 gcc_assert (*cur_idx == node->index);
28710 assemble_string (node->str, strlen (node->str) + 1);
28711 *cur_idx += 1;
28713 return 1;
28716 /* A helper function for dwarf2out_finish called through
28717 htab_traverse. Emit one queued .debug_str string. */
28720 output_indirect_string (indirect_string_node **h, enum dwarf_form form)
28722 struct indirect_string_node *node = *h;
28724 node->form = find_string_form (node);
28725 if (node->form == form && node->refcount > 0)
28727 ASM_OUTPUT_LABEL (asm_out_file, node->label);
28728 assemble_string (node->str, strlen (node->str) + 1);
28731 return 1;
28734 /* Output the indexed string table. */
28736 static void
28737 output_indirect_strings (void)
28739 switch_to_section (debug_str_section);
28740 if (!dwarf_split_debug_info)
28741 debug_str_hash->traverse<enum dwarf_form,
28742 output_indirect_string> (DW_FORM_strp);
28743 else
28745 unsigned int offset = 0;
28746 unsigned int cur_idx = 0;
28748 if (skeleton_debug_str_hash)
28749 skeleton_debug_str_hash->traverse<enum dwarf_form,
28750 output_indirect_string> (DW_FORM_strp);
28752 switch_to_section (debug_str_offsets_section);
28753 debug_str_hash->traverse_noresize
28754 <unsigned int *, output_index_string_offset> (&offset);
28755 switch_to_section (debug_str_dwo_section);
28756 debug_str_hash->traverse_noresize<unsigned int *, output_index_string>
28757 (&cur_idx);
28761 /* Callback for htab_traverse to assign an index to an entry in the
28762 table, and to write that entry to the .debug_addr section. */
28765 output_addr_table_entry (addr_table_entry **slot, unsigned int *cur_index)
28767 addr_table_entry *entry = *slot;
28769 if (entry->refcount == 0)
28771 gcc_assert (entry->index == NO_INDEX_ASSIGNED
28772 || entry->index == NOT_INDEXED);
28773 return 1;
28776 gcc_assert (entry->index == *cur_index);
28777 (*cur_index)++;
28779 switch (entry->kind)
28781 case ate_kind_rtx:
28782 dw2_asm_output_addr_rtx (DWARF2_ADDR_SIZE, entry->addr.rtl,
28783 "0x%x", entry->index);
28784 break;
28785 case ate_kind_rtx_dtprel:
28786 gcc_assert (targetm.asm_out.output_dwarf_dtprel);
28787 targetm.asm_out.output_dwarf_dtprel (asm_out_file,
28788 DWARF2_ADDR_SIZE,
28789 entry->addr.rtl);
28790 fputc ('\n', asm_out_file);
28791 break;
28792 case ate_kind_label:
28793 dw2_asm_output_addr (DWARF2_ADDR_SIZE, entry->addr.label,
28794 "0x%x", entry->index);
28795 break;
28796 default:
28797 gcc_unreachable ();
28799 return 1;
28802 /* Produce the .debug_addr section. */
28804 static void
28805 output_addr_table (void)
28807 unsigned int index = 0;
28808 if (addr_index_table == NULL || addr_index_table->size () == 0)
28809 return;
28811 switch_to_section (debug_addr_section);
28812 addr_index_table
28813 ->traverse_noresize<unsigned int *, output_addr_table_entry> (&index);
28816 #if ENABLE_ASSERT_CHECKING
28817 /* Verify that all marks are clear. */
28819 static void
28820 verify_marks_clear (dw_die_ref die)
28822 dw_die_ref c;
28824 gcc_assert (! die->die_mark);
28825 FOR_EACH_CHILD (die, c, verify_marks_clear (c));
28827 #endif /* ENABLE_ASSERT_CHECKING */
28829 /* Clear the marks for a die and its children.
28830 Be cool if the mark isn't set. */
28832 static void
28833 prune_unmark_dies (dw_die_ref die)
28835 dw_die_ref c;
28837 if (die->die_mark)
28838 die->die_mark = 0;
28839 FOR_EACH_CHILD (die, c, prune_unmark_dies (c));
28842 /* Given LOC that is referenced by a DIE we're marking as used, find all
28843 referenced DWARF procedures it references and mark them as used. */
28845 static void
28846 prune_unused_types_walk_loc_descr (dw_loc_descr_ref loc)
28848 for (; loc != NULL; loc = loc->dw_loc_next)
28849 switch (loc->dw_loc_opc)
28851 case DW_OP_implicit_pointer:
28852 case DW_OP_convert:
28853 case DW_OP_reinterpret:
28854 case DW_OP_GNU_implicit_pointer:
28855 case DW_OP_GNU_convert:
28856 case DW_OP_GNU_reinterpret:
28857 if (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref)
28858 prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
28859 break;
28860 case DW_OP_GNU_variable_value:
28861 if (loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
28863 dw_die_ref ref
28864 = lookup_decl_die (loc->dw_loc_oprnd1.v.val_decl_ref);
28865 if (ref == NULL)
28866 break;
28867 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
28868 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
28869 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
28871 /* FALLTHRU */
28872 case DW_OP_call2:
28873 case DW_OP_call4:
28874 case DW_OP_call_ref:
28875 case DW_OP_const_type:
28876 case DW_OP_GNU_const_type:
28877 case DW_OP_GNU_parameter_ref:
28878 gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref);
28879 prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
28880 break;
28881 case DW_OP_regval_type:
28882 case DW_OP_deref_type:
28883 case DW_OP_GNU_regval_type:
28884 case DW_OP_GNU_deref_type:
28885 gcc_assert (loc->dw_loc_oprnd2.val_class == dw_val_class_die_ref);
28886 prune_unused_types_mark (loc->dw_loc_oprnd2.v.val_die_ref.die, 1);
28887 break;
28888 case DW_OP_entry_value:
28889 case DW_OP_GNU_entry_value:
28890 gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_loc);
28891 prune_unused_types_walk_loc_descr (loc->dw_loc_oprnd1.v.val_loc);
28892 break;
28893 default:
28894 break;
28898 /* Given DIE that we're marking as used, find any other dies
28899 it references as attributes and mark them as used. */
28901 static void
28902 prune_unused_types_walk_attribs (dw_die_ref die)
28904 dw_attr_node *a;
28905 unsigned ix;
28907 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
28909 switch (AT_class (a))
28911 /* Make sure DWARF procedures referenced by location descriptions will
28912 get emitted. */
28913 case dw_val_class_loc:
28914 prune_unused_types_walk_loc_descr (AT_loc (a));
28915 break;
28916 case dw_val_class_loc_list:
28917 for (dw_loc_list_ref list = AT_loc_list (a);
28918 list != NULL;
28919 list = list->dw_loc_next)
28920 prune_unused_types_walk_loc_descr (list->expr);
28921 break;
28923 case dw_val_class_view_list:
28924 /* This points to a loc_list in another attribute, so it's
28925 already covered. */
28926 break;
28928 case dw_val_class_die_ref:
28929 /* A reference to another DIE.
28930 Make sure that it will get emitted.
28931 If it was broken out into a comdat group, don't follow it. */
28932 if (! AT_ref (a)->comdat_type_p
28933 || a->dw_attr == DW_AT_specification)
28934 prune_unused_types_mark (a->dw_attr_val.v.val_die_ref.die, 1);
28935 break;
28937 case dw_val_class_str:
28938 /* Set the string's refcount to 0 so that prune_unused_types_mark
28939 accounts properly for it. */
28940 a->dw_attr_val.v.val_str->refcount = 0;
28941 break;
28943 default:
28944 break;
28949 /* Mark the generic parameters and arguments children DIEs of DIE. */
28951 static void
28952 prune_unused_types_mark_generic_parms_dies (dw_die_ref die)
28954 dw_die_ref c;
28956 if (die == NULL || die->die_child == NULL)
28957 return;
28958 c = die->die_child;
28961 if (is_template_parameter (c))
28962 prune_unused_types_mark (c, 1);
28963 c = c->die_sib;
28964 } while (c && c != die->die_child);
28967 /* Mark DIE as being used. If DOKIDS is true, then walk down
28968 to DIE's children. */
28970 static void
28971 prune_unused_types_mark (dw_die_ref die, int dokids)
28973 dw_die_ref c;
28975 if (die->die_mark == 0)
28977 /* We haven't done this node yet. Mark it as used. */
28978 die->die_mark = 1;
28979 /* If this is the DIE of a generic type instantiation,
28980 mark the children DIEs that describe its generic parms and
28981 args. */
28982 prune_unused_types_mark_generic_parms_dies (die);
28984 /* We also have to mark its parents as used.
28985 (But we don't want to mark our parent's kids due to this,
28986 unless it is a class.) */
28987 if (die->die_parent)
28988 prune_unused_types_mark (die->die_parent,
28989 class_scope_p (die->die_parent));
28991 /* Mark any referenced nodes. */
28992 prune_unused_types_walk_attribs (die);
28994 /* If this node is a specification,
28995 also mark the definition, if it exists. */
28996 if (get_AT_flag (die, DW_AT_declaration) && die->die_definition)
28997 prune_unused_types_mark (die->die_definition, 1);
29000 if (dokids && die->die_mark != 2)
29002 /* We need to walk the children, but haven't done so yet.
29003 Remember that we've walked the kids. */
29004 die->die_mark = 2;
29006 /* If this is an array type, we need to make sure our
29007 kids get marked, even if they're types. If we're
29008 breaking out types into comdat sections, do this
29009 for all type definitions. */
29010 if (die->die_tag == DW_TAG_array_type
29011 || (use_debug_types
29012 && is_type_die (die) && ! is_declaration_die (die)))
29013 FOR_EACH_CHILD (die, c, prune_unused_types_mark (c, 1));
29014 else
29015 FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
29019 /* For local classes, look if any static member functions were emitted
29020 and if so, mark them. */
29022 static void
29023 prune_unused_types_walk_local_classes (dw_die_ref die)
29025 dw_die_ref c;
29027 if (die->die_mark == 2)
29028 return;
29030 switch (die->die_tag)
29032 case DW_TAG_structure_type:
29033 case DW_TAG_union_type:
29034 case DW_TAG_class_type:
29035 break;
29037 case DW_TAG_subprogram:
29038 if (!get_AT_flag (die, DW_AT_declaration)
29039 || die->die_definition != NULL)
29040 prune_unused_types_mark (die, 1);
29041 return;
29043 default:
29044 return;
29047 /* Mark children. */
29048 FOR_EACH_CHILD (die, c, prune_unused_types_walk_local_classes (c));
29051 /* Walk the tree DIE and mark types that we actually use. */
29053 static void
29054 prune_unused_types_walk (dw_die_ref die)
29056 dw_die_ref c;
29058 /* Don't do anything if this node is already marked and
29059 children have been marked as well. */
29060 if (die->die_mark == 2)
29061 return;
29063 switch (die->die_tag)
29065 case DW_TAG_structure_type:
29066 case DW_TAG_union_type:
29067 case DW_TAG_class_type:
29068 if (die->die_perennial_p)
29069 break;
29071 for (c = die->die_parent; c; c = c->die_parent)
29072 if (c->die_tag == DW_TAG_subprogram)
29073 break;
29075 /* Finding used static member functions inside of classes
29076 is needed just for local classes, because for other classes
29077 static member function DIEs with DW_AT_specification
29078 are emitted outside of the DW_TAG_*_type. If we ever change
29079 it, we'd need to call this even for non-local classes. */
29080 if (c)
29081 prune_unused_types_walk_local_classes (die);
29083 /* It's a type node --- don't mark it. */
29084 return;
29086 case DW_TAG_const_type:
29087 case DW_TAG_packed_type:
29088 case DW_TAG_pointer_type:
29089 case DW_TAG_reference_type:
29090 case DW_TAG_rvalue_reference_type:
29091 case DW_TAG_volatile_type:
29092 case DW_TAG_typedef:
29093 case DW_TAG_array_type:
29094 case DW_TAG_interface_type:
29095 case DW_TAG_friend:
29096 case DW_TAG_enumeration_type:
29097 case DW_TAG_subroutine_type:
29098 case DW_TAG_string_type:
29099 case DW_TAG_set_type:
29100 case DW_TAG_subrange_type:
29101 case DW_TAG_ptr_to_member_type:
29102 case DW_TAG_file_type:
29103 /* Type nodes are useful only when other DIEs reference them --- don't
29104 mark them. */
29105 /* FALLTHROUGH */
29107 case DW_TAG_dwarf_procedure:
29108 /* Likewise for DWARF procedures. */
29110 if (die->die_perennial_p)
29111 break;
29113 return;
29115 default:
29116 /* Mark everything else. */
29117 break;
29120 if (die->die_mark == 0)
29122 die->die_mark = 1;
29124 /* Now, mark any dies referenced from here. */
29125 prune_unused_types_walk_attribs (die);
29128 die->die_mark = 2;
29130 /* Mark children. */
29131 FOR_EACH_CHILD (die, c, prune_unused_types_walk (c));
29134 /* Increment the string counts on strings referred to from DIE's
29135 attributes. */
29137 static void
29138 prune_unused_types_update_strings (dw_die_ref die)
29140 dw_attr_node *a;
29141 unsigned ix;
29143 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
29144 if (AT_class (a) == dw_val_class_str)
29146 struct indirect_string_node *s = a->dw_attr_val.v.val_str;
29147 s->refcount++;
29148 /* Avoid unnecessarily putting strings that are used less than
29149 twice in the hash table. */
29150 if (s->refcount
29151 == ((DEBUG_STR_SECTION_FLAGS & SECTION_MERGE) ? 1 : 2))
29153 indirect_string_node **slot
29154 = debug_str_hash->find_slot_with_hash (s->str,
29155 htab_hash_string (s->str),
29156 INSERT);
29157 gcc_assert (*slot == NULL);
29158 *slot = s;
29163 /* Mark DIE and its children as removed. */
29165 static void
29166 mark_removed (dw_die_ref die)
29168 dw_die_ref c;
29169 die->removed = true;
29170 FOR_EACH_CHILD (die, c, mark_removed (c));
29173 /* Remove from the tree DIE any dies that aren't marked. */
29175 static void
29176 prune_unused_types_prune (dw_die_ref die)
29178 dw_die_ref c;
29180 gcc_assert (die->die_mark);
29181 prune_unused_types_update_strings (die);
29183 if (! die->die_child)
29184 return;
29186 c = die->die_child;
29187 do {
29188 dw_die_ref prev = c, next;
29189 for (c = c->die_sib; ! c->die_mark; c = next)
29190 if (c == die->die_child)
29192 /* No marked children between 'prev' and the end of the list. */
29193 if (prev == c)
29194 /* No marked children at all. */
29195 die->die_child = NULL;
29196 else
29198 prev->die_sib = c->die_sib;
29199 die->die_child = prev;
29201 c->die_sib = NULL;
29202 mark_removed (c);
29203 return;
29205 else
29207 next = c->die_sib;
29208 c->die_sib = NULL;
29209 mark_removed (c);
29212 if (c != prev->die_sib)
29213 prev->die_sib = c;
29214 prune_unused_types_prune (c);
29215 } while (c != die->die_child);
29218 /* Remove dies representing declarations that we never use. */
29220 static void
29221 prune_unused_types (void)
29223 unsigned int i;
29224 limbo_die_node *node;
29225 comdat_type_node *ctnode;
29226 pubname_entry *pub;
29227 dw_die_ref base_type;
29229 #if ENABLE_ASSERT_CHECKING
29230 /* All the marks should already be clear. */
29231 verify_marks_clear (comp_unit_die ());
29232 for (node = limbo_die_list; node; node = node->next)
29233 verify_marks_clear (node->die);
29234 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29235 verify_marks_clear (ctnode->root_die);
29236 #endif /* ENABLE_ASSERT_CHECKING */
29238 /* Mark types that are used in global variables. */
29239 premark_types_used_by_global_vars ();
29241 /* Set the mark on nodes that are actually used. */
29242 prune_unused_types_walk (comp_unit_die ());
29243 for (node = limbo_die_list; node; node = node->next)
29244 prune_unused_types_walk (node->die);
29245 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29247 prune_unused_types_walk (ctnode->root_die);
29248 prune_unused_types_mark (ctnode->type_die, 1);
29251 /* Also set the mark on nodes referenced from the pubname_table. Enumerators
29252 are unusual in that they are pubnames that are the children of pubtypes.
29253 They should only be marked via their parent DW_TAG_enumeration_type die,
29254 not as roots in themselves. */
29255 FOR_EACH_VEC_ELT (*pubname_table, i, pub)
29256 if (pub->die->die_tag != DW_TAG_enumerator)
29257 prune_unused_types_mark (pub->die, 1);
29258 for (i = 0; base_types.iterate (i, &base_type); i++)
29259 prune_unused_types_mark (base_type, 1);
29261 /* For -fvar-tracking-assignments, also set the mark on nodes that could be
29262 referenced by DW_TAG_call_site DW_AT_call_origin (i.e. direct call
29263 callees). */
29264 cgraph_node *cnode;
29265 FOR_EACH_FUNCTION (cnode)
29266 if (cnode->referred_to_p (false))
29268 dw_die_ref die = lookup_decl_die (cnode->decl);
29269 if (die == NULL || die->die_mark)
29270 continue;
29271 for (cgraph_edge *e = cnode->callers; e; e = e->next_caller)
29272 if (e->caller != cnode
29273 && opt_for_fn (e->caller->decl, flag_var_tracking_assignments))
29275 prune_unused_types_mark (die, 1);
29276 break;
29280 if (debug_str_hash)
29281 debug_str_hash->empty ();
29282 if (skeleton_debug_str_hash)
29283 skeleton_debug_str_hash->empty ();
29284 prune_unused_types_prune (comp_unit_die ());
29285 for (limbo_die_node **pnode = &limbo_die_list; *pnode; )
29287 node = *pnode;
29288 if (!node->die->die_mark)
29289 *pnode = node->next;
29290 else
29292 prune_unused_types_prune (node->die);
29293 pnode = &node->next;
29296 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29297 prune_unused_types_prune (ctnode->root_die);
29299 /* Leave the marks clear. */
29300 prune_unmark_dies (comp_unit_die ());
29301 for (node = limbo_die_list; node; node = node->next)
29302 prune_unmark_dies (node->die);
29303 for (ctnode = comdat_type_list; ctnode; ctnode = ctnode->next)
29304 prune_unmark_dies (ctnode->root_die);
29307 /* Helpers to manipulate hash table of comdat type units. */
29309 struct comdat_type_hasher : nofree_ptr_hash <comdat_type_node>
29311 static inline hashval_t hash (const comdat_type_node *);
29312 static inline bool equal (const comdat_type_node *, const comdat_type_node *);
29315 inline hashval_t
29316 comdat_type_hasher::hash (const comdat_type_node *type_node)
29318 hashval_t h;
29319 memcpy (&h, type_node->signature, sizeof (h));
29320 return h;
29323 inline bool
29324 comdat_type_hasher::equal (const comdat_type_node *type_node_1,
29325 const comdat_type_node *type_node_2)
29327 return (! memcmp (type_node_1->signature, type_node_2->signature,
29328 DWARF_TYPE_SIGNATURE_SIZE));
29331 /* Move a DW_AT_{,MIPS_}linkage_name attribute just added to dw_die_ref
29332 to the location it would have been added, should we know its
29333 DECL_ASSEMBLER_NAME when we added other attributes. This will
29334 probably improve compactness of debug info, removing equivalent
29335 abbrevs, and hide any differences caused by deferring the
29336 computation of the assembler name, triggered by e.g. PCH. */
29338 static inline void
29339 move_linkage_attr (dw_die_ref die)
29341 unsigned ix = vec_safe_length (die->die_attr);
29342 dw_attr_node linkage = (*die->die_attr)[ix - 1];
29344 gcc_assert (linkage.dw_attr == DW_AT_linkage_name
29345 || linkage.dw_attr == DW_AT_MIPS_linkage_name);
29347 while (--ix > 0)
29349 dw_attr_node *prev = &(*die->die_attr)[ix - 1];
29351 if (prev->dw_attr == DW_AT_decl_line
29352 || prev->dw_attr == DW_AT_decl_column
29353 || prev->dw_attr == DW_AT_name)
29354 break;
29357 if (ix != vec_safe_length (die->die_attr) - 1)
29359 die->die_attr->pop ();
29360 die->die_attr->quick_insert (ix, linkage);
29364 /* Helper function for resolve_addr, mark DW_TAG_base_type nodes
29365 referenced from typed stack ops and count how often they are used. */
29367 static void
29368 mark_base_types (dw_loc_descr_ref loc)
29370 dw_die_ref base_type = NULL;
29372 for (; loc; loc = loc->dw_loc_next)
29374 switch (loc->dw_loc_opc)
29376 case DW_OP_regval_type:
29377 case DW_OP_deref_type:
29378 case DW_OP_GNU_regval_type:
29379 case DW_OP_GNU_deref_type:
29380 base_type = loc->dw_loc_oprnd2.v.val_die_ref.die;
29381 break;
29382 case DW_OP_convert:
29383 case DW_OP_reinterpret:
29384 case DW_OP_GNU_convert:
29385 case DW_OP_GNU_reinterpret:
29386 if (loc->dw_loc_oprnd1.val_class == dw_val_class_unsigned_const)
29387 continue;
29388 /* FALLTHRU */
29389 case DW_OP_const_type:
29390 case DW_OP_GNU_const_type:
29391 base_type = loc->dw_loc_oprnd1.v.val_die_ref.die;
29392 break;
29393 case DW_OP_entry_value:
29394 case DW_OP_GNU_entry_value:
29395 mark_base_types (loc->dw_loc_oprnd1.v.val_loc);
29396 continue;
29397 default:
29398 continue;
29400 gcc_assert (base_type->die_parent == comp_unit_die ());
29401 if (base_type->die_mark)
29402 base_type->die_mark++;
29403 else
29405 base_types.safe_push (base_type);
29406 base_type->die_mark = 1;
29411 /* Comparison function for sorting marked base types. */
29413 static int
29414 base_type_cmp (const void *x, const void *y)
29416 dw_die_ref dx = *(const dw_die_ref *) x;
29417 dw_die_ref dy = *(const dw_die_ref *) y;
29418 unsigned int byte_size1, byte_size2;
29419 unsigned int encoding1, encoding2;
29420 unsigned int align1, align2;
29421 if (dx->die_mark > dy->die_mark)
29422 return -1;
29423 if (dx->die_mark < dy->die_mark)
29424 return 1;
29425 byte_size1 = get_AT_unsigned (dx, DW_AT_byte_size);
29426 byte_size2 = get_AT_unsigned (dy, DW_AT_byte_size);
29427 if (byte_size1 < byte_size2)
29428 return 1;
29429 if (byte_size1 > byte_size2)
29430 return -1;
29431 encoding1 = get_AT_unsigned (dx, DW_AT_encoding);
29432 encoding2 = get_AT_unsigned (dy, DW_AT_encoding);
29433 if (encoding1 < encoding2)
29434 return 1;
29435 if (encoding1 > encoding2)
29436 return -1;
29437 align1 = get_AT_unsigned (dx, DW_AT_alignment);
29438 align2 = get_AT_unsigned (dy, DW_AT_alignment);
29439 if (align1 < align2)
29440 return 1;
29441 if (align1 > align2)
29442 return -1;
29443 return 0;
29446 /* Move base types marked by mark_base_types as early as possible
29447 in the CU, sorted by decreasing usage count both to make the
29448 uleb128 references as small as possible and to make sure they
29449 will have die_offset already computed by calc_die_sizes when
29450 sizes of typed stack loc ops is computed. */
29452 static void
29453 move_marked_base_types (void)
29455 unsigned int i;
29456 dw_die_ref base_type, die, c;
29458 if (base_types.is_empty ())
29459 return;
29461 /* Sort by decreasing usage count, they will be added again in that
29462 order later on. */
29463 base_types.qsort (base_type_cmp);
29464 die = comp_unit_die ();
29465 c = die->die_child;
29468 dw_die_ref prev = c;
29469 c = c->die_sib;
29470 while (c->die_mark)
29472 remove_child_with_prev (c, prev);
29473 /* As base types got marked, there must be at least
29474 one node other than DW_TAG_base_type. */
29475 gcc_assert (die->die_child != NULL);
29476 c = prev->die_sib;
29479 while (c != die->die_child);
29480 gcc_assert (die->die_child);
29481 c = die->die_child;
29482 for (i = 0; base_types.iterate (i, &base_type); i++)
29484 base_type->die_mark = 0;
29485 base_type->die_sib = c->die_sib;
29486 c->die_sib = base_type;
29487 c = base_type;
29491 /* Helper function for resolve_addr, attempt to resolve
29492 one CONST_STRING, return true if successful. Similarly verify that
29493 SYMBOL_REFs refer to variables emitted in the current CU. */
29495 static bool
29496 resolve_one_addr (rtx *addr)
29498 rtx rtl = *addr;
29500 if (GET_CODE (rtl) == CONST_STRING)
29502 size_t len = strlen (XSTR (rtl, 0)) + 1;
29503 tree t = build_string (len, XSTR (rtl, 0));
29504 tree tlen = size_int (len - 1);
29505 TREE_TYPE (t)
29506 = build_array_type (char_type_node, build_index_type (tlen));
29507 rtl = lookup_constant_def (t);
29508 if (!rtl || !MEM_P (rtl))
29509 return false;
29510 rtl = XEXP (rtl, 0);
29511 if (GET_CODE (rtl) == SYMBOL_REF
29512 && SYMBOL_REF_DECL (rtl)
29513 && !TREE_ASM_WRITTEN (SYMBOL_REF_DECL (rtl)))
29514 return false;
29515 vec_safe_push (used_rtx_array, rtl);
29516 *addr = rtl;
29517 return true;
29520 if (GET_CODE (rtl) == SYMBOL_REF
29521 && SYMBOL_REF_DECL (rtl))
29523 if (TREE_CONSTANT_POOL_ADDRESS_P (rtl))
29525 if (!TREE_ASM_WRITTEN (DECL_INITIAL (SYMBOL_REF_DECL (rtl))))
29526 return false;
29528 else if (!TREE_ASM_WRITTEN (SYMBOL_REF_DECL (rtl)))
29529 return false;
29532 if (GET_CODE (rtl) == CONST)
29534 subrtx_ptr_iterator::array_type array;
29535 FOR_EACH_SUBRTX_PTR (iter, array, &XEXP (rtl, 0), ALL)
29536 if (!resolve_one_addr (*iter))
29537 return false;
29540 return true;
29543 /* For STRING_CST, return SYMBOL_REF of its constant pool entry,
29544 if possible, and create DW_TAG_dwarf_procedure that can be referenced
29545 from DW_OP_implicit_pointer if the string hasn't been seen yet. */
29547 static rtx
29548 string_cst_pool_decl (tree t)
29550 rtx rtl = output_constant_def (t, 1);
29551 unsigned char *array;
29552 dw_loc_descr_ref l;
29553 tree decl;
29554 size_t len;
29555 dw_die_ref ref;
29557 if (!rtl || !MEM_P (rtl))
29558 return NULL_RTX;
29559 rtl = XEXP (rtl, 0);
29560 if (GET_CODE (rtl) != SYMBOL_REF
29561 || SYMBOL_REF_DECL (rtl) == NULL_TREE)
29562 return NULL_RTX;
29564 decl = SYMBOL_REF_DECL (rtl);
29565 if (!lookup_decl_die (decl))
29567 len = TREE_STRING_LENGTH (t);
29568 vec_safe_push (used_rtx_array, rtl);
29569 ref = new_die (DW_TAG_dwarf_procedure, comp_unit_die (), decl);
29570 array = ggc_vec_alloc<unsigned char> (len);
29571 memcpy (array, TREE_STRING_POINTER (t), len);
29572 l = new_loc_descr (DW_OP_implicit_value, len, 0);
29573 l->dw_loc_oprnd2.val_class = dw_val_class_vec;
29574 l->dw_loc_oprnd2.v.val_vec.length = len;
29575 l->dw_loc_oprnd2.v.val_vec.elt_size = 1;
29576 l->dw_loc_oprnd2.v.val_vec.array = array;
29577 add_AT_loc (ref, DW_AT_location, l);
29578 equate_decl_number_to_die (decl, ref);
29580 return rtl;
29583 /* Helper function of resolve_addr_in_expr. LOC is
29584 a DW_OP_addr followed by DW_OP_stack_value, either at the start
29585 of exprloc or after DW_OP_{,bit_}piece, and val_addr can't be
29586 resolved. Replace it (both DW_OP_addr and DW_OP_stack_value)
29587 with DW_OP_implicit_pointer if possible
29588 and return true, if unsuccessful, return false. */
29590 static bool
29591 optimize_one_addr_into_implicit_ptr (dw_loc_descr_ref loc)
29593 rtx rtl = loc->dw_loc_oprnd1.v.val_addr;
29594 HOST_WIDE_INT offset = 0;
29595 dw_die_ref ref = NULL;
29596 tree decl;
29598 if (GET_CODE (rtl) == CONST
29599 && GET_CODE (XEXP (rtl, 0)) == PLUS
29600 && CONST_INT_P (XEXP (XEXP (rtl, 0), 1)))
29602 offset = INTVAL (XEXP (XEXP (rtl, 0), 1));
29603 rtl = XEXP (XEXP (rtl, 0), 0);
29605 if (GET_CODE (rtl) == CONST_STRING)
29607 size_t len = strlen (XSTR (rtl, 0)) + 1;
29608 tree t = build_string (len, XSTR (rtl, 0));
29609 tree tlen = size_int (len - 1);
29611 TREE_TYPE (t)
29612 = build_array_type (char_type_node, build_index_type (tlen));
29613 rtl = string_cst_pool_decl (t);
29614 if (!rtl)
29615 return false;
29617 if (GET_CODE (rtl) == SYMBOL_REF && SYMBOL_REF_DECL (rtl))
29619 decl = SYMBOL_REF_DECL (rtl);
29620 if (VAR_P (decl) && !DECL_EXTERNAL (decl))
29622 ref = lookup_decl_die (decl);
29623 if (ref && (get_AT (ref, DW_AT_location)
29624 || get_AT (ref, DW_AT_const_value)))
29626 loc->dw_loc_opc = dwarf_OP (DW_OP_implicit_pointer);
29627 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29628 loc->dw_loc_oprnd1.val_entry = NULL;
29629 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
29630 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
29631 loc->dw_loc_next = loc->dw_loc_next->dw_loc_next;
29632 loc->dw_loc_oprnd2.v.val_int = offset;
29633 return true;
29637 return false;
29640 /* Helper function for resolve_addr, handle one location
29641 expression, return false if at least one CONST_STRING or SYMBOL_REF in
29642 the location list couldn't be resolved. */
29644 static bool
29645 resolve_addr_in_expr (dw_attr_node *a, dw_loc_descr_ref loc)
29647 dw_loc_descr_ref keep = NULL;
29648 for (dw_loc_descr_ref prev = NULL; loc; prev = loc, loc = loc->dw_loc_next)
29649 switch (loc->dw_loc_opc)
29651 case DW_OP_addr:
29652 if (!resolve_one_addr (&loc->dw_loc_oprnd1.v.val_addr))
29654 if ((prev == NULL
29655 || prev->dw_loc_opc == DW_OP_piece
29656 || prev->dw_loc_opc == DW_OP_bit_piece)
29657 && loc->dw_loc_next
29658 && loc->dw_loc_next->dw_loc_opc == DW_OP_stack_value
29659 && (!dwarf_strict || dwarf_version >= 5)
29660 && optimize_one_addr_into_implicit_ptr (loc))
29661 break;
29662 return false;
29664 break;
29665 case DW_OP_GNU_addr_index:
29666 case DW_OP_GNU_const_index:
29667 if (loc->dw_loc_opc == DW_OP_GNU_addr_index
29668 || (loc->dw_loc_opc == DW_OP_GNU_const_index && loc->dtprel))
29670 rtx rtl = loc->dw_loc_oprnd1.val_entry->addr.rtl;
29671 if (!resolve_one_addr (&rtl))
29672 return false;
29673 remove_addr_table_entry (loc->dw_loc_oprnd1.val_entry);
29674 loc->dw_loc_oprnd1.val_entry
29675 = add_addr_table_entry (rtl, ate_kind_rtx);
29677 break;
29678 case DW_OP_const4u:
29679 case DW_OP_const8u:
29680 if (loc->dtprel
29681 && !resolve_one_addr (&loc->dw_loc_oprnd1.v.val_addr))
29682 return false;
29683 break;
29684 case DW_OP_plus_uconst:
29685 if (size_of_loc_descr (loc)
29686 > size_of_int_loc_descriptor (loc->dw_loc_oprnd1.v.val_unsigned)
29688 && loc->dw_loc_oprnd1.v.val_unsigned > 0)
29690 dw_loc_descr_ref repl
29691 = int_loc_descriptor (loc->dw_loc_oprnd1.v.val_unsigned);
29692 add_loc_descr (&repl, new_loc_descr (DW_OP_plus, 0, 0));
29693 add_loc_descr (&repl, loc->dw_loc_next);
29694 *loc = *repl;
29696 break;
29697 case DW_OP_implicit_value:
29698 if (loc->dw_loc_oprnd2.val_class == dw_val_class_addr
29699 && !resolve_one_addr (&loc->dw_loc_oprnd2.v.val_addr))
29700 return false;
29701 break;
29702 case DW_OP_implicit_pointer:
29703 case DW_OP_GNU_implicit_pointer:
29704 case DW_OP_GNU_parameter_ref:
29705 case DW_OP_GNU_variable_value:
29706 if (loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
29708 dw_die_ref ref
29709 = lookup_decl_die (loc->dw_loc_oprnd1.v.val_decl_ref);
29710 if (ref == NULL)
29711 return false;
29712 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29713 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
29714 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
29716 if (loc->dw_loc_opc == DW_OP_GNU_variable_value)
29718 if (prev == NULL
29719 && loc->dw_loc_next == NULL
29720 && AT_class (a) == dw_val_class_loc)
29721 switch (a->dw_attr)
29723 /* Following attributes allow both exprloc and reference,
29724 so if the whole expression is DW_OP_GNU_variable_value
29725 alone we could transform it into reference. */
29726 case DW_AT_byte_size:
29727 case DW_AT_bit_size:
29728 case DW_AT_lower_bound:
29729 case DW_AT_upper_bound:
29730 case DW_AT_bit_stride:
29731 case DW_AT_count:
29732 case DW_AT_allocated:
29733 case DW_AT_associated:
29734 case DW_AT_byte_stride:
29735 a->dw_attr_val.val_class = dw_val_class_die_ref;
29736 a->dw_attr_val.val_entry = NULL;
29737 a->dw_attr_val.v.val_die_ref.die
29738 = loc->dw_loc_oprnd1.v.val_die_ref.die;
29739 a->dw_attr_val.v.val_die_ref.external = 0;
29740 return true;
29741 default:
29742 break;
29744 if (dwarf_strict)
29745 return false;
29747 break;
29748 case DW_OP_const_type:
29749 case DW_OP_regval_type:
29750 case DW_OP_deref_type:
29751 case DW_OP_convert:
29752 case DW_OP_reinterpret:
29753 case DW_OP_GNU_const_type:
29754 case DW_OP_GNU_regval_type:
29755 case DW_OP_GNU_deref_type:
29756 case DW_OP_GNU_convert:
29757 case DW_OP_GNU_reinterpret:
29758 while (loc->dw_loc_next
29759 && (loc->dw_loc_next->dw_loc_opc == DW_OP_convert
29760 || loc->dw_loc_next->dw_loc_opc == DW_OP_GNU_convert))
29762 dw_die_ref base1, base2;
29763 unsigned enc1, enc2, size1, size2;
29764 if (loc->dw_loc_opc == DW_OP_regval_type
29765 || loc->dw_loc_opc == DW_OP_deref_type
29766 || loc->dw_loc_opc == DW_OP_GNU_regval_type
29767 || loc->dw_loc_opc == DW_OP_GNU_deref_type)
29768 base1 = loc->dw_loc_oprnd2.v.val_die_ref.die;
29769 else if (loc->dw_loc_oprnd1.val_class
29770 == dw_val_class_unsigned_const)
29771 break;
29772 else
29773 base1 = loc->dw_loc_oprnd1.v.val_die_ref.die;
29774 if (loc->dw_loc_next->dw_loc_oprnd1.val_class
29775 == dw_val_class_unsigned_const)
29776 break;
29777 base2 = loc->dw_loc_next->dw_loc_oprnd1.v.val_die_ref.die;
29778 gcc_assert (base1->die_tag == DW_TAG_base_type
29779 && base2->die_tag == DW_TAG_base_type);
29780 enc1 = get_AT_unsigned (base1, DW_AT_encoding);
29781 enc2 = get_AT_unsigned (base2, DW_AT_encoding);
29782 size1 = get_AT_unsigned (base1, DW_AT_byte_size);
29783 size2 = get_AT_unsigned (base2, DW_AT_byte_size);
29784 if (size1 == size2
29785 && (((enc1 == DW_ATE_unsigned || enc1 == DW_ATE_signed)
29786 && (enc2 == DW_ATE_unsigned || enc2 == DW_ATE_signed)
29787 && loc != keep)
29788 || enc1 == enc2))
29790 /* Optimize away next DW_OP_convert after
29791 adjusting LOC's base type die reference. */
29792 if (loc->dw_loc_opc == DW_OP_regval_type
29793 || loc->dw_loc_opc == DW_OP_deref_type
29794 || loc->dw_loc_opc == DW_OP_GNU_regval_type
29795 || loc->dw_loc_opc == DW_OP_GNU_deref_type)
29796 loc->dw_loc_oprnd2.v.val_die_ref.die = base2;
29797 else
29798 loc->dw_loc_oprnd1.v.val_die_ref.die = base2;
29799 loc->dw_loc_next = loc->dw_loc_next->dw_loc_next;
29800 continue;
29802 /* Don't change integer DW_OP_convert after e.g. floating
29803 point typed stack entry. */
29804 else if (enc1 != DW_ATE_unsigned && enc1 != DW_ATE_signed)
29805 keep = loc->dw_loc_next;
29806 break;
29808 break;
29809 default:
29810 break;
29812 return true;
29815 /* Helper function of resolve_addr. DIE had DW_AT_location of
29816 DW_OP_addr alone, which referred to DECL in DW_OP_addr's operand
29817 and DW_OP_addr couldn't be resolved. resolve_addr has already
29818 removed the DW_AT_location attribute. This function attempts to
29819 add a new DW_AT_location attribute with DW_OP_implicit_pointer
29820 to it or DW_AT_const_value attribute, if possible. */
29822 static void
29823 optimize_location_into_implicit_ptr (dw_die_ref die, tree decl)
29825 if (!VAR_P (decl)
29826 || lookup_decl_die (decl) != die
29827 || DECL_EXTERNAL (decl)
29828 || !TREE_STATIC (decl)
29829 || DECL_INITIAL (decl) == NULL_TREE
29830 || DECL_P (DECL_INITIAL (decl))
29831 || get_AT (die, DW_AT_const_value))
29832 return;
29834 tree init = DECL_INITIAL (decl);
29835 HOST_WIDE_INT offset = 0;
29836 /* For variables that have been optimized away and thus
29837 don't have a memory location, see if we can emit
29838 DW_AT_const_value instead. */
29839 if (tree_add_const_value_attribute (die, init))
29840 return;
29841 if (dwarf_strict && dwarf_version < 5)
29842 return;
29843 /* If init is ADDR_EXPR or POINTER_PLUS_EXPR of ADDR_EXPR,
29844 and ADDR_EXPR refers to a decl that has DW_AT_location or
29845 DW_AT_const_value (but isn't addressable, otherwise
29846 resolving the original DW_OP_addr wouldn't fail), see if
29847 we can add DW_OP_implicit_pointer. */
29848 STRIP_NOPS (init);
29849 if (TREE_CODE (init) == POINTER_PLUS_EXPR
29850 && tree_fits_shwi_p (TREE_OPERAND (init, 1)))
29852 offset = tree_to_shwi (TREE_OPERAND (init, 1));
29853 init = TREE_OPERAND (init, 0);
29854 STRIP_NOPS (init);
29856 if (TREE_CODE (init) != ADDR_EXPR)
29857 return;
29858 if ((TREE_CODE (TREE_OPERAND (init, 0)) == STRING_CST
29859 && !TREE_ASM_WRITTEN (TREE_OPERAND (init, 0)))
29860 || (TREE_CODE (TREE_OPERAND (init, 0)) == VAR_DECL
29861 && !DECL_EXTERNAL (TREE_OPERAND (init, 0))
29862 && TREE_OPERAND (init, 0) != decl))
29864 dw_die_ref ref;
29865 dw_loc_descr_ref l;
29867 if (TREE_CODE (TREE_OPERAND (init, 0)) == STRING_CST)
29869 rtx rtl = string_cst_pool_decl (TREE_OPERAND (init, 0));
29870 if (!rtl)
29871 return;
29872 decl = SYMBOL_REF_DECL (rtl);
29874 else
29875 decl = TREE_OPERAND (init, 0);
29876 ref = lookup_decl_die (decl);
29877 if (ref == NULL
29878 || (!get_AT (ref, DW_AT_location)
29879 && !get_AT (ref, DW_AT_const_value)))
29880 return;
29881 l = new_loc_descr (dwarf_OP (DW_OP_implicit_pointer), 0, offset);
29882 l->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29883 l->dw_loc_oprnd1.v.val_die_ref.die = ref;
29884 l->dw_loc_oprnd1.v.val_die_ref.external = 0;
29885 add_AT_loc (die, DW_AT_location, l);
29889 /* Return NULL if l is a DWARF expression, or first op that is not
29890 valid DWARF expression. */
29892 static dw_loc_descr_ref
29893 non_dwarf_expression (dw_loc_descr_ref l)
29895 while (l)
29897 if (l->dw_loc_opc >= DW_OP_reg0 && l->dw_loc_opc <= DW_OP_reg31)
29898 return l;
29899 switch (l->dw_loc_opc)
29901 case DW_OP_regx:
29902 case DW_OP_implicit_value:
29903 case DW_OP_stack_value:
29904 case DW_OP_implicit_pointer:
29905 case DW_OP_GNU_implicit_pointer:
29906 case DW_OP_GNU_parameter_ref:
29907 case DW_OP_piece:
29908 case DW_OP_bit_piece:
29909 return l;
29910 default:
29911 break;
29913 l = l->dw_loc_next;
29915 return NULL;
29918 /* Return adjusted copy of EXPR:
29919 If it is empty DWARF expression, return it.
29920 If it is valid non-empty DWARF expression,
29921 return copy of EXPR with DW_OP_deref appended to it.
29922 If it is DWARF expression followed by DW_OP_reg{N,x}, return
29923 copy of the DWARF expression with DW_OP_breg{N,x} <0> appended.
29924 If it is DWARF expression followed by DW_OP_stack_value, return
29925 copy of the DWARF expression without anything appended.
29926 Otherwise, return NULL. */
29928 static dw_loc_descr_ref
29929 copy_deref_exprloc (dw_loc_descr_ref expr)
29931 dw_loc_descr_ref tail = NULL;
29933 if (expr == NULL)
29934 return NULL;
29936 dw_loc_descr_ref l = non_dwarf_expression (expr);
29937 if (l && l->dw_loc_next)
29938 return NULL;
29940 if (l)
29942 if (l->dw_loc_opc >= DW_OP_reg0 && l->dw_loc_opc <= DW_OP_reg31)
29943 tail = new_loc_descr ((enum dwarf_location_atom)
29944 (DW_OP_breg0 + (l->dw_loc_opc - DW_OP_reg0)),
29945 0, 0);
29946 else
29947 switch (l->dw_loc_opc)
29949 case DW_OP_regx:
29950 tail = new_loc_descr (DW_OP_bregx,
29951 l->dw_loc_oprnd1.v.val_unsigned, 0);
29952 break;
29953 case DW_OP_stack_value:
29954 break;
29955 default:
29956 return NULL;
29959 else
29960 tail = new_loc_descr (DW_OP_deref, 0, 0);
29962 dw_loc_descr_ref ret = NULL, *p = &ret;
29963 while (expr != l)
29965 *p = new_loc_descr (expr->dw_loc_opc, 0, 0);
29966 (*p)->dw_loc_oprnd1 = expr->dw_loc_oprnd1;
29967 (*p)->dw_loc_oprnd2 = expr->dw_loc_oprnd2;
29968 p = &(*p)->dw_loc_next;
29969 expr = expr->dw_loc_next;
29971 *p = tail;
29972 return ret;
29975 /* For DW_AT_string_length attribute with DW_OP_GNU_variable_value
29976 reference to a variable or argument, adjust it if needed and return:
29977 -1 if the DW_AT_string_length attribute and DW_AT_{string_length_,}byte_size
29978 attribute if present should be removed
29979 0 keep the attribute perhaps with minor modifications, no need to rescan
29980 1 if the attribute has been successfully adjusted. */
29982 static int
29983 optimize_string_length (dw_attr_node *a)
29985 dw_loc_descr_ref l = AT_loc (a), lv;
29986 dw_die_ref die;
29987 if (l->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
29989 tree decl = l->dw_loc_oprnd1.v.val_decl_ref;
29990 die = lookup_decl_die (decl);
29991 if (die)
29993 l->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
29994 l->dw_loc_oprnd1.v.val_die_ref.die = die;
29995 l->dw_loc_oprnd1.v.val_die_ref.external = 0;
29997 else
29998 return -1;
30000 else
30001 die = l->dw_loc_oprnd1.v.val_die_ref.die;
30003 /* DWARF5 allows reference class, so we can then reference the DIE.
30004 Only do this for DW_OP_GNU_variable_value DW_OP_stack_value. */
30005 if (l->dw_loc_next != NULL && dwarf_version >= 5)
30007 a->dw_attr_val.val_class = dw_val_class_die_ref;
30008 a->dw_attr_val.val_entry = NULL;
30009 a->dw_attr_val.v.val_die_ref.die = die;
30010 a->dw_attr_val.v.val_die_ref.external = 0;
30011 return 0;
30014 dw_attr_node *av = get_AT (die, DW_AT_location);
30015 dw_loc_list_ref d;
30016 bool non_dwarf_expr = false;
30018 if (av == NULL)
30019 return dwarf_strict ? -1 : 0;
30020 switch (AT_class (av))
30022 case dw_val_class_loc_list:
30023 for (d = AT_loc_list (av); d != NULL; d = d->dw_loc_next)
30024 if (d->expr && non_dwarf_expression (d->expr))
30025 non_dwarf_expr = true;
30026 break;
30027 case dw_val_class_view_list:
30028 gcc_unreachable ();
30029 case dw_val_class_loc:
30030 lv = AT_loc (av);
30031 if (lv == NULL)
30032 return dwarf_strict ? -1 : 0;
30033 if (non_dwarf_expression (lv))
30034 non_dwarf_expr = true;
30035 break;
30036 default:
30037 return dwarf_strict ? -1 : 0;
30040 /* If it is safe to transform DW_OP_GNU_variable_value DW_OP_stack_value
30041 into DW_OP_call4 or DW_OP_GNU_variable_value into
30042 DW_OP_call4 DW_OP_deref, do so. */
30043 if (!non_dwarf_expr
30044 && (l->dw_loc_next != NULL || AT_class (av) == dw_val_class_loc))
30046 l->dw_loc_opc = DW_OP_call4;
30047 if (l->dw_loc_next)
30048 l->dw_loc_next = NULL;
30049 else
30050 l->dw_loc_next = new_loc_descr (DW_OP_deref, 0, 0);
30051 return 0;
30054 /* For DW_OP_GNU_variable_value DW_OP_stack_value, we can just
30055 copy over the DW_AT_location attribute from die to a. */
30056 if (l->dw_loc_next != NULL)
30058 a->dw_attr_val = av->dw_attr_val;
30059 return 1;
30062 dw_loc_list_ref list, *p;
30063 switch (AT_class (av))
30065 case dw_val_class_loc_list:
30066 p = &list;
30067 list = NULL;
30068 for (d = AT_loc_list (av); d != NULL; d = d->dw_loc_next)
30070 lv = copy_deref_exprloc (d->expr);
30071 if (lv)
30073 *p = new_loc_list (lv, d->begin, d->vbegin, d->end, d->vend, d->section);
30074 p = &(*p)->dw_loc_next;
30076 else if (!dwarf_strict && d->expr)
30077 return 0;
30079 if (list == NULL)
30080 return dwarf_strict ? -1 : 0;
30081 a->dw_attr_val.val_class = dw_val_class_loc_list;
30082 gen_llsym (list);
30083 *AT_loc_list_ptr (a) = list;
30084 return 1;
30085 case dw_val_class_loc:
30086 lv = copy_deref_exprloc (AT_loc (av));
30087 if (lv == NULL)
30088 return dwarf_strict ? -1 : 0;
30089 a->dw_attr_val.v.val_loc = lv;
30090 return 1;
30091 default:
30092 gcc_unreachable ();
30096 /* Resolve DW_OP_addr and DW_AT_const_value CONST_STRING arguments to
30097 an address in .rodata section if the string literal is emitted there,
30098 or remove the containing location list or replace DW_AT_const_value
30099 with DW_AT_location and empty location expression, if it isn't found
30100 in .rodata. Similarly for SYMBOL_REFs, keep only those that refer
30101 to something that has been emitted in the current CU. */
30103 static void
30104 resolve_addr (dw_die_ref die)
30106 dw_die_ref c;
30107 dw_attr_node *a;
30108 dw_loc_list_ref *curr, *start, loc;
30109 unsigned ix;
30110 bool remove_AT_byte_size = false;
30112 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30113 switch (AT_class (a))
30115 case dw_val_class_loc_list:
30116 start = curr = AT_loc_list_ptr (a);
30117 loc = *curr;
30118 gcc_assert (loc);
30119 /* The same list can be referenced more than once. See if we have
30120 already recorded the result from a previous pass. */
30121 if (loc->replaced)
30122 *curr = loc->dw_loc_next;
30123 else if (!loc->resolved_addr)
30125 /* As things stand, we do not expect or allow one die to
30126 reference a suffix of another die's location list chain.
30127 References must be identical or completely separate.
30128 There is therefore no need to cache the result of this
30129 pass on any list other than the first; doing so
30130 would lead to unnecessary writes. */
30131 while (*curr)
30133 gcc_assert (!(*curr)->replaced && !(*curr)->resolved_addr);
30134 if (!resolve_addr_in_expr (a, (*curr)->expr))
30136 dw_loc_list_ref next = (*curr)->dw_loc_next;
30137 dw_loc_descr_ref l = (*curr)->expr;
30139 if (next && (*curr)->ll_symbol)
30141 gcc_assert (!next->ll_symbol);
30142 next->ll_symbol = (*curr)->ll_symbol;
30143 next->vl_symbol = (*curr)->vl_symbol;
30145 if (dwarf_split_debug_info)
30146 remove_loc_list_addr_table_entries (l);
30147 *curr = next;
30149 else
30151 mark_base_types ((*curr)->expr);
30152 curr = &(*curr)->dw_loc_next;
30155 if (loc == *start)
30156 loc->resolved_addr = 1;
30157 else
30159 loc->replaced = 1;
30160 loc->dw_loc_next = *start;
30163 if (!*start)
30165 remove_AT (die, a->dw_attr);
30166 ix--;
30168 break;
30169 case dw_val_class_view_list:
30171 gcc_checking_assert (a->dw_attr == DW_AT_GNU_locviews);
30172 gcc_checking_assert (dwarf2out_locviews_in_attribute ());
30173 dw_val_node *llnode
30174 = view_list_to_loc_list_val_node (&a->dw_attr_val);
30175 /* If we no longer have a loclist, or it no longer needs
30176 views, drop this attribute. */
30177 if (!llnode || !llnode->v.val_loc_list->vl_symbol)
30179 remove_AT (die, a->dw_attr);
30180 ix--;
30182 break;
30184 case dw_val_class_loc:
30186 dw_loc_descr_ref l = AT_loc (a);
30187 /* DW_OP_GNU_variable_value DW_OP_stack_value or
30188 DW_OP_GNU_variable_value in DW_AT_string_length can be converted
30189 into DW_OP_call4 or DW_OP_call4 DW_OP_deref, which is standard
30190 DWARF4 unlike DW_OP_GNU_variable_value. Or for DWARF5
30191 DW_OP_GNU_variable_value DW_OP_stack_value can be replaced
30192 with DW_FORM_ref referencing the same DIE as
30193 DW_OP_GNU_variable_value used to reference. */
30194 if (a->dw_attr == DW_AT_string_length
30195 && l
30196 && l->dw_loc_opc == DW_OP_GNU_variable_value
30197 && (l->dw_loc_next == NULL
30198 || (l->dw_loc_next->dw_loc_next == NULL
30199 && l->dw_loc_next->dw_loc_opc == DW_OP_stack_value)))
30201 switch (optimize_string_length (a))
30203 case -1:
30204 remove_AT (die, a->dw_attr);
30205 ix--;
30206 /* If we drop DW_AT_string_length, we need to drop also
30207 DW_AT_{string_length_,}byte_size. */
30208 remove_AT_byte_size = true;
30209 continue;
30210 default:
30211 break;
30212 case 1:
30213 /* Even if we keep the optimized DW_AT_string_length,
30214 it might have changed AT_class, so process it again. */
30215 ix--;
30216 continue;
30219 /* For -gdwarf-2 don't attempt to optimize
30220 DW_AT_data_member_location containing
30221 DW_OP_plus_uconst - older consumers might
30222 rely on it being that op instead of a more complex,
30223 but shorter, location description. */
30224 if ((dwarf_version > 2
30225 || a->dw_attr != DW_AT_data_member_location
30226 || l == NULL
30227 || l->dw_loc_opc != DW_OP_plus_uconst
30228 || l->dw_loc_next != NULL)
30229 && !resolve_addr_in_expr (a, l))
30231 if (dwarf_split_debug_info)
30232 remove_loc_list_addr_table_entries (l);
30233 if (l != NULL
30234 && l->dw_loc_next == NULL
30235 && l->dw_loc_opc == DW_OP_addr
30236 && GET_CODE (l->dw_loc_oprnd1.v.val_addr) == SYMBOL_REF
30237 && SYMBOL_REF_DECL (l->dw_loc_oprnd1.v.val_addr)
30238 && a->dw_attr == DW_AT_location)
30240 tree decl = SYMBOL_REF_DECL (l->dw_loc_oprnd1.v.val_addr);
30241 remove_AT (die, a->dw_attr);
30242 ix--;
30243 optimize_location_into_implicit_ptr (die, decl);
30244 break;
30246 if (a->dw_attr == DW_AT_string_length)
30247 /* If we drop DW_AT_string_length, we need to drop also
30248 DW_AT_{string_length_,}byte_size. */
30249 remove_AT_byte_size = true;
30250 remove_AT (die, a->dw_attr);
30251 ix--;
30253 else
30254 mark_base_types (l);
30256 break;
30257 case dw_val_class_addr:
30258 if (a->dw_attr == DW_AT_const_value
30259 && !resolve_one_addr (&a->dw_attr_val.v.val_addr))
30261 if (AT_index (a) != NOT_INDEXED)
30262 remove_addr_table_entry (a->dw_attr_val.val_entry);
30263 remove_AT (die, a->dw_attr);
30264 ix--;
30266 if ((die->die_tag == DW_TAG_call_site
30267 && a->dw_attr == DW_AT_call_origin)
30268 || (die->die_tag == DW_TAG_GNU_call_site
30269 && a->dw_attr == DW_AT_abstract_origin))
30271 tree tdecl = SYMBOL_REF_DECL (a->dw_attr_val.v.val_addr);
30272 dw_die_ref tdie = lookup_decl_die (tdecl);
30273 dw_die_ref cdie;
30274 if (tdie == NULL
30275 && DECL_EXTERNAL (tdecl)
30276 && DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE
30277 && (cdie = lookup_context_die (DECL_CONTEXT (tdecl))))
30279 dw_die_ref pdie = cdie;
30280 /* Make sure we don't add these DIEs into type units.
30281 We could emit skeleton DIEs for context (namespaces,
30282 outer structs/classes) and a skeleton DIE for the
30283 innermost context with DW_AT_signature pointing to the
30284 type unit. See PR78835. */
30285 while (pdie && pdie->die_tag != DW_TAG_type_unit)
30286 pdie = pdie->die_parent;
30287 if (pdie == NULL)
30289 /* Creating a full DIE for tdecl is overly expensive and
30290 at this point even wrong when in the LTO phase
30291 as it can end up generating new type DIEs we didn't
30292 output and thus optimize_external_refs will crash. */
30293 tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
30294 add_AT_flag (tdie, DW_AT_external, 1);
30295 add_AT_flag (tdie, DW_AT_declaration, 1);
30296 add_linkage_attr (tdie, tdecl);
30297 add_name_and_src_coords_attributes (tdie, tdecl, true);
30298 equate_decl_number_to_die (tdecl, tdie);
30301 if (tdie)
30303 a->dw_attr_val.val_class = dw_val_class_die_ref;
30304 a->dw_attr_val.v.val_die_ref.die = tdie;
30305 a->dw_attr_val.v.val_die_ref.external = 0;
30307 else
30309 if (AT_index (a) != NOT_INDEXED)
30310 remove_addr_table_entry (a->dw_attr_val.val_entry);
30311 remove_AT (die, a->dw_attr);
30312 ix--;
30315 break;
30316 default:
30317 break;
30320 if (remove_AT_byte_size)
30321 remove_AT (die, dwarf_version >= 5
30322 ? DW_AT_string_length_byte_size
30323 : DW_AT_byte_size);
30325 FOR_EACH_CHILD (die, c, resolve_addr (c));
30328 /* Helper routines for optimize_location_lists.
30329 This pass tries to share identical local lists in .debug_loc
30330 section. */
30332 /* Iteratively hash operands of LOC opcode into HSTATE. */
30334 static void
30335 hash_loc_operands (dw_loc_descr_ref loc, inchash::hash &hstate)
30337 dw_val_ref val1 = &loc->dw_loc_oprnd1;
30338 dw_val_ref val2 = &loc->dw_loc_oprnd2;
30340 switch (loc->dw_loc_opc)
30342 case DW_OP_const4u:
30343 case DW_OP_const8u:
30344 if (loc->dtprel)
30345 goto hash_addr;
30346 /* FALLTHRU */
30347 case DW_OP_const1u:
30348 case DW_OP_const1s:
30349 case DW_OP_const2u:
30350 case DW_OP_const2s:
30351 case DW_OP_const4s:
30352 case DW_OP_const8s:
30353 case DW_OP_constu:
30354 case DW_OP_consts:
30355 case DW_OP_pick:
30356 case DW_OP_plus_uconst:
30357 case DW_OP_breg0:
30358 case DW_OP_breg1:
30359 case DW_OP_breg2:
30360 case DW_OP_breg3:
30361 case DW_OP_breg4:
30362 case DW_OP_breg5:
30363 case DW_OP_breg6:
30364 case DW_OP_breg7:
30365 case DW_OP_breg8:
30366 case DW_OP_breg9:
30367 case DW_OP_breg10:
30368 case DW_OP_breg11:
30369 case DW_OP_breg12:
30370 case DW_OP_breg13:
30371 case DW_OP_breg14:
30372 case DW_OP_breg15:
30373 case DW_OP_breg16:
30374 case DW_OP_breg17:
30375 case DW_OP_breg18:
30376 case DW_OP_breg19:
30377 case DW_OP_breg20:
30378 case DW_OP_breg21:
30379 case DW_OP_breg22:
30380 case DW_OP_breg23:
30381 case DW_OP_breg24:
30382 case DW_OP_breg25:
30383 case DW_OP_breg26:
30384 case DW_OP_breg27:
30385 case DW_OP_breg28:
30386 case DW_OP_breg29:
30387 case DW_OP_breg30:
30388 case DW_OP_breg31:
30389 case DW_OP_regx:
30390 case DW_OP_fbreg:
30391 case DW_OP_piece:
30392 case DW_OP_deref_size:
30393 case DW_OP_xderef_size:
30394 hstate.add_object (val1->v.val_int);
30395 break;
30396 case DW_OP_skip:
30397 case DW_OP_bra:
30399 int offset;
30401 gcc_assert (val1->val_class == dw_val_class_loc);
30402 offset = val1->v.val_loc->dw_loc_addr - (loc->dw_loc_addr + 3);
30403 hstate.add_object (offset);
30405 break;
30406 case DW_OP_implicit_value:
30407 hstate.add_object (val1->v.val_unsigned);
30408 switch (val2->val_class)
30410 case dw_val_class_const:
30411 hstate.add_object (val2->v.val_int);
30412 break;
30413 case dw_val_class_vec:
30415 unsigned int elt_size = val2->v.val_vec.elt_size;
30416 unsigned int len = val2->v.val_vec.length;
30418 hstate.add_int (elt_size);
30419 hstate.add_int (len);
30420 hstate.add (val2->v.val_vec.array, len * elt_size);
30422 break;
30423 case dw_val_class_const_double:
30424 hstate.add_object (val2->v.val_double.low);
30425 hstate.add_object (val2->v.val_double.high);
30426 break;
30427 case dw_val_class_wide_int:
30428 hstate.add (val2->v.val_wide->get_val (),
30429 get_full_len (*val2->v.val_wide)
30430 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
30431 break;
30432 case dw_val_class_addr:
30433 inchash::add_rtx (val2->v.val_addr, hstate);
30434 break;
30435 default:
30436 gcc_unreachable ();
30438 break;
30439 case DW_OP_bregx:
30440 case DW_OP_bit_piece:
30441 hstate.add_object (val1->v.val_int);
30442 hstate.add_object (val2->v.val_int);
30443 break;
30444 case DW_OP_addr:
30445 hash_addr:
30446 if (loc->dtprel)
30448 unsigned char dtprel = 0xd1;
30449 hstate.add_object (dtprel);
30451 inchash::add_rtx (val1->v.val_addr, hstate);
30452 break;
30453 case DW_OP_GNU_addr_index:
30454 case DW_OP_GNU_const_index:
30456 if (loc->dtprel)
30458 unsigned char dtprel = 0xd1;
30459 hstate.add_object (dtprel);
30461 inchash::add_rtx (val1->val_entry->addr.rtl, hstate);
30463 break;
30464 case DW_OP_implicit_pointer:
30465 case DW_OP_GNU_implicit_pointer:
30466 hstate.add_int (val2->v.val_int);
30467 break;
30468 case DW_OP_entry_value:
30469 case DW_OP_GNU_entry_value:
30470 hstate.add_object (val1->v.val_loc);
30471 break;
30472 case DW_OP_regval_type:
30473 case DW_OP_deref_type:
30474 case DW_OP_GNU_regval_type:
30475 case DW_OP_GNU_deref_type:
30477 unsigned int byte_size
30478 = get_AT_unsigned (val2->v.val_die_ref.die, DW_AT_byte_size);
30479 unsigned int encoding
30480 = get_AT_unsigned (val2->v.val_die_ref.die, DW_AT_encoding);
30481 hstate.add_object (val1->v.val_int);
30482 hstate.add_object (byte_size);
30483 hstate.add_object (encoding);
30485 break;
30486 case DW_OP_convert:
30487 case DW_OP_reinterpret:
30488 case DW_OP_GNU_convert:
30489 case DW_OP_GNU_reinterpret:
30490 if (val1->val_class == dw_val_class_unsigned_const)
30492 hstate.add_object (val1->v.val_unsigned);
30493 break;
30495 /* FALLTHRU */
30496 case DW_OP_const_type:
30497 case DW_OP_GNU_const_type:
30499 unsigned int byte_size
30500 = get_AT_unsigned (val1->v.val_die_ref.die, DW_AT_byte_size);
30501 unsigned int encoding
30502 = get_AT_unsigned (val1->v.val_die_ref.die, DW_AT_encoding);
30503 hstate.add_object (byte_size);
30504 hstate.add_object (encoding);
30505 if (loc->dw_loc_opc != DW_OP_const_type
30506 && loc->dw_loc_opc != DW_OP_GNU_const_type)
30507 break;
30508 hstate.add_object (val2->val_class);
30509 switch (val2->val_class)
30511 case dw_val_class_const:
30512 hstate.add_object (val2->v.val_int);
30513 break;
30514 case dw_val_class_vec:
30516 unsigned int elt_size = val2->v.val_vec.elt_size;
30517 unsigned int len = val2->v.val_vec.length;
30519 hstate.add_object (elt_size);
30520 hstate.add_object (len);
30521 hstate.add (val2->v.val_vec.array, len * elt_size);
30523 break;
30524 case dw_val_class_const_double:
30525 hstate.add_object (val2->v.val_double.low);
30526 hstate.add_object (val2->v.val_double.high);
30527 break;
30528 case dw_val_class_wide_int:
30529 hstate.add (val2->v.val_wide->get_val (),
30530 get_full_len (*val2->v.val_wide)
30531 * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
30532 break;
30533 default:
30534 gcc_unreachable ();
30537 break;
30539 default:
30540 /* Other codes have no operands. */
30541 break;
30545 /* Iteratively hash the whole DWARF location expression LOC into HSTATE. */
30547 static inline void
30548 hash_locs (dw_loc_descr_ref loc, inchash::hash &hstate)
30550 dw_loc_descr_ref l;
30551 bool sizes_computed = false;
30552 /* Compute sizes, so that DW_OP_skip/DW_OP_bra can be checksummed. */
30553 size_of_locs (loc);
30555 for (l = loc; l != NULL; l = l->dw_loc_next)
30557 enum dwarf_location_atom opc = l->dw_loc_opc;
30558 hstate.add_object (opc);
30559 if ((opc == DW_OP_skip || opc == DW_OP_bra) && !sizes_computed)
30561 size_of_locs (loc);
30562 sizes_computed = true;
30564 hash_loc_operands (l, hstate);
30568 /* Compute hash of the whole location list LIST_HEAD. */
30570 static inline void
30571 hash_loc_list (dw_loc_list_ref list_head)
30573 dw_loc_list_ref curr = list_head;
30574 inchash::hash hstate;
30576 for (curr = list_head; curr != NULL; curr = curr->dw_loc_next)
30578 hstate.add (curr->begin, strlen (curr->begin) + 1);
30579 hstate.add (curr->end, strlen (curr->end) + 1);
30580 hstate.add_object (curr->vbegin);
30581 hstate.add_object (curr->vend);
30582 if (curr->section)
30583 hstate.add (curr->section, strlen (curr->section) + 1);
30584 hash_locs (curr->expr, hstate);
30586 list_head->hash = hstate.end ();
30589 /* Return true if X and Y opcodes have the same operands. */
30591 static inline bool
30592 compare_loc_operands (dw_loc_descr_ref x, dw_loc_descr_ref y)
30594 dw_val_ref valx1 = &x->dw_loc_oprnd1;
30595 dw_val_ref valx2 = &x->dw_loc_oprnd2;
30596 dw_val_ref valy1 = &y->dw_loc_oprnd1;
30597 dw_val_ref valy2 = &y->dw_loc_oprnd2;
30599 switch (x->dw_loc_opc)
30601 case DW_OP_const4u:
30602 case DW_OP_const8u:
30603 if (x->dtprel)
30604 goto hash_addr;
30605 /* FALLTHRU */
30606 case DW_OP_const1u:
30607 case DW_OP_const1s:
30608 case DW_OP_const2u:
30609 case DW_OP_const2s:
30610 case DW_OP_const4s:
30611 case DW_OP_const8s:
30612 case DW_OP_constu:
30613 case DW_OP_consts:
30614 case DW_OP_pick:
30615 case DW_OP_plus_uconst:
30616 case DW_OP_breg0:
30617 case DW_OP_breg1:
30618 case DW_OP_breg2:
30619 case DW_OP_breg3:
30620 case DW_OP_breg4:
30621 case DW_OP_breg5:
30622 case DW_OP_breg6:
30623 case DW_OP_breg7:
30624 case DW_OP_breg8:
30625 case DW_OP_breg9:
30626 case DW_OP_breg10:
30627 case DW_OP_breg11:
30628 case DW_OP_breg12:
30629 case DW_OP_breg13:
30630 case DW_OP_breg14:
30631 case DW_OP_breg15:
30632 case DW_OP_breg16:
30633 case DW_OP_breg17:
30634 case DW_OP_breg18:
30635 case DW_OP_breg19:
30636 case DW_OP_breg20:
30637 case DW_OP_breg21:
30638 case DW_OP_breg22:
30639 case DW_OP_breg23:
30640 case DW_OP_breg24:
30641 case DW_OP_breg25:
30642 case DW_OP_breg26:
30643 case DW_OP_breg27:
30644 case DW_OP_breg28:
30645 case DW_OP_breg29:
30646 case DW_OP_breg30:
30647 case DW_OP_breg31:
30648 case DW_OP_regx:
30649 case DW_OP_fbreg:
30650 case DW_OP_piece:
30651 case DW_OP_deref_size:
30652 case DW_OP_xderef_size:
30653 return valx1->v.val_int == valy1->v.val_int;
30654 case DW_OP_skip:
30655 case DW_OP_bra:
30656 /* If splitting debug info, the use of DW_OP_GNU_addr_index
30657 can cause irrelevant differences in dw_loc_addr. */
30658 gcc_assert (valx1->val_class == dw_val_class_loc
30659 && valy1->val_class == dw_val_class_loc
30660 && (dwarf_split_debug_info
30661 || x->dw_loc_addr == y->dw_loc_addr));
30662 return valx1->v.val_loc->dw_loc_addr == valy1->v.val_loc->dw_loc_addr;
30663 case DW_OP_implicit_value:
30664 if (valx1->v.val_unsigned != valy1->v.val_unsigned
30665 || valx2->val_class != valy2->val_class)
30666 return false;
30667 switch (valx2->val_class)
30669 case dw_val_class_const:
30670 return valx2->v.val_int == valy2->v.val_int;
30671 case dw_val_class_vec:
30672 return valx2->v.val_vec.elt_size == valy2->v.val_vec.elt_size
30673 && valx2->v.val_vec.length == valy2->v.val_vec.length
30674 && memcmp (valx2->v.val_vec.array, valy2->v.val_vec.array,
30675 valx2->v.val_vec.elt_size
30676 * valx2->v.val_vec.length) == 0;
30677 case dw_val_class_const_double:
30678 return valx2->v.val_double.low == valy2->v.val_double.low
30679 && valx2->v.val_double.high == valy2->v.val_double.high;
30680 case dw_val_class_wide_int:
30681 return *valx2->v.val_wide == *valy2->v.val_wide;
30682 case dw_val_class_addr:
30683 return rtx_equal_p (valx2->v.val_addr, valy2->v.val_addr);
30684 default:
30685 gcc_unreachable ();
30687 case DW_OP_bregx:
30688 case DW_OP_bit_piece:
30689 return valx1->v.val_int == valy1->v.val_int
30690 && valx2->v.val_int == valy2->v.val_int;
30691 case DW_OP_addr:
30692 hash_addr:
30693 return rtx_equal_p (valx1->v.val_addr, valy1->v.val_addr);
30694 case DW_OP_GNU_addr_index:
30695 case DW_OP_GNU_const_index:
30697 rtx ax1 = valx1->val_entry->addr.rtl;
30698 rtx ay1 = valy1->val_entry->addr.rtl;
30699 return rtx_equal_p (ax1, ay1);
30701 case DW_OP_implicit_pointer:
30702 case DW_OP_GNU_implicit_pointer:
30703 return valx1->val_class == dw_val_class_die_ref
30704 && valx1->val_class == valy1->val_class
30705 && valx1->v.val_die_ref.die == valy1->v.val_die_ref.die
30706 && valx2->v.val_int == valy2->v.val_int;
30707 case DW_OP_entry_value:
30708 case DW_OP_GNU_entry_value:
30709 return compare_loc_operands (valx1->v.val_loc, valy1->v.val_loc);
30710 case DW_OP_const_type:
30711 case DW_OP_GNU_const_type:
30712 if (valx1->v.val_die_ref.die != valy1->v.val_die_ref.die
30713 || valx2->val_class != valy2->val_class)
30714 return false;
30715 switch (valx2->val_class)
30717 case dw_val_class_const:
30718 return valx2->v.val_int == valy2->v.val_int;
30719 case dw_val_class_vec:
30720 return valx2->v.val_vec.elt_size == valy2->v.val_vec.elt_size
30721 && valx2->v.val_vec.length == valy2->v.val_vec.length
30722 && memcmp (valx2->v.val_vec.array, valy2->v.val_vec.array,
30723 valx2->v.val_vec.elt_size
30724 * valx2->v.val_vec.length) == 0;
30725 case dw_val_class_const_double:
30726 return valx2->v.val_double.low == valy2->v.val_double.low
30727 && valx2->v.val_double.high == valy2->v.val_double.high;
30728 case dw_val_class_wide_int:
30729 return *valx2->v.val_wide == *valy2->v.val_wide;
30730 default:
30731 gcc_unreachable ();
30733 case DW_OP_regval_type:
30734 case DW_OP_deref_type:
30735 case DW_OP_GNU_regval_type:
30736 case DW_OP_GNU_deref_type:
30737 return valx1->v.val_int == valy1->v.val_int
30738 && valx2->v.val_die_ref.die == valy2->v.val_die_ref.die;
30739 case DW_OP_convert:
30740 case DW_OP_reinterpret:
30741 case DW_OP_GNU_convert:
30742 case DW_OP_GNU_reinterpret:
30743 if (valx1->val_class != valy1->val_class)
30744 return false;
30745 if (valx1->val_class == dw_val_class_unsigned_const)
30746 return valx1->v.val_unsigned == valy1->v.val_unsigned;
30747 return valx1->v.val_die_ref.die == valy1->v.val_die_ref.die;
30748 case DW_OP_GNU_parameter_ref:
30749 return valx1->val_class == dw_val_class_die_ref
30750 && valx1->val_class == valy1->val_class
30751 && valx1->v.val_die_ref.die == valy1->v.val_die_ref.die;
30752 default:
30753 /* Other codes have no operands. */
30754 return true;
30758 /* Return true if DWARF location expressions X and Y are the same. */
30760 static inline bool
30761 compare_locs (dw_loc_descr_ref x, dw_loc_descr_ref y)
30763 for (; x != NULL && y != NULL; x = x->dw_loc_next, y = y->dw_loc_next)
30764 if (x->dw_loc_opc != y->dw_loc_opc
30765 || x->dtprel != y->dtprel
30766 || !compare_loc_operands (x, y))
30767 break;
30768 return x == NULL && y == NULL;
30771 /* Hashtable helpers. */
30773 struct loc_list_hasher : nofree_ptr_hash <dw_loc_list_struct>
30775 static inline hashval_t hash (const dw_loc_list_struct *);
30776 static inline bool equal (const dw_loc_list_struct *,
30777 const dw_loc_list_struct *);
30780 /* Return precomputed hash of location list X. */
30782 inline hashval_t
30783 loc_list_hasher::hash (const dw_loc_list_struct *x)
30785 return x->hash;
30788 /* Return true if location lists A and B are the same. */
30790 inline bool
30791 loc_list_hasher::equal (const dw_loc_list_struct *a,
30792 const dw_loc_list_struct *b)
30794 if (a == b)
30795 return 1;
30796 if (a->hash != b->hash)
30797 return 0;
30798 for (; a != NULL && b != NULL; a = a->dw_loc_next, b = b->dw_loc_next)
30799 if (strcmp (a->begin, b->begin) != 0
30800 || strcmp (a->end, b->end) != 0
30801 || (a->section == NULL) != (b->section == NULL)
30802 || (a->section && strcmp (a->section, b->section) != 0)
30803 || a->vbegin != b->vbegin || a->vend != b->vend
30804 || !compare_locs (a->expr, b->expr))
30805 break;
30806 return a == NULL && b == NULL;
30809 typedef hash_table<loc_list_hasher> loc_list_hash_type;
30812 /* Recursively optimize location lists referenced from DIE
30813 children and share them whenever possible. */
30815 static void
30816 optimize_location_lists_1 (dw_die_ref die, loc_list_hash_type *htab)
30818 dw_die_ref c;
30819 dw_attr_node *a;
30820 unsigned ix;
30821 dw_loc_list_struct **slot;
30822 bool drop_locviews = false;
30823 bool has_locviews = false;
30825 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30826 if (AT_class (a) == dw_val_class_loc_list)
30828 dw_loc_list_ref list = AT_loc_list (a);
30829 /* TODO: perform some optimizations here, before hashing
30830 it and storing into the hash table. */
30831 hash_loc_list (list);
30832 slot = htab->find_slot_with_hash (list, list->hash, INSERT);
30833 if (*slot == NULL)
30835 *slot = list;
30836 if (loc_list_has_views (list))
30837 gcc_assert (list->vl_symbol);
30838 else if (list->vl_symbol)
30840 drop_locviews = true;
30841 list->vl_symbol = NULL;
30844 else
30846 if (list->vl_symbol && !(*slot)->vl_symbol)
30847 drop_locviews = true;
30848 a->dw_attr_val.v.val_loc_list = *slot;
30851 else if (AT_class (a) == dw_val_class_view_list)
30853 gcc_checking_assert (a->dw_attr == DW_AT_GNU_locviews);
30854 has_locviews = true;
30858 if (drop_locviews && has_locviews)
30859 remove_AT (die, DW_AT_GNU_locviews);
30861 FOR_EACH_CHILD (die, c, optimize_location_lists_1 (c, htab));
30865 /* Recursively assign each location list a unique index into the debug_addr
30866 section. */
30868 static void
30869 index_location_lists (dw_die_ref die)
30871 dw_die_ref c;
30872 dw_attr_node *a;
30873 unsigned ix;
30875 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
30876 if (AT_class (a) == dw_val_class_loc_list)
30878 dw_loc_list_ref list = AT_loc_list (a);
30879 dw_loc_list_ref curr;
30880 for (curr = list; curr != NULL; curr = curr->dw_loc_next)
30882 /* Don't index an entry that has already been indexed
30883 or won't be output. */
30884 if (curr->begin_entry != NULL
30885 || skip_loc_list_entry (curr))
30886 continue;
30888 curr->begin_entry
30889 = add_addr_table_entry (xstrdup (curr->begin), ate_kind_label);
30893 FOR_EACH_CHILD (die, c, index_location_lists (c));
30896 /* Optimize location lists referenced from DIE
30897 children and share them whenever possible. */
30899 static void
30900 optimize_location_lists (dw_die_ref die)
30902 loc_list_hash_type htab (500);
30903 optimize_location_lists_1 (die, &htab);
30906 /* Traverse the limbo die list, and add parent/child links. The only
30907 dies without parents that should be here are concrete instances of
30908 inline functions, and the comp_unit_die. We can ignore the comp_unit_die.
30909 For concrete instances, we can get the parent die from the abstract
30910 instance. */
30912 static void
30913 flush_limbo_die_list (void)
30915 limbo_die_node *node;
30917 /* get_context_die calls force_decl_die, which can put new DIEs on the
30918 limbo list in LTO mode when nested functions are put in a different
30919 partition than that of their parent function. */
30920 while ((node = limbo_die_list))
30922 dw_die_ref die = node->die;
30923 limbo_die_list = node->next;
30925 if (die->die_parent == NULL)
30927 dw_die_ref origin = get_AT_ref (die, DW_AT_abstract_origin);
30929 if (origin && origin->die_parent)
30930 add_child_die (origin->die_parent, die);
30931 else if (is_cu_die (die))
30933 else if (seen_error ())
30934 /* It's OK to be confused by errors in the input. */
30935 add_child_die (comp_unit_die (), die);
30936 else
30938 /* In certain situations, the lexical block containing a
30939 nested function can be optimized away, which results
30940 in the nested function die being orphaned. Likewise
30941 with the return type of that nested function. Force
30942 this to be a child of the containing function.
30944 It may happen that even the containing function got fully
30945 inlined and optimized out. In that case we are lost and
30946 assign the empty child. This should not be big issue as
30947 the function is likely unreachable too. */
30948 gcc_assert (node->created_for);
30950 if (DECL_P (node->created_for))
30951 origin = get_context_die (DECL_CONTEXT (node->created_for));
30952 else if (TYPE_P (node->created_for))
30953 origin = scope_die_for (node->created_for, comp_unit_die ());
30954 else
30955 origin = comp_unit_die ();
30957 add_child_die (origin, die);
30963 /* Reset DIEs so we can output them again. */
30965 static void
30966 reset_dies (dw_die_ref die)
30968 dw_die_ref c;
30970 /* Remove stuff we re-generate. */
30971 die->die_mark = 0;
30972 die->die_offset = 0;
30973 die->die_abbrev = 0;
30974 remove_AT (die, DW_AT_sibling);
30976 FOR_EACH_CHILD (die, c, reset_dies (c));
30979 /* Output stuff that dwarf requires at the end of every file,
30980 and generate the DWARF-2 debugging info. */
30982 static void
30983 dwarf2out_finish (const char *)
30985 comdat_type_node *ctnode;
30986 dw_die_ref main_comp_unit_die;
30987 unsigned char checksum[16];
30988 char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];
30990 /* Flush out any latecomers to the limbo party. */
30991 flush_limbo_die_list ();
30993 if (inline_entry_data_table)
30994 gcc_assert (inline_entry_data_table->elements () == 0);
30996 if (flag_checking)
30998 verify_die (comp_unit_die ());
30999 for (limbo_die_node *node = cu_die_list; node; node = node->next)
31000 verify_die (node->die);
31003 /* We shouldn't have any symbols with delayed asm names for
31004 DIEs generated after early finish. */
31005 gcc_assert (deferred_asm_name == NULL);
31007 gen_remaining_tmpl_value_param_die_attribute ();
31009 if (flag_generate_lto || flag_generate_offload)
31011 gcc_assert (flag_fat_lto_objects || flag_generate_offload);
31013 /* Prune stuff so that dwarf2out_finish runs successfully
31014 for the fat part of the object. */
31015 reset_dies (comp_unit_die ());
31016 for (limbo_die_node *node = cu_die_list; node; node = node->next)
31017 reset_dies (node->die);
31019 hash_table<comdat_type_hasher> comdat_type_table (100);
31020 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31022 comdat_type_node **slot
31023 = comdat_type_table.find_slot (ctnode, INSERT);
31025 /* Don't reset types twice. */
31026 if (*slot != HTAB_EMPTY_ENTRY)
31027 continue;
31029 /* Add a pointer to the line table for the main compilation unit
31030 so that the debugger can make sense of DW_AT_decl_file
31031 attributes. */
31032 if (debug_info_level >= DINFO_LEVEL_TERSE)
31033 reset_dies (ctnode->root_die);
31035 *slot = ctnode;
31038 /* Reset die CU symbol so we don't output it twice. */
31039 comp_unit_die ()->die_id.die_symbol = NULL;
31041 /* Remove DW_AT_macro from the early output. */
31042 if (have_macinfo)
31043 remove_AT (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE);
31045 /* Remove indirect string decisions. */
31046 debug_str_hash->traverse<void *, reset_indirect_string> (NULL);
31049 #if ENABLE_ASSERT_CHECKING
31051 dw_die_ref die = comp_unit_die (), c;
31052 FOR_EACH_CHILD (die, c, gcc_assert (! c->die_mark));
31054 #endif
31055 resolve_addr (comp_unit_die ());
31056 move_marked_base_types ();
31058 /* Initialize sections and labels used for actual assembler output. */
31059 unsigned generation = init_sections_and_labels (false);
31061 /* Traverse the DIE's and add sibling attributes to those DIE's that
31062 have children. */
31063 add_sibling_attributes (comp_unit_die ());
31064 limbo_die_node *node;
31065 for (node = cu_die_list; node; node = node->next)
31066 add_sibling_attributes (node->die);
31067 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31068 add_sibling_attributes (ctnode->root_die);
31070 /* When splitting DWARF info, we put some attributes in the
31071 skeleton compile_unit DIE that remains in the .o, while
31072 most attributes go in the DWO compile_unit_die. */
31073 if (dwarf_split_debug_info)
31075 limbo_die_node *cu;
31076 main_comp_unit_die = gen_compile_unit_die (NULL);
31077 if (dwarf_version >= 5)
31078 main_comp_unit_die->die_tag = DW_TAG_skeleton_unit;
31079 cu = limbo_die_list;
31080 gcc_assert (cu->die == main_comp_unit_die);
31081 limbo_die_list = limbo_die_list->next;
31082 cu->next = cu_die_list;
31083 cu_die_list = cu;
31085 else
31086 main_comp_unit_die = comp_unit_die ();
31088 /* Output a terminator label for the .text section. */
31089 switch_to_section (text_section);
31090 targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
31091 if (cold_text_section)
31093 switch_to_section (cold_text_section);
31094 targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0);
31097 /* We can only use the low/high_pc attributes if all of the code was
31098 in .text. */
31099 if (!have_multiple_function_sections
31100 || (dwarf_version < 3 && dwarf_strict))
31102 /* Don't add if the CU has no associated code. */
31103 if (text_section_used)
31104 add_AT_low_high_pc (main_comp_unit_die, text_section_label,
31105 text_end_label, true);
31107 else
31109 unsigned fde_idx;
31110 dw_fde_ref fde;
31111 bool range_list_added = false;
31113 if (text_section_used)
31114 add_ranges_by_labels (main_comp_unit_die, text_section_label,
31115 text_end_label, &range_list_added, true);
31116 if (cold_text_section_used)
31117 add_ranges_by_labels (main_comp_unit_die, cold_text_section_label,
31118 cold_end_label, &range_list_added, true);
31120 FOR_EACH_VEC_ELT (*fde_vec, fde_idx, fde)
31122 if (DECL_IGNORED_P (fde->decl))
31123 continue;
31124 if (!fde->in_std_section)
31125 add_ranges_by_labels (main_comp_unit_die, fde->dw_fde_begin,
31126 fde->dw_fde_end, &range_list_added,
31127 true);
31128 if (fde->dw_fde_second_begin && !fde->second_in_std_section)
31129 add_ranges_by_labels (main_comp_unit_die, fde->dw_fde_second_begin,
31130 fde->dw_fde_second_end, &range_list_added,
31131 true);
31134 if (range_list_added)
31136 /* We need to give .debug_loc and .debug_ranges an appropriate
31137 "base address". Use zero so that these addresses become
31138 absolute. Historically, we've emitted the unexpected
31139 DW_AT_entry_pc instead of DW_AT_low_pc for this purpose.
31140 Emit both to give time for other tools to adapt. */
31141 add_AT_addr (main_comp_unit_die, DW_AT_low_pc, const0_rtx, true);
31142 if (! dwarf_strict && dwarf_version < 4)
31143 add_AT_addr (main_comp_unit_die, DW_AT_entry_pc, const0_rtx, true);
31145 add_ranges (NULL);
31149 /* AIX Assembler inserts the length, so adjust the reference to match the
31150 offset expected by debuggers. */
31151 strcpy (dl_section_ref, debug_line_section_label);
31152 if (XCOFF_DEBUGGING_INFO)
31153 strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
31155 if (debug_info_level >= DINFO_LEVEL_TERSE)
31156 add_AT_lineptr (main_comp_unit_die, DW_AT_stmt_list,
31157 dl_section_ref);
31159 if (have_macinfo)
31160 add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
31161 macinfo_section_label);
31163 if (dwarf_split_debug_info)
31165 if (have_location_lists)
31167 if (dwarf_version >= 5)
31168 add_AT_loclistsptr (comp_unit_die (), DW_AT_loclists_base,
31169 loc_section_label);
31170 /* optimize_location_lists calculates the size of the lists,
31171 so index them first, and assign indices to the entries.
31172 Although optimize_location_lists will remove entries from
31173 the table, it only does so for duplicates, and therefore
31174 only reduces ref_counts to 1. */
31175 index_location_lists (comp_unit_die ());
31178 if (addr_index_table != NULL)
31180 unsigned int index = 0;
31181 addr_index_table
31182 ->traverse_noresize<unsigned int *, index_addr_table_entry>
31183 (&index);
31187 loc_list_idx = 0;
31188 if (have_location_lists)
31190 optimize_location_lists (comp_unit_die ());
31191 /* And finally assign indexes to the entries for -gsplit-dwarf. */
31192 if (dwarf_version >= 5 && dwarf_split_debug_info)
31193 assign_location_list_indexes (comp_unit_die ());
31196 save_macinfo_strings ();
31198 if (dwarf_split_debug_info)
31200 unsigned int index = 0;
31202 /* Add attributes common to skeleton compile_units and
31203 type_units. Because these attributes include strings, it
31204 must be done before freezing the string table. Top-level
31205 skeleton die attrs are added when the skeleton type unit is
31206 created, so ensure it is created by this point. */
31207 add_top_level_skeleton_die_attrs (main_comp_unit_die);
31208 debug_str_hash->traverse_noresize<unsigned int *, index_string> (&index);
31211 /* Output all of the compilation units. We put the main one last so that
31212 the offsets are available to output_pubnames. */
31213 for (node = cu_die_list; node; node = node->next)
31214 output_comp_unit (node->die, 0, NULL);
31216 hash_table<comdat_type_hasher> comdat_type_table (100);
31217 for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
31219 comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);
31221 /* Don't output duplicate types. */
31222 if (*slot != HTAB_EMPTY_ENTRY)
31223 continue;
31225 /* Add a pointer to the line table for the main compilation unit
31226 so that the debugger can make sense of DW_AT_decl_file
31227 attributes. */
31228 if (debug_info_level >= DINFO_LEVEL_TERSE)
31229 add_AT_lineptr (ctnode->root_die, DW_AT_stmt_list,
31230 (!dwarf_split_debug_info
31231 ? dl_section_ref
31232 : debug_skeleton_line_section_label));
31234 output_comdat_type_unit (ctnode);
31235 *slot = ctnode;
31238 if (dwarf_split_debug_info)
31240 int mark;
31241 struct md5_ctx ctx;
31243 if (dwarf_version >= 5 && !vec_safe_is_empty (ranges_table))
31244 index_rnglists ();
31246 /* Compute a checksum of the comp_unit to use as the dwo_id. */
31247 md5_init_ctx (&ctx);
31248 mark = 0;
31249 die_checksum (comp_unit_die (), &ctx, &mark);
31250 unmark_all_dies (comp_unit_die ());
31251 md5_finish_ctx (&ctx, checksum);
31253 if (dwarf_version < 5)
31255 /* Use the first 8 bytes of the checksum as the dwo_id,
31256 and add it to both comp-unit DIEs. */
31257 add_AT_data8 (main_comp_unit_die, DW_AT_GNU_dwo_id, checksum);
31258 add_AT_data8 (comp_unit_die (), DW_AT_GNU_dwo_id, checksum);
31261 /* Add the base offset of the ranges table to the skeleton
31262 comp-unit DIE. */
31263 if (!vec_safe_is_empty (ranges_table))
31265 if (dwarf_version >= 5)
31266 add_AT_lineptr (main_comp_unit_die, DW_AT_rnglists_base,
31267 ranges_base_label);
31268 else
31269 add_AT_lineptr (main_comp_unit_die, DW_AT_GNU_ranges_base,
31270 ranges_section_label);
31273 switch_to_section (debug_addr_section);
31274 ASM_OUTPUT_LABEL (asm_out_file, debug_addr_section_label);
31275 output_addr_table ();
31278 /* Output the main compilation unit if non-empty or if .debug_macinfo
31279 or .debug_macro will be emitted. */
31280 output_comp_unit (comp_unit_die (), have_macinfo,
31281 dwarf_split_debug_info ? checksum : NULL);
31283 if (dwarf_split_debug_info && info_section_emitted)
31284 output_skeleton_debug_sections (main_comp_unit_die, checksum);
31286 /* Output the abbreviation table. */
31287 if (vec_safe_length (abbrev_die_table) != 1)
31289 switch_to_section (debug_abbrev_section);
31290 ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
31291 output_abbrev_section ();
31294 /* Output location list section if necessary. */
31295 if (have_location_lists)
31297 char l1[MAX_ARTIFICIAL_LABEL_BYTES];
31298 char l2[MAX_ARTIFICIAL_LABEL_BYTES];
31299 /* Output the location lists info. */
31300 switch_to_section (debug_loc_section);
31301 if (dwarf_version >= 5)
31303 ASM_GENERATE_INTERNAL_LABEL (l1, DEBUG_LOC_SECTION_LABEL, 1);
31304 ASM_GENERATE_INTERNAL_LABEL (l2, DEBUG_LOC_SECTION_LABEL, 2);
31305 if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
31306 dw2_asm_output_data (4, 0xffffffff,
31307 "Initial length escape value indicating "
31308 "64-bit DWARF extension");
31309 dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1,
31310 "Length of Location Lists");
31311 ASM_OUTPUT_LABEL (asm_out_file, l1);
31312 output_dwarf_version ();
31313 dw2_asm_output_data (1, DWARF2_ADDR_SIZE, "Address Size");
31314 dw2_asm_output_data (1, 0, "Segment Size");
31315 dw2_asm_output_data (4, dwarf_split_debug_info ? loc_list_idx : 0,
31316 "Offset Entry Count");
31318 ASM_OUTPUT_LABEL (asm_out_file, loc_section_label);
31319 if (dwarf_version >= 5 && dwarf_split_debug_info)
31321 unsigned int save_loc_list_idx = loc_list_idx;
31322 loc_list_idx = 0;
31323 output_loclists_offsets (comp_unit_die ());
31324 gcc_assert (save_loc_list_idx == loc_list_idx);
31326 output_location_lists (comp_unit_die ());
31327 if (dwarf_version >= 5)
31328 ASM_OUTPUT_LABEL (asm_out_file, l2);
31331 output_pubtables ();
31333 /* Output the address range information if a CU (.debug_info section)
31334 was emitted. We output an empty table even if we had no functions
31335 to put in it. This because the consumer has no way to tell the
31336 difference between an empty table that we omitted and failure to
31337 generate a table that would have contained data. */
31338 if (info_section_emitted)
31340 switch_to_section (debug_aranges_section);
31341 output_aranges ();
31344 /* Output ranges section if necessary. */
31345 if (!vec_safe_is_empty (ranges_table))
31347 if (dwarf_version >= 5)
31348 output_rnglists (generation);
31349 else
31350 output_ranges ();
31353 /* Have to end the macro section. */
31354 if (have_macinfo)
31356 switch_to_section (debug_macinfo_section);
31357 ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
31358 output_macinfo (!dwarf_split_debug_info ? debug_line_section_label
31359 : debug_skeleton_line_section_label, false);
31360 dw2_asm_output_data (1, 0, "End compilation unit");
31363 /* Output the source line correspondence table. We must do this
31364 even if there is no line information. Otherwise, on an empty
31365 translation unit, we will generate a present, but empty,
31366 .debug_info section. IRIX 6.5 `nm' will then complain when
31367 examining the file. This is done late so that any filenames
31368 used by the debug_info section are marked as 'used'. */
31369 switch_to_section (debug_line_section);
31370 ASM_OUTPUT_LABEL (asm_out_file, debug_line_section_label);
31371 if (! output_asm_line_debug_info ())
31372 output_line_info (false);
31374 if (dwarf_split_debug_info && info_section_emitted)
31376 switch_to_section (debug_skeleton_line_section);
31377 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
31378 output_line_info (true);
31381 /* If we emitted any indirect strings, output the string table too. */
31382 if (debug_str_hash || skeleton_debug_str_hash)
31383 output_indirect_strings ();
31384 if (debug_line_str_hash)
31386 switch_to_section (debug_line_str_section);
31387 const enum dwarf_form form = DW_FORM_line_strp;
31388 debug_line_str_hash->traverse<enum dwarf_form,
31389 output_indirect_string> (form);
31392 /* ??? Move lvugid out of dwarf2out_source_line and reset it too? */
31393 symview_upper_bound = 0;
31394 if (zero_view_p)
31395 bitmap_clear (zero_view_p);
31398 /* Returns a hash value for X (which really is a variable_value_struct). */
31400 inline hashval_t
31401 variable_value_hasher::hash (variable_value_struct *x)
31403 return (hashval_t) x->decl_id;
31406 /* Return nonzero if decl_id of variable_value_struct X is the same as
31407 UID of decl Y. */
31409 inline bool
31410 variable_value_hasher::equal (variable_value_struct *x, tree y)
31412 return x->decl_id == DECL_UID (y);
31415 /* Helper function for resolve_variable_value, handle
31416 DW_OP_GNU_variable_value in one location expression.
31417 Return true if exprloc has been changed into loclist. */
31419 static bool
31420 resolve_variable_value_in_expr (dw_attr_node *a, dw_loc_descr_ref loc)
31422 dw_loc_descr_ref next;
31423 for (dw_loc_descr_ref prev = NULL; loc; prev = loc, loc = next)
31425 next = loc->dw_loc_next;
31426 if (loc->dw_loc_opc != DW_OP_GNU_variable_value
31427 || loc->dw_loc_oprnd1.val_class != dw_val_class_decl_ref)
31428 continue;
31430 tree decl = loc->dw_loc_oprnd1.v.val_decl_ref;
31431 if (DECL_CONTEXT (decl) != current_function_decl)
31432 continue;
31434 dw_die_ref ref = lookup_decl_die (decl);
31435 if (ref)
31437 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31438 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31439 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31440 continue;
31442 dw_loc_list_ref l = loc_list_from_tree (decl, 0, NULL);
31443 if (l == NULL)
31444 continue;
31445 if (l->dw_loc_next)
31447 if (AT_class (a) != dw_val_class_loc)
31448 continue;
31449 switch (a->dw_attr)
31451 /* Following attributes allow both exprloc and loclist
31452 classes, so we can change them into a loclist. */
31453 case DW_AT_location:
31454 case DW_AT_string_length:
31455 case DW_AT_return_addr:
31456 case DW_AT_data_member_location:
31457 case DW_AT_frame_base:
31458 case DW_AT_segment:
31459 case DW_AT_static_link:
31460 case DW_AT_use_location:
31461 case DW_AT_vtable_elem_location:
31462 if (prev)
31464 prev->dw_loc_next = NULL;
31465 prepend_loc_descr_to_each (l, AT_loc (a));
31467 if (next)
31468 add_loc_descr_to_each (l, next);
31469 a->dw_attr_val.val_class = dw_val_class_loc_list;
31470 a->dw_attr_val.val_entry = NULL;
31471 a->dw_attr_val.v.val_loc_list = l;
31472 have_location_lists = true;
31473 return true;
31474 /* Following attributes allow both exprloc and reference,
31475 so if the whole expression is DW_OP_GNU_variable_value alone
31476 we could transform it into reference. */
31477 case DW_AT_byte_size:
31478 case DW_AT_bit_size:
31479 case DW_AT_lower_bound:
31480 case DW_AT_upper_bound:
31481 case DW_AT_bit_stride:
31482 case DW_AT_count:
31483 case DW_AT_allocated:
31484 case DW_AT_associated:
31485 case DW_AT_byte_stride:
31486 if (prev == NULL && next == NULL)
31487 break;
31488 /* FALLTHRU */
31489 default:
31490 if (dwarf_strict)
31491 continue;
31492 break;
31494 /* Create DW_TAG_variable that we can refer to. */
31495 gen_decl_die (decl, NULL_TREE, NULL,
31496 lookup_decl_die (current_function_decl));
31497 ref = lookup_decl_die (decl);
31498 if (ref)
31500 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31501 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31502 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31504 continue;
31506 if (prev)
31508 prev->dw_loc_next = l->expr;
31509 add_loc_descr (&prev->dw_loc_next, next);
31510 free_loc_descr (loc, NULL);
31511 next = prev->dw_loc_next;
31513 else
31515 memcpy (loc, l->expr, sizeof (dw_loc_descr_node));
31516 add_loc_descr (&loc, next);
31517 next = loc;
31519 loc = prev;
31521 return false;
31524 /* Attempt to resolve DW_OP_GNU_variable_value using loc_list_from_tree. */
31526 static void
31527 resolve_variable_value (dw_die_ref die)
31529 dw_attr_node *a;
31530 dw_loc_list_ref loc;
31531 unsigned ix;
31533 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
31534 switch (AT_class (a))
31536 case dw_val_class_loc:
31537 if (!resolve_variable_value_in_expr (a, AT_loc (a)))
31538 break;
31539 /* FALLTHRU */
31540 case dw_val_class_loc_list:
31541 loc = AT_loc_list (a);
31542 gcc_assert (loc);
31543 for (; loc; loc = loc->dw_loc_next)
31544 resolve_variable_value_in_expr (a, loc->expr);
31545 break;
31546 default:
31547 break;
31551 /* Attempt to optimize DW_OP_GNU_variable_value refering to
31552 temporaries in the current function. */
31554 static void
31555 resolve_variable_values (void)
31557 if (!variable_value_hash || !current_function_decl)
31558 return;
31560 struct variable_value_struct *node
31561 = variable_value_hash->find_with_hash (current_function_decl,
31562 DECL_UID (current_function_decl));
31564 if (node == NULL)
31565 return;
31567 unsigned int i;
31568 dw_die_ref die;
31569 FOR_EACH_VEC_SAFE_ELT (node->dies, i, die)
31570 resolve_variable_value (die);
31573 /* Helper function for note_variable_value, handle one location
31574 expression. */
31576 static void
31577 note_variable_value_in_expr (dw_die_ref die, dw_loc_descr_ref loc)
31579 for (; loc; loc = loc->dw_loc_next)
31580 if (loc->dw_loc_opc == DW_OP_GNU_variable_value
31581 && loc->dw_loc_oprnd1.val_class == dw_val_class_decl_ref)
31583 tree decl = loc->dw_loc_oprnd1.v.val_decl_ref;
31584 dw_die_ref ref = lookup_decl_die (decl);
31585 if (! ref && (flag_generate_lto || flag_generate_offload))
31587 /* ??? This is somewhat a hack because we do not create DIEs
31588 for variables not in BLOCK trees early but when generating
31589 early LTO output we need the dw_val_class_decl_ref to be
31590 fully resolved. For fat LTO objects we'd also like to
31591 undo this after LTO dwarf output. */
31592 gcc_assert (DECL_CONTEXT (decl));
31593 dw_die_ref ctx = lookup_decl_die (DECL_CONTEXT (decl));
31594 gcc_assert (ctx != NULL);
31595 gen_decl_die (decl, NULL_TREE, NULL, ctx);
31596 ref = lookup_decl_die (decl);
31597 gcc_assert (ref != NULL);
31599 if (ref)
31601 loc->dw_loc_oprnd1.val_class = dw_val_class_die_ref;
31602 loc->dw_loc_oprnd1.v.val_die_ref.die = ref;
31603 loc->dw_loc_oprnd1.v.val_die_ref.external = 0;
31604 continue;
31606 if (VAR_P (decl)
31607 && DECL_CONTEXT (decl)
31608 && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
31609 && lookup_decl_die (DECL_CONTEXT (decl)))
31611 if (!variable_value_hash)
31612 variable_value_hash
31613 = hash_table<variable_value_hasher>::create_ggc (10);
31615 tree fndecl = DECL_CONTEXT (decl);
31616 struct variable_value_struct *node;
31617 struct variable_value_struct **slot
31618 = variable_value_hash->find_slot_with_hash (fndecl,
31619 DECL_UID (fndecl),
31620 INSERT);
31621 if (*slot == NULL)
31623 node = ggc_cleared_alloc<variable_value_struct> ();
31624 node->decl_id = DECL_UID (fndecl);
31625 *slot = node;
31627 else
31628 node = *slot;
31630 vec_safe_push (node->dies, die);
31635 /* Walk the tree DIE and note DIEs with DW_OP_GNU_variable_value still
31636 with dw_val_class_decl_ref operand. */
31638 static void
31639 note_variable_value (dw_die_ref die)
31641 dw_die_ref c;
31642 dw_attr_node *a;
31643 dw_loc_list_ref loc;
31644 unsigned ix;
31646 FOR_EACH_VEC_SAFE_ELT (die->die_attr, ix, a)
31647 switch (AT_class (a))
31649 case dw_val_class_loc_list:
31650 loc = AT_loc_list (a);
31651 gcc_assert (loc);
31652 if (!loc->noted_variable_value)
31654 loc->noted_variable_value = 1;
31655 for (; loc; loc = loc->dw_loc_next)
31656 note_variable_value_in_expr (die, loc->expr);
31658 break;
31659 case dw_val_class_loc:
31660 note_variable_value_in_expr (die, AT_loc (a));
31661 break;
31662 default:
31663 break;
31666 /* Mark children. */
31667 FOR_EACH_CHILD (die, c, note_variable_value (c));
31670 /* Perform any cleanups needed after the early debug generation pass
31671 has run. */
31673 static void
31674 dwarf2out_early_finish (const char *filename)
31676 set_early_dwarf s;
31678 /* PCH might result in DW_AT_producer string being restored from the
31679 header compilation, so always fill it with empty string initially
31680 and overwrite only here. */
31681 dw_attr_node *producer = get_AT (comp_unit_die (), DW_AT_producer);
31682 producer_string = gen_producer_string ();
31683 producer->dw_attr_val.v.val_str->refcount--;
31684 producer->dw_attr_val.v.val_str = find_AT_string (producer_string);
31686 /* Add the name for the main input file now. We delayed this from
31687 dwarf2out_init to avoid complications with PCH. */
31688 add_name_attribute (comp_unit_die (), remap_debug_filename (filename));
31689 add_comp_dir_attribute (comp_unit_die ());
31691 /* When emitting DWARF5 .debug_line_str, move DW_AT_name and
31692 DW_AT_comp_dir into .debug_line_str section. */
31693 if (!dwarf2out_as_loc_support
31694 && dwarf_version >= 5
31695 && DWARF5_USE_DEBUG_LINE_STR)
31697 for (int i = 0; i < 2; i++)
31699 dw_attr_node *a = get_AT (comp_unit_die (),
31700 i ? DW_AT_comp_dir : DW_AT_name);
31701 if (a == NULL
31702 || AT_class (a) != dw_val_class_str
31703 || strlen (AT_string (a)) + 1 <= DWARF_OFFSET_SIZE)
31704 continue;
31706 if (! debug_line_str_hash)
31707 debug_line_str_hash
31708 = hash_table<indirect_string_hasher>::create_ggc (10);
31710 struct indirect_string_node *node
31711 = find_AT_string_in_table (AT_string (a), debug_line_str_hash);
31712 set_indirect_string (node);
31713 node->form = DW_FORM_line_strp;
31714 a->dw_attr_val.v.val_str->refcount--;
31715 a->dw_attr_val.v.val_str = node;
31719 /* With LTO early dwarf was really finished at compile-time, so make
31720 sure to adjust the phase after annotating the LTRANS CU DIE. */
31721 if (in_lto_p)
31723 early_dwarf_finished = true;
31724 return;
31727 /* Walk through the list of incomplete types again, trying once more to
31728 emit full debugging info for them. */
31729 retry_incomplete_types ();
31731 /* The point here is to flush out the limbo list so that it is empty
31732 and we don't need to stream it for LTO. */
31733 flush_limbo_die_list ();
31735 gen_scheduled_generic_parms_dies ();
31736 gen_remaining_tmpl_value_param_die_attribute ();
31738 /* Add DW_AT_linkage_name for all deferred DIEs. */
31739 for (limbo_die_node *node = deferred_asm_name; node; node = node->next)
31741 tree decl = node->created_for;
31742 if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl)
31743 /* A missing DECL_ASSEMBLER_NAME can be a constant DIE that
31744 ended up in deferred_asm_name before we knew it was
31745 constant and never written to disk. */
31746 && DECL_ASSEMBLER_NAME (decl))
31748 add_linkage_attr (node->die, decl);
31749 move_linkage_attr (node->die);
31752 deferred_asm_name = NULL;
31754 if (flag_eliminate_unused_debug_types)
31755 prune_unused_types ();
31757 /* Generate separate COMDAT sections for type DIEs. */
31758 if (use_debug_types)
31760 break_out_comdat_types (comp_unit_die ());
31762 /* Each new type_unit DIE was added to the limbo die list when created.
31763 Since these have all been added to comdat_type_list, clear the
31764 limbo die list. */
31765 limbo_die_list = NULL;
31767 /* For each new comdat type unit, copy declarations for incomplete
31768 types to make the new unit self-contained (i.e., no direct
31769 references to the main compile unit). */
31770 for (comdat_type_node *ctnode = comdat_type_list;
31771 ctnode != NULL; ctnode = ctnode->next)
31772 copy_decls_for_unworthy_types (ctnode->root_die);
31773 copy_decls_for_unworthy_types (comp_unit_die ());
31775 /* In the process of copying declarations from one unit to another,
31776 we may have left some declarations behind that are no longer
31777 referenced. Prune them. */
31778 prune_unused_types ();
31781 /* Traverse the DIE's and note DIEs with DW_OP_GNU_variable_value still
31782 with dw_val_class_decl_ref operand. */
31783 note_variable_value (comp_unit_die ());
31784 for (limbo_die_node *node = cu_die_list; node; node = node->next)
31785 note_variable_value (node->die);
31786 for (comdat_type_node *ctnode = comdat_type_list; ctnode != NULL;
31787 ctnode = ctnode->next)
31788 note_variable_value (ctnode->root_die);
31789 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31790 note_variable_value (node->die);
31792 /* The AT_pubnames attribute needs to go in all skeleton dies, including
31793 both the main_cu and all skeleton TUs. Making this call unconditional
31794 would end up either adding a second copy of the AT_pubnames attribute, or
31795 requiring a special case in add_top_level_skeleton_die_attrs. */
31796 if (!dwarf_split_debug_info)
31797 add_AT_pubnames (comp_unit_die ());
31799 /* The early debug phase is now finished. */
31800 early_dwarf_finished = true;
31802 /* Do not generate DWARF assembler now when not producing LTO bytecode. */
31803 if (!flag_generate_lto && !flag_generate_offload)
31804 return;
31806 /* Now as we are going to output for LTO initialize sections and labels
31807 to the LTO variants. We don't need a random-seed postfix as other
31808 LTO sections as linking the LTO debug sections into one in a partial
31809 link is fine. */
31810 init_sections_and_labels (true);
31812 /* The output below is modeled after dwarf2out_finish with all
31813 location related output removed and some LTO specific changes.
31814 Some refactoring might make both smaller and easier to match up. */
31816 /* Traverse the DIE's and add add sibling attributes to those DIE's
31817 that have children. */
31818 add_sibling_attributes (comp_unit_die ());
31819 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31820 add_sibling_attributes (node->die);
31821 for (comdat_type_node *ctnode = comdat_type_list;
31822 ctnode != NULL; ctnode = ctnode->next)
31823 add_sibling_attributes (ctnode->root_die);
31825 if (have_macinfo)
31826 add_AT_macptr (comp_unit_die (), DEBUG_MACRO_ATTRIBUTE,
31827 macinfo_section_label);
31829 save_macinfo_strings ();
31831 if (dwarf_split_debug_info)
31833 unsigned int index = 0;
31834 debug_str_hash->traverse_noresize<unsigned int *, index_string> (&index);
31837 /* Output all of the compilation units. We put the main one last so that
31838 the offsets are available to output_pubnames. */
31839 for (limbo_die_node *node = limbo_die_list; node; node = node->next)
31840 output_comp_unit (node->die, 0, NULL);
31842 hash_table<comdat_type_hasher> comdat_type_table (100);
31843 for (comdat_type_node *ctnode = comdat_type_list;
31844 ctnode != NULL; ctnode = ctnode->next)
31846 comdat_type_node **slot = comdat_type_table.find_slot (ctnode, INSERT);
31848 /* Don't output duplicate types. */
31849 if (*slot != HTAB_EMPTY_ENTRY)
31850 continue;
31852 /* Add a pointer to the line table for the main compilation unit
31853 so that the debugger can make sense of DW_AT_decl_file
31854 attributes. */
31855 if (debug_info_level >= DINFO_LEVEL_TERSE)
31856 add_AT_lineptr (ctnode->root_die, DW_AT_stmt_list,
31857 (!dwarf_split_debug_info
31858 ? debug_line_section_label
31859 : debug_skeleton_line_section_label));
31861 output_comdat_type_unit (ctnode);
31862 *slot = ctnode;
31865 /* Stick a unique symbol to the main debuginfo section. */
31866 compute_comp_unit_symbol (comp_unit_die ());
31868 /* Output the main compilation unit. We always need it if only for
31869 the CU symbol. */
31870 output_comp_unit (comp_unit_die (), true, NULL);
31872 /* Output the abbreviation table. */
31873 if (vec_safe_length (abbrev_die_table) != 1)
31875 switch_to_section (debug_abbrev_section);
31876 ASM_OUTPUT_LABEL (asm_out_file, abbrev_section_label);
31877 output_abbrev_section ();
31880 /* Have to end the macro section. */
31881 if (have_macinfo)
31883 /* We have to save macinfo state if we need to output it again
31884 for the FAT part of the object. */
31885 vec<macinfo_entry, va_gc> *saved_macinfo_table = macinfo_table;
31886 if (flag_fat_lto_objects)
31887 macinfo_table = macinfo_table->copy ();
31889 switch_to_section (debug_macinfo_section);
31890 ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label);
31891 output_macinfo (debug_skeleton_line_section_label, true);
31892 dw2_asm_output_data (1, 0, "End compilation unit");
31894 /* Emit a skeleton debug_line section. */
31895 switch_to_section (debug_skeleton_line_section);
31896 ASM_OUTPUT_LABEL (asm_out_file, debug_skeleton_line_section_label);
31897 output_line_info (true);
31899 if (flag_fat_lto_objects)
31901 vec_free (macinfo_table);
31902 macinfo_table = saved_macinfo_table;
31907 /* If we emitted any indirect strings, output the string table too. */
31908 if (debug_str_hash || skeleton_debug_str_hash)
31909 output_indirect_strings ();
31911 /* Switch back to the text section. */
31912 switch_to_section (text_section);
31915 /* Reset all state within dwarf2out.c so that we can rerun the compiler
31916 within the same process. For use by toplev::finalize. */
31918 void
31919 dwarf2out_c_finalize (void)
31921 last_var_location_insn = NULL;
31922 cached_next_real_insn = NULL;
31923 used_rtx_array = NULL;
31924 incomplete_types = NULL;
31925 decl_scope_table = NULL;
31926 debug_info_section = NULL;
31927 debug_skeleton_info_section = NULL;
31928 debug_abbrev_section = NULL;
31929 debug_skeleton_abbrev_section = NULL;
31930 debug_aranges_section = NULL;
31931 debug_addr_section = NULL;
31932 debug_macinfo_section = NULL;
31933 debug_line_section = NULL;
31934 debug_skeleton_line_section = NULL;
31935 debug_loc_section = NULL;
31936 debug_pubnames_section = NULL;
31937 debug_pubtypes_section = NULL;
31938 debug_str_section = NULL;
31939 debug_line_str_section = NULL;
31940 debug_str_dwo_section = NULL;
31941 debug_str_offsets_section = NULL;
31942 debug_ranges_section = NULL;
31943 debug_frame_section = NULL;
31944 fde_vec = NULL;
31945 debug_str_hash = NULL;
31946 debug_line_str_hash = NULL;
31947 skeleton_debug_str_hash = NULL;
31948 dw2_string_counter = 0;
31949 have_multiple_function_sections = false;
31950 text_section_used = false;
31951 cold_text_section_used = false;
31952 cold_text_section = NULL;
31953 current_unit_personality = NULL;
31955 early_dwarf = false;
31956 early_dwarf_finished = false;
31958 next_die_offset = 0;
31959 single_comp_unit_die = NULL;
31960 comdat_type_list = NULL;
31961 limbo_die_list = NULL;
31962 file_table = NULL;
31963 decl_die_table = NULL;
31964 common_block_die_table = NULL;
31965 decl_loc_table = NULL;
31966 call_arg_locations = NULL;
31967 call_arg_loc_last = NULL;
31968 call_site_count = -1;
31969 tail_call_site_count = -1;
31970 cached_dw_loc_list_table = NULL;
31971 abbrev_die_table = NULL;
31972 delete dwarf_proc_stack_usage_map;
31973 dwarf_proc_stack_usage_map = NULL;
31974 line_info_label_num = 0;
31975 cur_line_info_table = NULL;
31976 text_section_line_info = NULL;
31977 cold_text_section_line_info = NULL;
31978 separate_line_info = NULL;
31979 info_section_emitted = false;
31980 pubname_table = NULL;
31981 pubtype_table = NULL;
31982 macinfo_table = NULL;
31983 ranges_table = NULL;
31984 ranges_by_label = NULL;
31985 rnglist_idx = 0;
31986 have_location_lists = false;
31987 loclabel_num = 0;
31988 poc_label_num = 0;
31989 last_emitted_file = NULL;
31990 label_num = 0;
31991 tmpl_value_parm_die_table = NULL;
31992 generic_type_instances = NULL;
31993 frame_pointer_fb_offset = 0;
31994 frame_pointer_fb_offset_valid = false;
31995 base_types.release ();
31996 XDELETEVEC (producer_string);
31997 producer_string = NULL;
32000 #include "gt-dwarf2out.h"