r223985 - Diagnose attributes 'optnone' and 'minsize' on the same declaration.
Paul Robinson
paul_robinson at playstation.sony.com
Wed Dec 10 15:34:36 PST 2014
Author: probinson
Date: Wed Dec 10 17:34:36 2014
New Revision: 223985
URL: http://llvm.org/viewvc/llvm-project?rev=223985&view=rev
Log:
Diagnose attributes 'optnone' and 'minsize' on the same declaration.
Eventually we'll diagnose them on different declarations, but let's
get this part out of the way first.
Modified:
cfe/trunk/lib/Sema/SemaDeclAttr.cpp
cfe/trunk/test/CodeGen/attr-optnone.c
cfe/trunk/test/SemaCXX/attr-optnone.cpp
cfe/trunk/test/SemaCXX/pragma-optimize.cpp
Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=223985&r1=223984&r2=223985&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Wed Dec 10 17:34:36 2014
@@ -3146,10 +3146,22 @@ static void handleAlwaysInlineAttr(Sema
Attr.getAttributeSpellingListIndex()));
}
+static void handleMinSizeAttr(Sema &S, Decl *D,
+ const AttributeList &Attr) {
+ if (checkAttrMutualExclusion<OptimizeNoneAttr>(S, D, Attr))
+ return;
+
+ D->addAttr(::new (S.Context)
+ MinSizeAttr(Attr.getRange(), S.Context,
+ Attr.getAttributeSpellingListIndex()));
+}
+
static void handleOptimizeNoneAttr(Sema &S, Decl *D,
const AttributeList &Attr) {
if (checkAttrMutualExclusion<AlwaysInlineAttr>(S, D, Attr))
return;
+ if (checkAttrMutualExclusion<MinSizeAttr>(S, D, Attr))
+ return;
D->addAttr(::new (S.Context)
OptimizeNoneAttr(Attr.getRange(), S.Context,
@@ -4340,7 +4352,7 @@ static void ProcessDeclAttribute(Sema &S
handleExtVectorTypeAttr(S, scope, D, Attr);
break;
case AttributeList::AT_MinSize:
- handleSimpleAttribute<MinSizeAttr>(S, D, Attr);
+ handleMinSizeAttr(S, D, Attr);
break;
case AttributeList::AT_OptimizeNone:
handleOptimizeNoneAttr(S, D, Attr);
Modified: cfe/trunk/test/CodeGen/attr-optnone.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/attr-optnone.c?rev=223985&r1=223984&r2=223985&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/attr-optnone.c (original)
+++ cfe/trunk/test/CodeGen/attr-optnone.c Wed Dec 10 17:34:36 2014
@@ -9,7 +9,7 @@ __attribute__((always_inline))
int test2() { return 0; }
// OPTSIZE: @test2{{.*}}[[ATTR2:#[0-9]+]]
-__attribute__((optnone)) __attribute__((minsize))
+__attribute__((optnone))
int test3() { return 0; }
// PRESENT-DAG: @test3{{.*}}[[ATTR3:#[0-9]+]]
Modified: cfe/trunk/test/SemaCXX/attr-optnone.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-optnone.cpp?rev=223985&r1=223984&r2=223985&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/attr-optnone.cpp (original)
+++ cfe/trunk/test/SemaCXX/attr-optnone.cpp Wed Dec 10 17:34:36 2014
@@ -6,6 +6,9 @@ int bar() __attribute__((optnone)) __att
int baz() __attribute__((always_inline)) __attribute__((optnone)); // expected-error{{'always_inline' and 'optnone' attributes are not compatible}}
int quz() __attribute__((optnone)) __attribute__((always_inline)); // expected-error{{'optnone' and 'always_inline' attributes are not compatible}}
+int bay() __attribute__((minsize)) __attribute__((optnone)); // expected-error{{'minsize' and 'optnone' attributes are not compatible}}
+int quy() __attribute__((optnone)) __attribute__((minsize)); // expected-error{{'optnone' and 'minsize' attributes are not compatible}}
+
__forceinline __attribute__((optnone)) int bax(); // expected-error{{'__forceinline' and 'optnone' attributes are not compatible}}
__attribute__((optnone)) __forceinline int qux(); // expected-error{{'optnone' and '__forceinline' attributes are not compatible}}
Modified: cfe/trunk/test/SemaCXX/pragma-optimize.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/pragma-optimize.cpp?rev=223985&r1=223984&r2=223985&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/pragma-optimize.cpp (original)
+++ cfe/trunk/test/SemaCXX/pragma-optimize.cpp Wed Dec 10 17:34:36 2014
@@ -55,6 +55,13 @@ int __attribute__((always_inline)) baz(i
}
// CHECK-DAG: @_Z3bazi{{.*}} [[ATTRBAZ:#[0-9]+]]
+// This function definition will not be decorated with `optnone` because the
+// attribute would conflict with `minsize`.
+int __attribute__((minsize)) bax(int z) {
+ return foo(z, 2);
+}
+// CHECK-DAG: @_Z3baxi{{.*}} [[ATTRBAX:#[0-9]+]]
+
#pragma clang optimize on
// The function "int wombat(int param)" created by the macro is not
@@ -144,6 +151,7 @@ int yet_another_normal(int x) {
// Check that the other functions do NOT have optnone.
// CHECK-DAG-NOT: attributes [[ATTRFOO]] = { {{.*}}optnone{{.*}} }
// CHECK-DAG-NOT: attributes [[ATTRBAZ]] = { {{.*}}optnone{{.*}} }
+// CHECK-DAG-NOT: attributes [[ATTRBAX]] = { {{.*}}optnone{{.*}} }
// CHECK-DAG-NOT: attributes [[ATTRWOMBAT]] = { {{.*}}optnone{{.*}} }
// CHECK-DAG-NOT: attributes [[ATTRCONTAINER]] = { {{.*}}optnone{{.*}} }
// CHECK-DAG-NOT: attributes [[ATTRTWICE]] = { {{.*}}optnone{{.*}} }
More information about the cfe-commits
mailing list