示例#1
0
        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);
        }
示例#2
0
        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();
            }
        }