diff options
author | Tom Care <tcare@apple.com> | 2010-07-06 17:28:49 +0000 |
---|---|---|
committer | Tom Care <tcare@apple.com> | 2010-07-06 17:28:49 +0000 |
commit | 7d6228fc77baf405c6554bb47904fc197e33b488 (patch) | |
tree | fd02e188d7a9ceae725bf77ae7fd36f990095e30 /lib | |
parent | 057d9afdc7e8027f3b928f0dd8d7d921d7cd5615 (diff) |
Added several helper functions to Stmt to recursively check for different elements (macros, enum constants, etc).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107675 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Stmt.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 6dbe8f4d18..d1084327a2 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -127,6 +127,72 @@ bool Stmt::hasImplicitControlFlow() const { } } +// Recursively find any substatements containing macros +bool Stmt::containsMacro(const Stmt *S) { + if (S->getLocStart().isMacroID()) + return true; + + if (S->getLocEnd().isMacroID()) + return true; + + for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); ++I) + if (const Stmt *child = *I) + if (containsMacro(child)) + return true; + + return false; +} + +// Recursively find any substatements containing enum constants +bool Stmt::containsEnum(const Stmt *S) { + const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(S); + + if (DR && isa<EnumConstantDecl>(DR->getDecl())) + return true; + + for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); ++I) + if (const Stmt *child = *I) + if (containsEnum(child)) + return true; + + return false; +} + +bool Stmt::containsZeroConstant(const Stmt *S) { + const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(S); + if (IL && IL->getValue() == 0) + return true; + + const FloatingLiteral *FL = dyn_cast<FloatingLiteral>(S); + if (FL && FL->getValue().isZero()) + return true; + + for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); ++I) + if (const Stmt *child = *I) + if (containsZeroConstant(child)) + return true; + + return false; +} + +bool Stmt::containsOneConstant(const Stmt *S) { + const IntegerLiteral *IL = dyn_cast<IntegerLiteral>(S); + if (IL && IL->getValue() == 1) + return true; + + const FloatingLiteral *FL = dyn_cast<FloatingLiteral>(S); + const llvm::APFloat one(1.0); + if (FL && FL->getValue().compare(one) == llvm::APFloat::cmpEqual) + return true; + + for (Stmt::const_child_iterator I = S->child_begin(); I != S->child_end(); ++I) + if (const Stmt *child = *I) + if (containsOneConstant(child)) + return true; + + return false; +} + Expr *AsmStmt::getOutputExpr(unsigned i) { return cast<Expr>(Exprs[i]); } |