diff options
author | Chris Lattner <sabre@nondot.org> | 2007-02-10 19:43:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-02-10 19:43:18 +0000 |
commit | ec6478b8f39779685d17849656015fc22fa7ac1b (patch) | |
tree | 57036acf8f7bd64defc9a8d685b239ebc6b435e4 /lib/Target/TargetData.cpp | |
parent | ddce8d21ea7088b9e6dd0f26e658a150614ca42a (diff) |
Use ManagedStatic to manage LayoutInfo, instead of rolling our own.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34154 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/TargetData.cpp')
-rw-r--r-- | lib/Target/TargetData.cpp | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 139ab00241..41288ec671 100644 --- a/lib/Target/TargetData.cpp +++ b/lib/Target/TargetData.cpp @@ -22,6 +22,7 @@ #include "llvm/Constants.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/ManagedStatic.h" #include "llvm/ADT/StringExtras.h" #include <algorithm> #include <cstdlib> @@ -201,25 +202,23 @@ TargetData::TargetData(const Module *M) { init(M->getDataLayout()); } -/// Layouts - The lazy cache of structure layout information maintained by +/// LayoutInfo - The lazy cache of structure layout information maintained by /// TargetData. /// -static std::map<std::pair<const TargetData*,const StructType*>, - StructLayout> *Layouts = 0; +typedef std::pair<const TargetData*,const StructType*> LayoutKey; +static ManagedStatic<std::map<LayoutKey, StructLayout> > LayoutInfo; TargetData::~TargetData() { - if (Layouts) { + if (LayoutInfo.isConstructed()) { // Remove any layouts for this TD. - std::map<std::pair<const TargetData*, - const StructType*>, StructLayout>::iterator - I = Layouts->lower_bound(std::make_pair(this, (const StructType*)0)); - while (I != Layouts->end() && I->first.first == this) - Layouts->erase(I++); - if (Layouts->empty()) { - delete Layouts; - Layouts = 0; - } + std::map<LayoutKey, StructLayout> &TheMap = *LayoutInfo; + std::map<LayoutKey, StructLayout>::iterator + I = TheMap.lower_bound(LayoutKey(this, (const StructType*)0)); + + for (std::map<LayoutKey, StructLayout>::iterator E = TheMap.end(); + I != E && I->first.first == this; ) + TheMap.erase(I++); } } @@ -252,17 +251,15 @@ std::string TargetData::getStringRepresentation() const { } const StructLayout *TargetData::getStructLayout(const StructType *Ty) const { - if (Layouts == 0) - Layouts = new std::map<std::pair<const TargetData*,const StructType*>, - StructLayout>(); - std::map<std::pair<const TargetData*,const StructType*>, - StructLayout>::iterator - I = Layouts->lower_bound(std::make_pair(this, Ty)); - if (I != Layouts->end() && I->first.first == this && I->first.second == Ty) + std::map<LayoutKey, StructLayout> &TheMap = *LayoutInfo; + + std::map<LayoutKey, StructLayout>::iterator + I = TheMap.lower_bound(LayoutKey(this, Ty)); + if (I != TheMap.end() && I->first.first == this && I->first.second == Ty) return &I->second; else { - return &Layouts->insert(I, std::make_pair(std::make_pair(this, Ty), - StructLayout(Ty, *this)))->second; + return &TheMap.insert(I, std::make_pair(LayoutKey(this, Ty), + StructLayout(Ty, *this)))->second; } } @@ -271,12 +268,12 @@ const StructLayout *TargetData::getStructLayout(const StructType *Ty) const { /// removed, this method must be called whenever a StructType is removed to /// avoid a dangling pointer in this cache. void TargetData::InvalidateStructLayoutInfo(const StructType *Ty) const { - if (!Layouts) return; // No cache. + if (!LayoutInfo.isConstructed()) return; // No cache. - std::map<std::pair<const TargetData*,const StructType*>, - StructLayout>::iterator I = Layouts->find(std::make_pair(this, Ty)); - if (I != Layouts->end()) - Layouts->erase(I); + std::map<LayoutKey, StructLayout>::iterator I = + LayoutInfo->find(std::make_pair(this, Ty)); + if (I != LayoutInfo->end()) + LayoutInfo->erase(I); } |