Support emitting trap instructions for debugging.

This commit is contained in:
Graydon Hoare 2010-11-14 11:21:49 -08:00
parent 2de59aa6b9
commit a7af86155d
2 changed files with 20 additions and 0 deletions

View file

@ -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);
}

View file

@ -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()),