ErrorFilename.str(), Timeout, MemoryLimit);
// FIXME: check return code ?
- // Print out the error messages generated by GCC if possible...
+ // Print out the error messages generated by CC if possible...
std::ifstream ErrorFile(ErrorFilename.c_str());
if (ErrorFile) {
std::copy(std::istreambuf_iterator<char>(ErrorFile),
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs,
+ const std::vector<std::string> &CCArgs,
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
unsigned Timeout = 0,
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs,
+ const std::vector<std::string> &CCArgs,
const std::vector<std::string> &SharedLibs,
unsigned Timeout,
unsigned MemoryLimit) {
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs =
+ const std::vector<std::string> &CCArgs =
std::vector<std::string>(),
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs,
+ const std::vector<std::string> &CCArgs,
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
unsigned Timeout = 0,
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs,
+ const std::vector<std::string> &CCArgs,
const std::vector<std::string> &SharedLibs,
unsigned Timeout,
unsigned MemoryLimit) {
//===----------------------------------------------------------------------===//
// LLC Implementation of AbstractIntepreter interface
//
-GCC::FileType LLC::OutputCode(const std::string &Bitcode,
+CC::FileType LLC::OutputCode(const std::string &Bitcode,
std::string &OutputAsmFile, std::string &Error,
unsigned Timeout, unsigned MemoryLimit) {
const char *Suffix = (UseIntegratedAssembler ? ".llc.o" : ".llc.s");
Timeout, MemoryLimit))
Error = ProcessFailure(LLCPath, &LLCArgs[0],
Timeout, MemoryLimit);
- return UseIntegratedAssembler ? GCC::ObjectFile : GCC::AsmFile;
+ return UseIntegratedAssembler ? CC::ObjectFile : CC::AsmFile;
}
void LLC::compileProgram(const std::string &Bitcode, std::string *Error,
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &ArgsForGCC,
+ const std::vector<std::string> &ArgsForCC,
const std::vector<std::string> &SharedLibs,
unsigned Timeout,
unsigned MemoryLimit) {
std::string OutputAsmFile;
- GCC::FileType FileKind = OutputCode(Bitcode, OutputAsmFile, *Error, Timeout,
+ CC::FileType FileKind = OutputCode(Bitcode, OutputAsmFile, *Error, Timeout,
MemoryLimit);
FileRemover OutFileRemover(OutputAsmFile, !SaveTemps);
- std::vector<std::string> GCCArgs(ArgsForGCC);
- GCCArgs.insert(GCCArgs.end(), SharedLibs.begin(), SharedLibs.end());
+ std::vector<std::string> CCArgs(ArgsForCC);
+ CCArgs.insert(CCArgs.end(), SharedLibs.begin(), SharedLibs.end());
- // Assuming LLC worked, compile the result with GCC and run it.
- return gcc->ExecuteProgram(OutputAsmFile, Args, FileKind,
- InputFile, OutputFile, Error, GCCArgs,
+ // Assuming LLC worked, compile the result with CC and run it.
+ return cc->ExecuteProgram(OutputAsmFile, Args, FileKind,
+ InputFile, OutputFile, Error, CCArgs,
Timeout, MemoryLimit);
}
///
LLC *AbstractInterpreter::createLLC(const char *Argv0,
std::string &Message,
- const std::string &GCCBinary,
+ const std::string &CCBinary,
const std::vector<std::string> *Args,
- const std::vector<std::string> *GCCArgs,
+ const std::vector<std::string> *CCArgs,
bool UseIntegratedAssembler) {
std::string LLCPath =
PrependMainExecutablePath("llc", Argv0, (void *)(intptr_t) & createLLC);
return nullptr;
}
- GCC *gcc = GCC::create(Message, GCCBinary, GCCArgs);
- if (!gcc) {
+ CC *cc = CC::create(Message, CCBinary, CCArgs);
+ if (!cc) {
errs() << Message << "\n";
exit(1);
}
Message = "Found llc: " + LLCPath + "\n";
- return new LLC(LLCPath, gcc, Args, UseIntegratedAssembler);
+ return new LLC(LLCPath, cc, Args, UseIntegratedAssembler);
}
//===---------------------------------------------------------------------===//
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs =
+ const std::vector<std::string> &CCArgs =
std::vector<std::string>(),
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs,
+ const std::vector<std::string> &CCArgs,
const std::vector<std::string> &SharedLibs,
unsigned Timeout,
unsigned MemoryLimit) {
}
//===---------------------------------------------------------------------===//
-// GCC abstraction
+// CC abstraction
//
static bool IsARMArchitecture(std::vector<const char*> Args) {
return false;
}
-int GCC::ExecuteProgram(const std::string &ProgramFile,
+int CC::ExecuteProgram(const std::string &ProgramFile,
const std::vector<std::string> &Args,
FileType fileType,
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &ArgsForGCC,
+ const std::vector<std::string> &ArgsForCC,
unsigned Timeout,
unsigned MemoryLimit) {
- std::vector<const char*> GCCArgs;
+ std::vector<const char*> CCArgs;
- GCCArgs.push_back(GCCPath.c_str());
+ CCArgs.push_back(CCPath.c_str());
if (TargetTriple.getArch() == Triple::x86)
- GCCArgs.push_back("-m32");
+ CCArgs.push_back("-m32");
for (std::vector<std::string>::const_iterator
- I = gccArgs.begin(), E = gccArgs.end(); I != E; ++I)
- GCCArgs.push_back(I->c_str());
+ I = ccArgs.begin(), E = ccArgs.end(); I != E; ++I)
+ CCArgs.push_back(I->c_str());
// Specify -x explicitly in case the extension is wonky
if (fileType != ObjectFile) {
- GCCArgs.push_back("-x");
+ CCArgs.push_back("-x");
if (fileType == CFile) {
- GCCArgs.push_back("c");
- GCCArgs.push_back("-fno-strict-aliasing");
+ CCArgs.push_back("c");
+ CCArgs.push_back("-fno-strict-aliasing");
} else {
- GCCArgs.push_back("assembler");
+ CCArgs.push_back("assembler");
// 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 (TargetTriple.isOSDarwin() && !IsARMArchitecture(GCCArgs))
- GCCArgs.push_back("-force_cpusubtype_ALL");
+ // it from cc flags
+ if (TargetTriple.isOSDarwin() && !IsARMArchitecture(CCArgs))
+ CCArgs.push_back("-force_cpusubtype_ALL");
}
}
- GCCArgs.push_back(ProgramFile.c_str()); // Specify the input filename.
+ CCArgs.push_back(ProgramFile.c_str()); // Specify the input filename.
- GCCArgs.push_back("-x");
- GCCArgs.push_back("none");
- GCCArgs.push_back("-o");
+ CCArgs.push_back("-x");
+ CCArgs.push_back("none");
+ CCArgs.push_back("-o");
SmallString<128> OutputBinary;
std::error_code EC =
- sys::fs::createUniqueFile(ProgramFile + "-%%%%%%%.gcc.exe", OutputBinary);
+ sys::fs::createUniqueFile(ProgramFile + "-%%%%%%%.cc.exe", OutputBinary);
if (EC) {
errs() << "Error making unique filename: " << EC.message() << "\n";
exit(1);
}
- GCCArgs.push_back(OutputBinary.c_str()); // Output to the right file...
+ CCArgs.push_back(OutputBinary.c_str()); // Output to the right file...
- // Add any arguments intended for GCC. We locate them here because this is
+ // Add any arguments intended for CC. We locate them here because this is
// most likely -L and -l options that need to come before other libraries but
// after the source. Other options won't be sensitive to placement on the
// command line, so this should be safe.
- for (unsigned i = 0, e = ArgsForGCC.size(); i != e; ++i)
- GCCArgs.push_back(ArgsForGCC[i].c_str());
+ for (unsigned i = 0, e = ArgsForCC.size(); i != e; ++i)
+ CCArgs.push_back(ArgsForCC[i].c_str());
- GCCArgs.push_back("-lm"); // Hard-code the math library...
- GCCArgs.push_back("-O2"); // Optimize the program a bit...
+ CCArgs.push_back("-lm"); // Hard-code the math library...
+ CCArgs.push_back("-O2"); // Optimize the program a bit...
#if defined (HAVE_LINK_R)
- GCCArgs.push_back("-Wl,-R."); // Search this dir for .so files
+ CCArgs.push_back("-Wl,-R."); // Search this dir for .so files
#endif
if (TargetTriple.getArch() == Triple::sparc)
- GCCArgs.push_back("-mcpu=v9");
- GCCArgs.push_back(nullptr); // NULL terminator
+ CCArgs.push_back("-mcpu=v9");
+ CCArgs.push_back(nullptr); // NULL terminator
- outs() << "<gcc>"; outs().flush();
+ outs() << "<CC>"; outs().flush();
DEBUG(errs() << "\nAbout to run:\t";
- for (unsigned i = 0, e = GCCArgs.size()-1; i != e; ++i)
- errs() << " " << GCCArgs[i];
+ for (unsigned i = 0, e = CCArgs.size()-1; i != e; ++i)
+ errs() << " " << CCArgs[i];
errs() << "\n";
);
- if (RunProgramWithTimeout(GCCPath, &GCCArgs[0], "", "", "")) {
- *Error = ProcessFailure(GCCPath, &GCCArgs[0]);
+ if (RunProgramWithTimeout(CCPath, &CCArgs[0], "", "", "")) {
+ *Error = ProcessFailure(CCPath, &CCArgs[0]);
return -1;
}
}
}
-int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
+int CC::MakeSharedObject(const std::string &InputFile, FileType fileType,
std::string &OutputFile,
- const std::vector<std::string> &ArgsForGCC,
+ const std::vector<std::string> &ArgsForCC,
std::string &Error) {
SmallString<128> UniqueFilename;
std::error_code EC = sys::fs::createUniqueFile(
}
OutputFile = UniqueFilename.str();
- std::vector<const char*> GCCArgs;
+ std::vector<const char*> CCArgs;
- GCCArgs.push_back(GCCPath.c_str());
+ CCArgs.push_back(CCPath.c_str());
if (TargetTriple.getArch() == Triple::x86)
- GCCArgs.push_back("-m32");
+ CCArgs.push_back("-m32");
for (std::vector<std::string>::const_iterator
- I = gccArgs.begin(), E = gccArgs.end(); I != E; ++I)
- GCCArgs.push_back(I->c_str());
+ I = ccArgs.begin(), E = ccArgs.end(); I != E; ++I)
+ CCArgs.push_back(I->c_str());
// Compile the C/asm file into a shared object
if (fileType != ObjectFile) {
- GCCArgs.push_back("-x");
- GCCArgs.push_back(fileType == AsmFile ? "assembler" : "c");
+ CCArgs.push_back("-x");
+ CCArgs.push_back(fileType == AsmFile ? "assembler" : "c");
}
- GCCArgs.push_back("-fno-strict-aliasing");
- GCCArgs.push_back(InputFile.c_str()); // Specify the input filename.
- GCCArgs.push_back("-x");
- GCCArgs.push_back("none");
+ CCArgs.push_back("-fno-strict-aliasing");
+ CCArgs.push_back(InputFile.c_str()); // Specify the input filename.
+ CCArgs.push_back("-x");
+ CCArgs.push_back("none");
if (TargetTriple.getArch() == Triple::sparc)
- GCCArgs.push_back("-G"); // Compile a shared library, `-G' for Sparc
+ CCArgs.push_back("-G"); // Compile a shared library, `-G' for Sparc
else if (TargetTriple.isOSDarwin()) {
// 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");
+ // bugpoint to just pass that in the environment of CC.
+ CCArgs.push_back("-single_module");
+ CCArgs.push_back("-dynamiclib"); // `-dynamiclib' for MacOS X/PowerPC
+ CCArgs.push_back("-undefined");
+ CCArgs.push_back("dynamic_lookup");
} else
- GCCArgs.push_back("-shared"); // `-shared' for Linux/X86, maybe others
+ CCArgs.push_back("-shared"); // `-shared' for Linux/X86, maybe others
if (TargetTriple.getArch() == Triple::x86_64)
- GCCArgs.push_back("-fPIC"); // Requires shared objs to contain PIC
+ CCArgs.push_back("-fPIC"); // Requires shared objs to contain PIC
if (TargetTriple.getArch() == Triple::sparc)
- GCCArgs.push_back("-mcpu=v9");
+ CCArgs.push_back("-mcpu=v9");
- GCCArgs.push_back("-o");
- GCCArgs.push_back(OutputFile.c_str()); // Output to the right filename.
- GCCArgs.push_back("-O2"); // Optimize the program a bit.
+ CCArgs.push_back("-o");
+ CCArgs.push_back(OutputFile.c_str()); // Output to the right filename.
+ CCArgs.push_back("-O2"); // Optimize the program a bit.
- // Add any arguments intended for GCC. We locate them here because this is
+ // Add any arguments intended for CC. We locate them here because this is
// most likely -L and -l options that need to come before other libraries but
// after the source. Other options won't be sensitive to placement on the
// command line, so this should be safe.
- for (unsigned i = 0, e = ArgsForGCC.size(); i != e; ++i)
- GCCArgs.push_back(ArgsForGCC[i].c_str());
- GCCArgs.push_back(nullptr); // NULL terminator
+ for (unsigned i = 0, e = ArgsForCC.size(); i != e; ++i)
+ CCArgs.push_back(ArgsForCC[i].c_str());
+ CCArgs.push_back(nullptr); // NULL terminator
- outs() << "<gcc>"; outs().flush();
+ outs() << "<CC>"; outs().flush();
DEBUG(errs() << "\nAbout to run:\t";
- for (unsigned i = 0, e = GCCArgs.size()-1; i != e; ++i)
- errs() << " " << GCCArgs[i];
+ for (unsigned i = 0, e = CCArgs.size()-1; i != e; ++i)
+ errs() << " " << CCArgs[i];
errs() << "\n";
);
- if (RunProgramWithTimeout(GCCPath, &GCCArgs[0], "", "", "")) {
- Error = ProcessFailure(GCCPath, &GCCArgs[0]);
+ if (RunProgramWithTimeout(CCPath, &CCArgs[0], "", "", "")) {
+ Error = ProcessFailure(CCPath, &CCArgs[0]);
return 1;
}
return 0;
}
-/// create - Try to find the `gcc' executable
+/// create - Try to find the CC executable
///
-GCC *GCC::create(std::string &Message,
- const std::string &GCCBinary,
+CC *CC::create(std::string &Message,
+ const std::string &CCBinary,
const std::vector<std::string> *Args) {
- auto GCCPath = sys::findProgramByName(GCCBinary);
- if (!GCCPath) {
- Message = "Cannot find `" + GCCBinary + "' in PATH: " +
- GCCPath.getError().message() + "\n";
+ auto CCPath = sys::findProgramByName(CCBinary);
+ if (!CCPath) {
+ Message = "Cannot find `" + CCBinary + "' in PATH: " +
+ CCPath.getError().message() + "\n";
return nullptr;
}
RemoteClientPath = *Path;
}
- Message = "Found gcc: " + *GCCPath + "\n";
- return new GCC(*GCCPath, RemoteClientPath, Args);
+ Message = "Found CC: " + *CCPath + "\n";
+ return new CC(*CCPath, RemoteClientPath, Args);
}
class LLC;
//===---------------------------------------------------------------------===//
-// GCC abstraction
+// CC abstraction
//
-class GCC {
- std::string GCCPath; // The path to the gcc executable.
+class CC {
+ std::string CCPath; // The path to the cc executable.
std::string RemoteClientPath; // The path to the rsh / ssh executable.
- std::vector<std::string> gccArgs; // GCC-specific arguments.
- GCC(StringRef gccPath, StringRef RemotePath,
- const std::vector<std::string> *GCCArgs)
- : GCCPath(gccPath), RemoteClientPath(RemotePath) {
- if (GCCArgs) gccArgs = *GCCArgs;
+ std::vector<std::string> ccArgs; // CC-specific arguments.
+ CC(StringRef ccPath, StringRef RemotePath,
+ const std::vector<std::string> *CCArgs)
+ : CCPath(ccPath), RemoteClientPath(RemotePath) {
+ if (CCArgs) ccArgs = *CCArgs;
}
public:
enum FileType { AsmFile, ObjectFile, CFile };
- static GCC *create(std::string &Message,
- const std::string &GCCBinary,
+ static CC *create(std::string &Message,
+ const std::string &CCBinary,
const std::vector<std::string> *Args);
/// ExecuteProgram - Execute the program specified by "ProgramFile" (which is
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error = nullptr,
- const std::vector<std::string> &GCCArgs =
+ const std::vector<std::string> &CCArgs =
std::vector<std::string>(),
unsigned Timeout = 0,
unsigned MemoryLimit = 0);
///
int MakeSharedObject(const std::string &InputFile, FileType fileType,
std::string &OutputFile,
- const std::vector<std::string> &ArgsForGCC,
+ const std::vector<std::string> &ArgsForCC,
std::string &Error);
};
virtual void anchor();
public:
static LLC *createLLC(const char *Argv0, std::string &Message,
- const std::string &GCCBinary,
+ const std::string &CCBinary,
const std::vector<std::string> *Args = nullptr,
- const std::vector<std::string> *GCCArgs = nullptr,
+ const std::vector<std::string> *CCArgs = nullptr,
bool UseIntegratedAssembler = false);
static AbstractInterpreter*
unsigned Timeout = 0, unsigned MemoryLimit = 0) {}
/// OutputCode - Compile the specified program from bitcode to code
- /// understood by the GCC driver (either C or asm). If the code generator
+ /// understood by the CC driver (either C or asm). If the code generator
/// fails, it sets Error, otherwise, this function returns the type of code
/// emitted.
- virtual GCC::FileType OutputCode(const std::string &Bitcode,
+ virtual CC::FileType OutputCode(const std::string &Bitcode,
std::string &OutFile, std::string &Error,
unsigned Timeout = 0,
unsigned MemoryLimit = 0) {
Error = "OutputCode not supported by this AbstractInterpreter!";
- return GCC::AsmFile;
+ return CC::AsmFile;
}
/// ExecuteProgram - Run the specified bitcode file, emitting output to the
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs =
+ const std::vector<std::string> &CCArgs =
std::vector<std::string>(),
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
class LLC : public AbstractInterpreter {
std::string LLCPath; // The path to the LLC executable.
std::vector<std::string> ToolArgs; // Extra args to pass to LLC.
- GCC *gcc;
+ CC *cc;
bool UseIntegratedAssembler;
public:
- LLC(const std::string &llcPath, GCC *Gcc,
+ LLC(const std::string &llcPath, CC *cc,
const std::vector<std::string> *Args,
bool useIntegratedAssembler)
- : LLCPath(llcPath), gcc(Gcc),
+ : LLCPath(llcPath), cc(cc),
UseIntegratedAssembler(useIntegratedAssembler) {
ToolArgs.clear();
if (Args) ToolArgs = *Args;
}
- ~LLC() override { delete gcc; }
+ ~LLC() override { delete cc; }
/// compileProgram - Compile the specified program from bitcode to executable
/// code. This does not produce any output, it is only used when debugging
const std::string &InputFile,
const std::string &OutputFile,
std::string *Error,
- const std::vector<std::string> &GCCArgs =
+ const std::vector<std::string> &CCArgs =
std::vector<std::string>(),
const std::vector<std::string> &SharedLibs =
std::vector<std::string>(),
unsigned MemoryLimit = 0) override;
/// OutputCode - Compile the specified program from bitcode to code
- /// understood by the GCC driver (either C or asm). If the code generator
+ /// understood by the CC driver (either C or asm). If the code generator
/// fails, it sets Error, otherwise, this function returns the type of code
/// emitted.
- GCC::FileType OutputCode(const std::string &Bitcode,
+ CC::FileType OutputCode(const std::string &Bitcode,
std::string &OutFile, std::string &Error,
unsigned Timeout = 0,
unsigned MemoryLimit = 0) override;