aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <[email protected]>2011-04-18 10:02:34 -0400
committerRafael Ávila de Espíndola <[email protected]>2011-04-18 10:02:52 -0400
commitf12998e5d7a4409d2bf748a671c345a79085213e (patch)
treee8ae174f5e6bf1c8c7c87b18d807684d1b126358 /src
parentMake log the log level configurable per module (diff)
downloadrust-f12998e5d7a4409d2bf748a671c345a79085213e.tar.xz
rust-f12998e5d7a4409d2bf748a671c345a79085213e.zip
Add a -c option.
Diffstat (limited to 'src')
-rw-r--r--src/comp/driver/rustc.rs2
-rw-r--r--src/comp/lib/llvm.rs6
-rw-r--r--src/comp/middle/trans.rs30
-rw-r--r--src/rustllvm/RustWrapper.cpp17
-rw-r--r--src/rustllvm/rustllvm.def.in2
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