[PATCH] Diagnose class member function with naked attr
Weiming Zhao
weimingz at codeaurora.org
Sun Feb 1 22:34:51 PST 2015
Currently, clang will assert for non-static class member func with naked attribute because clang won't emit any prologues for such functions, so it would assert trying to codegen 'this' pointer
This patch fixes bug http://llvm.org/bugs/show_bug.cgi?id=22429
http://reviews.llvm.org/D7329
Files:
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaStmtAsm.cpp
test/Sema/attr-naked.cpp
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td
+++ include/clang/Basic/DiagnosticSemaKinds.td
@@ -7174,6 +7174,8 @@
def err_non_asm_stmt_in_naked_function : Error<
"non-ASM statement in naked function is not supported">;
+def err_non_static_naked_member_function : Error<
+ "non-static naked class member function is not supported">;
def err_asm_naked_parm_ref : Error<
"parameter references not allowed in naked functions">;
Index: lib/Sema/SemaStmtAsm.cpp
===================================================================
--- lib/Sema/SemaStmtAsm.cpp
+++ lib/Sema/SemaStmtAsm.cpp
@@ -81,7 +81,11 @@
return false;
if (!Func->hasAttr<NakedAttr>())
return false;
-
+ if (isa<CXXMethodDecl>(Func) && cast<CXXMethodDecl>(Func)->isInstance()) {
+ S.Diag(Func->getLocStart(), diag::err_non_static_naked_member_function);
+ S.Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
+ return true;
+ }
SmallVector<Expr*, 4> WorkList;
WorkList.push_back(E);
while (WorkList.size()) {
Index: test/Sema/attr-naked.cpp
===================================================================
--- /dev/null
+++ test/Sema/attr-naked.cpp
@@ -0,0 +1,18 @@
+// RUN: %clang_cc1 %s -verify -fsyntax-only -triple arm-none-linux
+class Foo {
+ unsigned reg;
+ void bar();
+ static void bar2();
+};
+
+unsigned x;
+
+void __attribute__((naked)) Foo::bar() { // expected-error{{non-static naked class member function is not supported}} expected-note{{attribute is here}}
+ asm("mov r2, %0" : : "r"(reg));
+}
+
+void __attribute__((naked)) Foo::bar2() { // static function is OK
+ asm("mov r2, %0" : : "r"(x));
+}
+
+
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7329.19128.patch
Type: text/x-patch
Size: 1777 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150202/3a1385da/attachment.bin>
More information about the cfe-commits
mailing list