Support emitting trap instructions for debugging.
This commit is contained in:
parent
2de59aa6b9
commit
a7af86155d
2 changed files with 20 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue