[llvm-commits] [poolalloc] r40860 - in /poolalloc/branches/SVA/lib/DSA: KPools.cpp LeafRepl.cpp Local.cpp

Andrew Lenharth alenhar2 at cs.uiuc.edu
Mon Aug 6 07:54:34 PDT 2007


Author: alenhar2
Date: Mon Aug  6 09:54:33 2007
New Revision: 40860

URL: http://llvm.org/viewvc/llvm-project?rev=40860&view=rev
Log:
different cloners

Added:
    poolalloc/branches/SVA/lib/DSA/KPools.cpp
Modified:
    poolalloc/branches/SVA/lib/DSA/LeafRepl.cpp
    poolalloc/branches/SVA/lib/DSA/Local.cpp

Added: poolalloc/branches/SVA/lib/DSA/KPools.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/branches/SVA/lib/DSA/KPools.cpp?rev=40860&view=auto

==============================================================================
--- poolalloc/branches/SVA/lib/DSA/KPools.cpp (added)
+++ poolalloc/branches/SVA/lib/DSA/KPools.cpp Mon Aug  6 09:54:33 2007
@@ -0,0 +1,48 @@
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/GlobalValue.h"
+#include "llvm/Pass.h"
+#include "llvm/Module.h"
+#include "llvm/Instructions.h"
+#include "llvm/Constants.h"
+#include "llvm/Value.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/Support/Debug.h"
+#include <iostream>
+#include "dsa/DataStructure.h"
+#include "dsa/DSGraph.h"
+#include "llvm/Support/CallSite.h"
+
+using namespace llvm;
+
+namespace {
+  class KPCount : public ModulePass {
+  public:
+    void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+      AU.addRequired<TDDataStructures>();
+    }
+    bool runOnModule(Module& M) {
+      TDDataStructures* T = &getAnalysis<TDDataStructures>();
+      Function* f = M.getNamedFunction("kmem_cache_alloc");
+      for (Value::use_iterator ii = f->use_begin(), ee = f->use_end();
+	   ii != ee; ++ii) {
+	if (CallInst* CI = dyn_cast<CallInst>(*ii)) {
+	  if (LoadInst* LI = dyn_cast<LoadInst>(CI->getOperand(1))) {
+	    CallSite cs = CallSite::get(CI);
+	    DSNode* N = T->getDSGraph(*cs.getCaller())
+	      .getNodeForValue(CI).getNode();
+	    if (N->isNodeCompletelyFolded()) 
+	      std::cerr << "F ";
+	    else
+	      std::cerr << "S ";
+	    std::cerr << LI->getOperand(0)->getName() << "\n";
+	  }
+	}
+      }
+      return false;
+    }
+  };
+
+  RegisterPass<KPCount> X("kpcount", "Count Kernel Pool Thingies");
+}

Modified: poolalloc/branches/SVA/lib/DSA/LeafRepl.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/branches/SVA/lib/DSA/LeafRepl.cpp?rev=40860&r1=40859&r2=40860&view=diff

==============================================================================
--- poolalloc/branches/SVA/lib/DSA/LeafRepl.cpp (original)
+++ poolalloc/branches/SVA/lib/DSA/LeafRepl.cpp Mon Aug  6 09:54:33 2007
@@ -5,123 +5,128 @@
 #include "llvm/DerivedTypes.h"
 #include "llvm/Transforms/Utils/Cloning.h"
 #include "llvm/ADT/Statistic.h"
+#include "llvm/Support/CommandLine.h"
 
 #include <set>
