@@ -15,9 +15,9 @@ use crate::common::{AsCCharPtr, CodegenCx};
15
15
use crate::debuginfo::metadata::enums::DiscrResult;
16
16
use crate::debuginfo::metadata::type_map::{self, Stub, UniqueTypeId};
17
17
use crate::debuginfo::metadata::{
18
- DINodeCreationResult, NO_GENERICS, NO_SCOPE_METADATA, SmallVec, UNKNOWN_LINE_NUMBER ,
19
- build_field_di_node, file_metadata, file_metadata_from_def_id, size_and_align_of, type_di_node ,
20
- unknown_file_metadata, visibility_di_flags,
18
+ DINodeCreationResult, DW_TAG_const_type, NO_GENERICS, NO_SCOPE_METADATA, SmallVec,
19
+ UNKNOWN_LINE_NUMBER, build_field_di_node, file_metadata, file_metadata_from_def_id,
20
+ size_and_align_of, type_di_node, unknown_file_metadata, visibility_di_flags,
21
21
};
22
22
use crate::debuginfo::utils::DIB;
23
23
use crate::llvm::debuginfo::{DIFile, DIFlags, DIType};
@@ -566,22 +566,39 @@ fn build_variant_struct_wrapper_type_di_node<'ll, 'tcx>(
566
566
None,
567
567
));
568
568
569
- let build_assoc_const =
570
- |name: &str, type_di_node: &'ll DIType, value: u64, align: Align| unsafe {
571
- llvm::LLVMRustDIBuilderCreateStaticMemberType(
572
- DIB(cx),
573
- wrapper_struct_type_di_node,
574
- name.as_c_char_ptr(),
575
- name.len(),
576
- unknown_file_metadata(cx),
577
- UNKNOWN_LINE_NUMBER,
578
- type_di_node,
579
- DIFlags::FlagZero,
580
- Some(cx.const_u64(value)),
581
- align.bits() as u32,
582
- )
569
+ let build_assoc_const = |name: &str,
570
+ type_di_node_: &'ll DIType,
571
+ value: u64,
572
+ align: Align| unsafe {
573
+ // FIXME: Currently we force all DISCR_* values to be u64's as LLDB seems to have
574
+ // problems inspecting other value types. Since DISCR_* is typically only going to be
575
+ // directly inspected via the debugger visualizer - which compares it to the `tag` value
576
+ // (whose type is not modified at all) it shouldn't cause any real problems.
577
+ let (t_di, align) = if name == ASSOC_CONST_DISCR_NAME {
578
+ (type_di_node_, align.bits() as u32)
579
+ } else {
580
+ let ty_u64 = Ty::new_uint(cx.tcx, ty::UintTy::U64);
581
+ (type_di_node(cx, ty_u64), Align::EIGHT.bits() as u32)
583
582
};
584
583
584
+ // must wrap type in a `const` modifier for LLDB to be able to inspect the value of the member
585
+ let field_type =
586
+ llvm::LLVMRustDIBuilderCreateQualifiedType(DIB(cx), DW_TAG_const_type, t_di);
587
+
588
+ llvm::LLVMRustDIBuilderCreateStaticMemberType(
589
+ DIB(cx),
590
+ wrapper_struct_type_di_node,
591
+ name.as_c_char_ptr(),
592
+ name.len(),
593
+ unknown_file_metadata(cx),
594
+ UNKNOWN_LINE_NUMBER,
595
+ field_type,
596
+ DIFlags::FlagZero,
597
+ Some(cx.const_u64(value)),
598
+ align,
599
+ )
600
+ };
601
+
585
602
// We also always have an associated constant for the discriminant value
586
603
// of the variant.
587
604
fields.push(build_assoc_const(
0 commit comments