From a5ed1bd00bb52333779a86d5399ef79b8278c19a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 21 Apr 2005 16:09:43 +0000 Subject: add support for taking and resolving the address of free. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21396 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/BottomUpClosure.cpp | 33 ++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/Analysis/DataStructure/BottomUpClosure.cpp b/lib/Analysis/DataStructure/BottomUpClosure.cpp index 0f45a989c0c..4f244b3a364 100644 --- a/lib/Analysis/DataStructure/BottomUpClosure.cpp +++ b/lib/Analysis/DataStructure/BottomUpClosure.cpp @@ -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 @@ bool BUDataStructures::runOnModule(Module &M) { std::set 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::iterator I = DSInfo.begin(), E = DSInfo.end(); I != E; ++I) EliminateUsesOfECGlobals(*I->second, ECGlobals); @@ -225,7 +227,8 @@ static bool isVAHackFn(const Function *F) { 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 @@ void BUDataStructures::releaseMyMemory() { GlobalsGraph = 0; } +DSGraph &BUDataStructures::CreateGraphForExternalFunction(const Function &Fn) { + Function *F = const_cast(&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! -- cgit v1.2.3