From eacbfaac1ea13cfe167924742d059527d7e86053 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 25 Jan 2000 05:59:18 +0000 Subject: [PATCH] * dwarf2out.c: include "varray.h", not dyn-string.h. (ASM_OUTPUT_DWARF2_ADDR_CONST, ASM_NAME_TO_STRING): Lose. (addr_const_to_string, addr_to_string): Lose. (ASM_OUTPUT_DWARF_ADDR_CONST): Copy from dwarfout.c. (struct dw_val_struct): val_addr is now an rtx. (add_AT_addr, AT_addr, free_AT, output_aranges): Adjust. (used_rtx_varray): New varray. (dwarf2out_init): Initialize it. (save_rtx): New fn. (mem_loc_descriptor, add_const_value_attribute): Call it instead of addr_to_string. * arm/telf.h, arm/unknown-elf.h, mn10200.h, mn10300.h, sparc/sp64-elf.h: Remove definition of ASM_OUTPUT_DWARF2_ADDR_CONST. * Makefile.in (dwarf2out.o): Update dependencies. * i386.c (i386_dwarf_output_addr_const): New. * i386.h (ASM_OUTPUT_DWARF_ADDR_CONST): New. * dwarf2out.c (mem_loc_descriptor): Call ASM_SIMPLIFY_DWARF_ADDR if defined. * dwarfout.c (output_mem_loc_descriptor): Likewise. * i386.c (i386_simplify_dwarf_addr): New. * i386.h (ASM_SIMPLIFY_DWARF_ADDR): New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31602 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 28 ++++++ gcc/Makefile.in | 2 +- gcc/config/arm/telf.h | 9 +- gcc/config/arm/unknown-elf.h | 5 +- gcc/config/i386/i386-protos.h | 3 + gcc/config/i386/i386.c | 45 +++++++++ gcc/config/i386/i386.h | 11 +++ gcc/config/mn10200/mn10200.h | 4 - gcc/config/mn10300/mn10300.h | 4 - gcc/config/sparc/sp64-elf.h | 5 +- gcc/dwarf2out.c | 217 +++++++++--------------------------------- gcc/dwarfout.c | 4 + 12 files changed, 140 insertions(+), 197 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7b1b6a..a3509c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,31 @@ +2000-01-24 Jason Merrill + + * dwarf2out.c: include "varray.h", not dyn-string.h. + (ASM_OUTPUT_DWARF2_ADDR_CONST, ASM_NAME_TO_STRING): Lose. + (addr_const_to_string, addr_to_string): Lose. + (ASM_OUTPUT_DWARF_ADDR_CONST): Copy from dwarfout.c. + (struct dw_val_struct): val_addr is now an rtx. + (add_AT_addr, AT_addr, free_AT, output_aranges): Adjust. + (used_rtx_varray): New varray. + (dwarf2out_init): Initialize it. + (save_rtx): New fn. + (mem_loc_descriptor, add_const_value_attribute): Call it instead of + addr_to_string. + * arm/telf.h, arm/unknown-elf.h, mn10200.h, mn10300.h, + sparc/sp64-elf.h: Remove definition of ASM_OUTPUT_DWARF2_ADDR_CONST. + * Makefile.in (dwarf2out.o): Update dependencies. + +2000-01-24 Richard Henderson + + * i386.c (i386_dwarf_output_addr_const): New. + * i386.h (ASM_OUTPUT_DWARF_ADDR_CONST): New. + + * dwarf2out.c (mem_loc_descriptor): Call ASM_SIMPLIFY_DWARF_ADDR + if defined. + * dwarfout.c (output_mem_loc_descriptor): Likewise. + * i386.c (i386_simplify_dwarf_addr): New. + * i386.h (ASM_SIMPLIFY_DWARF_ADDR): New. + Mon Jan 24 16:56:10 2000 Jim Wilson * dwarf2out.c (gen_struct_or_union_type_die): Set complete if diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 5e6b6e5..65bdbb9 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1532,7 +1532,7 @@ dwarfout.o : dwarfout.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf.h \ flags.h insn-config.h reload.h output.h defaults.h toplev.h dwarfout.h dwarf2out.o : dwarf2out.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) dwarf2.h \ flags.h insn-config.h reload.h output.h defaults.h \ - hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h dyn-string.h \ + hard-reg-set.h $(REGS_H) $(EXPR_H) toplev.h dwarf2out.h varray.h \ ggc.h except.h xcoffout.o : xcoffout.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) xcoffout.h \ flags.h toplev.h output.h dbxout.h ggc.h diff --git a/gcc/config/arm/telf.h b/gcc/config/arm/telf.h index ececd53..65a74b3 100644 --- a/gcc/config/arm/telf.h +++ b/gcc/config/arm/telf.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for Thumb with ELF obj format. - Copyright (C) 1995, 1996, 1999 Free Software Foundation, Inc. + Copyright (C) 1995, 1996, 1999, 2000 Free Software Foundation, Inc. This file is part of GNU CC. @@ -141,13 +141,6 @@ extern int arm_structure_size_boundary; dwarf2.out. */ #define UNALIGNED_WORD_ASM_OP ".4byte" -#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \ - if (((ADDR)[0] == '.') && ((ADDR)[1] == 'L')) \ - fprintf ((FILE), "\t%s\t%s", UNALIGNED_WORD_ASM_OP, (ADDR)); \ - else \ - fprintf ((FILE), "\t%s\t%s", \ - UNALIGNED_WORD_ASM_OP, (ADDR)) - #define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \ do \ { \ diff --git a/gcc/config/arm/unknown-elf.h b/gcc/config/arm/unknown-elf.h index 33bd9af..331c765 100644 --- a/gcc/config/arm/unknown-elf.h +++ b/gcc/config/arm/unknown-elf.h @@ -1,5 +1,5 @@ /* Definitions for non-Linux based ARM systems using ELF - Copyright (C) 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. Contributed by Catherine Moore This file is part of GNU CC. @@ -107,9 +107,6 @@ func_ptr __DTOR_END__[1] = { (func_ptr) 0 }; dwarf2.out. */ #define UNALIGNED_WORD_ASM_OP ".4byte" -#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \ - fprintf ((FILE), "\t%s\t%s", UNALIGNED_WORD_ASM_OP, ADDR) - #define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \ do { \ fprintf ((FILE), "\t%s\t", UNALIGNED_WORD_ASM_OP); \ diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index d589e4f..9d40768 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -82,6 +82,9 @@ extern const char *output_387_binary_op PARAMS ((rtx, rtx*)); extern const char *output_fix_trunc PARAMS ((rtx, rtx*)); extern const char *output_fp_compare PARAMS ((rtx, rtx*, int, int)); +extern void i386_dwarf_output_addr_const PARAMS ((FILE*, rtx)); +extern rtx i386_simplify_dwarf_addr PARAMS ((rtx)); + extern void ix86_expand_move PARAMS ((enum machine_mode, rtx[])); extern void ix86_expand_binary_operator PARAMS ((enum rtx_code, enum machine_mode, rtx[])); diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 2ea0fb7..a5f2524 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2818,6 +2818,51 @@ output_pic_addr_const (file, x, code) output_operand_lossage ("invalid expression as operand"); } } + +/* This is called from dwarfout.c via ASM_OUTPUT_DWARF_ADDR_CONST. + We need to handle our special PIC relocations. */ + +void +i386_dwarf_output_addr_const (file, x) + FILE *file; + rtx x; +{ + fprintf (file, "\t%s\t", INT_ASM_OP); + if (flag_pic) + output_pic_addr_const (file, x, '\0'); + else + output_addr_const (file, x); + fputc ('\n', file); +} + +/* In the name of slightly smaller debug output, and to cater to + general assembler losage, recognize PIC+GOTOFF and turn it back + into a direct symbol reference. */ + +rtx +i386_simplify_dwarf_addr (orig_x) + rtx orig_x; +{ + rtx x = orig_x; + + if (GET_CODE (x) != PLUS + || GET_CODE (XEXP (x, 0)) != REG + || GET_CODE (XEXP (x, 1)) != CONST) + return orig_x; + + x = XEXP (XEXP (x, 1), 0); + if (GET_CODE (x) == UNSPEC + && XINT (x, 1) == 7) + return XVECEXP (x, 0, 0); + + if (GET_CODE (x) == PLUS + && GET_CODE (XEXP (x, 0)) == UNSPEC + && GET_CODE (XEXP (x, 1)) == CONST_INT + && XINT (XEXP (x, 0), 1) == 7) + return gen_rtx_PLUS (VOIDmode, XVECEXP (XEXP (x, 0), 0, 0), XEXP (x, 1)); + + return orig_x; +} static void put_condition_code (code, mode, reverse, fp, file) diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 0dddfaf..c6af71f 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -2309,6 +2309,17 @@ do { long l; \ #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ fprintf (FILE, "\t%s\t%s%d-%s%d\n",ASM_LONG, LPREFIX, VALUE, LPREFIX, REL) +/* A C statement that outputs an address constant appropriate to + for DWARF debugging. */ + +#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,X) \ + i386_dwarf_output_addr_const((FILE),(X)) + +/* Either simplify a location expression, or return the original. */ + +#define ASM_SIMPLIFY_DWARF_ADDR(X) \ + i386_simplify_dwarf_addr(X) + /* Define the parentheses used to group arithmetic operations in assembler code. */ diff --git a/gcc/config/mn10200/mn10200.h b/gcc/config/mn10200/mn10200.h index a976754..60928c4 100644 --- a/gcc/config/mn10200/mn10200.h +++ b/gcc/config/mn10200/mn10200.h @@ -981,10 +981,6 @@ do { char dstr[30]; \ ((GET_CODE (X) == PLUS ? OFFSET : 0) \ + (frame_pointer_needed ? 0 : -total_frame_size ())) -/* We need to prepend underscores. */ -#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \ - fprintf ((FILE), "\t%s\t_%s", UNALIGNED_WORD_ASM_OP, (ADDR)) - /* Define to use software floating point emulator for REAL_ARITHMETIC and decimal <-> binary conversion. */ #define REAL_ARITHMETIC diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h index d79d4e7..403091e 100644 --- a/gcc/config/mn10300/mn10300.h +++ b/gcc/config/mn10300/mn10300.h @@ -1028,10 +1028,6 @@ do { char dstr[30]; \ + (frame_pointer_needed \ ? 0 : -initial_offset (ARG_POINTER_REGNUM, STACK_POINTER_REGNUM))) -/* We need to prepend underscores. */ -#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE,ADDR) \ - fprintf ((FILE), "\t%s\t_%s", UNALIGNED_WORD_ASM_OP, (ADDR)) - /* Define to use software floating point emulator for REAL_ARITHMETIC and decimal <-> binary conversion. */ #define REAL_ARITHMETIC diff --git a/gcc/config/sparc/sp64-elf.h b/gcc/config/sparc/sp64-elf.h index 4fd81c5..4ce12ed 100644 --- a/gcc/config/sparc/sp64-elf.h +++ b/gcc/config/sparc/sp64-elf.h @@ -1,5 +1,5 @@ /* Definitions of target machine for GNU compiler, for SPARC64, ELF. - Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1994, 95, 96, 97, 98, 2000 Free Software Foundation, Inc. Contributed by Doug Evans, dje@cygnus.com. This file is part of GNU CC. @@ -146,9 +146,6 @@ do { \ fputc ('\n', (FILE)); \ } while (0) -#define ASM_OUTPUT_DWARF2_ADDR_CONST(FILE, ADDR) \ - fprintf ((FILE), "\t%s\t%s", UNALIGNED_LONGLONG_ASM_OP, (ADDR)) - /* ??? Not sure if this should be 4 or 8 bytes. 4 works for now. */ #define ASM_OUTPUT_DWARF_REF(FILE, LABEL) \ do { \ diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 9c36e7e..22c515b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -53,7 +53,7 @@ Boston, MA 02111-1307, USA. */ #include "dwarf2.h" #include "dwarf2out.h" #include "toplev.h" -#include "dyn-string.h" +#include "varray.h" #include "ggc.h" #include "tm_p.h" @@ -357,19 +357,13 @@ static void dwarf2out_frame_debug_expr PARAMS ((rtx, char *)); } while (0) #endif -/* ??? This macro takes an RTX in dwarfout.c and a string in dwarf2out.c. - We resolve the conflict by creating a new macro ASM_OUTPUT_DWARF2_ADDR_CONST - for ports that want to support both DWARF1 and DWARF2. This needs a better - solution. See also the comments in sparc/sp64-elf.h. */ -#ifdef ASM_OUTPUT_DWARF2_ADDR_CONST -#undef ASM_OUTPUT_DWARF_ADDR_CONST -#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR) \ - ASM_OUTPUT_DWARF2_ADDR_CONST (FILE, ADDR) -#endif - #ifndef ASM_OUTPUT_DWARF_ADDR_CONST -#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,ADDR) \ - fprintf ((FILE), "\t%s\t%s", UNALIGNED_WORD_ASM_OP, (ADDR)) +#define ASM_OUTPUT_DWARF_ADDR_CONST(FILE,RTX) \ + do { \ + fprintf ((FILE), "\t%s\t", UNALIGNED_INT_ASM_OP); \ + output_addr_const ((FILE), (RTX)); \ + fputc ('\n', (FILE)); \ + } while (0) #endif #ifndef ASM_OUTPUT_DWARF_OFFSET4 @@ -2025,7 +2019,7 @@ typedef struct dw_val_struct dw_val_class val_class; union { - char *val_addr; + rtx val_addr; dw_loc_descr_ref val_loc; long int val_int; long unsigned val_unsigned; @@ -2330,10 +2324,14 @@ static int current_function_has_inlines; static int comp_unit_has_inlines; #endif +/* Array of RTXes referenced by the debugging information, which therefore + must be kept around forever. We do this rather than perform GC on + the dwarf info because almost all of the dwarf info lives forever, and + it's easier to support non-GC frontends this way. */ +static varray_type used_rtx_varray; + /* Forward declarations for functions defined in this file. */ -static void addr_const_to_string PARAMS ((dyn_string_t, rtx)); -static char *addr_to_string PARAMS ((rtx)); static int is_pseudo_reg PARAMS ((rtx)); static tree type_main_variant PARAMS ((tree)); static int is_tagged_type PARAMS ((tree)); @@ -2377,7 +2375,7 @@ static void add_AT_loc PARAMS ((dw_die_ref, dw_loc_descr_ref)); static void add_AT_addr PARAMS ((dw_die_ref, enum dwarf_attribute, - char *)); + rtx)); static void add_AT_lbl_id PARAMS ((dw_die_ref, enum dwarf_attribute, char *)); @@ -2614,25 +2612,6 @@ static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; #ifndef SEPARATE_LINE_CODE_LABEL #define SEPARATE_LINE_CODE_LABEL "LSM" #endif - -/* Convert a reference to the assembler name of a C-level name. This - macro has the same effect as ASM_OUTPUT_LABELREF, but copies to - a string rather than writing to a file. */ -#ifndef ASM_NAME_TO_STRING -#define ASM_NAME_TO_STRING(STR, NAME) \ - do { \ - if ((NAME)[0] == '*') \ - dyn_string_append (STR, NAME + 1); \ - else \ - { \ - const char *newstr; \ - STRIP_NAME_ENCODING (newstr, NAME); \ - dyn_string_append (STR, user_label_prefix); \ - dyn_string_append (STR, newstr); \ - } \ - } \ - while (0) -#endif /* We allow a language front-end to designate a function that is to be called to "demangle" any name before it it put into a DIE. */ @@ -2646,141 +2625,25 @@ dwarf2out_set_demangle_name_func (func) demangle_name_func = func; } -/* Convert an integer constant expression into assembler syntax. Addition - and subtraction are the only arithmetic that may appear in these - expressions. This is an adaptation of output_addr_const in final.c. - Here, the target of the conversion is a string buffer. We can't use - output_addr_const directly, because it writes to a file. */ +/* Return an rtx like ORIG which lives forever. If we're doing GC, + that means adding it to used_rtx_varray. If not, that means making + a copy on the permanent_obstack. */ -static void -addr_const_to_string (str, x) - dyn_string_t str; - rtx x; +static rtx +save_rtx (orig) + register rtx orig; { - char buf1[256]; - -restart: - switch (GET_CODE (x)) + if (ggc_p) + VARRAY_PUSH_RTX (used_rtx_varray, orig); + else { - case PC: - if (flag_pic) - dyn_string_append (str, ","); - else - abort (); - break; - - case SYMBOL_REF: - ASM_NAME_TO_STRING (str, XSTR (x, 0)); - break; - - case LABEL_REF: - ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (XEXP (x, 0))); - ASM_NAME_TO_STRING (str, buf1); - break; - - case CODE_LABEL: - ASM_GENERATE_INTERNAL_LABEL (buf1, "L", CODE_LABEL_NUMBER (x)); - ASM_NAME_TO_STRING (str, buf1); - break; - - case CONST_INT: - sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, INTVAL (x)); - dyn_string_append (str, buf1); - break; - - case CONST: - /* This used to output parentheses around the expression, but that does - not work on the 386 (either ATT or BSD assembler). */ - addr_const_to_string (str, XEXP (x, 0)); - break; - - case CONST_DOUBLE: - if (GET_MODE (x) == VOIDmode) - { - /* We can use %d if the number is one word and positive. */ - if (CONST_DOUBLE_HIGH (x)) - sprintf (buf1, HOST_WIDE_INT_PRINT_DOUBLE_HEX, - CONST_DOUBLE_HIGH (x), CONST_DOUBLE_LOW (x)); - else if (CONST_DOUBLE_LOW (x) < 0) - sprintf (buf1, HOST_WIDE_INT_PRINT_HEX, CONST_DOUBLE_LOW (x)); - else - sprintf (buf1, HOST_WIDE_INT_PRINT_DEC, - CONST_DOUBLE_LOW (x)); - dyn_string_append (str, buf1); - } - else - /* We can't handle floating point constants; PRINT_OPERAND must - handle them. */ - output_operand_lossage ("floating constant misused"); - break; - - case PLUS: - /* Some assemblers need integer constants to appear last (eg masm). */ - if (GET_CODE (XEXP (x, 0)) == CONST_INT) - { - addr_const_to_string (str, XEXP (x, 1)); - if (INTVAL (XEXP (x, 0)) >= 0) - dyn_string_append (str, "+"); - - addr_const_to_string (str, XEXP (x, 0)); - } - else - { - addr_const_to_string (str, XEXP (x, 0)); - if (INTVAL (XEXP (x, 1)) >= 0) - dyn_string_append (str, "+"); - - addr_const_to_string (str, XEXP (x, 1)); - } - break; - - case MINUS: - /* Avoid outputting things like x-x or x+5-x, since some assemblers - can't handle that. */ - x = simplify_subtraction (x); - if (GET_CODE (x) != MINUS) - goto restart; - - addr_const_to_string (str, XEXP (x, 0)); - dyn_string_append (str, "-"); - if (GET_CODE (XEXP (x, 1)) == CONST_INT - && INTVAL (XEXP (x, 1)) < 0) - { - dyn_string_append (str, ASM_OPEN_PAREN); - addr_const_to_string (str, XEXP (x, 1)); - dyn_string_append (str, ASM_CLOSE_PAREN); - } - else - addr_const_to_string (str, XEXP (x, 1)); - break; - - case ZERO_EXTEND: - case SIGN_EXTEND: - addr_const_to_string (str, XEXP (x, 0)); - break; - - default: - output_operand_lossage ("invalid expression as operand"); + push_obstacks_nochange (); + end_temporary_allocation (); + orig = copy_rtx (orig); + pop_obstacks (); } -} - -/* Convert an address constant to a string, and return a pointer to - a copy of the result, located on the heap. */ - -static char * -addr_to_string (x) - rtx x; -{ - dyn_string_t ds = dyn_string_new (256); - char *s; - addr_const_to_string (ds, x); - - /* Return the dynamically allocated string, but free the - dyn_string_t itself. */ - s = ds->s; - free (ds); - return s; + return orig; } /* Test if rtl node points to a pseudo register. */ @@ -3837,7 +3700,7 @@ static inline void add_AT_addr (die, attr_kind, addr) register dw_die_ref die; register enum dwarf_attribute attr_kind; - char *addr; + rtx addr; { register dw_attr_ref attr = (dw_attr_ref) xmalloc (sizeof (dw_attr_node)); @@ -3848,7 +3711,7 @@ add_AT_addr (die, attr_kind, addr) add_dwarf_attr (die, attr); } -static inline const char * +static inline rtx AT_addr (a) register dw_attr_ref a; { @@ -4029,7 +3892,6 @@ free_AT (a) { switch (AT_class (a)) { - case dw_val_class_addr: case dw_val_class_str: case dw_val_class_lbl_id: case dw_val_class_lbl_offset: @@ -5533,7 +5395,8 @@ output_aranges () if (loc->dw_loc_opc != DW_OP_addr) abort (); - ASM_OUTPUT_DWARF_ADDR (asm_out_file, loc->dw_loc_oprnd1.v.val_addr); + ASM_OUTPUT_DWARF_ADDR_CONST (asm_out_file, + loc->dw_loc_oprnd1.v.val_addr); } if (flag_debug_asm) @@ -6433,6 +6296,10 @@ mem_loc_descriptor (rtl, mode) actually within the array. That's *not* necessarily the same as the zeroth element of the array. */ +#ifdef ASM_SIMPLIFY_DWARF_ADDR + rtl = ASM_SIMPLIFY_DWARF_ADDR (rtl); +#endif + switch (GET_CODE (rtl)) { case POST_INC: @@ -6482,7 +6349,7 @@ mem_loc_descriptor (rtl, mode) case SYMBOL_REF: mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0); mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr; - mem_loc_result->dw_loc_oprnd1.v.val_addr = addr_to_string (rtl); + mem_loc_result->dw_loc_oprnd1.v.val_addr = save_rtx (rtl); break; case PRE_INC: @@ -6942,7 +6809,7 @@ add_const_value_attribute (die, rtl) case SYMBOL_REF: case LABEL_REF: case CONST: - add_AT_addr (die, DW_AT_const_value, addr_to_string (rtl)); + add_AT_addr (die, DW_AT_const_value, save_rtx (rtl)); break; case PLUS: @@ -9959,6 +9826,12 @@ dwarf2out_init (asm_out_file, main_input_filename) invoked when the given (base) source file was compiled. */ comp_unit_die = gen_compile_unit_die (main_input_filename); + if (ggc_p) + { + VARRAY_RTX_INIT (used_rtx_varray, 32, "used_rtx_varray"); + ggc_add_tree_varray_root (&used_rtx_varray, 1); + } + ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ABBREV_SECTION_LABEL, 0); if (DWARF2_GENERATE_TEXT_SECTION_LABEL) diff --git a/gcc/dwarfout.c b/gcc/dwarfout.c index 37d33c9..e880936 100644 --- a/gcc/dwarfout.c +++ b/gcc/dwarfout.c @@ -1715,6 +1715,10 @@ output_mem_loc_descriptor (rtl) which is actually within the array. That's *not* necessarily the same as the zeroth element of the array. */ +#ifdef ASM_SIMPLIFY_DWARF_ADDR + rtl = ASM_SIMPLIFY_DWARF_ADDR (rtl); +#endif + switch (GET_CODE (rtl)) { case SUBREG: -- 2.7.4