forked from OSchip/llvm-project
IntegerLiterals are no longer evaluated to create separate nodes; their
values are determined when evaluating the parent expression. llvm-svn: 46096
This commit is contained in:
parent
493444fc19
commit
a14396d51d
|
@ -204,13 +204,19 @@ public:
|
||||||
void BlockStmt_VisitStmt(Stmt* S) { DoStmt(S); }
|
void BlockStmt_VisitStmt(Stmt* S) { DoStmt(S); }
|
||||||
|
|
||||||
void VisitAssign(BinaryOperator* O);
|
void VisitAssign(BinaryOperator* O);
|
||||||
void VisitIntegerLiteral(IntegerLiteral* L);
|
|
||||||
void VisitBinAdd(BinaryOperator* O);
|
void VisitBinAdd(BinaryOperator* O);
|
||||||
void VisitBinSub(BinaryOperator* O);
|
void VisitBinSub(BinaryOperator* O);
|
||||||
void VisitBinAssign(BinaryOperator* D);
|
void VisitBinAssign(BinaryOperator* D);
|
||||||
};
|
};
|
||||||
} // end anonymous namespace
|
} // end anonymous namespace
|
||||||
|
|
||||||
|
static inline Expr* IgnoreParen(Expr* E) {
|
||||||
|
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
|
||||||
|
E = P->getSubExpr();
|
||||||
|
|
||||||
|
return E;
|
||||||
|
}
|
||||||
|
|
||||||
void GRConstants::ProcessStmt(Stmt* S, NodeBuilder& builder) {
|
void GRConstants::ProcessStmt(Stmt* S, NodeBuilder& builder) {
|
||||||
Builder = &builder;
|
Builder = &builder;
|
||||||
Nodes->clear();
|
Nodes->clear();
|
||||||
|
@ -224,9 +230,20 @@ void GRConstants::ProcessStmt(Stmt* S, NodeBuilder& builder) {
|
||||||
|
|
||||||
ExprVariantTy GRConstants::GetBinding(Expr* E) {
|
ExprVariantTy GRConstants::GetBinding(Expr* E) {
|
||||||
DSPtr P(NULL);
|
DSPtr P(NULL);
|
||||||
|
E = IgnoreParen(E);
|
||||||
|
|
||||||
if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(E)) P = DSPtr(D->getDecl());
|
switch (E->getStmtClass()) {
|
||||||
else P = DSPtr(E, getCFG().isBlkExpr(E));
|
case Stmt::DeclRefExprClass:
|
||||||
|
P = DSPtr(cast<DeclRefExpr>(E)->getDecl());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Stmt::IntegerLiteralClass:
|
||||||
|
return cast<IntegerLiteral>(E)->getValue().getZExtValue();
|
||||||
|
|
||||||
|
default:
|
||||||
|
P = DSPtr(E, getCFG().isBlkExpr(E));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
StateTy::iterator I = CurrentState.find(P);
|
StateTy::iterator I = CurrentState.find(P);
|
||||||
|
|
||||||
|
@ -297,10 +314,6 @@ void GRConstants::DoStmt(Stmt* S) {
|
||||||
SwitchNodeSets();
|
SwitchNodeSets();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRConstants::VisitIntegerLiteral(IntegerLiteral* L) {
|
|
||||||
AddBinding(L, L->getValue().getZExtValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
void GRConstants::VisitBinAdd(BinaryOperator* B) {
|
void GRConstants::VisitBinAdd(BinaryOperator* B) {
|
||||||
AddBinding(B, GetBinding(B->getLHS()) + GetBinding(B->getRHS()));
|
AddBinding(B, GetBinding(B->getLHS()) + GetBinding(B->getRHS()));
|
||||||
}
|
}
|
||||||
|
@ -310,14 +323,6 @@ void GRConstants::VisitBinSub(BinaryOperator* B) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline Expr* IgnoreParen(Expr* E) {
|
|
||||||
while (ParenExpr* P = dyn_cast<ParenExpr>(E))
|
|
||||||
E = P->getSubExpr();
|
|
||||||
|
|
||||||
return E;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GRConstants::VisitBinAssign(BinaryOperator* B) {
|
void GRConstants::VisitBinAssign(BinaryOperator* B) {
|
||||||
if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(IgnoreParen(B->getLHS())))
|
if (DeclRefExpr* D = dyn_cast<DeclRefExpr>(IgnoreParen(B->getLHS())))
|
||||||
AddBinding(D->getDecl(), GetBinding(B->getRHS()));
|
AddBinding(D->getDecl(), GetBinding(B->getRHS()));
|
||||||
|
|
Loading…
Reference in New Issue