[Lldb-commits] [lldb] r346511 - [NativePDB] Add support for bitfield records.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Fri Nov 9 08:29:20 PST 2018


Author: zturner
Date: Fri Nov  9 08:29:19 2018
New Revision: 346511

URL: http://llvm.org/viewvc/llvm-project?rev=346511&view=rev
Log:
[NativePDB] Add support for bitfield records.

Bitfields are represented as LF_MEMBER records whose TypeIndex
points to an LF_BITFIELD record that describes the bit width,
bit offset, and underlying type of the bitfield.  All we need to
do is resolve these when resolving record types.

Added:
    lldb/trunk/lit/SymbolFile/NativePDB/Inputs/bitfields.lldbinit
    lldb/trunk/lit/SymbolFile/NativePDB/bitfields.cpp
Modified:
    lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp

Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/bitfields.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/bitfields.lldbinit?rev=346511&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/bitfields.lldbinit (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/bitfields.lldbinit Fri Nov  9 08:29:19 2018
@@ -0,0 +1,5 @@
+settings set auto-one-line-summaries false
+
+target variable -T TheStruct
+
+target modules dump ast

Added: lldb/trunk/lit/SymbolFile/NativePDB/bitfields.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/bitfields.cpp?rev=346511&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/bitfields.cpp (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/bitfields.cpp Fri Nov  9 08:29:19 2018
@@ -0,0 +1,61 @@
+// clang-format off
+// REQUIRES: lld
+
+// Test various interesting cases for AST reconstruction.
+// RUN: clang-cl /Z7 /GS- /GR- /std:c++latest -Xclang -fkeep-static-consts /c /Fo%t.obj -- %s
+// RUN: lld-link /DEBUG /nodefaultlib /entry:main /OUT:%t.exe /PDB:%t.pdb -- %t.obj
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb -f %t.exe -s \
+// RUN:     %p/Inputs/bitfields.lldbinit 2>&1 | FileCheck %s
+
+// Test trivial versions of each tag type.
+struct Struct {
+  int A : 5 = 6;
+  int B : 7 = 8;
+  unsigned C : 3 = 2;
+  unsigned D : 15 = 12345;
+  char E : 1 = 0;
+  char F : 2 = 1;
+  char G : 3 = 2;
+  // H should be at offset 0 of a new byte.
+  char H : 3 = 3;
+};
+
+constexpr Struct TheStruct;
+
+
+int main(int argc, char **argv) {
+  return TheStruct.A;
+}
+
+// CHECK: (lldb) target variable -T TheStruct
+// CHECK: (const Struct) TheStruct = {
+// CHECK:   (int:5) A = 6
+// CHECK:   (int:7) B = 8
+// CHECK:   (unsigned int:3) C = 2
+// CHECK:   (unsigned int:15) D = 12345
+// CHECK:   (char:1) E = '\0'
+// CHECK:   (char:2) F = '\x01'
+// CHECK:   (char:3) G = '\x02'
+// CHECK:   (char:3) H = '\x03'
+// CHECK: }
+//
+// CHECK: target modules dump ast
+// CHECK: Dumping clang ast for 1 modules.
+// CHECK: TranslationUnitDecl {{.*}}
+// CHECK: |-CXXRecordDecl {{.*}} struct Struct definition
+// CHECK: | |-FieldDecl {{.*}} A 'int'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 5
+// CHECK: | |-FieldDecl {{.*}} B 'int'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 7
+// CHECK: | |-FieldDecl {{.*}} C 'unsigned int'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3
+// CHECK: | |-FieldDecl {{.*}} D 'unsigned int'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 15
+// CHECK: | |-FieldDecl {{.*}} E 'char'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 1
+// CHECK: | |-FieldDecl {{.*}} F 'char'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 2
+// CHECK: | |-FieldDecl {{.*}} G 'char'
+// CHECK: | | `-IntegerLiteral {{.*}} 'int' 3
+// CHECK: | `-FieldDecl {{.*}} H 'char'
+// CHECK: |   `-IntegerLiteral {{.*}} 'int' 3

Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp?rev=346511&r1=346510&r2=346511&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp Fri Nov  9 08:29:19 2018
@@ -123,17 +123,33 @@ Error UdtRecordCompleter::visitKnownMemb
 Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr,
                                            DataMemberRecord &data_member) {
 
-  TypeSP member_type = m_symbol_file.GetOrCreateType(data_member.Type);
-  CompilerType complete_member_type = member_type->GetFullCompilerType();
+  uint64_t offset = data_member.FieldOffset * 8;
+  uint32_t bitfield_width = 0;
+
+  TypeSP member_type;
+  TpiStream &tpi = m_symbol_file.m_index->tpi();
+  TypeIndex ti(data_member.Type);
+  if (!ti.isSimple()) {
+    CVType cvt = tpi.getType(ti);
+    if (cvt.kind() == LF_BITFIELD) {
+      BitFieldRecord bfr;
+      llvm::cantFail(TypeDeserializer::deserializeAs<BitFieldRecord>(cvt, bfr));
+      offset += bfr.BitOffset;
+      bitfield_width = bfr.BitSize;
+      ti = bfr.Type;
+    }
+  }
 
+  member_type = m_symbol_file.GetOrCreateType(ti);
+  CompilerType complete_member_type = member_type->GetFullCompilerType();
   lldb::AccessType access = TranslateMemberAccess(data_member.getAccess());
 
   clang::FieldDecl *decl = ClangASTContext::AddFieldToRecordType(
-      m_derived_ct, data_member.Name, complete_member_type, access, 0);
+      m_derived_ct, data_member.Name, complete_member_type, access,
+      bitfield_width);
   // FIXME: Add a PdbSymUid namespace for field list members and update
   // the m_uid_to_decl map with this decl.
 
-  uint64_t offset = data_member.FieldOffset * 8;
   m_layout.field_offsets.insert(std::make_pair(decl, offset));
 
   return Error::success();




More information about the lldb-commits mailing list