Produce ELF::R_386_GOTPC relocations.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 18 Oct 2010 18:36:12 +0000 (18:36 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 18 Oct 2010 18:36:12 +0000 (18:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116728 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
lib/Target/X86/X86AsmBackend.cpp
test/MC/ELF/relocation-386.s

index 45e9c3b3d3179274100374406ac4348c392c266e..2eb62080e16da5f555d00be971848126a3707cda 100644 (file)
@@ -707,7 +707,12 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
           break;
         }
         break;
-      case FK_Data_4: Type = ELF::R_386_32; break;
+      case FK_Data_4:
+        if (Symbol->getName() == "_GLOBAL_OFFSET_TABLE_")
+          Type = ELF::R_386_GOTPC;
+        else
+          Type = ELF::R_386_32;
+        break;
       case FK_Data_2: Type = ELF::R_386_16; break;
       case X86::reloc_pcrel_1byte:
       case FK_Data_1: Type = ELF::R_386_8; break;
index 853d3ed159f323d817223aef9a7cde20f58f0c63..83fca5141e19ee0c3c9c7d3779cd34a7edbe318f 100644 (file)
@@ -72,6 +72,11 @@ static unsigned getRelaxedOpcode(unsigned Op) {
   default:
     return Op;
 
+  // This is used on i386 with things like addl $foo, %ebx
+  // FIXME: Should the other *i8 instructions be here too? If not, it might
+  // be better to just select X86::ADD32ri instead of X86::ADD32ri8.
+  case X86::ADD32ri8: return X86::ADD32ri;
+
   case X86::JAE_1: return X86::JAE_4;
   case X86::JA_1:  return X86::JA_4;
   case X86::JBE_1: return X86::JBE_4;
index 18aa9fa3d38ab6659686eda27aec5bf505ed0f1c..68dc13268dfc68589136dd2e3a40972c5477ab76 100644 (file)
 // CHECK-NEXT: (('r_offset',
 // CHECK-NEXT:  ('r_sym',
 // CHECK-NEXT:  ('r_type', 4)
+// CHECK-NEXT: ),
+// CHECK-NEXT:  # Relocation 2
+// CHECK-NEXT: (('r_offset',
+// CHECK-NEXT:  ('r_sym',
+// CHECK-NEXT:  ('r_type', 10)
+// CHECK-NEXT: ),
 
         .text
 bar:
@@ -24,6 +30,7 @@ bar:
         .global bar2
 bar2:
        calll   bar2@PLT
+       addl    $_GLOBAL_OFFSET_TABLE_, %ebx
 
         .section       .rodata.str1.16,"aMS",@progbits,1
 .Lfoo: