X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FAnnotation.cpp;h=cfc9c2ad962e29b5fb2836dadc12c69e544db254;hb=8feb1f4467425d23ed74cce61e49f18a51a63421;hp=e876bf4f38b27ccdf5363897880b835f5218059a;hpb=60bfeb816a518ce4444632a5f1f3feb9d332f3a2;p=oota-llvm.git diff --git a/lib/Support/Annotation.cpp b/lib/Support/Annotation.cpp index e876bf4f38b..cfc9c2ad962 100644 --- a/lib/Support/Annotation.cpp +++ b/lib/Support/Annotation.cpp @@ -1,32 +1,62 @@ -//===-- Annotation.cpp - Implement the Annotation Classes --------*- C++ -*--=// +//===-- Annotation.cpp - Implement the Annotation Classes -----------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file implements the AnnotationManager class. // //===----------------------------------------------------------------------===// +#include "llvm/Support/Annotation.h" +#include "llvm/Support/ManagedStatic.h" #include -#include "llvm/Annotation.h" -using std::string; -using std::map; -using std::pair; -using std::make_pair; +using namespace llvm; + +Annotation::~Annotation() {} // Designed to be subclassed + +Annotable::~Annotable() { // Virtual because it's designed to be subclassed... + Annotation *A = AnnotationList; + while (A) { + Annotation *Next = A->getNext(); + delete A; + A = Next; + } +} -typedef map IDMapType; +typedef std::map IDMapType; static unsigned IDCounter = 0; // Unique ID counter // Static member to ensure initialiation on demand. -static IDMapType &getIDMap() { static IDMapType TheMap; return TheMap; } +static ManagedStatic IDMap; // On demand annotation creation support... typedef Annotation *(*AnnFactory)(AnnotationID, const Annotable *, void *); -typedef map > FactMapType; -static FactMapType &getFactMap() { static FactMapType FactMap; return FactMap; } +typedef std::map > FactMapType; +static FactMapType *TheFactMap = 0; +static FactMapType &getFactMap() { + if (TheFactMap == 0) + TheFactMap = new FactMapType(); + return *TheFactMap; +} -AnnotationID AnnotationManager::getID(const string &Name) { // Name -> ID - IDMapType::iterator I = getIDMap().find(Name); - if (I == getIDMap().end()) { - getIDMap()[Name] = IDCounter++; // Add a new element +static void eraseFromFactMap(unsigned ID) { + assert(TheFactMap && "No entries found!"); + TheFactMap->erase(ID); + if (TheFactMap->empty()) { // Delete when empty + delete TheFactMap; + TheFactMap = 0; + } +} + +AnnotationID AnnotationManager::getID(const std::string &Name) { // Name -> ID + IDMapType::iterator I = IDMap->find(Name); + if (I == IDMap->end()) { + (*IDMap)[Name] = IDCounter++; // Add a new element return IDCounter-1; } return I->second; @@ -34,44 +64,41 @@ AnnotationID AnnotationManager::getID(const string &Name) { // Name -> ID // getID - Name -> ID + registration of a factory function for demand driven // annotation support. -AnnotationID AnnotationManager::getID(const string &Name, Factory Fact, - void *Data) { +AnnotationID AnnotationManager::getID(const std::string &Name, Factory Fact, + void *Data) { AnnotationID Result(getID(Name)); registerAnnotationFactory(Result, Fact, Data); - return Result; + return Result; } - // getName - This function is especially slow, but that's okay because it should // only be used for debugging. // -const string &AnnotationManager::getName(AnnotationID ID) { // ID -> Name - IDMapType &TheMap = getIDMap(); +const std::string &AnnotationManager::getName(AnnotationID ID) { // ID -> Name + IDMapType &TheMap = *IDMap; for (IDMapType::iterator I = TheMap.begin(); ; ++I) { assert(I != TheMap.end() && "Annotation ID is unknown!"); if (I->second == ID.ID) return I->first; } } - // registerAnnotationFactory - This method is used to register a callback -// function used to create an annotation on demand if it is needed by the +// function used to create an annotation on demand if it is needed by the // Annotable::findOrCreateAnnotation method. // -void AnnotationManager::registerAnnotationFactory(AnnotationID ID, - AnnFactory F, - void *ExtraData) { +void AnnotationManager::registerAnnotationFactory(AnnotationID ID, AnnFactory F, + void *ExtraData) { if (F) - getFactMap()[ID.ID] = make_pair(F, ExtraData); + getFactMap()[ID.ID] = std::make_pair(F, ExtraData); else - getFactMap().erase(ID.ID); + eraseFromFactMap(ID.ID); } // createAnnotation - Create an annotation of the specified ID for the // specified object, using a register annotation creation function. // -Annotation *AnnotationManager::createAnnotation(AnnotationID ID, - const Annotable *Obj) { +Annotation *AnnotationManager::createAnnotation(AnnotationID ID, + const Annotable *Obj) { FactMapType::iterator I = getFactMap().find(ID.ID); if (I == getFactMap().end()) return 0; return I->second.first(ID, Obj, I->second.second);