aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/DataStructure
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Analysis/DataStructure')
-rw-r--r--lib/Analysis/DataStructure/DataStructure.cpp23
-rw-r--r--lib/Analysis/DataStructure/Local.cpp20
-rw-r--r--lib/Analysis/DataStructure/Steensgaard.cpp4
3 files changed, 27 insertions, 20 deletions
diff --git a/lib/Analysis/DataStructure/DataStructure.cpp b/lib/Analysis/DataStructure/DataStructure.cpp
index efcae9826e..c20299e0bb 100644
--- a/lib/Analysis/DataStructure/DataStructure.cpp
+++ b/lib/Analysis/DataStructure/DataStructure.cpp
@@ -28,9 +28,6 @@ namespace {
Statistic<> NumCallNodesMerged("dsnode", "Number of call nodes merged");
};
-namespace DS { // TODO: FIXME
- extern TargetData TD;
-}
using namespace DS;
DSNode *DSNodeHandle::HandleForwarding() const {
@@ -72,6 +69,12 @@ DSNode::DSNode(const DSNode &N, DSGraph *G)
G->getNodes().push_back(this);
}
+/// getTargetData - Get the target data object used to construct this node.
+///
+const TargetData &DSNode::getTargetData() const {
+ return ParentGraph->getTargetData();
+}
+
void DSNode::assertOK() const {
assert((Ty != Type::VoidTy ||
Ty == Type::VoidTy && (Size == 0 ||
@@ -172,8 +175,9 @@ namespace {
};
std::vector<StackState> Stack;
+ const TargetData &TD;
public:
- TypeElementWalker(const Type *T) {
+ TypeElementWalker(const Type *T, const TargetData &td) : TD(td) {
Stack.push_back(T);
StepToLeaf();
}
@@ -256,8 +260,8 @@ namespace {
/// is true, then we also allow a larger T1.
///
static bool ElementTypesAreCompatible(const Type *T1, const Type *T2,
- bool AllowLargerT1) {
- TypeElementWalker T1W(T1), T2W(T2);
+ bool AllowLargerT1, const TargetData &TD){
+ TypeElementWalker T1W(T1, TD), T2W(T2, TD);
while (!T1W.isDone() && !T2W.isDone()) {
if (T1W.getCurrentOffset() != T2W.getCurrentOffset())
@@ -286,6 +290,7 @@ static bool ElementTypesAreCompatible(const Type *T1, const Type *T2,
///
bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset,
bool FoldIfIncompatible) {
+ const TargetData &TD = getTargetData();
// Check to make sure the Size member is up-to-date. Size can be one of the
// following:
// Size = 0, Ty = Void: Nothing is known about this node.
@@ -426,7 +431,7 @@ bool DSNode::mergeTypeInfo(const Type *NewTy, unsigned Offset,
// just require each element in the node to be compatible.
if (NewTySize <= SubTypeSize && NewTySize && NewTySize < 256 &&
SubTypeSize && SubTypeSize < 256 &&
- ElementTypesAreCompatible(NewTy, SubType, !isArray()))
+ ElementTypesAreCompatible(NewTy, SubType, !isArray(), TD))
return false;
// Okay, so we found the leader type at the offset requested. Search the list
@@ -743,7 +748,7 @@ std::string DSGraph::getFunctionNames() const {
}
-DSGraph::DSGraph(const DSGraph &G) : GlobalsGraph(0) {
+DSGraph::DSGraph(const DSGraph &G) : GlobalsGraph(0), TD(G.TD) {
PrintAuxCalls = false;
NodeMapTy NodeMap;
cloneInto(G, ScalarMap, ReturnNodes, NodeMap);
@@ -751,7 +756,7 @@ DSGraph::DSGraph(const DSGraph &G) : GlobalsGraph(0) {
}
DSGraph::DSGraph(const DSGraph &G, NodeMapTy &NodeMap)
- : GlobalsGraph(0) {
+ : GlobalsGraph(0), TD(G.TD) {
PrintAuxCalls = false;
cloneInto(G, ScalarMap, ReturnNodes, NodeMap);
InlinedGlobals.clear(); // clear set of "up-to-date" globals
diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp
index fcaadf3755..689373ee7d 100644
--- a/lib/Analysis/DataStructure/Local.cpp
+++ b/lib/Analysis/DataStructure/Local.cpp
@@ -16,8 +16,6 @@
#include "llvm/Analysis/DSGraph.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
-#include "llvm/Function.h"
-#include "llvm/GlobalVariable.h"
#include "llvm/Instructions.h"
#include "llvm/Support/InstVisitor.h"
#include "llvm/Target/TargetData.h"
@@ -34,9 +32,6 @@ static RegisterAnalysis<LocalDataStructures>
X("datastructure", "Local Data Structure Analysis");
namespace DS {
- // FIXME: Do something smarter with target data!
- TargetData TD("temp-td");
-
// isPointerType - Return true if this type is big enough to hold a pointer.
bool isPointerType(const Type *Ty) {
if (isa<PointerType>(Ty))
@@ -152,7 +147,8 @@ namespace {
//===----------------------------------------------------------------------===//
// DSGraph constructor - Simply use the GraphBuilder to construct the local
// graph.
-DSGraph::DSGraph(Function &F, DSGraph *GG) : GlobalsGraph(GG) {
+DSGraph::DSGraph(const TargetData &td, Function &F, DSGraph *GG)
+ : GlobalsGraph(GG), TD(td) {
PrintAuxCalls = false;
DEBUG(std::cerr << " [Loc] Calculating graph for: " << F.getName() << "\n");
@@ -311,6 +307,8 @@ void GraphBuilder::visitGetElementPtrInst(User &GEP) {
return;
}
+ const TargetData &TD = Value.getNode()->getTargetData();
+
#if 0
// Handle the pointer index specially...
if (GEP.getNumOperands() > 1 &&
@@ -531,7 +529,9 @@ void GraphBuilder::MergeConstantInitIntoNode(DSNodeHandle &NH, Constant *C) {
NH.addEdgeTo(getValueDest(*C));
return;
}
-
+
+ const TargetData &TD = NH.getNode()->getTargetData();
+
if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) {
for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
// We don't currently do any indexing for arrays...
@@ -556,12 +556,14 @@ void GraphBuilder::mergeInGlobalInitializer(GlobalVariable *GV) {
bool LocalDataStructures::run(Module &M) {
- GlobalsGraph = new DSGraph();
+ GlobalsGraph = new DSGraph(getAnalysis<TargetData>());
+
+ const TargetData &TD = getAnalysis<TargetData>();
// Calculate all of the graphs...
for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
if (!I->isExternal())
- DSInfo.insert(std::make_pair(I, new DSGraph(*I, GlobalsGraph)));
+ DSInfo.insert(std::make_pair(I, new DSGraph(TD, *I, GlobalsGraph)));
GraphBuilder GGB(*GlobalsGraph);
diff --git a/lib/Analysis/DataStructure/Steensgaard.cpp b/lib/Analysis/DataStructure/Steensgaard.cpp
index 29bbf3a3fb..8bf917f048 100644
--- a/lib/Analysis/DataStructure/Steensgaard.cpp
+++ b/lib/Analysis/DataStructure/Steensgaard.cpp
@@ -110,8 +110,8 @@ bool Steens::run(Module &M) {
LocalDataStructures &LDS = getAnalysis<LocalDataStructures>();
// Create a new, empty, graph...
- ResultGraph = new DSGraph();
- GlobalsGraph = new DSGraph();
+ ResultGraph = new DSGraph(getTargetData());
+ GlobalsGraph = new DSGraph(getTargetData());
ResultGraph->setGlobalsGraph(GlobalsGraph);
ResultGraph->setPrintAuxCalls();