[ms-inline asm] Hoist more common code into the AsmStmt base class. Add stubs

with FIXMEs for unimplemented features.  No functional change intended.

llvm-svn: 162716
This commit is contained in:
Chad Rosier 2012-08-28 00:24:05 +00:00
parent 71c85b6a87
commit a1b5c8c6a1
2 changed files with 53 additions and 28 deletions

View File

@ -1426,6 +1426,24 @@ public:
return StringRef();
}
/// 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;
/// isOutputPlusConstraint - Return true if the specified output constraint
/// is a "+" constraint (which is both an input and an output) or false if it
/// is an "=" constraint (just an output).
bool isOutputPlusConstraint(unsigned i) const {
return getOutputConstraint(i)[0] == '+';
}
virtual const Expr *getOutputExpr(unsigned i) const = 0;
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
unsigned getNumPlusOperands() const;
//===--- Input operands ---===//
unsigned getNumInputs() const { return NumInputs; }
@ -1441,6 +1459,12 @@ public:
return StringRef();
}
/// 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;
//===--- Other ---===//
unsigned getNumClobbers() const { return NumClobbers; }
@ -1581,9 +1605,6 @@ public:
//===--- Output operands ---===//
/// getOutputConstraint - Return the constraint string for the specified
/// output operand. All output constraints are known to be non-empty (either
/// '=' or '+').
StringRef getOutputConstraint(unsigned i) const;
const StringLiteral *getOutputConstraintLiteral(unsigned i) const {
@ -1599,21 +1620,8 @@ public:
return const_cast<GCCAsmStmt*>(this)->getOutputExpr(i);
}
/// isOutputPlusConstraint - Return true if the specified output constraint
/// is a "+" constraint (which is both an input and an output) or false if it
/// is an "=" constraint (just an output).
bool isOutputPlusConstraint(unsigned i) const {
return getOutputConstraint(i)[0] == '+';
}
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
unsigned getNumPlusOperands() const;
//===--- Input operands ---===//
/// getInputConstraint - Return the specified input constraint. Unlike output
/// constraints, these can be empty.
StringRef getInputConstraint(unsigned i) const;
const StringLiteral *getInputConstraintLiteral(unsigned i) const {
@ -1706,6 +1714,8 @@ public:
//===--- Output operands ---===//
StringRef getOutputConstraint(unsigned i) const;
Expr *getOutputExpr(unsigned i);
const Expr *getOutputExpr(unsigned i) const {
@ -1714,6 +1724,8 @@ public:
//===--- Input operands ---===//
StringRef getInputConstraint(unsigned i) const;
Expr *getInputExpr(unsigned i);
void setInputExpr(unsigned i, Expr *E);

View File

@ -321,6 +321,16 @@ bool Stmt::hasImplicitControlFlow() const {
}
}
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
unsigned AsmStmt::getNumPlusOperands() const {
unsigned Res = 0;
for (unsigned i = 0, e = getNumOutputs(); i != e; ++i)
if (isOutputPlusConstraint(i))
++Res;
return Res;
}
StringRef GCCAsmStmt::getClobber(unsigned i) const {
return getClobberStringLiteral(i)->getString();
}
@ -336,16 +346,6 @@ StringRef GCCAsmStmt::getOutputConstraint(unsigned i) const {
return getOutputConstraintLiteral(i)->getString();
}
/// getNumPlusOperands - Return the number of output operands that have a "+"
/// constraint.
unsigned GCCAsmStmt::getNumPlusOperands() const {
unsigned Res = 0;
for (unsigned i = 0, e = getNumOutputs(); i != e; ++i)
if (isOutputPlusConstraint(i))
++Res;
return Res;
}
Expr *GCCAsmStmt::getInputExpr(unsigned i) {
return cast<Expr>(Exprs[i + NumOutputs]);
}
@ -353,14 +353,12 @@ void GCCAsmStmt::setInputExpr(unsigned i, Expr *E) {
Exprs[i + NumOutputs] = E;
}
/// getInputConstraint - Return the specified input constraint. Unlike output
/// constraints, these can be empty.
StringRef GCCAsmStmt::getInputConstraint(unsigned i) const {
return getInputConstraintLiteral(i)->getString();
}
void GCCAsmStmt::setOutputsAndInputsAndClobbers(ASTContext &C,
IdentifierInfo **Names,
StringLiteral **Constraints,
@ -584,6 +582,14 @@ Expr *MSAsmStmt::getOutputExpr(unsigned i) {
return cast<Expr>(Exprs[i]);
}
/// getOutputConstraint - Return the constraint string for the specified
/// output operand. All output constraints are known to be non-empty (either
/// '=' or '+').
StringRef MSAsmStmt::getOutputConstraint(unsigned i) const {
// FIXME: Compute constraints.
return StringRef();
}
Expr *MSAsmStmt::getInputExpr(unsigned i) {
return cast<Expr>(Exprs[i + NumOutputs]);
}
@ -591,6 +597,13 @@ void MSAsmStmt::setInputExpr(unsigned i, Expr *E) {
Exprs[i + NumOutputs] = E;
}
/// getInputConstraint - Return the specified input constraint. Unlike output
/// constraints, these can be empty.
StringRef MSAsmStmt::getInputConstraint(unsigned i) const {
// FIXME: Compute constraints.
return StringRef();
}
QualType CXXCatchStmt::getCaughtType() const {
if (ExceptionDecl)
return ExceptionDecl->getType();