Esempio n. 1
0
 public void VisitLoadFieldAddress(LoadFieldAddress load)
 {
     if (m_equality != null)
     {
         DoFieldRef(load.Field, load.Index);
     }
 }
Esempio n. 2
0
        /// <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);
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
            }
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
 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);
         }
     }
 }
Esempio n. 9
0
 // 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);
                 }
             }
         }
     }
 }
Esempio n. 10
0
        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);
            }
        }
Esempio n. 11
0
        /// <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);
            }
        }
Esempio n. 12
0
 public void Visit(LoadFieldAddress value)
 {
 }
Esempio n. 13
0
 /// <summary cref="IValueVisitor.Visit(LoadElementAddress)"/>
 public void Visit(LoadFieldAddress value) =>
 CodeGenerator.GenerateCode(value);
Esempio n. 14
0
 public void VisitLoad1(LoadFieldAddress load)
 {
     Unused.Value = m_fields.Remove(load.Field.Name);
 }
Esempio n. 15
0
 public void VisitLoadFieldAdr(LoadFieldAddress load)
 {
     DoAddField(load.Field);
 }