aboutsummaryrefslogtreecommitdiff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2010-12-06 17:17:49 -0800
committerPatrick Walton <[email protected]>2010-12-06 17:17:49 -0800
commit3f9d5dab5bd3e15eddbccbb97af30523cff17142 (patch)
treebed17beb0d5785517dd31fe97f979ca85b987b31 /src/comp/middle
parentrustc: Translate tag constructors. Can't call them at the moment due to lack ... (diff)
downloadrust-3f9d5dab5bd3e15eddbccbb97af30523cff17142.tar.xz
rust-3f9d5dab5bd3e15eddbccbb97af30523cff17142.zip
rustc: Run the verifier over LLVM modules before writing them out
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/trans.rs13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 9b6450cb..6f3705e8 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -23,8 +23,9 @@ import lib.llvm.llvm;
import lib.llvm.builder;
import lib.llvm.target_data;
import lib.llvm.type_handle;
-import lib.llvm.mk_type_handle;
+import lib.llvm.mk_pass_manager;
import lib.llvm.mk_target_data;
+import lib.llvm.mk_type_handle;
import lib.llvm.llvm.ModuleRef;
import lib.llvm.llvm.ValueRef;
import lib.llvm.llvm.TypeRef;
@@ -2245,6 +2246,14 @@ fn declare_intrinsics(ModuleRef llmod) -> hashmap[str,ValueRef] {
ret intrinsics;
}
+fn check_module(ModuleRef llmod) {
+ auto pm = mk_pass_manager();
+ llvm.LLVMAddVerifierPass(pm.llpm);
+ llvm.LLVMRunPassManager(pm.llpm, llmod);
+
+ // TODO: run the linter here also, once there are llvm-c bindings for it.
+}
+
fn trans_crate(session.session sess, @ast.crate crate, str output) {
auto llmod =
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
@@ -2302,6 +2311,8 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
trans_exit_task_glue(cx);
trans_main_fn(cx, crate_constant(cx));
+ check_module(llmod);
+
llvm.LLVMWriteBitcodeToFile(llmod, _str.buf(output));
llvm.LLVMDisposeModule(llmod);
}