diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2024-01-07 23:04:38 +0000 |
| commit | 0e1e0ce556810ad5f9d45485e686f0653530516c (patch) | |
| tree | ab02ce7c4fafc0518430e9cec77d41201bce23f0 /contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp | |
| parent | c3eb0b7c19221f3a2133ab14d3ffffa61ec0c4bc (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp | 162 |
1 files changed, 104 insertions, 58 deletions
diff --git a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp index 377a59993eb0..fb685e6c3727 100644 --- a/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp +++ b/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp @@ -156,8 +156,7 @@ Error CtorDtorRunner::run() { for (auto &KV : CtorDtorsByPriority) { for (auto &Name : KV.second) { assert(CtorDtorMap->count(Name) && "No entry for Name"); - auto CtorDtor = reinterpret_cast<CtorDtorTy>( - static_cast<uintptr_t>((*CtorDtorMap)[Name].getAddress())); + auto CtorDtor = (*CtorDtorMap)[Name].getAddress().toPtr<CtorDtorTy>(); CtorDtor(); } } @@ -186,12 +185,10 @@ int LocalCXXRuntimeOverridesBase::CXAAtExitOverride(DestructorPtr Destructor, Error LocalCXXRuntimeOverrides::enable(JITDylib &JD, MangleAndInterner &Mangle) { SymbolMap RuntimeInterposes; - RuntimeInterposes[Mangle("__dso_handle")] = - JITEvaluatedSymbol(toTargetAddress(&DSOHandleOverride), - JITSymbolFlags::Exported); - RuntimeInterposes[Mangle("__cxa_atexit")] = - JITEvaluatedSymbol(toTargetAddress(&CXAAtExitOverride), - JITSymbolFlags::Exported); + RuntimeInterposes[Mangle("__dso_handle")] = { + ExecutorAddr::fromPtr(&DSOHandleOverride), JITSymbolFlags::Exported}; + RuntimeInterposes[Mangle("__cxa_atexit")] = { + ExecutorAddr::fromPtr(&CXAAtExitOverride), JITSymbolFlags::Exported}; return JD.define(absoluteSymbols(std::move(RuntimeInterposes))); } @@ -257,11 +254,8 @@ Error DynamicLibrarySearchGenerator::tryToGenerate( std::string Tmp((*Name).data() + HasGlobalPrefix, (*Name).size() - HasGlobalPrefix); - if (void *Addr = Dylib.getAddressOfSymbol(Tmp.c_str())) { - NewSymbols[Name] = JITEvaluatedSymbol( - static_cast<JITTargetAddress>(reinterpret_cast<uintptr_t>(Addr)), - JITSymbolFlags::Exported); - } + if (void *P = Dylib.getAddressOfSymbol(Tmp.c_str())) + NewSymbols[Name] = {ExecutorAddr::fromPtr(P), JITSymbolFlags::Exported}; } if (NewSymbols.empty()) @@ -274,57 +268,41 @@ Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> StaticLibraryDefinitionGenerator::Load( ObjectLayer &L, const char *FileName, GetObjectFileInterface GetObjFileInterface) { - auto ArchiveBuffer = MemoryBuffer::getFile(FileName); - - if (!ArchiveBuffer) - return createFileError(FileName, ArchiveBuffer.getError()); - - return Create(L, std::move(*ArchiveBuffer), std::move(GetObjFileInterface)); -} - -Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> -StaticLibraryDefinitionGenerator::Load( - ObjectLayer &L, const char *FileName, const Triple &TT, - GetObjectFileInterface GetObjFileInterface) { auto B = object::createBinary(FileName); if (!B) return createFileError(FileName, B.takeError()); // If this is a regular archive then create an instance from it. - if (isa<object::Archive>(B->getBinary())) - return Create(L, std::move(B->takeBinary().second), + if (isa<object::Archive>(B->getBinary())) { + auto [Archive, ArchiveBuffer] = B->takeBinary(); + return Create(L, std::move(ArchiveBuffer), + std::unique_ptr<object::Archive>( + static_cast<object::Archive *>(Archive.release())), std::move(GetObjFileInterface)); + } // If this is a universal binary then search for a slice matching the given // Triple. if (auto *UB = cast<object::MachOUniversalBinary>(B->getBinary())) { - for (const auto &Obj : UB->objects()) { - auto ObjTT = Obj.getTriple(); - if (ObjTT.getArch() == TT.getArch() && - ObjTT.getSubArch() == TT.getSubArch() && - (TT.getVendor() == Triple::UnknownVendor || - ObjTT.getVendor() == TT.getVendor())) { - // We found a match. Create an instance from a buffer covering this - // slice. - auto SliceBuffer = MemoryBuffer::getFileSlice(FileName, Obj.getSize(), - Obj.getOffset()); - if (!SliceBuffer) - return make_error<StringError>( - Twine("Could not create buffer for ") + TT.str() + " slice of " + - FileName + ": [ " + formatv("{0:x}", Obj.getOffset()) + - " .. " + formatv("{0:x}", Obj.getOffset() + Obj.getSize()) + - ": " + SliceBuffer.getError().message(), - SliceBuffer.getError()); - return Create(L, std::move(*SliceBuffer), - std::move(GetObjFileInterface)); - } - } - return make_error<StringError>(Twine("Universal binary ") + FileName + - " does not contain a slice for " + - TT.str(), - inconvertibleErrorCode()); + const auto &TT = L.getExecutionSession().getTargetTriple(); + + auto SliceRange = getSliceRangeForArch(*UB, TT); + if (!SliceRange) + return SliceRange.takeError(); + + auto SliceBuffer = MemoryBuffer::getFileSlice(FileName, SliceRange->second, + SliceRange->first); + if (!SliceBuffer) + return make_error<StringError>( + Twine("Could not create buffer for ") + TT.str() + " slice of " + + FileName + ": [ " + formatv("{0:x}", SliceRange->first) + " .. " + + formatv("{0:x}", SliceRange->first + SliceRange->second) + ": " + + SliceBuffer.getError().message(), + SliceBuffer.getError()); + + return Create(L, std::move(*SliceBuffer), std::move(GetObjFileInterface)); } return make_error<StringError>(Twine("Unrecognized file type for ") + @@ -335,12 +313,15 @@ StaticLibraryDefinitionGenerator::Load( Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> StaticLibraryDefinitionGenerator::Create( ObjectLayer &L, std::unique_ptr<MemoryBuffer> ArchiveBuffer, + std::unique_ptr<object::Archive> Archive, GetObjectFileInterface GetObjFileInterface) { + Error Err = Error::success(); std::unique_ptr<StaticLibraryDefinitionGenerator> ADG( new StaticLibraryDefinitionGenerator( - L, std::move(ArchiveBuffer), std::move(GetObjFileInterface), Err)); + L, std::move(ArchiveBuffer), std::move(Archive), + std::move(GetObjFileInterface), Err)); if (Err) return std::move(Err); @@ -348,6 +329,50 @@ StaticLibraryDefinitionGenerator::Create( return std::move(ADG); } +Expected<std::unique_ptr<StaticLibraryDefinitionGenerator>> +StaticLibraryDefinitionGenerator::Create( + ObjectLayer &L, std::unique_ptr<MemoryBuffer> ArchiveBuffer, + GetObjectFileInterface GetObjFileInterface) { + + auto B = object::createBinary(ArchiveBuffer->getMemBufferRef()); + if (!B) + return B.takeError(); + + // If this is a regular archive then create an instance from it. + if (isa<object::Archive>(*B)) + return Create(L, std::move(ArchiveBuffer), + std::unique_ptr<object::Archive>( + static_cast<object::Archive *>(B->release())), + std::move(GetObjFileInterface)); + + // If this is a universal binary then search for a slice matching the given + // Triple. + if (auto *UB = cast<object::MachOUniversalBinary>(B->get())) { + + const auto &TT = L.getExecutionSession().getTargetTriple(); + + auto SliceRange = getSliceRangeForArch(*UB, TT); + if (!SliceRange) + return SliceRange.takeError(); + + MemoryBufferRef SliceRef( + StringRef(ArchiveBuffer->getBufferStart() + SliceRange->first, + SliceRange->second), + ArchiveBuffer->getBufferIdentifier()); + + auto Archive = object::Archive::create(SliceRef); + if (!Archive) + return Archive.takeError(); + + return Create(L, std::move(ArchiveBuffer), std::move(*Archive), + std::move(GetObjFileInterface)); + } + + return make_error<StringError>(Twine("Unrecognized file type for ") + + ArchiveBuffer->getBufferIdentifier(), + inconvertibleErrorCode()); +} + Error StaticLibraryDefinitionGenerator::tryToGenerate( LookupState &LS, LookupKind K, JITDylib &JD, JITDylibLookupFlags JDLookupFlags, const SymbolLookupSet &Symbols) { @@ -417,12 +442,33 @@ Error StaticLibraryDefinitionGenerator::buildObjectFilesMap() { return Error::success(); } +Expected<std::pair<size_t, size_t>> +StaticLibraryDefinitionGenerator::getSliceRangeForArch( + object::MachOUniversalBinary &UB, const Triple &TT) { + + for (const auto &Obj : UB.objects()) { + auto ObjTT = Obj.getTriple(); + if (ObjTT.getArch() == TT.getArch() && + ObjTT.getSubArch() == TT.getSubArch() && + (TT.getVendor() == Triple::UnknownVendor || + ObjTT.getVendor() == TT.getVendor())) { + // We found a match. Return the range for the slice. + return std::make_pair(Obj.getOffset(), Obj.getSize()); + } + } + + return make_error<StringError>(Twine("Universal binary ") + UB.getFileName() + + " does not contain a slice for " + + TT.str(), + inconvertibleErrorCode()); +} + StaticLibraryDefinitionGenerator::StaticLibraryDefinitionGenerator( ObjectLayer &L, std::unique_ptr<MemoryBuffer> ArchiveBuffer, + std::unique_ptr<object::Archive> Archive, GetObjectFileInterface GetObjFileInterface, Error &Err) : L(L), GetObjFileInterface(std::move(GetObjFileInterface)), - ArchiveBuffer(std::move(ArchiveBuffer)), - Archive(std::make_unique<object::Archive>(*this->ArchiveBuffer, Err)) { + ArchiveBuffer(std::move(ArchiveBuffer)), Archive(std::move(Archive)) { ErrorAsOutParameter _(&Err); if (!this->GetObjFileInterface) this->GetObjFileInterface = getObjectFileInterface; @@ -506,7 +552,7 @@ DLLImportDefinitionGenerator::getTargetEndianness(const Triple &TT) { Expected<std::unique_ptr<jitlink::LinkGraph>> DLLImportDefinitionGenerator::createStubsGraph(const SymbolMap &Resolved) { - Triple TT = ES.getExecutorProcessControl().getTargetTriple(); + Triple TT = ES.getTargetTriple(); auto PointerSize = getTargetEndianness(TT); if (!PointerSize) return PointerSize.takeError(); @@ -522,13 +568,13 @@ DLLImportDefinitionGenerator::createStubsGraph(const SymbolMap &Resolved) { for (auto &KV : Resolved) { jitlink::Symbol &Target = G->addAbsoluteSymbol( - *KV.first, ExecutorAddr(KV.second.getAddress()), *PointerSize, + *KV.first, KV.second.getAddress(), *PointerSize, jitlink::Linkage::Strong, jitlink::Scope::Local, false); // Create __imp_ symbol jitlink::Symbol &Ptr = jitlink::x86_64::createAnonymousPointer(*G, Sec, &Target); - auto NameCopy = G->allocateString(Twine(getImpPrefix()) + *KV.first); + auto NameCopy = G->allocateContent(Twine(getImpPrefix()) + *KV.first); StringRef NameCopyRef = StringRef(NameCopy.data(), NameCopy.size()); Ptr.setName(NameCopyRef); Ptr.setLinkage(jitlink::Linkage::Strong); |
