about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2011-11-16 19:30:45 -0500
committerJosh Matthews <josh@joshmatthews.net>2011-12-18 23:44:21 -0500
commit544bcfece238d47ca600fd09cef1f282a7a9bb26 (patch)
tree2f65baa8ddfa8381951eb36ed79a5f4c3c89c025 /src
parentfa6d871e11bc4f765062cff41fbce5d977e24ea5 (diff)
downloadrust-544bcfece238d47ca600fd09cef1f282a7a9bb26.tar.gz
rust-544bcfece238d47ca600fd09cef1f282a7a9bb26.zip
Fix LLVM assertions when lowering log statements.
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/debuginfo.rs51
-rw-r--r--src/comp/middle/trans.rs24
-rw-r--r--src/comp/middle/trans_build.rs54
-rw-r--r--src/comp/middle/trans_common.rs3
-rw-r--r--src/comp/middle/trans_vec.rs2
5 files changed, 87 insertions, 47 deletions
diff --git a/src/comp/middle/debuginfo.rs b/src/comp/middle/debuginfo.rs
index 885e42abc50..3f422b21d85 100644
--- a/src/comp/middle/debuginfo.rs
+++ b/src/comp/middle/debuginfo.rs
@@ -306,34 +306,65 @@ fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
     ret mdval;
 }
 
-fn update_source_pos(cx: @block_ctxt, s: codemap::span) {
+fn update_source_pos(cx: @block_ctxt, s: codemap::span) -> @debug_source_pos {
+    let dsp = @debug_source_pos(cx);
     if !bcx_ccx(cx).sess.get_opts().debuginfo {
-        ret;
+        ret dsp;
+    }
+    let cm = bcx_ccx(cx).sess.get_codemap();
+    if vec::is_empty(cx.source_pos.pos) {
+        cx.source_pos.usable = true;
+    }
+    cx.source_pos.pos += [codemap::lookup_char_pos(cm, s.lo)]; //XXX maybe hi
+    ret dsp;
+}
+
+fn invalidate_source_pos(cx: @block_ctxt) -> @invalidated_source_pos {
+    let isp = @invalidated_source_pos(cx);
+    if !bcx_ccx(cx).sess.get_opts().debuginfo {
+        ret isp;
     }
-    cx.source_pos = option::some(
-        codemap::lookup_char_pos(bcx_ccx(cx).sess.get_codemap(),
-                                 s.lo)); //XXX maybe hi
+    cx.source_pos.usable = false;
+    ret isp;
+}
 
+fn revalidate_source_pos(cx: @block_ctxt) {
+    if !bcx_ccx(cx).sess.get_opts().debuginfo {
+        ret;
+    }
+    cx.source_pos.usable = true;
 }
 
 fn reset_source_pos(cx: @block_ctxt) {
-    cx.source_pos = option::none;
+    if !bcx_ccx(cx).sess.get_opts().debuginfo {
+        ret;
+    }
+    vec::pop(cx.source_pos.pos);
+}
+
+resource debug_source_pos(bcx: @block_ctxt) {
+    reset_source_pos(bcx);
+}
+resource invalidated_source_pos(bcx: @block_ctxt) {
+    revalidate_source_pos(bcx);
 }
 
 fn add_line_info(cx: @block_ctxt, llinstr: ValueRef) {
     if !bcx_ccx(cx).sess.get_opts().debuginfo ||
-        option::is_none(cx.source_pos) {
+       !cx.source_pos.usable ||
+       vec::is_empty(cx.source_pos.pos) {
         ret;
     }
-    let loc = option::get(cx.source_pos);
+    let loc = option::get(vec::last(cx.source_pos.pos));
     let blockmd = get_block_metadata(cx);
-    let kind_id = llvm::LLVMGetMDKindID(as_buf("dbg"), str::byte_len("dbg"));
+    let kind_id = llvm::LLVMGetMDKindID(as_buf("dbg"),
+                                        str::byte_len("dbg"));
     let scopedata = [lli32(loc.line as int),
                      lli32(loc.col as int),
                      blockmd.node,
                      llnull()];
     let dbgscope = llmdnode(scopedata);
-    llvm::LLVMSetMetadata(llinstr, kind_id, dbgscope);    
+    llvm::LLVMSetMetadata(llinstr, kind_id, dbgscope);
 }
 
 fn get_function_metadata(cx: @crate_ctxt, item: @ast::item,
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 66b58369d25..1e91949d51f 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -3519,7 +3519,7 @@ fn trans_temp_expr(bcx: @block_ctxt, e: @ast::expr) -> result {
 // - exprs with non-immediate type never get dest=by_val
 fn trans_expr(bcx: @block_ctxt, e: @ast::expr, dest: dest) -> @block_ctxt {
     let tcx = bcx_tcx(bcx);
-    debuginfo::update_source_pos(bcx, e.span);
+    let _s = debuginfo::update_source_pos(bcx, e.span);
 
     if expr_is_lval(bcx, e) {
         ret lval_to_dps(bcx, e, dest);
@@ -4014,7 +4014,7 @@ fn trans_stmt(cx: @block_ctxt, s: ast::stmt) -> @block_ctxt {
     }
 
     let bcx = cx;
-    debuginfo::update_source_pos(cx, s.span);
+    let _s = debuginfo::update_source_pos(cx, s.span);
     
     alt s.node {
       ast::stmt_expr(e, _) { bcx = trans_expr(cx, e, ignore); }
@@ -4038,7 +4038,7 @@ fn trans_stmt(cx: @block_ctxt, s: ast::stmt) -> @block_ctxt {
       _ { bcx_ccx(cx).sess.unimpl("stmt variant"); }
     }
 
-    debuginfo::reset_source_pos(cx);
+    //debuginfo::reset_source_pos(cx);
     ret bcx;
 }
 
@@ -4063,7 +4063,8 @@ fn new_block_ctxt(cx: @fn_ctxt, parent: block_parent, kind: block_kind,
                 mutable lpad: option::none,
                 sp: cx.sp,
                 fcx: cx,
-                mutable source_pos: option::none};
+                source_pos: {mutable usable: false,
+                             mutable pos: []}};
     alt parent {
       parent_some(cx) {
         if cx.unreachable { Unreachable(bcx); }
@@ -4108,7 +4109,8 @@ fn new_raw_block_ctxt(fcx: @fn_ctxt, llbb: BasicBlockRef) -> @block_ctxt {
           mutable lpad: option::none,
           sp: fcx.sp,
           fcx: fcx,
-          mutable source_pos: option::none};
+          source_pos: {mutable usable: false,
+                       mutable pos: []}};
 }
 
 
@@ -4176,7 +4178,8 @@ fn llstaticallocas_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
           mutable lpad: option::none,
           sp: fcx.sp,
           fcx: fcx,
-          mutable source_pos: option::none};
+          source_pos: {mutable usable: false,
+                       mutable pos: []}};
 }
 
 fn llderivedtydescs_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
@@ -4190,7 +4193,8 @@ fn llderivedtydescs_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
           mutable lpad: option::none,
           sp: fcx.sp,
           fcx: fcx,
-          mutable source_pos: option::none};
+          source_pos: {mutable usable: false,
+                       mutable pos: []}};
 }
 
 
