[llvm-branch-commits] [llvm-branch] r90384 - /llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp

Bill Wendling isanbard at gmail.com
Wed Dec 2 17:54:17 PST 2009


Author: void
Date: Wed Dec  2 19:54:17 2009
New Revision: 90384

URL: http://llvm.org/viewvc/llvm-project?rev=90384&view=rev
Log:
Revert r90371. It was causing build failures.

Modified:
    llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp

Modified: llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp?rev=90384&r1=90383&r2=90384&view=diff

==============================================================================
--- llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp (original)
+++ llvm/branches/Apple/Zoidberg/lib/Target/TargetData.cpp Wed Dec  2 19:54:17 2009
@@ -323,12 +323,11 @@
                  : Alignments[BestMatchIdx].PrefAlign;
 }
 
+typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
+
 namespace {
 
 class StructLayoutMap : public AbstractTypeUser {
-public:
-  typedef DenseMap<const StructType*, StructLayout*> LayoutInfoTy;
-private:
   LayoutInfoTy LayoutInfo;
 
   /// refineAbstractType - The callback method invoked when an abstract type is
@@ -337,9 +336,14 @@
   ///
   virtual void refineAbstractType(const DerivedType *OldTy,
                                   const Type *) {
-    assert(LayoutInfo.find(cast<const StructType>(OldTy)) != LayoutInfo.end() &&
-           "Abstract value not in local map!");
-    InvalidateEntry(cast<const StructType>(OldTy));
+    const StructType *STy = dyn_cast<const StructType>(OldTy);
+    assert(STy && "This can only track struct types.");
+
+    LayoutInfoTy::iterator Iter = LayoutInfo.find(STy);
+    Iter->second->~StructLayout();
+    free(Iter->second);
+    LayoutInfo.erase(Iter);
+    OldTy->removeAbstractTypeUser(this);
   }
 
   /// typeBecameConcrete - The other case which AbstractTypeUsers must be aware
@@ -348,9 +352,14 @@
   /// This method notifies ATU's when this occurs for a type.
   ///
   virtual void typeBecameConcrete(const DerivedType *AbsTy) {
-    assert(LayoutInfo.find(cast<const StructType>(AbsTy)) != LayoutInfo.end() &&
-           "Abstract value not in local map!");
-    InvalidateEntry(cast<const StructType>(AbsTy));
+    const StructType *STy = dyn_cast<const StructType>(AbsTy);
+    assert(STy && "This can only track struct types.");
+
+    LayoutInfoTy::iterator Iter = LayoutInfo.find(STy);
+    Iter->second->~StructLayout();
+    free(Iter->second);
+    LayoutInfo.erase(Iter);
+    AbsTy->removeAbstractTypeUser(this);
   }
 
 public:
@@ -364,21 +373,23 @@
       if (Key && Key->isAbstract())
         Key->removeAbstractTypeUser(this);
 
-      Value->~StructLayout();
-      free(Value);
+      if (Value) {
+        Value->~StructLayout();
+        free(Value);
+      }
     }
   }
 
-  void InvalidateEntry(const StructType *Ty) {
-    LayoutInfoTy::iterator I = LayoutInfo.find(Ty);
-    if (I == LayoutInfo.end()) return;
-  
-    I->second->~StructLayout();
-    free(I->second);
-    LayoutInfo.erase(I);
+  LayoutInfoTy::iterator end() {
+    return LayoutInfo.end();
+  }
 
-    if (Ty->isAbstract())
-      Ty->removeAbstractTypeUser(this);
+  LayoutInfoTy::iterator find(const StructType *&Val) {
+    return LayoutInfo.find(Val);
+  }
+
+  bool erase(LayoutInfoTy::iterator I) {
+    return LayoutInfo.erase(I);
   }
 
   StructLayout *&operator[](const StructType *STy) {
@@ -389,7 +400,7 @@
   virtual void dump() const {}
 };
 
-} // end anonymous namespace
+} // end namespace llvm
 
 TargetData::~TargetData() {
   delete static_cast<StructLayoutMap*>(LayoutMap);
@@ -427,9 +438,17 @@
 /// avoid a dangling pointer in this cache.
 void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const {
   if (!LayoutMap) return;  // No cache.
-
+  
   StructLayoutMap *STM = static_cast<StructLayoutMap*>(LayoutMap);
-  STM->InvalidateEntry(Ty);
+  LayoutInfoTy::iterator I = STM->find(Ty);
+  if (I == STM->end()) return;
+  
+  I->second->~StructLayout();
+  free(I->second);
+  STM->erase(I);
+
+  if (Ty->isAbstract())
+    Ty->removeAbstractTypeUser(STM);
 }
 
 std::string TargetData::getStringRepresentation() const {





More information about the llvm-branch-commits mailing list