diff options
| author | Graydon Hoare <[email protected]> | 2010-11-14 11:21:49 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-11-14 11:21:49 -0800 |
| commit | a7af86155d9b82cd65758c1fd6954aaef053b11a (patch) | |
| tree | a93b12cac2b0c26f63b9e22cad74d6375668747d | |
| parent | Correct infinite-loop, block-context mismatches in early cleanups. (diff) | |
| download | rust-a7af86155d9b82cd65758c1fd6954aaef053b11a.tar.xz rust-a7af86155d9b82cd65758c1fd6954aaef053b11a.zip | |
Support emitting trap instructions for debugging.
| -rw-r--r-- | src/comp/lib/llvm.rs | 13 | ||||
| -rw-r--r-- | src/comp/middle/trans.rs | 7 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs index d30bb3ba..0cd177a4 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 4d24bb92..4140c0f3 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()), |