[Lldb-commits] [lldb] r346430 - Fix bug in PE/COFF plugin and ValueObjectVariable.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Thu Nov 8 10:50:31 PST 2018


Author: zturner
Date: Thu Nov  8 10:50:31 2018
New Revision: 346430

URL: http://llvm.org/viewvc/llvm-project?rev=346430&view=rev
Log:
Fix bug in PE/COFF plugin and ValueObjectVariable.

There are two bugs here.  The first is that MSVC and clang-cl
emit their bss section under the name '.data' instead of '.bss'
but with the size and file offset set to 0.  ObjectFilePECOFF
didn't handle this, and would only recognize a section as bss
if it was actually called '.bss'.  The effect of this is that
if we tried to print the value of a variable that lived in BSS
we would fail.

The second bug is that ValueObjectVariable was only returning
the forward type, which is insufficient to print the value of an
enum.  So we bump this up to the layout type.

Differential Revision: https://reviews.llvm.org/D54241

Added:
    lldb/trunk/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit
    lldb/trunk/lit/SymbolFile/NativePDB/globals-bss.cpp
Modified:
    lldb/trunk/lit/SymbolFile/NativePDB/ast-reconstruction.cpp
    lldb/trunk/source/Core/ValueObjectVariable.cpp
    lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp

Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit?rev=346430&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit Thu Nov  8 10:50:31 2018
@@ -0,0 +1,3 @@
+target variable GlobalVariable
+
+quit

Modified: lldb/trunk/lit/SymbolFile/NativePDB/ast-reconstruction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/ast-reconstruction.cpp?rev=346430&r1=346429&r2=346430&view=diff
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/ast-reconstruction.cpp (original)
+++ lldb/trunk/lit/SymbolFile/NativePDB/ast-reconstruction.cpp Thu Nov  8 10:50:31 2018
@@ -89,22 +89,23 @@ Anonymous<A::B::C<int>>::D AnonABCVoidD;
 // CHECK: (TrivialC) TC = {}
 // CHECK: (TrivialS) TS = {}
 // CHECK: (TrivialU) TU = {}
-// CHECK: (TrivialE) TE = <Unable to determine byte size.>
-// CHECK: (A::B::C<int>) ABCInt = (ABCMember = <read memory from {{.*}} failed>)
-// CHECK: (A::B::C<float>) ABCFloat = (ABCMember = <read memory from {{.*}} failed>)
-// CHECK: (A::B::C<void>) ABCVoid = (ABCSpecializationMember = <read memory from {{.*}} failed>)
+// CHECK: (TrivialE) TE = TE_A
+// CHECK: (A::B::C<int>) ABCInt = (ABCMember = 0)
+// CHECK: (A::B::C<float>) ABCFloat = (ABCMember = 0)
+// CHECK: (A::B::C<void>) ABCVoid = (ABCSpecializationMember = 0x0000000000000000)
 // CHECK: (A::C<0>) AC0 = {}
 // CHECK: (A::C<-1>) ACNeg1 = {}
-// CHECK: (A::C<0>::D) AC0D = (ACDMember = <read memory from {{.*}} failed>, CPtr = <read memory from {{.*}} failed>)
-// CHECK: (A::C<-1>::D) ACNeg1D = (ACDMember = <read memory from {{.*}} failed>, CPtr = <read memory from {{.*}} failed>)
+// CHECK: (A::C<0>::D) AC0D = (ACDMember = 0, CPtr = 0x0000000000000000)
+// CHECK: (A::C<-1>::D) ACNeg1D = (ACDMember = 0, CPtr = 0x0000000000000000)
 // CHECK: (A::D) AD = {}
-// CHECK: (A::D::E) ADE = (ADDMember = <read memory from {{.*}} failed>)
+// CHECK: (A::D::E) ADE = (ADDMember = 0)
 // CHECK: Dumping clang ast for 1 modules.
 // CHECK: TranslationUnitDecl {{.*}}
 // CHECK: |-CXXRecordDecl {{.*}} class TrivialC definition
 // CHECK: |-CXXRecordDecl {{.*}} struct TrivialS definition
 // CHECK: |-CXXRecordDecl {{.*}} union TrivialU definition
 // CHECK: |-EnumDecl {{.*}} TrivialE
+// CHECK: | `-EnumConstantDecl {{.*}} TE_A 'int'
 // CHECK: |-NamespaceDecl {{.*}} A
 // CHECK: | |-NamespaceDecl {{.*}} B
 // CHECK: | | |-CXXRecordDecl {{.*}} struct C<int> definition

