debuginfo: Don't mark struct fields as artificial.
LLDB doesn't allow for reading 'artifical' fields (fields that are generated by the compiler). So do not mark, slice fields, enum discriminants, and GcBox value fields as artificial.
This commit is contained in:
parent
895aac9935
commit
98a0f9166c
13 changed files with 57 additions and 45 deletions
|
@ -196,7 +196,7 @@ def classify_struct(type):
|
|||
if field_count == 0:
|
||||
return STRUCT_KIND_REGULAR_STRUCT
|
||||
|
||||
if fields[0].artificial:
|
||||
if fields[0].name == "RUST$ENUM$DISR":
|
||||
if field_count == 1:
|
||||
return STRUCT_KIND_CSTYLE_VARIANT
|
||||
elif fields[1].name == None:
|
||||
|
|
|
@ -117,11 +117,19 @@ def print_enum_val(val, internal_dict):
|
|||
|
||||
assert val.GetType().GetTypeClass() == lldb.eTypeClassUnion
|
||||
|
||||
|
||||
if val.num_children == 1:
|
||||
# This is either an enum with just one variant, or it is an Option-like enum
|
||||
# where the discriminant is encoded in a non-nullable pointer field. We find
|
||||
# out which one it is by looking at the member name of the sole union
|
||||
# variant. If it starts with "RUST$ENCODED$ENUM$" then we have an
|
||||
# Option-like enum.
|
||||
first_variant_name = val.GetChildAtIndex(0).GetName()
|
||||
if first_variant_name and first_variant_name.startswith("RUST$ENCODED$ENUM$"):
|
||||
# Try to extract the
|
||||
|
||||
# This is an Option-like enum. The position of the discriminator field is
|
||||
# encoded in the name which has the format:
|
||||
# RUST$ENCODED$ENUM$<index of discriminator field>$<name of null variant>
|
||||
last_separator_index = first_variant_name.rfind("$")
|
||||
if last_separator_index == -1:
|
||||
return "<invalid enum encoding: %s>" % first_variant_name
|
||||
|
@ -130,6 +138,7 @@ def print_enum_val(val, internal_dict):
|
|||
if second_last_separator_index == -1:
|
||||
return "<invalid enum encoding: %s>" % first_variant_name
|
||||
|
||||
# Extract index of the discriminator field
|
||||
try:
|
||||
disr_field_index = first_variant_name[second_last_separator_index + 1 :
|
||||
last_separator_index]
|
||||
|
@ -137,18 +146,22 @@ def print_enum_val(val, internal_dict):
|
|||
except:
|
||||
return "<invalid enum encoding: %s>" % first_variant_name
|
||||
|
||||
# Read the discriminant
|
||||
disr_val = val.GetChildAtIndex(0).GetChildAtIndex(disr_field_index).GetValueAsUnsigned()
|
||||
|
||||
if disr_val == 0:
|
||||
# Null case: Print the name of the null-variant
|
||||
null_variant_name = first_variant_name[last_separator_index + 1:]
|
||||
return null_variant_name
|
||||
else:
|
||||
# Non-null case: Interpret the data as a value of the non-null variant type
|
||||
return print_struct_val_starting_from(0, val.GetChildAtIndex(0), internal_dict)
|
||||
else:
|
||||
# This is just a regular uni-variant enum without discriminator field
|
||||
return print_struct_val_starting_from(0, val.GetChildAtIndex(0), internal_dict)
|
||||
|
||||
# extract the discriminator value by
|
||||
disr_val = val.GetChildAtIndex(0).GetChildAtIndex(0)
|
||||
# If we are here, this is a regular enum with more than one variant
|
||||
disr_val = val.GetChildAtIndex(0).GetChildMemberWithName("RUST$ENUM$DISR")
|
||||
disr_type = disr_val.GetType()
|
||||
|
||||
if disr_type.GetTypeClass() != lldb.eTypeClassEnumeration:
|
||||
|
|
|
@ -242,7 +242,6 @@ static UNKNOWN_FILE_METADATA: DIFile = (0 as DIFile);
|
|||
static UNKNOWN_SCOPE_METADATA: DIScope = (0 as DIScope);
|
||||
|
||||
static FLAGS_NONE: c_uint = 0;
|
||||
static FLAGS_ARTIFICAL: c_uint = llvm::debuginfo::FlagArtificial as c_uint;
|
||||
|
||||
//=-----------------------------------------------------------------------------
|
||||
// Public Interface of debuginfo module
|
||||
|
@ -2276,11 +2275,7 @@ impl VariantMemberDescriptionFactory {
|
|||
_ => type_metadata(cx, ty, self.span)
|
||||
},
|
||||
offset: ComputedMemberOffset,
|
||||
flags: if self.discriminant_type_metadata.is_some() && i == 0 {
|
||||
FLAGS_ARTIFICAL
|
||||
} else {
|
||||
FLAGS_NONE
|
||||
}
|
||||
flags: FLAGS_NONE
|
||||
}
|
||||
}).collect()
|
||||
}
|
||||
|
@ -2339,9 +2334,9 @@ fn describe_enum_variant(cx: &CrateContext,
|
|||
None => variant_info.args.iter().map(|_| "".to_string()).collect()
|
||||
};
|
||||
|
||||
// If this is not a univariant enum, there is also the (unnamed) discriminant field.
|
||||
// If this is not a univariant enum, there is also the discriminant field.
|
||||
match discriminant_info {
|
||||
RegularDiscriminant(_) => arg_names.insert(0, "".to_string()),
|
||||
RegularDiscriminant(_) => arg_names.insert(0, "RUST$ENUM$DISR".to_string()),
|
||||
_ => { /* do nothing */ }
|
||||
};
|
||||
|
||||
|
@ -2713,14 +2708,14 @@ fn vec_slice_metadata(cx: &CrateContext,
|
|||
llvm_type: *member_llvm_types.get(0),
|
||||
type_metadata: element_type_metadata,
|
||||
offset: ComputedMemberOffset,
|
||||
flags: FLAGS_ARTIFICAL
|
||||
flags: FLAGS_NONE
|
||||
},
|
||||
MemberDescription {
|
||||
name: "length".to_string(),
|
||||
llvm_type: *member_llvm_types.get(1),
|
||||
type_metadata: type_metadata(cx, ty::mk_uint(), span),
|
||||
offset: ComputedMemberOffset,
|
||||
flags: FLAGS_ARTIFICAL
|
||||
flags: FLAGS_NONE
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// ignore-android: FIXME(#10381)
|
||||
|
||||
// compile-flags:-g
|
||||
|
@ -19,10 +20,10 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print *the_a_ref
|
||||
// gdb-check:$1 = {{TheA, x = 0, y = 8970181431921507452}, {TheA, 0, 2088533116, 2088533116}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = TheA, x = 0, y = 8970181431921507452}, {RUST$ENUM$DISR = TheA, 0, 2088533116, 2088533116}}
|
||||
|
||||
// gdb-command:print *the_b_ref
|
||||
// gdb-check:$2 = {{TheB, x = 0, y = 1229782938247303441}, {TheB, 0, 286331153, 286331153}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = TheB, x = 0, y = 1229782938247303441}, {RUST$ENUM$DISR = TheB, 0, 286331153, 286331153}}
|
||||
|
||||
// gdb-command:print *univariant_ref
|
||||
// gdb-check:$3 = {{4820353753753434}}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// ignore-android: FIXME(#10381)
|
||||
|
||||
// compile-flags:-g
|
||||
|
@ -43,7 +44,7 @@
|
|||
|
||||
// gdb-command:finish
|
||||
// gdb-command:print x
|
||||
// gdb-check:$7 = {{Case1, x = 0, y = 8970181431921507452}, {Case1, 0, 2088533116, 2088533116}}
|
||||
// gdb-check:$7 = {{RUST$ENUM$DISR = Case1, x = 0, y = 8970181431921507452}, {RUST$ENUM$DISR = Case1, 0, 2088533116, 2088533116}}
|
||||
// gdb-command:continue
|
||||
|
||||
|
||||
|
|
|
@ -18,13 +18,13 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print case1
|
||||
// gdb-check:$1 = {{Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {Case1, a = 0, b = 2088533116, c = 2088533116}, {Case1, a = 0, b = 8970181431921507452}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {RUST$ENUM$DISR = Case1, a = 0, b = 2088533116, c = 2088533116}, {RUST$ENUM$DISR = Case1, a = 0, b = 8970181431921507452}}
|
||||
|
||||
// gdb-command:print case2
|
||||
// gdb-check:$2 = {{Case2, a = 0, b = 4369, c = 4369, d = 4369, e = 4369}, {Case2, a = 0, b = 286331153, c = 286331153}, {Case2, a = 0, b = 1229782938247303441}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = Case2, a = 0, b = 4369, c = 4369, d = 4369, e = 4369}, {RUST$ENUM$DISR = Case2, a = 0, b = 286331153, c = 286331153}, {RUST$ENUM$DISR = Case2, a = 0, b = 1229782938247303441}}
|
||||
|
||||
// gdb-command:print case3
|
||||
// gdb-check:$3 = {{Case3, a = 0, b = 22873, c = 22873, d = 22873, e = 22873}, {Case3, a = 0, b = 1499027801, c = 1499027801}, {Case3, a = 0, b = 6438275382588823897}}
|
||||
// gdb-check:$3 = {{RUST$ENUM$DISR = Case3, a = 0, b = 22873, c = 22873, d = 22873, e = 22873}, {RUST$ENUM$DISR = Case3, a = 0, b = 1499027801, c = 1499027801}, {RUST$ENUM$DISR = Case3, a = 0, b = 6438275382588823897}}
|
||||
|
||||
// gdb-command:print univariant
|
||||
// gdb-check:$4 = {{a = -1}}
|
||||
|
|
|
@ -21,13 +21,13 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print case1
|
||||
// gdb-check:$1 = {{Case1, 0, 31868, 31868, 31868, 31868}, {Case1, 0, 2088533116, 2088533116}, {Case1, 0, 8970181431921507452}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Case1, 0, 31868, 31868, 31868, 31868}, {RUST$ENUM$DISR = Case1, 0, 2088533116, 2088533116}, {RUST$ENUM$DISR = Case1, 0, 8970181431921507452}}
|
||||
|
||||
// gdb-command:print case2
|
||||
// gdb-check:$2 = {{Case2, 0, 4369, 4369, 4369, 4369}, {Case2, 0, 286331153, 286331153}, {Case2, 0, 1229782938247303441}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = Case2, 0, 4369, 4369, 4369, 4369}, {RUST$ENUM$DISR = Case2, 0, 286331153, 286331153}, {RUST$ENUM$DISR = Case2, 0, 1229782938247303441}}
|
||||
|
||||
// gdb-command:print case3
|
||||
// gdb-check:$3 = {{Case3, 0, 22873, 22873, 22873, 22873}, {Case3, 0, 1499027801, 1499027801}, {Case3, 0, 6438275382588823897}}
|
||||
// gdb-check:$3 = {{RUST$ENUM$DISR = Case3, 0, 22873, 22873, 22873, 22873}, {RUST$ENUM$DISR = Case3, 0, 1499027801, 1499027801}, {RUST$ENUM$DISR = Case3, 0, 6438275382588823897}}
|
||||
|
||||
// gdb-command:print univariant
|
||||
// gdb-check:$4 = {{-1}}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// ignore-android: FIXME(#10381)
|
||||
|
||||
// compile-flags:-g
|
||||
|
@ -20,7 +21,7 @@
|
|||
// STACK BY REF
|
||||
// gdb-command:finish
|
||||
// gdb-command:print *self
|
||||
// gdb-check:$1 = {{Variant2, [...]}, {Variant2, 117901063}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Variant2, [...]}, {RUST$ENUM$DISR = Variant2, 117901063}}
|
||||
// gdb-command:print arg1
|
||||
// gdb-check:$2 = -1
|
||||
// gdb-command:print arg2
|
||||
|
@ -30,7 +31,7 @@
|
|||
// STACK BY VAL
|
||||
// gdb-command:finish
|
||||
// gdb-command:print self
|
||||
// gdb-check:$4 = {{Variant2, [...]}, {Variant2, 117901063}}
|
||||
// gdb-check:$4 = {{RUST$ENUM$DISR = Variant2, [...]}, {RUST$ENUM$DISR = Variant2, 117901063}}
|
||||
// gdb-command:print arg1
|
||||
// gdb-check:$5 = -3
|
||||
// gdb-command:print arg2
|
||||
|
@ -40,7 +41,7 @@
|
|||
// OWNED BY REF
|
||||
// gdb-command:finish
|
||||
// gdb-command:print *self
|
||||
// gdb-check:$7 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
|
||||
// gdb-check:$7 = {{RUST$ENUM$DISR = Variant1, x = 1799, y = 1799}, {RUST$ENUM$DISR = Variant1, [...]}}
|
||||
// gdb-command:print arg1
|
||||
// gdb-check:$8 = -5
|
||||
// gdb-command:print arg2
|
||||
|
@ -50,7 +51,7 @@
|
|||
// OWNED BY VAL
|
||||
// gdb-command:finish
|
||||
// gdb-command:print self
|
||||
// gdb-check:$10 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
|
||||
// gdb-check:$10 = {{RUST$ENUM$DISR = Variant1, x = 1799, y = 1799}, {RUST$ENUM$DISR = Variant1, [...]}}
|
||||
// gdb-command:print arg1
|
||||
// gdb-check:$11 = -7
|
||||
// gdb-command:print arg2
|
||||
|
@ -60,7 +61,7 @@
|
|||
// OWNED MOVED
|
||||
// gdb-command:finish
|
||||
// gdb-command:print *self
|
||||
// gdb-check:$13 = {{Variant1, x = 1799, y = 1799}, {Variant1, [...]}}
|
||||
// gdb-check:$13 = {{RUST$ENUM$DISR = Variant1, x = 1799, y = 1799}, {RUST$ENUM$DISR = Variant1, [...]}}
|
||||
// gdb-command:print arg1
|
||||
// gdb-check:$14 = -9
|
||||
// gdb-command:print arg2
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print case1
|
||||
// gdb-check:$1 = {{Case1, 0, {x = 2088533116, y = 2088533116, z = 31868}}, {Case1, 0, 8970181431921507452, 31868}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Case1, 0, {x = 2088533116, y = 2088533116, z = 31868}}, {RUST$ENUM$DISR = Case1, 0, 8970181431921507452, 31868}}
|
||||
|
||||
// gdb-command:print case2
|
||||
// gdb-check:$2 = {{Case2, 0, {x = 286331153, y = 286331153, z = 4369}}, {Case2, 0, 1229782938247303441, 4369}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = Case2, 0, {x = 286331153, y = 286331153, z = 4369}}, {RUST$ENUM$DISR = Case2, 0, 1229782938247303441, 4369}}
|
||||
|
||||
// gdb-command:print univariant
|
||||
// gdb-check:$3 = {{{x = 123, y = 456, z = 789}}}
|
||||
|
|
|
@ -21,13 +21,13 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print case1
|
||||
// gdb-check:$1 = {{Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {Case1, a = 0, b = 2088533116, c = 2088533116}, {Case1, a = 0, b = 8970181431921507452}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Case1, a = 0, b = 31868, c = 31868, d = 31868, e = 31868}, {RUST$ENUM$DISR = Case1, a = 0, b = 2088533116, c = 2088533116}, {RUST$ENUM$DISR = Case1, a = 0, b = 8970181431921507452}}
|
||||
|
||||
// gdb-command:print case2
|
||||
// gdb-check:$2 = {{Case2, a = 0, b = 4369, c = 4369, d = 4369, e = 4369}, {Case2, a = 0, b = 286331153, c = 286331153}, {Case2, a = 0, b = 1229782938247303441}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = Case2, a = 0, b = 4369, c = 4369, d = 4369, e = 4369}, {RUST$ENUM$DISR = Case2, a = 0, b = 286331153, c = 286331153}, {RUST$ENUM$DISR = Case2, a = 0, b = 1229782938247303441}}
|
||||
|
||||
// gdb-command:print case3
|
||||
// gdb-check:$3 = {{Case3, a = 0, b = 22873, c = 22873, d = 22873, e = 22873}, {Case3, a = 0, b = 1499027801, c = 1499027801}, {Case3, a = 0, b = 6438275382588823897}}
|
||||
// gdb-check:$3 = {{RUST$ENUM$DISR = Case3, a = 0, b = 22873, c = 22873, d = 22873, e = 22873}, {RUST$ENUM$DISR = Case3, a = 0, b = 1499027801, c = 1499027801}, {RUST$ENUM$DISR = Case3, a = 0, b = 6438275382588823897}}
|
||||
|
||||
// gdb-command:print univariant
|
||||
// gdb-check:$4 = {{a = -1}}
|
||||
|
|
|
@ -21,13 +21,13 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print case1
|
||||
// gdb-check:$1 = {{Case1, 0, 31868, 31868, 31868, 31868}, {Case1, 0, 2088533116, 2088533116}, {Case1, 0, 8970181431921507452}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = Case1, 0, 31868, 31868, 31868, 31868}, {RUST$ENUM$DISR = Case1, 0, 2088533116, 2088533116}, {RUST$ENUM$DISR = Case1, 0, 8970181431921507452}}
|
||||
|
||||
// gdb-command:print case2
|
||||
// gdb-check:$2 = {{Case2, 0, 4369, 4369, 4369, 4369}, {Case2, 0, 286331153, 286331153}, {Case2, 0, 1229782938247303441}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = Case2, 0, 4369, 4369, 4369, 4369}, {RUST$ENUM$DISR = Case2, 0, 286331153, 286331153}, {RUST$ENUM$DISR = Case2, 0, 1229782938247303441}}
|
||||
|
||||
// gdb-command:print case3
|
||||
// gdb-check:$3 = {{Case3, 0, 22873, 22873, 22873, 22873}, {Case3, 0, 1499027801, 1499027801}, {Case3, 0, 6438275382588823897}}
|
||||
// gdb-check:$3 = {{RUST$ENUM$DISR = Case3, 0, 22873, 22873, 22873, 22873}, {RUST$ENUM$DISR = Case3, 0, 1499027801, 1499027801}, {RUST$ENUM$DISR = Case3, 0, 6438275382588823897}}
|
||||
|
||||
// gdb-command:print univariant
|
||||
// gdb-check:$4 = {{-1}}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// ignore-tidy-linelength
|
||||
// ignore-android: FIXME(#10381)
|
||||
|
||||
// compile-flags:-g
|
||||
|
@ -19,10 +20,10 @@
|
|||
// gdb-command:finish
|
||||
|
||||
// gdb-command:print *the_a
|
||||
// gdb-check:$1 = {{TheA, x = 0, y = 8970181431921507452}, {TheA, 0, 2088533116, 2088533116}}
|
||||
// gdb-check:$1 = {{RUST$ENUM$DISR = TheA, x = 0, y = 8970181431921507452}, {RUST$ENUM$DISR = TheA, 0, 2088533116, 2088533116}}
|
||||
|
||||
// gdb-command:print *the_b
|
||||
// gdb-check:$2 = {{TheB, x = 0, y = 1229782938247303441}, {TheB, 0, 286331153, 286331153}}
|
||||
// gdb-check:$2 = {{RUST$ENUM$DISR = TheB, x = 0, y = 1229782938247303441}, {RUST$ENUM$DISR = TheB, 0, 286331153, 286331153}}
|
||||
|
||||
// gdb-command:print *univariant
|
||||
// gdb-check:$3 = {{123234}}
|
||||
|
|
|
@ -63,21 +63,21 @@
|
|||
// lldb-command:print *owned
|
||||
// lldb-check:[...]$4 = 6
|
||||
// lldb-command:print closure_local
|
||||
// lldb-check:[...]$6 = 8
|
||||
// lldb-check:[...]$5 = 8
|
||||
// lldb-command:continue
|
||||
|
||||
// lldb-command:print variable
|
||||
// lldb-check:[...]$7 = 1
|
||||
// lldb-check:[...]$6 = 1
|
||||
// lldb-command:print constant
|
||||
// lldb-check:[...]$8 = 2
|
||||
// lldb-check:[...]$7 = 2
|
||||
// lldb-command:print a_struct
|
||||
// lldb-check:[...]$9 = Struct { a: -3, b: 4.5, c: 5 }
|
||||
// lldb-check:[...]$8 = Struct { a: -3, b: 4.5, c: 5 }
|
||||
// lldb-command:print *struct_ref
|
||||
// lldb-check:[...]$10 = Struct { a: -3, b: 4.5, c: 5 }
|
||||
// lldb-check:[...]$9 = Struct { a: -3, b: 4.5, c: 5 }
|
||||
// lldb-command:print *owned
|
||||
// lldb-check:[...]$11 = 6
|
||||
// lldb-check:[...]$10 = 6
|
||||
// lldb-command:print closure_local
|
||||
// lldb-check:[...]$13 = 8
|
||||
// lldb-check:[...]$11 = 8
|
||||
// lldb-command:continue
|
||||
|
||||
#![allow(unused_variable)]
|
||||
|
|
Loading…
Add table
Reference in a new issue