summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-08-28 17:43:23 +0000
committerChad Rosier <mcrosier@apple.com>2012-08-28 17:43:23 +0000
commitbbbe9ab876fc02832a6c5a79ec45fd8bc3a4e39e (patch)
treee150013f6bc209896ae325dbea1721ac24b451d5 /clang
parent783e7c02c6348a634fbbcfd46357125eafb87c40 (diff)
downloadbcm5719-llvm-bbbe9ab876fc02832a6c5a79ec45fd8bc3a4e39e.tar.gz
bcm5719-llvm-bbbe9ab876fc02832a6c5a79ec45fd8bc3a4e39e.zip
[ms-inline asm] Make the AsmStmt class non-virtual.
llvm-svn: 162768
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/Stmt.h16
-rw-r--r--clang/lib/AST/Stmt.cpp54
2 files changed, 61 insertions, 9 deletions
diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h
index 455a24fe220..2303cb910fd 100644
--- a/clang/include/clang/AST/Stmt.h
+++ b/clang/include/clang/AST/Stmt.h
@@ -1393,8 +1393,6 @@ public:
explicit AsmStmt(StmtClass SC, EmptyShell Empty) :
Stmt(SC, Empty), Names(0), Exprs(0) { }
- virtual ~AsmStmt() { }
-
SourceLocation getAsmLoc() const { return AsmLoc; }
void setAsmLoc(SourceLocation L) { AsmLoc = L; }
@@ -1409,7 +1407,7 @@ public:
//===--- Asm String Analysis ---===//
/// Assemble final IR asm string.
- virtual std::string generateAsmString(ASTContext &C) const = 0;
+ std::string generateAsmString(ASTContext &C) const;
//===--- Output operands ---===//
@@ -1429,7 +1427,7 @@ public:
/// getOutputConstraint - Return the constraint string for the specified
/// output operand. All output constraints are known to be non-empty (either
/// '=' or '+').
- virtual StringRef getOutputConstraint(unsigned i) const = 0;
+ StringRef getOutputConstraint(unsigned i) const;
/// isOutputPlusConstraint - Return true if the specified output constraint
/// is a "+" constraint (which is both an input and an output) or false if it
@@ -1438,7 +1436,7 @@ public:
return getOutputConstraint(i)[0] == '+';
}
- virtual const Expr *getOutputExpr(unsigned i) const = 0;
+ const Expr *getOutputExpr(unsigned i) const;
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
@@ -1461,14 +1459,14 @@ public:
/// getInputConstraint - Return the specified input constraint. Unlike output
/// constraints, these can be empty.
- virtual StringRef getInputConstraint(unsigned i) const = 0;
-
- virtual const Expr *getInputExpr(unsigned i) const = 0;
+ StringRef getInputConstraint(unsigned i) const;
+
+ const Expr *getInputExpr(unsigned i) const;
//===--- Other ---===//
unsigned getNumClobbers() const { return NumClobbers; }
- virtual StringRef getClobber(unsigned i) const = 0;
+ StringRef getClobber(unsigned i) const;
static bool classof(const Stmt *T) {
return T->getStmtClass() == GCCAsmStmtClass ||
diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp
index b7c2b39895e..e486d05ef95 100644
--- a/clang/lib/AST/Stmt.cpp
+++ b/clang/lib/AST/Stmt.cpp
@@ -321,6 +321,60 @@ bool Stmt::hasImplicitControlFlow() const {
}
}
+std::string AsmStmt::generateAsmString(ASTContext &C) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->generateAsmString(C);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->generateAsmString(C);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
+StringRef AsmStmt::getOutputConstraint(unsigned i) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->getOutputConstraint(i);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->getOutputConstraint(i);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
+const Expr *AsmStmt::getOutputExpr(unsigned i) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->getOutputExpr(i);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->getOutputExpr(i);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
+StringRef AsmStmt::getInputConstraint(unsigned i) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->getInputConstraint(i);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->getInputConstraint(i);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
+const Expr *AsmStmt::getInputExpr(unsigned i) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->getInputExpr(i);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->getInputExpr(i);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
+StringRef AsmStmt::getClobber(unsigned i) const {
+ StmtClass stmtClass = getStmtClass();
+ if (stmtClass == Stmt::GCCAsmStmtClass)
+ return static_cast<const GCCAsmStmt*>(this)->getClobber(i);
+ if (stmtClass == Stmt::MSAsmStmtClass)
+ return static_cast<const MSAsmStmt*>(this)->getClobber(i);
+ llvm_unreachable("unknown asm statement kind!");
+}
+
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
unsigned AsmStmt::getNumPlusOperands() const {
OpenPOWER on IntegriCloud