Add some transitive closure
From-SVN: r26850
This commit is contained in:
parent
26837cfb5b
commit
0e3df01383
@ -1,3 +1,8 @@
|
||||
Mon May 10 01:28:10 1999 Craig Burley <craig@jcb-sc.com>
|
||||
|
||||
From Fri May 7 9:31:41 1999 Donn Terry (donn@interix.com):
|
||||
* varasm.c (mark_constant_pool): Add some transitive closure.
|
||||
|
||||
Sun May 9 22:51:04 1999 Craig Burley <craig@jcb-sc.com>
|
||||
|
||||
Fix gcc.dg/990506-0.c:
|
||||
|
27
gcc/varasm.c
27
gcc/varasm.c
@ -3718,6 +3718,33 @@ mark_constant_pool ()
|
||||
insn = XEXP (insn, 1))
|
||||
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
|
||||
mark_constants (PATTERN (insn));
|
||||
|
||||
/* It's possible that the only reference to a symbol is in a symbol
|
||||
that's in the constant pool. This happens in Fortran under some
|
||||
situations. (When the constant contains the address of another
|
||||
constant, and only the first is used directly in an insn.)
|
||||
This is potentially suboptimal if there's ever a possibility of
|
||||
backwards (in pool order) 2'd level references. However, it's
|
||||
not clear that 2'd level references can happen. */
|
||||
for (pool = first_pool; pool; pool = pool->next)
|
||||
{
|
||||
struct pool_sym *sym;
|
||||
char *label;
|
||||
|
||||
/* skip unmarked entries; no insn refers to them. */
|
||||
if (!pool->mark)
|
||||
continue;
|
||||
|
||||
label = XSTR (pool->constant, 0);
|
||||
|
||||
/* Be sure the symbol's value is marked. */
|
||||
for (sym = const_rtx_sym_hash_table[SYMHASH (label)]; sym;
|
||||
sym = sym->next)
|
||||
if (sym->label == label)
|
||||
sym->pool->mark = 1;
|
||||
/* If we didn't find it, there's something truly wrong here, but it
|
||||
will be announced by the assembler. */
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user