diff --git a/include/llvm/ConstPoolVals.h b/include/llvm/ConstPoolVals.h index 235ab12f263..3fe8e099cf4 100644 --- a/include/llvm/ConstPoolVals.h +++ b/include/llvm/ConstPoolVals.h @@ -232,10 +232,7 @@ protected: ConstPoolPointerReference(GlobalValue *GV); ~ConstPoolPointerReference() {} public: - static ConstPoolPointerReference *get(GlobalValue *GV) { - // FIXME: These should all be shared! - return new ConstPoolPointerReference(GV); - } + static ConstPoolPointerReference *get(GlobalValue *GV); virtual string getStrValue() const; diff --git a/include/llvm/Function.h b/include/llvm/Function.h index d7c35b3c040..fe878bf45e8 100644 --- a/include/llvm/Function.h +++ b/include/llvm/Function.h @@ -38,8 +38,6 @@ private: BasicBlocksType BasicBlocks; // The basic blocks ArgumentListType ArgumentList; // The formal arguments - Module *Parent; // The module that contains this method - friend class ValueHolder; void setParent(Module *parent); @@ -58,10 +56,6 @@ public: bool isExternal() const { return BasicBlocks.empty(); } - // Get the class structure that this method is contained inside of... - inline Module *getParent() { return Parent; } - inline const Module *getParent() const { return Parent; } - // Get the underlying elements of the Method... inline const ArgumentListType &getArgumentList() const{ return ArgumentList; } inline ArgumentListType &getArgumentList() { return ArgumentList; } diff --git a/include/llvm/GlobalValue.h b/include/llvm/GlobalValue.h index 394e2a262a1..baee0bf4e08 100644 --- a/include/llvm/GlobalValue.h +++ b/include/llvm/GlobalValue.h @@ -17,14 +17,21 @@ class GlobalValue : public User { GlobalValue(const GlobalValue &); // do not implement protected: GlobalValue(const Type *Ty, ValueTy vty, const string &name = "") - : User(Ty, vty, name) {} -public: + : User(Ty, vty, name) { Parent = 0; } - // getType - Global values are always pointers (FIXME, methods should be ptrs too!) + Module *Parent; +public: + ~GlobalValue() {} + + // getType - Global values are always pointers. inline const PointerType *getType() const { return (const PointerType*)User::getType(); } + // Get the module that this global value is contained inside of... + inline Module *getParent() { return Parent; } + inline const Module *getParent() const { return Parent; } + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const GlobalValue *T) { return true; } static inline bool classof(const Value *V) { diff --git a/include/llvm/GlobalVariable.h b/include/llvm/GlobalVariable.h index 6d6de141466..2e298058f52 100644 --- a/include/llvm/GlobalVariable.h +++ b/include/llvm/GlobalVariable.h @@ -19,8 +19,6 @@ class ConstPoolVal; class PointerType; class GlobalVariable : public GlobalValue { - Module *Parent; // The module that contains this method - friend class ValueHolder; void setParent(Module *parent) { Parent = parent; } @@ -33,9 +31,6 @@ public: // Specialize setName to handle symbol table majik... virtual void setName(const string &name, SymbolTable *ST = 0); - inline Module *getParent() { return Parent; } - inline const Module *getParent() const { return Parent; } - // The initializer for the global variable/constant is held by Operands[0] if // an initializer is specified. // diff --git a/include/llvm/SymbolTable.h b/include/llvm/SymbolTable.h index bae9eb14812..69ff3ddad57 100644 --- a/include/llvm/SymbolTable.h +++ b/include/llvm/SymbolTable.h @@ -103,6 +103,8 @@ public: return find(TypeID)->second.end(); } + void dump() const; // Debug method, print out symbol table + private: // insertEntry - Insert a value into the symbol table with the specified // name... diff --git a/lib/VMCore/ConstPoolVals.cpp b/lib/VMCore/ConstPoolVals.cpp index eeb7a43069f..be1e582d157 100644 --- a/lib/VMCore/ConstPoolVals.cpp +++ b/lib/VMCore/ConstPoolVals.cpp @@ -343,3 +343,10 @@ ConstPoolPointer *ConstPoolPointer::getNull(const PointerType *Ty) { return Result; } +//---- ConstPoolPointerReference::get() implementation... +// +ConstPoolPointerReference *ConstPoolPointerReference::get(GlobalValue *GV) { + assert(GV->getParent()); + // FIXME: These should all be shared! + return new ConstPoolPointerReference(GV); +} diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index 372d0d28b91..6e30fe80a77 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -29,7 +29,6 @@ Method::Method(const MethodType *Ty, const string &name) : GlobalValue(PointerType::get(Ty), Value::MethodVal, name), SymTabValue(this), BasicBlocks(this), ArgumentList(this, this) { assert(::isa(Ty) && "Method signature must be of method type!"); - Parent = 0; } Method::~Method() { @@ -90,7 +89,7 @@ GlobalVariable::GlobalVariable(const Type *Ty, bool isConstant, ConstPoolVal *Initializer = 0, const string &Name = "") : GlobalValue(PointerType::get(Ty), Value::GlobalVariableVal, Name), - Parent(0), Constant(isConstant) { + Constant(isConstant) { if (Initializer) Operands.push_back(Use((Value*)Initializer, this)); assert(!isConstant || hasInitializer() && diff --git a/lib/VMCore/SymbolTable.cpp b/lib/VMCore/SymbolTable.cpp index 12bf0c7f1ba..09465305e65 100644 --- a/lib/VMCore/SymbolTable.cpp +++ b/lib/VMCore/SymbolTable.cpp @@ -173,3 +173,29 @@ void SymbolTable::refineAbstractType(const DerivedType *OldType, cast(NewType)->addAbstractTypeUser(this); } } + + +#ifndef NDEBUG +#include "llvm/Assembly/Writer.h" +#include + +static void DumpVal(const pair &V) { + cout << " '%" << V.first << "' = " << V.second << endl; +} + +static void DumpPlane(const pair >&P) { + cout << " Plane: " << P.first << endl; + for_each(P.second.begin(), P.second.end(), DumpVal); +} + +void SymbolTable::dump() const { + cout << "Symbol table dump:\n"; + for_each(begin(), end(), DumpPlane); + + if (ParentSymTab) { + cout << "Parent "; + ParentSymTab->dump(); + } +} + +#endif