+#include <map>
 #include <vector>
 #include <algorithm>
 using namespace llvm;
 
 namespace {
 
-  Statistic<> FuncAdded("CSCloner", "Number of functions added");
-  Statistic<> IndDirSplit("CSCloner", "Number of direct and indirect splits");
+  Statistic<> FuncAdded("Cloner", "Number of functions added");
+  Statistic<> IndDirSplit("IndCloner", "Number of direct and indirect splits");
   Statistic<> LeafClone("CSCloner", "Number of leaves cloned");
   Statistic<> ShallowClone("CSCloner", "Number of shallow functions cloned");
   Statistic<> ConstantClone("CSCloner", "Number of functions with constant pointers cloned");
+  Statistic<> DepthClone("DepthCloner", "Number of functions cloned by depth");
 
-  class CSCloner : public ModulePass {
-
-    bool isLeaf(Function* F) {
-      for (Function::iterator FI = F->begin(), FE = F->end();
-           FI != FE; ++FI)
-        for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
-             BI != BE; ++BI)
-          if(isa<CallInst>(BI) || isa<InvokeInst>(BI))
-            return false;
-      return true;
-    }
-
-    bool isLevelOne(Function* F) {
-      for (Function::iterator FI = F->begin(), FE = F->end();
-           FI != FE; ++FI)
-        for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
-             BI != BE; ++BI) {
-          if(LoadInst* LI = dyn_cast<LoadInst>(BI))
-            if (isa<PointerType>(LI->getType()))
-              return false;
-          if(StoreInst* SI = dyn_cast<StoreInst>(BI)) 
-            if (isa<PointerType>(SI->getOperand(0)->getType()))
-              return false;
-        }
-      return true;
-    }
-
-    bool isLevelTwo(Function* F) {
-      for (Function::iterator FI = F->begin(), FE = F->end();
-           FI != FE; ++FI)
-        for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
-             BI != BE; ++BI) {
-          if(LoadInst* LI = dyn_cast<LoadInst>(BI))
-            if (isa<PointerType>(LI->getType()))
-              for (Value::use_iterator ii = LI->use_begin(), ee = LI->use_end();
-                   ii != ee; ++ii)
-                if (isa<LoadInst>(ii))
-                  return false;
-        }
+  static cl::opt<int>
+  CloneDepth("clone-depth", cl::Hidden, cl::init(4),
+             cl::desc("depth to clone in the call graph"));
+
+  static Function* clone(Function* F) {
+    Function* FNew = CloneFunction(F);
+    FNew->setLinkage(Function::InternalLinkage);
+    ++FuncAdded;
+    F->getParent()->getFunctionList().push_back(FNew);
+    return FNew;
+  }
+  
+  static bool hasPointer(Function* F) {
+    const FunctionType* FT = F->getFunctionType();
+    if (FT->isVarArg() || isa<PointerType>(FT->getReturnType()))
       return true;
-    }
-
-    Function* clone(Function* F) {
-      Function* FNew = CloneFunction(F);
-      FNew->setLinkage(Function::InternalLinkage);
-      ++FuncAdded;
-      F->getParent()->getFunctionList().push_back(FNew);
-      return FNew;
-    }
-
-    bool isDirect(Function* F) {
-      for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
-           ii != ee; ++ii) {
-        CallInst* CI = dyn_cast<CallInst>(*ii);
-        if (CI && CI->getCalledFunction() == F)
+    else
+      for (FunctionType::param_iterator pi = FT->param_begin(), pe = FT->param_end();
+           pi != pe; ++pi)
+        if (isa<PointerType>(pi->get()))
           return true;
-      }
-      return false;
+    return false;
+  }    
+  
+  static bool isDirect(Function* F) {
+    for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
+         ii != ee; ++ii) {
+      CallInst* CI = dyn_cast<CallInst>(*ii);
+      if (CI && CI->getCalledFunction() == F)
+        return true;
     }
-
-    bool isUnknown(Function* F) {
-          for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
-               ii != ee; ++ii) {
-            CallInst* CI = dyn_cast<CallInst>(*ii);
-            if (!CI || CI->getCalledFunction() != F)
-              return true;
-          }
-          return false;
+    return false;
+  }
+  
+  static bool isUnknown(Function* F) {
+    for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
+         ii != ee; ++ii) {
+      CallInst* CI = dyn_cast<CallInst>(*ii);
+      if (!CI || CI->getCalledFunction() != F)
+        return true;
     }
-
-    bool hasPointer(Function* F) {
-      const FunctionType* FT = F->getFunctionType();
-      if (FT->isVarArg() || isa<PointerType>(FT->getReturnType()))
+    return false;
+  }
+  
+  static bool hasConstArgs(CallInst* CI) {
+    for (unsigned x = 1; x < CI->getNumOperands(); ++x)
+      if (isa<Constant>(CI->getOperand(x)) && isa<PointerType>(CI->getOperand(x)->getType()))
         return true;
-      else
-        for (FunctionType::param_iterator pi = FT->param_begin(), pe = FT->param_end();
-             pi != pe; ++pi)
-          if (isa<PointerType>(pi->get()))
-            return true;
-      return false;
-    }    
-
-    bool hasConstArgs(CallInst* CI) {
-      for (unsigned x = 1; x < CI->getNumOperands(); ++x)
-        if (isa<Constant>(CI->getOperand(x)) && isa<PointerType>(CI->getOperand(x)->getType()))
+    return false;
+  }
+  
+  static bool hasConstArgs(Function* F) {
+    for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
+         ii != ee; ++ii) {
+      CallInst* CI = dyn_cast<CallInst>(*ii);
+      if (CI && CI->getCalledFunction() == F)
+        if (hasConstArgs(CI))
           return true;
-      return false;
     }
