summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog28
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/config/arm/telf.h9
-rw-r--r--gcc/config/arm/unknown-elf.h5
-rw-r--r--gcc/config/i386/i386-protos.h3
-rw-r--r--gcc/config/i386/i386.c45
-rw-r--r--gcc/config/i386/i386.h11
-rw-r--r--gcc/config/mn10200/mn10200.h4
-rw-r--r--gcc/config/mn10300/mn10300.h4
-rw-r--r--gcc/config/sparc/sp64-elf.h5
-rw-r--r--gcc/dwarf2out.c217
-rw-r--r--gcc/dwarfout.c4
12 files changed, 140 insertions, 197 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c7b1b6a4919..a3509c730ce 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,31 @@
+2000-01-24 Jason Merrill <jason@casey.cygnus.com>
+
+ * 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 <rth@cygnus.com>
+
+ * 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 <wilson@cygnus.com>
* dwarf2out.c (gen_struct_or_union_type_die): Set complete if
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 5e6b6e58181..65bdbb992ca 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 ececd534406..65a74b3c6fd 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 33bd9af459d..331c765081d 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 <clm@cygnus.com>
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 d589e4f110a..9d407684679 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 2ea0fb7e99e..a5f2524bce6 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 0dddfafe222..c6af71f8180 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 a976754c0fe..60928c4dab3 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 d79d4e748a1..403091e8c5f 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 4fd81c55c47..4ce12ed7fff 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 9c36e7e43fe..22c515b7024 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 37d33c92fc5..e8809361017 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: