if (SD.isExternal())
return true;
- const llvm::MCSymbolRefExpr& Ref = *Target.getSymA();
+ MCSymbolRefExpr::VariantKind Kind = Target.getSymA()->getKind();
const MCSectionELF &Sec2 =
static_cast<const MCSectionELF&>(F.getParent()->getSection());
- if (Ref.getKind() == MCSymbolRefExpr::VK_PLT &&
- &Sec2 != &Section)
+ if (&Sec2 != &Section &&
+ (Kind == MCSymbolRefExpr::VK_PLT || Kind == MCSymbolRefExpr::VK_GOTPCREL))
return true;
return false;
case MCSymbolRefExpr::VK_GOT:
Type = ELF::R_X86_64_GOT32;
break;
+ case llvm::MCSymbolRefExpr::VK_GOTPCREL:
+ Type = ELF::R_X86_64_GOTPCREL;
+ break;
default:
llvm_unreachable("Unimplemented");
}
movl $.Lfoo, %edi
movl $.Lfoo+2, %edi
jmp foo@PLT
+ movq foo@GOTPCREL, %rax
.section .sec1,"aM",@progbits,16
.Lfoo:
// CHECK-NEXT: ('r_type', 4
// CHECK-NEXT: ('r_addend',
// CHECK-NEXT: ),
+
+// Relocation 4 refers to symbol 2
+// CHECK-NEXT: # Relocation 4
+// CHECK-NEXT: (('r_offset',
+// CHECK-NEXT: ('r_sym', 2)
+// CHECK-NEXT: ('r_type', 9
+// CHECK-NEXT: ('r_addend',
+// CHECK-NEXT: ),
// CHECK-NEXT: ])