Skip to content

Commit

Permalink
auto merge of #11033 : michaelwoerister/rust/byvalself, r=pcwalton
Browse files Browse the repository at this point in the history
As the title says. The trans changes will lead to an auxiliary alloca being created that allows debug info to track the `self` argument. This alloca is only created in debug builds however. Otherwise very little had to be done after I managed to navigate to some degree the jungle that is self-argument handling `:P` 

Closes #10549
  • Loading branch information
bors committed Dec 18, 2013
2 parents c335734 + 01fae5f commit 5ece092
Show file tree
Hide file tree
Showing 10 changed files with 215 additions and 197 deletions.
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

0 comments on commit 5ece092

Please sign in to comment.