Use fast regalloc and codegen at OptLevel=0.

This commit is contained in:
Rafael Ávila de Espíndola 2011-06-22 16:47:13 -04:00
parent a6e188f8bf
commit 64513808ca
3 changed files with 35 additions and 14 deletions

View File

@ -138,6 +138,30 @@ mod write {
let int LLVMAssemblyFile = 0;
let int LLVMObjectFile = 1;
let int LLVMNullFile = 2;
let int LLVMOptNone = 0; // -O0
let int LLVMOptLess = 1; // -O1
let int LLVMOptDefault = 2; // -O2, -Os
let int LLVMOptAggressive = 3; // -O3
auto CodeGenOptLevel;
alt (opts.optimize) {
case (0u) {
CodeGenOptLevel = LLVMOptNone;
}
case (1u) {
CodeGenOptLevel = LLVMOptLess;
}
case (2u) {
CodeGenOptLevel = LLVMOptDefault;
}
case (3u) {
CodeGenOptLevel = LLVMOptAggressive;
}
case (_) {
fail;
}
}
auto FileType;
if (opts.output_type == output_type_object ||
opts.output_type == output_type_exe) {
@ -159,7 +183,8 @@ mod write {
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod,
str::buf(triple),
str::buf(output),
LLVMAssemblyFile);
LLVMAssemblyFile,
CodeGenOptLevel);
}
// Save the object file for -c or --save-temps alone
@ -170,7 +195,8 @@ mod write {
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod,
str::buf(triple),
str::buf(output),
LLVMObjectFile);
LLVMObjectFile,
CodeGenOptLevel);
}
} else {
// If we aren't saving temps then just output the file
@ -179,7 +205,8 @@ mod write {
auto triple = x86::get_target_triple();
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod,
str::buf(triple),
str::buf(output), FileType);
str::buf(output), FileType,
CodeGenOptLevel);
}
// Clean up and return

View File

@ -856,7 +856,7 @@ native mod llvm = "rustllvm" {
/* FIXME: The FileType is an enum.*/
fn LLVMRustWriteOutputFile(PassManagerRef PM, ModuleRef M,
sbuf Triple, sbuf Output,
int FileType);
int FileType, int OptLevel);
/** Returns a string describing the last error caused by an LLVMRust*
call. */

View File

@ -53,11 +53,6 @@ extern "C" void LLVMAddStandardModulePasses(LLVMPassManagerRef PM,
int *RustHackToFetchPassesO = (int*)LLVMAddBasicAliasAnalysisPass;
int *RustHackToFetchPasses2O = (int*)LLVMAddStandardModulePasses;
enum LLVMCodeGenFileType {
LLVMAssemblyFile,
LLVMObjectFile,
LLVMNullFile // Do not emit any output.
};
extern "C" bool LLVMLinkModules(LLVMModuleRef Dest, LLVMModuleRef Src) {
static std::string err;
@ -77,7 +72,8 @@ extern "C" void LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
LLVMModuleRef M,
const char *triple,
const char *path,
LLVMCodeGenFileType FileType) {
TargetMachine::CodeGenFileType FileType,
CodeGenOpt::Level OptLevel) {
// Set compilation options.
llvm::NoFramePointerElim = true;
@ -91,16 +87,14 @@ extern "C" void LLVMRustWriteOutputFile(LLVMPassManagerRef PMR,
std::string FeaturesStr;
TargetMachine *Target = TheTarget->createTargetMachine(triple, FeaturesStr);
bool NoVerify = false;
CodeGenOpt::Level OLvl = CodeGenOpt::Default;
PassManager *PM = unwrap<PassManager>(PMR);
std::string ErrorInfo;
raw_fd_ostream OS(path, ErrorInfo,
raw_fd_ostream::F_Binary);
formatted_raw_ostream FOS(OS);
TargetMachine::CodeGenFileType FileType2 =
static_cast<TargetMachine::CodeGenFileType>(FileType);
bool foo = Target->addPassesToEmitFile(*PM, FOS, FileType2, OLvl, NoVerify);
bool foo = Target->addPassesToEmitFile(*PM, FOS, FileType, OptLevel,
NoVerify);
assert(!foo);
(void)foo;
PM->run(*unwrap(M));