From a104dee58e136c7a90f2eb3ecaf25a7efd07bcfc Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 24 Apr 2019 17:23:05 +0000 Subject: [PATCH] [JITLink] Add support for passing arguments to jit-linked code. The --args option can now be used to pass arguments to code linked with llvm-jitlink. E.g. $ llvm-jitlink file1.o file2.o --args a b c is equivalent to: $ ld -o program file1.o file2.o $ ./program a b c git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359115 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-jitlink/llvm-jitlink.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tools/llvm-jitlink/llvm-jitlink.cpp b/tools/llvm-jitlink/llvm-jitlink.cpp index 29516f093fe..383442f8a4c 100644 --- a/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/tools/llvm-jitlink/llvm-jitlink.cpp @@ -64,6 +64,10 @@ static cl::list Dylibs("dlopen", cl::desc("Dynamic libraries to load before linking"), cl::ZeroOrMore); +static cl::list InputArgv("args", cl::Positional, + cl::desc("..."), + cl::ZeroOrMore, cl::PositionalEatsArgs); + static cl::opt NoProcessSymbols("no-process-syms", cl::desc("Do not resolve to llvm-jitlink process symbols"), @@ -335,13 +339,18 @@ Triple getFirstFileTriple() { return Obj->makeTriple(); } -void setEntryPointNameIfNotProvided(const Session &S) { +Error sanitizeArguments(const Session &S) { if (EntryPointName.empty()) { if (S.TT.getObjectFormat() == Triple::MachO) EntryPointName = "_main"; else EntryPointName = "main"; } + + if (NoExec && !InputArgv.empty()) + outs() << "Warning: --args passed to -noexec run will be ignored.\n"; + + return Error::success(); } Error loadProcessSymbols(Session &S) { @@ -568,6 +577,8 @@ Expected runEntryPoint(Session &S, JITEvaluatedSymbol EntryPoint) { std::vector EntryPointArgs; EntryPointArgs.push_back(PNStorage.get()); + for (auto &InputArg : InputArgv) + EntryPointArgs.push_back(InputArg.data()); EntryPointArgs.push_back(nullptr); using MainTy = int (*)(int, const char *[]); @@ -588,7 +599,7 @@ int main(int argc, char *argv[]) { Session S(getFirstFileTriple()); - setEntryPointNameIfNotProvided(S); + ExitOnErr(sanitizeArguments(S)); if (!NoProcessSymbols) ExitOnErr(loadProcessSymbols(S)); -- 2.50.1