[x86] Support R_386_PC8, R_386_PC16 and R_X86_64_PC8
authorDavid Woodhouse <dwmw2@infradead.org>
Wed, 8 Jan 2014 12:58:40 +0000 (12:58 +0000)
committerDavid Woodhouse <dwmw2@infradead.org>
Wed, 8 Jan 2014 12:58:40 +0000 (12:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198763 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp
test/MC/ELF/relocation-386.s
test/MC/ELF/relocation.s

index 3ddd86599eb7bf4be05fdc398f59d189066425f0..64344e452182cbf05da5afc5975f4c94aed15dde 100644 (file)
@@ -57,6 +57,7 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
       case FK_Data_8: Type = ELF::R_X86_64_PC64; break;
       case FK_Data_4: Type = ELF::R_X86_64_PC32; break;
       case FK_Data_2: Type = ELF::R_X86_64_PC16; break;
+      case FK_Data_1: Type = ELF::R_X86_64_PC8; break;
 
       case FK_PCRel_8:
         assert(Modifier == MCSymbolRefExpr::VK_None);
@@ -160,6 +161,28 @@ unsigned X86ELFObjectWriter::GetRelocType(const MCValue &Target,
         Type = ELF::R_386_GOTPC;
         break;
 
+      case FK_PCRel_1:
+      case FK_Data_1:
+        switch (Modifier) {
+        default:
+          llvm_unreachable("Unimplemented");
+        case MCSymbolRefExpr::VK_None:
+          Type = ELF::R_386_PC8;
+          break;
+        }
+        break;
+
+      case FK_PCRel_2:
+      case FK_Data_2:
+        switch (Modifier) {
+        default:
+          llvm_unreachable("Unimplemented");
+        case MCSymbolRefExpr::VK_None:
+          Type = ELF::R_386_PC16;
+          break;
+        }
+        break;
+
       case X86::reloc_signed_4byte:
       case FK_PCRel_4:
       case FK_Data_4:
index 9bc831056ae30980269a15bd929dce9f5f7cffea..e8c31fc85cec87e42d3d0308b1afeb33947c00e8 100644 (file)
 // CHECK-NEXT:     0x94         R_386_GOTPC      _GLOBAL_OFFSET_TABLE_ 0x0
 // Relocation 26 (und_symbol-bar2) is of type R_386_PC32
 // CHECK-NEXT:     0x9A         R_386_PC32       und_symbol 0x0
+// Relocation 27 (und_symbol-bar2) is of type R_386_PC16
+// CHECK-NEXT:     0x9E         R_386_PC16       und_symbol 0x0
+// Relocation 28 (und_symbol-bar2) is of type R_386_PC8
+// CHECK-NEXT:     0xA0         R_386_PC8        und_symbol 0x0
 // CHECK-NEXT:   }
 // CHECK-NEXT: ]
 
@@ -120,6 +124,8 @@ bar2:
         addl foo@GOTTPOFF(%edx), %eax
         subl    _GLOBAL_OFFSET_TABLE_-bar2, %ebx
         leal und_symbol-bar2(%edx),%ecx
+        .word und_symbol-bar2
+        .byte und_symbol-bar2
 
         .section        zedsec,"awT",@progbits
 zed:
index 682307501d669eef77e765235bbb547286675eaf..6bac5913b6ee3ecc3aff129703448b4f4027e392 100644 (file)
@@ -22,6 +22,8 @@ bar:
         addq   $bar,%rax         # R_X86_64_32S
        .quad   foo@DTPOFF
         movabsq        $baz@TPOFF, %rax
+       .word   foo-bar
+       .byte   foo-bar
 
 // CHECK:        Section {
 // CHECK:          Name: .rela.text
@@ -45,6 +47,8 @@ bar:
 // CHECK-NEXT:       0x77 R_X86_64_32S .text 0x0
 // CHECK-NEXT:       0x7B R_X86_64_DTPOFF64 foo 0x0
 // CHECK-NEXT:       0x85 R_X86_64_TPOFF64 baz 0x0
+// CHECK-NEXT:       0x8D R_X86_64_PC16 foo 0x8D
+// CHECK-NEXT:       0x8F R_X86_64_PC8 foo 0x8F
 // CHECK-NEXT:     ]
 // CHECK-NEXT:   }