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/AsmParser | |
| 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/AsmParser')
| -rw-r--r-- | llvm/lib/AsmParser/llvmAsmParser.y | 59 |
1 files changed, 40 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)) |

