diff --git a/gen/linker.cpp b/gen/linker.cpp index 66bca90e..043c8ba5 100644 --- a/gen/linker.cpp +++ b/gen/linker.cpp @@ -14,6 +14,7 @@ #include "gen/logger.h" #include "gen/cl_options.h" #include "gen/optimizer.h" +#include "gen/programs.h" ////////////////////////////////////////////////////////////////////////////// @@ -216,25 +217,16 @@ int linkObjToExecutable(const char* argv0) // error string std::string errstr; - const char *cc; -#if !_WIN32 - cc = getenv("CC"); - if (!cc) -#endif - cc = "gcc"; - // find gcc for linking - llvm::sys::Path gcc = llvm::sys::Program::FindProgramByName(cc); - if (gcc.isEmpty()) - { - gcc.set(cc); - } + llvm::sys::Path gcc = getGcc(); + // get a string version for argv[0] + std::string gccStr = gcc.toString(); // build arguments std::vector args; // first the program name ?? - args.push_back(cc); + args.push_back(gccStr.c_str()); // object files for (int i = 0; i < global.params.objfiles->dim; i++) diff --git a/gen/programs.cpp b/gen/programs.cpp new file mode 100644 index 00000000..e478944e --- /dev/null +++ b/gen/programs.cpp @@ -0,0 +1,41 @@ +#include "gen/programs.h" + +#include "llvm/Support/CommandLine.h" +#include "llvm/System/Program.h" + +#include "root.h" // error(char*) +#include "mars.h" // fatal() + +using namespace llvm; + +static cl::opt gcc("gcc", + cl::desc("GCC to use for assembling and linking"), + cl::Hidden, + cl::ZeroOrMore); + + +sys::Path getGcc() { + const char *cc = NULL; + + if (gcc.getNumOccurrences() > 0 && gcc.length() > 0) + cc = gcc.c_str(); + + if (!cc) +#if !_WIN32 + cc = getenv("CC"); + if (!cc) +#endif + cc = "gcc"; + + sys::Path path = sys::Program::FindProgramByName(cc); + if (path.empty() && !cc) { + if (cc) { + path.set(cc); + } else { + error("failed to locate gcc"); + fatal(); + } + } + + return path; +} diff --git a/gen/programs.h b/gen/programs.h new file mode 100644 index 00000000..27a00fc7 --- /dev/null +++ b/gen/programs.h @@ -0,0 +1,8 @@ +#ifndef LDC_GEN_PROGRAMS_H +#define LDC_GEN_PROGRAMS_H + +#include "llvm/System/Path.h" + +llvm::sys::Path getGcc(); + +#endif diff --git a/gen/toobj.cpp b/gen/toobj.cpp index 461b998d..a2c4e3ab 100644 --- a/gen/toobj.cpp +++ b/gen/toobj.cpp @@ -18,7 +18,6 @@ #include "llvm/PassManager.h" #include "llvm/LinkAllPasses.h" #include "llvm/System/Program.h" -#include "llvm/System/Path.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetMachine.h" @@ -51,6 +50,7 @@ #include "gen/cl_options.h" #include "gen/optimizer.h" #include "gen/llvm-version.h" +#include "gen/programs.h" #include "ir/irvar.h" #include "ir/irmodule.h" @@ -310,19 +310,7 @@ void assemble(const llvm::sys::Path& asmpath, const llvm::sys::Path& objpath) { using namespace llvm; - const char *cc; -#if !_WIN32 - cc = getenv("CC"); - if (!cc) -#endif - cc = "gcc"; - - sys::Path gcc = llvm::sys::Program::FindProgramByName(cc); - if (gcc.empty()) - { - error("failed to locate gcc"); - fatal(); - } + sys::Path gcc = getGcc(); // Run GCC to assemble and link the program into native code. //