Skip to content

Commit a7af861

Browse files
committed
Support emitting trap instructions for debugging.
1 parent 2de59aa commit a7af861

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

src/comp/lib/llvm.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,19 @@ obj builder(BuilderRef B) {
10691069
ret llvm.LLVMBuildPtrDiff(B, LHS, RHS, _str.buf(""));
10701070
}
10711071

1072+
fn Trap() -> ValueRef {
1073+
let BasicBlockRef BB = llvm.LLVMGetInsertBlock(B);
1074+
let ValueRef FN = llvm.LLVMGetBasicBlockParent(BB);
1075+
let ModuleRef M = llvm.LLVMGetGlobalParent(FN);
1076+
let ValueRef T = llvm.LLVMGetNamedFunction(M, _str.buf("llvm.trap"));
1077+
check (T as int != 0);
1078+
let vec[ValueRef] Args = vec();
1079+
ret llvm.LLVMBuildCall(B, T,
1080+
_vec.buf[ValueRef](Args),
1081+
_vec.len[ValueRef](Args),
1082+
_str.buf(""));
1083+
}
1084+
10721085
drop {
10731086
llvm.LLVMDisposeBuilder(B);
10741087
}

src/comp/middle/trans.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,13 +1369,20 @@ fn trans_main_fn(@trans_ctxt cx, ValueRef llcrate) {
13691369

13701370
}
13711371

1372+
fn declare_intrinsics(ModuleRef llmod) {
1373+
let vec[TypeRef] T_trap_args = vec();
1374+
decl_cdecl_fn(llmod, "llvm.trap", T_trap_args, T_void());
1375+
}
1376+
13721377
fn trans_crate(session.session sess, @ast.crate crate, str output) {
13731378
auto llmod =
13741379
llvm.LLVMModuleCreateWithNameInContext(_str.buf("rust_out"),
13751380
llvm.LLVMGetGlobalContext());
13761381

13771382
llvm.LLVMSetModuleInlineAsm(llmod, _str.buf(x86.get_module_asm()));
13781383

1384+
declare_intrinsics(llmod);
1385+
13791386
auto glues = @rec(activate_glue = decl_glue(llmod,
13801387
abi.activate_glue_name()),
13811388
yield_glue = decl_glue(llmod, abi.yield_glue_name()),

0 commit comments

Comments
 (0)