[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
This commit is contained in:
Lang Hames 2019-04-25 05:02:10 +00:00
parent 733c8c40c8
commit cf49aa3908
1 changed files with 19 additions and 5 deletions

View File

@ -77,6 +77,10 @@ Dylibs("dylib",
cl::desc("Add library."), cl::desc("Add library."),
cl::ZeroOrMore); cl::ZeroOrMore);
static cl::list<std::string> InputArgv("args", cl::Positional,
cl::desc("<program arguments>..."),
cl::ZeroOrMore, cl::PositionalEatsArgs);
static cl::opt<std::string> static cl::opt<std::string>
TripleName("triple", cl::desc("Target triple for disassembler")); TripleName("triple", cl::desc("Target triple for disassembler"));
@ -208,7 +212,15 @@ public:
if (I != DummyExterns.end()) if (I != DummyExterns.end())
return JITSymbol(I->second, JITSymbolFlags::Exported); 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<StringError>("Could not find definition for \"" +
Name + "\"",
inconvertibleErrorCode()));
llvm_unreachable("Should have returned or exited by now");
} }
void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,
@ -533,11 +545,13 @@ static int executeInput() {
int (*Main)(int, const char**) = int (*Main)(int, const char**) =
(int(*)(int,const char**)) uintptr_t(MainAddress); (int(*)(int,const char**)) uintptr_t(MainAddress);
const char **Argv = new const char*[2]; std::vector<const char *> Argv;
// Use the name of the first input object module as argv[0] for the target. // Use the name of the first input object module as argv[0] for the target.
Argv[0] = InputFileList[0].c_str(); Argv.push_back(InputFileList[0].data());
Argv[1] = nullptr; for (auto &Arg : InputArgv)
return Main(1, Argv); Argv.push_back(Arg.data());
Argv.push_back(nullptr);
return Main(Argv.size() - 1, Argv.data());
} }
static int checkAllExpressions(RuntimeDyldChecker &Checker) { static int checkAllExpressions(RuntimeDyldChecker &Checker) {