Alexey, it seems it is failing on i686-*-*. Suppressed in r166683. Please investigate.
...Takumi 2012/10/25 Alexey Samsonov <[email protected]>: > 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
