return nonlval::SymbolVal(SymMgr.getSymbol(D));
}
-void RValue::print() const {
- print(*llvm::cerr.stream());
+//===----------------------------------------------------------------------===//
+// Utility methods for constructing LValues.
+//===----------------------------------------------------------------------===//
+
+LValue LValue::GetValue(AddrLabelExpr* E) {
+ return lval::GotoLabel(E->getLabel());
}
//===----------------------------------------------------------------------===//
// Pretty-Printing.
//===----------------------------------------------------------------------===//
+void RValue::print() const {
+ print(*llvm::cerr.stream());
+}
+
void RValue::print(std::ostream& Out) const {
switch (getBaseKind()) {
case UnknownKind:
case lval::SymbolValKind:
Out << '$' << cast<lval::SymbolVal>(this)->getSymbol();
break;
+
+ case lval::GotoLabelKind:
+ Out << "&&"
+ << cast<lval::GotoLabel>(this)->getLabel()->getID()->getName();
+ break;
case lval::DeclValKind:
Out << '&'
RValue EvalCast(ValueManager& ValMgr, Expr* CastExpr) const;
+ static LValue GetValue(AddrLabelExpr* E);
+
// Implement isa<T> support.
static inline bool classof(const RValue* V) {
return V->getBaseKind() != NonLValueKind;
namespace lval {
enum Kind { SymbolValKind,
+ GotoLabelKind,
DeclValKind,
ConcreteIntKind,
NumKind };
static inline bool classof(const RValue* V) {
return isa<LValue>(V) && V->getSubKind() == SymbolValKind;
- }
+ }
+
+ static inline bool classof(const LValue* V) {
+ return V->getSubKind() == SymbolValKind;
+ }
};
+ class GotoLabel : public LValue {
+ public:
+ GotoLabel(LabelStmt* Label) : LValue(GotoLabelKind, Label) {}
+
+ LabelStmt* getLabel() const {
+ return static_cast<LabelStmt*>(getRawPtr());
+ }
+
+ static inline bool classof(const RValue* V) {
+ return isa<LValue>(V) && V->getSubKind() == GotoLabelKind;
+ }
+
+ static inline bool classof(const LValue* V) {
+ return V->getSubKind() == GotoLabelKind;
+ }
+ };
+
+
class DeclVal : public LValue {
public:
DeclVal(const ValueDecl* vd) : LValue(DeclValKind,vd) {}
static inline bool classof(const RValue* V) {
return isa<LValue>(V) && V->getSubKind() == DeclValKind;
}
+
+ static inline bool classof(const LValue* V) {
+ return V->getSubKind() == DeclValKind;
+ }
};
class ConcreteInt : public LValue {
};
} // end clang::lval namespace
-
-
+
} // end clang namespace
#endif
RValue ValueStateManager::GetValue(ValueState St, Expr* E, bool* hasVal) {
for (;;) {
switch (E->getStmtClass()) {
+
+ case Stmt::AddrLabelExprClass:
+ return LValue::GetValue(cast<AddrLabelExpr>(E));
// ParenExprs are no-ops.