From 13b4f184fd5bd0a8a97c4de5d63a87c8a7c2cb0d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 10 Feb 2007 19:43:18 +0000 Subject: [PATCH] Use ManagedStatic to manage LayoutInfo, instead of rolling our own. llvm-svn: 34154 --- lib/Target/TargetData.cpp | 51 ++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/lib/Target/TargetData.cpp b/lib/Target/TargetData.cpp index 139ab002417..41288ec6713 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 #include @@ -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, - StructLayout> *Layouts = 0; +typedef std::pair LayoutKey; +static ManagedStatic > LayoutInfo; TargetData::~TargetData() { - if (Layouts) { + if (LayoutInfo.isConstructed()) { // Remove any layouts for this TD. - std::map, 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 &TheMap = *LayoutInfo; + std::map::iterator + I = TheMap.lower_bound(LayoutKey(this, (const StructType*)0)); + + for (std::map::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, - StructLayout>(); - std::map, - 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 &TheMap = *LayoutInfo; + + std::map::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, - StructLayout>::iterator I = Layouts->find(std::make_pair(this, Ty)); - if (I != Layouts->end()) - Layouts->erase(I); + std::map::iterator I = + LayoutInfo->find(std::make_pair(this, Ty)); + if (I != LayoutInfo->end()) + LayoutInfo->erase(I); }