diff --git a/tools/bugpoint/BugDriver.cpp b/tools/bugpoint/BugDriver.cpp index c3cc389a280..bfc70582745 100644 --- a/tools/bugpoint/BugDriver.cpp +++ b/tools/bugpoint/BugDriver.cpp @@ -25,9 +25,14 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" +#include "llvm/System/Host.h" #include using namespace llvm; +namespace llvm { + Triple TargetTriple; +} + // Anonymous namespace to define command line options for debugging. // namespace { @@ -88,6 +93,20 @@ Module *llvm::ParseInputFile(const std::string &Filename, Result = 0; } + // If we don't have an override triple, use the first one to configure + // bugpoint, or use the host triple if none provided. + if (Result) { + if (TargetTriple.getTriple().empty()) { + Triple TheTriple(Result->getTargetTriple()); + + if (TheTriple.getTriple().empty()) + TheTriple.setTriple(sys::getHostTriple()); + + TargetTriple.setTriple(TheTriple.getTriple()); + } + + Result->setTargetTriple(TargetTriple.getTriple()); // override the triple + } return Result; } diff --git a/tools/bugpoint/Miscompilation.cpp b/tools/bugpoint/Miscompilation.cpp index 64dfe8853ec..9c141472956 100644 --- a/tools/bugpoint/Miscompilation.cpp +++ b/tools/bugpoint/Miscompilation.cpp @@ -14,6 +14,7 @@ #include "BugDriver.h" #include "ListReducer.h" +#include "ToolRunner.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" @@ -937,13 +938,13 @@ bool BugDriver::debugCodeGenerator() { outs() << '\n'; outs() << "The shared object was created with:\n llc -march=c " << SafeModuleBC << " -o temporary.c\n" - << " gcc -xc temporary.c -O2 -o " << SharedObject -#if defined(sparc) || defined(__sparc__) || defined(__sparcv9) - << " -G" // Compile a shared library, `-G' for Sparc -#else - << " -fPIC -shared" // `-shared' for Linux/X86, maybe others -#endif - << " -fno-strict-aliasing\n"; + << " gcc -xc temporary.c -O2 -o " << SharedObject; + if (TargetTriple.getArch() == Triple::sparc) + outs() << " -G"; // Compile a shared library, `-G' for Sparc + else + outs() << " -fPIC -shared"; // `-shared' for Linux/X86, maybe others + + outs() << " -fno-strict-aliasing\n"; return false; } diff --git a/tools/bugpoint/ToolRunner.cpp b/tools/bugpoint/ToolRunner.cpp index c9efbb8c76f..dfb65cb0e72 100644 --- a/tools/bugpoint/ToolRunner.cpp +++ b/tools/bugpoint/ToolRunner.cpp @@ -604,7 +604,6 @@ CBE *AbstractInterpreter::createCBE(const char *Argv0, // GCC abstraction // -#ifdef __APPLE__ static bool IsARMArchitecture(std::vector Args) { @@ -620,7 +619,6 @@ IsARMArchitecture(std::vector Args) return false; } -#endif int GCC::ExecuteProgram(const std::string &ProgramFile, const std::vector &Args, @@ -645,13 +643,13 @@ int GCC::ExecuteProgram(const std::string &ProgramFile, GCCArgs.push_back("-fno-strict-aliasing"); } else { GCCArgs.push_back("assembler"); -#ifdef __APPLE__ + // For ARM architectures we don't want this flag. bugpoint isn't // explicitly told what architecture it is working on, so we get // it from gcc flags - if (!IsARMArchitecture(ArgsForGCC)) + if ((TargetTriple.getOS() == Triple::Darwin) && + !IsARMArchitecture(ArgsForGCC)) GCCArgs.push_back("-force_cpusubtype_ALL"); -#endif } GCCArgs.push_back(ProgramFile.c_str()); // Specify the input filename... GCCArgs.push_back("-x"); @@ -677,9 +675,8 @@ int GCC::ExecuteProgram(const std::string &ProgramFile, #if defined (HAVE_LINK_R) GCCArgs.push_back("-Wl,-R."); // Search this dir for .so files #endif -#ifdef __sparc__ - GCCArgs.push_back("-mcpu=v9"); -#endif + if (TargetTriple.getArch() == Triple::sparc) + GCCArgs.push_back("-mcpu=v9"); GCCArgs.push_back(0); // NULL terminator outs() << ""; outs().flush(); @@ -777,27 +774,27 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType, GCCArgs.push_back(InputFile.c_str()); // Specify the input filename. GCCArgs.push_back("-x"); GCCArgs.push_back("none"); -#if defined(sparc) || defined(__sparc__) || defined(__sparcv9) - GCCArgs.push_back("-G"); // Compile a shared library, `-G' for Sparc -#elif defined(__APPLE__) - // link all source files into a single module in data segment, rather than - // generating blocks. dynamic_lookup requires that you set - // MACOSX_DEPLOYMENT_TARGET=10.3 in your env. FIXME: it would be better for - // bugpoint to just pass that in the environment of GCC. - GCCArgs.push_back("-single_module"); - GCCArgs.push_back("-dynamiclib"); // `-dynamiclib' for MacOS X/PowerPC - GCCArgs.push_back("-undefined"); - GCCArgs.push_back("dynamic_lookup"); -#else - GCCArgs.push_back("-shared"); // `-shared' for Linux/X86, maybe others -#endif + if (TargetTriple.getArch() == Triple::sparc) + GCCArgs.push_back("-G"); // Compile a shared library, `-G' for Sparc + else if (TargetTriple.getOS() == Triple::Darwin) { + // link all source files into a single module in data segment, rather than + // generating blocks. dynamic_lookup requires that you set + // MACOSX_DEPLOYMENT_TARGET=10.3 in your env. FIXME: it would be better for + // bugpoint to just pass that in the environment of GCC. + GCCArgs.push_back("-single_module"); + GCCArgs.push_back("-dynamiclib"); // `-dynamiclib' for MacOS X/PowerPC + GCCArgs.push_back("-undefined"); + GCCArgs.push_back("dynamic_lookup"); + } else + GCCArgs.push_back("-shared"); // `-shared' for Linux/X86, maybe others + + if ((TargetTriple.getArch() == Triple::alpha) || + (TargetTriple.getArch() == Triple::x86_64)) + GCCArgs.push_back("-fPIC"); // Requires shared objs to contain PIC + + if (TargetTriple.getArch() == Triple::sparc) + GCCArgs.push_back("-mcpu=v9"); -#if defined(__ia64__) || defined(__alpha__) || defined(__amd64__) - GCCArgs.push_back("-fPIC"); // Requires shared objs to contain PIC -#endif -#ifdef __sparc__ - GCCArgs.push_back("-mcpu=v9"); -#endif GCCArgs.push_back("-o"); GCCArgs.push_back(OutputFile.c_str()); // Output to the right filename. GCCArgs.push_back("-O2"); // Optimize the program a bit. diff --git a/tools/bugpoint/ToolRunner.h b/tools/bugpoint/ToolRunner.h index 0082c4463a5..3e3d7d5e5ac 100644 --- a/tools/bugpoint/ToolRunner.h +++ b/tools/bugpoint/ToolRunner.h @@ -17,6 +17,7 @@ #ifndef BUGPOINT_TOOLRUNNER_H #define BUGPOINT_TOOLRUNNER_H +#include "llvm/ADT/Triple.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/SystemUtils.h" #include @@ -25,6 +26,7 @@ namespace llvm { extern cl::opt SaveTemps; +extern Triple TargetTriple; class CBE; class LLC; diff --git a/tools/bugpoint/bugpoint.cpp b/tools/bugpoint/bugpoint.cpp index d00036acd80..e527b2a1496 100644 --- a/tools/bugpoint/bugpoint.cpp +++ b/tools/bugpoint/bugpoint.cpp @@ -66,6 +66,9 @@ static cl::opt StandardLinkOpts("std-link-opts", cl::desc("Include the standard link time optimizations")); +static cl::opt +OverrideTriple("mtriple", cl::desc("Override target triple for module")); + /// BugpointIsInterrupted - Set to true when the user presses ctrl-c. bool llvm::BugpointIsInterrupted = false; @@ -98,9 +101,15 @@ int main(int argc, char **argv) { sys::SetInterruptFunction(BugpointInterruptFunction); LLVMContext& Context = getGlobalContext(); + // If we have an override, set it and then track the triple we want Modules + // to use. + if (!OverrideTriple.empty()) + TargetTriple.setTriple(OverrideTriple); + outs() << "override triple is " << OverrideTriple << '\n'; + BugDriver D(argv[0], AsChild, FindBugs, TimeoutValue, MemoryLimit, Context); if (D.addSources(InputFilenames)) return 1; - + AddToDriver PM(D); if (StandardCompileOpts) { createStandardModulePasses(&PM, 3,