mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
dsymutil: Don't prune forward declarations inside a module definition.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248428 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
557aebcdfa
commit
54a3f636d8
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -9,8 +9,8 @@
|
||||
export *
|
||||
}
|
||||
EOF
|
||||
clang -D BAR_H -E -o Bar.h
|
||||
clang -D FOO_H -E -o Foo.h
|
||||
clang -D BAR_H -E -o Bar.h modules.m
|
||||
clang -D FOO_H -E -o Foo.h modules.m
|
||||
clang -cc1 -emit-obj -fmodules -fmodule-map-file=modules.modulemap \
|
||||
-fmodule-format=obj -g -dwarf-ext-refs -fmodules-cache-path=. \
|
||||
-fdisable-module-hash modules.m -o 1.o
|
||||
@ -32,17 +32,22 @@
|
||||
// CHECK-NOT: DW_TAG
|
||||
// CHECK: DW_TAG_module
|
||||
// CHECK-NEXT: DW_AT_name{{.*}}"Bar"
|
||||
// CHECK-NOT: DW_TAG
|
||||
// CHECK: 0x0[[BAR:.*]]: DW_TAG_structure_type
|
||||
// CHECK-NOT: DW_TAG
|
||||
// CHECK: DW_AT_name {{.*}}"Bar"
|
||||
// CHECK-NOT: DW_TAG
|
||||
// CHECK: DW_TAG_member
|
||||
// CHECK: DW_AT_name {{.*}}"value"
|
||||
// CHECK: DW_TAG_structure_type
|
||||
// CHECK-NOT: DW_TAG
|
||||
// CHECK: DW_AT_name {{.*}}"PruneMeNot"
|
||||
|
||||
struct Bar {
|
||||
int value;
|
||||
};
|
||||
|
||||
struct PruneMeNot;
|
||||
|
||||
#else
|
||||
// ---------------------------------------------------------------------
|
||||
#ifdef FOO_H
|
||||
|
@ -1764,7 +1764,7 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
|
||||
DeclContext *CurrentDeclContext,
|
||||
NonRelocatableStringpool &StringPool,
|
||||
DeclContextTree &Contexts,
|
||||
bool InTagModule = false) {
|
||||
bool InImportedModule = false) {
|
||||
unsigned MyIdx = CU.getOrigUnit().getDIEIndex(DIE);
|
||||
CompileUnit::DIEInfo &Info = CU.getInfo(MyIdx);
|
||||
|
||||
@ -1780,11 +1780,14 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
|
||||
// definitions match)."
|
||||
//
|
||||
// We treat non-C++ modules like namespaces for this reason.
|
||||
if (DIE->getTag() == dwarf::DW_TAG_module)
|
||||
InTagModule = true;
|
||||
if (DIE->getTag() == dwarf::DW_TAG_module &&
|
||||
DIE->getAttributeValueAsString(&CU.getOrigUnit(), dwarf::DW_AT_name,
|
||||
"") != CU.getClangModuleName()) {
|
||||
InImportedModule = true;
|
||||
}
|
||||
|
||||
Info.ParentIdx = ParentIdx;
|
||||
if (CU.hasODR() || CU.isClangModule() || InTagModule) {
|
||||
if (CU.hasODR() || CU.isClangModule() || InImportedModule) {
|
||||
if (CurrentDeclContext) {
|
||||
auto PtrInvalidPair = Contexts.getChildDeclContext(*CurrentDeclContext,
|
||||
DIE, CU, StringPool);
|
||||
@ -1795,12 +1798,12 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
|
||||
Info.Ctxt = CurrentDeclContext = nullptr;
|
||||
}
|
||||
|
||||
Info.Prune = InTagModule;
|
||||
Info.Prune = InImportedModule;
|
||||
if (DIE->hasChildren())
|
||||
for (auto *Child = DIE->getFirstChild(); Child && !Child->isNULL();
|
||||
Child = Child->getSibling())
|
||||
Info.Prune &= analyzeContextInfo(Child, MyIdx, CU, CurrentDeclContext,
|
||||
StringPool, Contexts, InTagModule);
|
||||
StringPool, Contexts, InImportedModule);
|
||||
|
||||
// Prune this DIE if it is either a forward declaration inside a
|
||||
// DW_TAG_module or a DW_TAG_module that contains nothing but
|
||||
|
Loading…
Reference in New Issue
Block a user