return false;
}
+static bool CheckNakedParmReference(Expr *E, Sema &S) {
+ FunctionDecl *Func = dyn_cast<FunctionDecl>(S.CurContext);
+ if (!Func)
+ return false;
+ if (!Func->hasAttr<NakedAttr>())
+ return false;
+
+ SmallVector<Expr*, 4> WorkList;
+ WorkList.push_back(E);
+ while (WorkList.size()) {
+ Expr *E = WorkList.pop_back_val();
+ if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
+ if (isa<ParmVarDecl>(DRE->getDecl())) {
+ S.Diag(DRE->getLocStart(), diag::err_asm_naked_parm_ref);
+ S.Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);
+ return true;
+ }
+ }
+ for (Stmt *Child : E->children()) {
+ if (Expr *E = dyn_cast_or_null<Expr>(Child))
+ WorkList.push_back(E);
+ }
+ }
+ return false;
+}
+
StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
bool IsVolatile, unsigned NumOutputs,
unsigned NumInputs, IdentifierInfo **Names,
diag::err_asm_invalid_lvalue_in_output)
<< OutputExpr->getSourceRange());
+ // Referring to parameters is not allowed in naked functions.
+ if (CheckNakedParmReference(OutputExpr, *this))
+ return StmtError();
+
if (RequireCompleteType(OutputExpr->getLocStart(), Exprs[i]->getType(),
diag::err_dereference_incomplete_type))
return StmtError();
Expr *InputExpr = Exprs[i];
+ // Referring to parameters is not allowed in naked functions.
+ if (CheckNakedParmReference(InputExpr, *this))
+ return StmtError();
+
// Only allow void types for memory constraints.
if (Info.allowsMemory() && !Info.allowsRegister()) {
if (CheckAsmLValue(InputExpr, *this))
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();
- }
- }
- }
- }
+ if (CheckNakedParmReference(Result.get(), *this))
+ return ExprError();
QualType T = Result.get()->getType();