diff options
author | Craig Burley <craig@jcb-sc.com> | 1999-05-09 22:33:09 +0000 |
---|---|---|
committer | Craig Burley <burley@gcc.gnu.org> | 1999-05-09 18:33:09 -0400 |
commit | 0e3df013838bbdda708670f1dd2d53806e7c4c37 (patch) | |
tree | 8603463cc204a9f6c71beec7b3187fc890e892c6 /gcc | |
parent | 26837cfb5be067b824ff23df644628fc035a132b (diff) | |
download | gcc-0e3df013838bbdda708670f1dd2d53806e7c4c37.zip gcc-0e3df013838bbdda708670f1dd2d53806e7c4c37.tar.gz gcc-0e3df013838bbdda708670f1dd2d53806e7c4c37.tar.bz2 |
Add some transitive closure
From-SVN: r26850
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/varasm.c | 27 |
2 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 40d12c7..8e7cc8e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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: diff --git a/gcc/varasm.c b/gcc/varasm.c index 84746f6..e4eef2d 100644 --- a/gcc/varasm.c +++ b/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 |