From 11aa4770fe38befb3926646cf9ea7ed0ff7e33a8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 28 Apr 2002 04:51:51 +0000 Subject: [PATCH] * Incorporate the contents of SymTabValue into Function and Module * Module no longer subclasses Value git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2355 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Function.cpp | 28 ++++++++++++++++++++++++++-- lib/VMCore/Module.cpp | 27 ++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 598f9fd0c24..c15a88808d0 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -45,7 +45,8 @@ template class ValueHolder; Function::Function(const FunctionType *Ty, bool isInternal, const std::string &name) : GlobalValue(PointerType::get(Ty), Value::FunctionVal, isInternal, name), - SymTabValue(this), BasicBlocks(this), ArgumentList(this, this) { + BasicBlocks(this), ArgumentList(this, this) { + ParentSymTab = SymTab = 0; } Function::~Function() { @@ -59,6 +60,7 @@ Function::~Function() { // Delete all of the method arguments and unlink from symbol table... ArgumentList.delete_all(); ArgumentList.setParent(0); + delete SymTab; } // Specialize setName to take care of symbol table majik @@ -75,7 +77,8 @@ void Function::setParent(Module *parent) { Parent = parent; // Relink symbol tables together... - setParentSymTab(Parent ? Parent->getSymbolTableSure() : 0); + ParentSymTab = Parent ? Parent->getSymbolTableSure() : 0; + if (SymTab) SymTab->setParentSymTab(ParentSymTab); } const FunctionType *Function::getFunctionType() const { @@ -86,6 +89,27 @@ const Type *Function::getReturnType() const { return getFunctionType()->getReturnType(); } +SymbolTable *Function::getSymbolTableSure() { + if (!SymTab) SymTab = new SymbolTable(ParentSymTab); + return SymTab; +} + +// hasSymbolTable() - Returns true if there is a symbol table allocated to +// this object AND if there is at least one name in it! +// +bool Function::hasSymbolTable() const { + if (!SymTab) return false; + + for (SymbolTable::const_iterator I = SymTab->begin(); + I != SymTab->end(); ++I) { + if (I->second.begin() != I->second.end()) + return true; // Found nonempty type plane! + } + + return false; +} + + // dropAllReferences() - This function causes all the subinstructions to "let // go" of all references that they are maintaining. This allows one to // 'delete' a whole class at a time, even though there may be circular diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index f3d7cd976f3..08bc38723ce 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -28,9 +28,9 @@ struct GlobalValueRefMap : public std::map{ }; -Module::Module() - : Value(Type::VoidTy, Value::ModuleVal, ""), SymTabValue(this), - GlobalList(this, this), FunctionList(this, this), GVRefMap(0) { +Module::Module() : GlobalList(this, this), FunctionList(this, this) { + GVRefMap = 0; + SymTab = 0; } Module::~Module() { @@ -39,8 +39,29 @@ Module::~Module() { GlobalList.setParent(0); FunctionList.delete_all(); FunctionList.setParent(0); + delete SymTab; } +SymbolTable *Module::getSymbolTableSure() { + if (!SymTab) SymTab = new SymbolTable(0); + return SymTab; +} + +// hasSymbolTable() - Returns true if there is a symbol table allocated to +// this object AND if there is at least one name in it! +// +bool Module::hasSymbolTable() const { + if (!SymTab) return false; + + for (SymbolTable::const_iterator I = SymTab->begin(), E = SymTab->end(); + I != E; ++I) + if (I->second.begin() != I->second.end()) + return true; // Found nonempty type plane! + + return false; +} + + // getOrInsertFunction - Look up the specified function in the module symbol // table. If it does not exist, add a prototype for the function and return // it. This is nice because it allows most passes to get away with not handling -- 2.34.1