aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Support/SystemUtils.h8
-rw-r--r--lib/Support/SystemUtils.cpp23
-rw-r--r--tools/bugpoint/BugDriver.h4
-rw-r--r--tools/bugpoint/ExecutionDriver.cpp19
-rw-r--r--tools/bugpoint/OptimizerDriver.cpp2
-rw-r--r--tools/bugpoint/ToolRunner.cpp37
-rw-r--r--tools/bugpoint/ToolRunner.h15
-rw-r--r--tools/llvm-ld/llvm-ld.cpp23
8 files changed, 65 insertions, 66 deletions
diff --git a/include/llvm/Support/SystemUtils.h b/include/llvm/Support/SystemUtils.h
index 95124a047d..69afd071f6 100644
--- a/include/llvm/Support/SystemUtils.h
+++ b/include/llvm/Support/SystemUtils.h
@@ -40,12 +40,12 @@ bool CheckBitcodeOutputToConsole(
);
/// FindExecutable - Find a named executable, giving the argv[0] of program
-/// being executed. This allows us to find another LLVM tool if it is built into
-/// the same directory, but that directory is neither the current directory, nor
-/// in the PATH. If the executable cannot be found, return an empty string.
+/// being executed. This allows us to find another LLVM tool if it is built in
+/// the same directory. If the executable cannot be found, return an
+/// empty string.
/// @brief Find a named executable.
sys::Path FindExecutable(const std::string &ExeName,
- const std::string &ProgramPath);
+ const char *Argv0, void *MainAddr);
} // End llvm namespace
diff --git a/lib/Support/SystemUtils.cpp b/lib/Support/SystemUtils.cpp
index 49a87e405a..09c0b19aa9 100644
--- a/lib/Support/SystemUtils.cpp
+++ b/lib/Support/SystemUtils.cpp
@@ -50,24 +50,17 @@ bool llvm::CheckBitcodeOutputToConsole(std::ostream* stream_to_check,
}
/// FindExecutable - Find a named executable, giving the argv[0] of program
-/// being executed. This allows us to find another LLVM tool if it is built
-/// into the same directory, but that directory is neither the current
-/// directory, nor in the PATH. If the executable cannot be found, return an
-/// empty string. Return the input string if given a full path to an executable.
-///
+/// being executed. This allows us to find another LLVM tool if it is built in
+/// the same directory. If the executable cannot be found, return an
+/// empty string.
+/// @brief Find a named executable.
#undef FindExecutable // needed on windows :(
sys::Path llvm::FindExecutable(const std::string &ExeName,
- const std::string &ProgramPath) {
- // First check if the given name is already a valid path to an executable.
- sys::Path Result(ExeName);
- Result.makeAbsolute();
- if (Result.canExecute())
- return Result;
-
- // Otherwise check the directory that the calling program is in. We can do
+ const char *Argv0, void *MainAddr) {
+ // Check the directory that the calling program is in. We can do
// this if ProgramPath contains at least one / character, indicating that it
// is a relative path to the executable itself.
- Result = ProgramPath;
+ sys::Path Result = sys::Path::GetMainExecutable(Argv0, MainAddr);
Result.eraseComponent();
if (!Result.isEmpty()) {
Result.appendComponent(ExeName);
@@ -75,5 +68,5 @@ sys::Path llvm::FindExecutable(const std::string &ExeName,
return Result;
}
- return sys::Program::FindProgramByName(ExeName);
+ return sys::Path();
}
diff --git a/tools/bugpoint/BugDriver.h b/tools/bugpoint/BugDriver.h
index 79c7038071..5f4a1300a0 100644
--- a/tools/bugpoint/BugDriver.h
+++ b/tools/bugpoint/BugDriver.h
@@ -44,7 +44,7 @@ extern bool BugpointIsInterrupted;
class BugDriver {
LLVMContext& Context;
- const std::string ToolName; // Name of bugpoint
+ const char *ToolName; // argv[0] of bugpoint
std::string ReferenceOutputFile; // Name of `good' output file
Module *Program; // The raw program, linked together
std::vector<const PassInfo*> PassesToRun;
@@ -64,7 +64,7 @@ public:
BugDriver(const char *toolname, bool as_child, bool find_bugs,
unsigned timeout, unsigned memlimit, LLVMContext& ctxt);
- const std::string &getToolName() const { return ToolName; }
+ const char *getToolName() const { return ToolName; }
LLVMContext& getContext() { return Context; }
diff --git a/tools/bugpoint/ExecutionDriver.cpp b/tools/bugpoint/ExecutionDriver.cpp
index ceaf8f498b..3916957a62 100644
--- a/tools/bugpoint/ExecutionDriver.cpp
+++ b/tools/bugpoint/ExecutionDriver.cpp
@@ -177,8 +177,7 @@ bool BugDriver::initializeExecutionEnvironment() {
&ToolArgv, &GCCToolArgv);
break;
case Custom:
- Interpreter = AbstractInterpreter::createCustom(getToolName(), Message,
- CustomExecCommand);
+ Interpreter = AbstractInterpreter::createCustom(Message, CustomExecCommand);
break;
default:
Message = "Sorry, this back-end is not supported by bugpoint right now!\n";
@@ -200,7 +199,7 @@ bool BugDriver::initializeExecutionEnvironment() {
InterpreterSel == CBE_bug) {
SafeInterpreterSel = RunLLC;
SafeToolArgs.push_back("--relocation-model=pic");
- SafeInterpreter = AbstractInterpreter::createLLC(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
}
@@ -210,7 +209,7 @@ bool BugDriver::initializeExecutionEnvironment() {
InterpreterSel == LLC_Safe) {
SafeInterpreterSel = RunLLC;
SafeToolArgs.push_back("--relocation-model=pic");
- SafeInterpreter = AbstractInterpreter::createLLC(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
}
@@ -221,7 +220,7 @@ bool BugDriver::initializeExecutionEnvironment() {
if (!SafeInterpreter &&
InterpreterSel != RunCBE) {
SafeInterpreterSel = RunCBE;
- SafeInterpreter = AbstractInterpreter::createCBE(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createCBE(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
}
@@ -230,7 +229,7 @@ bool BugDriver::initializeExecutionEnvironment() {
InterpreterSel != RunJIT) {
SafeInterpreterSel = RunLLC;
SafeToolArgs.push_back("--relocation-model=pic");
- SafeInterpreter = AbstractInterpreter::createLLC(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
}
@@ -241,17 +240,17 @@ bool BugDriver::initializeExecutionEnvironment() {
break;
case RunLLC:
SafeToolArgs.push_back("--relocation-model=pic");
- SafeInterpreter = AbstractInterpreter::createLLC(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
break;
case RunCBE:
- SafeInterpreter = AbstractInterpreter::createCBE(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createCBE(Path.c_str(), Message,
&SafeToolArgs,
&GCCToolArgv);
break;
case Custom:
- SafeInterpreter = AbstractInterpreter::createCustom(Path, Message,
+ SafeInterpreter = AbstractInterpreter::createCustom(Message,
CustomExecCommand);
break;
default:
@@ -261,7 +260,7 @@ bool BugDriver::initializeExecutionEnvironment() {
}
if (!SafeInterpreter) { outs() << Message << "\nExiting.\n"; exit(1); }
- gcc = GCC::create(getToolName(), Message, &GCCToolArgv);
+ gcc = GCC::create(Message, &GCCToolArgv);
if (!gcc) { outs() << Message << "\nExiting.\n"; exit(1); }
// If there was an error creating the selected interpreter, quit with error.
diff --git a/tools/bugpoint/OptimizerDriver.cpp b/tools/bugpoint/OptimizerDriver.cpp
index da679cf74f..b38d8cfe83 100644
--- a/tools/bugpoint/OptimizerDriver.cpp
+++ b/tools/bugpoint/OptimizerDriver.cpp
@@ -167,7 +167,7 @@ bool BugDriver::runPasses(const std::vector<const PassInfo*> &Passes,
args[n++] = "-q";
args[n++] = tool.c_str();
} else
- args[n++] = ToolName.c_str();
+ args[n++] = ToolName;
args[n++] = "-as-child";
args[n++] = "-child-output";
diff --git a/tools/bugpoint/ToolRunner.cpp b/tools/bugpoint/ToolRunner.cpp
index 9180c53557..bce4d52c69 100644
--- a/tools/bugpoint/ToolRunner.cpp
+++ b/tools/bugpoint/ToolRunner.cpp
@@ -228,10 +228,12 @@ int LLI::ExecuteProgram(const std::string &Bitcode,
}
// LLI create method - Try to find the LLI executable
-AbstractInterpreter *AbstractInterpreter::createLLI(const std::string &ProgPath,
+AbstractInterpreter *AbstractInterpreter::createLLI(const char *Argv0,
std::string &Message,
const std::vector<std::string> *ToolArgs) {
- std::string LLIPath = FindExecutable("lli", ProgPath).toString();
+ std::string LLIPath =
+ FindExecutable("lli", Argv0,
+ reinterpret_cast<void *>(&createLLI)).toString();
if (!LLIPath.empty()) {
Message = "Found lli: " + LLIPath + "\n";
return new LLI(LLIPath, ToolArgs);
@@ -298,7 +300,6 @@ int CustomExecutor::ExecuteProgram(const std::string &Bitcode,
// Custom execution environment create method, takes the execution command
// as arguments
AbstractInterpreter *AbstractInterpreter::createCustom(
- const std::string &ProgramPath,
std::string &Message,
const std::string &ExecCommandLine) {
@@ -332,7 +333,7 @@ AbstractInterpreter *AbstractInterpreter::createCustom(
pos = ExecCommandLine.find_first_of(delimiters, lastPos);
}
- std::string CmdPath = FindExecutable(Command, ProgramPath).toString();
+ std::string CmdPath = sys::Program::FindProgramByName(Command).toString();
if (CmdPath.empty()) {
Message =
std::string("Cannot find '") + Command +
@@ -414,18 +415,20 @@ int LLC::ExecuteProgram(const std::string &Bitcode,
/// createLLC - Try to find the LLC executable
///
-LLC *AbstractInterpreter::createLLC(const std::string &ProgramPath,
+LLC *AbstractInterpreter::createLLC(const char *Argv0,
std::string &Message,
const std::vector<std::string> *Args,
const std::vector<std::string> *GCCArgs) {
- std::string LLCPath = FindExecutable("llc", ProgramPath).toString();
+ std::string LLCPath =
+ FindExecutable("llc", Argv0,
+ reinterpret_cast<void *>(&createLLC)).toString();
if (LLCPath.empty()) {
Message = "Cannot find `llc' in executable directory or PATH!\n";
return 0;
}
Message = "Found llc: " + LLCPath + "\n";
- GCC *gcc = GCC::create(ProgramPath, Message, GCCArgs);
+ GCC *gcc = GCC::create(Message, GCCArgs);
if (!gcc) {
errs() << Message << "\n";
exit(1);
@@ -501,9 +504,11 @@ int JIT::ExecuteProgram(const std::string &Bitcode,
/// createJIT - Try to find the LLI executable
///
-AbstractInterpreter *AbstractInterpreter::createJIT(const std::string &ProgPath,
+AbstractInterpreter *AbstractInterpreter::createJIT(const char *Argv0,
std::string &Message, const std::vector<std::string> *Args) {
- std::string LLIPath = FindExecutable("lli", ProgPath).toString();
+ std::string LLIPath =
+ FindExecutable("lli", Argv0,
+ reinterpret_cast<void *>(&createJIT)).toString();
if (!LLIPath.empty()) {
Message = "Found lli: " + LLIPath + "\n";
return new JIT(LLIPath, Args);
@@ -577,11 +582,13 @@ int CBE::ExecuteProgram(const std::string &Bitcode,
/// createCBE - Try to find the 'llc' executable
///
-CBE *AbstractInterpreter::createCBE(const std::string &ProgramPath,
+CBE *AbstractInterpreter::createCBE(const char *Argv0,
std::string &Message,
const std::vector<std::string> *Args,
const std::vector<std::string> *GCCArgs) {
- sys::Path LLCPath = FindExecutable("llc", ProgramPath);
+ sys::Path LLCPath =
+ FindExecutable("llc", Argv0,
+ reinterpret_cast<void *>(&createCBE));
if (LLCPath.isEmpty()) {
Message =
"Cannot find `llc' in executable directory or PATH!\n";
@@ -589,7 +596,7 @@ CBE *AbstractInterpreter::createCBE(const std::string &ProgramPath,
}
Message = "Found llc: " + LLCPath.toString() + "\n";
- GCC *gcc = GCC::create(ProgramPath, Message, GCCArgs);
+ GCC *gcc = GCC::create(Message, GCCArgs);
if (!gcc) {
errs() << Message << "\n";
exit(1);
@@ -827,9 +834,9 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
/// create - Try to find the `gcc' executable
///
-GCC *GCC::create(const std::string &ProgramPath, std::string &Message,
+GCC *GCC::create(std::string &Message,
const std::vector<std::string> *Args) {
- sys::Path GCCPath = FindExecutable("gcc", ProgramPath);
+ sys::Path GCCPath = sys::Program::FindProgramByName("gcc");
if (GCCPath.isEmpty()) {
Message = "Cannot find `gcc' in executable directory or PATH!\n";
return 0;
@@ -837,7 +844,7 @@ GCC *GCC::create(const std::string &ProgramPath, std::string &Message,
sys::Path RemoteClientPath;
if (!RemoteClient.empty())
- RemoteClientPath = FindExecutable(RemoteClient.c_str(), ProgramPath);
+ RemoteClientPath = sys::Program::FindProgramByName(RemoteClient);
Message = "Found gcc: " + GCCPath.toString() + "\n";
return new GCC(GCCPath, RemoteClientPath, Args);
diff --git a/tools/bugpoint/ToolRunner.h b/tools/bugpoint/ToolRunner.h
index 58daef00a8..0082c4463a 100644
--- a/tools/bugpoint/ToolRunner.h
+++ b/tools/bugpoint/ToolRunner.h
@@ -57,7 +57,7 @@ class GCC {
public:
enum FileType { AsmFile, CFile };
- static GCC *create(const std::string &ProgramPath, std::string &Message,
+ static GCC *create(std::string &Message,
const std::vector<std::string> *Args);
/// ExecuteProgram - Execute the program specified by "ProgramFile" (which is
@@ -93,23 +93,20 @@ public:
///
class AbstractInterpreter {
public:
- static CBE *createCBE(const std::string &ProgramPath, std::string &Message,
+ static CBE *createCBE(const char *Argv0, std::string &Message,
const std::vector<std::string> *Args = 0,
const std::vector<std::string> *GCCArgs = 0);
- static LLC *createLLC(const std::string &ProgramPath, std::string &Message,
+ static LLC *createLLC(const char *Argv0, std::string &Message,
const std::vector<std::string> *Args = 0,
const std::vector<std::string> *GCCArgs = 0);
- static AbstractInterpreter* createLLI(const std::string &ProgramPath,
- std::string &Message,
+ static AbstractInterpreter* createLLI(const char *Argv0, std::string &Message,
const std::vector<std::string> *Args=0);
- static AbstractInterpreter* createJIT(const std::string &ProgramPath,
- std::string &Message,
+ static AbstractInterpreter* createJIT(const char *Argv0, std::string &Message,
const std::vector<std::string> *Args=0);
- static AbstractInterpreter* createCustom(const std::string &ProgramPath,
- std::string &Message,
+ static AbstractInterpreter* createCustom(std::string &Message,
const std::string &ExecCommandLine);
diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp
index cc672bc5da..62e5f09a08 100644
--- a/tools/llvm-ld/llvm-ld.cpp
+++ b/tools/llvm-ld/llvm-ld.cpp
@@ -41,6 +41,11 @@
#include <cstring>
using namespace llvm;
+// Rightly this should go in a header file but it just seems such a waste.
+namespace llvm {
+extern void Optimize(Module*);
+}
+
// Input/Output Options
static cl::list<std::string> InputFilenames(cl::Positional, cl::OneOrMore,
cl::desc("<input bitcode files>"));
@@ -409,7 +414,8 @@ static void EmitShellScript(char **argv) {
// support windows systems, we copy the llvm-stub.exe executable from the
// build tree to the destination file.
std::string ErrMsg;
- sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0]);
+ sys::Path llvmstub = FindExecutable("llvm-stub.exe", argv[0],
+ reinterpret_cast<void *>(&Optimize));
if (llvmstub.isEmpty())
PrintAndExit("Could not find llvm-stub.exe executable!");
@@ -500,11 +506,6 @@ static void BuildLinkItems(
}
}
-// Rightly this should go in a header file but it just seems such a waste.
-namespace llvm {
-extern void Optimize(Module*);
-}
-
int main(int argc, char **argv, char **envp) {
// Print a stack trace if we signal out.
sys::PrintStackTraceOnErrorSignal();
@@ -640,11 +641,12 @@ int main(int argc, char **argv, char **envp) {
sys::RemoveFileOnSignal(sys::Path(OutputFilename));
// Determine the locations of the llc and gcc programs.
- sys::Path llc = FindExecutable("llc", argv[0]);
+ sys::Path llc = FindExecutable("llc", argv[0],
+ reinterpret_cast<void *>(&Optimize));
if (llc.isEmpty())
PrintAndExit("Failed to find llc");
- sys::Path gcc = FindExecutable("gcc", argv[0]);
+ sys::Path gcc = sys::Program::FindProgramByName("gcc");
if (gcc.isEmpty())
PrintAndExit("Failed to find gcc");
@@ -669,11 +671,12 @@ int main(int argc, char **argv, char **envp) {
sys::RemoveFileOnSignal(sys::Path(OutputFilename));
// Determine the locations of the llc and gcc programs.
- sys::Path llc = FindExecutable("llc", argv[0]);
+ sys::Path llc = FindExecutable("llc", argv[0],
+ reinterpret_cast<void *>(&Optimize));
if (llc.isEmpty())
PrintAndExit("Failed to find llc");
- sys::Path gcc = FindExecutable("gcc", argv[0]);
+ sys::Path gcc = sys::Program::FindProgramByName("gcc");
if (gcc.isEmpty())
PrintAndExit("Failed to find gcc");