Example #1
0
        /// <summary>
        /// Emits an instruction.
        /// </summary>
        /// <param name="instruction">The instruction.</param>
        /// <param name="context">The context.</param>
        /// <param name="builder">The builder.</param>
        public void Emit(Instruction instruction, MethodContext context, BuilderRef builder)
        {
            ICodeEmitter emitter = null;

            if (mEmitters.TryGetValue(instruction.OpCode.Code, out emitter))
            {
                emitter.Emit(instruction, context, builder);
            }
            else
            {
                throw new NotImplementedException("Instruction with opcode " + instruction.OpCode.Code + " is not implemented");
            }
        }
        /// <summary>
        /// Performs stage specific processing on the compiler context.
        /// </summary>
        void IMethodCompilerStage.Run()
        {
            codeEmitter = methodCompiler.Pipeline.FindFirst<CodeGenerationStage>().CodeEmitter;

            // Step 1 - Sort the exception clauses into postorder-traversal
            //PER SPEC: The exception clauses table should already be sorted
            //BuildSort();

            // Step 2 - Assign blocks to innermost exception clause
            AssignBlocksToClauses();

            // Step 3 - Emit table of PC ranges and the clause handler
            EmitProtectedBlockTable();
        }
Example #3
0
        /// <summary>
        /// Creates a new CodeGenerator.
        /// </summary>
        public CodeGenerator()
        {
            // Load code emitters.
            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
            foreach (Type type in types)
            {
                // Check and get handler.
                InstructionHandlerAttribute attrib = (InstructionHandlerAttribute)type.GetCustomAttribute(typeof(InstructionHandlerAttribute));
                if (attrib == null)
                {
                    continue;
                }

                // Register emitter.
                ICodeEmitter emitter = (ICodeEmitter)Activator.CreateInstance(type);
                foreach (Code code in attrib.Codes)
                {
                    mEmitters.Add(code, emitter);
                }
            }

            Logger.LogDetailVerbose("{0} code emitters registered", mEmitters.Count);
        }
 /// <summary>
 /// Begins the generate.
 /// </summary>
 protected virtual void BeginGenerate()
 {
     _codeEmitter = Architecture.GetCodeEmitter();
     _codeEmitter.Initialize(MethodCompiler, _codeStream, MethodCompiler.Linker);
 }
 /// <summary>
 /// Code generation completed.
 /// </summary>
 protected virtual void EndGenerate()
 {
     _codeEmitter.Dispose();
     _codeEmitter = null;
 }
 /// <summary>
 /// Emits the specified platform instruction.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="emitter">The emitter.</param>
 public void Emit(Context context, ICodeEmitter emitter)
 {
     Emit(context, emitter as MachineCodeEmitter);
 }
 /// <summary>
 /// Emits the specified platform instruction.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="emitter">The emitter.</param>
 public abstract void Emit(Context context, ICodeEmitter emitter);
Example #8
0
 /// <summary>
 /// Emits the specified platform instruction.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="emitter">The emitter.</param>
 public void Emit(Context context, ICodeEmitter emitter)
 {
     Emit(context, emitter as MachineCodeEmitter);
 }
Example #9
0
 /// <summary>
 /// Adds the label to code stream.
 /// </summary>
 /// <param name="emitter">The emitter.</param>
 public void AddLabelToCodeStream(ICodeEmitter emitter)
 {
     emitter.Label(0x50000000 + this.label);
 }
Example #10
0
 /// <summary>
 /// Begins the generate.
 /// </summary>
 protected virtual void BeginGenerate()
 {
     codeEmitter = architecture.GetCodeEmitter();
     codeEmitter.Initialize(methodCompiler, codeStream, methodCompiler.Linker);
 }
Example #11
0
 /// <summary>
 /// Code generation completed.
 /// </summary>
 protected virtual void EndGenerate()
 {
     codeEmitter.Dispose();
     codeEmitter = null;
 }
Example #12
0
 /// <summary>
 /// Begins the generate.
 /// </summary>
 protected virtual void BeginGenerate()
 {
     codeEmitter = architecture.GetCodeEmitter();
     codeEmitter.Initialize(methodCompiler, codeStream, methodCompiler.Linker);
 }
Example #13
0
 /// <summary>
 /// Begins the generate.
 /// </summary>
 protected virtual void BeginGenerate()
 {
     _codeEmitter = Architecture.GetCodeEmitter();
     _codeEmitter.Initialize(MethodCompiler, _codeStream, MethodCompiler.Linker);
 }
Example #14
0
 /// <summary>
 /// Adds the label to code stream.
 /// </summary>
 /// <param name="emitter">The emitter.</param>
 public void AddLabelToCodeStream(ICodeEmitter emitter)
 {
     emitter.Label(0x50000000 + this.label);
 }