/// <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(); }
/// <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);
/// <summary> /// Adds the label to code stream. /// </summary> /// <param name="emitter">The emitter.</param> public void AddLabelToCodeStream(ICodeEmitter emitter) { emitter.Label(0x50000000 + this.label); }
/// <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; }