On 13 February 2018 at 16:14, Erich Keane via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: erichkeane > Date: Tue Feb 13 16:14:07 2018 > New Revision: 325081 > > URL: http://llvm.org/viewvc/llvm-project?rev=325081&view=rev > Log: > Implement function attribute artificial > > Added support in clang for GCC function attribute 'artificial'. This > attribute > is used to control stepping behavior of debugger with respect to inline > functions. > > Patch By: Elizabeth Andrews (eandrews) > > Differential Revision: https://reviews.llvm.org/D43259 > > > Added: > cfe/trunk/test/CodeGen/artificial.c > cfe/trunk/test/Sema/artificial.c > Modified: > cfe/trunk/include/clang/Basic/Attr.td > cfe/trunk/include/clang/Basic/AttrDocs.td > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/lib/Sema/SemaDeclAttr.cpp > > Modified: cfe/trunk/include/clang/Basic/Attr.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Basic/Attr.td?rev=325081&r1=325080&r2=325081&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Basic/Attr.td (original) > +++ cfe/trunk/include/clang/Basic/Attr.td Tue Feb 13 16:14:07 2018 > @@ -111,6 +111,9 @@ def SharedVar : SubsetSubject<Var, > def GlobalVar : SubsetSubject<Var, > [{S->hasGlobalStorage()}], "global > variables">; > > +def InlineFunction : SubsetSubject<Function, > + [{S->isInlineSpecified()}], "inline > functions">; > + > // FIXME: this hack is needed because DeclNodes.td defines the base Decl > node > // type to be a class, not a definition. This makes it impossible to > create an > // attribute subject which accepts a Decl. Normally, this is not a > problem, > @@ -588,6 +591,12 @@ def AlwaysInline : InheritableAttr { > let Documentation = [Undocumented]; > } > > +def Artificial : InheritableAttr { > + let Spellings = [GCC<"artificial">]; > + let Subjects = SubjectList<[InlineFunction], WarnDiag>; > + let Documentation = [ArtificialDocs]; > +} > + > def XRayInstrument : InheritableAttr { > let Spellings = [Clang<"xray_always_instrument">, > Clang<"xray_never_instrument">]; > > Modified: cfe/trunk/include/clang/Basic/AttrDocs.td > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Basic/AttrDocs.td?rev=325081&r1=325080&r2=325081&view=diff > ============================================================ > ================== > --- cfe/trunk/include/clang/Basic/AttrDocs.td (original) > +++ cfe/trunk/include/clang/Basic/AttrDocs.td Tue Feb 13 16:14:07 2018 > @@ -3273,3 +3273,13 @@ For more information see > or `msvc documentation <https://docs.microsoft.com/ > pl-pl/cpp/cpp/selectany>`_. > }]; > } > + > +def ArtificialDocs : Documentation { > + let Category = DocCatFunction; > + let Content = [{ > +The ``artificial`` attribute is used with inline functions to treat the > inline > +function as a unit while debugging. For more information see GCC_ > documentation. > I find this to be hard to understand. What does "treat the inline function as a unit" actually mean? How about something like: The ``artificial`` attribute can be applied to an inline function. If such a function is inlined, the attribute indicates that debuggers should associate the resulting instructions with the call site, rather than with the corresponding line within the inlined callee. + > +.. _GCC: https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/ > Function-Attributes.html If you still want to reference the GCC documentation, could you pick a newer version? :) + }]; > +} > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ > CGDebugInfo.cpp?rev=325081&r1=325080&r2=325081&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Feb 13 16:14:07 2018 > @@ -3235,7 +3235,7 @@ void CGDebugInfo::EmitFunctionStart(Glob > if (Name.startswith("\01")) > Name = Name.substr(1); > > - if (!HasDecl || D->isImplicit()) { > + if (!HasDecl || D->isImplicit() || D->hasAttr<ArtificialAttr>()) { > Flags |= llvm::DINode::FlagArtificial; > // Artificial functions should not silently reuse CurLoc. > CurLoc = SourceLocation(); > > Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ > SemaDeclAttr.cpp?rev=325081&r1=325080&r2=325081&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Feb 13 16:14:07 2018 > @@ -6057,6 +6057,9 @@ static void ProcessDeclAttribute(Sema &S > case AttributeList::AT_AlwaysInline: > handleAlwaysInlineAttr(S, D, Attr); > break; > + case AttributeList::AT_Artificial: > + handleSimpleAttribute<ArtificialAttr>(S, D, Attr); > + break; > case AttributeList::AT_AnalyzerNoReturn: > handleAnalyzerNoReturnAttr(S, D, Attr); > break; > > Added: cfe/trunk/test/CodeGen/artificial.c > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > CodeGen/artificial.c?rev=325081&view=auto > ============================================================ > ================== > --- cfe/trunk/test/CodeGen/artificial.c (added) > +++ cfe/trunk/test/CodeGen/artificial.c Tue Feb 13 16:14:07 2018 > @@ -0,0 +1,10 @@ > +// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm > -debug-info-kind=limited %s -o - | FileCheck %s > + > +extern void foo(); > +// CHECK: !DISubprogram(name: "foo" > +// CHECK-SAME: flags: DIFlagArtificial > +inline void __attribute__((artificial)) foo() {} > + > +void baz() { > + foo(); > +} > > Added: cfe/trunk/test/Sema/artificial.c > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/ > artificial.c?rev=325081&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Sema/artificial.c (added) > +++ cfe/trunk/test/Sema/artificial.c Tue Feb 13 16:14:07 2018 > @@ -0,0 +1,4 @@ > +// RUN: %clang_cc1 -fsyntax-only -verify %s > + > +inline void __attribute__((artificial)) foo() {} > +void __attribute__((artificial)) bar() {} // expected-warning > {{'artificial' attribute only applies to inline functions}} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits