forked from OSchip/llvm-project
Module debugging: Create a parent DIModule with the PCH name for types
emitted into a precompiled header to mirror the debug info emitted for object files importing the PCH. rdar://problem/24290667 llvm-svn: 258555
This commit is contained in:
parent
351164504a
commit
aa5d08d04b
|
|
@ -2224,8 +2224,12 @@ llvm::DIModule *CGDebugInfo::getParentModuleOrNull(const Decl *D) {
|
|||
// option.
|
||||
FullSourceLoc Loc(D->getLocation(), CGM.getContext().getSourceManager());
|
||||
if (Module *M = ClangModuleMap->inferModuleFromLocation(Loc)) {
|
||||
// This is a (sub-)module.
|
||||
auto Info = ExternalASTSource::ASTSourceDescriptor(*M);
|
||||
return getOrCreateModuleRef(Info, /*SkeletonCU=*/false);
|
||||
} else {
|
||||
// This the precompiled header being built.
|
||||
return getOrCreateModuleRef(PCHDescriptor, /*SkeletonCU=*/false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include "CGBuilder.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/AST/ExternalASTSource.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Frontend/CodeGenOptions.h"
|
||||
|
|
@ -57,6 +58,7 @@ class CGDebugInfo {
|
|||
llvm::DIBuilder DBuilder;
|
||||
llvm::DICompileUnit *TheCU = nullptr;
|
||||
ModuleMap *ClangModuleMap = nullptr;
|
||||
ExternalASTSource::ASTSourceDescriptor PCHDescriptor;
|
||||
SourceLocation CurLoc;
|
||||
llvm::DIType *VTablePtrType = nullptr;
|
||||
llvm::DIType *ClassTy = nullptr;
|
||||
|
|
@ -275,6 +277,8 @@ public:
|
|||
|
||||
void finalize();
|
||||
|
||||
/// Module debugging: Support for building PCMs.
|
||||
/// @{
|
||||
/// Set the main CU's DwoId field to \p Signature.
|
||||
void setDwoId(uint64_t Signature);
|
||||
|
||||
|
|
@ -283,6 +287,14 @@ public:
|
|||
/// the module of origin of each Decl.
|
||||
void setModuleMap(ModuleMap &MMap) { ClangModuleMap = &MMap; }
|
||||
|
||||
/// When generating debug information for a clang module or
|
||||
/// precompiled header, this module map will be used to determine
|
||||
/// the module of origin of each Decl.
|
||||
void setPCHDescriptor(ExternalASTSource::ASTSourceDescriptor PCH) {
|
||||
PCHDescriptor = PCH;
|
||||
}
|
||||
/// @}
|
||||
|
||||
/// Update the current source location. If \arg loc is invalid it is
|
||||
/// ignored.
|
||||
void setLocation(SourceLocation Loc);
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ namespace {
|
|||
class PCHContainerGenerator : public ASTConsumer {
|
||||
DiagnosticsEngine &Diags;
|
||||
const std::string MainFileName;
|
||||
const std::string OutputFileName;
|
||||
ASTContext *Ctx;
|
||||
ModuleMap &MMap;
|
||||
const HeaderSearchOptions &HeaderSearchOpts;
|
||||
|
|
@ -137,7 +138,8 @@ public:
|
|||
const std::string &OutputFileName,
|
||||
raw_pwrite_stream *OS,
|
||||
std::shared_ptr<PCHBuffer> Buffer)
|
||||
: Diags(CI.getDiagnostics()), Ctx(nullptr),
|
||||
: Diags(CI.getDiagnostics()), MainFileName(MainFileName),
|
||||
OutputFileName(OutputFileName), Ctx(nullptr),
|
||||
MMap(CI.getPreprocessor().getHeaderSearchInfo().getModuleMap()),
|
||||
HeaderSearchOpts(CI.getHeaderSearchOpts()),
|
||||
PreprocessorOpts(CI.getPreprocessorOpts()),
|
||||
|
|
@ -163,6 +165,8 @@ public:
|
|||
Builder.reset(new CodeGen::CodeGenModule(
|
||||
*Ctx, HeaderSearchOpts, PreprocessorOpts, CodeGenOpts, *M, Diags));
|
||||
Builder->getModuleDebugInfo()->setModuleMap(MMap);
|
||||
Builder->getModuleDebugInfo()->setPCHDescriptor(
|
||||
{MainFileName, "", OutputFileName, ~1ULL});
|
||||
}
|
||||
|
||||
bool HandleTopLevelDecl(DeclGroupRef D) override {
|
||||
|
|
|
|||
|
|
@ -10,13 +10,14 @@
|
|||
// RUN: -I %S/Inputs -I %t -emit-llvm -o %t.ll \
|
||||
// RUN: -mllvm -debug-only=pchcontainer &>%t-mod.ll
|
||||
// RUN: cat %t-mod.ll | FileCheck %s
|
||||
// RUN: cat %t-mod.ll | FileCheck %s --check-prefix=MODULE-CHECK
|
||||
// RUN: cat %t-mod.ll | FileCheck %s --check-prefix=CHECK2
|
||||
|
||||
// PCH:
|
||||
// RUN: %clang_cc1 -x objective-c -emit-pch -fmodule-format=obj -I %S/Inputs \
|
||||
// RUN: -o %t.pch %S/Inputs/DebugObjC.h \
|
||||
// RUN: -mllvm -debug-only=pchcontainer &>%t-pch.ll
|
||||
// RUN: cat %t-pch.ll | FileCheck %s
|
||||
// RUN: cat %t-pch.ll | FileCheck %s --check-prefix=CHECK2
|
||||
|
||||
#ifdef MODULES
|
||||
@import DebugObjC;
|
||||
|
|
@ -24,61 +25,65 @@
|
|||
|
||||
// CHECK: distinct !DICompileUnit(language: DW_LANG_ObjC
|
||||
// CHECK-SAME: isOptimized: false,
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME: scope: ![[MODULE:[0-9]+]],
|
||||
// CHECK: ![[MODULE]] = !DIModule(scope: null, name:{{.*}}DebugObjC
|
||||
|
||||
// CHECK: ![[TD_ENUM:.*]] = !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
// CHECK-SAME: elements:
|
||||
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME: name: "FwdDecl",
|
||||
// CHECK-SAME: scope: ![[MODULE]],
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME: name: "ObjCClass",
|
||||
// CHECK: !DIObjCProperty(name: "property",
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "ivar"
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "InnerEnum"
|
||||
// CHECK: !DISubprogram(name: "+[ObjCClass classMethod]"
|
||||
// CHECK: !DISubprogram(name: "-[ObjCClass instanceMethodWithInt:]"
|
||||
// CHECK: !DISubprogram(name: "-[Category(Category) categoryMethod]"
|
||||
// CHECK-SAME: scope: ![[MODULE]],
|
||||
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// MODULE-CHECK-SAME: scope: ![[MODULE:[0-9]+]],
|
||||
// MODULE-CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugObjC"
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDeclared"
|
||||
// CHECK-SAME: elements:
|
||||
|
||||
// MODULE-CHECK: ![[TD_ENUM:.*]] = !DICompositeType(tag: DW_TAG_enumeration_type,
|
||||
// MODULE-CHECK-SAME-NOT: name:
|
||||
// MODULE-CHECK-SAME: elements:
|
||||
// CHECK: ![[TD_UNION:.*]] = !DICompositeType(tag: DW_TAG_union_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
// CHECK-SAME: elements:
|
||||
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// MODULE-CHECK-SAME: name: "FwdDecl",
|
||||
// MODULE-CHECK-SAME: scope: ![[MODULE]],
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// MODULE-CHECK-SAME: name: "ObjCClass",
|
||||
// MODULE-CHECK-SAME: scope: ![[MODULE]],
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefUnion",
|
||||
// CHECK-SAME: baseType: ![[TD_UNION]])
|
||||
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "FwdDeclared"
|
||||
// MODULE-CHECK-SAME: elements:
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefEnum",
|
||||
// CHECK-SAME: baseType: ![[TD_ENUM:.*]])
|
||||
|
||||
// MODULE-CHECK: ![[TD_UNION:.*]] = !DICompositeType(tag: DW_TAG_union_type,
|
||||
// MODULE-CHECK-SAME-NOT: name:
|
||||
// MODULE-CHECK-SAME: elements:
|
||||
// CHECK: ![[TD_STRUCT:.*]] = !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
// CHECK-SAME: elements:
|
||||
// CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefStruct",
|
||||
// CHECK-SAME: baseType: ![[TD_STRUCT]])
|
||||
|
||||
// MODULE-CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefUnion",
|
||||
// MODULE-CHECK-SAME: baseType: ![[TD_UNION]])
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_union_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// MODULE-CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefEnum",
|
||||
// MODULE-CHECK-SAME: baseType: ![[TD_ENUM:.*]])
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK-SAME-NOT: name:
|
||||
|
||||
// MODULE-CHECK: ![[TD_STRUCT:.*]] = !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// MODULE-CHECK-SAME-NOT: name:
|
||||
// MODULE-CHECK-SAME: elements:
|
||||
// MODULE-CHECK: !DIDerivedType(tag: DW_TAG_typedef, name: "TypedefStruct",
|
||||
// MODULE-CHECK-SAME: baseType: ![[TD_STRUCT]])
|
||||
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_union_type,
|
||||
// MODULE-CHECK-SAME-NOT: name:
|
||||
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// MODULE-CHECK-SAME-NOT: name:
|
||||
|
||||
// MODULE-CHECK: !DISubprogram(name: "+[ObjCClass classMethod]",
|
||||
// MODULE-CHECK-SAME: scope: ![[MODULE]],
|
||||
// CHECK: !DISubprogram(name: "+[ObjCClass classMethod]",
|
||||
// CHECK-SAME: scope: ![[MODULE]],
|
||||
|
||||
// The forward declaration should not be in the module scope.
|
||||
// MODULE-CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "OpaqueData", file
|
||||
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "OpaqueData", file
|
||||
|
||||
// MODULE-CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"
|
||||
// CHECK-NEG-NOT: !DICompositeType(tag: DW_TAG_structure_type, name: "PureForwardDecl"
|
||||
|
||||
// The output order is sublty different for module vs. pch,
|
||||
// so these are checked separately:
|
||||
//
|
||||
// CHECK2: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK2-SAME: name: "FwdDecl",
|
||||
// CHECK2: !DICompositeType(tag: DW_TAG_structure_type,
|
||||
// CHECK2-SAME: name: "ObjCClass",
|
||||
// CHECK2: !DIObjCProperty(name: "property",
|
||||
// CHECK2: !DIDerivedType(tag: DW_TAG_member, name: "ivar"
|
||||
// CHECK2: !DIDerivedType(tag: DW_TAG_typedef, name: "InnerEnum"
|
||||
// CHECK2: !DISubprogram(name: "+[ObjCClass classMethod]"
|
||||
// CHECK2: !DISubprogram(name: "-[ObjCClass instanceMethodWithInt:]"
|
||||
// CHECK2: !DISubprogram(name: "-[Category(Category) categoryMethod]"
|
||||
|
|
|
|||
Loading…
Reference in New Issue