diff options
author | Chris Lattner <sabre@nondot.org> | 2002-04-28 04:51:51 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-04-28 04:51:51 +0000 |
commit | 11aa4770fe38befb3926646cf9ea7ed0ff7e33a8 (patch) | |
tree | a14c289b2ba7df80c6d81a34a761472f3e46968d /lib/VMCore | |
parent | 5240dac674f9b7104d799180d48ca85e13d95502 (diff) | |
download | external_llvm-11aa4770fe38befb3926646cf9ea7ed0ff7e33a8.zip external_llvm-11aa4770fe38befb3926646cf9ea7ed0ff7e33a8.tar.gz external_llvm-11aa4770fe38befb3926646cf9ea7ed0ff7e33a8.tar.bz2 |
* 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
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Function.cpp | 28 | ||||
-rw-r--r-- | 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 598f9fd..c15a888 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -45,7 +45,8 @@ template class ValueHolder<BasicBlock, Function, Function>; 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 f3d7cd9..08bc387 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -28,9 +28,9 @@ struct GlobalValueRefMap : public std::map<GlobalValue*, ConstantPointerRef*>{ }; -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 |