#include "Support/Timer.h"
#include <algorithm>
-using std::vector;
-
namespace {
Statistic<> NumFolds ("dsnode", "Number of nodes completely folded");
Statistic<> NumCallNodesMerged("dsnode", "Number of call nodes merged");
void DSNode::removeReferrer(DSNodeHandle *H) {
// Search backwards, because we depopulate the list from the back for
// efficiency (because it's a vector).
- vector<DSNodeHandle*>::reverse_iterator I =
+ std::vector<DSNodeHandle*>::reverse_iterator I =
std::find(Referrers.rbegin(), Referrers.rend(), H);
assert(I != Referrers.rend() && "Referrer not pointing to node!");
Referrers.erase(I.base()-1);
//
void DSNode::addGlobal(GlobalValue *GV) {
// Keep the list sorted.
- vector<GlobalValue*>::iterator I =
+ std::vector<GlobalValue*>::iterator I =
std::lower_bound(Globals.begin(), Globals.end(), GV);
if (I == Globals.end() || *I != GV) {
// Loop over all of our referrers, making them point to our zero bytes of
// space.
- for (vector<DSNodeHandle*>::iterator I = Referrers.begin(), E=Referrers.end();
- I != E; ++I)
+ for (std::vector<DSNodeHandle*>::iterator I = Referrers.begin(),
+ E = Referrers.end(); I != E; ++I)
(*I)->setOffset(0);
// If we have links, merge all of our outgoing links together...
// duplicates are not allowed and both are sorted. This assumes that 'T's are
// efficiently copyable and have sane comparison semantics.
//
-static void MergeSortedVectors(vector<GlobalValue*> &Dest,
- const vector<GlobalValue*> &Src) {
+static void MergeSortedVectors(std::vector<GlobalValue*> &Dest,
+ const std::vector<GlobalValue*> &Src) {
// By far, the most common cases will be the simple ones. In these cases,
// avoid having to allocate a temporary vector...
//
Dest = Src;
} else if (Src.size() == 1) { // Insert a single element...
const GlobalValue *V = Src[0];
- vector<GlobalValue*>::iterator I =
+ std::vector<GlobalValue*>::iterator I =
std::lower_bound(Dest.begin(), Dest.end(), V);
if (I == Dest.end() || *I != Src[0]) // If not already contained...
Dest.insert(I, Src[0]);
} else if (Dest.size() == 1) {
GlobalValue *Tmp = Dest[0]; // Save value in temporary...
Dest = Src; // Copy over list...
- vector<GlobalValue*>::iterator I =
+ std::vector<GlobalValue*>::iterator I =
std::lower_bound(Dest.begin(), Dest.end(), Tmp);
if (I == Dest.end() || *I != Tmp) // If not already contained...
Dest.insert(I, Tmp);
} else {
// Make a copy to the side of Dest...
- vector<GlobalValue*> Old(Dest);
+ std::vector<GlobalValue*> Old(Dest);
// Make space for all of the type entries now...
Dest.resize(Dest.size()+Src.size());
return false;
}
-static void removeIdenticalCalls(vector<DSCallSite> &Calls,
+static void removeIdenticalCalls(std::vector<DSCallSite> &Calls,
const std::string &where) {
// Remove trivially identical function calls
unsigned NumFns = Calls.size();
ScalarMap.erase(GlobalNodes[i].first);
// Loop over all unreachable nodes, dropping their references...
- vector<DSNode*> DeadNodes;
+ std::vector<DSNode*> DeadNodes;
DeadNodes.reserve(Nodes.size()); // Only one allocation is allowed.
for (unsigned i = 0; i != Nodes.size(); ++i)
if (!Alive.count(Nodes[i])) {
//
void GlobalDSGraph::cloneCalls(DSGraph& Graph) {
std::map<const DSNode*, DSNode*> NodeCache;
- vector<DSCallSite >& FromCalls =Graph.FunctionCalls;
+ std::vector<DSCallSite >& FromCalls =Graph.FunctionCalls;
FunctionCalls.reserve(FunctionCalls.size() + FromCalls.size());
//
#include "llvm/Module.h"
-using std::map;
-using std::vector;
-
static RegisterAnalysis<LocalDataStructures>
X("datastructure", "Local Data Structure Analysis");
///
class GraphBuilder : InstVisitor<GraphBuilder> {
DSGraph &G;
- vector<DSNode*> &Nodes;
+ std::vector<DSNode*> &Nodes;
DSNodeHandle &RetNode; // Node that gets returned...
- map<Value*, DSNodeHandle> &ScalarMap;
- vector<DSCallSite> &FunctionCalls;
+ std::map<Value*, DSNodeHandle> &ScalarMap;
+ std::vector<DSCallSite> &FunctionCalls;
public:
- GraphBuilder(DSGraph &g, vector<DSNode*> &nodes, DSNodeHandle &retNode,
- map<Value*, DSNodeHandle> &SM,
- vector<DSCallSite> &fc)
+ GraphBuilder(DSGraph &g, std::vector<DSNode*> &nodes, DSNodeHandle &retNode,
+ std::map<Value*, DSNodeHandle> &SM,
+ std::vector<DSCallSite> &fc)
: G(g), Nodes(nodes), RetNode(retNode), ScalarMap(SM), FunctionCalls(fc) {
// Create scalar nodes for all pointer arguments...
#include "Support/Statistic.h"
#include <fstream>
#include <sstream>
-using std::string;
// OnlyPrintMain - The DataStructure printer exposes this option to allow
// printing of only the graph for "main".
void DSNode::dump() const { print(std::cerr, 0); }
-static string getCaption(const DSNode *N, const DSGraph *G) {
+static std::string getCaption(const DSNode *N, const DSGraph *G) {
std::stringstream OS;
Module *M = G && &G->getFunction() ? G->getFunction().getParent() : 0;
WriteGraph(O, this, "DataStructures");
}
-void DSGraph::writeGraphToFile(std::ostream &O, const string &GraphName) const {
- string Filename = GraphName + ".dot";
+void DSGraph::writeGraphToFile(std::ostream &O,
+ const std::string &GraphName) const {
+ std::string Filename = GraphName + ".dot";
O << "Writing '" << Filename << "'...";
std::ofstream F(Filename.c_str());
template <typename Collection>
static void printCollection(const Collection &C, std::ostream &O,
- const Module *M, const string &Prefix) {
+ const Module *M, const std::string &Prefix) {
if (M == 0) {
O << "Null Module pointer, cannot continue!\n";
return;