private static void GenerateMissingMethod(string str, metadata.MetadataStream m, libtysila5.target.Target t, int missing_msig, ElfFile o, libtysila5.TysilaState s) { /* Generate new method spec */ var ms = new metadata.MethodSpec { m = m, mangle_override = str }; /* Generate stub code */ libtysila5.Code c = new libtysila5.Code(); c.t = t; c.ms = ms; var ir = new List <libtysila5.cil.CilNode.IRNode>(); var stack = new libtysila5.util.Stack <libtysila5.ir.StackItem>(); var cilnode = new libtysila5.cil.CilNode(ms, 0); cilnode.irnodes = ir; c.ir = ir; c.starts = new List <libtysila5.cil.CilNode> { cilnode }; c.s = s; stack = libtysila5.ir.ConvertToIR.ldstr(cilnode, c, stack, str); stack = libtysila5.ir.ConvertToIR.call(cilnode, c, stack, false, "missing_function", c.special_meths, missing_msig); /* Assemble */ libtysila5.libtysila.AssembleMethod(ms, o, t, s, null, null, c); }
private static void DumpDebug(StringBuilder debug_passes, List <binary_library.ISymbol> meth_syms, Code cil) { if (debug_passes != null) { libtysila5.cil.CilNode cur_cil_node = null; libtysila5.cil.CilNode.IRNode cur_ir_node = null; foreach (var sym in meth_syms) { debug_passes.AppendLine(sym.Name + ":"); } foreach (var mc in cil.mc) { if (mc.parent != cur_ir_node) { cur_ir_node = mc.parent; if (cur_ir_node.parent != cur_cil_node) { cur_cil_node = cur_ir_node.parent; debug_passes.Append(" IL"); debug_passes.Append(cur_cil_node.il_offset.ToString("X4")); debug_passes.Append(": "); debug_passes.AppendLine(cur_cil_node.ToString()); } debug_passes.Append(" "); debug_passes.AppendLine(cur_ir_node.ToString()); } debug_passes.Append(" "); debug_passes.Append(mc.offset.ToString("X8")); debug_passes.Append(": "); debug_passes.AppendLine(cil.t.MCInstToDebug(mc)); if (cil.s != null && cil.s.text_section != null && cil.s.text_section.Data != null) { debug_passes.Append(" "); int idx = 0; for (int i = mc.addr; i < mc.end_addr; i++, idx++) { if (idx > 0) { debug_passes.Append(", "); } debug_passes.Append(cil.s.text_section.Data[i].ToString("X2")); } debug_passes.AppendLine(); } } debug_passes.AppendLine(); debug_passes.AppendLine(); } }