[cfe-commits] r166676 - in /cfe/trunk: lib/CodeGen/CGBlocks.cpp lib/CodeGen/CGDebugInfo.cpp lib/CodeGen/CGDeclCXX.cpp lib/CodeGen/CGVTables.cpp test/CodeGenCXX/debug-info-blocks.cpp test/CodeGenCXX/debug-info-global-ctor-dtor.cpp test/CodeGenCXX/
NAKAMURA Takumi
geek4civic at gmail.com
Thu Oct 25 07:46:16 PDT 2012
Alexey, it seems it is failing on i686-*-*. Suppressed in r166683.
Please investigate.
...Takumi
2012/10/25 Alexey Samsonov <samsonov at google.com>:
> Author: samsonov
> Date: Thu Oct 25 05:18:50 2012
> New Revision: 166676
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166676&view=rev
> Log:
> Initialize debug info for special cases of functions that lack declarations and are generated by Clang (global initializers/destructors, thunks) . Fixes PR13942.
>
> Added:
> cfe/trunk/test/CodeGenCXX/debug-info-blocks.cpp
> cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp
> cfe/trunk/test/CodeGenCXX/debug-info-thunk.cpp
> Modified:
> cfe/trunk/lib/CodeGen/CGBlocks.cpp
> cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
> cfe/trunk/lib/CodeGen/CGVTables.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=166676&r1=166675&r2=166676&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Thu Oct 25 05:18:50 2012
> @@ -1650,6 +1650,8 @@
> SC_None,
> false, false);
>
> + // Initialize debug info if necessary.
> + CGF.maybeInitializeDebugInfo();
> CGF.StartFunction(FD, R, Fn, FI, args, SourceLocation());
>
> if (byrefInfo.needsCopy()) {
> @@ -1720,6 +1722,8 @@
> SC_Static,
> SC_None,
> false, false);
> + // Initialize debug info if necessary.
> + CGF.maybeInitializeDebugInfo();
> CGF.StartFunction(FD, R, Fn, FI, args, SourceLocation());
>
> if (byrefInfo.needsDispose()) {
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=166676&r1=166675&r2=166676&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Oct 25 05:18:50 2012
> @@ -2050,14 +2050,22 @@
> FnBeginRegionCount.push_back(LexicalBlockStack.size());
>
> const Decl *D = GD.getDecl();
> + // Function may lack declaration in source code if it is created by Clang
> + // CodeGen (examples: _GLOBAL__I_a, __cxx_global_array_dtor, thunk).
> + bool HasDecl = (D != 0);
> // Use the location of the declaration.
> - SourceLocation Loc = D->getLocation();
> -
> + SourceLocation Loc;
> + if (HasDecl)
> + Loc = D->getLocation();
> +
> unsigned Flags = 0;
> llvm::DIFile Unit = getOrCreateFile(Loc);
> llvm::DIDescriptor FDContext(Unit);
> llvm::DIArray TParamsArray;
> - if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
> + if (!HasDecl) {
> + // Use llvm function name.
> + Name = Fn->getName();
> + } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
> // If there is a DISubprogram for this function available then use it.
> llvm::DenseMap<const FunctionDecl *, llvm::WeakVH>::iterator
> FI = SPCache.find(FD->getCanonicalDecl());
> @@ -2104,12 +2112,13 @@
> Name = Name.substr(1);
>
> unsigned LineNo = getLineNumber(Loc);
> - if (D->isImplicit())
> + if (!HasDecl || D->isImplicit())
> Flags |= llvm::DIDescriptor::FlagArtificial;
>
> llvm::DIType DIFnType;
> llvm::DISubprogram SPDecl;
> - if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
> + if (HasDecl &&
> + CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
> DIFnType = getOrCreateFunctionType(D, FnType, Unit);
> SPDecl = getFunctionDeclaration(D);
> } else {
> @@ -2132,7 +2141,8 @@
> // Push function on region stack.
> llvm::MDNode *SPN = SP;
> LexicalBlockStack.push_back(SPN);
> - RegionMap[D] = llvm::WeakVH(SP);
> + if (HasDecl)
> + RegionMap[D] = llvm::WeakVH(SP);
> }
>
> /// EmitLocation - Emit metadata to indicate a change in line/column
>
> Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=166676&r1=166675&r2=166676&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Thu Oct 25 05:18:50 2012
> @@ -163,6 +163,9 @@
>
> CodeGenFunction CGF(CGM);
>
> + // Initialize debug info if needed.
> + CGF.maybeInitializeDebugInfo();
> +
> CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, fn,
> CGM.getTypes().arrangeNullaryFunction(),
> FunctionArgList(), SourceLocation());
> @@ -345,6 +348,9 @@
> void CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
> llvm::Constant **Decls,
> unsigned NumDecls) {
> + // Initialize debug info if needed.
> + maybeInitializeDebugInfo();
> +
> StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
> getTypes().arrangeNullaryFunction(),
> FunctionArgList(), SourceLocation());
> @@ -370,6 +376,9 @@
> void CodeGenFunction::GenerateCXXGlobalDtorsFunc(llvm::Function *Fn,
> const std::vector<std::pair<llvm::WeakVH, llvm::Constant*> >
> &DtorsAndObjects) {
> + // Initialize debug info if needed.
> + maybeInitializeDebugInfo();
> +
> StartFunction(GlobalDecl(), getContext().VoidTy, Fn,
> getTypes().arrangeNullaryFunction(),
> FunctionArgList(), SourceLocation());
> @@ -406,6 +415,9 @@
> llvm::Function *fn =
> CreateGlobalInitOrDestructFunction(CGM, FTy, "__cxx_global_array_dtor");
>
> + // Initialize debug info if needed.
> + maybeInitializeDebugInfo();
> +
> StartFunction(GlobalDecl(), getContext().VoidTy, fn, FI, args,
> SourceLocation());
>
>
> Modified: cfe/trunk/lib/CodeGen/CGVTables.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVTables.cpp?rev=166676&r1=166675&r2=166676&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGVTables.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGVTables.cpp Thu Oct 25 05:18:50 2012
> @@ -333,7 +333,10 @@
>
> FunctionArgs.push_back(Param);
> }
> -
> +
> + // Initialize debug info if needed.
> + maybeInitializeDebugInfo();
> +
> StartFunction(GlobalDecl(), ResultType, Fn, FnInfo, FunctionArgs,
> SourceLocation());
>
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-blocks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-blocks.cpp?rev=166676&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-blocks.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-blocks.cpp Thu Oct 25 05:18:50 2012
> @@ -0,0 +1,14 @@
> +// RUN: %clang_cc1 %s -gline-tables-only -fblocks -S -emit-llvm -o - | FileCheck %s
> +
> +struct A {
> + A();
> + A(const A &);
> + ~A();
> +};
> +
> +void test() {
> + __block A a;
> +}
> +
> +// CHECK: [ DW_TAG_subprogram ] [line 10] [local] [def] [__Block_byref_object_copy_]
> +// CHECK: [ DW_TAG_subprogram ] [line 10] [local] [def] [__Block_byref_object_dispose_]
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp?rev=166676&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-global-ctor-dtor.cpp Thu Oct 25 05:18:50 2012
> @@ -0,0 +1,27 @@
> +// RUN: %clang_cc1 %s -g -fno-use-cxa-atexit -S -emit-llvm -o - \
> +// RUN: | FileCheck %s --check-prefix=CHECK-NOKEXT
> +// RUN: %clang_cc1 %s -g -fno-use-cxa-atexit -fapple-kext -S -emit-llvm -o - \
> +// RUN: | FileCheck %s --check-prefix=CHECK-KEXT
> +
> +class A {
> + public:
> + A() {}
> + virtual ~A() {}
> +};
> +
> +A glob;
> +A array[2];
> +
> +void foo() {
> + static A stat;
> +}
> +
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 12] [local] [def] [__cxx_global_var_init]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 12] [local] [def] [__dtor_glob]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 13] [local] [def] [__cxx_global_var_init1]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 13] [local] [def] [__cxx_global_array_dtor]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 13] [local] [def] [__dtor_]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line 16] [local] [def] [__dtor__ZZ3foovE4stat]
> +// CHECK-NOKEXT: [ DW_TAG_subprogram ] [line {{.*}}] [local] [def] [_GLOBAL__I_a]
> +
> +// CHECK-KEXT: [ DW_TAG_subprogram ] [line {{.*}}] [local] [def] [_GLOBAL__D_a]
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-thunk.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-thunk.cpp?rev=166676&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-thunk.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-thunk.cpp Thu Oct 25 05:18:50 2012
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 %s -g -S -emit-llvm -o - | FileCheck %s
> +
> +struct A {
> + virtual void f();
> +};
> +
> +struct B {
> + virtual void f();
> +};
> +
> +struct C : A, B {
> + virtual void f();
> +};
> +
> +void C::f() { }
> +
> +// CHECK: [ DW_TAG_subprogram ] [line 15] [def] [_ZThn8_N1C1fEv]
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list