Collect the Addend for external relocs.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 30 Apr 2013 01:29:57 +0000 (01:29 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 30 Apr 2013 01:29:57 +0000 (01:29 +0000)
This fixes 2013-04-04-RelocAddend.ll. We don't have a testcase for non external
relocs with an Addend. I will try to write one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180767 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
test/ExecutionEngine/MCJIT/2013-04-04-RelocAddend.ll

index ddac59fd36482174034b4a13d09a82ab537474fb..6054b2ab79c4315195a8b88e20340fe4be33bd65 100644 (file)
@@ -230,7 +230,14 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
   bool isExtern = MachO->getPlainRelocationExternal(RE);
   bool IsPCRel = MachO->getAnyRelocationPCRel(RE);
   unsigned Size = MachO->getAnyRelocationLength(RE);
+  uint64_t Offset;
+  RelI.getOffset(Offset);
   if (isExtern) {
+    uint8_t *LocalAddress = Section.Address + Offset;
+    unsigned NumBytes = 1 << Size;
+    uint64_t Addend = 0;
+    memcpy(&Addend, LocalAddress, NumBytes);
+
     // Obtain the symbol name which is referenced in the relocation
     SymbolRef Symbol;
     RelI.getSymbol(Symbol);
@@ -240,15 +247,17 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
     SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data());
     if (lsi != Symbols.end()) {
       Value.SectionID = lsi->second.first;
-      Value.Addend = lsi->second.second;
+      Value.Addend = lsi->second.second + Addend;
     } else {
       // Search for the symbol in the global symbol table
       SymbolTableMap::const_iterator gsi = GlobalSymbolTable.find(TargetName.data());
       if (gsi != GlobalSymbolTable.end()) {
         Value.SectionID = gsi->second.first;
-        Value.Addend = gsi->second.second;
-      } else
+        Value.Addend = gsi->second.second + Addend;
+      } else {
         Value.SymbolName = TargetName.data();
+        Value.Addend = Addend;
+      }
     }
   } else {
     error_code err;
@@ -276,8 +285,6 @@ void RuntimeDyldMachO::processRelocationRef(unsigned SectionID,
     }
   }
 
-  uint64_t Offset;
-  RelI.getOffset(Offset);
   if (Arch == Triple::arm && (RelType & 0xf) == macho::RIT_ARM_Branch24Bit) {
     // This is an ARM branch relocation, need to use a stub function.
 
index d2f31bb33ca09784aa739bd0a2719322b68c7cab..3f402c59311698ba04674668cbd1a9b3ead0f315 100644 (file)
@@ -1,5 +1,4 @@
 ; RUN: %lli_mcjit %s
-; XFAIL: darwin
 ;
 ; Verify relocations to global symbols with addend work correctly.
 ;