Beispiel #1
0
        public override ObjectData GetData(NodeFactory factory, bool relocsOnly)
        {
            // If the address is expected to be visible from managed code, we need to align
            // at the managed code boundaries to prevent the stub from being confused with
            // a fat fuction pointer. Otherwise we can align tighter.
            int alignment = IsVisibleFromManagedCode ?
                            factory.Target.MinimumFunctionAlignment :
                            factory.Target.MinimumCodeAlignment;

            switch (factory.Target.Architecture)
            {
            case TargetArchitecture.X64:
                X64.X64Emitter x64Emitter = new X64.X64Emitter(factory, relocsOnly);
                EmitCode(factory, ref x64Emitter, relocsOnly);
                x64Emitter.Builder.RequireInitialAlignment(alignment);
                x64Emitter.Builder.AddSymbol(this);
                return(x64Emitter.Builder.ToObjectData());

            case TargetArchitecture.X86:
                X86.X86Emitter x86Emitter = new X86.X86Emitter(factory, relocsOnly);
                EmitCode(factory, ref x86Emitter, relocsOnly);
                x86Emitter.Builder.RequireInitialAlignment(alignment);
                x86Emitter.Builder.AddSymbol(this);
                return(x86Emitter.Builder.ToObjectData());

            case TargetArchitecture.ARM:
                ARM.ARMEmitter armEmitter = new ARM.ARMEmitter(factory, relocsOnly);
                EmitCode(factory, ref armEmitter, relocsOnly);
                armEmitter.Builder.RequireInitialAlignment(alignment);
                armEmitter.Builder.AddSymbol(this);
                return(armEmitter.Builder.ToObjectData());

            case TargetArchitecture.ARM64:
                ARM64.ARM64Emitter arm64Emitter = new ARM64.ARM64Emitter(factory, relocsOnly);
                EmitCode(factory, ref arm64Emitter, relocsOnly);
                arm64Emitter.Builder.RequireInitialAlignment(alignment);
                arm64Emitter.Builder.AddSymbol(this);
                return(arm64Emitter.Builder.ToObjectData());

            case TargetArchitecture.LoongArch64:
                LoongArch64.LoongArch64Emitter loongarch64Emitter = new LoongArch64.LoongArch64Emitter(factory, relocsOnly);
                EmitCode(factory, ref loongarch64Emitter, relocsOnly);
                loongarch64Emitter.Builder.RequireInitialAlignment(alignment);
                loongarch64Emitter.Builder.AddSymbol(this);
                return(loongarch64Emitter.Builder.ToObjectData());

            default:
                throw new NotImplementedException();
            }
        }
        public override ObjectData GetData(NodeFactory factory, bool relocsOnly)
        {
            switch (factory.Target.Architecture)
            {
            case TargetArchitecture.X64:
                X64.X64Emitter x64Emitter = new X64.X64Emitter(factory, relocsOnly);
                EmitCode(factory, ref x64Emitter, relocsOnly);
                x64Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
                x64Emitter.Builder.AddSymbol(this);
                return(x64Emitter.Builder.ToObjectData());

            case TargetArchitecture.X86:
                X86.X86Emitter x86Emitter = new X86.X86Emitter(factory, relocsOnly);
                EmitCode(factory, ref x86Emitter, relocsOnly);
                x86Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
                x86Emitter.Builder.AddSymbol(this);
                return(x86Emitter.Builder.ToObjectData());

            case TargetArchitecture.ARM:
            case TargetArchitecture.ARMEL:
                ARM.ARMEmitter armEmitter = new ARM.ARMEmitter(factory, relocsOnly);
                EmitCode(factory, ref armEmitter, relocsOnly);
                armEmitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
                armEmitter.Builder.AddSymbol(this);
                return(armEmitter.Builder.ToObjectData());

            case TargetArchitecture.ARM64:
                ARM64.ARM64Emitter arm64Emitter = new ARM64.ARM64Emitter(factory, relocsOnly);
                EmitCode(factory, ref arm64Emitter, relocsOnly);
                arm64Emitter.Builder.RequireInitialAlignment(factory.Target.MinimumFunctionAlignment);
                arm64Emitter.Builder.AddSymbol(this);
                return(arm64Emitter.Builder.ToObjectData());

            default:
                throw new NotImplementedException();
            }
        }
 protected abstract void EmitCode(NodeFactory factory, ref ARM64.ARM64Emitter instructionEncoder, bool relocsOnly);