1 # To regenerate t1.obj and t2.obj, run the following: 2 # $ cat t.cpp 3 # #ifdef CONFIG1 4 # struct A; 5 # struct B { 6 # A *a; 7 # }; 8 # int f(A *a); 9 # int g(B *b) { return f(b->a); } 10 # #else 11 # struct B; 12 # struct A { 13 # B *b; 14 # }; 15 # int g(B *b); 16 # int f(A *a) { return g(a->b); } 17 # #endif 18 # $ cl -c -DCONFIG1 -Z7 t.cpp -Fot1.obj && cl -c -Z7 t.cpp -Fot2.obj 19 20 RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-1.obj | FileCheck %s --check-prefix=OBJ1 21 RUN: llvm-readobj -codeview %S/Inputs/codeview-merging-2.obj | FileCheck %s --check-prefix=OBJ2 22 RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-merging-1.obj %S/Inputs/codeview-merging-2.obj | FileCheck %s 23 24 OBJ1: FuncId (0x100D) { 25 OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 26 OBJ1-NEXT: ParentScope: 0x0 27 OBJ1-NEXT: FunctionType: int (B*) (0x100C) 28 OBJ1-NEXT: Name: g 29 OBJ1-NEXT: } 30 OBJ1-NEXT: FuncId (0x100E) { 31 OBJ1-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 32 OBJ1-NEXT: ParentScope: 0x0 33 OBJ1-NEXT: FunctionType: int (A*) (0x1003) 34 OBJ1-NEXT: Name: f 35 OBJ1-NEXT: } 36 OBJ1-NOT: FuncId 37 38 OBJ2: FuncId (0x100D) { 39 OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 40 OBJ2-NEXT: ParentScope: 0x0 41 OBJ2-NEXT: FunctionType: int (A*) (0x100C) 42 OBJ2-NEXT: Name: f 43 OBJ2-NEXT: } 44 45 OBJ2: FuncId (0x1069) { 46 OBJ2-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 47 OBJ2-NEXT: ParentScope: 0x0 48 OBJ2-NEXT: FunctionType: int (B*) (0x1003) 49 OBJ2-NEXT: Name: g 50 OBJ2-NEXT: } 51 OBJ2-NOT: FuncId 52 53 CHECK: FuncId (0x100D) { 54 CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 55 CHECK-NEXT: ParentScope: 0x0 56 CHECK-NEXT: FunctionType: int (B*) (0x100C) 57 CHECK-NEXT: Name: g 58 CHECK-NEXT: } 59 CHECK-NEXT: FuncId (0x100E) { 60 CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601) 61 CHECK-NEXT: ParentScope: 0x0 62 CHECK-NEXT: FunctionType: int (A*) (0x1003) 63 CHECK-NEXT: Name: f 64 CHECK-NEXT: } 65 CHECK-NOT: FuncId 66