about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-11-14 11:21:49 -0800
committerGraydon Hoare <graydon@mozilla.com>2010-11-14 11:21:49 -0800
commita7af86155d9b82cd65758c1fd6954aaef053b11a (patch)
treea93b12cac2b0c26f63b9e22cad74d6375668747d /src/comp
parent2de59aa6b9096788577319b258469848e633938f (diff)
downloadrust-a7af86155d9b82cd65758c1fd6954aaef053b11a.tar.gz
rust-a7af86155d9b82cd65758c1fd6954aaef053b11a.zip
Support emitting trap instructions for debugging.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/lib/llvm.rs13
-rw-r--r--src/comp/middle/trans.rs7
2 files changed, 20 insertions, 0 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index d30bb3ba6aa..0cd177a406d 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -1069,6 +1069,19 @@ obj builder(BuilderRef B) {
         ret llvm.LLVMBuildPtrDiff(B, LHS, RHS, _str.buf(""));
     }
 
+    fn Trap() -> ValueRef {
+        let BasicBlockRef BB = llvm.LLVMGetInsertBlock(B);
+        let ValueRef FN = llvm.LLVMGetBasicBlockParent(BB);
+        let ModuleRef M = llvm.LLVMGetGlobalParent(FN);
+        let ValueRef T = llvm.LLVMGetNamedFunction(M, _str.buf("llvm.trap"));
+        check (T as int != 0);
+        let vec[ValueRef] Args = vec();
+        ret llvm.LLVMBuildCall(B, T,
+                               _vec.buf[ValueRef](Args),
+                               _vec.len[ValueRef](Args),
+                               _str.buf(""));
+    }
+
     drop {
         llvm.LLVMDisposeBuilder(B);
     }
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 4d24bb92081..4140c0f3c6d 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -1369,6 +1369,11 @@ fn trans_main_fn(@trans_ctxt cx, ValueRef llcrate) {
 
 }
 
+fn declare_intrinsics(ModuleRef llmod) {
+    let vec[TypeRef] T_trap_args = vec();
+    decl_cdecl_fn(llmod, "llvm.trap", T_trap_args, T_void());
+}
+
 fn trans_crate(session.session sess, @ast.crate crate, str output) {
     auto llmod =
         llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
@@ -1376,6 +1381,8 @@ fn trans_crate(session.session sess, @ast.crate crate, str output) {
 
     llvm.LLVMSetModuleInlineAsm(llmod, _str.buf(x86.get_module_asm()));
 
+    declare_intrinsics(llmod);
+
     auto glues = @rec(activate_glue = decl_glue(llmod,
                                                 abi.activate_glue_name()),
                       yield_glue = decl_glue(llmod, abi.yield_glue_name()),