<p dir="ltr">Please add a case where we produce R_X86_64_GOTPCREL even when given the command line.</p>
<p dir="ltr">Cheers,<br>
Rafael</p>
<div class="gmail_quote">On Apr 23, 2016 9:09 PM, "Davide Italiano via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: davide<br>
Date: Sat Apr 23 20:03:57 2016<br>
New Revision: 267307<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=267307&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=267307&view=rev</a><br>
Log:<br>
[MC/ELF] Implement support for GOTPCRELX/REX_GOTPCRELX.<br>
<br>
The option to control the emission of the new relocations<br>
is -relax-relocations (blatantly copied from GNU as).<br>
It can't be enabled by default because it breaks relatively<br>
recent versions of ld.bfd/ld.gold (late 2015).<br>
<br>
Added:<br>
    llvm/trunk/test/MC/ELF/got-relaxed.s<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/MCAsmInfo.h<br>
    llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp<br>
    llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=267307&r1=267306&r2=267307&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=267307&r1=267306&r2=267307&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Sat Apr 23 20:03:57 2016<br>
@@ -363,6 +363,10 @@ protected:<br>
   /// expressions as logical rather than arithmetic.<br>
   bool UseLogicalShr;<br>
<br>
+  // If true, emit GOTPCRELX/REX_GOTPCRELX instead of GOTPCREL, on<br>
+  // X86_64 ELF.<br>
+  bool RelaxELFRelocations;<br>
+<br>
 public:<br>
   explicit MCAsmInfo();<br>
   virtual ~MCAsmInfo();<br>
@@ -568,6 +572,8 @@ public:<br>
   }<br>
<br>
   bool shouldUseLogicalShr() const { return UseLogicalShr; }<br>
+<br>
+  bool canRelaxRelocations() const { return RelaxELFRelocations; }<br>
 };<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp?rev=267307&r1=267306&r2=267307&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp?rev=267307&r1=267306&r2=267307&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp Sat Apr 23 20:03:57 2016<br>
@@ -9,6 +9,7 @@<br>
<br>
 #include "MCTargetDesc/X86FixupKinds.h"<br>
 #include "MCTargetDesc/X86MCTargetDesc.h"<br>
+#include "llvm/MC/MCAsmInfo.h"<br>
 #include "llvm/MC/MCContext.h"<br>
 #include "llvm/MC/MCELFObjectWriter.h"<br>
 #include "llvm/MC/MCExpr.h"<br>
@@ -84,10 +85,10 @@ static void checkIs32(MCContext &Ctx, SM<br>
                     "32 bit reloc applied to a field with a different size");<br>
 }<br>
<br>
-static unsigned getRelocType64(MCContext &Ctx, const MCFixup &Fixup,<br>
+static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc,<br>
                                MCSymbolRefExpr::VariantKind Modifier,<br>
-                               X86_64RelType Type, bool IsPCRel) {<br>
-  SMLoc Loc = Fixup.getLoc();<br>
+                               X86_64RelType Type, bool IsPCRel,<br>
+                               unsigned Kind) {<br>
   switch (Modifier) {<br>
   default:<br>
     llvm_unreachable("Unimplemented");<br>
@@ -173,7 +174,19 @@ static unsigned getRelocType64(MCContext<br>
     return ELF::R_X86_64_PLT32;<br>
   case MCSymbolRefExpr::VK_GOTPCREL:<br>
     checkIs32(Ctx, Loc, Type);<br>
-    return ELF::R_X86_64_GOTPCREL;<br>
+    // Older versions of ld.bfd/ld.gold/lld<br>
+    // do not support GOTPCRELX/REX_GOTPCRELX,<br>
+    // and we want to keep back-compatibility.<br>
+    if (!Ctx.getAsmInfo()->canRelaxRelocations())<br>
+      return ELF::R_X86_64_GOTPCREL;<br>
+    switch (Kind) {<br>
+    default:<br>
+      return ELF::R_X86_64_GOTPCREL;<br>
+    case X86::reloc_riprel_4byte:<br>
+      return ELF::R_X86_64_GOTPCRELX;<br>
+    case X86::reloc_riprel_4byte_movq_load:<br>
+      return ELF::R_X86_64_REX_GOTPCRELX;<br>
+    }<br>
   }<br>
 }<br>
<br>
@@ -259,7 +272,8 @@ unsigned X86ELFObjectWriter::getRelocTyp<br>
   MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();<br>
   X86_64RelType Type = getType64(Fixup.getKind(), Modifier, IsPCRel);<br>
   if (getEMachine() == ELF::EM_X86_64)<br>
-    return getRelocType64(Ctx, Fixup, Modifier, Type, IsPCRel);<br>
+    return getRelocType64(Ctx, Fixup.getLoc(), Modifier, Type, IsPCRel,<br>
+                          Fixup.getKind());<br>
<br>
   assert((getEMachine() == ELF::EM_386 || getEMachine() == ELF::EM_IAMCU) &&<br>
          "Unsupported ELF machine type.");<br>
<br>
Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp?rev=267307&r1=267306&r2=267307&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp?rev=267307&r1=267306&r2=267307&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MCAsmInfo.cpp Sat Apr 23 20:03:57 2016<br>
@@ -35,6 +35,10 @@ AsmWriterFlavor("x86-asm-syntax", cl::in<br>
              clEnumValEnd));<br>
<br>
 static cl::opt<bool><br>
+RelaxELFRel("relax-relocations", cl::init(false),<br>
+  cl::desc("Emit R_X86_64_GOTPCRELX instead of R_X86_64_GOTPCREL"));<br>
+<br>
+static cl::opt<bool><br>
 MarkedJTDataRegions("mark-data-regions", cl::init(false),<br>
   cl::desc("Mark code section jump table data regions."),<br>
   cl::Hidden);<br>
@@ -111,6 +115,8 @@ X86ELFMCAsmInfo::X86ELFMCAsmInfo(const T<br>
   // Always enable the integrated assembler by default.<br>
   // Clang also enabled it when the OS is Solaris but that is redundant here.<br>
   UseIntegratedAssembler = true;<br>
+<br>
+  RelaxELFRelocations = RelaxELFRel;<br>
 }<br>
<br>
 const MCExpr *<br>
<br>
Added: llvm/trunk/test/MC/ELF/got-relaxed.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/got-relaxed.s?rev=267307&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/got-relaxed.s?rev=267307&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/ELF/got-relaxed.s (added)<br>
+++ llvm/trunk/test/MC/ELF/got-relaxed.s Sat Apr 23 20:03:57 2016<br>
@@ -0,0 +1,18 @@<br>
+// RUN: llvm-mc -filetype=obj -relax-relocations -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r -t | FileCheck %s<br>
+<br>
+// Test that this produces the correct relaxed relocations.<br>
+<br>
+        movl   foo@GOT, %eax<br>
+        movl   foo@GOTPCREL(%rip), %eax<br>
+        movq  foo@GOTPCREL(%rip), %rax<br>
+<br>
+// CHECK:      Relocations [<br>
+// CHECK:        Section ({{[^ ]+}}) .rela.text {<br>
+// CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_GOT32 foo 0x{{[^ ]+}}<br>
+// CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_GOTPCRELX foo 0x{{[^ ]+}}<br>
+// CHECK-NEXT:       0x{{[^ ]+}} R_X86_64_REX_GOTPCRELX foo 0x{{[^ ]+}}<br>
+// CHECK-NEXT:   }<br>
+// CHECK-NEXT: ]<br>
+<br>
+// CHECK:        Symbols [<br>
+// CHECK-NOT:          _GLOBAL_OFFSET_TABLE_<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>