aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2024-02-20 10:07:29 -0800
committerLang Hames <lhames@gmail.com>2024-02-20 10:23:54 -0800
commitc625b996527335c4fd6b6aa246655a993487e846 (patch)
treeff7f37b9dd70c234a801f31acb628257a0562df3 /llvm/tools
parent5454991c29945d791b82a9e25b1f605f54c75710 (diff)
downloadllvm-c625b996527335c4fd6b6aa246655a993487e846.zip
llvm-c625b996527335c4fd6b6aa246655a993487e846.tar.gz
llvm-c625b996527335c4fd6b6aa246655a993487e846.tar.bz2
[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.
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-jitlink/llvm-jitlink.cpp61
1 files changed, 61 insertions, 0 deletions
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<std::string>
cl::desc("Inject symbol aliases (syntax: <alias-name>=<aliasee>)"),
cl::cat(JITLinkCategory));
+static cl::list<std::string>
+ SectCreate("sectcreate",
+ cl::desc("given <sectname>,<filename>[:<sym>=<offset>,...] "
+ "add the content of <filename> to <sectname>"),
+ cl::cat(JITLinkCategory));
+
static cl::list<std::string> 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<unsigned, JITDylib *> &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<StringError>("In -sectcreate=" + SCArg +
+ ", filename component cannot be empty",
+ inconvertibleErrorCode());
+ if (FileName.empty())
+ return make_error<StringError>("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<StringError>("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<SectCreateMaterializationUnit>(
+ 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;