Fixed remaining issues to pass debug-test/* tests.

Made debugger scripts source line insensitive.
This commit is contained in:
Vadim Chugunov 2013-06-14 12:23:42 -07:00
parent 62e86e044d
commit 65dd6218af
9 changed files with 73 additions and 28 deletions

View File

@ -2045,6 +2045,14 @@ pub mod llvm {
AlwaysPreserve: bool,
Flags: c_uint,
ArgNo: c_uint) -> DIVariable;
#[fast_ffi]
pub unsafe fn LLVMDIBuilderCreateArrayType(
Builder: DIBuilderRef,
Size: c_ulonglong,
AlignInBits: c_ulonglong,
Ty: DIType,
Subscripts: DIArray) -> DIType;
#[fast_ffi]
pub unsafe fn LLVMDIBuilderCreateVectorType(

View File

@ -24,6 +24,7 @@ use util::ppaux::ty_to_str;
use core::hashmap::HashMap;
use core::libc;
use core::libc::c_uint;
use core::cmp;
use core::ptr;
use core::str::as_c_str;
use core::sys;
@ -204,8 +205,7 @@ fn create_block(bcx: block) -> DILexicalBlock {
fn size_and_align_of(cx: @CrateContext, t: ty::t) -> (uint, uint) {
let llty = type_of::type_of(cx, t);
(machine::llsize_of_real(cx, llty),
machine::llalign_of_pref(cx, llty))
(machine::llsize_of_real(cx, llty), machine::llalign_of_min(cx, llty))
}
fn create_basic_type(cx: @CrateContext, t: ty::t, span: span) -> DIType{
@ -277,6 +277,7 @@ struct StructContext {
impl StructContext {
fn create(cx: @CrateContext, file: DIFile, name: ~str, line: uint) -> ~StructContext {
debug!("StructContext::create: %s", name);
let scx = ~StructContext {
cx: cx,
file: file,
@ -284,39 +285,48 @@ impl StructContext {
line: line,
members: ~[],
total_size: 0,
align: 64 //XXX different alignment per arch?
align: 1
};
return scx;
}
fn add_member(&mut self, name: &str, line: uint, size: uint, align: uint, ty: DIType) {
debug!("StructContext(%s)::add_member: %s, size=%u, align=%u", self.name, name, size, align);
let offset = roundup(self.total_size, align);
let mem_t = do as_c_str(name) |name| { unsafe {
llvm::LLVMDIBuilderCreateMemberType(dbg_cx(self.cx).builder,
ptr::null(), name, self.file, line as c_uint,
size * 8 as u64, align * 8 as u64, self.total_size as u64,
size * 8 as u64, align * 8 as u64, offset * 8 as u64,
0, ty)
}};
// XXX What about member alignment???
self.members.push(mem_t);
self.total_size += size * 8;
self.total_size = offset + size;
// struct alignment is the max alignment of its' members
self.align = cmp::max(self.align, align);
}
fn finalize(&self) -> DICompositeType {
debug!("StructContext(%s)::finalize: total_size=%u, align=%u", self.name, self.total_size, self.align);
let dcx = dbg_cx(self.cx);
let members_md = create_DIArray(dcx.builder, self.members);
let struct_md =
do as_c_str(self.name) |name| { unsafe {
llvm::LLVMDIBuilderCreateStructType(
dcx.builder, ptr::null(), name,
dcx.builder, self.file, name,
self.file, self.line as c_uint,
self.total_size as u64, self.align as u64, 0, ptr::null(),
self.total_size * 8 as u64, self.align * 8 as u64, 0, ptr::null(),
members_md, 0, ptr::null())
}};
return struct_md;
}
}
#[inline(always)]
fn roundup(x: uint, a: uint) -> uint {
((x + (a - 1)) / a) * a
}
fn create_struct(cx: @CrateContext, t: ty::t, fields: ~[ty::field], span: span) -> DICompositeType {
let loc = span_start(cx, span);
let file_md = create_file(cx, loc.file.name);
@ -390,12 +400,12 @@ fn create_fixed_vec(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t,
let (size, align) = size_and_align_of(cx, elem_t);
let subrange = unsafe {
llvm::LLVMDIBuilderGetOrCreateSubrange(dcx.builder, 0_i64, (len-1) as i64) };
llvm::LLVMDIBuilderGetOrCreateSubrange(dcx.builder, 0_i64, len as i64) };
let subscripts = create_DIArray(dcx.builder, [subrange]);
return unsafe {
llvm::LLVMDIBuilderCreateVectorType(dcx.builder,
size * len as u64, align as u64, elem_ty_md, subscripts)
llvm::LLVMDIBuilderCreateArrayType(dcx.builder,
size * len * 8 as u64, align * 8 as u64, elem_ty_md, subscripts)
};
}
@ -418,8 +428,8 @@ fn create_boxed_vec(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t,
let name = fmt!("[%s]", ty_to_str(cx.tcx, elem_t));
let subscripts = create_DIArray(dcx.builder, [subrange]);
let data_ptr = unsafe { llvm::LLVMDIBuilderCreateVectorType(dcx.builder,
arr_size as u64, arr_align as u64, elem_ty_md, subscripts) };
let data_ptr = unsafe { llvm::LLVMDIBuilderCreateArrayType(dcx.builder,
arr_size * 8 as u64, arr_align * 8 as u64, elem_ty_md, subscripts) };
vec_scx.add_member("data", 0, 0, // clang says the size should be 0
sys::min_align_of::<u8>(), data_ptr);
let vec_md = vec_scx.finalize();

View File

@ -725,6 +725,17 @@ extern "C" LLVMValueRef LLVMDIBuilderCreateLocalVariable(
unwrapDI<DIType>(Ty), AlwaysPreserve, Flags, ArgNo));
}
extern "C" LLVMValueRef LLVMDIBuilderCreateArrayType(
DIBuilderRef Builder,
uint64_t Size,
uint64_t AlignInBits,
LLVMValueRef Ty,
LLVMValueRef Subscripts) {
return wrap(Builder->createArrayType(Size, AlignInBits,
unwrapDI<DIType>(Ty),
unwrapDI<DIArray>(Subscripts)));
}
extern "C" LLVMValueRef LLVMDIBuilderCreateVectorType(
DIBuilderRef Builder,
uint64_t Size,

View File

@ -601,6 +601,7 @@ LLVMDIBuilderCreatePointerType
LLVMDIBuilderCreateMemberType
LLVMDIBuilderCreateStructType
LLVMDIBuilderGetOrCreateSubrange
LLVMDIBuilderCreateArrayType
LLVMDIBuilderCreateVectorType
LLVMDIBuilderCreateSubroutineType
LLVMDIBuilderGetOrCreateArray

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
// Caveats - gdb prints any 8-bit value (meaning rust i8 and u8 values)
// as its numerical value along with its associated ASCII char, there
@ -17,8 +17,9 @@
// its numerical value.
// compile-flags:-Z extra-debug-info
// debugger:break 67
// debugger:break _zzz
// debugger:run
// debugger:finish
// debugger:print b
// check:$1 = false
// debugger:print i
@ -66,5 +67,7 @@ fn main() {
let f: float = 1.5;
let f32: f32 = 2.5;
let f64: f64 = 3.5;
let _z = ();
_zzz();
}
fn _zzz() {()}

View File

@ -8,12 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
// compile-flags:-Z extra-debug-info
// debugger:set print pretty off
// debugger:break 29
// debugger:break _zzz
// debugger:run
// debugger:finish
// debugger:print a->boxed
// check:$1 = 1
// debugger:print b->boxed
@ -28,5 +29,7 @@ fn main() {
let b = ~(2, 3.5);
let c = @4;
let d = @false;
let _z = 0;
_zzz();
}
fn _zzz() {()}

View File

@ -8,12 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
// compile-flags:-Z extra-debug-info
// debugger:set print pretty off
// debugger:break 29
// debugger:break _zzz
// debugger:run
// debugger:finish
// debugger:print pair
// check:$1 = {x = 1, y = 2}
// debugger:print pair.x
@ -28,5 +29,7 @@ struct Pair {
fn main() {
let pair = Pair { x: 1, y: 2 };
let _z = ();
_zzz();
}
fn _zzz() {()}

View File

@ -8,16 +8,19 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
// compile-flags:-Z extra-debug-info
// debugger:set print pretty off
// debugger:break 20
// debugger:break _zzz
// debugger:run
// debugger:finish
// debugger:print t
// check:$1 = {4, 5.5, true}
fn main() {
let t = (4, 5.5, true);
let _z = ();
_zzz();
}
fn _zzz() {()}

View File

@ -8,12 +8,13 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// xfail-test
// xfail-win32 Broken because of LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=16249
// compile-flags:-Z extra-debug-info
// debugger:set print pretty off
// debugger:break 29
// debugger:break _zzz
// debugger:run
// debugger:finish
// debugger:print a
// check:$1 = {1, 2, 3}
// debugger:print b.vec[0]
@ -28,5 +29,7 @@ fn main() {
let b = &[4, 5, 6];
let c = @[7, 8, 9];
let d = ~[10, 11, 12];
let _z = 0;
_zzz();
}
fn _zzz() {()}