[lld] r234635 - [Mips] Add -pcrel-eh-reloc command line option

Simon Atanasyan simon at atanasyan.com
Fri Apr 10 14:00:41 PDT 2015


Author: atanasyan
Date: Fri Apr 10 16:00:41 2015
New Revision: 234635

URL: http://llvm.org/viewvc/llvm-project?rev=234635&view=rev
Log:
[Mips] Add -pcrel-eh-reloc command line option

This MIPS specific option controls R_MIPS_EH relocation handling.
If -pcrel-eh-reloc is specified R_MIPS_EH relocation should be handled
like R_MIPS_PC32 relocation.

Added:
    lld/trunk/test/elf/Mips/rel-eh-03.test
Modified:
    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
    lld/trunk/lib/Driver/GnuLdDriver.cpp
    lld/trunk/lib/Driver/GnuLdOptions.td
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp

Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=234635&r1=234634&r2=234635&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Fri Apr 10 16:00:41 2015
@@ -326,6 +326,10 @@ public:
   bool armTarget1Rel() const { return _armTarget1Rel; }
   void setArmTarget1Rel(bool value) { _armTarget1Rel = value; }
 
+  // Set R_MIPS_EH relocation behaviour.
+  bool mipsPcRelEhRel() const { return _mipsPcRelEhRel; }
+  void setMipsPcRelEhRel(bool value) { _mipsPcRelEhRel = value; }
+
   /// Each time a reader reads a new file, this member function is called
   /// with the file's ELF magics. This is supposed to "merge" all attributes
   /// to generate output ELF file magic. This can also reject input files
@@ -361,6 +365,7 @@ protected:
   bool _enableNewDtags = false;
   bool _collectStats = false;
   bool _armTarget1Rel = false;
+  bool _mipsPcRelEhRel = false;
   uint64_t _maxPageSize = 0x1000;
 
   OutputMagic _outputMagic;

Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=234635&r1=234634&r2=234635&view=diff
==============================================================================
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Fri Apr 10 16:00:41 2015
@@ -557,6 +557,19 @@ bool GnuLdDriver::parse(int argc, const
          << "--arm-target1-abs\n";
   }
 
+  // Process MIPS specific options.
+  if (triple.getArch() == llvm::Triple::mips ||
+      triple.getArch() == llvm::Triple::mipsel ||
+      triple.getArch() == llvm::Triple::mips64 ||
+      triple.getArch() == llvm::Triple::mips64el)
+    ctx->setMipsPcRelEhRel(parsedArgs->hasArg(OPT_pcrel_eh_reloc));
+  else {
+    for (const auto *arg : parsedArgs->filtered(OPT_grp_mips_targetopts)) {
+      diag << "warning: ignoring unsupported MIPS specific argument: "
+           << arg->getSpelling() << "\n";
+    }
+  }
+
   for (auto *arg : parsedArgs->filtered(OPT_L))
     ctx->addSearchPath(arg->getValue());
 

Modified: lld/trunk/lib/Driver/GnuLdOptions.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdOptions.td?rev=234635&r1=234634&r2=234635&view=diff
==============================================================================
--- lld/trunk/lib/Driver/GnuLdOptions.td (original)
+++ lld/trunk/lib/Driver/GnuLdOptions.td Fri Apr 10 16:00:41 2015
@@ -329,6 +329,15 @@ def arm_target1_abs : Flag<["--"], "arm-
      Group<grp_targetopts>, HelpText<"Interpret R_ARM_TARGET1 as R_ARM_ABS32">;
 
 //===----------------------------------------------------------------------===//
+/// MIPS Target Specific Options
+//===----------------------------------------------------------------------===//
+def grp_mips_targetopts : OptionGroup<"MIPS SPECIFIC OPTIONS">,
+     Group<grp_targetopts>;
+def pcrel_eh_reloc : Flag<["-", "--"], "pcrel-eh-reloc">,
+     Group<grp_mips_targetopts>,
+     HelpText<"Interpret R_MIPS_EH as R_MIPS_PC32">;
+
+//===----------------------------------------------------------------------===//
 /// Ignored options
 //===----------------------------------------------------------------------===//
 def grp_ignored: OptionGroup<"ignored">,

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp?rev=234635&r1=234634&r2=234635&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsRelocationPass.cpp Fri Apr 10 16:00:41 2015
@@ -599,6 +599,9 @@ void RelocationPass<ELFT>::collectRefere
     return;
 
   auto refKind = ref.kindValue();
