* config/tc-ia64.c (ia64_cons_fix_new): Handle 8 byte iplt reloc
authorRichard Henderson <rth@redhat.com>
Tue, 2 Apr 2002 00:32:41 +0000 (00:32 +0000)
committerRichard Henderson <rth@redhat.com>
Tue, 2 Apr 2002 00:32:41 +0000 (00:32 +0000)
        in 32-bit mode.

gas/ChangeLog
gas/config/tc-ia64.c

index 190d0ac4277cde154751ac5f716ae9b6f7002b5d..15d070e963e967fb7bc51b46db1edc6b90026132 100644 (file)
@@ -1,3 +1,8 @@
+2002-04-01  Jessica Han  <jessica@cup.hp.com>
+
+        * config/tc-ia64.c (ia64_cons_fix_new): Handle 8 byte iplt reloc
+       in 32-bit mode.
+
 2002-03-27  Andreas Schwab  <schwab@suse.de>
 
        * config/tc-i386.c (output_jump): Set fx_pcrel_adjust to size of
index fbb166f0fc0e2119d0820f7ce2577cf0f49a6038..adffb06f701da3cc41d447e2e87453bd215a10e3 100644 (file)
@@ -9986,11 +9986,26 @@ ia64_cons_fix_new (f, where, nbytes, exp)
       break;
 
     case 8:
-      if (target_big_endian)
-       code = BFD_RELOC_IA64_DIR64MSB;
-      else
-       code = BFD_RELOC_IA64_DIR64LSB;
-      break;
+      /* In 32-bit mode, data8 could mean function descriptors too. */
+      if (exp->X_op == O_pseudo_fixup
+          && exp->X_op_symbol
+          && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
+          && !(md.flags & EF_IA_64_ABI64))
+        {
+          if (target_big_endian)
+            code = BFD_RELOC_IA64_IPLTMSB;
+          else
+            code = BFD_RELOC_IA64_IPLTLSB;
+          exp->X_op = O_symbol;
+          break;
+        }
+       else {
+         if (target_big_endian)
+          code = BFD_RELOC_IA64_DIR64MSB;
+         else
+          code = BFD_RELOC_IA64_DIR64LSB;
+         break;
+       }
 
     case 16:
       if (exp->X_op == O_pseudo_fixup