+    return false;
+  }
 
-    bool hasConstArgs(Function* F) {
-      for (Value::use_iterator ii = F->use_begin(), ee = F->use_end();
-           ii != ee; ++ii) {
-        CallInst* CI = dyn_cast<CallInst>(*ii);
-        if (CI && CI->getCalledFunction() == F)
-          if (hasConstArgs(CI))
-            return true;
+  bool isLeaf(Function* F) {
+    for (Function::iterator FI = F->begin(), FE = F->end();
+         FI != FE; ++FI)
+      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
+           BI != BE; ++BI)
+        if(isa<CallInst>(BI) || isa<InvokeInst>(BI))
+          return false;
+    return true;
+  }
+  
+  bool isLevelOne(Function* F) {
+    for (Function::iterator FI = F->begin(), FE = F->end();
+         FI != FE; ++FI)
+      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
+           BI != BE; ++BI) {
+        if(LoadInst* LI = dyn_cast<LoadInst>(BI))
+          if (isa<PointerType>(LI->getType()))
+            return false;
+        if(StoreInst* SI = dyn_cast<StoreInst>(BI))
+          if (isa<PointerType>(SI->getOperand(0)->getType()))
+            return false;
       }
-      return false;
-    }
-
+    return true;
+  }
 
+  bool isLevelTwo(Function* F) {
+    for (Function::iterator FI = F->begin(), FE = F->end();
+         FI != FE; ++FI)
+      for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
+           BI != BE; ++BI) {
+        if(LoadInst* LI = dyn_cast<LoadInst>(BI))
+          if (isa<PointerType>(LI->getType()))
+            for (Value::use_iterator ii = LI->use_begin(), ee = LI->use_end();
+                 ii != ee; ++ii)
+              if (isa<LoadInst>(ii))
+                return false;
+      }
+    return true;
+  }
+  
+  class IndCloner : public ModulePass {
   public:
-    bool runOnModuleI(Module& M) {
+    bool runOnModule(Module& M) {
       
       bool changed = false;
 
@@ -129,9 +134,6 @@
       std::set<Function*> DirectCalls;
       std::set<Function*> Unknowns;
       std::set<Function*> TakesPointers;
-      std::set<Function*> Leaf;
-      std::set<Function*> Shallow;
-      std::set<Function*> ConstantArgs;
       std::vector<std::string> IgnoreList;
       IgnoreList.push_back("kmalloc");
       IgnoreList.push_back("__vmalloc");
@@ -146,18 +148,12 @@
            MI != ME; ++MI)
         if (!MI->isExternal() &&
             std::find(IgnoreList.begin(), IgnoreList.end(), MI->getName()) == IgnoreList.end()) {
-          if (isLeaf(MI))
-            Leaf.insert(MI);
-          if (isLevelOne(MI) || isLevelTwo(MI))
-            Shallow.insert(MI);
           if (isDirect(MI))
             DirectCalls.insert(MI);
           if (isUnknown(MI))
             Unknowns.insert(MI);
           if (hasPointer(MI))
             TakesPointers.insert(MI);
-          if (hasConstArgs(MI))
-            ConstantArgs.insert(MI);
         }
       
       //now think about replicating some functions
@@ -180,7 +176,58 @@
               }
             }
           }
