1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Work around PR424 for old c/c++ frontends.

llvm-svn: 15882
This commit is contained in:
Chris Lattner 2004-08-17 17:26:41 +00:00
parent 7ab985b9a2
commit 54c0c44d38

View File

@ -916,7 +916,6 @@ Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
%token <TermOpVal> RET BR SWITCH INVOKE UNWIND %token <TermOpVal> RET BR SWITCH INVOKE UNWIND
// Binary Operators // Binary Operators
%type <BinaryOpVal> BinaryOps // all the binary operators
%type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories %type <BinaryOpVal> ArithmeticOps LogicalOps SetCondOps // Binops Subcatagories
%token <BinaryOpVal> ADD SUB MUL DIV REM AND OR XOR %token <BinaryOpVal> ADD SUB MUL DIV REM AND OR XOR
%token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comarators %token <BinaryOpVal> SETLE SETGE SETLT SETGT SETEQ SETNE // Binary Comarators
@ -955,7 +954,6 @@ EINT64VAL : EUINT64VAL {
ArithmeticOps: ADD | SUB | MUL | DIV | REM; ArithmeticOps: ADD | SUB | MUL | DIV | REM;
LogicalOps : AND | OR | XOR; LogicalOps : AND | OR | XOR;
SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE;
BinaryOps : ArithmeticOps | LogicalOps | SetCondOps;
ShiftOps : SHL | SHR; ShiftOps : SHL | SHR;
@ -1326,9 +1324,37 @@ ConstExpr: CAST '(' ConstVal TO Types ')' {
ThrowException("Select operand types must match!"); ThrowException("Select operand types must match!");
$$ = ConstantExpr::getSelect($3, $5, $7); $$ = ConstantExpr::getSelect($3, $5, $7);
} }
| BinaryOps '(' ConstVal ',' ConstVal ')' { | ArithmeticOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType()) if ($3->getType() != $5->getType())
ThrowException("Binary operator types must match!"); ThrowException("Binary operator types must match!");
// 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
// broken case. See PR424 for more information.
if (!isa<PointerType>($3->getType())) {
$$ = ConstantExpr::get($1, $3, $5);
} else {
const Type *IntPtrTy;
switch (CurModule.CurrentModule->getPointerSize()) {
case Module::Pointer32: IntPtrTy = Type::IntTy; break;
case Module::Pointer64: IntPtrTy = Type::LongTy; break;
default: ThrowException("invalid pointer binary constant expr!");
}
$$ = ConstantExpr::get($1, ConstantExpr::getCast($3, IntPtrTy),
ConstantExpr::getCast($5, IntPtrTy));
$$ = ConstantExpr::getCast($$, $3->getType());
}
}
| LogicalOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType())
ThrowException("Logical operator types must match!");
if (!$3->getType()->isIntegral())
ThrowException("Logical operands must have integral types!");
$$ = ConstantExpr::get($1, $3, $5);
}
| SetCondOps '(' ConstVal ',' ConstVal ')' {
if ($3->getType() != $5->getType())
ThrowException("setcc operand types must match!");
$$ = ConstantExpr::get($1, $3, $5); $$ = ConstantExpr::get($1, $3, $5);
} }
| ShiftOps '(' ConstVal ',' ConstVal ')' { | ShiftOps '(' ConstVal ',' ConstVal ')' {