Skip to content

debuginfo: Properly support self passed by value. #11033

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 18, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions src/librustc/middle/trans/debuginfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,13 @@ use driver::session;
use lib::llvm::llvm;
use lib::llvm::{ModuleRef, ContextRef, ValueRef};
use lib::llvm::debuginfo::*;
use middle::trans::adt;
use middle::trans::base;
use middle::trans::build;
use middle::trans::common::*;
use middle::trans::machine;
use middle::trans::type_of;
use middle::trans::type_::Type;
use middle::trans::adt;
use middle::trans;
use middle::ty;
use middle::pat_util;
Expand Down Expand Up @@ -453,12 +455,29 @@ pub fn create_self_argument_metadata(bcx: @mut Block,

let address_operations = &[unsafe { llvm::LLVMDIBuilderCreateOpDeref(Type::i64().to_ref()) }];

// The self argument comes in one of two forms:
// (1) For `&self`, `~self`, and `@self` it is an alloca containing a pointer to the data. That
// is the `{&~@}self` pointer is contained by value in the alloca, and `type_of_self` will
// be `{&~@}Self`
// (2) For by-value `self`, `llptr` will not be an alloca, but a pointer to the self-value. That
// is by-value `self` is always implicitly passed by reference (sic!). So we have a couple
// of problems here:
// (a) There is no alloca to give to `llvm.dbg.declare` and
// (b) `type_of_self` is `Self`, but `llptr` is of type `*Self`
// In order to solve this problem, the else branch below creates a helper alloca which
// contains a copy of `llptr`. We then describe the `self` parameter by pointing
// `llvm.dbg.declare` to this helper alloca and tell it that the pointer there needs to be
// dereferenced once to get to the actual data (similar to non-immediate by-value args).
let variable_access = if unsafe { llvm::LLVMIsAAllocaInst(llptr) } != ptr::null() {
DirectVariable { alloca: llptr }
} else {
// This is not stable and may break with future LLVM versions. llptr should really always
// be an alloca. Anything else is not supported and just works by chance.
IndirectVariable { alloca: llptr, address_operations: address_operations }
// Create a helper alloca that allows us to track the self-argument properly. The alloca
// contains a pointer to the self-value.
let ptr_type = ty::mk_mut_ptr(bcx.tcx(), type_of_self);
let helper_alloca = base::alloc_ty(bcx, ptr_type, "__self");
build::Store(bcx, llptr, helper_alloca);

IndirectVariable { alloca: helper_alloca, address_operations: address_operations }
};

declare_local(bcx,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// xfail-win32: FIXME (#10474)
// xfail-android: FIXME(#10381)

#[feature(managed_boxes)];
Expand Down
48 changes: 24 additions & 24 deletions src/test/debug-info/generic-method-on-generic-struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,72 +26,72 @@

// STACK BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = {8888, -8888}}
// debugger:print self
// check:$4 = {x = {8888, -8888}}
// debugger:print arg1
// check:$4 = -3
// check:$5 = -3
// debugger:print arg2
// check:$5 = -4
// check:$6 = -4
// debugger:continue

// OWNED BY REF
// debugger:finish
// debugger:print *self
// check:$6 = {x = 1234.5}
// check:$7 = {x = 1234.5}
// debugger:print arg1
// check:$7 = -5
// check:$8 = -5
// debugger:print arg2
// check:$8 = -6
// check:$9 = -6
// debugger:continue

// OWNED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = 1234.5}
// debugger:print self
// check:$10 = {x = 1234.5}
// debugger:print arg1
// check:$9 = -7
// check:$11 = -7
// debugger:print arg2
// check:$10 = -8
// check:$12 = -8
// debugger:continue

// OWNED MOVED
// debugger:finish
// debugger:print *self
// check:$11 = {x = 1234.5}
// check:$13 = {x = 1234.5}
// debugger:print arg1
// check:$12 = -9
// check:$14 = -9
// debugger:print arg2
// check:$13 = -10.5
// check:$15 = -10.5
// debugger:continue

// MANAGED BY REF
// debugger:finish
// debugger:print *self
// check:$14 = {x = -1}
// check:$16 = {x = -1}
// debugger:print arg1
// check:$15 = -11
// check:$17 = -11
// debugger:print arg2
// check:$16 = -12.5
// check:$18 = -12.5
// debugger:continue

// MANAGED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = -1}
// debugger:print self
// check:$19 = {x = -1}
// debugger:print arg1
// check:$17 = -13
// check:$20 = -13
// debugger:print *arg2
// check:$18 = {-14, 14}
// check:$21 = {-14, 14}
// debugger:continue

// MANAGED SELF
// debugger:finish
// debugger:print self->val
// check:$19 = {x = -1}
// check:$22 = {x = -1}
// debugger:print arg1
// check:$20 = -15
// check:$23 = -15
// debugger:print *arg2
// check:$21 = {-16, 16.5}
// check:$24 = {-16, 16.5}
// debugger:continue

#[feature(managed_boxes)];
Expand Down
48 changes: 24 additions & 24 deletions src/test/debug-info/method-on-enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,72 +26,72 @@

// STACK BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print self
// check:$4 = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print arg1
// check:$4 = -3
// check:$5 = -3
// debugger:print arg2
// check:$5 = -4
// check:$6 = -4
// debugger:continue

// OWNED BY REF
// debugger:finish
// debugger:print *self
// check:$6 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// check:$7 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// debugger:print arg1
// check:$7 = -5
// check:$8 = -5
// debugger:print arg2
// check:$8 = -6
// check:$9 = -6
// debugger:continue

// OWNED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// debugger:print self
// check:$10 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// debugger:print arg1
// check:$9 = -7
// check:$11 = -7
// debugger:print arg2
// check:$10 = -8
// check:$12 = -8
// debugger:continue

// OWNED MOVED
// debugger:finish
// debugger:print *self
// check:$11 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// check:$13 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
// debugger:print arg1
// check:$12 = -9
// check:$14 = -9
// debugger:print arg2
// check:$13 = -10
// check:$15 = -10
// debugger:continue

// MANAGED BY REF
// debugger:finish
// debugger:print *self
// check:$14 = {{Variant2, [...]}, {Variant2, 117901063}}
// check:$16 = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print arg1
// check:$15 = -11
// check:$17 = -11
// debugger:print arg2
// check:$16 = -12
// check:$18 = -12
// debugger:continue

// MANAGED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print self
// check:$19 = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print arg1
// check:$17 = -13
// check:$20 = -13
// debugger:print arg2
// check:$18 = -14
// check:$21 = -14
// debugger:continue

// MANAGED SELF
// debugger:finish
// debugger:print self->val
// check:$19 = {{Variant2, [...]}, {Variant2, 117901063}}
// check:$22 = {{Variant2, [...]}, {Variant2, 117901063}}
// debugger:print arg1
// check:$20 = -15
// check:$23 = -15
// debugger:print arg2
// check:$21 = -16
// check:$24 = -16
// debugger:continue

#[feature(managed_boxes)];
Expand Down
48 changes: 24 additions & 24 deletions src/test/debug-info/method-on-generic-struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,72 +26,72 @@

// STACK BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = {8888, -8888}}
// debugger:print self
// check:$4 = {x = {8888, -8888}}
// debugger:print arg1
// check:$4 = -3
// check:$5 = -3
// debugger:print arg2
// check:$5 = -4
// check:$6 = -4
// debugger:continue

// OWNED BY REF
// debugger:finish
// debugger:print *self
// check:$6 = {x = 1234.5}
// check:$7 = {x = 1234.5}
// debugger:print arg1
// check:$7 = -5
// check:$8 = -5
// debugger:print arg2
// check:$8 = -6
// check:$9 = -6
// debugger:continue

// OWNED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = 1234.5}
// debugger:print self
// check:$10 = {x = 1234.5}
// debugger:print arg1
// check:$9 = -7
// check:$11 = -7
// debugger:print arg2
// check:$10 = -8
// check:$12 = -8
// debugger:continue

// OWNED MOVED
// debugger:finish
// debugger:print *self
// check:$11 = {x = 1234.5}
// check:$13 = {x = 1234.5}
// debugger:print arg1
// check:$12 = -9
// check:$14 = -9
// debugger:print arg2
// check:$13 = -10
// check:$15 = -10
// debugger:continue

// MANAGED BY REF
// debugger:finish
// debugger:print *self
// check:$14 = {x = -1}
// check:$16 = {x = -1}
// debugger:print arg1
// check:$15 = -11
// check:$17 = -11
// debugger:print arg2
// check:$16 = -12
// check:$18 = -12
// debugger:continue

// MANAGED BY VAL
// debugger:finish
// d ebugger:print self -- ignored for now because of issue #8512
// c heck:$X = {x = -1}
// debugger:print self
// check:$19 = {x = -1}
// debugger:print arg1
// check:$17 = -13
// check:$20 = -13
// debugger:print arg2
// check:$18 = -14
// check:$21 = -14
// debugger:continue

// MANAGED SELF
// debugger:finish
// debugger:print self->val
// check:$19 = {x = -1}
// check:$22 = {x = -1}
// debugger:print arg1
// check:$20 = -15
// check:$23 = -15
// debugger:print arg2
// check:$21 = -16
// check:$24 = -16
// debugger:continue

#[feature(managed_boxes)];
Expand Down
Loading