mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-31 06:22:00 +00:00
fb2d9cdfc5
Summary: I landed a fix last year to enable `DW_TAG_variant_part` encoding in LLDBs (https://reviews.llvm.org/D149213). This PR is a corresponding fix in synthetic formatters to decode that information. This is in no way perfect implementation but at least it improves the status quo. But most types of enums will be visible and debuggable in some way. I've also updated most of the existing tests that touch enums and re-enabled test cases based on LLDB for enums. Test Plan: ran tests `./x test tests/debuginfo/`. Also tested manually in LLDB CLI and LLDB VSCode Other Thoughs A better approach would probably be adopting [formatters from codelldb](https://github.com/vadimcn/codelldb/blob/master/formatters/rust.py). There is some neat hack that hooks up summary provider via synthetic provider which can ultimately fix more display issues for Rust types and enums too. But getting it to work well might take more time that I have right now.
322 lines
13 KiB
Rust
322 lines
13 KiB
Rust
//@ min-lldb-version: 1800
|
|
//@ ignore-gdb
|
|
//@ compile-flags:-g
|
|
|
|
// === LLDB TESTS ==================================================================================
|
|
// lldb-command:run
|
|
|
|
// lldb-command:v a
|
|
// lldbg-check:(core::option::Option<msvc_pretty_enums::CStyleEnum>) a = { value = { 0 = Low } }
|
|
|
|
// lldb-command:v b
|
|
// lldbg-check:(core::option::Option<msvc_pretty_enums::CStyleEnum>) b = { value = $discr$ = '\x01' }
|
|
|
|
// lldb-command:v c
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) c = { value = $discr$ = '\x11' }
|
|
|
|
// lldb-command:v d
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) d = { value = { my_data = High } }
|
|
|
|
// lldb-command:v e
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutEnum) e = { value = $discr$ = '\x13' }
|
|
|
|
// lldb-command:v h
|
|
// lldbg-check:(core::option::Option<u32>) h = { value = { 0 = 12 } $discr$ = 1 }
|
|
|
|
// lldb-command:v i
|
|
// lldbg-check:(core::option::Option<u32>) i = { value = $discr$ = 0 }
|
|
|
|
// lldb-command:v j
|
|
// lldbg-check:(msvc_pretty_enums::CStyleEnum) j = High
|
|
|
|
// lldb-command:v k
|
|
// lldbg-check:(core::option::Option<alloc::string::String>) k = { value = { 0 = "IAMA optional string!" { vec = size=21 { [0] = 'I' [1] = 'A' [2] = 'M' [3] = 'A' [4] = ' ' [5] = 'o' [6] = 'p' [7] = 't' [8] = 'i' [9] = 'o' [10] = 'n' [11] = 'a' [12] = 'l' [13] = ' ' [14] = 's' [15] = 't' [16] = 'r' [17] = 'i' [18] = 'n' [19] = 'g' [20] = '!' } } } }
|
|
|
|
// lldb-command:v l
|
|
// lldbg-check:(core::result::Result<u32, msvc_pretty_enums::Empty>) l = { value = { 0 = {} } }
|
|
|
|
// lldb-command:v niche128_some
|
|
// lldbg-check:(core::option::Option<core::num::nonzero::NonZero<i128>>) niche128_some = { value = $discr$ = 123456 }
|
|
|
|
// lldb-command:v niche128_none
|
|
// lldbg-check:(core::option::Option<core::num::nonzero::NonZero<i128>>) niche128_none = { value = $discr$ = 0 }
|
|
|
|
// lldb-command:v wrapping_niche128_untagged
|
|
// lldbg-check:(msvc_pretty_enums::Wrapping128Niche) wrapping_niche128_untagged = { value = { 0 = { 0 = 340282366920938463463374607431768211454 } } }
|
|
|
|
// lldb-command:v wrapping_niche128_none1
|
|
// lldbg-check:(msvc_pretty_enums::Wrapping128Niche) wrapping_niche128_none1 = { value = { 0 = { 0 = 2 } } }
|
|
|
|
// lldb-command:v direct_tag_128_a
|
|
// lldbg-check:(msvc_pretty_enums::DirectTag128) direct_tag_128_a = { value = { 0 = 42 } $discr$ = 0 }
|
|
|
|
// lldb-command:v direct_tag_128_b
|
|
// lldbg-check:(msvc_pretty_enums::DirectTag128) direct_tag_128_b = { value = { 0 = 137 } $discr$ = 1 }
|
|
|
|
// &u32 is incorrectly formatted and LLDB thinks it's a char* so skipping niche_w_fields_1_some
|
|
|
|
// lldb-command:v niche_w_fields_1_none
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields1) niche_w_fields_1_none = { value = { 0 = 99 } $discr$ = 1 }
|
|
|
|
// lldb-command:v niche_w_fields_2_some
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields2) niche_w_fields_2_some = { value = { 0 = 800 { __0 = { 0 = 800 } } 1 = 900 } $discr$ = 0 }
|
|
|
|
// lldb-command:v niche_w_fields_3_some
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields3) niche_w_fields_3_some = { value = { 0 = '\x89' 1 = true } }
|
|
|
|
// lldb-command:v niche_w_fields_3_niche3
|
|
// lldbg-check:(msvc_pretty_enums::NicheLayoutWithFields3) niche_w_fields_3_niche3 = { value = { 0 = '"' } $discr$ = '\x04' }
|
|
|
|
// lldb-command:v arbitrary_discr1
|
|
// lldbg-check:(msvc_pretty_enums::ArbitraryDiscr) arbitrary_discr1 = { value = { 0 = 1234 } $discr$ = 1000 }
|
|
|
|
// lldb-command:v arbitrary_discr2
|
|
// lldbg-check:(msvc_pretty_enums::ArbitraryDiscr) arbitrary_discr2 = { value = { 0 = 5678 } $discr$ = 5000000 }
|
|
|
|
// === CDB TESTS ==================================================================================
|
|
|
|
// cdb-command: g
|
|
//
|
|
// cdb-command: dx a
|
|
// cdb-check:a : Some [Type: enum2$<core::option::Option<msvc_pretty_enums::CStyleEnum> >]
|
|
// cdb-check: [+0x000] __0 : Low (0x2) [Type: msvc_pretty_enums::CStyleEnum]
|
|
//
|
|
// cdb-command: dx b
|
|
// cdb-check:b : None [Type: enum2$<core::option::Option<msvc_pretty_enums::CStyleEnum> >]
|
|
//
|
|
// cdb-command: dx c
|
|
// cdb-check:c : Tag1 [Type: enum2$<msvc_pretty_enums::NicheLayoutEnum>]
|
|
//
|
|
// cdb-command: dx d
|
|
// cdb-check:d : Data [Type: enum2$<msvc_pretty_enums::NicheLayoutEnum>]
|
|
// cdb-check: [+0x000] my_data : High (0x10) [Type: msvc_pretty_enums::CStyleEnum]
|
|
//
|
|
// cdb-command: dx e
|
|
// cdb-check:e : Tag2 [Type: enum2$<msvc_pretty_enums::NicheLayoutEnum>]
|
|
//
|
|
// cdb-command: dx f
|
|
// cdb-check:f : Some [Type: enum2$<core::option::Option<ref$<u32> > >]
|
|
// cdb-check: [+0x000] __0 : 0x[...] : 0x1 [Type: unsigned int *]
|
|
//
|
|
// cdb-command: dx g
|
|
// cdb-check:g : None [Type: enum2$<core::option::Option<ref$<u32> > >]
|
|
//
|
|
// cdb-command: dx h
|
|
// cdb-check:h : Some [Type: enum2$<core::option::Option<u32> >]
|
|
// cdb-check: [+0x004] __0 : 0xc [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx i
|
|
// cdb-check:i : None [Type: enum2$<core::option::Option<u32> >]
|
|
//
|
|
// cdb-command: dx j
|
|
// cdb-check:j : High (0x10) [Type: msvc_pretty_enums::CStyleEnum]
|
|
//
|
|
// cdb-command: dx k
|
|
// cdb-check:k : Some [Type: enum2$<core::option::Option<alloc::string::String> >]
|
|
// cdb-check: [+0x000] __0 : "IAMA optional string!" [Type: alloc::string::String]
|
|
//
|
|
// cdb-command: dx l
|
|
// cdb-check:l : Ok [Type: enum2$<core::result::Result<u32,enum2$<msvc_pretty_enums::Empty> > >]
|
|
// cdb-check: [+0x000] __0 : 0x2a [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx niche128_some
|
|
// cdb-check: niche128_some : Some [Type: enum2$<core::option::Option<core::num::nonzero::NonZero<i128> > >]
|
|
// Note: we can't actually read the value of the field because CDB cannot handle 128 bit integers.
|
|
// cdb-check: [+0x000] __0 [...] [Type: core::num::nonzero::NonZero<i128>]
|
|
//
|
|
// cdb-command: dx niche128_none
|
|
// cdb-check: niche128_none : None [Type: enum2$<core::option::Option<core::num::nonzero::NonZero<i128> > >]
|
|
//
|
|
// cdb-command: dx wrapping_niche128_untagged
|
|
// cdb-check: wrapping_niche128_untagged : X [Type: enum2$<msvc_pretty_enums::Wrapping128Niche>]
|
|
// cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128]
|
|
//
|
|
// cdb-command: dx wrapping_niche128_none1
|
|
// cdb-check: wrapping_niche128_none1 : Y [Type: enum2$<msvc_pretty_enums::Wrapping128Niche>]
|
|
// cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128]
|
|
//
|
|
// cdb-command: dx wrapping_niche128_none2
|
|
// cdb-check: wrapping_niche128_none2 : Z [Type: enum2$<msvc_pretty_enums::Wrapping128Niche>]
|
|
// cdb-check: [+0x[...]] __0 [Type: msvc_pretty_enums::Wrapping128]
|
|
//
|
|
// cdb-command: dx direct_tag_128_a,d
|
|
// cdb-check: direct_tag_128_a,d : A [Type: enum2$<msvc_pretty_enums::DirectTag128>]
|
|
// cdb-check: [+0x[...]] __0 : 42 [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx direct_tag_128_b,d
|
|
// cdb-check: direct_tag_128_b,d : B [Type: enum2$<msvc_pretty_enums::DirectTag128>]
|
|
// cdb-check: [+0x[...]] __0 : 137 [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx niche_w_fields_1_some,d
|
|
// cdb-check: niche_w_fields_1_some,d : A [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields1>]
|
|
// cdb-check: [+0x[...]] __0 : 0x[...] : 77 [Type: unsigned char *]
|
|
// cdb-check: [+0x[...]] __1 : 7 [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx niche_w_fields_1_none,d
|
|
// cdb-check: niche_w_fields_1_none,d : B [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields1>]
|
|
// cdb-check: [+0x[...]] __0 : 99 [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx niche_w_fields_2_some,d
|
|
// cdb-check: niche_w_fields_2_some,d : A [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields2>]
|
|
// cdb-check: [+0x[...]] __0 : 800 [Type: core::num::nonzero::NonZero<u32>]
|
|
// cdb-check: [+0x[...]] __1 : 900 [Type: unsigned __int64]
|
|
//
|
|
// cdb-command: dx niche_w_fields_2_none,d
|
|
// cdb-check: niche_w_fields_2_none,d : B [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields2>]
|
|
// cdb-check: [+0x[...]] __0 : 1000 [Type: unsigned __int64]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_some,d
|
|
// cdb-check: niche_w_fields_3_some,d : A [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
// cdb-check: [+0x[...]] __0 : 137 [Type: unsigned char]
|
|
// cdb-check: [+0x[...]] __1 : true [Type: bool]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_niche1,d
|
|
// cdb-check: niche_w_fields_3_niche1,d : B [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
// cdb-check: [+0x[...]] __0 : 12 [Type: unsigned char]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_niche2,d
|
|
// cdb-check: niche_w_fields_3_niche2,d : C [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
// cdb-check: [+0x[...]] __0 : false [Type: bool]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_niche3,d
|
|
// cdb-check: niche_w_fields_3_niche3,d : D [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
// cdb-check: [+0x[...]] __0 : 34 [Type: unsigned char]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_niche4,d
|
|
// cdb-check: niche_w_fields_3_niche4,d : E [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
// cdb-check: [+0x[...]] __0 : 56 [Type: unsigned char]
|
|
//
|
|
// cdb-command: dx niche_w_fields_3_niche5,d
|
|
// cdb-check: niche_w_fields_3_niche5,d : F [Type: enum2$<msvc_pretty_enums::NicheLayoutWithFields3>]
|
|
//
|
|
// cdb-command: dx -r3 niche_w_fields_std_result_ok,d
|
|
// cdb-check: niche_w_fields_std_result_ok,d : Ok [Type: enum2$<core::result::Result<alloc::boxed::Box<slice2$<u8>,alloc::alloc::Global>,u64> >]
|
|
// cdb-check: [+0x[...]] __0 [Type: alloc::boxed::Box<slice2$<u8>,alloc::alloc::Global>]
|
|
// cdb-check: [+0x[...]] data_ptr : [...]
|
|
// cdb-check: [+0x[...]] length : 3 [...]
|
|
//
|
|
// cdb-command: dx -r3 niche_w_fields_std_result_err,d
|
|
// cdb-check: niche_w_fields_std_result_err,d : Err [Type: enum2$<core::result::Result<alloc::boxed::Box<slice2$<u8>,alloc::alloc::Global>,u64> >]
|
|
// cdb-check: [+0x[...]] __0 : 789 [Type: unsigned __int64]
|
|
//
|
|
// cdb-command: dx -r2 arbitrary_discr1,d
|
|
// cdb-check: arbitrary_discr1,d : Abc [Type: enum2$<msvc_pretty_enums::ArbitraryDiscr>]
|
|
// cdb-check: [+0x[...]] __0 : 1234 [Type: unsigned int]
|
|
//
|
|
// cdb-command: dx -r2 arbitrary_discr2,d
|
|
// cdb-check: arbitrary_discr2,d : Def [Type: enum2$<msvc_pretty_enums::ArbitraryDiscr>]
|
|
// cdb-check: [+0x[...]] __0 : 5678 [Type: unsigned int]
|
|
#![feature(rustc_attrs)]
|
|
#![feature(repr128)]
|
|
#![feature(arbitrary_enum_discriminant)]
|
|
|
|
use std::num::NonZero;
|
|
|
|
pub enum CStyleEnum {
|
|
Low = 2,
|
|
High = 16,
|
|
}
|
|
|
|
pub enum NicheLayoutEnum {
|
|
Tag1,
|
|
Data { my_data: CStyleEnum },
|
|
Tag2,
|
|
}
|
|
|
|
pub enum Empty {}
|
|
|
|
// The following three types will use a niche layout once
|
|
// https://github.com/rust-lang/rust/pull/94075 is merged:
|
|
enum NicheLayoutWithFields1<'a> {
|
|
A(&'a u8, u32),
|
|
B(u32),
|
|
}
|
|
|
|
enum NicheLayoutWithFields2 {
|
|
A(NonZero<u32>, u64),
|
|
B(u64),
|
|
}
|
|
|
|
enum NicheLayoutWithFields3 {
|
|
A(u8, bool),
|
|
B(u8),
|
|
C(bool),
|
|
D(u8),
|
|
E(u8),
|
|
F,
|
|
}
|
|
|
|
#[rustc_layout_scalar_valid_range_start(340282366920938463463374607431768211454)]
|
|
#[rustc_layout_scalar_valid_range_end(1)]
|
|
#[repr(transparent)]
|
|
struct Wrapping128(u128);
|
|
|
|
// #[rustc_layout(debug)]
|
|
enum Wrapping128Niche {
|
|
X(Wrapping128),
|
|
Y,
|
|
Z,
|
|
}
|
|
|
|
#[repr(i128)]
|
|
enum DirectTag128 {
|
|
A(u32),
|
|
B(u32),
|
|
}
|
|
|
|
#[repr(u32)]
|
|
enum ArbitraryDiscr {
|
|
Abc(u32) = 1000,
|
|
Def(u32) = 5000_000,
|
|
}
|
|
|
|
fn main() {
|
|
let a = Some(CStyleEnum::Low);
|
|
let b = Option::<CStyleEnum>::None;
|
|
let c = NicheLayoutEnum::Tag1;
|
|
let d = NicheLayoutEnum::Data { my_data: CStyleEnum::High };
|
|
let e = NicheLayoutEnum::Tag2;
|
|
let f = Some(&1u32);
|
|
let g = Option::<&'static u32>::None;
|
|
let h = Some(12u32);
|
|
let i = Option::<u32>::None;
|
|
let j = CStyleEnum::High;
|
|
let k = Some("IAMA optional string!".to_string());
|
|
let l = Result::<u32, Empty>::Ok(42);
|
|
let niche128_some = NonZero::new(123456i128);
|
|
let niche128_none: Option<NonZero<i128>> = None;
|
|
|
|
let wrapping_niche128_untagged =
|
|
unsafe { Wrapping128Niche::X(Wrapping128(340282366920938463463374607431768211454)) };
|
|
let wrapping_niche128_none1 = Wrapping128Niche::Y;
|
|
let wrapping_niche128_none2 = Wrapping128Niche::Z;
|
|
|
|
let direct_tag_128_a = DirectTag128::A(42);
|
|
let direct_tag_128_b = DirectTag128::B(137);
|
|
|
|
let niche_w_fields_1_some = NicheLayoutWithFields1::A(&77, 7);
|
|
let niche_w_fields_1_none = NicheLayoutWithFields1::B(99);
|
|
|
|
let niche_w_fields_2_some = NicheLayoutWithFields2::A(NonZero::new(800).unwrap(), 900);
|
|
let niche_w_fields_2_none = NicheLayoutWithFields2::B(1000);
|
|
|
|
let niche_w_fields_3_some = NicheLayoutWithFields3::A(137, true);
|
|
let niche_w_fields_3_niche1 = NicheLayoutWithFields3::B(12);
|
|
let niche_w_fields_3_niche2 = NicheLayoutWithFields3::C(false);
|
|
let niche_w_fields_3_niche3 = NicheLayoutWithFields3::D(34);
|
|
let niche_w_fields_3_niche4 = NicheLayoutWithFields3::E(56);
|
|
let niche_w_fields_3_niche5 = NicheLayoutWithFields3::F;
|
|
|
|
let niche_w_fields_std_result_ok: Result<Box<[u8]>, u64> = Ok(vec![1, 2, 3].into());
|
|
let niche_w_fields_std_result_err: Result<Box<[u8]>, u64> = Err(789);
|
|
|
|
let arbitrary_discr1 = ArbitraryDiscr::Abc(1234);
|
|
let arbitrary_discr2 = ArbitraryDiscr::Def(5678);
|
|
|
|
zzz(); // #break
|
|
}
|
|
|
|
fn zzz() {
|
|
()
|
|
}
|