aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>2000-08-24 20:44:04 +0000
committerJim Wilson <wilson@gcc.gnu.org>2000-08-24 13:44:04 -0700
commit7c866fb5223248c7f8ebf7bb462da9e765557f20 (patch)
treeb1d5ad722d9a2c82f1db05497d001f22f2723bc6
parent3f2b640a7a144e5ae52a84c3217abdccc5bdb199 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/ia64/ia64.md10
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]);