[llvm] r269778 - [codeview] Test serialization of all known type records

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 09:20:36 PDT 2016


Author: rnk
Date: Tue May 17 11:20:35 2016
New Revision: 269778

URL: http://llvm.org/viewvc/llvm-project?rev=269778&view=rev
Log:
[codeview] Test serialization of all known type records

This just checks that we emit all type records once, and then after
merging the type stream with no other type streams, we still emit every
kind of type record.

We could test the dumper output more closely, but that would make the
test very brittle. Currently we're just getting coverage.

Added:
    llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-types.obj
    llvm/trunk/test/tools/llvm-readobj/codeview-types.test
Modified:
    llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h
    llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h
    llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h?rev=269778&r1=269777&r2=269778&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/FieldListRecordBuilder.h Tue May 17 11:20:35 2016
@@ -47,6 +47,8 @@ private:
 public:
   FieldListRecordBuilder();
 
+  void reset() { ListRecordBuilder::reset(TypeRecordKind::FieldList); }
+
   void writeBaseClass(const BaseClassRecord &Record);
   void writeEnumerator(const EnumeratorRecord &Record);
   void writeDataMember(const DataMemberRecord &Record);

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h?rev=269778&r1=269777&r2=269778&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/ListRecordBuilder.h Tue May 17 11:20:35 2016
@@ -28,7 +28,7 @@ protected:
 public:
   llvm::StringRef str() { return Builder.str(); }
 
-  void reset() { Builder.reset(); }
+  void reset(TypeRecordKind K) { Builder.reset(K); }
 
 protected:
   void finishSubRecord();

Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h?rev=269778&r1=269777&r2=269778&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/CodeView/TypeRecordBuilder.h Tue May 17 11:20:35 2016
@@ -47,7 +47,10 @@ public:
 
   uint64_t size() const { return Stream.tell(); }
 
-  void reset() { Buffer.clear(); }
+  void reset(TypeRecordKind K) {
+    Buffer.clear();
+    writeTypeRecordKind(K);
+  }
 
 private:
   llvm::SmallVector<char, 256> Buffer;

Modified: llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp?rev=269778&r1=269777&r2=269778&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp (original)
+++ llvm/trunk/lib/DebugInfo/CodeView/TypeStreamMerger.cpp Tue May 17 11:20:35 2016
@@ -111,14 +111,14 @@ void TypeStreamMerger::visitFieldList(Ty
 #define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
   void TypeStreamMerger::visit##Name(TypeLeafKind LeafType,                    \
                                      Name##Record &Record) {                   \
-    FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);              \
+    FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);                   \
     IndexMap.push_back(DestStream.write##Name(Record));                        \
   }
 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
 #define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
   void TypeStreamMerger::visit##Name(TypeLeafKind LeafType,                    \
                                      Name##Record &Record) {                   \
-    FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);              \
+    FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);                   \
     FieldBuilder.write##Name(Record);                                          \
   }
 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)

Added: llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-types.obj
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-types.obj?rev=269778&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-types.obj (added) and llvm/trunk/test/tools/llvm-readobj/Inputs/codeview-types.obj Tue May 17 11:20:35 2016 differ

Added: llvm/trunk/test/tools/llvm-readobj/codeview-types.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/codeview-types.test?rev=269778&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/codeview-types.test (added)
+++ llvm/trunk/test/tools/llvm-readobj/codeview-types.test Tue May 17 11:20:35 2016
@@ -0,0 +1,95 @@
+// This tests that we can deserialize and reserialize every known type record.
+// If you need to update the object file, enable the RUNX line below using MSVC
+// from VS 2012. Newer versions of MSVC emit tons of internal types for
+// attributes that pollute the test output. When Clang fully supports all these
+// type records, we can regenerate the test using it instead.
+
+// RUNX: cl -GR- -Z7 -c -TP %s -Fo%S/Inputs/codeview-types.obj
+// RUN: llvm-readobj -codeview %S/Inputs/codeview-types.obj | FileCheck %s
+// RUN: llvm-readobj -codeview-merged-types %S/Inputs/codeview-types.obj | FileCheck %s
+
+// TYPE_RECORD
+// CHECK-DAG: {{^ *Pointer (.*) {$}}
+// CHECK-DAG: {{^ *Modifier (.*) {$}}
+// CHECK-DAG: {{^ *Procedure (.*) {$}}
+// CHECK-DAG: {{^ *MemberFunction (.*) {$}}
+// CHECK-DAG: {{^ *ArgList (.*) {$}}
+// CHECK-DAG: {{^ *Array (.*) {$}}
+// CHECK-DAG: {{^ *Class (.*) {$}}
+// CHECK-DAG: {{^ *Union (.*) {$}}
+// CHECK-DAG: {{^ *Enum (.*) {$}}
+// CHECK-DAG: {{^ *VFTable (.*) {$}}
+// CHECK-DAG: {{^ *VFTableShape (.*) {$}}
+// CHECK-DAG: {{^ *FuncId (.*) {$}}
+// CHECK-DAG: {{^ *MemberFuncId (.*) {$}}
+// CHECK-DAG: {{^ *BuildInfo (.*) {$}}
+// CHECK-DAG: {{^ *StringId (.*) {$}}
+// CHECK-DAG: {{^ *UdtSourceLine (.*) {$}}
+// CHECK-DAG: {{^ *MethodOverloadList (.*) {$}}
+// No TypeServer2, since that is used with /Zi
+
+// MEMBER_RECORD
+// CHECK-DAG: {{^ *BaseClass {$}}
+// CHECK-DAG: {{^ *VirtualBaseClass {$}}
+// CHECK-DAG: {{^ *VFPtr {$}}
+// CHECK-DAG: {{^ *StaticDataMember {$}}
+// CHECK-DAG: {{^ *OverloadedMethod {$}}
+// CHECK-DAG: {{^ *DataMember {$}}
+// CHECK-DAG: {{^ *NestedType {$}}
+// CHECK-DAG: {{^ *OneMethod {$}}
+// CHECK-DAG: {{^ *Enumerator {$}}
+
+#if !defined(__clang__) && _MSC_VER >= 1800
+#error "use clang or MSVC 2012 to regenerate the test"
+#endif
+
+struct VBaseA;
+void FriendFunc();
+
+class Class {
+public:
+  const Class *DataMember;
+private:
+  static int StaticDataMember;
+protected:
+  virtual void MemberFunction();
+public:
+  struct Nested;
+  friend ::VBaseA;
+  friend void FriendFunc() { }
+  void OverloadedMethod();
+  void OverloadedMethod(int);
+};
+
+enum Enum {
+  E1 = 0,
+  E2 = 1
+};
+
+int array[4] = {1, 2, 3, 4};
+
+struct Class::Nested {};
+
+struct ClassWithBase : Class {
+  virtual void MemberFunction();
+  virtual void NewVirtual();
+};
+struct VBaseA { int x; };
+struct VBaseB : virtual VBaseA { int x; };
+struct VBaseC : virtual VBaseA { int x; };
+struct VBaseD : VBaseB, VBaseC { int x; };
+
+union Union {
+  float f;
+  int i;
+};
+
+void UseAllTypes() {
+  Class a;
+  Class::Nested b;
+  ClassWithBase c;
+  VBaseD d;
+  Union e;
+  Enum f;
+  FriendFunc();
+}




More information about the llvm-commits mailing list