Skip to content

Commit 75ad116

Browse files
debuginfo: Improve DWARF representation of unsized vecs and strings.
1 parent 612ded7 commit 75ad116

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/librustc_trans/trans/debuginfo.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ use session::config::{self, FullDebugInfo, LimitedDebugInfo, NoDebugInfo};
207207
use util::nodemap::{DefIdMap, NodeMap, FnvHashMap, FnvHashSet};
208208
use util::ppaux;
209209

210-
use libc::c_uint;
210+
use libc::{c_uint, c_longlong};
211211
use std::ffi::CString;
212212
use std::cell::{Cell, RefCell};
213213
use std::ptr;
@@ -2764,7 +2764,7 @@ fn create_struct_stub(cx: &CrateContext,
27642764
fn fixed_vec_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
27652765
unique_type_id: UniqueTypeId,
27662766
element_type: Ty<'tcx>,
2767-
len: uint,
2767+
len: Option<u64>,
27682768
span: Span)
27692769
-> MetadataCreationResult {
27702770
let element_type_metadata = type_metadata(cx, element_type, span);
@@ -2774,18 +2774,20 @@ fn fixed_vec_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
27742774
let element_llvm_type = type_of::type_of(cx, element_type);
27752775
let (element_type_size, element_type_align) = size_and_align_of(cx, element_llvm_type);
27762776

2777+
let (array_size_in_bytes, upper_bound) = match len {
2778+
Some(len) => (element_type_size * len, len as c_longlong),
2779+
None => (0, -1)
2780+
};
2781+
27772782
let subrange = unsafe {
2778-
llvm::LLVMDIBuilderGetOrCreateSubrange(
2779-
DIB(cx),
2780-
0,
2781-
len as i64)
2783+
llvm::LLVMDIBuilderGetOrCreateSubrange(DIB(cx), 0, upper_bound)
27822784
};
27832785

27842786
let subscripts = create_DIArray(DIB(cx), &[subrange]);
27852787
let metadata = unsafe {
27862788
llvm::LLVMDIBuilderCreateArrayType(
27872789
DIB(cx),
2788-
bytes_to_bits(element_type_size * (len as u64)),
2790+
bytes_to_bits(array_size_in_bytes),
27892791
bytes_to_bits(element_type_align),
27902792
element_type_metadata,
27912793
subscripts)
@@ -2991,12 +2993,12 @@ fn type_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
29912993
ty::ty_enum(def_id, _) => {
29922994
prepare_enum_metadata(cx, t, def_id, unique_type_id, usage_site_span).finalize(cx)
29932995
}
2994-
ty::ty_vec(typ, Some(len)) => {
2995-
fixed_vec_metadata(cx, unique_type_id, typ, len, usage_site_span)
2996+
ty::ty_vec(typ, len) => {
2997+
fixed_vec_metadata(cx, unique_type_id, typ, len.map(|x| x as u64), usage_site_span)
2998+
}
2999+
ty::ty_str => {
3000+
fixed_vec_metadata(cx, unique_type_id, cx.tcx().types.i8, None, usage_site_span)
29963001
}
2997-
// FIXME Can we do better than this for unsized vec/str fields?
2998-
ty::ty_vec(typ, None) => fixed_vec_metadata(cx, unique_type_id, typ, 0, usage_site_span),
2999-
ty::ty_str => fixed_vec_metadata(cx, unique_type_id, cx.tcx().types.i8, 0, usage_site_span),
30003002
ty::ty_trait(..) => {
30013003
MetadataCreationResult::new(
30023004
trait_pointer_metadata(cx, t, None, unique_type_id),

0 commit comments

Comments
 (0)