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. + +.. _GCC: https://gcc.gnu.org/onlinedocs/gcc-4.6.4/gcc/Function-Attributes.html + }]; +} 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