summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorWeiming Zhao <weimingz@codeaurora.org>2015-02-03 22:35:58 +0000
committerWeiming Zhao <weimingz@codeaurora.org>2015-02-03 22:35:58 +0000
commit71ac240620c4fedb6e49c302c490e99bb2d37eb4 (patch)
tree7e77100160781705607098aa9d51d08dfffc1970 /clang
parentab1dc2d54db5fc2ad4ee748745420eac844a5ea3 (diff)
downloadbcm5719-llvm-71ac240620c4fedb6e49c302c490e99bb2d37eb4.tar.gz
bcm5719-llvm-71ac240620c4fedb6e49c302c490e99bb2d37eb4.zip
Diagnose CXX 'this' pointer reference in funcs with naked attr
Clang asserts for this pointer reference in asms of naked functions. This patch diagnoses if this pointer reference is used. Differential Revision: http://reviews.llvm.org/D7329 llvm-svn: 228052
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaStmtAsm.cpp6
-rw-r--r--clang/test/Sema/attr-naked.cpp15
3 files changed, 23 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 1283bafd61a..9bbdab4918e 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -7211,6 +7211,8 @@ def err_filter_expression_integral : Error<
def err_non_asm_stmt_in_naked_function : Error<
"non-ASM statement in naked function is not supported">;
+def err_asm_naked_this_ref : Error<
+ "'this' pointer references not allowed in naked functions">;
def err_asm_naked_parm_ref : Error<
"parameter references not allowed in naked functions">;
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 0d32581e8da..1beac366c50 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "clang/Sema/SemaInternal.h"
+#include "clang/AST/ExprCXX.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/TargetInfo.h"
@@ -86,6 +87,11 @@ static bool CheckNakedParmReference(Expr *E, Sema &S) {
WorkList.push_back(E);
while (WorkList.size()) {
Expr *E = WorkList.pop_back_val();
+ if (isa<CXXThisExpr>(E)) {
+ S.Diag(E->getLocStart(), diag::err_asm_naked_this_ref);
+ S.Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
+ return true;
+ }
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
if (isa<ParmVarDecl>(DRE->getDecl())) {
S.Diag(DRE->getLocStart(), diag::err_asm_naked_parm_ref);
diff --git a/clang/test/Sema/attr-naked.cpp b/clang/test/Sema/attr-naked.cpp
new file mode 100644
index 00000000000..eaa8e223b83
--- /dev/null
+++ b/clang/test/Sema/attr-naked.cpp
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 %s -verify -fsyntax-only -triple arm-none-linux
+class Foo {
+ void bar();
+ static void bar2();
+ unsigned v;
+ static unsigned s;
+};
+
+void __attribute__((naked)) Foo::bar() { // expected-note{{attribute is here}}
+ asm("mov r2, %0" : : "r"(v)); // expected-error{{'this' pointer references not allowed in naked functions}}
+}
+
+void __attribute__((naked)) Foo::bar2() {
+ asm("mov r2, %0" : : "r"(s)); // static member reference is OK
+}
OpenPOWER on IntegriCloud