r247068 - Module Debugging: Emit debug type information into clang ObjC modules.
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 8 20:05:56 PDT 2015
On Tue, Sep 8, 2015 at 1:41 PM, Adrian Prantl via cfe-commits <
cfe-commits at lists.llvm.org> wrote:
> Author: adrian
> Date: Tue Sep 8 15:41:52 2015
> New Revision: 247068
>
> URL: http://llvm.org/viewvc/llvm-project?rev=247068&view=rev
> Log:
> Module Debugging: Emit debug type information into clang ObjC modules.
>
> When -fmodule-format is set to "obj", emit debug info for all types
> declared in a module or referenced by a declaration into the module's
> object file container.
>
As I mentioned in the other code review "or referenced by a declaration"
seems like a strange clause to me & sounds like it would produce a lot of
redundant debug info... could you explain the motivation for this?
>
> This patch adds support for Objective-C types and methods.
>
> Added:
> cfe/trunk/test/Modules/Inputs/DebugObjC.h
> cfe/trunk/test/Modules/ModuleDebugInfo.m
> Removed:
> cfe/trunk/test/Modules/Inputs/DebugModule.h
> Modified:
> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> cfe/trunk/lib/CodeGen/CGDebugInfo.h
> cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
> cfe/trunk/test/Modules/Inputs/module.map
> cfe/trunk/test/Modules/debug-info-moduleimport.m
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=247068&r1=247067&r2=247068&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Sep 8 15:41:52 2015
> @@ -2515,11 +2515,17 @@ llvm::DISubroutineType *CGDebugInfo::get
>
> Elts.push_back(getOrCreateType(ResultTy, F));
> // "self" pointer is always first argument.
> - QualType SelfDeclTy = OMethod->getSelfDecl()->getType();
> - Elts.push_back(CreateSelfType(SelfDeclTy, getOrCreateType(SelfDeclTy,
> F)));
> + QualType SelfDeclTy;
> + if (auto *SelfDecl = OMethod->getSelfDecl())
> + SelfDeclTy = SelfDecl->getType();
> + else if (auto *FPT = dyn_cast<FunctionProtoType>(FnType))
> + if (FPT->getNumParams() > 1)
> + SelfDeclTy = FPT->getParamType(0);
> + if (!SelfDeclTy.isNull())
> + Elts.push_back(CreateSelfType(SelfDeclTy,
> getOrCreateType(SelfDeclTy, F)));
> // "_cmd" pointer is always second argument.
> Elts.push_back(DBuilder.createArtificialType(
> - getOrCreateType(OMethod->getCmdDecl()->getType(), F)));
> + getOrCreateType(CGM.getContext().getObjCSelType(), F)));
> // Get rest of the arguments.
> for (const auto *PI : OMethod->params())
> Elts.push_back(getOrCreateType(PI->getType(), F));
> @@ -2623,6 +2629,49 @@ void CGDebugInfo::EmitFunctionStart(Glob
> RegionMap[D].reset(SP);
> }
>
> +void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
> + QualType FnType) {
> + StringRef Name;
> + StringRef LinkageName;
> +
> + const Decl *D = GD.getDecl();
> + if (!D)
> + return;
> +
> + unsigned Flags = 0;
> + llvm::DIFile *Unit = getOrCreateFile(Loc);
> + llvm::DIScope *FDContext = Unit;
> + llvm::DINodeArray TParamsArray;
> + if (isa<FunctionDecl>(D)) {
> + // If there is a DISubprogram for this function available then use it.
> + collectFunctionDeclProps(GD, Unit, Name, LinkageName, FDContext,
> + TParamsArray, Flags);
> + } else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D)) {
> + Name = getObjCMethodName(OMD);
> + Flags |= llvm::DINode::FlagPrototyped;
> + } else {
> + llvm_unreachable("not a function or ObjC method");
> + }
> + if (!Name.empty() && Name[0] == '\01')
> + Name = Name.substr(1);
> +
> + if (D->isImplicit()) {
> + Flags |= llvm::DINode::FlagArtificial;
> + // Artificial functions without a location should not silently reuse
> CurLoc.
> + if (Loc.isInvalid())
> + CurLoc = SourceLocation();
> + }
> + unsigned LineNo = getLineNumber(Loc);
> + unsigned ScopeLine = 0;
> +
> + DBuilder.createFunction(FDContext, Name, LinkageName, Unit, LineNo,
> + getOrCreateFunctionType(D, FnType, Unit),
> + false /*internalLinkage*/, true /*definition*/,
> + ScopeLine, Flags, CGM.getLangOpts().Optimize,
> nullptr,
> + TParamsArray.get(),
> + getFunctionDeclaration(D));
> +}
> +
> void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc) {
> // Update our current location
> setLocation(Loc);
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=247068&r1=247067&r2=247068&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Tue Sep 8 15:41:52 2015
> @@ -281,6 +281,9 @@ public:
> SourceLocation ScopeLoc, QualType FnType,
> llvm::Function *Fn, CGBuilderTy &Builder);
>
> + /// Emit debug info for a function declaration.
> + void EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc, QualType
> FnType);
> +
> /// Constructs the debug code for exiting a function.
> void EmitFunctionEnd(CGBuilderTy &Builder);
>
>
> Modified: cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp?rev=247068&r1=247067&r2=247068&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ObjectFilePCHContainerOperations.cpp Tue Sep 8
> 15:41:52 2015
> @@ -76,6 +76,48 @@ class PCHContainerGenerator : public AST
> return true;
> }
>
> + bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
> + QualType QualTy(D->getTypeForDecl(), 0);
> + if (!QualTy.isNull() && CanRepresent(QualTy.getTypePtr()))
> + DI.getOrCreateStandaloneType(QualTy, D->getLocation());
> + return true;
> + }
> +
> + bool VisitFunctionDecl(FunctionDecl *D) {
> + if (isa<CXXMethodDecl>(D))
> + // This is not yet supported. Constructing the `this' argument
> + // mandates a CodeGenFunction.
> + return true;
> +
> + SmallVector<QualType, 16> ArgTypes;
> + for (auto i : D->params())
> + ArgTypes.push_back(i->getType());
> + QualType RetTy = D->getReturnType();
> + QualType FnTy = Ctx.getFunctionType(RetTy, ArgTypes,
> +
> FunctionProtoType::ExtProtoInfo());
> + if (CanRepresent(FnTy.getTypePtr()))
> + DI.EmitFunctionDecl(D, D->getLocation(), FnTy);
> + return true;
> + }
> +
> + bool VisitObjCMethodDecl(ObjCMethodDecl *D) {
> + if (!D->getClassInterface())
> + return true;
> +
> + bool selfIsPseudoStrong, selfIsConsumed;
> + SmallVector<QualType, 16> ArgTypes;
> + ArgTypes.push_back(D->getSelfType(Ctx, D->getClassInterface(),
> + selfIsPseudoStrong,
> selfIsConsumed));
> + ArgTypes.push_back(Ctx.getObjCSelType());
> + for (auto i : D->params())
> + ArgTypes.push_back(i->getType());
> + QualType RetTy = D->getReturnType();
> + QualType FnTy = Ctx.getFunctionType(RetTy, ArgTypes,
> +
> FunctionProtoType::ExtProtoInfo());
> + if (CanRepresent(FnTy.getTypePtr()))
> + DI.EmitFunctionDecl(D, D->getLocation(), FnTy);
> + return true;
> + }
> };
>
> public:
>
> Removed: cfe/trunk/test/Modules/Inputs/DebugModule.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugModule.h?rev=247067&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/DebugModule.h (original)
> +++ cfe/trunk/test/Modules/Inputs/DebugModule.h (removed)
> @@ -1 +0,0 @@
> - at class F;
>
> Added: cfe/trunk/test/Modules/Inputs/DebugObjC.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/DebugObjC.h?rev=247068&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/DebugObjC.h (added)
> +++ cfe/trunk/test/Modules/Inputs/DebugObjC.h Tue Sep 8 15:41:52 2015
> @@ -0,0 +1,11 @@
> + at interface ObjCClass {
> + int ivar;
> +}
> ++ classMethod;
> +- instanceMethodWithInt:(int)i;
> + at property int property;
> + at end
> +
> + at interface ObjCClass (Category)
> +- categoryMethod;
> + at end
>
> Modified: cfe/trunk/test/Modules/Inputs/module.map
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=247068&r1=247067&r2=247068&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/Inputs/module.map (original)
> +++ cfe/trunk/test/Modules/Inputs/module.map Tue Sep 8 15:41:52 2015
> @@ -328,14 +328,14 @@ module crash {
> header "crash.h"
> }
>
> -module DebugModule {
> - header "DebugModule.h"
> -}
> -
> module DebugCXX {
> header "DebugCXX.h"
> }
>
> +module DebugObjC {
> + header "DebugObjC.h"
> +}
> +
> module ImportNameInDir {
> header "ImportNameInDir.h"
> export *
>
> Added: cfe/trunk/test/Modules/ModuleDebugInfo.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/ModuleDebugInfo.m?rev=247068&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Modules/ModuleDebugInfo.m (added)
> +++ cfe/trunk/test/Modules/ModuleDebugInfo.m Tue Sep 8 15:41:52 2015
> @@ -0,0 +1,27 @@
> +// Test that debug info is emitted for an Objective-C module and
> +// a precompiled header.
> +
> +// REQUIRES: asserts, shell
> +
> +// Modules:
> +// RUN: rm -rf %t
> +// RUN: %clang_cc1 -x objective-c -fmodules -fmodule-format=obj
> -fimplicit-module-maps -DMODULES -fmodules-cache-path=%t %s -I %S/Inputs -I
> %t -emit-llvm -o %t.ll -mllvm -debug-only=pchcontainer &>%t-mod.ll
> +// RUN: cat %t-mod.ll | FileCheck %s
> +
> +// PCH:
> +// RUN: %clang_cc1 -x objective-c -emit-pch -fmodule-format=obj -I
> %S/Inputs -o %t.pch %S/Inputs/DebugObjC.h -mllvm -debug-only=pchcontainer
> &>%t-pch.ll
> +// RUN: cat %t-pch.ll | FileCheck %s
> +
> +#ifdef MODULES
> + at import DebugObjC;
> +#endif
> +
> +// CHECK: distinct !DICompileUnit(language: DW_LANG_ObjC
> +// CHECK-SAME: isOptimized: false,
> +// CHECK-SAME: splitDebugFilename:
> +// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "ObjCClass"
> +// CHECK: !DIObjCProperty(name: "property",
> +// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "ivar"
> +// CHECK: !DISubprogram(name: "+[ObjCClass classMethod]"
> +// CHECK: !DISubprogram(name: "-[ObjCClass instanceMethodWithInt:]"
> +// CHECK: !DISubprogram(name: "-[ categoryMethod]"
>
> Modified: cfe/trunk/test/Modules/debug-info-moduleimport.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/debug-info-moduleimport.m?rev=247068&r1=247067&r2=247068&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/debug-info-moduleimport.m (original)
> +++ cfe/trunk/test/Modules/debug-info-moduleimport.m Tue Sep 8 15:41:52
> 2015
> @@ -2,6 +2,6 @@
> // RUN: %clang_cc1 -g -fmodules -DGREETING="Hello World" -UNDEBUG
> -fimplicit-module-maps -fmodules-cache-path=%t %s -I %S/Inputs -isysroot
> /tmp/.. -I %t -emit-llvm -o - | FileCheck %s
>
> // CHECK: ![[CU:.*]] = distinct !DICompileUnit
> - at import DebugModule;
> + at import DebugObjC;
> // CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, scope:
> ![[CU]], entity: ![[MODULE:.*]], line: 5)
> -// CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugModule",
> configMacros: "\22-DGREETING=Hello World\22 \22-UNDEBUG\22", includePath:
> "{{.*}}test{{.*}}Modules{{.*}}Inputs", isysroot: "/tmp/..")
> +// CHECK: ![[MODULE]] = !DIModule(scope: null, name: "DebugObjC",
> configMacros: "\22-DGREETING=Hello World\22 \22-UNDEBUG\22", includePath:
> "{{.*}}test{{.*}}Modules{{.*}}Inputs", isysroot: "/tmp/..")
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150908/e8fb55ff/attachment-0001.html>
More information about the cfe-commits
mailing list