From: Daniel Dunbar Date: Thu, 6 Aug 2009 06:04:35 +0000 (+0000) Subject: Don't search the entire type table just to delete a type by name. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8113c6739e854d94910491965d83797487bc8a54;p=oota-llvm.git Don't search the entire type table just to delete a type by name. - This also fixes the ENABLE_EXPENSIVE_CHECKS failure on vmcore.ml. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78287 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/TypeSymbolTable.h b/include/llvm/TypeSymbolTable.h index d00c3b8d0b4..4dd3a4af2a4 100644 --- a/include/llvm/TypeSymbolTable.h +++ b/include/llvm/TypeSymbolTable.h @@ -66,6 +66,16 @@ public: /// @brief Lookup a type by name. Type *lookup(const StringRef &name) const; + /// Lookup the type associated with name. + /// @returns end() if the name is not found, or an iterator at the entry for + /// Type. + iterator find(const StringRef &name); + + /// Lookup the type associated with name. + /// @returns end() if the name is not found, or an iterator at the entry for + /// Type. + const_iterator find(const StringRef &name) const; + /// @returns true iff the symbol table is empty. /// @brief Determine if the symbol table is empty inline bool empty() const { return tmap.empty(); } diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 6cce6782eea..88160e16297 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -94,17 +94,15 @@ int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) { } void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) { - std::string N(Name); - TypeSymbolTable &TST = unwrap(M)->getTypeSymbolTable(); - for (TypeSymbolTable::iterator I = TST.begin(), E = TST.end(); I != E; ++I) - if (I->first == N) - TST.remove(I); + + TypeSymbolTable::iterator I = TST.find(Name); + if (I != TST.end()) + TST.remove(I); } LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) { - std::string N(Name); - return wrap(unwrap(M)->getTypeByName(N)); + return wrap(unwrap(M)->getTypeByName(Name)); } void LLVMDumpModule(LLVMModuleRef M) { diff --git a/lib/VMCore/TypeSymbolTable.cpp b/lib/VMCore/TypeSymbolTable.cpp index e9c62559332..5fa8785eeb9 100644 --- a/lib/VMCore/TypeSymbolTable.cpp +++ b/lib/VMCore/TypeSymbolTable.cpp @@ -59,6 +59,17 @@ Type* TypeSymbolTable::lookup(const StringRef &Name) const { return result; } +TypeSymbolTable::iterator TypeSymbolTable::find(const StringRef &Name) { + sys::SmartScopedReader Reader(*TypeSymbolTableLock); + return tmap.find(Name); +} + +TypeSymbolTable::const_iterator +TypeSymbolTable::find(const StringRef &Name) const { + sys::SmartScopedReader Reader(*TypeSymbolTableLock); + return tmap.find(Name); +} + // remove - Remove a type from the symbol table... Type* TypeSymbolTable::remove(iterator Entry) { TypeSymbolTableLock->writer_acquire();