[llvm] r192504 - Adding multiple object support to MCJIT EH frame handling
Benjamin Kramer
benny.kra at gmail.com
Fri Oct 11 15:08:07 PDT 2013
On Fri, Oct 11, 2013 at 11:25 PM, Andrew Kaylor <andrew.kaylor at intel.com> wrote:
> Author: akaylor
> Date: Fri Oct 11 16:25:48 2013
> New Revision: 192504
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192504&view=rev
> Log:
> Adding multiple object support to MCJIT EH frame handling
>
> Added:
> llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll
> llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-b.ir
> Modified:
> llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h
> llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
> llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.h
> llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
> llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h
> llvm/trunk/tools/lli/RemoteMemoryManager.cpp
> llvm/trunk/tools/lli/RemoteMemoryManager.h
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RTDyldMemoryManager.h Fri Oct 11 16:25:48 2013
> @@ -53,7 +53,12 @@ public:
> StringRef SectionName, bool IsReadOnly) = 0;
>
> /// Register the EH frames with the runtime so that c++ exceptions work.
> - virtual void registerEHFrames(StringRef SectionData);
> + ///
> + /// \p Addr parameter provides the local address of the EH frame section
> + /// data, while \p LoadAddr provides the address of the data in the target
> + /// address space. If the section has not been remapped (which will usually
> + /// be the case for local execution) these two values will be the same.
> + virtual void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size);
>
> /// This method returns the address of the specified function or variable.
> /// It is used to resolve symbols during module linking.
>
> Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyld.h Fri Oct 11 16:25:48 2013
> @@ -64,9 +64,14 @@ public:
> /// This is the address which will be used for relocation resolution.
> void mapSectionAddress(const void *LocalAddress, uint64_t TargetAddress);
>
> - StringRef getErrorString();
> + /// Register any EH frame sections that have been loaded but not previously
> + /// registered with the memory manager. Note, RuntimeDyld is responsible
> + /// for identifying the EH frame and calling the memory manager with the
> + /// EH frame section data. However, the memory manager itself will handle
> + /// the actual target-specific EH frame registration.
> + void registerEHFrames();
>
> - StringRef getEHFrameSection();
> + StringRef getErrorString();
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Fri Oct 11 16:25:48 2013
> @@ -178,14 +178,12 @@ void MCJIT::finalizeLoadedModules() {
>
> if (ModuleStates[M].hasBeenLoaded() &&
> !ModuleStates[M].hasBeenFinalized()) {
> - // FIXME: This should be module specific!
> - StringRef EHData = Dyld.getEHFrameSection();
> - if (!EHData.empty())
> - MemMgr.registerEHFrames(EHData);
> ModuleStates[M] = ModuleFinalized;
> }
> }
>
> + Dyld.registerEHFrames();
> +
> // Set page permissions.
> MemMgr.finalizeMemory();
> }
> @@ -221,14 +219,12 @@ void MCJIT::finalizeObject() {
>
> if (ModuleStates[M].hasBeenLoaded() &&
> !ModuleStates[M].hasBeenFinalized()) {
> - // FIXME: This should be module specific!
> - StringRef EHData = Dyld.getEHFrameSection();
> - if (!EHData.empty())
> - MemMgr.registerEHFrames(EHData);
> ModuleStates[M] = ModuleFinalized;
> }
> }
>
> + Dyld.registerEHFrames();
> +
> // Set page permissions.
> MemMgr.finalizeMemory();
> }
> @@ -248,10 +244,7 @@ void MCJIT::finalizeModule(Module *M) {
> // Resolve any outstanding relocations.
> Dyld.resolveRelocations();
>
> - // FIXME: Should this be module specific?
> - StringRef EHData = Dyld.getEHFrameSection();
> - if (!EHData.empty())
> - MemMgr.registerEHFrames(EHData);
> + Dyld.registerEHFrames();
>
> // Set page permissions.
> MemMgr.finalizeMemory();
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.h Fri Oct 11 16:25:48 2013
> @@ -51,8 +51,8 @@ public:
> ClientMM->notifyObjectLoaded(EE, Obj);
> }
>
> - virtual void registerEHFrames(StringRef SectionData) {
> - ClientMM->registerEHFrames(SectionData);
> + virtual void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {
> + ClientMM->registerEHFrames(Addr, LoadAddr, Size);
> }
>
> virtual bool finalizeMemory(std::string *ErrMsg = 0) {
>
> Modified: llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RTDyldMemoryManager.cpp Fri Oct 11 16:25:48 2013
> @@ -54,10 +54,15 @@ static const char *processFDE(const char
> }
> #endif
>
> -void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) {
> +// This implementation handles frame registration for local targets.
> +// Memory managers for remote targets should re-implement this function
> +// and use the LoadAddr parameter.
> +void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr,
> + uint64_t LoadAddr,
> + size_t Size) {
> #if HAVE_EHTABLE_SUPPORT
> - const char *P = SectionData.data();
> - const char *End = SectionData.data() + SectionData.size();
> + const char *P = (const char *)Addr;
> + const char *End = P + Size;
> do {
> P = processFDE(P);
> } while(P != End);
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Fri Oct 11 16:25:48 2013
> @@ -29,8 +29,7 @@ RuntimeDyldImpl::~RuntimeDyldImpl() {}
>
> namespace llvm {
>
> -StringRef RuntimeDyldImpl::getEHFrameSection() {
> - return StringRef();
> +void RuntimeDyldImpl::registerEHFrames() {
> }
>
> // Resolve the relocations for all symbols we currently know about.
> @@ -171,7 +170,7 @@ ObjectImage *RuntimeDyldImpl::loadObject
> }
>
> // Give the subclasses a chance to tie-up any loose ends.
> - finalizeLoad();
> + finalizeLoad(LocalSections);
>
> return obj.take();
> }
> @@ -592,8 +591,8 @@ StringRef RuntimeDyld::getErrorString()
> return Dyld->getErrorString();
> }
>
> -StringRef RuntimeDyld::getEHFrameSection() {
> - return Dyld->getEHFrameSection();
> +void RuntimeDyld::registerEHFrames() {
> + return Dyld->registerEHFrames();
> }
>
> } // end namespace llvm
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp Fri Oct 11 16:25:48 2013
> @@ -151,12 +151,17 @@ void DyldELFObject<ELFT>::updateSymbolAd
>
> namespace llvm {
>
> -StringRef RuntimeDyldELF::getEHFrameSection() {
> - for (int i = 0, e = Sections.size(); i != e; ++i) {
> - if (Sections[i].Name == ".eh_frame")
> - return StringRef((const char*)Sections[i].Address, Sections[i].Size);
> +void RuntimeDyldELF::registerEHFrames() {
> + if (!MemMgr)
> + return;
> + for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) {
> + SID EHFrameSID = UnregisteredEHFrameSections[i];
> + uint8_t *EHFrameAddr = Sections[EHFrameSID].Address;
> + uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress;
> + size_t EHFrameSize = Sections[EHFrameSID].Size;
> + MemMgr->registerEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize);
> }
> - return StringRef();
> + UnregisteredEHFrameSections.clear();
> }
>
> ObjectImage *RuntimeDyldELF::createObjectImage(ObjectBuffer *Buffer) {
> @@ -1342,7 +1347,8 @@ uint64_t RuntimeDyldELF::findGOTEntry(ui
> return 0;
> }
>
> -void RuntimeDyldELF::finalizeLoad() {
> +void RuntimeDyldELF::finalizeLoad(ObjSectionToIDMap &SectionMap) {
> + // If necessary, allocate the global offset table
> if (MemMgr) {
> // Allocate the GOT if necessary
> size_t numGOTEntries = GOTEntries.size();
> @@ -1365,6 +1371,18 @@ void RuntimeDyldELF::finalizeLoad() {
> else {
> report_fatal_error("Unable to allocate memory for GOT!");
> }
> +
> + // Look for and record the EH frame section.
> + ObjSectionToIDMap::iterator i, e;
> + for (i = SectionMap.begin(), e = SectionMap.end(); i != e; ++i) {
> + const SectionRef &Section = i->first;
> + StringRef Name;
> + Section.getName(Name);
> + if (Name == ".eh_frame") {
> + UnregisteredEHFrameSections.push_back(i->second);
> + break;
> + }
> + }
> }
>
> bool RuntimeDyldELF::isCompatibleFormat(const ObjectBuffer *Buffer) const {
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h Fri Oct 11 16:25:48 2013
> @@ -94,11 +94,15 @@ class RuntimeDyldELF : public RuntimeDyl
>
> // Relocation entries for symbols whose position-independant offset is
> // updated in a global offset table.
> - typedef unsigned SID; // Type for SectionIDs
> typedef SmallVector<RelocationValueRef, 2> GOTRelocations;
> GOTRelocations GOTEntries; // List of entries requiring finalization.
> SmallVector<std::pair<SID, GOTRelocations>, 8> GOTs; // Allocated tables.
>
> + // 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
> + // EH frame sections with the memory manager.
> + SmallVector<SID, 2> UnregisteredEHFrameSections;
> +
> public:
> RuntimeDyldELF(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm)
> {}
> @@ -112,8 +116,8 @@ public:
> StubMap &Stubs);
> virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const;
> virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer);
> - virtual StringRef getEHFrameSection();
> - virtual void finalizeLoad();
> + virtual void registerEHFrames();
> + virtual void finalizeLoad(ObjSectionToIDMap &SectionMap);
> virtual ~RuntimeDyldELF();
> };
>
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h Fri Oct 11 16:25:48 2013
> @@ -147,6 +147,9 @@ protected:
> typedef SmallVector<SectionEntry, 64> SectionList;
> SectionList Sections;
>
> + typedef unsigned SID; // Type for SectionIDs
> + #define RTDYLD_INVALID_SECTION_ID ((SID)(-1))
> +
> // Keep a map of sections from object file to the SectionID which
> // references it.
> typedef std::map<SectionRef, unsigned> ObjSectionToIDMap;
> @@ -357,9 +360,9 @@ public:
>
> virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const = 0;
>
> - virtual StringRef getEHFrameSection();
> + virtual void registerEHFrames();
>
> - virtual void finalizeLoad() {}
> + virtual void finalizeLoad(ObjSectionToIDMap &SectionMap) {}
> };
>
> } // end namespace llvm
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp Fri Oct 11 16:25:48 2013
> @@ -55,33 +55,58 @@ static intptr_t computeDelta(SectionEntr
> return ObjDistance - MemDistance;
> }
>
> -StringRef RuntimeDyldMachO::getEHFrameSection() {
> - SectionEntry *Text = NULL;
> - SectionEntry *EHFrame = NULL;
> - SectionEntry *ExceptTab = NULL;
> - for (int i = 0, e = Sections.size(); i != e; ++i) {
> - if (Sections[i].Name == "__eh_frame")
> - EHFrame = &Sections[i];
> - else if (Sections[i].Name == "__text")
> - Text = &Sections[i];
> - else if (Sections[i].Name == "__gcc_except_tab")
> - ExceptTab = &Sections[i];
> - }
> - if (Text == NULL || EHFrame == NULL)
> - return StringRef();
> +void RuntimeDyldMachO::registerEHFrames() {
> +
> + if (!MemMgr)
> + return;
> + for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) {
> + EHFrameRelatedSections &SectionInfo = UnregisteredEHFrameSections[i];
> + if (SectionInfo.EHFrameSID == RTDYLD_INVALID_SECTION_ID ||
> + SectionInfo.TextSID == RTDYLD_INVALID_SECTION_ID)
> + continue;
> + SectionEntry *Text = &Sections[SectionInfo.TextSID];
> + SectionEntry *EHFrame = &Sections[SectionInfo.EHFrameSID];
> + SectionEntry *ExceptTab = NULL;
> + if (SectionInfo.ExceptTabSID != RTDYLD_INVALID_SECTION_ID)
> + ExceptTab = &Sections[SectionInfo.ExceptTabSID];
>
> - intptr_t DeltaForText = computeDelta(Text, EHFrame);
> - intptr_t DeltaForEH = 0;
> - if (ExceptTab)
> - DeltaForEH = computeDelta(ExceptTab, EHFrame);
> -
> - unsigned char *P = EHFrame->Address;
> - unsigned char *End = P + EHFrame->Size;
> - do {
> - P = processFDE(P, DeltaForText, DeltaForEH);
> - } while(P != End);
> + intptr_t DeltaForText = computeDelta(Text, EHFrame);
> + intptr_t DeltaForEH = 0;
> + if (ExceptTab)
> + DeltaForEH = computeDelta(ExceptTab, EHFrame);
>
> - return StringRef((char*)EHFrame->Address, EHFrame->Size);
> + unsigned char *P = EHFrame->Address;
> + unsigned char *End = P + EHFrame->Size;
> + do {
> + P = processFDE(P, DeltaForText, DeltaForEH);
> + } while(P != End);
> +
> + MemMgr->registerEHFrames(EHFrame->Address,
> + EHFrame->LoadAddress,
> + EHFrame->Size);
> + }
> + UnregisteredEHFrameSections.clear();
> +}
> +
> +void RuntimeDyldMachO::finalizeLoad(ObjSectionToIDMap &SectionMap) {
> + unsigned EHFrameSID = RTDYLD_INVALID_SECTION_ID;
> + unsigned TextSID = RTDYLD_INVALID_SECTION_ID;
> + unsigned ExceptTabSID = RTDYLD_INVALID_SECTION_ID;
> + ObjSectionToIDMap::iterator i, e;
> + for (i = SectionMap.begin(), e = SectionMap.end(); i != e; ++i) {
> + const SectionRef &Section = i->first;
> + StringRef Name;
> + Section.getName(Name);
> + if (Name == "__eh_frame")
> + EHFrameSID = i->second;
> + else if (Name == "__text")
> + TextSID = i->second;
> + else if (Name == "__gcc_except_tab")
> + ExceptTabSID = i->second;
> + }
> + UnregisteredEHFrameSections.push_back(EHFrameRelatedSections(EHFrameSID,
> + TextSID,
> + ExceptTabSID));
> }
>
> // The target location for the relocation is described by RE.SectionID and
>
> Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h Fri Oct 11 16:25:48 2013
> @@ -54,6 +54,22 @@ class RuntimeDyldMachO : public RuntimeD
> int64_t Addend,
> bool isPCRel,
> unsigned Size);
> +
> + struct EHFrameRelatedSections {
> + EHFrameRelatedSections() : EHFrameSID(RTDYLD_INVALID_SECTION_ID),
> + TextSID(RTDYLD_INVALID_SECTION_ID),
> + ExceptTabSID(RTDYLD_INVALID_SECTION_ID) {}
> + EHFrameRelatedSections(SID EH, SID T, SID Ex)
> + : EHFrameSID(EH), TextSID(T), ExceptTabSID(Ex) {}
> + SID EHFrameSID;
> + SID TextSID;
> + SID ExceptTabSID;
> + };
> +
> + // 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
> + // EH frame sections with the memory manager.
> + SmallVector<EHFrameRelatedSections, 2> UnregisteredEHFrameSections;
> public:
> RuntimeDyldMachO(RTDyldMemoryManager *mm) : RuntimeDyldImpl(mm) {}
>
> @@ -65,7 +81,8 @@ public:
> const SymbolTableMap &Symbols,
> StubMap &Stubs);
> virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const;
> - virtual StringRef getEHFrameSection();
> + virtual void registerEHFrames();
> + virtual void finalizeLoad(ObjSectionToIDMap &SectionMap);
> };
>
> } // end namespace llvm
>
> Added: llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll?rev=192504&view=auto
> ==============================================================================
> --- llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll (added)
> +++ llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-a.ll Fri Oct 11 16:25:48 2013
> @@ -0,0 +1,35 @@
> +; RUN: %lli_mcjit -extra-modules=%p/multi-module-eh-b.ir %s
> +; XFAIL: arm, cygwin, win32, mingw
> +declare i8* @__cxa_allocate_exception(i64)
> +declare void @__cxa_throw(i8*, i8*, i8*)
> +declare i32 @__gxx_personality_v0(...)
> +declare void @__cxa_end_catch()
> +declare i8* @__cxa_begin_catch(i8*)
> +
> + at _ZTIi = external constant i8*
> +
> +declare i32 @FB()
> +
> +define void @throwException() {
> + %exception = tail call i8* @__cxa_allocate_exception(i64 4)
> + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null)
> + unreachable
> +}
> +
> +define i32 @main() {
> +entry:
> + invoke void @throwException()
> + to label %try.cont unwind label %lpad
> +
> +lpad:
> + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
> + catch i8* bitcast (i8** @_ZTIi to i8*)
> + %e = extractvalue { i8*, i32 } %p, 0
> + call i8* @__cxa_begin_catch(i8* %e)
> + call void @__cxa_end_catch()
> + br label %try.cont
> +
> +try.cont:
> + %r = call i32 @FB( )
> + ret i32 %r
> +}
>
> Added: llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-b.ir
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-b.ir?rev=192504&view=auto
> ==============================================================================
> --- llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-b.ir (added)
> +++ llvm/trunk/test/ExecutionEngine/MCJIT/multi-module-eh-b.ir Fri Oct 11 16:25:48 2013
> @@ -0,0 +1,30 @@
> +declare i8* @__cxa_allocate_exception(i64)
> +declare void @__cxa_throw(i8*, i8*, i8*)
> +declare i32 @__gxx_personality_v0(...)
> +declare void @__cxa_end_catch()
> +declare i8* @__cxa_begin_catch(i8*)
> +
> + at _ZTIi = external constant i8*
> +
> +define void @throwException_B() {
> + %exception = tail call i8* @__cxa_allocate_exception(i64 4)
> + call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null)
> + unreachable
> +}
> +
> +define i32 @FB() {
> +entry:
> + invoke void @throwException_B()
> + to label %try.cont unwind label %lpad
> +
> +lpad:
> + %p = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
> + catch i8* bitcast (i8** @_ZTIi to i8*)
> + %e = extractvalue { i8*, i32 } %p, 0
> + call i8* @__cxa_begin_catch(i8* %e)
> + call void @__cxa_end_catch()
> + br label %try.cont
> +
> +try.cont:
> + ret i32 0
> +}
>
> Modified: llvm/trunk/tools/lli/RemoteMemoryManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/RemoteMemoryManager.cpp?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lli/RemoteMemoryManager.cpp (original)
> +++ llvm/trunk/tools/lli/RemoteMemoryManager.cpp Fri Oct 11 16:25:48 2013
> @@ -204,27 +204,3 @@ uint8_t *RemoteMemoryManager::allocateGl
> void RemoteMemoryManager::deallocateFunctionBody(void *Body) {
> llvm_unreachable("Unexpected!");
> }
> -
> -static int jit_noop() {
> - return 0;
> -}
> -
> -void *RemoteMemoryManager::getPointerToNamedFunction(const std::string &Name,
> - bool AbortOnFailure) {
> - // We should not invoke parent's ctors/dtors from generated main()!
> - // On Mingw and Cygwin, the symbol __main is resolved to
> - // callee's(eg. tools/lli) one, to invoke wrong duplicated ctors
> - // (and register wrong callee's dtors with atexit(3)).
> - // We expect ExecutionEngine::runStaticConstructorsDestructors()
> - // is called before ExecutionEngine::runFunctionAsMain() is called.
> - if (Name == "__main") return (void*)(intptr_t)&jit_noop;
> -
> - // FIXME: Would it be responsible to provide GOT?
> - if (AbortOnFailure) {
> - if (Name == "_GLOBAL_OFFSET_TABLE_")
> - report_fatal_error("Program used external function '" + Name +
> - "' which could not be resolved!");
> - }
> -
> - return NULL;
> -}
>
> Modified: llvm/trunk/tools/lli/RemoteMemoryManager.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lli/RemoteMemoryManager.h?rev=192504&r1=192503&r2=192504&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lli/RemoteMemoryManager.h (original)
> +++ llvm/trunk/tools/lli/RemoteMemoryManager.h Fri Oct 11 16:25:48 2013
> @@ -74,13 +74,20 @@ public:
> unsigned SectionID, StringRef SectionName,
> bool IsReadOnly);
>
> - void *getPointerToNamedFunction(const std::string &Name,
> - bool AbortOnFailure = true);
> + // For now, remote symbol resolution is not support in lli. The MCJIT
> + // interface does support this, but clients must provide their own
> + // mechanism for finding remote symbol addresses. MCJIT will resolve
> + // symbols from Modules it contains.
> + uint64_t getSymbolAddress(const std::string &Name) {}
This method should return something.
- Ben
>
> void notifyObjectLoaded(ExecutionEngine *EE, const ObjectImage *Obj);
>
> bool finalizeMemory(std::string *ErrMsg);
>
> + // For now, remote EH frame registration isn't supported. Remote symbol
> + // resolution is a prerequisite to supporting remote EH frame registration.
> + void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {}
> +
> // This is a non-interface function used by lli
> void setRemoteTarget(RemoteTarget *T) { Target = T; }
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list