diff options
author | Chris Lattner <sabre@nondot.org> | 2001-10-03 03:19:33 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2001-10-03 03:19:33 +0000 |
commit | d05adbcdce7a7f56e7c3e4fad42e41132dd7361e (patch) | |
tree | 916c3fc13a004aee76bbea50b14c51d6f4d824e5 | |
parent | df7306f1b93953ce99a8e4dadf74ac8f1d5686dc (diff) | |
download | external_llvm-d05adbcdce7a7f56e7c3e4fad42e41132dd7361e.zip external_llvm-d05adbcdce7a7f56e7c3e4fad42e41132dd7361e.tar.gz external_llvm-d05adbcdce7a7f56e7c3e4fad42e41132dd7361e.tar.bz2 |
Clean up parser, fix a bug that prevented this from working:
%ListNode3 = global %list { %list* null, int 4 }
because %list is name and the parser expected a literal {..} type there.
In addition, simplified rules that the fix (Allow any Types there, not just a StructType)
made obsolete. Simplified type propogation a bit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@700 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y | 118 |
1 files changed, 52 insertions, 66 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index 698fd7b..5771318 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -506,14 +506,6 @@ inline static PATypeHolder<TypeTy> *newTH(const PATypeHolder<TypeTy> &TH) { } -// newTHC - Allocate a new type holder for the specified type that can be -// casted to a new Type type. -template <class TypeTy, class OldTy> -inline static PATypeHolder<TypeTy> *newTHC(const PATypeHolder<OldTy> &Old) { - return new PATypeHolder<TypeTy>((const TypeTy*)Old.get()); -} - - //===----------------------------------------------------------------------===// // RunVMAsmParser - Define an interface to this parser //===----------------------------------------------------------------------===// @@ -545,9 +537,6 @@ Module *RunVMAsmParser(const string &Filename, FILE *F) { const Type *PrimType; PATypeHolder<Type> *TypeVal; - PATypeHolder<ArrayType> *ArrayTypeTy; - PATypeHolder<StructType> *StructTypeTy; - PATypeHolder<PointerType> *PointerTypeTy; Value *ValueVal; list<MethodArgument*> *MethodArgList; @@ -611,9 +600,6 @@ Module *RunVMAsmParser(const string &Filename, FILE *F) { %token <TypeVal> OPAQUE %token <PrimType> VOID BOOL SBYTE UBYTE SHORT USHORT INT UINT LONG ULONG %token <PrimType> FLOAT DOUBLE TYPE LABEL -%type <ArrayTypeTy> ArrayType ArrayTypeI -%type <StructTypeTy> StructType StructTypeI -%type <PointerTypeTy> PointerType PointerTypeI %token <StrVal> VAR_ID LABELSTR STRINGCONSTANT %type <StrVal> OptVAR_ID OptAssign @@ -710,34 +696,6 @@ UpRTypes : ValueRef { // Named types are also simple types... $$ = newTH(getTypeVal($1)); } -// ArrayTypeI - Internal version of ArrayType that can have incomplete uprefs -// -ArrayTypeI : '[' UpRTypesV ']' { // Unsized array type? - $$ = newTHC<ArrayType>(HandleUpRefs(ArrayType::get(*$2))); - delete $2; - } - | '[' EUINT64VAL 'x' UpRTypes ']' { // Sized array type? - $$ = newTHC<ArrayType>(HandleUpRefs(ArrayType::get(*$4, (int)$2))); - delete $4; - } - -StructTypeI : '{' TypeListI '}' { // Structure type? - vector<const Type*> Elements; - mapto($2->begin(), $2->end(), back_inserter(Elements), - mem_fun_ref(&PATypeHandle<Type>::get)); - - $$ = newTHC<StructType>(HandleUpRefs(StructType::get(Elements))); - delete $2; - } - | '{' '}' { // Empty structure type? - $$ = newTH(StructType::get(vector<const Type*>())); - } - -PointerTypeI : UpRTypes '*' { // Pointer type? - $$ = newTHC<PointerType>(HandleUpRefs(PointerType::get(*$1))); - delete $1; // Delete the type handle - } - // Include derived types in the Types production. // UpRTypes : '\\' EUINT64VAL { // Type UpReference @@ -755,22 +713,29 @@ UpRTypes : '\\' EUINT64VAL { // Type UpReference delete $3; // Delete the argument list delete $1; // Delete the old type handle } - | ArrayTypeI { // [Un]sized array type? - $$ = newTHC<Type>(*$1); delete $1; - } - | StructTypeI { // Structure type? - $$ = newTHC<Type>(*$1); delete $1; + | '[' UpRTypesV ']' { // Unsized array type? + $$ = newTH<Type>(HandleUpRefs(ArrayType::get(*$2))); + delete $2; } - | PointerTypeI { // Pointer type? - $$ = newTHC<Type>(*$1); delete $1; + | '[' EUINT64VAL 'x' UpRTypes ']' { // Sized array type? + $$ = newTH<Type>(HandleUpRefs(ArrayType::get(*$4, (int)$2))); + delete $4; } + | '{' TypeListI '}' { // Structure type? + vector<const Type*> Elements; + mapto($2->begin(), $2->end(), back_inserter(Elements), + mem_fun_ref(&PATypeHandle<Type>::get)); -// Define some helpful top level types that do not allow UpReferences to escape -// -ArrayType : ArrayTypeI { TypeDone($$ = $1); } -StructType : StructTypeI { TypeDone($$ = $1); } -PointerType : PointerTypeI { TypeDone($$ = $1); } - + $$ = newTH<Type>(HandleUpRefs(StructType::get(Elements))); + delete $2; + } + | '{' '}' { // Empty structure type? + $$ = newTH<Type>(StructType::get(vector<const Type*>())); + } + | UpRTypes '*' { // Pointer type? + $$ = newTH<Type>(HandleUpRefs(PointerType::get(*$1))); + delete $1; + } // TypeList - Used for struct declarations and as a basis for method type // declaration type lists @@ -799,8 +764,11 @@ ArgTypeListI : TypeListI // ConstVal - The various declarations that go into the constant pool. This // includes all forward declarations of types, constants, and functions. // -ConstVal: ArrayType '[' ConstVector ']' { // Nonempty unsized arr - const ArrayType *ATy = *$1; +ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr + const ArrayType *ATy = dyn_cast<const ArrayType>($1->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*$1)->getDescription() + "'!"); const Type *ETy = ATy->getElementType(); int NumElements = ATy->getNumElements(); @@ -821,16 +789,25 @@ ConstVal: ArrayType '[' ConstVector ']' { // Nonempty unsized arr $$ = ConstPoolArray::get(ATy, *$3); delete $1; delete $3; } - | ArrayType '[' ']' { - int NumElements = (*$1)->getNumElements(); + | Types '[' ']' { + const ArrayType *ATy = dyn_cast<const ArrayType>($1->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*$1)->getDescription() + "'!"); + + int NumElements = ATy->getNumElements(); if (NumElements != -1 && NumElements != 0) ThrowException("Type mismatch: constant sized array initialized with 0" " arguments, but has size of " + itostr(NumElements) +"!"); - $$ = ConstPoolArray::get((*$1), vector<ConstPoolVal*>()); + $$ = ConstPoolArray::get(ATy, vector<ConstPoolVal*>()); delete $1; } - | ArrayType 'c' STRINGCONSTANT { - const ArrayType *ATy = *$1; + | Types 'c' STRINGCONSTANT { + const ArrayType *ATy = dyn_cast<const ArrayType>($1->get()); + if (ATy == 0) + ThrowException("Cannot make array constant with type: '" + + (*$1)->getDescription() + "'!"); + int NumElements = ATy->getNumElements(); const Type *ETy = ATy->getElementType(); char *EndStr = UnEscapeLexed($3, true); @@ -853,14 +830,23 @@ ConstVal: ArrayType '[' ConstVector ']' { // Nonempty unsized arr $$ = ConstPoolArray::get(ATy, Vals); delete $1; } - | StructType '{' ConstVector '}' { + | Types '{' ConstVector '}' { + const StructType *STy = dyn_cast<const StructType>($1->get()); + if (STy == 0) + ThrowException("Cannot make struct constant with type: '" + + (*$1)->getDescription() + "'!"); // FIXME: TODO: Check to see that the constants are compatible with the type // initializer! - $$ = ConstPoolStruct::get(*$1, *$3); + $$ = ConstPoolStruct::get(STy, *$3); delete $1; delete $3; } - | PointerType NULL_TOK { - $$ = ConstPoolPointer::getNullPointer(*$1); + | Types NULL_TOK { + const PointerType *PTy = dyn_cast<const PointerType>($1->get()); + if (PTy == 0) + ThrowException("Cannot make null pointer constant with type: '" + + (*$1)->getDescription() + "'!"); + + $$ = ConstPoolPointer::getNullPointer(PTy); delete $1; } /* |