Added: lldb/trunk/lit/SymbolFile/NativePDB/globals-bss.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/globals-bss.cpp?rev=346430&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/globals-bss.cpp (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/globals-bss.cpp Thu Nov  8 10:50:31 2018
@@ -0,0 +1,35 @@
+// clang-format off
+// REQUIRES: lld
+
+// Make sure we can read variables from BSS
+// RUN: clang-cl /Z7 /GS- /GR- /c /Fo%t.obj -- %s
+// RUN: lld-link /DEBUG /nodefaultlib /entry:main /OUT:%t.exe /PDB:%t.pdb -- %t.obj
+// RUN: llvm-readobj -s %t.exe | FileCheck --check-prefix=BSS %s
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb -f %t.exe -s \
+// RUN:     %p/Inputs/globals-bss.lldbinit 2>&1 | FileCheck %s
+
+int GlobalVariable = 0;
+
+int main(int argc, char **argv) {
+  return 0;
+}
+
+// BSS:       Section {
+// BSS:         Number: 3
+// BSS:         Name: .data
+// BSS-NEXT:    VirtualSize: 0x4
+// BSS-NEXT:    VirtualAddress:
+// BSS-NEXT:    RawDataSize: 0
+// BSS-NEXT:    PointerToRawData: 0x0
+// BSS-NEXT:    PointerToRelocations: 0x0
+// BSS-NEXT:    PointerToLineNumbers: 0x0
+// BSS-NEXT:    RelocationCount: 0
+// BSS-NEXT:    LineNumberCount: 0
+// BSS-NEXT:    Characteristics [ (0xC0000040)
+// BSS-NEXT:      IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+// BSS-NEXT:      IMAGE_SCN_MEM_READ (0x40000000)
+// BSS-NEXT:      IMAGE_SCN_MEM_WRITE (0x80000000)
+// BSS-NEXT:    ]
+// BSS-NEXT:  }
+
+// CHECK: (int) GlobalVariable = 0

Modified: lldb/trunk/source/Core/ValueObjectVariable.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectVariable.cpp?rev=346430&r1=346429&r2=346430&view=diff
==============================================================================
--- lldb/trunk/source/Core/ValueObjectVariable.cpp (original)
+++ lldb/trunk/source/Core/ValueObjectVariable.cpp Thu Nov  8 10:50:31 2018
@@ -66,9 +66,16 @@ ValueObjectVariable::~ValueObjectVariabl
 
 CompilerType ValueObjectVariable::GetCompilerTypeImpl() {
   Type *var_type = m_variable_sp->GetType();
-  if (var_type)
-    return var_type->GetForwardCompilerType();
-  return CompilerType();
+  if (!var_type)
+    return CompilerType();
+
+  // It's important to return the layout type here.  If we have an enum then the
+  // symbol file plugin may have decided to complete it lazily, in which case a
+  // forward type won't be sufficient to display the variable.  On the other
+  // hand, if we have a pointer to a class type, then getting the full type will
+  // resolve the class type, which is too much.  The layout type is both
+  // necessary and sufficient.
+  return var_type->GetLayoutCompilerType();
 }
 
 ConstString ValueObjectVariable::GetTypeName() {

Modified: lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp?rev=346430&r1=346429&r2=346430&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp Thu Nov  8 10:50:31 2018
@@ -710,7 +710,10 @@ void ObjectFilePECOFF::CreateSections(Se
                        llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA &&
                    ((const_sect_name == g_data_sect_name) ||
                     (const_sect_name == g_DATA_sect_name))) {
-          section_type = eSectionTypeData;
+          if (m_sect_headers[idx].size == 0 && m_sect_headers[idx].offset == 0)
+            section_type = eSectionTypeZeroFill;
+          else
+            section_type = eSectionTypeData;
         } else if (m_sect_headers[idx].flags &
                        llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA &&
                    ((const_sect_name == g_bss_sect_name) ||
@@ -1053,6 +1056,7 @@ ObjectFile::Type ObjectFilePECOFF::Calcu
 }
 
 ObjectFile::Strata ObjectFilePECOFF::CalculateStrata() { return eStrataUser; }
+
 //------------------------------------------------------------------
 // PluginInterface protocol
 //------------------------------------------------------------------




More information about the lldb-commits mailing list