1; RUN: llc < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s 2; RUN: llc < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s 3 4; RUN: llc --try-experimental-debuginfo-iterators < %s -filetype=obj | llvm-readobj - --codeview | FileCheck %s 5; RUN: llc --try-experimental-debuginfo-iterators < %s | llvm-mc -filetype=obj --triple=x86_64-windows | llvm-readobj - --codeview | FileCheck %s 6; 7; Command to generate function-options.ll 8; $ clang++ function-options.cpp -S -emit-llvm -g -gcodeview -o function-options.ll 9; 10; #define DEFINE_FUNCTION(T) \ 11; T Func_##T(T &arg) { return arg; } 12; 13; class AClass {}; 14; DEFINE_FUNCTION(AClass); // Expect: FO = None 15; 16; class BClass { 17; private: 18; explicit BClass(); // Expect ctor: FO = Constructor 19; }; 20; DEFINE_FUNCTION(BClass); // Expect: FO = CxxReturnUdt 21; 22; class C1Class { 23; public: 24; C1Class() = default; // Note: Clang generates one defaulted ctor (FO = None) while MSVC doesn't. 25; }; 26; DEFINE_FUNCTION(C1Class); // Expect: FO = None 27; 28; class C2Class { // Note: MSVC-specific dtor, i.e. __vecDelDtor won't be verified in this case. 29; public: 30; ~C2Class() {} // Expect ~C2Class: FO = None 31; }; 32; DEFINE_FUNCTION(C2Class); // Expect: FO = CxxReturnUdt 33; 34; class DClass : public BClass {}; // Note: MSVC yields one compiler-generated ctor for DClass while clang doesn't. 35; DEFINE_FUNCTION(DClass); // Expect: FO = CxxReturnUdt 36; 37; class FClass { 38; static int x; 39; AClass Member_AClass(AClass &); 40; BClass Member_BClass(BClass &); 41; }; 42; DEFINE_FUNCTION(FClass); // Expect FO = None 43; 44; struct AStruct {}; 45; DEFINE_FUNCTION(AStruct); // Expect FO = None 46; 47; struct BStruct { BStruct(); }; // Expect ctor: FO = Constructor 48; DEFINE_FUNCTION(BStruct); // Expect FO = CxxReturnUdt 49; 50; union AUnion {}; 51; DEFINE_FUNCTION(AUnion); // Expect FO = None 52; 53; union BUnion { BUnion() = default; }; // Note: Clang generates one defaulted ctor (FO = None) while MSVC does not. 54; DEFINE_FUNCTION(BUnion); // Expect FO = None 55 56 57; CHECK: Format: COFF-x86-64 58; CHECK: Arch: x86_64 59; CHECK: AddressSize: 64bit 60; CHECK: CodeViewTypes [ 61; CHECK: Section: .debug$T ({{.*}}) 62; CHECK: Magic: 0x4 63; CHECK: Procedure ([[SP_A:.*]]) { 64; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 65; CHECK: ReturnType: AClass ({{.*}}) 66; CHECK: CallingConvention: NearC (0x0) 67; CHECK: FunctionOptions [ (0x0) 68; CHECK: ] 69; CHECK: NumParameters: 1 70; CHECK: ArgListType: (AClass&) ({{.*}}) 71; CHECK: } 72; CHECK: FuncId ({{.*}}) { 73; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 74; CHECK: ParentScope: 0x0 75; CHECK: FunctionType: AClass (AClass&) ([[SP_A]]) 76; CHECK: Name: Func_AClass 77; CHECK: } 78; CHECK: Procedure ([[SP_B:.*]]) { 79; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 80; CHECK: ReturnType: BClass ({{.*}}) 81; CHECK: CallingConvention: NearC (0x0) 82; CHECK: FunctionOptions [ (0x1) 83; CHECK: CxxReturnUdt (0x1) 84; CHECK: ] 85; CHECK: NumParameters: 1 86; CHECK: ArgListType: (BClass&) ({{.*}}) 87; CHECK: } 88; CHECK: MemberFunction ([[CTOR_B:.*]]) { 89; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 90; CHECK: ReturnType: void (0x3) 91; CHECK: ClassType: BClass ({{.*}}) 92; CHECK: ThisType: BClass* {{.*}} 93; CHECK: CallingConvention: NearC (0x0) 94; CHECK: FunctionOptions [ (0x2) 95; CHECK: Constructor (0x2) 96; CHECK: ] 97; CHECK: NumParameters: 0 98; CHECK: ArgListType: () ({{.*}}) 99; CHECK: ThisAdjustment: 0 100; CHECK: } 101; CHECK: FieldList ({{.*}}) { 102; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 103; CHECK: OneMethod { 104; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 105; CHECK: AccessSpecifier: Private (0x1) 106; CHECK: Type: void BClass::() ([[CTOR_B]]) 107; CHECK: Name: BClass 108; CHECK: } 109; CHECK: } 110; CHECK: FuncId ({{.*}}) { 111; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 112; CHECK: ParentScope: 0x0 113; CHECK: FunctionType: BClass (BClass&) ([[SP_B]]) 114; CHECK: Name: Func_BClass 115; CHECK: } 116; CHECK: Procedure ([[SP_C1:.*]]) { 117; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 118; CHECK: ReturnType: C1Class ({{.*}}) 119; CHECK: CallingConvention: NearC (0x0) 120; CHECK: FunctionOptions [ (0x0) 121; CHECK: ] 122; CHECK: NumParameters: 1 123; CHECK: ArgListType: (C1Class&) ({{.*}}) 124; CHECK: } 125; CHECK: MemberFunction ([[CTOR_C1:.*]]) { 126; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 127; CHECK: ReturnType: void (0x3) 128; CHECK: ClassType: C1Class ({{.*}}) 129; CHECK: ThisType: C1Class* {{.*}} 130; CHECK: CallingConvention: NearC (0x0) 131; CHECK: FunctionOptions [ (0x0) 132; CHECK: ] 133; CHECK: NumParameters: 0 134; CHECK: ArgListType: () ({{.*}}) 135; CHECK: ThisAdjustment: 0 136; CHECK: } 137; CHECK: FieldList ({{.*}}) { 138; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 139; CHECK: OneMethod { 140; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 141; CHECK: AccessSpecifier: Public (0x3) 142; CHECK: Type: void C1Class::() ([[CTOR_C1]]) 143; CHECK: Name: C1Class 144; CHECK: } 145; CHECK: } 146; CHECK: FuncId ({{.*}}) { 147; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 148; CHECK: ParentScope: 0x0 149; CHECK: FunctionType: C1Class (C1Class&) ([[SP_C1]]) 150; CHECK: Name: Func_C1Class 151; CHECK: } 152; CHECK: Procedure ([[SP_C2:.*]]) { 153; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 154; CHECK: ReturnType: C2Class ({{.*}}) 155; CHECK: CallingConvention: NearC (0x0) 156; CHECK: FunctionOptions [ (0x1) 157; CHECK: CxxReturnUdt (0x1) 158; CHECK: ] 159; CHECK: NumParameters: 1 160; CHECK: ArgListType: (C2Class&) ({{.*}}) 161; CHECK: } 162; CHECK: MemberFunction ([[CTOR_C2:.*]]) { 163; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 164; CHECK: ReturnType: void (0x3) 165; CHECK: ClassType: C2Class ({{.*}}) 166; CHECK: ThisType: C2Class* {{.*}} 167; CHECK: CallingConvention: NearC (0x0) 168; CHECK: FunctionOptions [ (0x0) 169; CHECK: ] 170; CHECK: NumParameters: 0 171; CHECK: ArgListType: () ({{.*}}) 172; CHECK: ThisAdjustment: 0 173; CHECK: } 174; CHECK: FieldList ({{.*}}) { 175; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 176; CHECK: OneMethod { 177; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 178; CHECK: AccessSpecifier: Public (0x3) 179; CHECK: Type: void C2Class::() ([[CTOR_C2]]) 180; CHECK: Name: ~C2Class 181; CHECK: } 182; CHECK: } 183; CHECK: FuncId ({{.*}}) { 184; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 185; CHECK: ParentScope: 0x0 186; CHECK: FunctionType: C2Class (C2Class&) ([[SP_C2]]) 187; CHECK: Name: Func_C2Class 188; CHECK: } 189; CHECK: Procedure ([[SP_D:.*]]) { 190; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 191; CHECK: ReturnType: DClass ({{.*}}) 192; CHECK: CallingConvention: NearC (0x0) 193; CHECK: FunctionOptions [ (0x1) 194; CHECK: CxxReturnUdt (0x1) 195; CHECK: ] 196; CHECK: NumParameters: 1 197; CHECK: ArgListType: (DClass&) ({{.*}}) 198; CHECK: } 199; CHECK: FieldList ({{.*}}) { 200; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 201; CHECK: BaseClass { 202; CHECK: TypeLeafKind: LF_BCLASS (0x1400) 203; CHECK: AccessSpecifier: Public (0x3) 204; CHECK: BaseType: BClass ({{.*}}) 205; CHECK: BaseOffset: 0x0 206; CHECK: } 207; CHECK: } 208; CHECK: FuncId ({{.*}}) { 209; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 210; CHECK: ParentScope: 0x0 211; CHECK: FunctionType: DClass (DClass&) ([[SP_D]]) 212; CHECK: Name: Func_DClass 213; CHECK: } 214; CHECK: Procedure ([[SP_F:.*]]) { 215; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 216; CHECK: ReturnType: FClass ({{.*}}) 217; CHECK: CallingConvention: NearC (0x0) 218; CHECK: FunctionOptions [ (0x0) 219; CHECK: ] 220; CHECK: NumParameters: 1 221; CHECK: ArgListType: (FClass&) ({{.*}}) 222; CHECK: } 223; CHECK: MemberFunction ([[MF_A:.*]]) { 224; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 225; CHECK: ReturnType: AClass ({{.*}}) 226; CHECK: ClassType: FClass ({{.*}}) 227; CHECK: ThisType: FClass* {{.*}} 228; CHECK: CallingConvention: NearC (0x0) 229; CHECK: FunctionOptions [ (0x1) 230; CHECK: CxxReturnUdt (0x1) 231; CHECK: ] 232; CHECK: NumParameters: 1 233; CHECK: ArgListType: (AClass&) ({{.*}}) 234; CHECK: ThisAdjustment: 0 235; CHECK: } 236; CHECK: MemberFunction ([[MF_B:.*]]) { 237; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 238; CHECK: ReturnType: BClass ({{.*}}) 239; CHECK: ClassType: FClass ({{.*}}) 240; CHECK: ThisType: FClass* {{.*}} 241; CHECK: CallingConvention: NearC (0x0) 242; CHECK: FunctionOptions [ (0x1) 243; CHECK: CxxReturnUdt (0x1) 244; CHECK: ] 245; CHECK: NumParameters: 1 246; CHECK: ArgListType: (BClass&) ({{.*}}) 247; CHECK: ThisAdjustment: 0 248; CHECK: } 249; CHECK: FieldList ({{.*}}) { 250; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 251; CHECK: StaticDataMember { 252; CHECK: TypeLeafKind: LF_STMEMBER (0x150E) 253; CHECK: AccessSpecifier: Private (0x1) 254; CHECK: Type: int (0x74) 255; CHECK: Name: x 256; CHECK: } 257; CHECK: OneMethod { 258; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 259; CHECK: AccessSpecifier: Private (0x1) 260; CHECK: Type: AClass FClass::(AClass&) ([[MF_A]]) 261; CHECK: Name: Member_AClass 262; CHECK: } 263; CHECK: OneMethod { 264; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 265; CHECK: AccessSpecifier: Private (0x1) 266; CHECK: Type: BClass FClass::(BClass&) ([[MF_B]]) 267; CHECK: Name: Member_BClass 268; CHECK: } 269; CHECK: } 270; CHECK: FuncId ({{.*}}) { 271; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 272; CHECK: ParentScope: 0x0 273; CHECK: FunctionType: FClass (FClass&) ([[SP_F]]) 274; CHECK: Name: Func_FClass 275; CHECK: } 276; CHECK: Procedure ([[SP_AS:.*]]) { 277; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 278; CHECK: ReturnType: AStruct ({{.*}}) 279; CHECK: CallingConvention: NearC (0x0) 280; CHECK: FunctionOptions [ (0x0) 281; CHECK: ] 282; CHECK: NumParameters: 1 283; CHECK: ArgListType: (AStruct&) ({{.*}}) 284; CHECK: } 285; CHECK: FuncId ({{.*}}) { 286; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 287; CHECK: ParentScope: 0x0 288; CHECK: FunctionType: AStruct (AStruct&) ([[SP_AS]]) 289; CHECK: Name: Func_AStruct 290; CHECK: } 291; CHECK: Procedure ([[SP_BS:.*]]) { 292; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 293; CHECK: ReturnType: BStruct ({{.*}}) 294; CHECK: CallingConvention: NearC (0x0) 295; CHECK: FunctionOptions [ (0x1) 296; CHECK: CxxReturnUdt (0x1) 297; CHECK: ] 298; CHECK: NumParameters: 1 299; CHECK: ArgListType: (BStruct&) ({{.*}}) 300; CHECK: } 301; CHECK: MemberFunction ([[CTOR_BS:.*]]) { 302; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 303; CHECK: ReturnType: void (0x3) 304; CHECK: ClassType: BStruct ({{.*}}) 305; CHECK: ThisType: BStruct* {{.*}} 306; CHECK: CallingConvention: NearC (0x0) 307; CHECK: FunctionOptions [ (0x2) 308; CHECK: Constructor (0x2) 309; CHECK: ] 310; CHECK: NumParameters: 0 311; CHECK: ArgListType: () ({{.*}}) 312; CHECK: ThisAdjustment: 0 313; CHECK: } 314; CHECK: FieldList ({{.*}}) { 315; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 316; CHECK: OneMethod { 317; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 318; CHECK: AccessSpecifier: Public (0x3) 319; CHECK: Type: void BStruct::() ([[CTOR_BS]]) 320; CHECK: Name: BStruct 321; CHECK: } 322; CHECK: } 323; CHECK: FuncId ({{.*}}) { 324; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 325; CHECK: ParentScope: 0x0 326; CHECK: FunctionType: BStruct (BStruct&) ([[SP_BS]]) 327; CHECK: Name: Func_BStruct 328; CHECK: } 329; CHECK: Procedure ([[SP_AU:.*]]) { 330; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 331; CHECK: ReturnType: AUnion ({{.*}}) 332; CHECK: CallingConvention: NearC (0x0) 333; CHECK: FunctionOptions [ (0x0) 334; CHECK: ] 335; CHECK: NumParameters: 1 336; CHECK: ArgListType: (AUnion&) ({{.*}}) 337; CHECK: } 338; CHECK: FuncId ({{.*}}) { 339; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 340; CHECK: ParentScope: 0x0 341; CHECK: FunctionType: AUnion (AUnion&) ([[SP_AU]]) 342; CHECK: Name: Func_AUnion 343; CHECK: } 344; CHECK: Procedure ([[SP_BU:.*]]) { 345; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008) 346; CHECK: ReturnType: BUnion ({{.*}}) 347; CHECK: CallingConvention: NearC (0x0) 348; CHECK: FunctionOptions [ (0x0) 349; CHECK: ] 350; CHECK: NumParameters: 1 351; CHECK: ArgListType: (BUnion&) ({{.*}}) 352; CHECK: } 353; CHECK: MemberFunction ([[CTOR_BU:.*]]) { 354; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009) 355; CHECK: ReturnType: void (0x3) 356; CHECK: ClassType: BUnion ({{.*}}) 357; CHECK: ThisType: BUnion* {{.*}} 358; CHECK: CallingConvention: NearC (0x0) 359; CHECK: FunctionOptions [ (0x0) 360; CHECK: ] 361; CHECK: NumParameters: 0 362; CHECK: ArgListType: () ({{.*}}) 363; CHECK: ThisAdjustment: 0 364; CHECK: } 365; CHECK: FieldList ({{.*}}) { 366; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203) 367; CHECK: OneMethod { 368; CHECK: TypeLeafKind: LF_ONEMETHOD (0x1511) 369; CHECK: AccessSpecifier: Public (0x3) 370; CHECK: Type: void BUnion::() ([[CTOR_BU]]) 371; CHECK: Name: BUnion 372; CHECK: } 373; CHECK: } 374; CHECK: FuncId ({{.*}}) { 375; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601) 376; CHECK: ParentScope: 0x0 377; CHECK: FunctionType: BUnion (BUnion&) ([[SP_BU]]) 378; CHECK: Name: Func_BUnion 379; CHECK: } 380; CHECK: ] 381 382; CHECK-LABEL: FunctionType: Func_AClass (0x1008) 383; CHECK-NEXT: CodeOffset: ?Func_AClass@@YA?AVAClass@@AEAV1@@Z+0x0 384; CHECK-NEXT: Segment: 0x0 385; CHECK-NEXT: Flags [ (0xC0) 386; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 387; CHECK-NEXT: IsNoInline (0x40) 388; CHECK-NEXT: ] 389; CHECK-NEXT: DisplayName: Func_AClass 390; CHECK-NEXT: LinkageName: ?Func_AClass@@YA?AVAClass@@AEAV1@@Z 391; CHECK-LABEL: FunctionType: Func_BClass (0x1013) 392; CHECK-NEXT: CodeOffset: ?Func_BClass@@YA?AVBClass@@AEAV1@@Z+0x0 393; CHECK-NEXT: Segment: 0x0 394; CHECK-NEXT: Flags [ (0xC0) 395; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 396; CHECK-NEXT: IsNoInline (0x40) 397; CHECK-NEXT: ] 398; CHECK-NEXT: DisplayName: Func_BClass 399; CHECK-NEXT: LinkageName: ?Func_BClass@@YA?AVBClass@@AEAV1@@Z 400; CHECK-LABEL: FunctionType: Func_C1Class (0x101D) 401; CHECK-NEXT: CodeOffset: ?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z+0x0 402; CHECK-NEXT: Segment: 0x0 403; CHECK-NEXT: Flags [ (0xC0) 404; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 405; CHECK-NEXT: IsNoInline (0x40) 406; CHECK-NEXT: ] 407; CHECK-NEXT: DisplayName: Func_C1Class 408; CHECK-NEXT: LinkageName: ?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z 409; CHECK-LABEL: FunctionType: Func_C2Class (0x1027) 410; CHECK-NEXT: CodeOffset: ?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z+0x0 411; CHECK-NEXT: Segment: 0x0 412; CHECK-NEXT: Flags [ (0xC0) 413; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 414; CHECK-NEXT: IsNoInline (0x40) 415; CHECK-NEXT: ] 416; CHECK-NEXT: DisplayName: Func_C2Class 417; CHECK-NEXT: LinkageName: ?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z 418; CHECK-LABEL: FunctionType: Func_DClass (0x102F) 419; CHECK-NEXT: CodeOffset: ?Func_DClass@@YA?AVDClass@@AEAV1@@Z+0x0 420; CHECK-NEXT: Segment: 0x0 421; CHECK-NEXT: Flags [ (0xC0) 422; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 423; CHECK-NEXT: IsNoInline (0x40) 424; CHECK-NEXT: ] 425; CHECK-NEXT: DisplayName: Func_DClass 426; CHECK-NEXT: LinkageName: ?Func_DClass@@YA?AVDClass@@AEAV1@@Z 427; CHECK-LABEL: FunctionType: Func_FClass (0x103A) 428; CHECK-NEXT: CodeOffset: ?Func_FClass@@YA?AVFClass@@AEAV1@@Z+0x0 429; CHECK-NEXT: Segment: 0x0 430; CHECK-NEXT: Flags [ (0xC0) 431; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 432; CHECK-NEXT: IsNoInline (0x40) 433; CHECK-NEXT: ] 434; CHECK-NEXT: DisplayName: Func_FClass 435; CHECK-NEXT: LinkageName: ?Func_FClass@@YA?AVFClass@@AEAV1@@Z 436; CHECK-LABEL: FunctionType: Func_AStruct (0x1041) 437; CHECK-NEXT: CodeOffset: ?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z+0x0 438; CHECK-NEXT: Segment: 0x0 439; CHECK-NEXT: Flags [ (0xC0) 440; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 441; CHECK-NEXT: IsNoInline (0x40) 442; CHECK-NEXT: ] 443; CHECK-NEXT: DisplayName: Func_AStruct 444; CHECK-NEXT: LinkageName: ?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z 445; CHECK-LABEL: FunctionType: Func_BStruct (0x104B) 446; CHECK-NEXT: CodeOffset: ?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z+0x0 447; CHECK-NEXT: Segment: 0x0 448; CHECK-NEXT: Flags [ (0xC0) 449; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 450; CHECK-NEXT: IsNoInline (0x40) 451; CHECK-NEXT: ] 452; CHECK-NEXT: DisplayName: Func_BStruct 453; CHECK-NEXT: LinkageName: ?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z 454; CHECK-LABEL: FunctionType: Func_AUnion (0x1052) 455; CHECK-NEXT: CodeOffset: ?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z+0x0 456; CHECK-NEXT: Segment: 0x0 457; CHECK-NEXT: Flags [ (0xC0) 458; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 459; CHECK-NEXT: IsNoInline (0x40) 460; CHECK-NEXT: ] 461; CHECK-NEXT: DisplayName: Func_AUnion 462; CHECK-NEXT: LinkageName: ?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z 463; CHECK-LABEL: FunctionType: Func_BUnion (0x105C) 464; CHECK-NEXT: CodeOffset: ?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z+0x0 465; CHECK-NEXT: Segment: 0x0 466; CHECK-NEXT: Flags [ (0xC0) 467; CHECK-NEXT: HasOptimizedDebugInfo (0x80) 468; CHECK-NEXT: IsNoInline (0x40) 469; CHECK-NEXT: ] 470; CHECK-NEXT: DisplayName: Func_BUnion 471; CHECK-NEXT: LinkageName: ?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z 472 473; ModuleID = 't.cpp' 474source_filename = "t.cpp" 475target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 476target triple = "x86_64-pc-windows-msvc19.23.28106" 477 478%class.AClass = type { i8 } 479%class.BClass = type { i8 } 480%class.C1Class = type { i8 } 481%class.C2Class = type { i8 } 482%class.DClass = type { i8 } 483%class.FClass = type { i8 } 484%struct.AStruct = type { i8 } 485%struct.BStruct = type { i8 } 486%union.AUnion = type { i8 } 487%union.BUnion = type { i8 } 488 489; Function Attrs: noinline nounwind optnone uwtable 490define dso_local i8 @"?Func_AClass@@YA?AVAClass@@AEAV1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !8 { 491entry: 492 %retval = alloca %class.AClass, align 1 493 %arg.addr = alloca ptr, align 8 494 store ptr %arg, ptr %arg.addr, align 8 495 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !13, metadata !DIExpression()), !dbg !14 496 %0 = load ptr, ptr %arg.addr, align 8, !dbg !14 497 %coerce.dive = getelementptr inbounds %class.AClass, ptr %retval, i32 0, i32 0, !dbg !14 498 %1 = load i8, ptr %coerce.dive, align 1, !dbg !14 499 ret i8 %1, !dbg !14 500} 501 502; Function Attrs: nounwind readnone speculatable willreturn 503declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 504 505; Function Attrs: noinline nounwind optnone uwtable 506define dso_local void @"?Func_BClass@@YA?AVBClass@@AEAV1@@Z"(ptr noalias sret(%class.BClass) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !15 { 507entry: 508 %result.ptr = alloca ptr, align 8 509 %arg.addr = alloca ptr, align 8 510 %0 = bitcast ptr %agg.result to ptr 511 store ptr %0, ptr %result.ptr, align 8 512 store ptr %arg, ptr %arg.addr, align 8 513 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !25, metadata !DIExpression()), !dbg !26 514 %1 = load ptr, ptr %arg.addr, align 8, !dbg !26 515 ret void, !dbg !26 516} 517 518; Function Attrs: noinline nounwind optnone uwtable 519define dso_local void @"?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z"(ptr noalias sret(%class.C1Class) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !27 { 520entry: 521 %result.ptr = alloca ptr, align 8 522 %arg.addr = alloca ptr, align 8 523 %0 = bitcast ptr %agg.result to ptr 524 store ptr %0, ptr %result.ptr, align 8 525 store ptr %arg, ptr %arg.addr, align 8 526 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !37, metadata !DIExpression()), !dbg !38 527 %1 = load ptr, ptr %arg.addr, align 8, !dbg !38 528 ret void, !dbg !38 529} 530 531; Function Attrs: noinline nounwind optnone uwtable 532define dso_local void @"?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z"(ptr noalias sret(%class.C2Class) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !39 { 533entry: 534 %result.ptr = alloca ptr, align 8 535 %arg.addr = alloca ptr, align 8 536 %0 = bitcast ptr %agg.result to ptr 537 store ptr %0, ptr %result.ptr, align 8 538 store ptr %arg, ptr %arg.addr, align 8 539 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !49, metadata !DIExpression()), !dbg !50 540 %1 = load ptr, ptr %arg.addr, align 8, !dbg !50 541 ret void, !dbg !50 542} 543 544; Function Attrs: noinline nounwind optnone uwtable 545define dso_local void @"?Func_DClass@@YA?AVDClass@@AEAV1@@Z"(ptr noalias sret(%class.DClass) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !51 { 546entry: 547 %result.ptr = alloca ptr, align 8 548 %arg.addr = alloca ptr, align 8 549 %0 = bitcast ptr %agg.result to ptr 550 store ptr %0, ptr %result.ptr, align 8 551 store ptr %arg, ptr %arg.addr, align 8 552 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !58, metadata !DIExpression()), !dbg !59 553 %1 = load ptr, ptr %arg.addr, align 8, !dbg !59 554 ret void, !dbg !59 555} 556 557; Function Attrs: noinline nounwind optnone uwtable 558define dso_local i8 @"?Func_FClass@@YA?AVFClass@@AEAV1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !60 { 559entry: 560 %retval = alloca %class.FClass, align 1 561 %arg.addr = alloca ptr, align 8 562 store ptr %arg, ptr %arg.addr, align 8 563 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !75, metadata !DIExpression()), !dbg !76 564 %0 = load ptr, ptr %arg.addr, align 8, !dbg !76 565 %coerce.dive = getelementptr inbounds %class.FClass, ptr %retval, i32 0, i32 0, !dbg !76 566 %1 = load i8, ptr %coerce.dive, align 1, !dbg !76 567 ret i8 %1, !dbg !76 568} 569 570; Function Attrs: noinline nounwind optnone uwtable 571define dso_local i8 @"?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !77 { 572entry: 573 %retval = alloca %struct.AStruct, align 1 574 %arg.addr = alloca ptr, align 8 575 store ptr %arg, ptr %arg.addr, align 8 576 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !82, metadata !DIExpression()), !dbg !83 577 %0 = load ptr, ptr %arg.addr, align 8, !dbg !83 578 %coerce.dive = getelementptr inbounds %struct.AStruct, ptr %retval, i32 0, i32 0, !dbg !83 579 %1 = load i8, ptr %coerce.dive, align 1, !dbg !83 580 ret i8 %1, !dbg !83 581} 582 583; Function Attrs: noinline nounwind optnone uwtable 584define dso_local void @"?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z"(ptr noalias sret(%struct.BStruct) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !84 { 585entry: 586 %result.ptr = alloca ptr, align 8 587 %arg.addr = alloca ptr, align 8 588 %0 = bitcast ptr %agg.result to ptr 589 store ptr %0, ptr %result.ptr, align 8 590 store ptr %arg, ptr %arg.addr, align 8 591 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !94, metadata !DIExpression()), !dbg !95 592 %1 = load ptr, ptr %arg.addr, align 8, !dbg !95 593 ret void, !dbg !95 594} 595 596; Function Attrs: noinline nounwind optnone uwtable 597define dso_local i8 @"?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z"(ptr dereferenceable(1) %arg) #0 !dbg !96 { 598entry: 599 %retval = alloca %union.AUnion, align 1 600 %arg.addr = alloca ptr, align 8 601 store ptr %arg, ptr %arg.addr, align 8 602 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !101, metadata !DIExpression()), !dbg !102 603 %0 = load ptr, ptr %arg.addr, align 8, !dbg !102 604 %coerce.dive = getelementptr inbounds %union.AUnion, ptr %retval, i32 0, i32 0, !dbg !102 605 %1 = load i8, ptr %coerce.dive, align 1, !dbg !102 606 ret i8 %1, !dbg !102 607} 608 609; Function Attrs: noinline nounwind optnone uwtable 610define dso_local void @"?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z"(ptr noalias sret(%union.BUnion) %agg.result, ptr dereferenceable(1) %arg) #0 !dbg !103 { 611entry: 612 %result.ptr = alloca ptr, align 8 613 %arg.addr = alloca ptr, align 8 614 %0 = bitcast ptr %agg.result to ptr 615 store ptr %0, ptr %result.ptr, align 8 616 store ptr %arg, ptr %arg.addr, align 8 617 call void @llvm.dbg.declare(metadata ptr %arg.addr, metadata !113, metadata !DIExpression()), !dbg !114 618 %1 = load ptr, ptr %arg.addr, align 8, !dbg !114 619 ret void, !dbg !114 620} 621 622; Function Attrs: noinline norecurse nounwind optnone uwtable 623define dso_local i32 @main() #2 !dbg !115 { 624entry: 625 %retval = alloca i32, align 4 626 store i32 0, ptr %retval, align 4 627 ret i32 0, !dbg !118 628} 629 630attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } 631attributes #1 = { nounwind readnone speculatable willreturn } 632attributes #2 = { noinline norecurse nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } 633 634!llvm.dbg.cu = !{!0} 635!llvm.module.flags = !{!3, !4, !5, !6} 636!llvm.ident = !{!7} 637 638!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 11.0.0 (https://github.com/llvm/llvm-project.git 48992717b0e3466cf8814a188e9568c9d71b59c2)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None) 639!1 = !DIFile(filename: "t.cpp", directory: "C:\\src\\tests\\duplicate-types\\llvm-test", checksumkind: CSK_MD5, checksum: "c4c61c0e2135d713d0c99a1ba9ab568b") 640!2 = !{} 641!3 = !{i32 2, !"CodeView", i32 1} 642!4 = !{i32 2, !"Debug Info Version", i32 3} 643!5 = !{i32 1, !"wchar_size", i32 2} 644!6 = !{i32 7, !"PIC Level", i32 2} 645!7 = !{!"clang version 11.0.0 (https://github.com/llvm/llvm-project.git 48992717b0e3466cf8814a188e9568c9d71b59c2)"} 646!8 = distinct !DISubprogram(name: "Func_AClass", linkageName: "?Func_AClass@@YA?AVAClass@@AEAV1@@Z", scope: !1, file: !1, line: 5, type: !9, scopeLine: 5, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 647!9 = !DISubroutineType(types: !10) 648!10 = !{!11, !12} 649!11 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "AClass", file: !1, line: 4, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?AVAClass@@") 650!12 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !11, size: 64) 651!13 = !DILocalVariable(name: "arg", arg: 1, scope: !8, file: !1, line: 5, type: !12) 652!14 = !DILocation(line: 5, scope: !8) 653!15 = distinct !DISubprogram(name: "Func_BClass", linkageName: "?Func_BClass@@YA?AVBClass@@AEAV1@@Z", scope: !1, file: !1, line: 11, type: !16, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 654!16 = !DISubroutineType(types: !17) 655!17 = !{!18, !24} 656!18 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "BClass", file: !1, line: 7, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !19, identifier: ".?AVBClass@@") 657!19 = !{!20} 658!20 = !DISubprogram(name: "BClass", scope: !18, file: !1, line: 9, type: !21, scopeLine: 9, flags: DIFlagExplicit | DIFlagPrototyped, spFlags: 0) 659!21 = !DISubroutineType(types: !22) 660!22 = !{null, !23} 661!23 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !18, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 662!24 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !18, size: 64) 663!25 = !DILocalVariable(name: "arg", arg: 1, scope: !15, file: !1, line: 11, type: !24) 664!26 = !DILocation(line: 11, scope: !15) 665!27 = distinct !DISubprogram(name: "Func_C1Class", linkageName: "?Func_C1Class@@YA?AVC1Class@@AEAV1@@Z", scope: !1, file: !1, line: 17, type: !28, scopeLine: 17, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 666!28 = !DISubroutineType(types: !29) 667!29 = !{!30, !36} 668!30 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C1Class", file: !1, line: 13, size: 8, flags: DIFlagTypePassByValue, elements: !31, identifier: ".?AVC1Class@@") 669!31 = !{!32} 670!32 = !DISubprogram(name: "C1Class", scope: !30, file: !1, line: 15, type: !33, scopeLine: 15, flags: DIFlagPublic | DIFlagPrototyped, spFlags: 0) 671!33 = !DISubroutineType(types: !34) 672!34 = !{null, !35} 673!35 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !30, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 674!36 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !30, size: 64) 675!37 = !DILocalVariable(name: "arg", arg: 1, scope: !27, file: !1, line: 17, type: !36) 676!38 = !DILocation(line: 17, scope: !27) 677!39 = distinct !DISubprogram(name: "Func_C2Class", linkageName: "?Func_C2Class@@YA?AVC2Class@@AEAV1@@Z", scope: !1, file: !1, line: 23, type: !40, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 678!40 = !DISubroutineType(types: !41) 679!41 = !{!42, !48} 680!42 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "C2Class", file: !1, line: 19, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !43, identifier: ".?AVC2Class@@") 681!43 = !{!44} 682!44 = !DISubprogram(name: "~C2Class", scope: !42, file: !1, line: 21, type: !45, scopeLine: 21, flags: DIFlagPublic | DIFlagPrototyped, spFlags: 0) 683!45 = !DISubroutineType(types: !46) 684!46 = !{null, !47} 685!47 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !42, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 686!48 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !42, size: 64) 687!49 = !DILocalVariable(name: "arg", arg: 1, scope: !39, file: !1, line: 23, type: !48) 688!50 = !DILocation(line: 23, scope: !39) 689!51 = distinct !DISubprogram(name: "Func_DClass", linkageName: "?Func_DClass@@YA?AVDClass@@AEAV1@@Z", scope: !1, file: !1, line: 26, type: !52, scopeLine: 26, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 690!52 = !DISubroutineType(types: !53) 691!53 = !{!54, !57} 692!54 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "DClass", file: !1, line: 25, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !55, identifier: ".?AVDClass@@") 693!55 = !{!56} 694!56 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !54, baseType: !18, flags: DIFlagPublic, extraData: i32 0) 695!57 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !54, size: 64) 696!58 = !DILocalVariable(name: "arg", arg: 1, scope: !51, file: !1, line: 26, type: !57) 697!59 = !DILocation(line: 26, scope: !51) 698!60 = distinct !DISubprogram(name: "Func_FClass", linkageName: "?Func_FClass@@YA?AVFClass@@AEAV1@@Z", scope: !1, file: !1, line: 33, type: !61, scopeLine: 33, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 699!61 = !DISubroutineType(types: !62) 700!62 = !{!63, !74} 701!63 = distinct !DICompositeType(tag: DW_TAG_class_type, name: "FClass", file: !1, line: 28, size: 8, flags: DIFlagTypePassByValue, elements: !64, identifier: ".?AVFClass@@") 702!64 = !{!65, !67, !71} 703!65 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !63, file: !1, line: 29, baseType: !66, flags: DIFlagStaticMember) 704!66 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 705!67 = !DISubprogram(name: "Member_AClass", linkageName: "?Member_AClass@FClass@@AEAA?AVAClass@@AEAV2@@Z", scope: !63, file: !1, line: 30, type: !68, scopeLine: 30, flags: DIFlagPrototyped, spFlags: 0) 706!68 = !DISubroutineType(types: !69) 707!69 = !{!11, !70, !12} 708!70 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !63, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 709!71 = !DISubprogram(name: "Member_BClass", linkageName: "?Member_BClass@FClass@@AEAA?AVBClass@@AEAV2@@Z", scope: !63, file: !1, line: 31, type: !72, scopeLine: 31, flags: DIFlagPrototyped, spFlags: 0) 710!72 = !DISubroutineType(types: !73) 711!73 = !{!18, !70, !24} 712!74 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !63, size: 64) 713!75 = !DILocalVariable(name: "arg", arg: 1, scope: !60, file: !1, line: 33, type: !74) 714!76 = !DILocation(line: 33, scope: !60) 715!77 = distinct !DISubprogram(name: "Func_AStruct", linkageName: "?Func_AStruct@@YA?AUAStruct@@AEAU1@@Z", scope: !1, file: !1, line: 36, type: !78, scopeLine: 36, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 716!78 = !DISubroutineType(types: !79) 717!79 = !{!80, !81} 718!80 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "AStruct", file: !1, line: 35, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?AUAStruct@@") 719!81 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !80, size: 64) 720!82 = !DILocalVariable(name: "arg", arg: 1, scope: !77, file: !1, line: 36, type: !81) 721!83 = !DILocation(line: 36, scope: !77) 722!84 = distinct !DISubprogram(name: "Func_BStruct", linkageName: "?Func_BStruct@@YA?AUBStruct@@AEAU1@@Z", scope: !1, file: !1, line: 39, type: !85, scopeLine: 39, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 723!85 = !DISubroutineType(types: !86) 724!86 = !{!87, !93} 725!87 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "BStruct", file: !1, line: 38, size: 8, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !88, identifier: ".?AUBStruct@@") 726!88 = !{!89} 727!89 = !DISubprogram(name: "BStruct", scope: !87, file: !1, line: 38, type: !90, scopeLine: 38, flags: DIFlagPrototyped, spFlags: 0) 728!90 = !DISubroutineType(types: !91) 729!91 = !{null, !92} 730!92 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !87, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 731!93 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !87, size: 64) 732!94 = !DILocalVariable(name: "arg", arg: 1, scope: !84, file: !1, line: 39, type: !93) 733!95 = !DILocation(line: 39, scope: !84) 734!96 = distinct !DISubprogram(name: "Func_AUnion", linkageName: "?Func_AUnion@@YA?ATAUnion@@AEAT1@@Z", scope: !1, file: !1, line: 42, type: !97, scopeLine: 42, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 735!97 = !DISubroutineType(types: !98) 736!98 = !{!99, !100} 737!99 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "AUnion", file: !1, line: 41, size: 8, flags: DIFlagTypePassByValue, elements: !2, identifier: ".?ATAUnion@@") 738!100 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !99, size: 64) 739!101 = !DILocalVariable(name: "arg", arg: 1, scope: !96, file: !1, line: 42, type: !100) 740!102 = !DILocation(line: 42, scope: !96) 741!103 = distinct !DISubprogram(name: "Func_BUnion", linkageName: "?Func_BUnion@@YA?ATBUnion@@AEAT1@@Z", scope: !1, file: !1, line: 45, type: !104, scopeLine: 45, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 742!104 = !DISubroutineType(types: !105) 743!105 = !{!106, !112} 744!106 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "BUnion", file: !1, line: 44, size: 8, flags: DIFlagTypePassByValue, elements: !107, identifier: ".?ATBUnion@@") 745!107 = !{!108} 746!108 = !DISubprogram(name: "BUnion", scope: !106, file: !1, line: 44, type: !109, scopeLine: 44, flags: DIFlagPrototyped, spFlags: 0) 747!109 = !DISubroutineType(types: !110) 748!110 = !{null, !111} 749!111 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !106, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 750!112 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !106, size: 64) 751!113 = !DILocalVariable(name: "arg", arg: 1, scope: !103, file: !1, line: 45, type: !112) 752!114 = !DILocation(line: 45, scope: !103) 753!115 = distinct !DISubprogram(name: "main", scope: !1, file: !1, line: 47, type: !116, scopeLine: 47, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 754!116 = !DISubroutineType(types: !117) 755!117 = !{!66} 756!118 = !DILocation(line: 48, scope: !115) 757