<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Apr 10, 2015 at 2:00 PM, Simon Atanasyan <span dir="ltr"><<a href="mailto:simon@atanasyan.com" target="_blank">simon@atanasyan.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: atanasyan<br>
Date: Fri Apr 10 16:00:41 2015<br>
New Revision: 234635<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=234635&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=234635&view=rev</a><br>
Log:<br>
[Mips] Add -pcrel-eh-reloc command line option<br>
<br>
This MIPS specific option controls R_MIPS_EH relocation handling.<br>
If -pcrel-eh-reloc is specified R_MIPS_EH relocation should be handled<br>
like R_MIPS_PC32 relocation.<br>
<br>
Added:<br>
    lld/trunk/test/elf/Mips/rel-eh-03.test<br>
Modified:<br>
    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h<br>
    lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
    lld/trunk/lib/Driver/GnuLdOptions.td<br>
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
<br>
Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=234635&r1=234634&r2=234635&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=234635&r1=234634&r2=234635&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Fri Apr 10 16:00:41 2015<br>
@@ -326,6 +326,10 @@ public:<br>
   bool armTarget1Rel() const { return _armTarget1Rel; }<br>
   void setArmTarget1Rel(bool value) { _armTarget1Rel = value; }<br>
<br>
+  // Set R_MIPS_EH relocation behaviour.<br>
+  bool mipsPcRelEhRel() const { return _mipsPcRelEhRel; }<br>
+  void setMipsPcRelEhRel(bool value) { _mipsPcRelEhRel = value; }<br>
+<br>
   /// Each time a reader reads a new file, this member function is called<br>
   /// with the file's ELF magics. This is supposed to "merge" all attributes<br>
   /// to generate output ELF file magic. This can also reject input files<br>
@@ -361,6 +365,7 @@ protected:<br>
   bool _enableNewDtags = false;<br>
   bool _collectStats = false;<br>
   bool _armTarget1Rel = false;<br>
+  bool _mipsPcRelEhRel = false;<br>
   uint64_t _maxPageSize = 0x1000;<br>
<br>
   OutputMagic _outputMagic;<br>
<br>
Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=234635&r1=234634&r2=234635&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=234635&r1=234634&r2=234635&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Fri Apr 10 16:00:41 2015<br>
@@ -557,6 +557,19 @@ bool GnuLdDriver::parse(int argc, const<br>
          << "--arm-target1-abs\n";<br>
   }<br>
<br>
+  // Process MIPS specific options.<br>
+  if (triple.getArch() == llvm::Triple::mips ||<br>
+      triple.getArch() == llvm::Triple::mipsel ||<br>
+      triple.getArch() == llvm::Triple::mips64 ||<br>
+      triple.getArch() == llvm::Triple::mips64el)<br>
+    ctx->setMipsPcRelEhRel(parsedArgs->hasArg(OPT_pcrel_eh_reloc));<br>
+  else {<br>
+    for (const auto *arg : parsedArgs->filtered(OPT_grp_mips_targetopts)) {<br>
+      diag << "warning: ignoring unsupported MIPS specific argument: "<br>
+           << arg->getSpelling() << "\n";<br>
+    }<br>
+  }<br>
+<br>
   for (auto *arg : parsedArgs->filtered(OPT_L))<br>
     ctx->addSearchPath(arg->getValue());<br>
<br>
<br>
Modified: lld/trunk/lib/Driver/GnuLdOptions.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdOptions.td?rev=234635&r1=234634&r2=234635&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdOptions.td?rev=234635&r1=234634&r2=234635&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/Driver/GnuLdOptions.td (original)<br>
+++ lld/trunk/lib/Driver/GnuLdOptions.td Fri Apr 10 16:00:41 2015<br>
@@ -329,6 +329,15 @@ def arm_target1_abs : Flag<["--"], "arm-<br>
      Group<grp_targetopts>, HelpText<"Interpret R_ARM_TARGET1 as R_ARM_ABS32">;<br>
<br>
 //===----------------------------------------------------------------------===//<br>
+/// MIPS Target Specific Options<br>
+//===----------------------------------------------------------------------===//<br>
+def grp_mips_targetopts : OptionGroup<"MIPS SPECIFIC OPTIONS">,<br>
+     Group<grp_targetopts>;<br>
+def pcrel_eh_reloc : Flag<["-", "--"], "pcrel-eh-reloc">,<br>
+     Group<grp_mips_targetopts>,<br>
+     HelpText<"Interpret R_MIPS_EH as R_MIPS_PC32">;<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
 /// Ignored options<br>
 //===----------------------------------------------------------------------===//<br>
 def grp_ignored: OptionGroup<"ignored">,<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=234635&r1=234634&r2=234635&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=234635&r1=234634&r2=234635&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Fri Apr 10 16:00:41 2015<br>
@@ -599,6 +599,9 @@ void RelocationPass<ELFT>::collectRefere<br>
     return;<br>
<br>
   auto refKind = ref.kindValue();<br>
+  if (refKind == R_MIPS_EH && this->_ctx.mipsPcRelEhRel())<br>
+    ref.setKindValue(R_MIPS_PC32);<br>
+<br>
   if (!isConstrainSym(atom, refKind))<br>
     return;<br>
