[llvm] r234839 - [RuntimeDyldELF] Improve GOT support

Lang Hames lhames at gmail.com
Tue Apr 14 10:16:43 PDT 2015


Looks like SectionEntry was holding the section name as a StringRef. That's
not safe now that we can delete the ObjectFile after loading.

I've fixed this in r234910. Hopefully you can get more sane output from the
test-case now.

- Lang.

On Tue, Apr 14, 2015 at 8:12 AM, Keno Fischer <kfischer at college.harvard.edu>
wrote:

> This is missing the second .got section, I believe (hard to tell with the
> corrupted names of course). Did llvm-rtdyld get built correctly? Also CC
> Lang for why those would be corrupted.
>
> On Tue, Apr 14, 2015 at 10:51 AM, Kuperstein, Michael M <
> michael.m.kuperstein at intel.com> wrote:
>
>>  Parse symbols:
>>
>> emitSection SectionID: 0 Name: .text obj addr: 0000000000BA93C0 new addr:
>> 0000000000080000 DataSize: 10 StubBufSize: 6 Allocate: 16
>>
>>         Type: 4 Name: foo SID: 0 Offset: 0000000000000000 flags: 0
>>
>> Parse relocations:
>>
>>         SectionID: 0
>>
>>                 RelType: 9 Addend: -4 TargetName: G
>>
>>                 SectionID: 0 Offset: 3
>>
>> Parse symbols:
>>
>> emitSection SectionID: 2 Name: .bss obj addr: 0000000000000000 new addr:
>> 0000000000AA0000 DataSize: 1 StubBufSize: 0 Allocate: 1
>>
>>         Type: 1 Name: F SID: 2 Offset: 0000000000000000 flags: 66
>>
>> emitSection SectionID: 3 Name: .data.rel obj addr: 0000000000BA93D0 new
>> addr: 0000000000AB0000 DataSize: 8 StubBufSize: 6 Allocate: 14
>>
>>         Type: 1 Name: G SID: 3 Offset: 0000000000000000 flags: 66
>>
>> Parse relocations:
>>
>>         SectionID: 3
>>
>>                 RelType: 1 Addend: 0 TargetName: F
>>
>>                 SectionID: 3 Offset: 0
>>
>> Reassigning address for section 0 (▌▌▌▌▌): 0x0000000000080000 ->
>> 0x0000000000001000
>>
>> Reassigning address for section 1 (.got): 0x0000000000090000 ->
>> 0x0000000000011000
>>
>> Reassigning address for section 2 (▌▌▌▌): 0x0000000000aa0000 ->
>> 0x0000000000021000
>>
>> Reassigning address for section 3 (▌▌▌▌▌▌▌▌▌): 0x0000000000ab0000 ->
>> 0x0000000000031000
>>
>> Resolving relocations Name: G   0x31000
>>
>> Writing 0000000000031000 at 0000000000090000
>>
>> Resolving relocations Section #0        0000000000001000
>>
>> ----- Contents of section ▌▌▌▌▌ before relocations -----
>>
>> 0x0000000000001000: 48 8b 05 00 00 00 00 8b 00 c3
>>
>> ----- Contents of section ▌▌▌▌▌ after relocations -----
>>
>> 0x0000000000001000: 48 8b 05 00 00 00 00 8b 00 c3
>>
>> Resolving relocations Section #1        0000000000011000
>>
>> ----- Contents of section .got before relocations -----
>>
>> 0x0000000000011000: 00 10 03 00 00 00 00 00
>>
>> Assertion failed: RealOffset <= INT32_MAX && RealOffset >= INT32_MIN,
>> file ..\..\..\..\lib\ExecutionEngine\RuntimeDyld\RuntimeDyldELF.cpp, line
>> 259
>>
>>
>>
>> (The section names are originally printed that way, it’s not the mail
>> client’s fault)
>>
>>
>>
>> Michael
>>
>>
>>
>> *From:* Keno Fischer [mailto:kfischer at college.harvard.edu]
>> *Sent:* Tuesday, April 14, 2015 17:18
>> *To:* Kuperstein, Michael M
>> *Cc:* llvm-commits at cs.uiuc.edu
>> *Subject:* Re: [llvm] r234839 - [RuntimeDyldELF] Improve GOT support
>>
>>
>>
>> Thanks Michael. I didn't realize that flag was being added on windows,
>> but I guess it makes sense, since you're using a non-standard triple for
>> MCJIT. I see this was reverted already.
>>
>>
>>
>> Regarding the other failure, that's really odd, because this is precisely
>> the failure that this commit is supposed to solve. Can you send the output
>> of that invocation with `-debug-only dyld` added at the end?
>>
>>
>>
>> On Tue, Apr 14, 2015 at 5:57 AM, Kuperstein, Michael M <
>> michael.m.kuperstein at intel.com> wrote:
>>
>> Hello Keno,
>>
>> Unfortunately, cross-module-sm-pic-a.ll now breaks on windows.
>>
>> It looks like %lli provides a triple, so this:
>> %lli -mtriple=x86_64-pc-linux -extra-module=%p/Inputs/cross-module-b.ll
>> -relocation-model=pic -code-model=small %s > /dev/null
>>
>> Becomes:
>> lli.EXE -mtriple=x86_64-pc-win32-elf -mtriple=x86_64-pc-linux
>> -extra-module=...
>>
>> Which (rightfully) gets rejected by lli.
>>
>> Thanks,
>>    Michael
>>
>>
>> -----Original Message-----
>> From: llvm-commits-bounces at cs.uiuc.edu [mailto:
>> llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Keno Fischer
>> Sent: Tuesday, April 14, 2015 05:11
>> To: llvm-commits at cs.uiuc.edu
>> Subject: [llvm] r234839 - [RuntimeDyldELF] Improve GOT support
>>
>> Author: kfischer
>> Date: Mon Apr 13 21:10:35 2015
>> New Revision: 234839
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=234839&view=rev
>> Log:
>> [RuntimeDyldELF] Improve GOT support
>>
>> Summary:
>> This is the first in a series of patches to eventually add support for
>> TLS relocations to RuntimeDyld. This patch resolves an issue in the current
>> GOT handling, where GOT entries would be reused between object files, which
>> leads to the same situation that necessitates the GOT in the first place,
>> i.e. that the 32-bit offset can not cover all of the address space. Thus
>> this patch makes the GOT object-file-local.
>> Unfortunately, this still isn't quite enough, because the MemoryManager
>> does not yet guarantee that sections are allocated sufficiently close to
>> each other, even if they belong to the same object file. To address this
>> concern, this patch also adds a small API abstraction on top of the GOT
>> allocation mechanism that will allow (temporarily, until the MemoryManager
>> is improved) using the stub mechanism instead of allocating a different
>> section. The actual switch from separate section to stub mechanism will be
>> part of a follow-on commit, so that it can be easily reverted independently
>> at the appropriate time.
>>
>> Test Plan: Includes a test case where the GOT of two object files is
>> artificially forced to be apart by several GB.
>>
>> Reviewers: lhames
>>
>> Reviewed By: lhames
>>
>> Subscribers: llvm-commits
>>
>> Differential Revision: http://reviews.llvm.org/D8813
>>
>> Added:
>>
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PIC_relocations.s
>>     llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/
>>
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ExternalGlobal.ll
>> Modified:
>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
>>     llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
>>     llvm/trunk/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Apr
>>
>> +++ 13 21:10:35 2015
>> @@ -814,7 +814,6 @@ void RuntimeDyldImpl::resolveExternalSym
>>          report_fatal_error("Program used external function '" + Name +
>>                             "' which could not be resolved!");
>>
>> -      updateGOTEntries(Name, Addr);
>>        DEBUG(dbgs() << "Resolving relocations Name: " << Name << "\t"
>>                     << format("0x%lx", Addr) << "\n");
>>        // This list may have been updated when we called
>> getSymbolAddress, so
>>
>> Modified:
>> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
>> (original)
>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldCheckerImpl.h
>> +++ Mon Apr 13 21:10:35 2015
>> @@ -19,6 +19,7 @@ class RuntimeDyldCheckerImpl {
>>    friend class RuntimeDyldChecker;
>>    friend class RuntimeDyldImpl;
>>    friend class RuntimeDyldCheckerExprEval;
>> +  friend class RuntimeDyldELF;
>>
>>  public:
>>    RuntimeDyldCheckerImpl(RuntimeDyld &RTDyld, MCDisassembler
>> *Disassembler,
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
>> (original)
>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Mon
>> +++ Apr 13 21:10:35 2015
>>
>> @@ -12,6 +12,7 @@
>>
>>  //===----------------------------------------------------------------------===//
>>
>>  #include "RuntimeDyldELF.h"
>> +#include "RuntimeDyldCheckerImpl.h"
>>  #include "llvm/ADT/IntervalMap.h"
>>  #include "llvm/ADT/STLExtras.h"
>>  #include "llvm/ADT/StringRef.h"
>> @@ -185,7 +186,7 @@ namespace llvm {
>>
>>  RuntimeDyldELF::RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr,
>>                                 RuntimeDyld::SymbolResolver &Resolver)
>> -    : RuntimeDyldImpl(MemMgr, Resolver) {}
>> +    : RuntimeDyldImpl(MemMgr, Resolver), GOTSectionID(0),
>> + CurrentGOTIndex(0) {}
>>  RuntimeDyldELF::~RuntimeDyldELF() {}
>>
>>  void RuntimeDyldELF::registerEHFrames() { @@ -245,27 +246,16 @@ void
>> RuntimeDyldELF::resolveX86_64Reloca
>>                   << format("%p\n", Section.Address + Offset));
>>      break;
>>    }
>> -  case ELF::R_X86_64_GOTPCREL: {
>> -    // findGOTEntry returns the 'G + GOT' part of the relocation
>> calculation
>> -    // based on the load/target address of the GOT (not the
>> current/local addr).
>> -    uint64_t GOTAddr = findGOTEntry(Value, SymOffset);
>> -    uint64_t FinalAddress = Section.LoadAddress + Offset;
>> -    // The processRelocationRef method combines the symbol offset and
>> the addend
>> -    // and in most cases that's what we want.  For this relocation type,
>> we need
>> -    // the raw addend, so we subtract the symbol offset to get it.
>> -    int64_t RealOffset = GOTAddr + Addend - SymOffset - FinalAddress;
>> -    assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN);
>> -    int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
>> -    support::ulittle32_t::ref(Section.Address + Offset) = TruncOffset;
>> -    break;
>> -  }
>>    case ELF::R_X86_64_PC32: {
>>      // Get the placeholder value from the generated object since
>>      // a previous relocation attempt may have overwritten the loaded
>> version
>>      support::ulittle32_t::ref Placeholder(
>>          (void *)(Section.ObjAddress + Offset));
>>      uint64_t FinalAddress = Section.LoadAddress + Offset;
>> -    int64_t RealOffset = Placeholder + Value + Addend - FinalAddress;
>> +    int64_t RealOffset = Value + Addend - FinalAddress;
>> +    // Don't add the placeholder if this is a stub
>> +    if (Offset < Section.Size)
>> +      RealOffset += Placeholder;
>>      assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN);
>>      int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
>>      support::ulittle32_t::ref(Section.Address + Offset) = TruncOffset;
>> @@ -277,8 +267,10 @@ void RuntimeDyldELF::resolveX86_64Reloca
>>      support::ulittle64_t::ref Placeholder(
>>          (void *)(Section.ObjAddress + Offset));
>>      uint64_t FinalAddress = Section.LoadAddress + Offset;
>> -    support::ulittle64_t::ref(Section.Address + Offset) =
>> -        Placeholder + Value + Addend - FinalAddress;
>> +    int64_t RealOffset = Value + Addend - FinalAddress;
>> +    if (Offset < Section.Size)
>> +      RealOffset += Placeholder;
>> +    support::ulittle64_t::ref(Section.Address + Offset) = RealOffset;
>>      break;
>>    }
>>    }
>> @@ -1323,16 +1315,18 @@ relocation_iterator RuntimeDyldELF::proc
>>          Stubs[Value] = StubOffset;
>>          createStubFunction((uint8_t *)StubAddress);
>>
>> -        // Create a GOT entry for the external function.
>> -        GOTEntries.push_back(Value);
>> -
>> -        // Make our stub function a relative call to the GOT entry.
>> -        RelocationEntry RE(SectionID, StubOffset + 2,
>> ELF::R_X86_64_GOTPCREL,
>> -                           -4);
>> -        addRelocationForSymbol(RE, Value.SymbolName);
>> -
>>          // Bump our stub offset counter
>>          Section.StubOffset = StubOffset + getMaxStubSize();
>> +
>> +        // Allocate a GOT Entry
>> +        uint64_t GOTOffset = allocateGOTEntries(SectionID, 1);
>> +
>> +        // The load of the GOT address has an addend of -4
>> +        resolveGOTOffsetRelocation(SectionID, StubOffset + 2, GOTOffset
>> + - 4);
>> +
>> +        // Fill in the value of the symbol we're targeting into the GOT
>> +
>> addRelocationForSymbol(computeGOTOffsetRE(SectionID,GOTOffset,0,ELF::R_X86_64_64),
>> +            Value.SymbolName);
>>        }
>>
>>        // Make the target call a call into the stub table.
>> @@ -1343,10 +1337,17 @@ relocation_iterator RuntimeDyldELF::proc
>>                           Value.Offset);
>>        addRelocationForSection(RE, Value.SectionID);
>>      }
>> +  } else if (Arch == Triple::x86_64 && RelType ==
>> ELF::R_X86_64_GOTPCREL) {
>> +    uint64_t GOTOffset = allocateGOTEntries(SectionID, 1);
>> +    resolveGOTOffsetRelocation(SectionID, Offset, GOTOffset + Addend);
>> +
>> +    // Fill in the value of the symbol we're targeting into the GOT
>> +    RelocationEntry RE = computeGOTOffsetRE(SectionID, GOTOffset,
>> Value.Offset, ELF::R_X86_64_64);
>> +    if (Value.SymbolName)
>> +      addRelocationForSymbol(RE, Value.SymbolName);
>> +    else
>> +      addRelocationForSection(RE, Value.SectionID);
>>    } else {
>> -    if (Arch == Triple::x86_64 && RelType == ELF::R_X86_64_GOTPCREL) {
>> -      GOTEntries.push_back(Value);
>> -    }
>>      RelocationEntry RE(SectionID, Offset, RelType, Value.Addend,
>> Value.Offset);
>>      if (Value.SymbolName)
>>        addRelocationForSymbol(RE, Value.SymbolName); @@ -1356,22 +1357,6
>> @@ relocation_iterator RuntimeDyldELF::proc
>>    return ++RelI;
>>  }
>>
>> -void RuntimeDyldELF::updateGOTEntries(StringRef Name, uint64_t Addr) {
>> -
>> -  SmallVectorImpl<std::pair<SID, GOTRelocations>>::iterator it;
>> -  SmallVectorImpl<std::pair<SID, GOTRelocations>>::iterator end =
>> GOTs.end();
>> -
>> -  for (it = GOTs.begin(); it != end; ++it) {
>> -    GOTRelocations &GOTEntries = it->second;
>> -    for (int i = 0, e = GOTEntries.size(); i != e; ++i) {
>> -      if (GOTEntries[i].SymbolName != nullptr &&
>> -          GOTEntries[i].SymbolName == Name) {
>> -        GOTEntries[i].Offset = Addr;
>> -      }
>> -    }
>> -  }
>> -}
>> -
>>  size_t RuntimeDyldELF::getGOTEntrySize() {
>>    // We don't use the GOT in all of these cases, but it's essentially
>> free
>>    // to put them all here.
>> @@ -1398,75 +1383,50 @@ size_t RuntimeDyldELF::getGOTEntrySize()
>>    return Result;
>>  }
>>
>> -uint64_t RuntimeDyldELF::findGOTEntry(uint64_t LoadAddress, uint64_t
>> Offset) {
>> -
>> -  const size_t GOTEntrySize = getGOTEntrySize();
>> -
>> -  SmallVectorImpl<std::pair<SID, GOTRelocations>>::const_iterator it;
>> -  SmallVectorImpl<std::pair<SID, GOTRelocations>>::const_iterator end =
>> -      GOTs.end();
>> -
>> -  int GOTIndex = -1;
>> -  for (it = GOTs.begin(); it != end; ++it) {
>> -    SID GOTSectionID = it->first;
>> -    const GOTRelocations &GOTEntries = it->second;
>> -
>> -    // Find the matching entry in our vector.
>> -    uint64_t SymbolOffset = 0;
>> -    for (int i = 0, e = GOTEntries.size(); i != e; ++i) {
>> -      if (!GOTEntries[i].SymbolName) {
>> -        if (getSectionLoadAddress(GOTEntries[i].SectionID) ==
>> LoadAddress &&
>> -            GOTEntries[i].Offset == Offset) {
>> -          GOTIndex = i;
>> -          SymbolOffset = GOTEntries[i].Offset;
>> -          break;
>> -        }
>> -      } else {
>> -        // GOT entries for external symbols use the addend as the
>> address when
>> -        // the external symbol has been resolved.
>> -        if (GOTEntries[i].Offset == LoadAddress) {
>> -          GOTIndex = i;
>> -          // Don't use the Addend here.  The relocation handler will use
>> it.
>> -          break;
>> -        }
>> -      }
>> -    }
>> -
>> -    if (GOTIndex != -1) {
>> -      if (GOTEntrySize == sizeof(uint64_t)) {
>> -        uint64_t *LocalGOTAddr = (uint64_t
>> *)getSectionAddress(GOTSectionID);
>> -        // Fill in this entry with the address of the symbol being
>> referenced.
>> -        LocalGOTAddr[GOTIndex] = LoadAddress + SymbolOffset;
>> -      } else {
>> -        uint32_t *LocalGOTAddr = (uint32_t
>> *)getSectionAddress(GOTSectionID);
>> -        // Fill in this entry with the address of the symbol being
>> referenced.
>> -        LocalGOTAddr[GOTIndex] = (uint32_t)(LoadAddress + SymbolOffset);
>> -      }
>> -
>> -      // Calculate the load address of this entry
>> -      return getSectionLoadAddress(GOTSectionID) + (GOTIndex *
>> GOTEntrySize);
>> -    }
>> -  }
>> -
>> -  assert(GOTIndex != -1 && "Unable to find requested GOT entry.");
>> -  return 0;
>> +uint64_t RuntimeDyldELF::allocateGOTEntries(unsigned SectionID,
>>
>> +unsigned no) {
>> +  (void)SectionID; // The GOT Section is the same for all section in
>> +the object file
>> +  if (GOTSectionID == 0) {
>> +    GOTSectionID = Sections.size();
>> +    // Reserve a section id. We'll allocate the section later
>> +    // once we know the total size
>> +    Sections.push_back(SectionEntry(".got", 0, 0, 0));
>> +  }
>> +  uint64_t StartOffset = CurrentGOTIndex * getGOTEntrySize();
>> +  CurrentGOTIndex += no;
>> +  return StartOffset;
>> +}
>> +
>> +void RuntimeDyldELF::resolveGOTOffsetRelocation(unsigned SectionID,
>> +uint64_t Offset, uint64_t GOTOffset) {
>> +  // Fill in the relative address of the GOT Entry into the stub
>> +  RelocationEntry GOTRE(SectionID, Offset, ELF::R_X86_64_PC32,
>> +GOTOffset);
>> +  addRelocationForSection(GOTRE, GOTSectionID); }
>> +
>> +RelocationEntry RuntimeDyldELF::computeGOTOffsetRE(unsigned SectionID,
>> uint64_t GOTOffset, uint64_t SymbolOffset,
>> +                                                   uint32_t Type) {
>> +  (void)SectionID; // The GOT Section is the same for all section in
>> +the object file
>>
>> +  return RelocationEntry(GOTSectionID, GOTOffset, Type, SymbolOffset);
>>  }
>>
>>  void RuntimeDyldELF::finalizeLoad(const ObjectFile &Obj,
>>                                    ObjSectionToIDMap &SectionMap) {
>>    // If necessary, allocate the global offset table
>> -  size_t numGOTEntries = GOTEntries.size();
>> -  if (numGOTEntries != 0) {
>> +  if (GOTSectionID != 0) {
>>      // Allocate memory for the section
>> -    unsigned SectionID = Sections.size();
>> -    size_t TotalSize = numGOTEntries * getGOTEntrySize();
>> +    size_t TotalSize = CurrentGOTIndex * getGOTEntrySize();
>>      uint8_t *Addr = MemMgr.allocateDataSection(TotalSize,
>> getGOTEntrySize(),
>> -                                               SectionID, ".got", false);
>> +                                                GOTSectionID, ".got",
>> + false);
>>      if (!Addr)
>>        report_fatal_error("Unable to allocate memory for GOT!");
>>
>> -    GOTs.push_back(std::make_pair(SectionID, GOTEntries));
>> -    Sections.push_back(SectionEntry(".got", Addr, TotalSize, 0));
>> +    Sections[GOTSectionID] = SectionEntry(".got", Addr, TotalSize, 0);
>> +
>> +    if (Checker)
>> +      Checker->registerSection(Obj.getFileName(), GOTSectionID);
>> +
>>      // For now, initialize all GOT entries to zero.  We'll fill them in
>> as
>>      // needed when GOT-based relocations are applied.
>>      memset(Addr, 0, TotalSize);
>> @@ -1483,6 +1443,9 @@ void RuntimeDyldELF::finalizeLoad(const
>>        break;
>>      }
>>    }
>> +
>> +  GOTSectionID = 0;
>> +  CurrentGOTIndex = 0;
>>  }
>>
>>  bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile &Obj)
>> const {
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h (original)
>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h Mon Apr
>>
>> +++ 13 21:10:35 2015
>> @@ -80,16 +80,32 @@ class RuntimeDyldELF : public RuntimeDyl
>>                             ObjSectionToIDMap &LocalSections,
>>                             RelocationValueRef &Rel);
>>
>> -  uint64_t findGOTEntry(uint64_t LoadAddr, uint64_t Offset);
>>    size_t getGOTEntrySize();
>>
>> -  void updateGOTEntries(StringRef Name, uint64_t Addr) override;
>> +  SectionEntry &getSection(unsigned SectionID) { return
>> + Sections[SectionID]; }
>>
>> -  // Relocation entries for symbols whose position-independent offset is
>> -  // updated in a global offset table.
>> -  typedef SmallVector<RelocationValueRef, 2> GOTRelocations;
>> -  GOTRelocations GOTEntries; // List of entries requiring finalization.
>> -  SmallVector<std::pair<SID, GOTRelocations>, 8> GOTs; // Allocated
>> tables.
>> +  // Allocate no GOT entries for use in the given section.
>> +  uint64_t allocateGOTEntries(unsigned SectionID, unsigned no);
>> +
>> +  // Resolve the relvative address of GOTOffset in Section ID and place
>> + // it at the given Offset  void resolveGOTOffsetRelocation(unsigned
>> + SectionID, uint64_t Offset,
>> +                                  uint64_t GOTOffset);
>> +
>> +  // For a GOT entry referenced from SectionID, compute a relocation
>> + entry  // that will place the final resolved value in the GOT slot
>> + RelocationEntry computeGOTOffsetRE(unsigned SectionID,
>> +                                     uint64_t GOTOffset,
>> +                                     uint64_t SymbolOffset,
>> +                                     unsigned Type);
>> +
>> +  // The tentative ID for the GOT section  unsigned GOTSectionID;
>> +
>> +  // Records the current number of allocated slots in the GOT  // (This
>> + would be equivalent to GOTEntries.size() were it not for relocations
>> + // that consume more than one slot)  unsigned CurrentGOTIndex;
>>
>>    // When a module is loaded we save the SectionID of the EH frame
>> section
>>    // in a table until we receive a request to register all unregistered
>>
>> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
>> (original)
>> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Mon Apr
>> +++ 13 21:10:35 2015
>> @@ -361,10 +361,6 @@ protected:
>>    /// \brief Resolve relocations to external symbols.
>>    void resolveExternalSymbols();
>>
>> -  /// \brief Update GOT entries for external symbols.
>> -  // The base class does nothing.  ELF overrides this.
>> -  virtual void updateGOTEntries(StringRef Name, uint64_t Addr) {}
>> -
>>    // \brief Compute an upper bound of the memory that is required to
>> load all
>>    // sections
>>    void computeTotalAllocSize(const ObjectFile &Obj, uint64_t &CodeSize,
>>
>> Modified: llvm/trunk/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll?rev=234839&r1=234838&r2=234839&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll
>> (original)
>> +++ llvm/trunk/test/ExecutionEngine/MCJIT/cross-module-sm-pic-a.ll Mon
>> +++ Apr 13 21:10:35 2015
>> @@ -1,4 +1,5 @@
>>  ; RUN: %lli -extra-module=%p/Inputs/cross-module-b.ll
>> -relocation-model=pic -code-model=small %s > /dev/null
>> +; RUN: %lli -mtriple=x86_64-pc-linux
>> +-extra-module=%p/Inputs/cross-module-b.ll -relocation-model=pic
>> +-code-model=small %s > /dev/null
>>  ; XFAIL: mips, i686, i386
>>
>>  declare i32 @FB()
>>
>> Added:
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PIC_relocations.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PIC_relocations.s?rev=234839&view=auto
>>
>> ==============================================================================
>> ---
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PIC_relocations.s
>> (added)
>> +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/ELF_x64-64_PIC_reloc
>> +++ ations.s Mon Apr 13 21:10:35 2015
>> @@ -0,0 +1,31 @@
>> +# RUN: llvm-mc -triple=x86_64-pc-linux -relocation-model=pic
>> +-filetype=obj -o %T/test_ELF1_x86-64.o %s # RUN: llvm-mc
>> +-triple=x86_64-pc-linux -relocation-model=pic -filetype=obj -o
>> +%T/test_ELF2_x86-64.o %s # RUN: llc -mtriple=x86_64-pc-linux
>> +-relocation-model=pic -filetype=obj -o
>> +%T/test_ELF_ExternalGlobal_x86-64.o %S/Inputs/ExternalGlobal.ll # RUN:
>> +llvm-rtdyld -triple=x86_64-pc-linux -verify %T/test_ELF1_x86-64.o
>> +%T/test_ELF_ExternalGlobal_x86-64.o
>> +# Test that we can load this code twice at memory locations more than
>> +2GB apart # RUN: llvm-rtdyld -triple=x86_64-pc-linux -verify
>> +-map-section test_ELF1_x86-64.o,.got=0x10000 -map-section
>> +test_ELF2_x86-64.o,.text=0x100000000 -map-section
>> +test_ELF2_x86-64.o,.got=0x100010000 %T/test_ELF1_x86-64.o
>> +%T/test_ELF2_x86-64.o %T/test_ELF_ExternalGlobal_x86-64.o
>>
>> +
>> +# Assembly obtained by compiling the following and adding checks:
>> +# @G = external global i8*
>> +#
>> +# define i8* @foo() {
>> +#    %ret = load i8** @G
>> +#    ret i32 %ret
>> +# }
>> +#
>> +
>> +#
>> +       .text
>> +       .file   "ELF_x64-64_PIC_relocations.ll"
>> +       .align  16, 0x90
>> +       .type   foo, at function
>> +foo:                                    # @foo
>> +# BB#0:
>> +       movq    G at GOTPCREL(%rip), %rax
>> +       movl    (%rax), %eax
>> +       retq
>> +.Ltmp0:
>> +       .size   foo, .Ltmp0-foo
>> +
>> +
>> +       .section        ".note.GNU-stack","", at progbits
>>
>> Added:
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ExternalGlobal.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ExternalGlobal.ll?rev=234839&view=auto
>>
>> ==============================================================================
>> ---
>> llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ExternalGlobal.ll
>> (added)
>> +++ llvm/trunk/test/ExecutionEngine/RuntimeDyld/X86/Inputs/ExternalGloba
>>
>> +++ l.ll Mon Apr 13 21:10:35 2015
>> @@ -0,0 +1,2 @@
>> + at F = global i8 0
>> + at G = global i8* @F
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> ---------------------------------------------------------------------
>> Intel Israel (74) Limited
>>
>> This e-mail and any attachments may contain confidential material for
>> the sole use of the intended recipient(s). Any review or distribution
>> by others is strictly prohibited. If you are not the intended
>> recipient, please contact the sender and delete all copies.
>>
>>
>>
>> ---------------------------------------------------------------------
>> Intel Israel (74) Limited
>>
>> This e-mail and any attachments may contain confidential material for
>> the sole use of the intended recipient(s). Any review or distribution
>> by others is strictly prohibited. If you are not the intended
>> recipient, please contact the sender and delete all copies.
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150414/985d9e32/attachment.html>


More information about the llvm-commits mailing list