+  if (refKind == R_MIPS_EH && this->_ctx.mipsPcRelEhRel())
+    ref.setKindValue(R_MIPS_PC32);
+
   if (!isConstrainSym(atom, refKind))
     return;
 

Added: lld/trunk/test/elf/Mips/rel-eh-03.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Mips/rel-eh-03.test?rev=234635&view=auto
==============================================================================
--- lld/trunk/test/elf/Mips/rel-eh-03.test (added)
+++ lld/trunk/test/elf/Mips/rel-eh-03.test Fri Apr 10 16:00:41 2015
@@ -0,0 +1,128 @@
+# Check R_MIPS_EH relocation handling in case of -pcrel-eh-reloc option.
+
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
+# RUN: lld -flavor gnu -target mipsel -e T0 \
+# RUN:     -pcrel-eh-reloc -o %t.exe %t1.o %t2.o %t.so
+# RUN: llvm-objdump -s -t %t.exe | FileCheck -check-prefix=RAW %s
+
+# RAW:      Contents of section .gnu_extab:
+# RAW-NEXT:  400158 00e7ffff ff000000 a01e0000 00000000
+#                     ^ 0x400140 + 0 - 0x400159 = 0xffffffe7
+#                                     ^ 0x402000 + 0 - 0x400160 = 0x1ea0
+#           E1 GOT entry = 0xffff8020 = -32736 ^
+# RAW:      Contents of section .got:
+# RAW-NEXT:  401000 00000000 00000080
+
+# RAW: SYMBOL TABLE:
+# RAW: 00402000 l    .data  00000004 L1
+# RAW: 00400140 g  F .text  00000004 T1
+
+# t1.o
+---
+FileHeader:      
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MIPS
+  Flags:   [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+            EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:        
+  - Name:          .text
+    Type:          SHT_PROGBITS
+    Flags:         [SHF_ALLOC, SHF_EXECINSTR]
+    AddressAlign:  16
+    Size:          4
+
+Symbols:         
+  Global:          
+    - Name:    T1
+      Type:    STT_FUNC
+      Section: .text
+      Value:   0
+      Size:    4
+
+# t2.o
+---
+FileHeader:      
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_MIPS
+  Flags:   [EF_MIPS_NOREORDER, EF_MIPS_CPIC, EF_MIPS_PIC,
+            EF_MIPS_ABI_O32, EF_MIPS_ARCH_32R2]
+
+Sections:        
+  - Name:          .text
+    Type:          SHT_PROGBITS
+    Flags:         [SHF_ALLOC, SHF_EXECINSTR]
+    AddressAlign:  16
+    Size:          8
+
+  - Name:          .data
+    Type:          SHT_PROGBITS
+    Flags:         [SHF_WRITE, SHF_ALLOC]
+    AddressAlign:  16
+    Size:          4
+
+  - Name:          .gnu_extab
+    Type:          SHT_PROGBITS
+    Flags:         [SHF_ALLOC]
+    AddressAlign:  4
+    Size:          16
+
+  - Name:          .rel.gnu_extab
+    Type:          SHT_REL
+    Link:          .symtab
+    AddressAlign:  4
+    Info:          .gnu_extab
+    Relocations:     
+      - Offset:  1
+        Symbol:  T1
+        Type:    R_MIPS_EH
+      - Offset:  8
+        Symbol:  L1
+        Type:    R_MIPS_EH
+
+  - Name:          .eh_frame_entry
+    Type:          SHT_PROGBITS
+    Flags:         [SHF_ALLOC]
+    AddressAlign:  4
+    Content:       "0000000100000001"
+
+  - Name:          .rel.eh_frame_entry
+    Type:          SHT_REL
+    Link:          .symtab
+    AddressAlign:  4
+    Info:          .eh_frame_entry
+    Relocations:     
+      - Offset:  0
+        Symbol:  .text
+        Type:    R_MIPS_PC32
+      - Offset:  4
+        Symbol:  .gnu_extab
+        Type:    R_MIPS_PC32
+
+Symbols:         
+  Local:           
+    - Name:    .text
+      Type:    STT_SECTION
+      Section: .text
+    - Name:    .gnu_extab
+      Type:    STT_SECTION
+      Section: .gnu_extab
+    - Name:    L1
+      Type:    STT_OBJECT
+      Section: .data
+      Value:   0
+      Size:    4
+
+  Global:          
+    - Name:    T0
+      Type:    STT_FUNC
+      Section: .text
+      Value:   0
+      Size:    8
+    - Name:    T1
+...





More information about the llvm-commits mailing list