Skip to content

Commit c80e556

Browse files
committed
Auto merge of #21519 - michaelwoerister:misc, r=eddyb
Two minor improvements that have been on my TODO list for a while: * Clang uses a size of `-1` for arrays of unknown size and we should do that too as it will tell LLVM to omit the size information in debuginfo. * There was no LLDB test case for handling the optimized enum representation introduced by @luqmana. This PR finally adds one.
2 parents d151923 + 75ad116 commit c80e556

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-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),

src/test/debuginfo/option-like-enum.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@
3636
// gdb-command:print void_droid_gdb->internals
3737
// gdb-check:$6 = (isize *) 0x0
3838

39+
// gdb-command:print nested_non_zero_yep
40+
// gdb-check:$7 = {RUST$ENCODED$ENUM$1$2$Nope = {10.5, {a = 10, b = 20, c = [...]}}}
41+
42+
// gdb-command:print nested_non_zero_nope
43+
// gdb-check:$8 = {RUST$ENCODED$ENUM$1$2$Nope = {[...], {a = [...], b = [...], c = 0x0}}}
44+
3945
// gdb-command:continue
4046

4147

@@ -67,6 +73,12 @@
6773
// lldb-command:print none_str
6874
// lldb-check:[...]$7 = None
6975

76+
// lldb-command:print nested_non_zero_yep
77+
// lldb-check:[...]$8 = Yep(10.5, NestedNonZeroField { a: 10, b: 20, c: &[...] })
78+
79+
// lldb-command:print nested_non_zero_nope
80+
// lldb-check:[...]$9 = Nope
81+
7082

7183
#![omit_gdb_pretty_printer_section]
7284

@@ -102,6 +114,17 @@ struct NamedFieldsRepr<'a> {
102114
internals: &'a isize
103115
}
104116

117+
struct NestedNonZeroField<'a> {
118+
a: u16,
119+
b: u32,
120+
c: &'a char,
121+
}
122+
123+
enum NestedNonZero<'a> {
124+
Yep(f64, NestedNonZeroField<'a>),
125+
Nope
126+
}
127+
105128
fn main() {
106129

107130
let some_str: Option<&'static str> = Some("abc");
@@ -124,6 +147,17 @@ fn main() {
124147
let void_droid = NamedFields::Void;
125148
let void_droid_gdb: &NamedFieldsRepr = unsafe { std::mem::transmute(&NamedFields::Void) };
126149

150+
let x = 'x';
151+
let nested_non_zero_yep = NestedNonZero::Yep(
152+
10.5,
153+
NestedNonZeroField {
154+
a: 10,
155+
b: 20,
156+
c: &x
157+
});
158+
159+
let nested_non_zero_nope = NestedNonZero::Nope;
160+
127161
zzz(); // #break
128162
}
129163

0 commit comments

Comments
 (0)