[llvm] r234839 - [RuntimeDyldELF] Improve GOT support

Keno Fischer kfischer at college.harvard.edu
Tue Apr 14 08:12:35 PDT 2015


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/012af1e9/attachment.html>


More information about the llvm-commits mailing list