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

Chris Lattner lattner at cs.uiuc.edu
Sun Nov 2 16:28:01 PST 2003


Changes in directory llvm/lib/Analysis/DataStructure:

DataStructure.cpp updated: 1.124 -> 1.125
Local.cpp updated: 1.66 -> 1.67
Steensgaard.cpp updated: 1.32 -> 1.33

---
Log message:

All DSGraphs keep a reference to the targetdata they are created with.  This is 
used to eliminate the hard coded, hacked in, sparc specific, global TargetData.
Changing the TargetData used to actually match the code fixes problems, and
eliminates a crash.


---
Diffs of the changes:  (+27 -20)

Index: llvm/lib/Analysis/DataStructure/DataStructure.cpp
diff -u llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.124 llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.125
--- llvm/lib/Analysis/DataStructure/DataStructure.cpp:1.124	Sun Nov  2 15:02:20 2003
+++ llvm/lib/Analysis/DataStructure/DataStructure.cpp	Sun Nov  2 16:27:28 2003
@@ -28,9 +28,6 @@
   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 @@
   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 @@
     };
 
     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 @@
 /// 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 @@
 ///
 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 @@
   // 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 @@
 }
 
 
-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, 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


Index: llvm/lib/Analysis/DataStructure/Local.cpp
diff -u llvm/lib/Analysis/DataStructure/Local.cpp:1.66 llvm/lib/Analysis/DataStructure/Local.cpp:1.67
--- llvm/lib/Analysis/DataStructure/Local.cpp:1.66	Mon Oct 20 14:43:06 2003
+++ llvm/lib/Analysis/DataStructure/Local.cpp	Sun Nov  2 16:27:28 2003
@@ -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 @@
 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 @@
 //===----------------------------------------------------------------------===//
 // 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 @@
     return;
   }
 
+  const TargetData &TD = Value.getNode()->getTargetData();
+
 #if 0
   // Handle the pointer index specially...
   if (GEP.getNumOperands() > 1 &&
@@ -531,7 +529,9 @@
       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 @@
 
 
 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);
 


Index: llvm/lib/Analysis/DataStructure/Steensgaard.cpp
diff -u llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.32 llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.33
--- llvm/lib/Analysis/DataStructure/Steensgaard.cpp:1.32	Mon Oct 20 14:43:06 2003
+++ llvm/lib/Analysis/DataStructure/Steensgaard.cpp	Sun Nov  2 16:27:28 2003
@@ -110,8 +110,8 @@
   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();
 





More information about the llvm-commits mailing list