From c625b996527335c4fd6b6aa246655a993487e846 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 20 Feb 2024 10:07:29 -0800 Subject: [ORC] Add SectCreateMaterializationUnit, llvm-jitlink -sectcreate option. The SectCreateMaterializationUnit creates a LinkGraph with a single named section containing a single named block whose content is given by a MemoryBuffer. It is intended to support emulation of ld64's -sectcreate option. --- llvm/tools/llvm-jitlink/llvm-jitlink.cpp | 61 ++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'llvm/tools') diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp index 769ed17..f628077 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -30,6 +30,7 @@ #include "llvm/ExecutionEngine/Orc/MachOPlatform.h" #include "llvm/ExecutionEngine/Orc/MapperJITLinkMemoryManager.h" #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" +#include "llvm/ExecutionEngine/Orc/SectCreate.h" #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.h" @@ -162,6 +163,12 @@ static cl::list cl::desc("Inject symbol aliases (syntax: =)"), cl::cat(JITLinkCategory)); +static cl::list + SectCreate("sectcreate", + cl::desc("given ,[:=,...] " + "add the content of to "), + cl::cat(JITLinkCategory)); + static cl::list TestHarnesses("harness", cl::Positional, cl::desc("Test harness files"), cl::PositionalEatsArgs, @@ -1666,6 +1673,57 @@ static Error addAliases(Session &S, return Error::success(); } +static Error addSectCreates(Session &S, + const std::map &IdxToJD) { + for (auto SCItr = SectCreate.begin(), SCEnd = SectCreate.end(); + SCItr != SCEnd; ++SCItr) { + + unsigned SCArgIdx = SectCreate.getPosition(SCItr - SectCreate.begin()); + auto &JD = *std::prev(IdxToJD.lower_bound(SCArgIdx))->second; + + StringRef SCArg(*SCItr); + + auto [SectAndFileName, ExtraSymbolsString] = SCArg.split(':'); + auto [SectName, FileName] = SectAndFileName.rsplit(','); + if (SectName.empty()) + return make_error("In -sectcreate=" + SCArg + + ", filename component cannot be empty", + inconvertibleErrorCode()); + if (FileName.empty()) + return make_error("In -sectcreate=" + SCArg + + ", filename component cannot be empty", + inconvertibleErrorCode()); + + auto Content = MemoryBuffer::getFile(FileName); + if (!Content) + return createFileError(FileName, errorCodeToError(Content.getError())); + + SectCreateMaterializationUnit::ExtraSymbolsMap ExtraSymbols; + while (!ExtraSymbolsString.empty()) { + StringRef NextSymPair; + std::tie(NextSymPair, ExtraSymbolsString) = ExtraSymbolsString.split(','); + + auto [Sym, OffsetString] = NextSymPair.split('='); + size_t Offset; + + if (OffsetString.getAsInteger(0, Offset)) + return make_error("In -sectcreate=" + SCArg + ", " + + OffsetString + + " is not a valid integer", + inconvertibleErrorCode()); + + ExtraSymbols[S.ES.intern(Sym)] = {JITSymbolFlags::Exported, Offset}; + } + + if (auto Err = JD.define(std::make_unique( + S.ObjLayer, SectName.str(), MemProt::Read, 16, std::move(*Content), + std::move(ExtraSymbols)))) + return Err; + } + + return Error::success(); +} + static Error addTestHarnesses(Session &S) { LLVM_DEBUG(dbgs() << "Adding test harness objects...\n"); for (auto HarnessFile : TestHarnesses) { @@ -2016,6 +2074,9 @@ static Error addSessionInputs(Session &S) { if (auto Err = addAliases(S, IdxToJD)) return Err; + if (auto Err = addSectCreates(S, IdxToJD)) + return Err; + if (!TestHarnesses.empty()) if (auto Err = addTestHarnesses(S)) return Err; -- cgit v1.1