diff options
Diffstat (limited to 'lib/AsmParser/llvmAsmParser.y.cvs')
-rw-r--r-- | lib/AsmParser/llvmAsmParser.y.cvs | 48 |
1 files changed, 14 insertions, 34 deletions
diff --git a/lib/AsmParser/llvmAsmParser.y.cvs b/lib/AsmParser/llvmAsmParser.y.cvs index 05fc57d..fa87821 100644 --- a/lib/AsmParser/llvmAsmParser.y.cvs +++ b/lib/AsmParser/llvmAsmParser.y.cvs @@ -926,7 +926,6 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { // EUINT64VAL - A positive number within uns. long long range %token <UInt64Val> EUINT64VAL -%type <SInt64Val> EINT64VAL %token <SIntVal> SINTVAL // Signed 32 bit ints... %token <UIntVal> UINTVAL // Unsigned 32 bit ints... @@ -959,9 +958,8 @@ Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) { %token <TermOpVal> RET BR SWITCH INVOKE UNWIND UNREACHABLE // Binary Operators -%type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories +%type <BinaryOpVal> ArithmeticOps LogicalOps // Binops Subcatagories %token <BinaryOpVal> ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR -%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comparators %token <OtherOpVal> ICMP FCMP %type <IPredicate> IPredicates %type <FPredicate> FPredicates @@ -995,21 +993,11 @@ INTVAL : UINTVAL { CHECK_FOR_ERROR }; - -EINT64VAL : ESINT64VAL; // These have same type and can't cause problems... -EINT64VAL : EUINT64VAL { - if ($1 > (uint64_t)INT64_MAX) // Outside of my range! - GEN_ERROR("Value too large for type!"); - $$ = (int64_t)$1; - CHECK_FOR_ERROR -}; - // Operations that are notably excluded from this list include: // RET, BR, & SWITCH because they end basic blocks and are treated specially. // ArithmeticOps: ADD | SUB | MUL | UDIV | SDIV | FDIV | UREM | SREM | FREM; LogicalOps : AND | OR | XOR; -SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; CastOps : TRUNC | ZEXT | SEXT | FPTRUNC | FPEXT | BITCAST | UITOFP | SITOFP | FPTOUI | FPTOSI | INTTOPTR | PTRTOINT; ShiftOps : SHL | LSHR | ASHR; @@ -1486,7 +1474,13 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr delete $1; CHECK_FOR_ERROR } - | SIntType EINT64VAL { // integral constants + | SIntType ESINT64VAL { // integral constants + if (!ConstantInt::isValueValidForType($1, $2)) + GEN_ERROR("Constant value doesn't fit in type!"); + $$ = ConstantInt::get($1, $2); + CHECK_FOR_ERROR + } + | SIntType EUINT64VAL { // integral constants if (!ConstantInt::isValueValidForType($1, $2)) GEN_ERROR("Constant value doesn't fit in type!"); $$ = ConstantInt::get($1, $2); @@ -1498,6 +1492,12 @@ ConstVal: Types '[' ConstVector ']' { // Nonempty unsized arr $$ = ConstantInt::get($1, $2); CHECK_FOR_ERROR } + | UIntType ESINT64VAL { + if (!ConstantInt::isValueValidForType($1, $2)) + GEN_ERROR("Constant value doesn't fit in type!"); + $$ = ConstantInt::get($1, $2); + CHECK_FOR_ERROR + } | BOOL TRUETOK { // Boolean constants $$ = ConstantBool::getTrue(); CHECK_FOR_ERROR @@ -1572,12 +1572,6 @@ ConstExpr: CastOps '(' ConstVal TO Types ')' { $$ = ConstantExpr::get($1, $3, $5); CHECK_FOR_ERROR } - | SetCondOps '(' ConstVal ',' ConstVal ')' { - if ($3->getType() != $5->getType()) - GEN_ERROR("setcc operand types must match!"); - $$ = ConstantExpr::get($1, $3, $5); - CHECK_FOR_ERROR - } | ICMP IPredicates '(' ConstVal ',' ConstVal ')' { if ($4->getType() != $6->getType()) GEN_ERROR("icmp operand types must match!"); @@ -2367,20 +2361,6 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { GEN_ERROR("binary operator returned null!"); delete $2; } - | SetCondOps Types ValueRef ',' ValueRef { - if(isa<PackedType>((*$2).get())) { - GEN_ERROR( - "PackedTypes currently not supported in setcc instructions!"); - } - Value* tmpVal1 = getVal(*$2, $3); - CHECK_FOR_ERROR - Value* tmpVal2 = getVal(*$2, $5); - CHECK_FOR_ERROR - $$ = new SetCondInst($1, tmpVal1, tmpVal2); - if ($$ == 0) - GEN_ERROR("binary operator returned null!"); - delete $2; - } | ICMP IPredicates Types ValueRef ',' ValueRef { if (isa<PackedType>((*$3).get())) GEN_ERROR("Packed types not supported by icmp instruction"); |