public void VisitLoadFieldAddress(LoadFieldAddress load) { if (m_equality != null) { DoFieldRef(load.Field, load.Index); } }
/// <summary cref="IBackendCodeGenerator.GenerateCode(LoadFieldAddress)"/> public void GenerateCode(LoadFieldAddress value) { var source = LoadPrimitive(value.Source); var fieldOffset = value.StructureType.GetOffset( value.FieldSpan.Access); if (fieldOffset != 0) { var targetRegister = AllocatePlatformRegister( value, out RegisterDescription _); using var command = BeginCommand( PTXInstructions.GetArithmeticOperation( BinaryArithmeticKind.Add, Backend.PointerArithmeticType, false)); command.AppendArgument(targetRegister); command.AppendArgument(source); command.AppendConstant(fieldOffset); } else { Alias(value, value.Source); } }
/// <summary cref="IBackendCodeGenerator.GenerateCode(LoadFieldAddress)"/> public void GenerateCode(LoadFieldAddress value) { var source = Load(value.Source); var target = Allocate(value); using var statement = BeginStatement(target); statement.AppendCommand(CLInstructions.AddressOfOperation); statement.AppendArgument(source); statement.AppendFieldViaPtr(value.FieldSpan.Access); }
/// <summary cref="IValueVisitor.Visit(LoadFieldAddress)"/> public void Visit(LoadFieldAddress value) { var source = Load(value.Source); var target = Allocate(value); using (var statement = BeginStatement(target)) { statement.AppendCommand(CLInstructions.AddressOfOperation); statement.AppendArgument(source); statement.AppendFieldViaPtr(value.FieldIndex); } }
/// <summary> /// Lowers LFA operations into an adapted version. /// </summary> protected static void Lower( RewriterContext context, TypeLowering <TType> typeConverter, LoadFieldAddress lfa) { // Compute the new span var span = typeConverter.ComputeSpan(lfa, lfa.FieldSpan); var newValue = context.Builder.CreateLoadFieldAddress( lfa.Location, lfa.Source, span); context.ReplaceAndRemove(lfa, newValue); }
/// <summary> /// Converts a field-address operation into an SSA binding. /// </summary> private static void Convert( SSARewriterContext <Value> context, ConstructionData data, LoadFieldAddress loadFieldAddress) { if (!data.TryGetConverted(loadFieldAddress.Source, out var fieldRef)) { return; } data.AddConverted( loadFieldAddress, fieldRef.Access(loadFieldAddress.FieldSpan)); context.Remove(loadFieldAddress); }
/// <summary> /// Converts a field-address operation into an SSA binding. /// </summary> protected static void Convert <TConstructionData>( SSARewriterContext <Value> context, TConstructionData data, LoadFieldAddress loadFieldAddress) where TConstructionData : IConstructionData { if (!data.TryGetConverted(loadFieldAddress.Source, out var fieldRef)) { return; } data.AddConverted( loadFieldAddress, fieldRef.Access(loadFieldAddress.FieldSpan)); context.Remove(loadFieldAddress); }
public void VisitLoadFieldAddr(LoadFieldAddress load) { if (m_needsCheck) { State state; if (m_fields.TryGetValue(load.Field, out state)) { if (state == State.Defined) { m_fields[load.Field] = State.Used; } } else { m_fields.Add(load.Field, State.Referenced); } } }
// ldarg.0 this // ldflda Smokey.Tests.UseDefaultInitTest/Struct Smokey.Tests.UseDefaultInitTest/BadCase3::m_struct // initobj Smokey.Tests.UseDefaultInitTest/Struct public void VisitInit(InitObj init) { if (m_needsCheck && m_offset < 0) { if (init.Type.IsValueType) { LoadFieldAddress field = m_info.Instructions[init.Index - 1] as LoadFieldAddress; if (field != null) { LoadArg arg = m_info.Instructions[init.Index - 2] as LoadArg; if (arg != null && arg.Arg == 0) { m_offset = init.Untyped.Offset; Log.DebugLine(this, "found default ctor call at {0:X2}", m_offset); } } } } }
private void DoGetReferences(Dictionary <MethodInfo, List <string> > references, MethodInfo info) { for (int i = 1; i < info.Instructions.Length; ++i) { do { LoadField field = info.Instructions[i] as LoadField; if (field != null) { if (info.Instructions.LoadsThisArg(i - 1)) { DoAddReference(references, info, field.Field.Name, field.Untyped.Offset); } break; } LoadFieldAddress addr = info.Instructions[i] as LoadFieldAddress; if (addr != null) { if (info.Instructions.LoadsThisArg(i - 1)) { DoAddReference(references, info, addr.Field.Name, addr.Untyped.Offset); } break; } Call call = info.Instructions[i] as Call; if (call != null && call.Target.Name.StartsWith("get_")) { if (info.Instructions.LoadsThisArg(i - 1)) { DoAddReference(references, info, call.Target.Name, call.Untyped.Offset); } break; } }while (false); } }
/// <summary cref="IValueVisitor.Visit(LoadFieldAddress)"/> public void Visit(LoadFieldAddress value) { var source = LoadPrimitive(value.Source); var fieldOffset = ABI.GetOffsetOf(value.StructureType, value.FieldIndex); if (fieldOffset != 0) { var targetRegister = AllocatePlatformRegister(value, out RegisterDescription _); using (var command = BeginCommand( PTXInstructions.GetArithmeticOperation( BinaryArithmeticKind.Add, ABI.PointerArithmeticType, false))) { command.AppendArgument(targetRegister); command.AppendArgument(source); command.AppendConstant(fieldOffset); } } else { Alias(value, value.Source); } }
public void Visit(LoadFieldAddress value) { }
/// <summary cref="IValueVisitor.Visit(LoadElementAddress)"/> public void Visit(LoadFieldAddress value) => CodeGenerator.GenerateCode(value);
public void VisitLoad1(LoadFieldAddress load) { Unused.Value = m_fields.Remove(load.Field.Name); }
public void VisitLoadFieldAdr(LoadFieldAddress load) { DoAddField(load.Field); }