Added lval type (and tracking) for StringLiterals.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50109 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp
index 253e005..499da2f 100644
--- a/lib/Analysis/CFRefCount.cpp
+++ b/lib/Analysis/CFRefCount.cpp
@@ -826,6 +826,8 @@
       //  should compose behavior, not copy it.
       StateMgr.Unbind(StVals, cast<LVal>(V));
     }
+    else if (isa<nonlval::LValAsInteger>(V))
+      StateMgr.Unbind(StVals, cast<nonlval::LValAsInteger>(V).getLVal());
   }    
   
   St = StateMgr.getPersistentState(StVals);
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index bdb7429..128ef82 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -2014,6 +2014,7 @@
     case lval::DeclValKind:
     case lval::FuncValKind:
     case lval::GotoLabelKind:
+    case lval::StringLiteralValKind:
       isFeasible = Assumption;
       return St;
 
diff --git a/lib/Analysis/GRSimpleVals.cpp b/lib/Analysis/GRSimpleVals.cpp
index 2c14dde..e41df76 100644
--- a/lib/Analysis/GRSimpleVals.cpp
+++ b/lib/Analysis/GRSimpleVals.cpp
@@ -572,6 +572,10 @@
     
     if (isa<LVal>(V))
       St = StateMgr.SetRVal(St, cast<LVal>(V), UnknownVal());
+    else if (isa<nonlval::LValAsInteger>(V))
+      St = StateMgr.SetRVal(St, cast<nonlval::LValAsInteger>(V).getLVal(),
+                            UnknownVal());
+    
   }
   
   // Make up a symbol for the return value of this function.
diff --git a/lib/Analysis/RValues.cpp b/lib/Analysis/RValues.cpp
index 86f5ac9..5e161f3 100644
--- a/lib/Analysis/RValues.cpp
+++ b/lib/Analysis/RValues.cpp
@@ -240,6 +240,10 @@
 
 LVal LVal::MakeVal(AddrLabelExpr* E) { return lval::GotoLabel(E->getLabel()); }
 
+LVal LVal::MakeVal(StringLiteral* S) {
+  return lval::StringLiteralVal(S);
+}
+
 //===----------------------------------------------------------------------===//
 // Utility methods for constructing RVals (both NonLVals and LVals).
 //===----------------------------------------------------------------------===//
@@ -392,6 +396,12 @@
           << cast<lval::FuncVal>(this)->getDecl()->getIdentifier()->getName();
       break;
       
+    case lval::StringLiteralValKind:
+      Out << "literal \""
+          << cast<lval::StringLiteralVal>(this)->getLiteral()->getStrData()
+          << "\"";
+      break;
+      
     default:
       assert (false && "Pretty-printing not implemented for this LVal.");
       break;
diff --git a/lib/Analysis/ValueState.cpp b/lib/Analysis/ValueState.cpp
index bba2e06..8027ce9 100644
--- a/lib/Analysis/ValueState.cpp
+++ b/lib/Analysis/ValueState.cpp
@@ -264,6 +264,9 @@
       case Stmt::IntegerLiteralClass: {
         return NonLVal::MakeVal(BasicVals, cast<IntegerLiteral>(E));
       }
+        
+      case Stmt::StringLiteralClass:
+        return LVal::MakeVal(cast<StringLiteral>(E));
 
         // Casts where the source and target type are the same
         // are no-ops.  We blast through these to get the descendant