[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Apr 21 09:09:57 PDT 2005



Changes in directory llvm/lib/Analysis/DataStructure:

BottomUpClosure.cpp updated: 1.112 -> 1.113
---
Log message:

add support for taking and resolving the address of free.


---
Diffs of the changes:  (+31 -2)

 BottomUpClosure.cpp |   33 +++++++++++++++++++++++++++++++--
 1 files changed, 31 insertions(+), 2 deletions(-)


Index: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp
diff -u llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.112 llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.113
--- llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.112	Fri Mar 25 10:45:43 2005
+++ llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp	Thu Apr 21 11:09:43 2005
@@ -19,6 +19,7 @@
 #include "llvm/Module.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Support/Debug.h"
+#include "llvm/Support/Timer.h"
 using namespace llvm;
 
 namespace {
@@ -172,7 +173,8 @@
   std::set<GlobalValue*> ECGlobals;
   BuildGlobalECs(*GlobalsGraph, ECGlobals);
   if (!ECGlobals.empty()) {
-    DEBUG(std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n");
+    NamedRegionTimer X("Bottom-UP EC Cleanup");
+    std::cerr << "Eliminating " << ECGlobals.size() << " EC Globals!\n";
     for (hash_map<Function*, DSGraph*>::iterator I = DSInfo.begin(),
            E = DSInfo.end(); I != E; ++I)
       EliminateUsesOfECGlobals(*I->second, ECGlobals);
@@ -225,7 +227,8 @@
   return F->getName() == "printf"  || F->getName() == "sscanf" ||
     F->getName() == "fprintf" || F->getName() == "open" ||
     F->getName() == "sprintf" || F->getName() == "fputs" ||
-    F->getName() == "fscanf";
+    F->getName() == "fscanf" || F->getName() == "malloc" ||
+    F->getName() == "free";
 }
 
 static bool isResolvableFunc(const Function* callee) {
@@ -404,6 +407,32 @@
   GlobalsGraph = 0;
 }
 
+DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) {
+  Function *F = const_cast<Function*>(&Fn);
+  DSGraph *DSG = new DSGraph(GlobalECs, GlobalsGraph->getTargetData());
+  DSInfo[F] = DSG;
+  DSG->setGlobalsGraph(GlobalsGraph);
+  DSG->setPrintAuxCalls();
+
+  // Add function to the graph.
+  DSG->getReturnNodes().insert(std::make_pair(F, DSNodeHandle()));
+
+  if (F->getName() == "free") { // Taking the address of free.
+    
+    // Free should take a single pointer argument, mark it as heap memory.
+    DSNode *N = new DSNode(0, DSG);
+    N->setHeapNodeMarker();
+    DSG->getNodeForValue(F->arg_begin()).mergeWith(N);
+
+  } else {
+    std::cerr << "Unrecognized external function: " << F->getName() << "\n";
+    abort();
+  }
+
+  return *DSG;
+}
+
+
 void BUDataStructures::calculateGraph(DSGraph &Graph) {
   // Move our call site list into TempFCs so that inline call sites go into the
   // new call site list and doesn't invalidate our iterators!






More information about the llvm-commits mailing list