probinson updated this revision to Diff 60930. probinson added a comment. Removed the apparently redundant test for a const local variable.
Yes, I'm back to this after way longer than expected. I believe, for this patch specifically, the extra const local variable was the only identifiable problem. There were other issues regarding the overall test, which were partly discussed here and partly in http://reviews.llvm.org/D19567, but those were not specific to this patch. @dblaikie, I propose that with the 'const' test removed, we allow this patch to proceed (which completes the implementation, something I would dearly like to have done before 3.9 branches) with the promise that I'll come back around to the broader topic of the test file in general as a follow-up. http://reviews.llvm.org/D19754 Files: include/clang/Basic/Attr.td include/clang/Basic/AttrDocs.td lib/CodeGen/CGDebugInfo.cpp test/CodeGenCXX/debug-info-nodebug.cpp test/CodeGenObjC/debug-info-nodebug.m test/Sema/attr-nodebug.c
Index: test/Sema/attr-nodebug.c =================================================================== --- test/Sema/attr-nodebug.c +++ test/Sema/attr-nodebug.c @@ -2,8 +2,8 @@ int a __attribute__((nodebug)); -void b() { - int b __attribute__((nodebug)); // expected-warning {{'nodebug' attribute only applies to functions and global variables}} +void b(int p __attribute__((nodebug))) { // expected-warning {{'nodebug' attribute only applies to variables and functions}} + int b __attribute__((nodebug)); } void t1() __attribute__((nodebug)); Index: test/CodeGenObjC/debug-info-nodebug.m =================================================================== --- test/CodeGenObjC/debug-info-nodebug.m +++ test/CodeGenObjC/debug-info-nodebug.m @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 -triple arm-apple-ios -emit-llvm -debug-info-kind=limited -fblocks %s -o - | FileCheck %s +// Objective-C code cargo-culted from debug-info-lifetime-crash.m. +@protocol NSObject +- (id)copy; +@end +@class W; +@interface View1 +@end +@implementation Controller { + void (^Block)(void); +} +- (void)View:(View1 *)View foo:(W *)W +{ + // The reference from inside the block implicitly creates another + // local variable for the referenced member. That is what gets + // suppressed by the attribute. It still gets debug info as a + // member, though. + // CHECK-NOT: !DILocalVariable(name: "weakSelf" + // CHECK: !DIDerivedType({{.*}} name: "weakSelf" + // CHECK-NOT: !DILocalVariable(name: "weakSelf" + __attribute__((nodebug)) __typeof(self) weakSelf = self; + Block = [^{ + __typeof(self) strongSelf = weakSelf; + } copy]; +} +@end Index: test/CodeGenCXX/debug-info-nodebug.cpp =================================================================== --- test/CodeGenCXX/debug-info-nodebug.cpp +++ test/CodeGenCXX/debug-info-nodebug.cpp @@ -44,9 +44,12 @@ // YESINFO-DAG: !DIDerivedType({{.*}} name: "static_const_member" // NOINFO-NOT: !DIDerivedType({{.*}} name: "static_const_member" -// Function-local static variable. +// Function-local static and auto variables. void func4() { NODEBUG static int static_local = 6; + NODEBUG int normal_local = 7; } // YESINFO-DAG: !DIGlobalVariable(name: "static_local" // NOINFO-NOT: !DIGlobalVariable(name: "static_local" +// YESINFO-DAG: !DILocalVariable(name: "normal_local" +// NOINFO-NOT: !DILocalVariable(name: "normal_local" Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -3019,6 +3019,8 @@ CGBuilderTy &Builder) { assert(DebugKind >= codegenoptions::LimitedDebugInfo); assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!"); + if (VD->hasAttr<NoDebugAttr>()) + return; bool Unwritten = VD->isImplicit() || (isa<Decl>(VD->getDeclContext()) && @@ -3163,6 +3165,8 @@ if (Builder.GetInsertBlock() == nullptr) return; + if (VD->hasAttr<NoDebugAttr>()) + return; bool isByRef = VD->hasAttr<BlocksAttr>(); Index: include/clang/Basic/AttrDocs.td =================================================================== --- include/clang/Basic/AttrDocs.td +++ include/clang/Basic/AttrDocs.td @@ -524,8 +524,8 @@ let Category = DocCatVariable; let Content = [{ The ``nodebug`` attribute allows you to suppress debugging information for a -function, or for a variable declared with static storage duration, such as -globals, class static data members, and static locals. +function or method, or for a variable that is not a parameter or a non-static +data member. }]; } Index: include/clang/Basic/Attr.td =================================================================== --- include/clang/Basic/Attr.td +++ include/clang/Basic/Attr.td @@ -82,6 +82,8 @@ S->getKind() != Decl::ImplicitParam && S->getKind() != Decl::ParmVar && S->getKind() != Decl::NonTypeTemplateParm}]>; +def NonParmVar : SubsetSubject<Var, + [{S->getKind() != Decl::ParmVar}]>; def NonBitField : SubsetSubject<Field, [{!S->isBitField()}]>; @@ -994,8 +996,8 @@ def NoDebug : InheritableAttr { let Spellings = [GCC<"nodebug">]; - let Subjects = SubjectList<[FunctionLike, ObjCMethod, GlobalVar], WarnDiag, - "ExpectedFunctionGlobalVarMethodOrProperty">; + let Subjects = SubjectList<[FunctionLike, ObjCMethod, NonParmVar], WarnDiag, + "ExpectedVariableOrFunction">; let Documentation = [NoDebugDocs]; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits