[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