Should other unimplemented optimization attributes (e.g. "flatten") be silently ignored instead of issuing a warning too? How do you decide which attributes to warn on and which to ignore silently?<div><br></div>
<div>Nico<br><br><div class="gmail_quote">On Sat, May 12, 2012 at 2:10 PM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: d0k<br>
Date: Sat May 12 16:10:52 2012<br>
New Revision: 156723<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=156723&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=156723&view=rev</a><br>
Log:<br>
Add support for __attribute__((hot)) and __attribute__((cold)).<br>
<br>
Currently cold functions are marked with the "optsize" attribute in CodeGen<br>
so they are always optimized for size.  The hot attribute is just ignored,<br>
LLVM doesn't have a way to express hotness at the moment.<br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/attr-coldhot.c<br>
    cfe/trunk/test/Sema/attr-coldhot.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/Attr.td<br>
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
    cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/Attr.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=156723&r1=156722&r2=156723&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=156723&r1=156722&r2=156723&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/Attr.td (original)<br>
+++ cfe/trunk/include/clang/Basic/Attr.td Sat May 12 16:10:52 2012<br>
@@ -243,6 +243,10 @@<br>
   let Args = [FunctionArgument<"FunctionDecl">];<br>
 }<br>
<br>
+def Cold : InheritableAttr {<br>
+  let Spellings = ["cold"];<br>
+}<br>
+<br>
 def Common : InheritableAttr {<br>
   let Spellings = ["common"];<br>
 }<br>
@@ -348,6 +352,10 @@<br>
   let Spellings = ["gnu_inline"];<br>
 }<br>
<br>
+def Hot : InheritableAttr {<br>
+  let Spellings = ["hot"];<br>
+}<br>
+<br>
 def IBAction : InheritableAttr {<br>
   let Spellings = ["ibaction"];<br>
 }<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=156723&r1=156722&r2=156723&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=156723&r1=156722&r2=156723&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat May 12 16:10:52 2012<br>
@@ -523,6 +523,10 @@<br>
       !F->hasFnAttr(llvm::Attribute::NoInline))<br>
     F->addFnAttr(llvm::Attribute::AlwaysInline);<br>
<br>
+  // FIXME: Communicate hot and cold attributes to LLVM more directly.<br>
+  if (D->hasAttr<ColdAttr>())<br>
+    F->addFnAttr(llvm::Attribute::OptimizeForSize);<br>
+<br>
   if (isa<CXXConstructorDecl>(D) || isa<CXXDestructorDecl>(D))<br>
     F->setUnnamedAddr(true);<br>
<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=156723&r1=156722&r2=156723&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=156723&r1=156722&r2=156723&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Sat May 12 16:10:52 2012<br>
@@ -1294,6 +1294,46 @@<br>
                                          Str->getString()));<br>
 }<br>
<br>
+static void handleColdAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
+  // Check the attribute arguments.<br>
+  if (!checkAttributeNumArgs(S, Attr, 0))<br>
+    return;<br>
+<br>
+  if (!isa<FunctionDecl>(D)) {<br>
+    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)<br>
+      << Attr.getName() << ExpectedFunction;<br>
+    return;<br>
+  }<br>
+<br>
+  if (D->hasAttr<HotAttr>()) {<br>
+    S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)<br>
+      << Attr.getName() << "hot";<br>
+    return;<br>
+  }<br>
+<br>
+  D->addAttr(::new (S.Context) ColdAttr(Attr.getRange(), S.Context));<br>
+}<br>
+<br>
+static void handleHotAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
+  // Check the attribute arguments.<br>
+  if (!checkAttributeNumArgs(S, Attr, 0))<br>
+    return;<br>
+<br>
+  if (!isa<FunctionDecl>(D)) {<br>
+    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)<br>
+      << Attr.getName() << ExpectedFunction;<br>
+    return;<br>
+  }<br>
+<br>
+  if (D->hasAttr<ColdAttr>()) {<br>
+    S.Diag(Attr.getLoc(), diag::err_attributes_are_not_compatible)<br>
+      << Attr.getName() << "cold";<br>
+    return;<br>
+  }<br>
+<br>
+  D->addAttr(::new (S.Context) HotAttr(Attr.getRange(), S.Context));<br>
+}<br>
+<br>
 static void handleNakedAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
   // Check the attribute arguments.<br>
   if (!checkAttributeNumArgs(S, Attr, 0))<br>
@@ -3825,6 +3865,8 @@<br>
   case AttributeList::AT_ownership_takes:<br>
   case AttributeList::AT_ownership_holds:<br>
       handleOwnershipAttr     (S, D, Attr); break;<br>
+  case AttributeList::AT_cold:        handleColdAttr        (S, D, Attr); break;<br>
+  case AttributeList::AT_hot:         handleHotAttr         (S, D, Attr); break;<br>
   case AttributeList::AT_naked:       handleNakedAttr       (S, D, Attr); break;<br>
   case AttributeList::AT_noreturn:    handleNoReturnAttr    (S, D, Attr); break;<br>
   case AttributeList::AT_nothrow:     handleNothrowAttr     (S, D, Attr); break;<br>
<br>
Added: cfe/trunk/test/CodeGen/attr-coldhot.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/attr-coldhot.c?rev=156723&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/attr-coldhot.c?rev=156723&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGen/attr-coldhot.c (added)<br>
+++ cfe/trunk/test/CodeGen/attr-coldhot.c Sat May 12 16:10:52 2012<br>
@@ -0,0 +1,9 @@<br>
+// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s<br>
+<br>
+int test1() __attribute__((__cold__)) {<br>
+  return 42;<br>
+<br>
+// Check that we set the optsize attribute on the function.<br>
+// CHECK: @test1{{.*}}optsize<br>
+// CHECK: ret<br>
+}<br>
<br>
Added: cfe/trunk/test/Sema/attr-coldhot.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-coldhot.c?rev=156723&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-coldhot.c?rev=156723&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Sema/attr-coldhot.c (added)<br>
+++ cfe/trunk/test/Sema/attr-coldhot.c Sat May 12 16:10:52 2012<br>
@@ -0,0 +1,10 @@<br>
+// RUN: %clang_cc1 -fsyntax-only -verify %s<br>
+<br>
+int foo() __attribute__((__hot__));<br>
+int bar() __attribute__((__cold__));<br>
+<br>
+int var1 __attribute__((__cold__)); // expected-warning{{'__cold__' attribute only applies to functions}}<br>
+int var2 __attribute__((__hot__)); // expected-warning{{'__hot__' attribute only applies to functions}}<br>
+<br>
+int qux() __attribute__((__hot__)) __attribute__((__cold__)); // expected-error{{'__hot__' and cold attributes are not compatible}}<br>
+int baz() __attribute__((__cold__)) __attribute__((__hot__)); // expected-error{{'__cold__' and hot attributes are not compatible}}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>