diff options
author | Chris Lattner <sabre@nondot.org> | 2001-06-06 20:29:01 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-06-06 20:29:01 +0000 |
commit | 009505452b713ed2e3a8e99c5545a6e721c65495 (patch) | |
tree | 136a71c5b87bdf534d1f20a67558b49226b5a4d6 /lib/VMCore/Function.cpp | |
parent | 8d0afd3d32d1d67f9aa5df250a1d6955aa8f1ac9 (diff) |
Initial revision
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Function.cpp')
-rw-r--r-- | lib/VMCore/Function.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp new file mode 100644 index 0000000000..550c4f0ad6 --- /dev/null +++ b/lib/VMCore/Function.cpp @@ -0,0 +1,75 @@ +//===-- Method.cpp - Implement the Method class ------------------*- C++ -*--=// +// +// This file implements the Method class for the VMCore library. +// +//===----------------------------------------------------------------------===// + +#include "llvm/ValueHolderImpl.h" +#include "llvm/DerivedTypes.h" +#include "llvm/SymbolTable.h" +#include "llvm/Module.h" +#include "llvm/Method.h" +#include "llvm/BasicBlock.h" +#include "llvm/iOther.h" + +// Instantiate Templates - This ugliness is the price we have to pay +// for having a ValueHolderImpl.h file seperate from ValueHolder.h! :( +// +template class ValueHolder<MethodArgument, Method>; +template class ValueHolder<BasicBlock , Method>; + +Method::Method(const MethodType *Ty, const string &name) + : SymTabValue(Ty, Value::MethodVal, name), BasicBlocks(this), + ArgumentList(this, this) { + assert(Ty->isMethodType() && "Method signature must be of method type!"); + Parent = 0; +} + +Method::~Method() { + dropAllReferences(); // After this it is safe to delete instructions. + + // TODO: Should remove from the end, not the beginning of vector! + BasicBlocksType::iterator BI = BasicBlocks.begin(); + while ((BI = BasicBlocks.begin()) != BasicBlocks.end()) + delete BasicBlocks.remove(BI); + + // Delete all of the method arguments and unlink from symbol table... + ArgumentList.delete_all(); + ArgumentList.setParent(0); +} + +// Specialize setName to take care of symbol table majik +void Method::setName(const string &name) { + Module *P; + if ((P = getParent()) && hasName()) P->getSymbolTable()->remove(this); + Value::setName(name); + if (P && getName() != "") P->getSymbolTableSure()->insert(this); +} + +void Method::setParent(Module *parent) { + Parent = parent; + + // Relink symbol tables together... + setParentSymTab(Parent ? Parent->getSymbolTableSure() : 0); +} + +const Type *Method::getReturnType() const { + return ((const MethodType *)getType())->getReturnType(); +} + +const MethodType *Method::getMethodType() const { + return (const MethodType *)getType(); +} + +// 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 +// references... first all references are dropped, and all use counts go to +// zero. Then everything is delete'd for real. Note that no operations are +// valid on an object that has "dropped all references", except operator +// delete. +// +void Method::dropAllReferences() { + for_each(BasicBlocks.begin(), BasicBlocks.end(), + std::mem_fun(&BasicBlock::dropAllReferences)); +} |