diff options
author | Jan Kotas <jkotas@microsoft.com> | 2017-11-14 15:13:22 +0300 |
---|---|---|
committer | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2017-11-14 15:13:22 +0300 |
commit | 35d86cb2477d85ef0b4bcced4010395ca4a6e972 (patch) | |
tree | 7e93b63b526f148cdb2273158891747973740cde /src/ILCompiler.CppCodeGen | |
parent | 749c80f7821f50e51dcd32bcd402b95eb4935f3c (diff) |
Fix CppCodeGen break with latest XCode (#4926)
Latest XCode errors on ordered comparison of pointer with integer
Also, fixed some unnecessary always-true comparisons that the C++ compiler emitted warnings for.
Diffstat (limited to 'src/ILCompiler.CppCodeGen')
-rw-r--r-- | src/ILCompiler.CppCodeGen/src/CppCodeGen/ILToCppImporter.cs | 316 |
1 files changed, 141 insertions, 175 deletions
diff --git a/src/ILCompiler.CppCodeGen/src/CppCodeGen/ILToCppImporter.cs b/src/ILCompiler.CppCodeGen/src/CppCodeGen/ILToCppImporter.cs index a5cb3746e..66eeb22f0 100644 --- a/src/ILCompiler.CppCodeGen/src/CppCodeGen/ILToCppImporter.cs +++ b/src/ILCompiler.CppCodeGen/src/CppCodeGen/ILToCppImporter.cs @@ -321,6 +321,145 @@ namespace Internal.IL } } + private void AppendComparison(ILOpcode opcode, StackEntry op1, StackEntry op2) + { + // StackValueKind is carefully ordered to make this work (assuming the IL is valid) + StackValueKind kind = (op1.Kind > op2.Kind) ? op1.Kind : op2.Kind; + + string op = null; + bool unsigned = false; + bool inverted = false; + switch (opcode) + { + case ILOpcode.beq: + case ILOpcode.ceq: + op = "=="; + break; + case ILOpcode.bge: + op = ">="; + break; + case ILOpcode.bgt: + case ILOpcode.cgt: + op = ">"; + break; + case ILOpcode.ble: + op = "<="; + break; + case ILOpcode.blt: + case ILOpcode.clt: + op = "<"; + break; + case ILOpcode.bne_un: + op = "!="; + break; + case ILOpcode.bge_un: + if (kind == StackValueKind.Float) + { + op = "<"; + inverted = true; + } + else + { + op = ">="; + unsigned = true; + } + break; + case ILOpcode.bgt_un: + case ILOpcode.cgt_un: + if (kind == StackValueKind.Float) + { + op = "<="; + inverted = true; + } + else + if (op1.Kind == StackValueKind.ObjRef && op1.Type == null) + { + // ECMA-335 III.1.5 Operand type table, P. 303: + // cgt.un is commonly used when comparing an ObjectRef with null (there is no "compare - not - equal" instruction) + // Turn into more natural compare not equal. + op = "!="; + } + else + { + op = ">"; + unsigned = true; + } + break; + case ILOpcode.ble_un: + if (kind == StackValueKind.Float) + { + op = ">"; + inverted = true; + } + else + { + op = "<="; + unsigned = true; + } + break; + case ILOpcode.blt_un: + case ILOpcode.clt_un: + if (kind == StackValueKind.Float) + { + op = ">="; + inverted = true; + } + else + { + op = "<"; + unsigned = true; + } + break; + default: + Debug.Fail("Unexpected opcode"); + break; + } + + if (inverted) + { + Append("!("); + } + if (unsigned) + { + if (kind < StackValueKind.ByRef) + { + Append("(u"); + Append(GetStackValueKindCPPTypeName(kind)); + Append(")"); + } + else + { + if (op2.Kind < StackValueKind.ByRef + || (op2.Kind == StackValueKind.ObjRef && op2.Type == null)) + Append("(void*)"); + } + } + Append(op2); + Append(" "); + Append(op); + Append(" "); + if (unsigned) + { + if (kind < StackValueKind.ByRef) + { + Append("(u"); + Append(GetStackValueKindCPPTypeName(kind)); + Append(")"); + } + else + { + if (op1.Kind < StackValueKind.ByRef + || (op1.Kind == StackValueKind.ObjRef && op1.Type == null)) + Append("(void*)"); + } + } + Append(op1); + if (inverted) + { + Append(")"); + } + } + private StackEntry NewSpillSlot(StackEntry entry) { if (_spillSlots == null) @@ -1551,107 +1690,7 @@ namespace Internal.IL var op1 = _stack.Pop(); var op2 = _stack.Pop(); - // StackValueKind is carefully ordered to make this work (assuming the IL is valid) - StackValueKind kind; - - if (op1.Kind > op2.Kind) - { - kind = op1.Kind; - } - else - { - kind = op2.Kind; - } - - string op = null; - bool unsigned = false; - bool inverted = false; - switch (opcode) - { - case ILOpcode.beq: op = "=="; break; - case ILOpcode.bge: op = ">="; break; - case ILOpcode.bgt: op = ">"; break; - case ILOpcode.ble: op = "<="; break; - case ILOpcode.blt: op = "<"; break; - case ILOpcode.bne_un: op = "!="; break; - case ILOpcode.bge_un: - if (kind == StackValueKind.Float) - { - op = "<"; inverted = true; - } - else - { - op = ">="; - } - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - break; - case ILOpcode.bgt_un: - if (kind == StackValueKind.Float) - { - op = "<="; inverted = true; - } - else - { - op = ">"; - } - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - break; - case ILOpcode.ble_un: - if (kind == StackValueKind.Float) - { - op = ">"; inverted = true; - } - else - { - op = "<="; - } - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - break; - case ILOpcode.blt_un: - if (kind == StackValueKind.Float) - { - op = ">="; inverted = true; - } - else - { - op = "<"; - } - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - break; - } - - if (kind == StackValueKind.ByRef) - unsigned = false; - - if (inverted) - { - Append("!("); - } - if (unsigned) - { - Append("(u"); - Append(GetStackValueKindCPPTypeName(kind)); - Append(")"); - } - Append(op2); - Append(" "); - Append(op); - Append(" "); - if (unsigned) - { - Append("(u"); - Append(GetStackValueKindCPPTypeName(kind)); - Append(")"); - } - Append(op1); - if (inverted) - { - Append(")"); - } + AppendComparison(opcode, op1, op2); } Append(") "); } @@ -1799,82 +1838,9 @@ namespace Internal.IL var op1 = _stack.Pop(); var op2 = _stack.Pop(); - // StackValueKind is carefully ordered to make this work (assuming the IL is valid) - StackValueKind kind; - - if (op1.Kind > op2.Kind) - { - kind = op1.Kind; - } - else - { - kind = op2.Kind; - } - PushTemp(StackValueKind.Int32); - string op = null; - bool unsigned = false; - bool inverted = false; - switch (opcode) - { - case ILOpcode.ceq: op = "=="; break; - case ILOpcode.cgt: op = ">"; break; - case ILOpcode.clt: op = "<"; break; - case ILOpcode.cgt_un: - if (kind == StackValueKind.Float) - { - op = "<="; inverted = true; - } - else - { - op = ">"; - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - } - break; - case ILOpcode.clt_un: - if (kind == StackValueKind.Float) - { - op = ">="; inverted = true; - } - else - { - op = "<"; - if (kind == StackValueKind.Int32 || kind == StackValueKind.Int64) - unsigned = true; - } - break; - } - - if (kind == StackValueKind.ByRef) - unsigned = false; - - if (inverted) - { - Append("!("); - } - if (unsigned) - { - Append("(u"); - Append(GetStackValueKindCPPTypeName(kind)); - Append(")"); - } - Append(op2); - Append(" "); - Append(op); - Append(" "); - if (unsigned) - { - Append("(u"); - Append(GetStackValueKindCPPTypeName(kind)); - Append(")"); - } - Append(op1); - if (inverted) - { - Append(")"); - } + AppendComparison(opcode, op1, op2); AppendSemicolon(); } |