@@ -4263,20 +4267,22 @@ fn trans_block(bcx: @block_ctxt, b: ast::blk) -> @block_ctxt {
 fn trans_block_dps(bcx: @block_ctxt, b: ast::blk, dest: dest)
     -> @block_ctxt {
     let bcx = bcx;
-    debuginfo::update_source_pos(bcx, b.span);
     block_locals(b) {|local| bcx = alloc_local(bcx, local); };
     for s: @ast::stmt in b.node.stmts {
+        let _s = debuginfo::update_source_pos(bcx, b.span);
         bcx = trans_stmt(bcx, *s);
+        //debuginfo::reset_source_pos(bcx);
     }
     alt b.node.expr {
       some(e) {
         let bt = ty::type_is_bot(bcx_tcx(bcx), ty::expr_ty(bcx_tcx(bcx), e));
+        let _s = debuginfo::update_source_pos(bcx, e.span);
         bcx = trans_expr(bcx, e, bt ? ignore : dest);
+        //debuginfo::reset_source_pos(bcx);
       }
       _ { assert dest == ignore || bcx.unreachable; }
     }
     let rv = trans_block_cleanups(bcx, find_scope_cx(bcx));
-    debuginfo::reset_source_pos(bcx);
     ret rv;
 }
 
diff --git a/src/comp/middle/trans_build.rs b/src/comp/middle/trans_build.rs
index 26c63290405..a4512be24f7 100644
--- a/src/comp/middle/trans_build.rs
+++ b/src/comp/middle/trans_build.rs
@@ -408,7 +408,7 @@ fn GEP(cx: @block_ctxt, Pointer: ValueRef, Indices: [ValueRef]) -> ValueRef {
     unsafe {
         let instr = llvm::LLVMBuildGEP(B(cx), Pointer, vec::to_ptr(Indices),
                                        vec::len(Indices), noname());
-        debuginfo::add_line_info(cx, instr);
+        //debuginfo::add_line_info(cx, instr);
         ret instr;
     }
 }
@@ -425,18 +425,18 @@ fn InBoundsGEP(cx: @block_ctxt, Pointer: ValueRef, Indices: [ValueRef]) ->
    ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(T_ptr(T_nil())); }
     unsafe {
-        let v = llvm::LLVMBuildInBoundsGEP(B(cx), Pointer,
-                                           vec::to_ptr(Indices),
-                                           vec::len(Indices), noname());
-        debuginfo::add_line_info(cx, v);
-        ret v;
+        let instr = llvm::LLVMBuildInBoundsGEP(B(cx), Pointer,
+                                               vec::to_ptr(Indices),
+                                               vec::len(Indices), noname());
+        //debuginfo::add_line_info(cx, instr);
+        ret instr;
     }
 }
 
 fn StructGEP(cx: @block_ctxt, Pointer: ValueRef, Idx: uint) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(T_ptr(T_nil())); }
     let instr = llvm::LLVMBuildStructGEP(B(cx), Pointer, Idx, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -458,84 +458,84 @@ fn GlobalStringPtr(cx: @block_ctxt, _Str: sbuf) -> ValueRef {
 fn Trunc(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildTrunc(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn ZExt(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildZExt(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn SExt(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildSExt(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn FPToUI(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildFPToUI(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn FPToSI(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildFPToSI(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn UIToFP(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildUIToFP(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn SIToFP(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildSIToFP(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn FPTrunc(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildFPTrunc(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn FPExt(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildFPExt(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn PtrToInt(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildPtrToInt(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn IntToPtr(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildIntToPtr(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn BitCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildBitCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -543,7 +543,7 @@ fn ZExtOrBitCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) ->
    ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildZExtOrBitCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -551,7 +551,7 @@ fn SExtOrBitCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) ->
    ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildSExtOrBitCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -559,7 +559,7 @@ fn TruncOrBitCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) ->
    ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildTruncOrBitCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -567,28 +567,28 @@ fn Cast(cx: @block_ctxt, Op: Opcode, Val: ValueRef, DestTy: TypeRef,
         _Name: sbuf) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildCast(B(cx), Op, Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn PointerCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildPointerCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn IntCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildIntCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
 fn FPCast(cx: @block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
     if cx.unreachable { ret llvm::LLVMGetUndef(DestTy); }
     let instr = llvm::LLVMBuildFPCast(B(cx), Val, DestTy, noname());
-    debuginfo::add_line_info(cx, instr);
+    //debuginfo::add_line_info(cx, instr);
     ret instr;
 }
 
@@ -670,7 +670,7 @@ fn Call(cx: @block_ctxt, Fn: ValueRef, Args: [ValueRef]) -> ValueRef {
     unsafe {
         let instr = llvm::LLVMBuildCall(B(cx), Fn, vec::to_ptr(Args),
                                         vec::len(Args), noname());
-        debuginfo::add_line_info(cx, instr);
+        //debuginfo::add_line_info(cx, instr);
         ret instr;
     }
 }
diff --git a/src/comp/middle/trans_common.rs b/src/comp/middle/trans_common.rs
index 98c4b497ab5..770b751cf82 100644
--- a/src/comp/middle/trans_common.rs
+++ b/src/comp/middle/trans_common.rs
@@ -386,7 +386,8 @@ type block_ctxt =
      mutable lpad: option::t<BasicBlockRef>,
      sp: span,
      fcx: @fn_ctxt,
-     mutable source_pos: option::t<syntax::codemap::loc>};
+     source_pos: {mutable usable: bool,
+                  mutable pos: [syntax::codemap::loc]}};
 
 // FIXME: we should be able to use option::t<@block_parent> here but
 // the infinite-tag check in rustboot gets upset.
diff --git a/src/comp/middle/trans_vec.rs b/src/comp/middle/trans_vec.rs
index dba2b67410e..9c1d574aad6 100644
--- a/src/comp/middle/trans_vec.rs
+++ b/src/comp/middle/trans_vec.rs
@@ -27,6 +27,7 @@ fn pointer_add(bcx: @block_ctxt, ptr: ValueRef, bytes: ValueRef) -> ValueRef {
 }
 
 fn alloc_raw(bcx: @block_ctxt, fill: ValueRef, alloc: ValueRef) -> result {
+    let _s = debuginfo::invalidate_source_pos(bcx);
     let ccx = bcx_ccx(bcx);
     let llvecty = ccx.opaque_vec_type;
     let vecsize = Add(bcx, alloc, llsize_of(ccx, llvecty));
@@ -45,6 +46,7 @@ type alloc_result =
      llunitty: TypeRef};
 
 fn alloc(bcx: @block_ctxt, vec_ty: ty::t, elts: uint) -> alloc_result {
+    let _s = debuginfo::invalidate_source_pos(bcx);
     let ccx = bcx_ccx(bcx);
     let unit_ty = ty::sequence_element_type(bcx_tcx(bcx), vec_ty);
     let llunitty = type_of_or_i8(bcx, unit_ty);