From: Nikola Smiljanic Date: Tue, 13 Sep 2016 07:02:02 +0000 (+0000) Subject: Allow register variables in naked functions. X-Git-Tag: llvmorg-4.0.0-rc1~9981 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=98d2e59d72c38c53b356cc7239ba5e9702dcab75;p=platform%2Fupstream%2Fllvm.git Allow register variables in naked functions. llvm-svn: 281298 --- diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 773d00b..0c2540b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11818,6 +11818,21 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, if (FD && FD->hasAttr()) { for (const Stmt *S : Body->children()) { + // Allow local register variables without initializer as they don't + // require prologue. + bool RegisterVariables = false; + if (auto *DS = dyn_cast(S)) { + for (const auto *Decl : DS->decls()) { + if (const auto *Var = dyn_cast(Decl)) { + RegisterVariables = + Var->hasAttr() && !Var->hasInit(); + if (!RegisterVariables) + break; + } + } + } + if (RegisterVariables) + continue; if (!isa(S) && !isa(S)) { Diag(S->getLocStart(), diag::err_non_asm_stmt_in_naked_function); Diag(FD->getAttr()->getLocation(), diag::note_attribute); diff --git a/clang/test/Sema/attr-naked.c b/clang/test/Sema/attr-naked.c index 6b1344a..c9a3f1d 100644 --- a/clang/test/Sema/attr-naked.c +++ b/clang/test/Sema/attr-naked.c @@ -48,3 +48,21 @@ __attribute__((naked)) void t9(int z) { // expected-note{{attribute is here}} "r"(z) // expected-error{{parameter references not allowed in naked functions}} ); } + +__attribute__((naked)) void t10() { // expected-note{{attribute is here}} + int a; // expected-error{{non-ASM statement in naked function is not supported}} +} + +__attribute__((naked)) void t11() { // expected-note{{attribute is here}} + register int a asm("eax") = x; // expected-error{{non-ASM statement in naked function is not supported}} +} + +__attribute__((naked)) void t12() { // expected-note{{attribute is here}} + register int a asm("eax"), b asm("ebx") = x; // expected-error{{non-ASM statement in naked function is not supported}} +} + +__attribute__((naked)) void t13() { + register int a asm("eax"); + register int b asm("ebx"), c asm("ecx"); +} +