Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kotas <jkotas@microsoft.com>2017-11-14 15:13:22 +0300
committerMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2017-11-14 15:13:22 +0300
commit35d86cb2477d85ef0b4bcced4010395ca4a6e972 (patch)
tree7e93b63b526f148cdb2273158891747973740cde /src/ILCompiler.CppCodeGen
parent749c80f7821f50e51dcd32bcd402b95eb4935f3c (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.cs316
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();
}