diff options
| -rw-r--r-- | src/comp/driver/rustc.rs | 2 | ||||
| -rw-r--r-- | src/comp/lib/llvm.rs | 6 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 30 | ||||
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 17 | ||||
| -rw-r--r-- | src/rustllvm/rustllvm.def.in | 2 |
5 files changed, 46 insertions, 11 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index afa2a9bb..db069279 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -168,6 +168,8 @@ impure fn main(vec[str] args) { ot = trans.output_type_none; } else if (_str.eq(arg, "-S")) { ot = trans.output_type_assembly; + } else if (_str.eq(arg, "-c")) { + ot = trans.output_type_object; } else if (_str.eq(arg, "-o")) { if (i+1u < len) { output_file = some(args.(i+1u)); diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index 8d0910d5..3c40a583 100644 --- a/src/comp/lib/llvm.rs +++ b/src/comp/lib/llvm.rs @@ -815,8 +815,10 @@ native mod llvm = llvm_lib { fn LLVMRustCreateMemoryBufferWithContentsOfFile(sbuf Path) -> MemoryBufferRef; - fn LLVMRustWriteAssembly(PassManagerRef PM, ModuleRef M, - sbuf Triple, sbuf Output); + /* FIXME: The FileType is an enum.*/ + fn LLVMRustWriteOutputFile(PassManagerRef PM, ModuleRef M, + sbuf Triple, sbuf Output, + int FileType); /** Returns a string describing the last error caused by an LLVMRust* call. */ diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index ac2ceff5..db27a823 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -6754,6 +6754,17 @@ tag output_type { output_type_none; output_type_bitcode; output_type_assembly; + output_type_object; +} + +fn is_object_or_assembly(output_type ot) -> bool { + if (ot == output_type_assembly) { + ret true; + } + if (ot == output_type_object) { + ret true; + } + ret false; } fn run_passes(ModuleRef llmod, bool opt, str output, @@ -6823,10 +6834,21 @@ fn run_passes(ModuleRef llmod, bool opt, str output, } llvm.LLVMAddVerifierPass(pm.llpm); - if (ot == output_type_assembly) { - llvm.LLVMRustWriteAssembly(pm.llpm, llmod, - _str.buf(x86.get_target_triple()), - _str.buf(output)); + if (is_object_or_assembly(ot)) { + let int LLVMAssemblyFile = 0; + let int LLVMObjectFile = 1; + let int LLVMNullFile = 2; + auto FileType; + if (ot == output_type_object) { + FileType = LLVMObjectFile; + } else { + FileType = LLVMAssemblyFile; + } + + llvm.LLVMRustWriteOutputFile(pm.llpm, llmod, + _str.buf(x86.get_target_triple()), + _str.buf(output), + FileType); ret; } diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index b2dcd065..ad702555 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -42,8 +42,15 @@ extern "C" void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM); void (*RustHackToFetchPassesO)(LLVMPassManagerRef PM) = LLVMAddBasicAliasAnalysisPass; -extern "C" void LLVMRustWriteAssembly(LLVMPassManagerRef PMR, LLVMModuleRef M, - const char *triple, const char *path) { +enum LLVMCodeGenFileType { + LLVMAssemblyFile, + LLVMObjectFile, + LLVMNullFile // Do not emit any output. +}; + +extern "C" void LLVMRustWriteOutputFile(LLVMPassManagerRef PMR, LLVMModuleRef M, + const char *triple, const char *path, + LLVMCodeGenFileType FileType) { InitializeAllTargets(); InitializeAllAsmPrinters(); TargetMachine::setRelocationModel(Reloc::PIC_); @@ -53,13 +60,15 @@ extern "C" void LLVMRustWriteAssembly(LLVMPassManagerRef PMR, LLVMModuleRef M, TargetMachine &Target = *TheTarget->createTargetMachine(triple, FeaturesStr); bool NoVerify = false; CodeGenOpt::Level OLvl = CodeGenOpt::Default; - TargetMachine::CodeGenFileType FileType = TargetMachine::CGFT_AssemblyFile; PassManager *PM = unwrap<PassManager>(PMR); std::string ErrorInfo; raw_fd_ostream OS(path, ErrorInfo, raw_fd_ostream::F_Binary); formatted_raw_ostream FOS(OS); - bool foo = Target.addPassesToEmitFile(*PM, FOS, FileType, OLvl, NoVerify); + TargetMachine::CodeGenFileType FileType2 = + static_cast<TargetMachine::CodeGenFileType>(FileType); + + bool foo = Target.addPassesToEmitFile(*PM, FOS, FileType2, OLvl, NoVerify); assert(!foo); PM->run(*unwrap(M)); } diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in index f95bb90b..0bd524c2 100644 --- a/src/rustllvm/rustllvm.def.in +++ b/src/rustllvm/rustllvm.def.in @@ -1,5 +1,5 @@ LLVMRustCreateMemoryBufferWithContentsOfFile -LLVMRustWriteAssembly +LLVMRustWriteOutputFile LLVMRustGetLastError LLVMCreateObjectFile LLVMDisposeObjectFile |