Changes in directory llvm/lib/AsmParser:
llvmAsmParser.y updated: 1.266.2.8 -> 1.266.2.9 --- Log message: Round 2 of DIV updates. --- Diffs of the changes: (+47 -45) llvmAsmParser.y | 92 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 47 insertions(+), 45 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.266.2.8 llvm/lib/AsmParser/llvmAsmParser.y:1.266.2.9 --- llvm/lib/AsmParser/llvmAsmParser.y:1.266.2.8 Mon Oct 23 13:13:26 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y Wed Oct 25 20:58:05 2006 @@ -813,50 +813,48 @@ return Ty; } -// This template function is used to obtain the correct opcode for an -// instruction when an obsolete opcode is encountered. The OpcodeInfo template -// keeps track of the opcode and the "obsolete" flag. These are generated by -// the lexer and obsolete will be true when the lexer encounters the token for +// This function is used to obtain the correct opcode for an instruction when +// an obsolete opcode is encountered. The OI parameter (OpcodeInfo) has both +// an opcode and an "obsolete" flag. These are generated by the lexer and +// the "obsolete" member will be true when the lexer encounters the token for // an obsolete opcode. For example, "div" was replaced by [usf]div but we need // to maintain backwards compatibility for asm files that still have the "div" // instruction. This function handles converting div -> [usf]div appropriately. -template <class EnumKind> -static void sanitizeOpCode(OpcodeInfo<EnumKind> &OI, const PATypeHolder& Ty) { - if (OI.obsolete) { - switch (OI.opcode) { - default: - GenerateError("Invalid Obsolete OpCode"); - break; - case Instruction::UDiv: - if (Ty->isFloatingPoint()) - OI.opcode = Instruction::FDiv; - else if (Ty->isSigned()) - OI.opcode = Instruction::SDiv; - break; - case Instruction::SDiv: - if (Ty->isFloatingPoint()) - OI.opcode = Instruction::FDiv; - else if (Ty->isUnsigned()) - OI.opcode = Instruction::UDiv; - break; - case Instruction::URem: - if (Ty->isFloatingPoint()) - OI.opcode = Instruction::FRem; - else if (Ty->isSigned()) - OI.opcode = Instruction::SRem; - break; - case Instruction::SRem: - if (Ty->isFloatingPoint()) - OI.opcode = Instruction::FRem; - else if (Ty->isUnsigned()) - OI.opcode = Instruction::URem; - break; - } - OI.obsolete = false; +static void +sanitizeOpCode(OpcodeInfo<Instruction::BinaryOps> &OI, const PATypeHolder& PATy) +{ + // If its not obsolete, don't do anything + if (!OI.obsolete) + return; + + // If its a packed type we want to use the element type + const Type* Ty = PATy; + if (const PackedType* PTy = dyn_cast<PackedType>(Ty)) + Ty = PTy->getElementType(); + + // Depending on the opcode .. + switch (OI.opcode) { + default: + GenerateError("Invalid Obsolete OpCode"); + break; + case Instruction::UDiv: + // Handle cases where the opcode needs to change + if (Ty->isFloatingPoint()) + OI.opcode = Instruction::FDiv; + else if (Ty->isSigned()) + OI.opcode = Instruction::SDiv; + break; + case Instruction::URem: + if (Ty->isFloatingPoint()) + OI.opcode = Instruction::FRem; + else if (Ty->isSigned()) + OI.opcode = Instruction::SRem; + break; } + // Its not obsolete any more, we fixed it. + OI.obsolete = false; } - - + // common code from the two 'RunVMAsmParser' functions static Module* RunParser(Module * M) { @@ -1045,13 +1043,13 @@ bool BoolVal; char *StrVal; // This memory is strdup'd! - llvm::ValID ValIDVal; // strdup'd memory maybe! + llvm::ValID ValIDVal; // strdup'd memory maybe! - BinaryOpInfo BinaryOpVal; - TermOpInfo TermOpVal; - MemOpInfo MemOpVal; - OtherOpInfo OtherOpVal; - llvm::Module::Endianness Endianness; + BinaryOpInfo BinaryOpVal; + TermOpInfo TermOpVal; + MemOpInfo MemOpVal; + OtherOpInfo OtherOpVal; + llvm::Module::Endianness Endianness; } %type <ModuleVal> Module FunctionList @@ -1685,8 +1683,11 @@ | ArithmeticOps '(' ConstVal ',' ConstVal ')' { if ($3->getType() != $5->getType()) GEN_ERROR("Binary operator types must match!"); + // First, make sure we're dealing with the right opcode by upgrading from + // obsolete versions. sanitizeOpCode($1,$3->getType()); CHECK_FOR_ERROR; + // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. // To retain backward compatibility with these early compilers, we emit a // cast to the appropriate integer type automatically if we are in the @@ -2473,6 +2474,7 @@ if (isa<PackedType>((*$2).get()) && ($1.opcode == Instruction::URem || $1.opcode == Instruction::SRem)) GEN_ERROR("URem and SRem not supported on packed types!"); + // Upgrade the opcode from obsolete versions before we do anything with it. sanitizeOpCode($1,*$2); CHECK_FOR_ERROR; Value* val1 = getVal(*$2, $3); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits