From cf49aa3908d05a5adf72b22af3dbc8dec9b316d7 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Thu, 25 Apr 2019 05:02:10 +0000 Subject: [PATCH] [llvm-rtdyld] Add support for passing command line arguments to rtdyld-run code. The --args option can now be used to pass arguments to code linked with llvm-rtdyld. E.g. $ llvm-rtdyld file1.o file2.o --args a b c is equivalent to: $ ld -o program file1.o file2.o $ ./program a b c This is the rtdyld counterpart to the jitlink change in r359115, and makes benchmarking and comparison between the tools easier. llvm-svn: 359168 --- llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp index e4e8b57da6c0..d8382a1d29fa 100644 --- a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -77,6 +77,10 @@ Dylibs("dylib", cl::desc("Add library."), cl::ZeroOrMore); +static cl::list InputArgv("args", cl::Positional, + cl::desc("..."), + cl::ZeroOrMore, cl::PositionalEatsArgs); + static cl::opt TripleName("triple", cl::desc("Target triple for disassembler")); @@ -208,7 +212,15 @@ public: if (I != DummyExterns.end()) return JITSymbol(I->second, JITSymbolFlags::Exported); - return RTDyldMemoryManager::findSymbol(Name); + if (auto Sym = RTDyldMemoryManager::findSymbol(Name)) + return Sym; + else if (auto Err = Sym.takeError()) + ExitOnErr(std::move(Err)); + else + ExitOnErr(make_error("Could not find definition for \"" + + Name + "\"", + inconvertibleErrorCode())); + llvm_unreachable("Should have returned or exited by now"); } void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, @@ -533,11 +545,13 @@ static int executeInput() { int (*Main)(int, const char**) = (int(*)(int,const char**)) uintptr_t(MainAddress); - const char **Argv = new const char*[2]; + std::vector Argv; // Use the name of the first input object module as argv[0] for the target. - Argv[0] = InputFileList[0].c_str(); - Argv[1] = nullptr; - return Main(1, Argv); + Argv.push_back(InputFileList[0].data()); + for (auto &Arg : InputArgv) + Argv.push_back(Arg.data()); + Argv.push_back(nullptr); + return Main(Argv.size() - 1, Argv.data()); } static int checkAllExpressions(RuntimeDyldChecker &Checker) {