public void CEB_BuildPrimitive() { var id = new Identifier("id", PrimitiveType.Word32, null); var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, null, id, null, 0); Assert.AreEqual("id", ceb.BuildComplex(false).ToString()); }
public void CEB_BuildPointerFetch() { var ptr = new Identifier("ptr", PrimitiveType.Word32, null); var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0); ceb.Dereferenced = true; Assert.AreEqual("ptr->dw0000", ceb.BuildComplex().ToString()); }
public void CEB_BuildUnionFetch() { var ptr = new Identifier("ptr", PrimitiveType.Word32, null); CreateTv(ptr, ptrUnion, Ptr32(PrimitiveType.Real32)); var ceb = new ComplexExpressionBuilder(PrimitiveType.Real32, null, ptr, null, 0); Assert.AreEqual("ptr->r", ceb.BuildComplex(true).ToString()); }
public void CEB_BuildPointer() { var ptr = new Identifier("ptr", PrimitiveType.Word32, null); store.EnsureExpressionTypeVariable(factory, ptr); var ceb = new ComplexExpressionBuilder(ptrInt, ptrPoint, new Pointer(PrimitiveType.Word32, 4), null, ptr, null, 0); Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex().ToString()); }
public void CEB_BuildPointer() { var ptr = new Identifier("ptr", PrimitiveType.Word32, null); CreateTv(ptr, ptrPoint, Ptr32(PrimitiveType.Word32)); var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, null, ptr, null, 0); Assert.AreEqual("&ptr->dw0000", ceb.BuildComplex(false).ToString()); }
public void CEB_BuildUnionFetch() { var ptr = new Identifier("ptr", PrimitiveType.Word32, null); ComplexExpressionBuilder ceb = new ComplexExpressionBuilder( ptrWord, ptrUnion, new Pointer(PrimitiveType.Real32, 4), null, ptr, null, 0); ceb.Dereferenced = true; Assert.AreEqual("ptr->r", ceb.BuildComplex().ToString()); }
public void CEB_BuildMemberAccessFetch() { var ds = new Identifier("ds", PrimitiveType.SegmentSelector, null); var bx = new Identifier("bx", PrimitiveType.Word16, null); var sa = new SegmentedAccess(null, ds, bx, PrimitiveType.Word16); var tvDs = CreateTv(ds, Ptr16(Segment()), ds.DataType); var tvBx = CreateTv(bx, MemPtr(Segment(), PrimitiveType.Word16), MemPtr(new TypeVariable(43), PrimitiveType.Word16)); var ceb = new ComplexExpressionBuilder( new Pointer(PrimitiveType.Word16, 2), tvBx.Class.DataType, tvBx.OriginalDataType, ds, bx, null, 0); ceb.Dereferenced = true; Assert.AreEqual("ds->*bx", ceb.BuildComplex().ToString()); }
public void CEB_BuildByteArrayFetch() { var i = new Identifier("i", PrimitiveType.Word32, null); DataType arrayOfBytes = new ArrayType(PrimitiveType.Byte, 0); StructureType str = Struct( Fld(0x01000, arrayOfBytes)); CreateTv(globals, Ptr32(str), Ptr32(PrimitiveType.Byte)); CreateTv(i, PrimitiveType.Int32, PrimitiveType.Word32); var ceb = new ComplexExpressionBuilder( PrimitiveType.Byte, globals.TypeVariable.DataType, globals.TypeVariable.OriginalDataType, null, globals, i, 0x1000); ceb.Dereferenced = true; Assert.AreEqual("globals->a1000[i]", ceb.BuildComplex().ToString()); }
public void CEB_BuildPrimitive() { var id = new Identifier("id", PrimitiveType.Word32, null); var ceb = new ComplexExpressionBuilder(PrimitiveType.Word32, PrimitiveType.Word32, PrimitiveType.Word32, null, id, null, 0); Assert.AreEqual("id", ceb.BuildComplex().ToString()); }
private Instruction MakeAssignment(Expression dst, Expression src) { src = src.Accept(this); var tvDst = dst.TypeVariable; dst = dst.Accept(this); var dtSrc = DataTypeOf(src); var dtDst = DataTypeOf(dst); if (!TypesAreCompatible(dtSrc, dtDst)) { UnionType uDst = dtDst.ResolveAs<UnionType>(); UnionType uSrc = dtSrc.ResolveAs<UnionType>(); if (uDst != null) { // ceb = new ComplexExpressionBuilder(dtDst, dtDst, dtSrc, null, dst, null, 0); tvDst.DataType = dtDst; tvDst.OriginalDataType = dtSrc; dst.TypeVariable = tvDst; var ceb = new ComplexExpressionBuilder(dtSrc, null, dst, null, 0); dst = ceb.BuildComplex(false); } else if (uSrc != null) { //throw new NotImplementedException(); //var ceb = new ComplexExpressionBuilder(dtSrc, dtSrc, dtDst, null, src, null, 0); //src = ceb.BuildComplex(false); src = new Cast(dtDst, src); } else { Debug.Print("{2} [{0}] = {3} [{1}] not supported.", dtDst, dtSrc, dst, src); src = new Cast(dtDst, src); } } var idDst = dst as Identifier; if (idDst != null) return new Assignment(idDst, src); else return new Store(dst, src); }
public Instruction MakeAssignment(Expression dst, Expression src) { var tvDst = dst.TypeVariable; var tvSrc = src.TypeVariable; src = src.Accept(this); DataType dtSrc = DataTypeOf(src); dst = dst.Accept(this); DataType dtDst = DataTypeOf(dst); if (!TypesAreCompatible(dtSrc, dtDst)) { UnionType uDst = dtDst.ResolveAs<UnionType>(); UnionType uSrc = dtSrc.ResolveAs<UnionType>(); if (uDst != null) { var ceb = new ComplexExpressionBuilder(dtDst, dtDst, dtSrc, null, dst, null, 0); dst = ceb.BuildComplex(); } else if (uSrc != null) { var ceb = new ComplexExpressionBuilder(dtSrc, dtSrc, dtDst, null, src, null, 0); src = ceb.BuildComplex(); } else throw new NotImplementedException(string.Format("{0} [{1}] = {2} [{3}] (in assignment {4} = {5}) not supported.", tvDst, dtDst, tvSrc, dtSrc, dst, src)); } return new Core.Absyn.AbsynAssignment(dst, src); }
public override Expression VisitMkSequence(MkSequence seq) { var head = seq.Head.Accept(this); var tail = seq.Tail.Accept(this); Constant c = seq.Tail as Constant; var ptHead = head.TypeVariable.DataType as PrimitiveType; if (head.TypeVariable.DataType is Pointer || (ptHead != null && ptHead.Domain == Domain.Selector)) { if (c != null) { ComplexExpressionBuilder ceb = new ComplexExpressionBuilder( seq.TypeVariable.DataType, head.TypeVariable.DataType, head.TypeVariable.OriginalDataType, null, head, null, StructureField.ToOffset(c)); return ceb.BuildComplex(); } else { var ceb = new ComplexExpressionBuilder( seq.TypeVariable.DataType, seq.TypeVariable.DataType, seq.TypeVariable.OriginalDataType, head, new MemberPointerSelector(seq.DataType, head, tail), null, 0); return ceb.BuildComplex(); } } else { } return new MkSequence(seq.DataType, head, tail); }
private Expression TransformComplexSum(BinaryExpression binExp, DataType dtLeft, DataType dtRight) { if (dtRight.IsComplex) throw new TypeInferenceException( "Both left and right sides of a binary expression can't be complex types.{0}{1}: {2}:[{3}] {4}:[{5}].", Environment.NewLine, binExp, binExp.Left.TypeVariable, dtLeft, binExp.Right.TypeVariable, dtRight); Constant c = binExp.Right as Constant; if (c != null) { ComplexExpressionBuilder ceb = new ComplexExpressionBuilder( binExp.TypeVariable.DataType, dtLeft, binExp.Left.TypeVariable.OriginalDataType, null, binExp.Left, null, StructureField.ToOffset(c)); return ceb.BuildComplex(); } return binExp; }
public Expression RewriteComplexExpression(Expression complex, Expression index, int offset, bool dereferenced) { var cOther = index as Constant; if (cOther != null) { offset += cOther.ToInt32(); index = null; } var ceb = new ComplexExpressionBuilder(null, basePtr, complex, index, offset); return ceb.BuildComplex(dereferenced); }