Skip to content

Commit

Permalink
Implement function attribute artificial
Browse files Browse the repository at this point in the history
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

llvm-svn: 325081
  • Loading branch information
Erich Keane committed Feb 14, 2018
1 parent 35fa7cd commit 293a055
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 1 deletion.
9 changes: 9 additions & 0 deletions clang/include/clang/Basic/Attr.td
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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">];
Expand Down
10 changes: 10 additions & 0 deletions clang/include/clang/Basic/AttrDocs.td
Original file line number Diff line number Diff line change
Expand Up @@ -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
}];
}
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGDebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3235,7 +3235,7 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, SourceLocation Loc,
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();
Expand Down
3 changes: 3 additions & 0 deletions clang/lib/Sema/SemaDeclAttr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6057,6 +6057,9 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
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;
Expand Down
10 changes: 10 additions & 0 deletions clang/test/CodeGen/artificial.c
Original file line number Diff line number Diff line change
@@ -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();
}
4 changes: 4 additions & 0 deletions clang/test/Sema/artificial.c
Original file line number Diff line number Diff line change
@@ -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}}

0 comments on commit 293a055

Please sign in to comment.