diff options
author | Jim Wilson <wilson@cygnus.com> | 2000-08-24 20:44:04 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2000-08-24 13:44:04 -0700 |
commit | 7c866fb5223248c7f8ebf7bb462da9e765557f20 (patch) | |
tree | b1d5ad722d9a2c82f1db05497d001f22f2723bc6 | |
parent | 3f2b640a7a144e5ae52a84c3217abdccc5bdb199 (diff) | |
download | gcc-7c866fb5223248c7f8ebf7bb462da9e765557f20.zip gcc-7c866fb5223248c7f8ebf7bb462da9e765557f20.tar.gz gcc-7c866fb5223248c7f8ebf7bb462da9e765557f20.tar.bz2 |
Fix bfd/archive.c miscompilation.
* config/ia64/ia64.md (movdi): Don't call gen_movdi_symbolic if
we have a SYMBOL_REF with SYMBOL_REF_FLAG set.
From-SVN: r35955
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.md | 10 |
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29a0c03..3a3ed67 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-08-24 Jim Wilson <wilson@cygnus.com> + + * config/ia64/ia64.md (movdi): Don't call gen_movdi_symbolic if + we have a SYMBOL_REF with SYMBOL_REF_FLAG set. + 2000-08-24 Jason Merrill <jason@redhat.com> * dwarf2out.c (AT_flag, AT_int, AT_unsigned, AT_string, AT_ref, diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index 3afddea..5057ba0 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -358,7 +358,15 @@ type of PIC address load. If this function gets deferred, we may acquire information that changes the value of the sdata_symbolic_operand predicate. */ - if (rtx_equal_function_value_matters) + /* But don't delay for function pointers. Loading a function address + actually loads the address of the descriptor not the function. + If we represent these as SYMBOL_REFs, then they get cse'd with + calls, and we end up with calls to the descriptor address instead of + calls to the function address. Functions are not candidates for + sdata anyways. */ + if (rtx_equal_function_value_matters + && ! (GET_CODE (operands[1]) == SYMBOL_REF + && SYMBOL_REF_FLAG (operands[1]))) emit_insn (gen_movdi_symbolic (operands[0], operands[1])); else ia64_expand_load_address (operands[0], operands[1]); |