summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2014-09-04 22:16:48 +0000
committerHans Wennborg <hans@hanshq.net>2014-09-04 22:16:48 +0000
commit93dbeae0f7345b34080082a17fd0568aa2afe292 (patch)
tree3757ccc988400b9c48aa0b7e668a11aac9c5835f
parentd62cdd2c14c481e6d3e7fdebc17baba2ba447b24 (diff)
downloadbcm5719-llvm-93dbeae0f7345b34080082a17fd0568aa2afe292.tar.gz
bcm5719-llvm-93dbeae0f7345b34080082a17fd0568aa2afe292.zip
Don't allow inline asm statements to reference parameters in naked functions
Differential Revision: http://reviews.llvm.org/D5183 llvm-svn: 217200
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaStmtAsm.cpp13
-rw-r--r--clang/test/Sema/attr-naked.c5
-rw-r--r--clang/test/Sema/ms-inline-asm.c11
4 files changed, 31 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index cda5aa02caa..78f3eeb70cd 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6993,6 +6993,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_parm_ref : Error<
+ "parameter references not allowed in naked functions">;
// OpenCL warnings and errors.
def err_invalid_astype_of_different_size : Error<
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp
index 47a7672ae19..989999f18d9 100644
--- a/clang/lib/Sema/SemaStmtAsm.cpp
+++ b/clang/lib/Sema/SemaStmtAsm.cpp
@@ -405,6 +405,19 @@ ExprResult Sema::LookupInlineAsmIdentifier(CXXScopeSpec &SS,
Result = CheckPlaceholderExpr(Result.get());
if (!Result.isUsable()) return Result;
+ // Referring to parameters is not allowed in naked functions.
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Result.get())) {
+ if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
+ if (FunctionDecl *Func = dyn_cast<FunctionDecl>(Parm->getDeclContext())) {
+ if (Func->hasAttr<NakedAttr>()) {
+ Diag(Id.getLocStart(), diag::err_asm_naked_parm_ref);
+ Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
+ return ExprError();
+ }
+ }
+ }
+ }
+
QualType T = Result.get()->getType();
// For now, reject dependent types.
diff --git a/clang/test/Sema/attr-naked.c b/clang/test/Sema/attr-naked.c
index c1ad52c4548..f6c26b29fc3 100644
--- a/clang/test/Sema/attr-naked.c
+++ b/clang/test/Sema/attr-naked.c
@@ -18,3 +18,8 @@ __attribute__((naked)) int t4() {
asm("movl $42, %eax");
asm("retl");
}
+
+__attribute__((naked)) int t5(int x) {
+ asm("movl x, %eax");
+ asm("retl");
+}
diff --git a/clang/test/Sema/ms-inline-asm.c b/clang/test/Sema/ms-inline-asm.c
index d4227027d7c..358b0bd4543 100644
--- a/clang/test/Sema/ms-inline-asm.c
+++ b/clang/test/Sema/ms-inline-asm.c
@@ -103,3 +103,14 @@ void t4() {
void test_operand_size() {
__asm { call word t4 } // expected-error {{Expected 'PTR' or 'ptr' token!}}
}
+
+__declspec(naked) int t5(int x) { // expected-note {{attribute is here}}
+ asm { movl eax, x } // expected-error {{parameter references not allowed in naked functions}}
+ asm { retl }
+}
+
+int y;
+__declspec(naked) int t6(int x) {
+ asm { mov eax, y } // No error.
+ asm { ret }
+}
OpenPOWER on IntegriCloud