<br>
<br>
Added: lld/trunk/test/elf/Mips/rel-eh-03.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/rel-eh-03.test?rev=234635&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/rel-eh-03.test?rev=234635&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf/Mips/rel-eh-03.test (added)<br>
+++ lld/trunk/test/elf/Mips/rel-eh-03.test Fri Apr 10 16:00:41 2015<br>
@@ -0,0 +1,128 @@<br>
+# Check R_MIPS_EH relocation handling in case of -pcrel-eh-reloc option.<br>
+<br>
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o<br>
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o<br>
+# RUN: lld -flavor gnu -target mipsel -e T0 \<br>
+# RUN:     -pcrel-eh-reloc -o %t.exe %t1.o %t2.o %t.so<br></blockquote><div><br></div><div>This test fails because %t.so does not exist. Can you fix the issue?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s<br>
+<br>
+# RAW:      Contents of section .gnu_extab:<br>
+# RAW-NEXT:  400158 00e7ffff ff000000 a01e0000 00000000<br>
+#                     ^ 0x400140 + 0 - 0x400159 = 0xffffffe7<br>
+#                                     ^ 0x402000 + 0 - 0x400160 = 0x1ea0<br>
+#           E1 GOT entry = 0xffff8020 = -32736 ^<br>
+# RAW:      Contents of section .got:<br>
+# RAW-NEXT:  401000 00000000 00000080<br>
+<br>
+# RAW: SYMBOL TABLE:<br>
+# RAW: 00402000 l    .data  00000004 L1<br>
+# RAW: 00400140 g  F .text  00000004 T1<br>
+<br>
+# t1.o<br>
+---<br>
+FileHeader:<br>
+  Class:   ELFCLASS32<br>
+  Data:    ELFDATA2LSB<br>
+  Type:    ET_REL<br>
+  Machine: EM_MIPS<br>
+  Flags:   [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,<br>
+            EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]<br>
+<br>
+Sections:<br>
+  - Name:          .text<br>
+    Type:          SHT_PROGBITS<br>
+    Flags:         [SHF_ALLOC, SHF_EXECINSTR]<br>
+    AddressAlign:  16<br>
+    Size:          4<br>
+<br>
+Symbols:<br>
+  Global:<br>
+    - Name:    T1<br>
+      Type:    STT_FUNC<br>
+      Section: .text<br>
+      Value:   0<br>
+      Size:    4<br>
+<br>
+# t2.o<br>
+---<br>
+FileHeader:<br>
+  Class:   ELFCLASS32<br>
+  Data:    ELFDATA2LSB<br>
+  Type:    ET_REL<br>
+  Machine: EM_MIPS<br>
+  Flags:   [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,<br>
+            EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]<br>
+<br>
+Sections:<br>
+  - Name:          .text<br>
+    Type:          SHT_PROGBITS<br>
+    Flags:         [SHF_ALLOC, SHF_EXECINSTR]<br>
+    AddressAlign:  16<br>
+    Size:          8<br>
+<br>
+  - Name:          .data<br>
+    Type:          SHT_PROGBITS<br>
+    Flags:         [SHF_WRITE, SHF_ALLOC]<br>
+    AddressAlign:  16<br>
+    Size:          4<br>
+<br>
+  - Name:          .gnu_extab<br>
+    Type:          SHT_PROGBITS<br>
+    Flags:         [SHF_ALLOC]<br>
+    AddressAlign:  4<br>
+    Size:          16<br>
+<br>
+  - Name:          .rel.gnu_extab<br>
+    Type:          SHT_REL<br>
+    Link:          .symtab<br>
+    AddressAlign:  4<br>
+    Info:          .gnu_extab<br>
+    Relocations:<br>
+      - Offset:  1<br>
+        Symbol:  T1<br>
+        Type:    R_MIPS_EH<br>
+      - Offset:  8<br>
+        Symbol:  L1<br>
+        Type:    R_MIPS_EH<br>
+<br>
+  - Name:          .eh_frame_entry<br>
+    Type:          SHT_PROGBITS<br>
+    Flags:         [SHF_ALLOC]<br>
+    AddressAlign:  4<br>
+    Content:       "0000000100000001"<br>
+<br>
+  - Name:          .rel.eh_frame_entry<br>
+    Type:          SHT_REL<br>
+    Link:          .symtab<br>
+    AddressAlign:  4<br>
+    Info:          .eh_frame_entry<br>
+    Relocations:<br>
+      - Offset:  0<br>
+        Symbol:  .text<br>
+        Type:    R_MIPS_PC32<br>
+      - Offset:  4<br>
+        Symbol:  .gnu_extab<br>
+        Type:    R_MIPS_PC32<br>
+<br>
+Symbols:<br>
+  Local:<br>
+    - Name:    .text<br>
+      Type:    STT_SECTION<br>
+      Section: .text<br>
+    - Name:    .gnu_extab<br>
+      Type:    STT_SECTION<br>
+      Section: .gnu_extab<br>
+    - Name:    L1<br>
+      Type:    STT_OBJECT<br>
+      Section: .data<br>
+      Value:   0<br>
+      Size:    4<br>
+<br>
+  Global:<br>
+    - Name:    T0<br>
+      Type:    STT_FUNC<br>
+      Section: .text<br>
+      Value:   0<br>
+      Size:    8<br>
+    - Name:    T1<br>
+...<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>