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:
parent
7ab985b9a2
commit
54c0c44d38
@ -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 ')' {
|
||||||
|
Loading…
Reference in New Issue
Block a user