void StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
- Indent() << "asm (/*todo*/);\n";
+ Indent() << "asm (";
+ VisitStringLiteral(Node->getAsmString());
+ OS << ");\n";
}
void StmtPrinter::VisitObjcAtTryStmt(ObjcAtTryStmt *Node) {
void AsmStmt::EmitImpl(Serializer& S) const {
S.Emit(AsmLoc);
+ getAsmString()->EmitImpl(S);
S.Emit(RParenLoc);
}
AsmStmt* AsmStmt::CreateImpl(Deserializer& D) {
SourceLocation ALoc = SourceLocation::ReadVal(D);
+ StringLiteral *AsmStr = StringLiteral::CreateImpl(D);
SourceLocation PLoc = SourceLocation::ReadVal(D);
- return new AsmStmt(ALoc,PLoc);
+ return new AsmStmt(ALoc, AsmStr, PLoc);
}
void BinaryOperator::EmitImpl(Serializer& S) const {
}
Loc = ConsumeParen();
- ParseAsmStringLiteral();
-
+ ExprResult AsmString = ParseAsmStringLiteral();
+ if (AsmString.isInvalid)
+ return true;
+
// Parse Outputs, if present.
ParseAsmOperandsOpt();
SourceLocation RParenLoc = MatchRHSPunctuation(tok::r_paren, Loc);
// FIXME: Pass all the details down to the action.
- return Actions.ActOnAsmStmt(AsmLoc, RParenLoc);
+ return Actions.ActOnAsmStmt(AsmLoc, AsmString.Val, RParenLoc);
}
/// ParseAsmOperands - Parse the asm-operands production as used by
/// [GNU] asm-string-literal:
/// string-literal
///
-void Parser::ParseAsmStringLiteral() {
+Parser::ExprResult Parser::ParseAsmStringLiteral() {
if (!isTokenStringLiteral()) {
Diag(Tok, diag::err_expected_string_literal);
- return;
+ return true;
}
ExprResult Res = ParseStringLiteralExpression();
- if (Res.isInvalid) return;
+ if (Res.isInvalid) return true;
// TODO: Diagnose: wide string literal in 'asm'
+
+ return Res;
}
/// ParseSimpleAsm
virtual StmtResult ActOnReturnStmt(SourceLocation ReturnLoc,
ExprTy *RetValExp);
- virtual StmtResult ActOnAsmStmt(SourceLocation AsmLoc,
+ virtual StmtResult ActOnAsmStmt(SourceLocation AsmLoc,
+ ExprTy *AsmString,
SourceLocation RParenLoc);
virtual StmtResult ActOnObjcAtCatchStmt(SourceLocation AtLoc,
return new ReturnStmt(ReturnLoc, (Expr*)RetValExp);
}
-Sema::StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
+Sema::StmtResult Sema::ActOnAsmStmt(SourceLocation AsmLoc,
+ ExprTy *AsmString,
SourceLocation RParenLoc) {
- return new AsmStmt(AsmLoc, RParenLoc);
+ Expr *E = (Expr *)AsmString;
+
+ return new AsmStmt(AsmLoc, cast<StringLiteral>(E), RParenLoc);
}
Action::StmtResult
class ScopedDecl;
class IdentifierInfo;
class SourceManager;
+ class StringLiteral;
class SwitchStmt;
class PrinterHelper;
///
class AsmStmt : public Stmt {
SourceLocation AsmLoc, RParenLoc;
+ StringLiteral *AsmStr;
// FIXME: This doesn't capture most of the interesting pieces.
public:
- AsmStmt(SourceLocation asmloc, SourceLocation rparenloc)
- : Stmt(AsmStmtClass), AsmLoc(asmloc), RParenLoc(rparenloc) {}
+ AsmStmt(SourceLocation asmloc, StringLiteral *asmstr,
+ SourceLocation rparenloc)
+ : Stmt(AsmStmtClass), AsmLoc(asmloc), RParenLoc(rparenloc),
+ AsmStr(asmstr) {}
+ const StringLiteral *getAsmString() const { return AsmStr; }
+ StringLiteral *getAsmString() { return AsmStr; }
+
virtual SourceRange getSourceRange() const {
return SourceRange(AsmLoc, RParenLoc);
}
ExprTy *RetValExp) {
return 0;
}
- virtual StmtResult ActOnAsmStmt(SourceLocation AsmLoc,
+ virtual StmtResult ActOnAsmStmt(SourceLocation AsmLoc,
+ ExprTy *AsmString,
SourceLocation RParenLoc) {
return 0;
}
}
bool SkipUntil(const tok::TokenKind *Toks, unsigned NumToks,
bool StopAtSemi = true, bool DontConsume = false);
-
+
+ typedef Action::ExprResult ExprResult;
+ typedef Action::StmtResult StmtResult;
+
//===--------------------------------------------------------------------===//
// C99 6.9: External Definitions.
DeclTy *ParseExternalDeclaration();
DeclTy *ParseFunctionDefinition(Declarator &D);
void ParseKNRParamDeclarations(Declarator &D);
void ParseSimpleAsm();
- void ParseAsmStringLiteral();
+ ExprResult ParseAsmStringLiteral();
// Objective-C External Declarations
DeclTy *ParseObjCAtDirectives();
//===--------------------------------------------------------------------===//
// C99 6.5: Expressions.
- typedef Action::ExprResult ExprResult;
- typedef Action::StmtResult StmtResult;
-
ExprResult ParseExpression();
ExprResult ParseConstantExpression();
ExprResult ParseAssignmentExpression(); // Expr that doesn't include commas.