summaryrefslogtreecommitdiff
path: root/gcc/dbxout.c
diff options
context:
space:
mode:
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-27 01:49:01 +0000
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2005-01-27 01:49:01 +0000
commita607ffb19c99cfa6acf803b51544b334c9f2fef7 (patch)
treeeaa07f07a8bac1d3a3fb744243c80780d71c498f /gcc/dbxout.c
parent9ef37fb8f2f7d59e1f9898a128f346325c366c07 (diff)
downloadgcc-a607ffb19c99cfa6acf803b51544b334c9f2fef7.tar.gz
ChangeLog:
* dbxout.c (dbxout_symbol_location): Resolve constant pool references even for variables with NULL DECL_INITIAL. testsuite/ChangeLog: * gcc.dg/20041216-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@94303 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dbxout.c')
-rw-r--r--gcc/dbxout.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index 8c2d6eac5e4..d4c78e99c9f 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -2733,6 +2733,37 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
letter = decl_function_context (decl) ? 'V' : 'S';
+ /* Some ports can transform a symbol ref into a label ref,
+ because the symbol ref is too far away and has to be
+ dumped into a constant pool. Alternatively, the symbol
+ in the constant pool might be referenced by a different
+ symbol. */
+ if (GET_CODE (addr) == SYMBOL_REF
+ && CONSTANT_POOL_ADDRESS_P (addr))
+ {
+ bool marked;
+ rtx tmp = get_pool_constant_mark (addr, &marked);
+
+ if (GET_CODE (tmp) == SYMBOL_REF)
+ {
+ addr = tmp;
+ if (CONSTANT_POOL_ADDRESS_P (addr))
+ get_pool_constant_mark (addr, &marked);
+ else
+ marked = true;
+ }
+ else if (GET_CODE (tmp) == LABEL_REF)
+ {
+ addr = tmp;
+ marked = true;
+ }
+
+ /* If all references to the constant pool were optimized
+ out, we just ignore the symbol. */
+ if (!marked)
+ return 0;
+ }
+
/* This should be the same condition as in assemble_variable, but
we don't have access to dont_output_data here. So, instead,
we rely on the fact that error_mark_node initializers always
@@ -2747,37 +2778,6 @@ dbxout_symbol_location (tree decl, tree type, const char *suffix, rtx home)
code = DBX_STATIC_CONST_VAR_CODE;
else
{
- /* Some ports can transform a symbol ref into a label ref,
- because the symbol ref is too far away and has to be
- dumped into a constant pool. Alternatively, the symbol
- in the constant pool might be referenced by a different
- symbol. */
- if (GET_CODE (addr) == SYMBOL_REF
- && CONSTANT_POOL_ADDRESS_P (addr))
- {
- bool marked;
- rtx tmp = get_pool_constant_mark (addr, &marked);
-
- if (GET_CODE (tmp) == SYMBOL_REF)
- {
- addr = tmp;
- if (CONSTANT_POOL_ADDRESS_P (addr))
- get_pool_constant_mark (addr, &marked);
- else
- marked = true;
- }
- else if (GET_CODE (tmp) == LABEL_REF)
- {
- addr = tmp;
- marked = true;
- }
-
- /* If all references to the constant pool were optimized
- out, we just ignore the symbol. */
- if (!marked)
- return 0;
- }
-
/* Ultrix `as' seems to need this. */
#ifdef DBX_STATIC_STAB_DATA_SECTION
data_section ();