[llvm-pdbdump] Many minor fixes and improvements

A short list of some of the improvements:

1) Now supports -all command line argument, which implies many
   other command line arguments to simplify usage.
2) Now supports -no-compiler-generated command line argument to
   exclude compiler generated types.
3) Prints base class list.
4) -class-definitions implies -types.
5) Proper display of bitfields.
6) Can now distinguish between struct/class/interface/union.

And a few other minor tweaks.

llvm-svn: 230933
diff --git a/llvm/test/DebugInfo/PDB/pdbdump-symbol-format.test b/llvm/test/DebugInfo/PDB/pdbdump-symbol-format.test
index a34d46d..90381f1 100644
--- a/llvm/test/DebugInfo/PDB/pdbdump-symbol-format.test
+++ b/llvm/test/DebugInfo/PDB/pdbdump-symbol-format.test
@@ -30,13 +30,13 @@
 
 ; FULL_CLASS: ---TYPES---
 ; FULL_CLASS: Classes
-; FULL_CLASS-DAG: class A {
+; FULL_CLASS-DAG: struct A {
 ; FULL_CLASS: public:
 ; FULL_CLASS: virtual void PureFunc() = 0
 ; FULL_CLASS: virtual void VirtualFunc()
 ; FULL_CLASS: void RegularFunc()
 ; FULL_CLASS: }
-; FULL_CLASS-DAG: class MemberTest {
+; FULL_CLASS-DAG: struct MemberTest {
 ; FULL_CLASS: data +0x00 MemberTest::NestedEnum m_nested_enum
 ; FULL_CLASS: data +0x04 int m_typedef
 ; FULL_CLASS: data +0x08 bool m_bool
diff --git a/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.cpp b/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.cpp
new file mode 100644
index 0000000..51c1b9b
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.cpp
@@ -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;

+}

diff --git a/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.pdb b/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.pdb
new file mode 100644
index 0000000..5f5190d
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbdump/Inputs/ClassLayoutTest.pdb
Binary files differ
diff --git a/llvm/test/tools/llvm-pdbdump/class-layout.test b/llvm/test/tools/llvm-pdbdump/class-layout.test
new file mode 100644
index 0000000..c46e62b
--- /dev/null
+++ b/llvm/test/tools/llvm-pdbdump/class-layout.test
@@ -0,0 +1,57 @@
+; RUN: llvm-pdbdump -all %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 {

+; MEMBERS_TEST-DAG: typedef int NestedTypedef

+; MEMBERS_TEST-DAG: enum NestedEnum

+; MEMBERS_TEST: public:

+; MEMBERS_TEST-NEXT: void MemberFunc()

+; MEMBERS_TEST-NEXT: private:

+; MEMBERS_TEST-DAG: int IntMemberVar

+; MEMBERS_TEST-DAG: double DoubleMemberVar

+; MEMBERS_TEST: }

+

+; BASE_CLASS_A: ---TYPES---

+; BASE_CLASS_A: class BaseClassTest::A {}

+

+; BASE_CLASS_B: ---TYPES---

+; BASE_CLASS_B: class BaseClassTest::B

+; BASE_CLASS_B-NEXT: : public virtual BaseClassTest::A {

+

+; BASE_CLASS_C: ---TYPES---

+; BASE_CLASS_C: class BaseClassTest::C

+; BASE_CLASS_C-NEXT: : public virtual BaseClassTest::A {

+

+; BASE_CLASS_D: ---TYPES---

+; BASE_CLASS_D: class BaseClassTest::D

+; BASE_CLASS_D-DAG: protected BaseClassTest::B

+; BASE_CLASS_D-DAG: private BaseClassTest::C

+; BASE_CLASS_D-DAG: protected virtual BaseClassTest::A

+

+; UDT_KIND_TEST: ---TYPES---

+; UDT_KIND_TEST-DAG: union UdtKindTest::C {}

+; UDT_KIND_TEST-DAG: class UdtKindTest::B {}

+; UDT_KIND_TEST-DAG: struct UdtKindTest::A {}

+

+; BITFIELD_TEST: ---TYPES---

+; BITFIELD_TEST: struct BitFieldTest::A {

+; BITFIELD_TEST-NEXT: public:

+; BITFIELD_TEST-NEXT: +0x00 int Bits1 : 1

+; BITFIELD_TEST-NEXT: +0x00 int Bits2 : 2

+; BITFIELD_TEST-NEXT: +0x00 int Bits3 : 3

+; BITFIELD_TEST-NEXT: +0x00 int Bits4 : 4

+; BITFIELD_TEST-NEXT: +0x00 int Bits22 : 22

+; BITFIELD_TEST-NEXT: +0x04 int Offset0x04

diff --git a/llvm/test/tools/llvm-pdbdump/regex-filter.test b/llvm/test/tools/llvm-pdbdump/regex-filter.test
index 5f08d73..a0ad176 100644
--- a/llvm/test/tools/llvm-pdbdump/regex-filter.test
+++ b/llvm/test/tools/llvm-pdbdump/regex-filter.test
@@ -18,7 +18,7 @@
 ; NO_FILTER: Typedefs
 ; NO_FILTER: typedef int GlobalTypedef
 ; NO_FILTER: Classes:
-; NO_FILTER: class __vc_attributes
+; NO_FILTER: struct __vc_attributes
 ; NO_FILTER: class FilterTestClass
 ; NO_FILTER-DAG: typedef int NestedTypedef
 ; NO_FILTER-DAG: enum NestedEnum