[cfe-commits] r59618 - in /cfe/trunk: include/clang/Analysis/PathSensitive/SVals.h include/clang/Analysis/PathSensitive/SymbolManager.h lib/Analysis/SVals.cpp lib/Analysis/SymbolManager.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Wed Nov 19 16:07:59 PST 2008
On Thu, Nov 20, 2008 at 2:01 AM, Ted Kremenek <kremenek at apple.com> wrote:
> Hi Zhongxing,
>
> Great progress! This looks fine for now, but in the future we should think
> about how symbols that are specific to a given combination of
> StoreManager/ConstraintManager should be factored out of the the base
> implementation of StoreManager.
Do you mean "..out of the base implementation of SymbolicManager"?
>
>
> It's definitely something we should *not* worry about right now, as I think
> we are still trying to factor apart the main pieces of the analysis engine
> (i.e., GRTransferFuncs needs to be overhauled into probably a few big pieces
> similar to StoreManager and ConstraintManager).
>
> Ted
>
>
> On Nov 19, 2008, at 3:03 AM, Zhongxing Xu wrote:
>
> Author: zhongxingxu
>> Date: Wed Nov 19 05:03:17 2008
>> New Revision: 59618
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=59618&view=rev
>> Log:
>> Add SymbolData for array elements and struct fields.
>>
>> Modified:
>> cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
>> cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h
>> cfe/trunk/lib/Analysis/SVals.cpp
>> cfe/trunk/lib/Analysis/SymbolManager.cpp
>>
>> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=59618&r1=59617&r2=59618&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
>> +++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Wed Nov 19
>> 05:03:17 2008
>> @@ -73,6 +73,10 @@
>> }
>>
>> static SVal GetSymbolValue(SymbolManager& SymMgr, VarDecl *D);
>> + static SVal getSymbolValue(SymbolManager& SymMgr, const MemRegion* R,
>> + const llvm::APSInt* Idx, QualType T);
>> + static SVal getSymbolValue(SymbolManager& SymMgr, const MemRegion* R,
>> + const FieldDecl* FD, QualType T);
>>
>> inline bool isUnknown() const {
>> return getRawKind() == UnknownKind;
>>
>> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h?rev=59618&r1=59617&r2=59618&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h
>> (original)
>> +++ cfe/trunk/include/clang/Analysis/PathSensitive/SymbolManager.h Wed Nov
>> 19 05:03:17 2008
>> @@ -24,7 +24,7 @@
>>
>> namespace clang {
>>
>> -
>> +class MemRegion;
>> class SymbolManager;
>>
>> class SymbolID {
>> @@ -69,7 +69,8 @@
>>
>> class SymbolData : public llvm::FoldingSetNode {
>> public:
>> - enum Kind { UndefKind, ParmKind, GlobalKind, ContentsOfKind,
>> ConjuredKind };
>> + enum Kind { UndefKind, ParmKind, GlobalKind, ElementKind, FieldKind,
>> + ContentsOfKind, ConjuredKind };
>>
>> private:
>> Kind K;
>> @@ -141,6 +142,52 @@
>> }
>> };
>>
>> +class SymbolDataElement : public SymbolData {
>> + const MemRegion* R;
>> + const llvm::APSInt* Idx;
>> +
>> +public:
>> + SymbolDataElement(SymbolID MySym, const MemRegion* r, const
>> llvm::APSInt* idx)
>> + : SymbolData(ElementKind, MySym), R(r), Idx(idx) {}
>> +
>> + static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion*
>> R,
>> + const llvm::APSInt* Idx) {
>> + profile.AddPointer(R);
>> + profile.AddPointer(Idx);
>> + }
>> +
>> + void Profile(llvm::FoldingSetNodeID& profile) {
>> + Profile(profile, R, Idx);
>> + }
>> +
>> + static bool classof(const SymbolData* D) {
>> + return D->getKind() == ElementKind;
>> + }
>> +};
>> +
>> +class SymbolDataField : public SymbolData {
>> + const MemRegion* R;
>> + const FieldDecl* D;
>> +
>> +public:
>> + SymbolDataField(SymbolID MySym, const MemRegion* r, const FieldDecl* d)
>> + : SymbolData(FieldKind, MySym), R(r), D(d) {}
>> +
>> + static void Profile(llvm::FoldingSetNodeID& profile, const MemRegion*
>> R,
>> + const FieldDecl* D) {
>> + profile.AddPointer(R);
>> + profile.AddPointer(D);
>> + }
>> +
>> + void Profile(llvm::FoldingSetNodeID& profile) {
>> + Profile(profile, R, D);
>> + }
>> +
>> + static bool classof(const SymbolData* D) {
>> + return D->getKind() == FieldKind;
>> + }
>> +};
>> +
>> class SymbolDataContentsOf : public SymbolData {
>> SymbolID Sym;
>>
>> @@ -245,6 +292,8 @@
>> ~SymbolManager();
>>
>> SymbolID getSymbol(VarDecl* D);
>> + SymbolID getElementSymbol(const MemRegion* R, const llvm::APSInt* Idx);
>> + SymbolID getFieldSymbol(const MemRegion* R, const FieldDecl* D);
>> SymbolID getContentsOfSymbol(SymbolID sym);
>> SymbolID getConjuredSymbol(Stmt* E, QualType T, unsigned VisitCount);
>> SymbolID getConjuredSymbol(Expr* E, unsigned VisitCount) {
>>
>> Modified: cfe/trunk/lib/Analysis/SVals.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=59618&r1=59617&r2=59618&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/SVals.cpp (original)
>> +++ cfe/trunk/lib/Analysis/SVals.cpp Wed Nov 19 05:03:17 2008
>> @@ -272,6 +272,22 @@
>> return nonloc::SymbolVal(SymMgr.getSymbol(D));
>> }
>>
>> +SVal SVal::getSymbolValue(SymbolManager& SymMgr, const MemRegion* R,
>> + const llvm::APSInt* Idx, QualType T) {
>> + if (Loc::IsLocType(T))
>> + return loc::SymbolVal(SymMgr.getElementSymbol(R, Idx));
>> + else
>> + return nonloc::SymbolVal(SymMgr.getElementSymbol(R, Idx));
>> +}
>> +
>> +SVal SVal::getSymbolValue(SymbolManager& SymMgr, const MemRegion* R,
>> + const FieldDecl* FD, QualType T) {
>> + if (Loc::IsLocType(T))
>> + return loc::SymbolVal(SymMgr.getFieldSymbol(R, FD));
>> + else
>> + return nonloc::SymbolVal(SymMgr.getFieldSymbol(R, FD));
>> +}
>> +
>> nonloc::LocAsInteger nonloc::LocAsInteger::Make(BasicValueFactory& Vals,
>> Loc V,
>> unsigned Bits) {
>> return LocAsInteger(Vals.getPersistentSValWithData(V, Bits));
>>
>> Modified: cfe/trunk/lib/Analysis/SymbolManager.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SymbolManager.cpp?rev=59618&r1=59617&r2=59618&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/SymbolManager.cpp (original)
>> +++ cfe/trunk/lib/Analysis/SymbolManager.cpp Wed Nov 19 05:03:17 2008
>> @@ -51,6 +51,41 @@
>> DataMap[SymbolCounter] = SD;
>> return SymbolCounter++;
>> }
>> +
>> +SymbolID SymbolManager::getElementSymbol(const MemRegion* R,
>> + const llvm::APSInt* Idx){
>> + llvm::FoldingSetNodeID ID;
>> + SymbolDataElement::Profile(ID, R, Idx);
>> + void* InsertPos;
>> + SymbolData* SD = DataSet.FindNodeOrInsertPos(ID, InsertPos);
>> +
>> + if (SD)
>> + return SD->getSymbol();
>> +
>> + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataElement>();
>> + new (SD) SymbolDataElement(SymbolCounter, R, Idx);
>> +
>> + DataSet.InsertNode(SD, InsertPos);
>> + DataMap[SymbolCounter] = SD;
>> + return SymbolCounter++;
>> +}
>> +
>> +SymbolID SymbolManager::getFieldSymbol(const MemRegion* R, const
>> FieldDecl* D) {
>> + llvm::FoldingSetNodeID ID;
>> + SymbolDataField::Profile(ID, R, D);
>> + void* InsertPos;
>> + SymbolData* SD = DataSet.FindNodeOrInsertPos(ID, InsertPos);
>> +
>> + if (SD)
>> + return SD->getSymbol();
>> +
>> + SD = (SymbolData*) BPAlloc.Allocate<SymbolDataField>();
>> + new (SD) SymbolDataField(SymbolCounter, R, D);
>> +
>> + DataSet.InsertNode(SD, InsertPos);
>> + DataMap[SymbolCounter] = SD;
>> + return SymbolCounter++;
>> +}
>>
>> SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) {
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081120/1c8a84e5/attachment.html>
More information about the cfe-commits
mailing list