Author: nikola Date: Tue Sep 13 02:02:02 2016 New Revision: 281298 URL: http://llvm.org/viewvc/llvm-project?rev=281298&view=rev Log: Allow register variables in naked functions.
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/Sema/attr-naked.c Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=281298&r1=281297&r2=281298&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Sep 13 02:02:02 2016 @@ -11818,6 +11818,21 @@ Decl *Sema::ActOnFinishFunctionBody(Decl if (FD && FD->hasAttr<NakedAttr>()) { 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<DeclStmt>(S)) { + for (const auto *Decl : DS->decls()) { + if (const auto *Var = dyn_cast<VarDecl>(Decl)) { + RegisterVariables = + Var->hasAttr<AsmLabelAttr>() && !Var->hasInit(); + if (!RegisterVariables) + break; + } + } + } + if (RegisterVariables) + continue; if (!isa<AsmStmt>(S) && !isa<NullStmt>(S)) { Diag(S->getLocStart(), diag::err_non_asm_stmt_in_naked_function); Diag(FD->getAttr<NakedAttr>()->getLocation(), diag::note_attribute); Modified: cfe/trunk/test/Sema/attr-naked.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/attr-naked.c?rev=281298&r1=281297&r2=281298&view=diff ============================================================================== --- cfe/trunk/test/Sema/attr-naked.c (original) +++ cfe/trunk/test/Sema/attr-naked.c Tue Sep 13 02:02:02 2016 @@ -48,3 +48,21 @@ __attribute__((naked)) void t9(int z) { "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"); +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits