Changes in directory llvm/lib/AsmParser:
llvmAsmParser.y updated: 1.351 -> 1.352 --- Log message: Implement review feedback. Aliasees can be either GlobalValue's or bitcasts of them. --- Diffs of the changes: (+53 -27) llvmAsmParser.y | 80 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 53 insertions(+), 27 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.351 llvm/lib/AsmParser/llvmAsmParser.y:1.352 --- llvm/lib/AsmParser/llvmAsmParser.y:1.351 Thu Apr 26 00:30:35 2007 +++ llvm/lib/AsmParser/llvmAsmParser.y Sat Apr 28 08:44:59 2007 @@ -480,8 +480,24 @@ // or an id number that hasn't been read yet. We may be referencing something // forward, so just create an entry to be resolved later and get to it... // - V = new Argument(Ty); - + switch (ID.Type) { + case ValID::GlobalName: + case ValID::GlobalID: + const PointerType *PTy = dyn_cast<PointerType>(Ty); + if (!PTy) { + GenerateError("Invalid type for reference to global" ); + return 0; + } + const Type* ElTy = PTy->getElementType(); + if (const FunctionType *FTy = dyn_cast<FunctionType>(ElTy)) + V = new Function(FTy, GlobalValue::ExternalLinkage); + else + V = new GlobalVariable(ElTy, false, GlobalValue::ExternalLinkage); + break; + default: + V = new Argument(Ty); + } + // Remember where this forward reference came from. FIXME, shouldn't we try // to recycle these things?? CurModule.PlaceHolderInfo.insert(std::make_pair(V, std::make_pair(ID, @@ -987,7 +1003,7 @@ %type <BasicBlockVal> BasicBlock InstructionList %type <TermInstVal> BBTerminatorInst %type <InstVal> Inst InstVal MemoryInst -%type <ConstVal> ConstVal ConstExpr +%type <ConstVal> ConstVal ConstExpr AliaseeRef %type <ConstVector> ConstVector %type <ArgList> ArgList ArgListH %type <PHIList> PHIList @@ -1943,6 +1959,30 @@ // ThreadLocal ThreadLocal : THREAD_LOCAL { $$ = true; } | { $$ = false; }; +// AliaseeRef - Match either GlobalValue or bitcast to GlobalValue. +AliaseeRef : ResultTypes SymbolicValueRef { + const Type* VTy = $1->get(); + Value *V = getVal(VTy, $2); + GlobalValue* Aliasee = dyn_cast<GlobalValue>(V); + if (!Aliasee) + GEN_ERROR("Aliases can be created only to global values"); + + $$ = Aliasee; + CHECK_FOR_ERROR + delete $1; + } + | BITCAST '(' AliaseeRef TO Types ')' { + Constant *Val = $3; + const Type *DestTy = $5->get(); + if (!CastInst::castIsValid($1, $3, DestTy)) + GEN_ERROR("invalid cast opcode for cast from '" + + Val->getType()->getDescription() + "' to '" + + DestTy->getDescription() + "'"); + + $$ = ConstantExpr::getCast($1, $3, DestTy); + CHECK_FOR_ERROR + delete $5; + }; //===----------------------------------------------------------------------===// // Rules to match Modules @@ -2045,34 +2085,20 @@ CurGV = 0; CHECK_FOR_ERROR } - | OptGlobalAssign GVVisibilityStyle ALIAS AliasLinkage ResultTypes - SymbolicValueRef { + | OptGlobalAssign GVVisibilityStyle ALIAS AliasLinkage AliaseeRef { std::string Name($1); if (Name.empty()) - GEN_ERROR("Alias name cannot be empty") - const PointerType *PFTy = 0; - const FunctionType *Ty = 0; - Value* V = 0; - const Type* VTy = 0; - if (!(PFTy = dyn_cast<PointerType>($5->get())) || - !(Ty = dyn_cast<FunctionType>(PFTy->getElementType()))) { - VTy = $5->get(); - V = getExistingVal(VTy, $6); - } else { - VTy = PFTy; - V = getExistingVal(PFTy, $6); - } - if (V == 0) + GEN_ERROR("Alias name cannot be empty"); + + Constant* Aliasee = $5; + if (Aliasee == 0) GEN_ERROR(std::string("Invalid aliasee for alias: ") + $1); - if (GlobalValue* Aliasee = dyn_cast<GlobalValue>(V)) { - GlobalAlias* GA = new GlobalAlias(VTy, $4, Name, Aliasee, - CurModule.CurrentModule); - GA->setVisibility($2); - InsertValue(GA, CurModule.Values); - } else - GEN_ERROR("Aliases can be created only to global values"); + + GlobalAlias* GA = new GlobalAlias(Aliasee->getType(), $4, Name, Aliasee, + CurModule.CurrentModule); + GA->setVisibility($2); + InsertValue(GA, CurModule.Values); CHECK_FOR_ERROR - delete $5; } | TARGET TargetDefinition { CHECK_FOR_ERROR _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits