Imported Upstream version 5.18.0.205

Former-commit-id: 7f59f7e792705db773f1caecdaa823092f4e2927
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-11-16 08:20:38 +00:00
parent 5cd5df71cc
commit 8e12397d70
28486 changed files with 3867013 additions and 66 deletions

View File

@ -0,0 +1,64 @@
// Compile with "cl /c /Zi /GR- ClassLayoutTest.cpp"
// Link with "link ClassLayoutTest.obj /debug /nodefaultlib /entry:main"
namespace MembersTest {
class A {
public:
typedef int NestedTypedef;
enum NestedEnum {
NestedEnumValue1
};
void MemberFunc() {}
private:
int IntMemberVar;
double DoubleMemberVar;
};
}
namespace GlobalsTest {
int IntVar;
double DoubleVar;
typedef int Typedef;
enum Enum {
Val1
} EnumVar;
Typedef TypedefVar;
}
namespace BaseClassTest {
class A {};
class B : public virtual A {};
class C : public virtual A {};
class D : protected B, private C {};
}
namespace UdtKindTest {
struct A {};
class B {};
union C {};
}
namespace BitFieldTest {
struct A {
int Bits1 : 1;
int Bits2 : 2;
int Bits3 : 3;
int Bits4 : 4;
int Bits22 : 22;
int Offset0x04;
};
};
int main(int argc, char **argv) {
MembersTest::A v1;
v1.MemberFunc();
BaseClassTest::D v2;
UdtKindTest::A v3;
UdtKindTest::B v4;
UdtKindTest::C v5;
BitFieldTest::A v7;
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,48 @@
// Compile with "cl /c /Zi /GR- ComplexPaddingTest.cpp"
// Link with "link ComplexPaddingTest.obj /debug /nodefaultlib /entry:main"
#include <stdint.h>
extern "C" using at_exit_handler = void();
int atexit(at_exit_handler handler) { return 0; }
struct TestVB {
static void operator delete(void *ptr, size_t sz) {}
virtual ~TestVB() {}
virtual void IntroFunction1() {}
int X;
} A;
struct TestNVB {
static void operator delete(void *ptr, size_t sz) {}
virtual ~TestNVB() {}
virtual void IntroFunction2() {}
int Y;
} B;
struct TestVBLayout
: public virtual TestVB,
public TestNVB {
static void operator delete(void *ptr, size_t sz) {}
int Z;
} C;
struct TestIVBBase : public virtual TestVB {
int A;
} D;
struct TestIVBDerived : public TestIVBBase {
int B;
} E;
struct TestIVBMergedDerived
: public virtual TestVB,
public TestIVBBase {
int B;
} F;
int main(int argc, char **argv) {
return 0;
}

View File

@ -0,0 +1 @@
093276bb70816a200b7b7bfe6aa00a3ffc790c22

View File

@ -0,0 +1,47 @@
// Compile with "cl /c /Zi /GR- FilterTest.cpp"
// Link with "link FilterTest.obj /debug /nodefaultlib /entry:main"
class FilterTestClass {
public:
typedef int NestedTypedef;
enum NestedEnum {
NestedEnumValue1
};
void MemberFunc() {}
int foo() const { return IntMemberVar; }
private:
int IntMemberVar;
double DoubleMemberVar;
};
int IntGlobalVar;
double DoubleGlobalVar;
typedef int GlobalTypedef;
char OneByte;
char TwoBytes[2];
char ThreeBytes[3];
enum GlobalEnum {
GlobalEnumVal1
} GlobalEnumVar;
int CFunc() {
return (int)OneByte * 2;
}
int BFunc() {
return 42;
}
int AFunc() {
static FilterTestClass FC;
return (CFunc() + BFunc()) * IntGlobalVar + FC.foo();
}
int main(int argc, char **argv) {
FilterTestClass TestClass;
GlobalTypedef v1;
return 0;
}

Binary file not shown.

View File

@ -0,0 +1,6 @@
// Compile with "cl /c /Zi /GR- LoadAddressTest.cpp"
// Link with "link LoadAddressTest.obj /debug /nodefaultlib /entry:main"
int main(int argc, char **argv) {
return 0;
}

View File

@ -0,0 +1 @@
e302e9bf3b61f436b429a74e81bdd5bda916ca61

View File

@ -0,0 +1,168 @@
// Compile with "cl /c /Zi /GR- SimplePaddingTest.cpp"
// Link with "link SimplePaddingTest.obj /debug /nodefaultlib /entry:main"
#include <stdint.h>
extern "C" using at_exit_handler = void();
int atexit(at_exit_handler handler) { return 0; }
struct SimplePadNoPadding {
int32_t X;
int32_t Y;
// No padding anywhere, sizeof(T) = 8
} A;
struct SimplePadUnion {
union {
int32_t X;
int64_t Y;
struct {
int32_t X;
// 4 bytes of padding here
int64_t Y;
} Z;
};
// Since the padding occurs at a location that is occupied by other storage
// (namely the Y member), the storage will still be considered used, and so
// there will be no unused bytes in the larger class. But in the debug
// info for the nested struct, we should see padding.
// sizeof(SimplePadUnion) == sizeof(Z) == 16
} B;
struct SimplePadNoPadding2 {
bool A;
bool B;
bool C;
bool D;
// No padding anywhere, sizeof(T) = 4
} C;
struct alignas(4) SimplePadFields1 {
char A;
char B;
char C;
// 1 byte of padding here, sizeof(T) = 4
} E;
struct SimplePadFields2 {
int32_t Y;
char X;
} F;
struct SimplePadBase {
// Make sure this class is 4 bytes, and the derived class requires 8 byte
// alignment, so that padding is inserted between base and derived.
int32_t X;
// No padding here
} G;
struct SimplePadDerived : public SimplePadBase {
// 4 bytes of padding here due to Y requiring 8 byte alignment.
// Thus, sizeof(T) = 16
int64_t Y;
} H;
struct SimplePadEmptyBase1 {};
struct SimplePadEmptyBase2 {};
struct SimplePadEmpty : public SimplePadEmptyBase1, SimplePadEmptyBase2 {
// Bases have to occupy at least 1 byte of storage, so this requires
// 2 bytes of padding, plus 1 byte for each base, yielding sizeof(T) = 8
int32_t X;
} I;
struct SimplePadVfptr {
virtual ~SimplePadVfptr() {}
static void operator delete(void *ptr, size_t sz) {}
int32_t X;
} J;
struct NonEmptyBase1 {
bool X;
};
struct NonEmptyBase2 {
bool Y;
};
struct SimplePadMultiInherit : public NonEmptyBase1, public NonEmptyBase2 {
// X and Y from the 2 bases will get squished together, leaving 2 bytes
// of padding necessary for proper alignment of an int32.
// Therefore, sizeof(T) = 2 + 2 + 4 = 8
int32_t X;
} K;
struct SimplePadMultiInherit2 : public SimplePadFields1, SimplePadFields2 {
// There should be 1 byte of padding after the first class, and
// 3 bytes of padding after the second class.
int32_t X;
} L;
struct OneLevelInherit : public NonEmptyBase1 {
short Y;
};
struct SimplePadTwoLevelInherit : public OneLevelInherit {
// OneLevelInherit has nested padding because of its base,
// and then padding again because of this class. So each
// class should be 4 bytes, yielding sizeof(T) = 12.
int64_t Z;
} M;
struct SimplePadAggregate {
NonEmptyBase1 X;
int32_t Y;
// the presence of X will cause 3 bytes of padding to be injected.
SimplePadFields1 Fields;
} N;
struct SimplePadVtable1 {
static void operator delete(void *ptr, size_t sz) {}
virtual ~SimplePadVtable1() {}
virtual void A1() {}
virtual void B1() {}
} O;
struct SimplePadVtable2 {
static void operator delete(void *ptr, size_t sz) {}
virtual ~SimplePadVtable2() {}
virtual void X2() {}
virtual void Y2() {}
virtual void Z2() {}
} P;
struct SimplePadVtable3 {
static void operator delete(void *ptr, size_t sz) {}
virtual ~SimplePadVtable3() {}
virtual void Foo3() {}
virtual void Bar3() {}
virtual void Baz3() {}
virtual void Buzz3() {}
} Q;
struct SimplePadMultiVTables
: public SimplePadVtable1,
public SimplePadVtable2,
public SimplePadVtable3 {
~SimplePadMultiVTables() override {}
static void operator delete(void *ptr, size_t sz) {}
// SimplePadVtable1 overrides
void A1() override {}
// SimplePadVtable2 overrides
void Y2() override {}
void Z2() override {}
// SimplePadVtable3 overrides
void Bar3() override {}
void Baz3() override {}
void Buzz3() override {}
} R;
int main(int argc, char **argv) {
return 0;
}

View File

@ -0,0 +1 @@
f19c00660a73bc4a09deacfe9499c4dbb9388ff8

View File

@ -0,0 +1,55 @@
; RUN: llvm-pdbutil pretty -all -class-recurse-depth=1 \
; RUN: %p/Inputs/ClassLayoutTest.pdb > %t
; RUN: FileCheck -input-file=%t %s -check-prefix=GLOBALS_TEST
; RUN: FileCheck -input-file=%t %s -check-prefix=MEMBERS_TEST
; RUN: FileCheck -input-file=%t %s -check-prefix=BASE_CLASS_A
; RUN: FileCheck -input-file=%t %s -check-prefix=BASE_CLASS_B
; RUN: FileCheck -input-file=%t %s -check-prefix=BASE_CLASS_C
; RUN: FileCheck -input-file=%t %s -check-prefix=BASE_CLASS_D
; RUN: FileCheck -input-file=%t %s -check-prefix=UDT_KIND_TEST
; RUN: FileCheck -input-file=%t %s -check-prefix=BITFIELD_TEST
; GLOBALS_TEST: ---GLOBALS---
; GLOBALS_TEST-DAG: int GlobalsTest::IntVar
; GLOBALS_TEST-DAG: double GlobalsTest::DoubleVar
; GLOBALS_TEST-DAG: GlobalsTest::Enum GlobalsTest::EnumVar
; MEMBERS_TEST: ---TYPES---
; MEMBERS_TEST: class MembersTest::A [sizeof = 16] {
; MEMBERS_TEST-DAG: typedef int NestedTypedef
; MEMBERS_TEST-DAG: enum NestedEnum
; MEMBERS_TEST: void MemberFunc()
; MEMBERS_TEST-DAG: data +0x00 [sizeof=4] int IntMemberVar
; MEMBERS_TEST-NEXT: <padding> (4 bytes)
; MEMBERS_TEST-NEXT: data +0x08 [sizeof=8] double DoubleMemberVar
; MEMBERS_TEST: }
; BASE_CLASS_A: ---TYPES---
; BASE_CLASS_A: class BaseClassTest::A [sizeof = 1] {}
; BASE_CLASS_B: ---TYPES---
; BASE_CLASS_B: class BaseClassTest::B [sizeof = 4]
; BASE_CLASS_B-NEXT: : public virtual BaseClassTest::A {
; BASE_CLASS_C: ---TYPES---
; BASE_CLASS_C: class BaseClassTest::C [sizeof = 4]
; BASE_CLASS_C-NEXT: : public virtual BaseClassTest::A {
; BASE_CLASS_D: ---TYPES---
; BASE_CLASS_D: class BaseClassTest::D [sizeof = 8]
; BASE_CLASS_D-NEXT: protected BaseClassTest::B
; BASE_CLASS_D-NEXT: private BaseClassTest::C
; UDT_KIND_TEST: ---TYPES---
; UDT_KIND_TEST-DAG: union UdtKindTest::C [sizeof = 1] {}
; UDT_KIND_TEST-DAG: class UdtKindTest::B [sizeof = 1] {}
; UDT_KIND_TEST-DAG: struct UdtKindTest::A [sizeof = 1] {}
; BITFIELD_TEST: ---TYPES---
; BITFIELD_TEST: struct BitFieldTest::A [sizeof = 8] {
; BITFIELD_TEST-NEXT: +0x00 [sizeof=4] int Bits1 : 1
; BITFIELD_TEST-NEXT: +0x00 [sizeof=4] int Bits2 : 2
; BITFIELD_TEST-NEXT: +0x00 [sizeof=4] int Bits3 : 3
; BITFIELD_TEST-NEXT: +0x00 [sizeof=4] int Bits4 : 4
; BITFIELD_TEST-NEXT: +0x00 [sizeof=4] int Bits22 : 22
; BITFIELD_TEST-NEXT: +0x04 [sizeof=4] int Offset0x04

View File

@ -0,0 +1,53 @@
; RUN: llvm-pdbutil pretty -classes -class-definitions=layout \
; RUN: -include-types=Test %p/Inputs/ComplexPaddingTest.pdb > %t
; RUN: FileCheck -input-file=%t %s -check-prefix=DIRECT_VB_ONLY
; RUN: FileCheck -input-file=%t %s -check-prefix=DIRECT_VB_AND_NON_VB
; RUN: FileCheck -input-file=%t %s -check-prefix=INDIRECT_VB
; RUN: FileCheck -input-file=%t %s -check-prefix=INDIRECT_AND_DIRECT_VB
; DIRECT_VB_ONLY: struct TestIVBBase [sizeof = 16]
; DIRECT_VB_ONLY-NEXT: : public virtual TestVB {
; DIRECT_VB_ONLY-NEXT: vbptr +0x00 [sizeof=4]
; DIRECT_VB_ONLY-NEXT: data +0x04 [sizeof=4] int A
; DIRECT_VB_ONLY-NEXT: vbase +0x08 [sizeof=8] TestVB
; DIRECT_VB_ONLY-NEXT: vfptr +0x08 [sizeof=4]
; DIRECT_VB_ONLY-NEXT: data +0x0c [sizeof=4] int X
; DIRECT_VB_ONLY-NEXT: }
DIRECT_VB_AND_NON_VB: struct TestVBLayout [sizeof = 24]
DIRECT_VB_AND_NON_VB-NEXT: : public TestNVB
DIRECT_VB_AND_NON_VB-NEXT: , public virtual TestVB {
DIRECT_VB_AND_NON_VB-NEXT: base +0x00 [sizeof=8] TestNVB
DIRECT_VB_AND_NON_VB-NEXT: vfptr +0x00 [sizeof=4]
DIRECT_VB_AND_NON_VB-NEXT: data +0x04 [sizeof=4] int Y
DIRECT_VB_AND_NON_VB-NEXT: vbptr +0x08 [sizeof=4]
DIRECT_VB_AND_NON_VB-NEXT: data +0x0c [sizeof=4] int Z
DIRECT_VB_AND_NON_VB-NEXT: vbase +0x10 [sizeof=8] TestVB
DIRECT_VB_AND_NON_VB-NEXT: vfptr +0x10 [sizeof=4]
DIRECT_VB_AND_NON_VB-NEXT: data +0x14 [sizeof=4] int X
DIRECT_VB_AND_NON_VB-NEXT: }
INDIRECT_VB: struct TestIVBDerived [sizeof = 20]
INDIRECT_VB-NEXT: : public TestIVBBase {
INDIRECT_VB-NEXT: base +0x00 [sizeof=8] TestIVBBase
INDIRECT_VB-NEXT: vbptr +0x00 [sizeof=4]
INDIRECT_VB-NEXT: data +0x04 [sizeof=4] int A
INDIRECT_VB-NEXT: data +0x08 [sizeof=4] int B
INDIRECT_VB-NEXT: ivbase +0x0c [sizeof=8] TestVB
INDIRECT_VB-NEXT: vfptr +0x0c [sizeof=4]
INDIRECT_VB-NEXT: data +0x10 [sizeof=4] int X
INDIRECT_VB-NEXT: }
INDIRECT_AND_DIRECT_VB: struct TestIVBMergedDerived [sizeof = 20]
INDIRECT_AND_DIRECT_VB-NEXT: : public TestIVBBase
INDIRECT_AND_DIRECT_VB-NEXT: , public virtual TestVB {
INDIRECT_AND_DIRECT_VB-NEXT: base +0x00 [sizeof=8] TestIVBBase
INDIRECT_AND_DIRECT_VB-NEXT: vbptr +0x00 [sizeof=4]
INDIRECT_AND_DIRECT_VB-NEXT: data +0x04 [sizeof=4] int A
INDIRECT_AND_DIRECT_VB-NEXT: data +0x08 [sizeof=4] int B
INDIRECT_AND_DIRECT_VB-NEXT: vbase +0x0c [sizeof=8] TestVB
INDIRECT_AND_DIRECT_VB-NEXT: vfptr +0x0c [sizeof=4]
INDIRECT_AND_DIRECT_VB-NEXT: data +0x10 [sizeof=4] int X
INDIRECT_AND_DIRECT_VB-NEXT: }

View File

@ -0,0 +1,20 @@
; RUN: llvm-pdbutil pretty -types %p/Inputs/ClassLayoutTest.pdb > %t
; RUN: FileCheck -input-file=%t %s -check-prefix=GLOBAL_ENUM
; RUN: FileCheck -input-file=%t %s -check-prefix=MEMBER_ENUM
; GLOBAL_ENUM: ---TYPES---
; GLOBAL_ENUM: Enums:
; GLOBAL_ENUM: enum GlobalsTest::Enum {
; GLOBAL_ENUM-NEXT: Val1 = 0
; GLOBAL_ENUM-NEXT: }
; MEMBER_ENUM: ---TYPES---
; MEMBER_ENUM: Classes:
; MEMBER_ENUM: struct __vc_attributes::threadingAttribute [sizeof = 4] {
; MEMBER_ENUM-NEXT: enum threading_e {
; MEMBER_ENUM-NEXT: apartment = 1
; MEMBER_ENUM-NEXT: single = 2
; MEMBER_ENUM-NEXT: free = 3
; MEMBER_ENUM-NEXT: neutral = 4
; MEMBER_ENUM-NEXT: both = 5
; MEMBER_ENUM-NEXT: }

View File

@ -0,0 +1 @@
config.unsupported = not config.have_dia_sdk

View File

@ -0,0 +1,10 @@
; RUN: llvm-pdbutil pretty -externals %p/Inputs/LoadAddressTest.pdb \
; RUN: | FileCheck --check-prefix=RVA %s
; RUN: llvm-pdbutil pretty -externals -load-address=0x40000000 \
; RUN: %p/Inputs/LoadAddressTest.pdb | FileCheck --check-prefix=VA %s
; RVA: ---EXTERNALS---
; RVA: [0x00001010] _main
; VA: ---EXTERNALS---
; VA: [0x40001010] _main

View File

@ -0,0 +1,29 @@
; RUN: llvm-pdbutil dump -type-index=0x1019 %p/Inputs/ClassLayoutTest.pdb \
; RUN: | FileCheck --check-prefix=NODEPS %s
; RUN: llvm-pdbutil dump -type-index=0x1019 -dependents %p/Inputs/ClassLayoutTest.pdb \
; RUN: | FileCheck --check-prefix=DEPS %s
NODEPS: Types (TPI Stream)
NODEPS-NEXT: ============================================================
NODEPS-NEXT: Showing 1 records.
NODEPS-NEXT: 0x1019 | LF_MFUNCTION [size = 28]
NODEPS-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100E
NODEPS-NEXT: class type = 0x1017, this type = 0x1018, this adjust = 0
NODEPS-NEXT: calling conv = thiscall, options = None
DEPS: Types (TPI Stream)
DEPS-NEXT: ============================================================
DEPS-NEXT: Showing 1 records and their dependents (4 records total)
DEPS-NEXT: 0x100E | LF_ARGLIST [size = 8]
DEPS-NEXT: 0x1017 | LF_CLASS [size = 60] `MembersTest::A`
DEPS-NEXT: unique name: `.?AVA@MembersTest@@`
DEPS-NEXT: vtable: <no type>, base list: <no type>, field list: <no type>
DEPS-NEXT: options: forward ref | has unique name
DEPS-NEXT: 0x1018 | LF_POINTER [size = 12]
DEPS-NEXT: referent = 0x1017, mode = pointer, opts = const, kind = ptr32
DEPS-NEXT: 0x1019 | LF_MFUNCTION [size = 28]
DEPS-NEXT: return type = 0x0003 (void), # args = 0, param list = 0x100E
DEPS-NEXT: class type = 0x1017, this type = 0x1018, this adjust = 0
DEPS-NEXT: calling conv = thiscall, options = None

View File

@ -0,0 +1,96 @@
; RUN: llvm-pdbutil pretty -module-syms -globals -types %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=NO_FILTER %s
; RUN: llvm-pdbutil pretty -types -exclude-types="GlobalTypedef|NestedTypedef" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_TYPEDEFS %s
; RUN: llvm-pdbutil pretty -classes -enums %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=EXCLUDE_TYPEDEFS %s
; RUN: llvm-pdbutil pretty -types -exclude-types="GlobalEnum|NestedEnum" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_ENUMS %s
; RUN: llvm-pdbutil pretty -classes -typedefs %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=EXCLUDE_ENUMS %s
; RUN: llvm-pdbutil pretty -types -module-syms -globals -exclude-symbols="MemberVar|GlobalVar" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_VARS %s
; RUN: llvm-pdbutil pretty -types -exclude-types="FilterTestClass" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_WHOLE_CLASS %s
; RUN: llvm-pdbutil pretty -module-syms -globals -exclude-compilands="FilterTest.obj" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=EXCLUDE_COMPILAND %s
; RUN: llvm-pdbutil pretty -types -include-types="FilterTestClass" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=INCLUDE_ONLY_TYPES %s
; RUN: llvm-pdbutil pretty -types -module-syms -globals -include-symbols="[[:<:]](IntGlobalVar|DoubleGlobalVar)[[:>:]]" \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=INCLUDE_ONLY_VARS %s
; NO_FILTER: ---TYPES---
; NO_FILTER: Enums:
; NO_FILTER: enum GlobalEnum
; NO_FILTER: Typedefs
; NO_FILTER: typedef int GlobalTypedef
; NO_FILTER: Classes:
; NO_FILTER: struct __vc_attributes
; NO_FILTER: class FilterTestClass
; NO_FILTER-DAG: typedef int NestedTypedef
; NO_FILTER-DAG: enum NestedEnum
; NO_FILTER-DAG: int IntMemberVar
; NO_FILTER-DAG: double DoubleMemberVar
; NO_FILTER: ---SYMBOLS---
; NO_FILTER: Inputs\FilterTest.obj
; NO_FILTER: int __cdecl main(int argc, char** argv)
; NO_FILTER: ---GLOBALS---
; NO_FILTER-DAG: double DoubleGlobalVar
; NO_FILTER-DAG: int IntGlobalVar
; NO_FILTER-DAG: GlobalEnum GlobalEnumVar
; EXCLUDE_TYPEDEFS: ---TYPES---
; EXCLUDE_TYPEDEFS-NOT: GlobalTypedef
; EXCLUDE_TYPEDEFS-NOT: NestedTypedef
; EXCLUDE_TYPEDEFS-DAG: GlobalEnum
; EXCLUDE_TYPEDEFS-DAG: NestedEnum
; EXCLUDE_TYPEDEFS: class FilterTestClass
; EXCLUDE_ENUMS: ---TYPES---
; EXCLUDE_ENUMS-NOT: GlobalEnum
; EXCLUDE_ENUMS-NOT: NestedEnum
; EXCLUDE_ENUMS: GlobalTypedef
; EXCLUDE_ENUMS: class FilterTestClass
; EXCLUDE_VARS: ---TYPES---
; EXCLUDE_VARS-NOT: IntMemberVar
; EXCLUDE_VARS-NOT: DoubleMemberVar
; EXCLUDE_VARS-DAG: GlobalEnum
; EXCLUDE_VARS-DAG: NestedEnum
; EXCLUDE_VARS: GlobalTypedef
; EXCLUDE_VARS: class FilterTestClass
; EXCLUDE_VARS: ---GLOBALS---
; EXCLUDE_VARS-NOT: DoubleGlobalVar
; EXCLUDE_VARS-NOT: IntGlobalVar
; EXCLUDE_WHOLE_CLASS: ---TYPES---
; EXCLUDE_WHOLE_CLASS-NOT: class FilterTestClass
; EXCLUDE_WHOLE_CLASS-NOT: typedef int NestedTypedef
; EXCLUDE_WHOLE_CLASS-NOT: enum NestedEnum
; EXCLUDE_WHOLE_CLASS-NOT: int IntMemberVar
; EXCLUDE_WHOLE_CLASS-NOT: double DoubleMemberVar
; EXCLUDE_COMPILAND: ---SYMBOLS---
; EXCLUDE_COMPILAND-NOT: FilterTest.obj
; EXCLUDE_COMPILAND-NOT: __cdecl main
; EXCLUDE_COMPILAND: * Linker *
; EXCLUDE_COMPILAND: ---GLOBALS---
; Everything but types are displayed normally. But FilterTestClass is
; the only type that should be displayed.
; INCLUDE_ONLY_TYPES: ---TYPES---
; INCLUDE_ONLY_TYPES-NOT: GlobalTypedef
; INCLUDE_ONLY_TYPES: class FilterTestClass
; We should only see DoubleGlobalVar and IntGlobalVar. This means that even
; variables printed in class definitions should be filtered out.
; INCLUDE_ONLY_VARS: ---TYPES---
; INCLUDE_ONLY_VARS: class FilterTestClass
; INCLUDE_ONLY_VARS-NOT: IntMemberVar
; INCLUDE_ONLY_VARS-NOT: IntDoubleVar
; INCLUDE_ONLY_VARS: ---GLOBALS---
; INCLUDE_ONLY_VARS: DoubleGlobalVar
; INCLUDE_ONLY_VARS: IntGlobalVar

View File

@ -0,0 +1,125 @@
; RUN: llvm-pdbutil pretty -classes -class-definitions=layout \
; RUN: -include-types=SimplePad %p/Inputs/SimplePaddingTest.pdb > %t
; RUN: FileCheck -input-file=%t %s -check-prefix=NO_PADDING
; RUN: FileCheck -input-file=%t %s -check-prefix=UNION
; RUN: FileCheck -input-file=%t %s -check-prefix=NESTED_UNION
; RUN: FileCheck -input-file=%t %s -check-prefix=PAD_FROM_FIELDS1
; RUN: FileCheck -input-file=%t %s -check-prefix=PAD_FROM_FIELDS2
; RUN: FileCheck -input-file=%t %s -check-prefix=NO_PAD_IN_BASE
; RUN: FileCheck -input-file=%t %s -check-prefix=PAD_IN_DERIVED
; RUN: FileCheck -input-file=%t %s -check-prefix=EMPTY_BASE
; RUN: FileCheck -input-file=%t %s -check-prefix=VFPTR
; RUN: FileCheck -input-file=%t %s -check-prefix=MULTIPLE_INHERIT
; RUN: FileCheck -input-file=%t %s -check-prefix=MULTIPLE_INHERIT2
; RUN: FileCheck -input-file=%t %s -check-prefix=DEEP_INHERIT
; RUN: FileCheck -input-file=%t %s -check-prefix=AGGREGATE
; NO_PADDING: struct SimplePadNoPadding [sizeof = 8] {
; NO_PADDING-NEXT: data +0x00 [sizeof=4] int X
; NO_PADDING-NEXT: data +0x04 [sizeof=4] int Y
; NO_PADDING-NEXT: }
; UNION: struct SimplePadUnion [sizeof = 16] {
; UNION-NEXT: data +0x00 [sizeof=4] int X
; UNION-NEXT: data +0x00 [sizeof=8] __int64 Y
; UNION-NEXT: data +0x00 [sizeof=16] SimplePadUnion::
; UNION-NEXT: data +0x00 [sizeof=4] int X
; UNION-NEXT: <padding> (4 bytes)
; UNION-NEXT: data +0x08 [sizeof=8] __int64 Y
; UNION-NEXT: }
; NESTED_UNION: struct {{SimplePadUnion::.*}} [sizeof = 16] {
; NESTED_UNION-NEXT: data +0x00 [sizeof=4] int X
; NESTED_UNION-NEXT: <padding> (4 bytes)
; NESTED_UNION-NEXT: data +0x08 [sizeof=8] __int64 Y
; NESTED_UNION-NEXT: }
; PAD_FROM_FIELDS1: struct SimplePadFields1 [sizeof = 4] {
; PAD_FROM_FIELDS1-NEXT: data +0x00 [sizeof=1] char A
; PAD_FROM_FIELDS1-NEXT: data +0x01 [sizeof=1] char B
; PAD_FROM_FIELDS1-NEXT: data +0x02 [sizeof=1] char C
; PAD_FROM_FIELDS1-NEXT: <padding> (1 bytes)
; PAD_FROM_FIELDS1-NEXT: }
; PAD_FROM_FIELDS2: struct SimplePadFields2 [sizeof = 8] {
; PAD_FROM_FIELDS2-NEXT: data +0x00 [sizeof=4] int Y
; PAD_FROM_FIELDS2-NEXT: data +0x04 [sizeof=1] char X
; PAD_FROM_FIELDS2-NEXT: <padding> (3 bytes)
; PAD_FROM_FIELDS2-NEXT: }
; NO_PAD_IN_BASE: struct SimplePadBase [sizeof = 4] {
; NO_PAD_IN_BASE-NEXT: data +0x00 [sizeof=4] int X
; NO_PAD_IN_BASE-NEXT: }
; PAD_IN_DERIVED: struct SimplePadDerived [sizeof = 16]
; PAD_IN_DERIVED-NEXT: : public SimplePadBase {
; PAD_IN_DERIVED-NEXT: base +0x00 [sizeof=4] SimplePadBase
; PAD_IN_DERIVED-NEXT: data +0x00 [sizeof=4] int X
; PAD_IN_DERIVED-NEXT: <padding> (4 bytes)
; PAD_IN_DERIVED-NEXT: data +0x08 [sizeof=8] __int64 Y
; PAD_IN_DERIVED-NEXT: }
; EMPTY_BASE: struct SimplePadEmpty [sizeof = 8]
; EMPTY_BASE-NEXT: : public SimplePadEmptyBase1
; EMPTY_BASE-NEXT: , public SimplePadEmptyBase2 {
; EMPTY_BASE-NEXT: base +0x00 [sizeof=1] SimplePadEmptyBase1
; EMPTY_BASE-NEXT: base +0x01 [sizeof=1] SimplePadEmptyBase2
; EMPTY_BASE-NEXT: <padding> (2 bytes)
; EMPTY_BASE-NEXT: data +0x04 [sizeof=4] int X
; EMPTY_BASE-NEXT: }
; VFPTR: struct SimplePadVfptr [sizeof = 8] {
; VFPTR-NEXT: vfptr +0x00 [sizeof=4]
; VFPTR-NEXT: data +0x04 [sizeof=4] int X
; VFPTR-NEXT: }
; MULTIPLE_INHERIT: struct SimplePadMultiInherit [sizeof = 8]
; MULTIPLE_INHERIT-NEXT: : public NonEmptyBase1
; MULTIPLE_INHERIT-NEXT: , public NonEmptyBase2 {
; MULTIPLE_INHERIT-NEXT: base +0x00 [sizeof=1] NonEmptyBase1
; MULTIPLE_INHERIT-NEXT: data +0x00 [sizeof=1] bool X
; MULTIPLE_INHERIT-NEXT: base +0x01 [sizeof=1] NonEmptyBase2
; MULTIPLE_INHERIT-NEXT: data +0x01 [sizeof=1] bool Y
; MULTIPLE_INHERIT-NEXT: <padding> (2 bytes)
; MULTIPLE_INHERIT-NEXT: data +0x04 [sizeof=4] int X
; MULTIPLE_INHERIT-NEXT: }
; MULTIPLE_INHERIT2: SimplePadMultiInherit2 [sizeof = 16]
; MULTIPLE_INHERIT2-NEXT: : public SimplePadFields1
; MULTIPLE_INHERIT2-NEXT: , public SimplePadFields2 {
; MULTIPLE_INHERIT2-NEXT: base +0x00 [sizeof=3] SimplePadFields1
; MULTIPLE_INHERIT2-NEXT: data +0x00 [sizeof=1] char A
; MULTIPLE_INHERIT2-NEXT: data +0x01 [sizeof=1] char B
; MULTIPLE_INHERIT2-NEXT: data +0x02 [sizeof=1] char C
; MULTIPLE_INHERIT2-NEXT: <padding> (1 bytes)
; MULTIPLE_INHERIT2-NEXT: base +0x04 [sizeof=5] SimplePadFields2
; MULTIPLE_INHERIT2-NEXT: data +0x04 [sizeof=4] int Y
; MULTIPLE_INHERIT2-NEXT: data +0x08 [sizeof=1] char X
; MULTIPLE_INHERIT2-NEXT: <padding> (3 bytes)
; MULTIPLE_INHERIT2-NEXT: data +0x0c [sizeof=4] int X
; MULTIPLE_INHERIT2-NEXT: }
; DEEP_INHERIT: struct SimplePadTwoLevelInherit [sizeof = 16]
; DEEP_INHERIT-NEXT: : public OneLevelInherit {
; DEEP_INHERIT-NEXT: base +0x00 [sizeof=4] OneLevelInherit
; DEEP_INHERIT-NEXT: base +0x00 [sizeof=1] NonEmptyBase1
; DEEP_INHERIT-NEXT: data +0x00 [sizeof=1] bool X
; DEEP_INHERIT-NEXT: <padding> (1 bytes)
; DEEP_INHERIT-NEXT: data +0x02 [sizeof=2] short Y
; DEEP_INHERIT-NEXT: <padding> (4 bytes)
; DEEP_INHERIT-NEXT: data +0x08 [sizeof=8] __int64 Z
; DEEP_INHERIT-NEXT: }
; AGGREGATE: struct SimplePadAggregate [sizeof = 12] {
; AGGREGATE-NEXT: data +0x00 [sizeof=1] NonEmptyBase1 X
; AGGREGATE-NEXT: data +0x00 [sizeof=1] bool X
; AGGREGATE-NEXT: <padding> (3 bytes)
; AGGREGATE-NEXT: data +0x04 [sizeof=4] int Y
; AGGREGATE-NEXT: data +0x08 [sizeof=4] SimplePadFields1 Fields
; AGGREGATE-NEXT: data +0x08 [sizeof=1] char A
; AGGREGATE-NEXT: data +0x09 [sizeof=1] char B
; AGGREGATE-NEXT: data +0x0a [sizeof=1] char C
; AGGREGATE-NEXT: <padding> (1 bytes)
; AGGREGATE-NEXT: }

View File

@ -0,0 +1,74 @@
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=data %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=ONLY_DATA %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=thunks %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=ONLY_THUNKS %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=funcs %p/Inputs/FilterTest.pdb \
; RUN: | FileCheck --check-prefix=ONLY_FUNCS %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=funcs -sym-types=data \
; RUN: %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=TWO_TYPES %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=data \
; RUN: -symbol-order=name %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=NAME_SORT_DATA %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=data \
; RUN: -symbol-order=size %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=SIZE_SORT_DATA %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=funcs \
; RUN: -symbol-order=name %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=NAME_SORT_FUNCS %s
; RUN: llvm-pdbutil pretty -globals -module-syms -sym-types=funcs \
; RUN: -symbol-order=size %p/Inputs/FilterTest.pdb | FileCheck --check-prefix=SIZE_SORT_FUNCS %s
; ONLY_DATA-NOT: func
; ONLY_DATA-NOT: thunk
; ONLY_DATA-DAG: data {{.*}} static char OneByte
; ONLY_DATA-DAG: data {{.*}} static double DoubleGlobalVar
; ONLY_DATA-DAG: data {{.*}} static char TwoBytes[2]
; ONLY_DATA-DAG: data {{.*}} static char ThreeBytes[3]
; ONLY_DATA-DAG: data {{.*}} static int IntGlobalVar
; ONLY_DATA-DAG: data {{.*}} static GlobalEnum GlobalEnumVar
; ONLY_FUNCS-NOT: data
; ONLY_FUNCS-NOT: thunk
; ONLY_FUNCS: func {{.*}} int __cdecl main(int argc, char** argv)
; ONLY_FUNCS: func {{.*}} int __cdecl CFunc()
; ONLY_FUNCS: func {{.*}} int __cdecl BFunc()
; ONLY_FUNCS: func {{.*}} int __cdecl AFunc()
; ONLY_FUNCS: func {{.*}} int FilterTestClass::foo()
; ONLY_THUNKS-NOT: func
; ONLY_THUNKS-NOT: data
; ONLY_THUNKS-DAG: thunk {{.*}} (TrampIncremental)
; TWO_TYPES-NOT: thunk
; TWO_TYPES-DAG: func {{.*}} int __cdecl main(int argc, char** argv)
; TWO_TYPES-DAG: data {{.*}} static double DoubleGlobalVar
; NAME_SORT_DATA: data {{.*}} static double DoubleGlobalVar
; NAME_SORT_DATA: data {{.*}} static GlobalEnum GlobalEnumVar
; NAME_SORT_DATA: data {{.*}} static int IntGlobalVar
; NAME_SORT_DATA: data {{.*}} static char OneByte
; NAME_SORT_DATA: data {{.*}} static char ThreeBytes[3]
; NAME_SORT_DATA: data {{.*}} static char TwoBytes[2]
; SIZE_SORT_DATA: data {{.*}}sizeof=8{{.*}}double DoubleGlobalVar
; SIZE_SORT_DATA-DAG: data {{.*}}sizeof=4{{.*}}GlobalEnum GlobalEnumVar
; SIZE_SORT_DATA-DAG: data {{.*}}sizeof=4{{.*}}int IntGlobalVar
; SIZE_SORT_DATA: data {{.*}}sizeof=3{{.*}}char ThreeBytes[3]
; SIZE_SORT_DATA: data {{.*}}sizeof=2{{.*}}char TwoBytes[2]
; SIZE_SORT_DATA: data {{.*}}sizeof=1{{.*}}char OneByte
; NAME_SORT_FUNCS: func {{.*}}sizeof= 40{{.*}}AFunc
; NAME_SORT_FUNCS: func {{.*}}sizeof= 10{{.*}}BFunc
; NAME_SORT_FUNCS: func {{.*}}sizeof= 14{{.*}}CFunc
; NAME_SORT_FUNCS: func {{.*}}sizeof= 16{{.*}}FilterTestClass::foo
; NAME_SORT_FUNCS: func {{.*}}sizeof= 7{{.*}}main
; SIZE_SORT_FUNCS: func {{.*}}sizeof= 40{{.*}}AFunc
; SIZE_SORT_FUNCS: func {{.*}}sizeof= 16{{.*}}FilterTestClass::foo
; SIZE_SORT_FUNCS: func {{.*}}sizeof= 14{{.*}}CFunc
; SIZE_SORT_FUNCS: func {{.*}}sizeof= 10{{.*}}BFunc
; SIZE_SORT_FUNCS: func {{.*}}sizeof= 7{{.*}}main