zturner updated this revision to Diff 173095.
zturner added a comment.

I added a test specifically for the bss bug.  Even though one of my existing 
broken tests became fixed, someone could come down the line and adjust the test 
and set one of the variables to 1 which would cause the data to go into a 
regular section.  To make sure this doesn't happen, I made a specific test just 
for this, and used `llvm-readobj` to also check that that the size of the 
section is in fact 0.  So this test will always fail if the section stops being 
a compressed bss section for whatever reason.


https://reviews.llvm.org/D54241

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

Index: lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
===================================================================
--- lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
+++ lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
@@ -125,6 +125,10 @@
 
   ObjectFile::Strata CalculateStrata() override;
 
+  size_t ReadSectionData(lldb_private::Section *section,
+                         lldb::offset_t section_offset, void *dst,
+                         size_t dst_len) override;
+
   //------------------------------------------------------------------
   // PluginInterface protocol
   //------------------------------------------------------------------
Index: lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
===================================================================
--- lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
+++ lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
@@ -1053,6 +1053,32 @@
 }
 
 ObjectFile::Strata ObjectFilePECOFF::CalculateStrata() { return eStrataUser; }
+
+static bool IsCompressedBss(const Section &section) {
+  if (section.GetName() != ConstString(".data"))
+    return false;
+  if (section.GetFileSize() != 0)
+    return false;
+  if (section.GetFileOffset() != 0)
+    return false;
+  return true;
+}
+
+size_t ObjectFilePECOFF::ReadSectionData(Section *section,
+                                         lldb::offset_t section_offset,
+                                         void *dst, size_t dst_len) {
+  if (!IsCompressedBss(*section))
+    return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
+
+  if (section_offset >= section->GetByteSize())
+    return 0;
+
+  size_t bytes_avail = section->GetByteSize() - section_offset;
+  size_t read_size = std::min(dst_len, bytes_avail);
+  ::memset(dst, 0, read_size);
+  return read_size;
+}
+
 //------------------------------------------------------------------
 // PluginInterface protocol
 //------------------------------------------------------------------
Index: lldb/source/Core/ValueObjectVariable.cpp
===================================================================
--- lldb/source/Core/ValueObjectVariable.cpp
+++ lldb/source/Core/ValueObjectVariable.cpp
@@ -67,7 +67,7 @@
 CompilerType ValueObjectVariable::GetCompilerTypeImpl() {
   Type *var_type = m_variable_sp->GetType();
   if (var_type)
-    return var_type->GetForwardCompilerType();
+    return var_type->GetFullCompilerType();
   return CompilerType();
 }
 
Index: lldb/lit/SymbolFile/NativePDB/globals-bss.cpp
===================================================================
--- /dev/null
+++ lldb/lit/SymbolFile/NativePDB/globals-bss.cpp
@@ -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-NEXT:    Number: 3
+// BSS-NEXT:    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
Index: lldb/lit/SymbolFile/NativePDB/ast-reconstruction.cpp
===================================================================
--- lldb/lit/SymbolFile/NativePDB/ast-reconstruction.cpp
+++ lldb/lit/SymbolFile/NativePDB/ast-reconstruction.cpp
@@ -89,22 +89,23 @@
 // 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
Index: lldb/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit
===================================================================
--- /dev/null
+++ lldb/lit/SymbolFile/NativePDB/Inputs/globals-bss.lldbinit
@@ -0,0 +1,3 @@
+target variable GlobalVariable
+
+quit
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to