> + 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); > + }
Very nice. Please indent the code in the case statements one more space though :) > @@ -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; > + }; I'd suggest eliminating this production and... > @@ -2045,34 +2085,20 @@ > CurGV = 0; > CHECK_FOR_ERROR > } > - | OptGlobalAssign GVVisibilityStyle ALIAS AliasLinkage ResultTypes > - SymbolicValueRef { > + | OptGlobalAssign GVVisibilityStyle ALIAS AliasLinkage AliaseeRef { Instead of AliaseeRef, use ResolvedVal here. Then just check ResolvedVal for the two acceptable forms. -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits