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 §ion) { + 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