<div dir="ltr">Oh, yeah - so the trick here is that you don't just drop the typedef, but you drop an context for that typedef (if it's not otherwise used) - like namespaces (probably otherwise used) and classes (in the class of C++ type traits these aren't generally referenced in ways other than the typedef they contain).<br><br>See <a href="http://lists.llvm.org/pipermail/libcxx-commits/2019-June/004697.html">http://lists.llvm.org/pipermail/libcxx-commits/2019-June/004697.html</a> for some stats/usage.<br><br><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 17, 2019 at 11:00 AM <<a href="mailto:paul.robinson@sony.com">paul.robinson@sony.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Is this really measurable?  All you're suppressing are the typedef DIEs<br>
and their names; the DIEs are small, although I admit the names can take<br>
up space.<br>
(I'm not really objecting, it's just hard to intuit a big size benefit.)<br>
--paulr<br>
<br>
> -----Original Message-----<br>
> From: cfe-commits [mailto:<a href="mailto:cfe-commits-bounces@lists.llvm.org" target="_blank">cfe-commits-bounces@lists.llvm.org</a>] On Behalf Of<br>
> David Blaikie via cfe-commits<br>
> Sent: Friday, June 07, 2019 8:01 PM<br>
> To: <a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
> Subject: r362856 - DebugInfo: Add support for 'nodebug' attribute on<br>
> typedefs and alias templates<br>
> <br>
> Author: dblaikie<br>
> Date: Fri Jun  7 17:01:21 2019<br>
> New Revision: 362856<br>
> <br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=362856&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=362856&view=rev</a><br>
> Log:<br>
> DebugInfo: Add support for 'nodebug' attribute on typedefs and alias<br>
> templates<br>
> <br>
> Seems like a logical extension to me - and of interest because it might<br>
> help reduce the debug info size of libc++ by applying this attribute to<br>
> type traits that have a disproportionate debug info cost compared to the<br>
> benefit (& possibly harm/confusion) they cause users.<br>
> <br>
> Modified:<br>
>     cfe/trunk/include/clang/Basic/Attr.td<br>
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
>     cfe/trunk/test/CodeGenCXX/debug-info-nodebug.cpp<br>
>     cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test<br>
>     cfe/trunk/test/Sema/attr-nodebug.c<br>
> <br>
> Modified: cfe/trunk/include/clang/Basic/Attr.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/cfe/trunk/include/clang/Basic/Attr.td?rev=362856&r1=362855&r2=3628<br>
> 56&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/include/clang/Basic/Attr.td (original)<br>
> +++ cfe/trunk/include/clang/Basic/Attr.td Fri Jun  7 17:01:21 2019<br>
> @@ -1434,7 +1434,7 @@ def NoCommon : InheritableAttr {<br>
> <br>
>  def NoDebug : InheritableAttr {<br>
>    let Spellings = [GCC<"nodebug">];<br>
> -  let Subjects = SubjectList<[FunctionLike, ObjCMethod, NonParmVar]>;<br>
> +  let Subjects = SubjectList<[TypedefName, FunctionLike, ObjCMethod,<br>
> NonParmVar]>;<br>
>    let Documentation = [NoDebugDocs];<br>
>  }<br>
> <br>
> <br>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-</a><br>
> project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=362856&r1=362855&r2=3628<br>
> 56&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Jun  7 17:01:21 2019<br>
> @@ -1091,15 +1091,18 @@ llvm::DIType *CGDebugInfo::CreateType(co<br>
>    assert(Ty->isTypeAlias());<br>
>    llvm::DIType *Src = getOrCreateType(Ty->getAliasedType(), Unit);<br>
> <br>
> +  auto *AliasDecl =<br>
> +      cast<TypeAliasTemplateDecl>(Ty-<br>
> >getTemplateName().getAsTemplateDecl())<br>
> +          ->getTemplatedDecl();<br>
> +<br>
> +  if (AliasDecl->hasAttr<NoDebugAttr>())<br>
> +    return Src;<br>
> +<br>
>    SmallString<128> NS;<br>
>    llvm::raw_svector_ostream OS(NS);<br>
>    Ty->getTemplateName().print(OS, getPrintingPolicy(), /*qualified*/<br>
> false);<br>
>    printTemplateArgumentList(OS, Ty->template_arguments(),<br>
> getPrintingPolicy());<br>
> <br>
> -  auto *AliasDecl =<br>
> -      cast<TypeAliasTemplateDecl>(Ty-<br>
> >getTemplateName().getAsTemplateDecl())<br>
> -          ->getTemplatedDecl();<br>
> -<br>
>    SourceLocation Loc = AliasDecl->getLocation();<br>
>    return DBuilder.createTypedef(Src, OS.str(), getOrCreateFile(Loc),<br>
>                                  getLineNumber(Loc),<br>
> @@ -1108,15 +1111,20 @@ llvm::DIType *CGDebugInfo::CreateType(co<br>
> <br>
>  llvm::DIType *CGDebugInfo::CreateType(const TypedefType *Ty,<br>
>                                        llvm::DIFile *Unit) {<br>
> +  llvm::DIType *Underlying =<br>
> +      getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit);<br>
> +<br>
> +  if (Ty->getDecl()->hasAttr<NoDebugAttr>())<br>
> +    return Underlying;<br>
> +<br>
>    // We don't set size information, but do specify where the typedef was<br>
>    // declared.<br>
>    SourceLocation Loc = Ty->getDecl()->getLocation();<br>
> <br>
>    // Typedefs are derived from some other type.<br>
> -  return DBuilder.createTypedef(<br>
> -      getOrCreateType(Ty->getDecl()->getUnderlyingType(), Unit),<br>
> -      Ty->getDecl()->getName(), getOrCreateFile(Loc), getLineNumber(Loc),<br>
> -      getDeclContextDescriptor(Ty->getDecl()));<br>
> +  return DBuilder.createTypedef(Underlying, Ty->getDecl()->getName(),<br>
> +                                getOrCreateFile(Loc), getLineNumber(Loc),<br>
> +                                getDeclContextDescriptor(Ty->getDecl()));<br>
>  }<br>
> <br>
>  static unsigned getDwarfCC(CallingConv CC) {<br>
> <br>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-nodebug.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-</a><br>
> info-nodebug.cpp?rev=362856&r1=362855&r2=362856&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/test/CodeGenCXX/debug-info-nodebug.cpp (original)<br>
> +++ cfe/trunk/test/CodeGenCXX/debug-info-nodebug.cpp Fri Jun  7 17:01:21<br>
> 2019<br>
> @@ -1,5 +1,5 @@<br>
> -// RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -debug-info-kind=limited %s<br>
> -o - | FileCheck %s --check-prefix=YESINFO<br>
> -// RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -debug-info-kind=limited %s<br>
> -o - | FileCheck %s --check-prefix=NOINFO<br>
> +// RUN: %clang_cc1 -DSETNODEBUG=0 -emit-llvm -std=c++14 -debug-info-<br>
> kind=limited %s -o - | FileCheck %s --check-prefix=YESINFO<br>
> +// RUN: %clang_cc1 -DSETNODEBUG=1 -emit-llvm -std=c++14 -debug-info-<br>
> kind=limited %s -o - | FileCheck %s --check-prefix=NOINFO<br>
> <br>
>  #if SETNODEBUG<br>
>  #define NODEBUG __attribute__((nodebug))<br>
> @@ -53,3 +53,15 @@ void func4() {<br>
>  // NOINFO-NOT:  !DIGlobalVariable(name: "static_local"<br>
>  // YESINFO-DAG: !DILocalVariable(name: "normal_local"<br>
>  // NOINFO-NOT:  !DILocalVariable(name: "normal_local"<br>
> +<br>
> +template <typename T><br>
> +using y NODEBUG = int;<br>
> +void func5() {<br>
> +  NODEBUG typedef int x;<br>
> +  x a;<br>
> +  y<int> b;<br>
> +}<br>
> +// YESINFO-DAG: !DIDerivedType(tag: DW_TAG_typedef, name: "x"<br>
> +// NOINFO-NOT:  !DIDerivedType(tag: DW_TAG_typedef, name: "x"<br>
> +// YESINFO-DAG: !DIDerivedType(tag: DW_TAG_typedef, name: "y<int>"<br>
> +// NOINFO-NOT:  !DIDerivedType(tag: DW_TAG_typedef, name: "y<int>"<br>
> <br>
> Modified: cfe/trunk/test/Misc/pragma-attribute-supported-attributes-<br>
> list.test<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/pragma-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/pragma-</a><br>
> attribute-supported-attributes-<br>
> list.test?rev=362856&r1=362855&r2=362856&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test<br>
> (original)<br>
> +++ cfe/trunk/test/Misc/pragma-attribute-supported-attributes-list.test<br>
> Fri Jun  7 17:01:21 2019<br>
> @@ -72,7 +72,7 @@<br>
>  // CHECK-NEXT: NSConsumesSelf (SubjectMatchRule_objc_method)<br>
>  // CHECK-NEXT: Naked (SubjectMatchRule_function)<br>
>  // CHECK-NEXT: NoCommon (SubjectMatchRule_variable)<br>
> -// CHECK-NEXT: NoDebug (SubjectMatchRule_hasType_functionType,<br>
> SubjectMatchRule_objc_method, SubjectMatchRule_variable_not_is_parameter)<br>
> +// CHECK-NEXT: NoDebug (SubjectMatchRule_type_alias,<br>
> SubjectMatchRule_hasType_functionType, SubjectMatchRule_objc_method,<br>
> SubjectMatchRule_variable_not_is_parameter)<br>
>  // CHECK-NEXT: NoDestroy (SubjectMatchRule_variable)<br>
>  // CHECK-NEXT: NoDuplicate (SubjectMatchRule_function)<br>
>  // CHECK-NEXT: NoEscape (SubjectMatchRule_variable_is_parameter)<br>
> <br>
> Modified: cfe/trunk/test/Sema/attr-nodebug.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-</a><br>
> nodebug.c?rev=362856&r1=362855&r2=362856&view=diff<br>
> ==========================================================================<br>
> ====<br>
> --- cfe/trunk/test/Sema/attr-nodebug.c (original)<br>
> +++ cfe/trunk/test/Sema/attr-nodebug.c Fri Jun  7 17:01:21 2019<br>
> @@ -2,7 +2,7 @@<br>
> <br>
>  int a __attribute__((nodebug));<br>
> <br>
> -void b(int p __attribute__((nodebug))) { // expected-warning {{'nodebug'<br>
> attribute only applies to functions, function pointers, Objective-C<br>
> methods, and variables}}<br>
> +void b(int p __attribute__((nodebug))) { // expected-warning {{'nodebug'<br>
> attribute only applies to typedefs, functions, function pointers,<br>
> Objective-C methods, and variables}}<br>
>    int b __attribute__((nodebug));<br>
>  }<br>
> <br>
> <br>
> <br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
> <a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>