diff options
| author | Chris Lattner <sabre@nondot.org> | 2001-10-03 06:12:09 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2001-10-03 06:12:09 +0000 |
| commit | 60e0dd78b217d0d7e0750251b8a10c64e8e9d2f3 (patch) | |
| tree | 38f3d90049a0dae8d16b6ce770b83aa0a7b09325 /llvm/lib | |
| parent | e63ddd8df7c10256597d471f8353228aea959d14 (diff) | |
| download | bcm5719-llvm-60e0dd78b217d0d7e0750251b8a10c64e8e9d2f3.tar.gz bcm5719-llvm-60e0dd78b217d0d7e0750251b8a10c64e8e9d2f3.zip | |
First try at a horrible global value reference wrapper
llvm-svn: 701
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/llvmAsmParser.y | 59 | ||||
| -rw-r--r-- | llvm/lib/VMCore/ConstPoolVals.cpp | 11 |
2 files changed, 51 insertions, 19 deletions
diff --git a/llvm/lib/AsmParser/llvmAsmParser.y b/llvm/lib/AsmParser/llvmAsmParser.y index 5771318f6bf..6852df7dc6b 100644 --- a/llvm/lib/AsmParser/llvmAsmParser.y +++ b/llvm/lib/AsmParser/llvmAsmParser.y @@ -175,6 +175,23 @@ static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) { return Typ; } +static Value *lookupInSymbolTable(const Type *Ty, const string &Name) { + SymbolTable *SymTab = + CurMeth.CurrentMethod ? CurMeth.CurrentMethod->getSymbolTable() : 0; + Value *N = SymTab ? SymTab->lookup(Ty, Name) : 0; + + if (N == 0) { + // Symbol table doesn't automatically chain yet... because the method + // hasn't been added to the module... + // + SymTab = CurModule.CurrentModule->getSymbolTable(); + if (SymTab) + N = SymTab->lookup(Ty, Name); + } + + return N; +} + static Value *getVal(const Type *Ty, const ValID &D, bool DoNotImprovise = false) { assert(Ty != Type::TypeTy && "Should use getTypeVal for types!"); @@ -204,20 +221,8 @@ static Value *getVal(const Type *Ty, const ValID &D, } case ValID::NameVal: { // Is it a named definition? string Name(D.Name); - SymbolTable *SymTab = 0; - if (CurMeth.CurrentMethod) - SymTab = CurMeth.CurrentMethod->getSymbolTable(); - Value *N = SymTab ? SymTab->lookup(Ty, Name) : 0; - - if (N == 0) { - // Symbol table doesn't automatically chain yet... because the method - // hasn't been added to the module... - // - SymTab = CurModule.CurrentModule->getSymbolTable(); - if (SymTab) - N = SymTab->lookup(Ty, Name); - if (N == 0) break; - } + Value *N = lookupInSymbolTable(Ty, Name); + if (N == 0) break; D.destroy(); // Free old strdup'd memory... return N; @@ -849,12 +854,28 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr $$ = ConstPoolPointer::getNullPointer(PTy); delete $1; } -/* - | Types '*' ConstVal { - assert(0); - $$ = 0; + | Types VAR_ID { + string Name($2); free($2); // Change to a responsible mem manager + const PointerType *Ty = dyn_cast<const PointerType>($1->get()); + if (Ty == 0) + ThrowException("Global const reference must be a pointer type!"); + + Value *N = lookupInSymbolTable(Ty, Name); + if (N == 0) + ThrowException("Global pointer reference '%" + Name + + "' must be defined before use!"); + + // TODO FIXME: This should also allow methods... when common baseclass + // exists + if (GlobalVariable *GV = dyn_cast<GlobalVariable>(N)) { + $$ = ConstPoolPointerReference::get(GV); + } else { + ThrowException("'%" + Name + "' is not a global value reference!"); + } + + delete $1; } -*/ + ConstVal : SIntType EINT64VAL { // integral constants if (!ConstPoolSInt::isValueValidForType($1, $2)) diff --git a/llvm/lib/VMCore/ConstPoolVals.cpp b/llvm/lib/VMCore/ConstPoolVals.cpp index f53c090f70b..0e0da5e16e8 100644 --- a/llvm/lib/VMCore/ConstPoolVals.cpp +++ b/llvm/lib/VMCore/ConstPoolVals.cpp @@ -9,6 +9,7 @@ #include "llvm/Support/StringExtras.h" // itostr #include "llvm/DerivedTypes.h" #include "llvm/SymbolTable.h" +#include "llvm/GlobalVariable.h" // TODO make this GlobalValue.h #include <algorithm> #include <assert.h> @@ -105,6 +106,12 @@ ConstPoolStruct::ConstPoolStruct(const StructType *T, ConstPoolPointer::ConstPoolPointer(const PointerType *T) : ConstPoolVal(T) {} +ConstPoolPointerReference::ConstPoolPointerReference(GlobalVariable *GV) + : ConstPoolPointer(GV->getType()) { + Operands.push_back(Use(GV, this)); +} + + //===----------------------------------------------------------------------===// // getStrValue implementations @@ -155,6 +162,10 @@ string ConstPoolPointer::getStrValue() const { return "null"; } +string ConstPoolPointerReference::getStrValue() const { + return "<pointer reference>"; +} + //===----------------------------------------------------------------------===// // isValueValidForType implementations |