-          
+        }
+      }
+      return changed;
+    }
+  };
+
+  class CSCloner : public ModulePass {
+  public:
+    bool runOnModule(Module& M) {
+      
+      bool changed = false;
+
+      //first figure out how functions are used
+      std::set<Function*> DirectCalls;
+      std::set<Function*> Unknowns;
+      std::set<Function*> TakesPointers;
+      std::set<Function*> Leaf;
+      std::set<Function*> Shallow;
+      std::set<Function*> ConstantArgs;
+      std::vector<std::string> IgnoreList;
+      IgnoreList.push_back("kmalloc");
+      IgnoreList.push_back("__vmalloc");
+      IgnoreList.push_back("kmem_cache_alloc");
+      IgnoreList.push_back("__alloc_bootmem");
+      IgnoreList.push_back(" __get_free_pages");
+      IgnoreList.push_back("kfree");
+      IgnoreList.push_back("vfree");
+      IgnoreList.push_back("free_pages");
+
+      for (Module::iterator MI = M.begin(), ME = M.end();
+           MI != ME; ++MI)
+        if (!MI->isExternal() &&
+            std::find(IgnoreList.begin(), IgnoreList.end(), MI->getName()) == IgnoreList.end()) {
+          if (isLeaf(MI))
+            Leaf.insert(MI);
+          if (isLevelOne(MI) || isLevelTwo(MI))
+            Shallow.insert(MI);
+          if (isDirect(MI))
+            DirectCalls.insert(MI);
+          if (isUnknown(MI))
+            Unknowns.insert(MI);
+          if (hasPointer(MI))
+            TakesPointers.insert(MI);
+          if (hasConstArgs(MI))
+            ConstantArgs.insert(MI);
+        }
+      
+      //now think about replicating some functions
+      for (Module::iterator MI = M.begin(), ME = M.end();
+           MI != ME; ++MI) {
+        if(TakesPointers.find(MI) != TakesPointers.end()) {
+
           //if it takes constants in pointer parameters
           if (ConstantArgs.find(MI) != ConstantArgs.end() && !MI->hasOneUse() && !MI->use_empty()) {
             for (Value::use_iterator ii = MI->use_begin(), ee = MI->use_end();
@@ -226,15 +273,92 @@
       }
       return changed;
     }
+  };
+  class DepthCloner : public ModulePass {
+  public:
+    bool runOnModule(Module& M) {
+      
+      bool changed = false;
+
+      //first figure out how functions are used
+      std::set<Function*> DirectCalls;
+      std::set<Function*> Unknowns;
+      std::set<Function*> TakesPointers;
+      std::vector<std::string> IgnoreList;
+      IgnoreList.push_back("kmalloc");
+      IgnoreList.push_back("__vmalloc");
+      IgnoreList.push_back("kmem_cache_alloc");
+      IgnoreList.push_back("__alloc_bootmem");
+      IgnoreList.push_back(" __get_free_pages");
+      IgnoreList.push_back("kfree");
+      IgnoreList.push_back("vfree");
+      IgnoreList.push_back("free_pages");
 
-    virtual bool runOnModule(Module& M) {
-      //      int x = 4;
-      //      while (runOnModuleI(M) && --x) {}
-      //      return true;
-      return runOnModuleI(M);
+      std::map<Function*, std::set<Function*> > Callers;
+      typedef std::map<Function*, std::set<Function*> >::iterator citer;
+      std::map<Function*, int> Level;
+
+      for (Module::iterator MI = M.begin(), ME = M.end();
+           MI != ME; ++MI)
+        if (!MI->isExternal() &&
+            std::find(IgnoreList.begin(), IgnoreList.end(), MI->getName()) == IgnoreList.end()) {
+          if (isDirect(MI))
+            DirectCalls.insert(MI);
+          if (isUnknown(MI))
+            Unknowns.insert(MI);
+          if (hasPointer(MI))
+            TakesPointers.insert(MI);
+          for (Function::iterator FI = MI->begin(), FE = MI->end();
+               FI != FE; ++FI)
+            for (BasicBlock::iterator BI = FI->begin(), BE = FI->end();
+                 BI != BE; ++BI) {
+              if (isa<CallInst>(BI) && isa<Function>(BI->getOperand(0)) &&
+                  BI->getOperand(0) != MI)
+                Callers[MI].insert(cast<Function>(BI->getOperand(0)));
+            }
+        }
+
+      //this doesn't handle mutual recursion
+      bool c;
+      do {
+        c = false;
+        for (citer ii = Callers.begin(), ee = Callers.end(); ii != ee; ++ii)
+          for (std::set<Function*>::iterator i = ii->second.begin(), e = ii->second.end();
+               i != e; ++i) {
+            if (Level[ii->first] <= Level[*i] && Level[ii->first] <= CloneDepth) {
+              ii->second.insert(Callers[*i].begin(), Callers[*i].end());
+              c = true;
+              Level[ii->first] = Level[*i] + 1;
+            }
+          }
+      } while (c);
+      
+      //now think about replicating some functions
+      for (Module::iterator MI = M.begin(), ME = M.end();
+           MI != ME; ++MI) {
+        if(TakesPointers.find(MI) != TakesPointers.end()) {
+
+          //if it is a fixed depth, clone it
+          if (Level[MI] <= CloneDepth && !MI->hasOneUse() && !MI->use_empty()) {
+            for (Value::use_iterator ii = MI->use_begin(), ee = MI->use_end();
+                 ii != ee; ++ii) {
+              CallInst* CI = dyn_cast<CallInst>(*ii);
+              if (CI && CI->getCalledFunction() == MI) {
+                Function* FNew = clone(MI);
+                ++DepthClone;
+                changed = true;
+                CI->setOperand(0, FNew);
+              }
+            }
+          }
+        }
+      }
+      return changed;
     }
   };
 
-  RegisterPass<CSCloner> X("csclone", "Cloning for Context Sensitivity");
+  RegisterPass<CSCloner>  X("csclone", "Cloning for Context Sensitivity");
+  RegisterPass<IndCloner> Y("indclone", "Cloning for Context Sensitivity");
+  RegisterPass<DepthCloner> Z("depthclone", "Cloning for Context Sensitivity");
 
 }

Modified: poolalloc/branches/SVA/lib/DSA/Local.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/branches/SVA/lib/DSA/Local.cpp?rev=40860&r1=40859&r2=40860&view=diff

==============================================================================
--- poolalloc/branches/SVA/lib/DSA/Local.cpp (original)
+++ poolalloc/branches/SVA/lib/DSA/Local.cpp Mon Aug  6 09:54:33 2007
@@ -28,6 +28,7 @@
 #include "llvm/Support/Timer.h"
 #include "poolalloc/Config/config.h"
 #include <iostream>
+#include <queue>
 
 // FIXME: This should eventually be a FunctionPass that is automatically
 // aggregated into a Pass.
@@ -43,6 +44,9 @@
 std::map<unsigned int, Function*> syscalls;
 #endif
 
+static Statistic<> CastTraceT ("dsa", "Number of int casts traced successfully");
+static Statistic<> CastTraceF ("dsa", "Number of int casts not traced");
+
 Statistic<> stat_unknown ("dsa", "Number of markunknowns");
 static cl::opt<bool>
 Crash("dsa-crash", cl::Hidden,
@@ -277,6 +281,46 @@
 // Helper method implementations...
 //
 
+static bool getSourcePointerValues(Value* V, std::set<Value*>& sources) {
+  std::queue<Value*> tocheck;
+  std::set<Value*> visited;
+  tocheck.push(V);
+  while (!tocheck.empty()) {
+    V = tocheck.front();
+    tocheck.pop();
+    if (visited.find(V) == visited.end()) {
+      visited.insert(V);
+      if (isa<PointerType>(V->getType())) {
+        sources.insert(V);
+      } else if (ConstantInt* N = dyn_cast<ConstantInt>(V)) {
+        if (!(-N->getSExtValue() <= 124 && -N->getSExtValue() >= 0)) {
+          goto fail;
+        }
+      } else if (PHINode* N = dyn_cast<PHINode>(V)) {
+        for (unsigned x = 0; x < N->getNumIncomingValues(); ++x)
+          tocheck.push(N->getIncomingValue(x));
+      } else if (CastInst* N = dyn_cast<CastInst>(V)) {
+        tocheck.push(N->getOperand(0));
+      } else if (ConstantExpr* N = dyn_cast<ConstantExpr>(V)) {
+        if (N->getOpcode() == Instruction::Cast) {
+          tocheck.push(N->getOperand(0));
+        } else {
+          goto fail;
+        }
+      } else {
+        goto fail;
+      }
+    }
+  }
+  ++CastTraceT;
+  return true;
+ fail:
+  ++CastTraceF;
+  std::cerr << "Int2Ptr: fail ";
+  V->dump();
+  return false;
+}
+
 /// getValueDest - Return the DSNode that the actual value points to.
 ///
 DSNodeHandle GraphBuilder::getValueDest(Value &Val) {
@@ -298,20 +342,12 @@
     N->addGlobal(GV);
   } else if (Constant *C = dyn_cast<Constant>(V)) {
     if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
-      if (CE->getOpcode() == Instruction::Cast) {
-        if (isa<PointerType>(CE->getOperand(0)->getType()))
-          NH = getValueDest(*CE->getOperand(0));
-        else
-          if (CE->getOpcode() == Instruction::Cast &&
-              isa<ConstantInt>(CE->getOperand(0)) && 
-              (
-               cast<ConstantInt>(CE->getOperand(0))->equalsInt(1) ||
-               (-cast<ConstantInt>(CE->getOperand(0))->getSExtValue() <= 124 &&
-                -cast<ConstantInt>(CE->getOperand(0))->getSExtValue() >= 0)
-               ))
-            NH = createNode();
-          else
-            NH = createNode()->setUnknownNodeMarker();
+      std::set<Value*> sources;
+      if (getSourcePointerValues(CE, sources)) {      
+        NH = createNode();
+        for (std::set<Value*>::iterator ii = sources.begin(), ee = sources.end();
+             ii != ee; ++ii)
+          NH.mergeWith(getValueDest(**ii));
       } else if (CE->getOpcode() == Instruction::GetElementPtr) {
         visitGetElementPtrInst(*CE);
         DSScalarMap::iterator I = ScalarMap.find(CE);
@@ -1428,9 +1464,9 @@
   } else if (F->getName() == "llva_get_icontext_stackp") {
     // Create a new DSNode for the memory returned by llva_save_stackp()
     DSNodeHandle RetNH = getValueDest(*CS.getInstruction());
-    RetNH.getNode()->setAllocaNodeMarker();
-    RetNH.getNode()->setUnknownNodeMarker();
-    RetNH.getNode()->foldNodeCompletely();
+    //    RetNH.getNode()->setAllocaNodeMarker();
+    //    RetNH.getNode()->setUnknownNodeMarker();
+    //    RetNH.getNode()->foldNodeCompletely();
     if (DSNode *N = getValueDest(**CS.arg_begin()).getNode())
       N->setReadMarker();
     return true;
@@ -1468,7 +1504,11 @@
     // Determine if the called function is one of the specified heap
     // allocation functions
     if (AllocList.end() != std::find(AllocList.begin(), AllocList.end(), F->getName())) {
-      DSNodeHandle RetNH = getValueDest(*CS.getInstruction());
+      DSNodeHandle RetNH;
+      if (F->getName() == "pseudo_alloc")
+        RetNH = getValueDest(**CS.arg_begin());
+      else
+        RetNH = getValueDest(*CS.getInstruction());
       RetNH.getNode()->setHeapNodeMarker()->setModifiedMarker();
       RetNH.getNode()->getMP()->addCallSite(CS);
       return;
@@ -1572,15 +1612,20 @@
       // don't know about.  Make an "Unknown" node.
       //
 
-      if (ConstantInt* I = dyn_cast<ConstantInt>(CI.getOperand(0)))
-        if (-I->getSExtValue() <= 124 && -I->getSExtValue() >= 0)
-          setDestTo(CI, createNode());
-
-      if (DebugUnknown) {
-        std::cerr << "In " << CI.getParent()->getParent()->getName() << " ";
-        CI.dump();
-      }
-      setDestTo(CI, createNode()->setUnknownNodeMarker());
+      //Try to track all values of ints back to constants or valid pointers
+      std::set<Value*> sources;
+      if (getSourcePointerValues(&CI, sources)) {
+        setDestTo(CI, createNode());
+        for (std::set<Value*>::iterator ii = sources.begin(), ee = sources.end();
+             ii != ee; ++ii)
+          getValueDest(CI).mergeWith(getValueDest(**ii));
+      } else {
+        if (DebugUnknown) {
+          std::cerr << "In " << CI.getParent()->getParent()->getName() << " ";
+          CI.dump();
+        }
+        setDestTo(CI, createNode()->setUnknownNodeMarker());
+      } 
     }
 }
 
@@ -1754,6 +1799,7 @@
   AllocList.push_back("kmem_cache_alloc");
   AllocList.push_back("__alloc_bootmem");
   AllocList.push_back(" __get_free_pages");
+  AllocList.push_back("pseudo_alloc");
 
 #if 0
   FreeList.push_back("kfree");
@@ -1761,6 +1807,7 @@
   FreeList.push_back("vfree");
   FreeList.push_back("free_pages");
   FreeList.push_back("kmem_cache_free");
+  FreeList.push_back("pseudo_free");
 
   //figure out all system call numbers
   Function* lrs = M.getNamedFunction("llva_register_syscall");





More information about the llvm-commits mailing list