From a1b5c8c6a1fc196fcce56cf92eff1e650fdf0036 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Tue, 28 Aug 2012 00:24:05 +0000 Subject: [PATCH] [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 --- clang/include/clang/AST/Stmt.h | 44 +++++++++++++++++++++------------- clang/lib/AST/Stmt.cpp | 37 ++++++++++++++++++---------- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 3c060bab999a..455a24fe220a 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -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(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); diff --git a/clang/lib/AST/Stmt.cpp b/clang/lib/AST/Stmt.cpp index fc66202c4aa7..b7c2b39895ee 100644 --- a/clang/lib/AST/Stmt.cpp +++ b/clang/lib/AST/Stmt.cpp @@ -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(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(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(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();