Esempio n. 1
0
 protected virtual Reg GetRegLoc(ir.Param csite,
                                 ref int stack_loc,
                                 int cc_next,
                                 int ct,
                                 metadata.TypeSpec ts,
                                 string cc)
 {
     throw new NotSupportedException("Architecture does not support ct: " + Opcode.ct_names[ct]);
 }
Esempio n. 2
0
        internal static unsafe void *JitCompile(metadata.TypeSpec ts)
        {
            var s = InitTysilaState();

            // Add the new vtable to the requestor
            ((JitRequestor)s.r).VTableRequestor.Request(ts);

            // Compile all needed bits
            JitProcess.ProcessRequestedItems(s, Program.stab);

            // Add everything from the current state to output sections
            return(CopyToOutput(s, RDataSection));   // First VTable requested will be at start of RData section
        }
Esempio n. 3
0
        internal static int GetCTFromType(metadata.TypeSpec ts)
        {
            if (ts == null)
            {
                return(ct_unknown);
            }

            switch (ts.stype)
            {
            case metadata.TypeSpec.SpecialType.None:
                if (ts.m.is_corlib && ts.m.simple_type_idx[ts.tdrow] != -1)
                {
                    return(GetCTFromType(ts.m.simple_type_idx[ts.tdrow]));
                }

                if (ts.IsEnum)
                {
                    return(GetCTFromType(ts.UnderlyingType));
                }

                if (ts.IsValueType)
                {
                    return(ct_vt);
                }

                return(ct_object);

            case metadata.TypeSpec.SpecialType.SzArray:
            case metadata.TypeSpec.SpecialType.Array:
                return(ct_object);

            case metadata.TypeSpec.SpecialType.MPtr:
                return(ct_ref);

            case metadata.TypeSpec.SpecialType.Ptr:
                return(ct_intptr);

            case metadata.TypeSpec.SpecialType.Boxed:
                return(ct_object);

            default:
                throw new NotSupportedException();
            }
        }
Esempio n. 4
0
        public virtual bool IsTypeValid(metadata.TypeSpec ts)
        {
            if (ts == null)
            {
                return(true);
            }

            if (ts.HasCustomAttribute("_ZN14libsupcs#2Edll8libsupcs19Bits32OnlyAttribute_7#2Ector_Rv_P1u1t") &&
                GetPointerSize() != 4)
            {
                return(false);
            }
            if (ts.HasCustomAttribute("_ZN14libsupcs#2Edll8libsupcs19Bits64OnlyAttribute_7#2Ector_Rv_P1u1t") &&
                GetPointerSize() != 8)
            {
                return(false);
            }

            bool is_arch_dependent = false;
            bool is_required_arch  = false;

            foreach (var idx in ts.CustomAttributes("_ZN14libsupcs#2Edll8libsupcs22ArchDependentAttribute_7#2Ector_Rv_P2u1tu1S"))
            {
                var sig_idx = ts.m.GetCustomAttrSigIdx(idx);
                var arch    = ts.m.ReadCustomAttrString(ref sig_idx);
                is_arch_dependent = true;
                if (arch.Equals(name))
                {
                    is_required_arch = true;
                }
            }

            if (is_arch_dependent && !is_required_arch)
            {
                return(false);
            }

            return(true);
        }
Esempio n. 5
0
        internal int GetSize(metadata.TypeSpec ts)
        {
            switch (ts.stype)
            {
            case metadata.TypeSpec.SpecialType.None:
                if (ts.m.is_corlib)
                {
                    var simple = ts.m.simple_type_idx[ts.tdrow];
                    if (simple != -1)
                    {
                        return(GetSTypeSize(simple));
                    }
                }
                if (ts.IsValueType)
                {
                    return(layout.Layout.GetTypeSize(ts, this, false));
                }
                return(GetCTSize(Opcode.ct_object));

            default:
                return(GetCTSize(Opcode.ct_object));
            }
        }
Esempio n. 6
0
        internal List <MCInst> handle_external(Target t,
                                               List <cil.CilNode.IRNode> nodes,
                                               int start, int count, Code c, string func_name)
        {
            var n     = nodes[start];
            var lastn = nodes[start + count - 1];

            metadata.TypeSpec[] p;

            if (n.ct != ir.Opcode.ct_unknown)
            {
                var ats = ir.Opcode.GetTypeFromCT(n.ct, c.ms.m);
                if (n.ct2 != ir.Opcode.ct_unknown)
                {
                    var bts = ir.Opcode.GetTypeFromCT(n.ct, c.ms.m);
                    p = new metadata.TypeSpec[] { ats, bts };
                }
                else
                {
                    p = new metadata.TypeSpec[] { ats }
                };
            }
            else
            {
                p = new metadata.TypeSpec[] { }
            };

            var rts = ir.Opcode.GetTypeFromCT(lastn.ctret, c.ms.m);

            /* If we are compressing lots of ir into a single call,
             *  make sure the call instuction is aware of the end stack
             *  state */
            if (n != lastn)
            {
                n.stack_after = lastn.stack_after;
            }

            var msig = c.special_meths.CreateMethodSignature(rts, p);

            n.imm_ms = new metadata.MethodSpec {
                mangle_override = func_name, m = c.special_meths, msig = msig
            };

            n.opcode = ir.Opcode.oc_call;

            /* Now locate the call instruction */
            var call_handler = instrs.GetValue(nodes, start, 1);

            if (call_handler == null)
            {
                throw new Exception("Unable to locate call handler");
            }

            var r = call_handler(t, nodes, start, 1, c);

            if (r == null)
            {
                throw new Exception("Unable to invoke call handler to handle external call");
            }

            return(r);
        }
    }
Esempio n. 7
0
        public void AllocateLocalVarsArgs(Code c)
        {
            /* Generate list of locations of local vars */
            var m        = c.ms.m;
            var ms       = c.ms;
            int idx      = c.lvar_sig_tok;
            int lv_count = m.GetLocalVarCount(ref idx);

            int[] lv_locs = new int[lv_count];
            c.lv_locs  = new Reg[lv_count];
            c.lv_sizes = new int[lv_count];
            c.lv_types = new metadata.TypeSpec[lv_count];
            int cur_loc = GetCCStackReserve(c.ms.CallingConvention);

            for (int i = 0; i < lv_count; i++)
            {
                var type = m.GetTypeSpec(ref idx, c.ms.gtparams,
                                         c.ms.gmparams);
                int t_size = GetSize(type);
                lv_locs[i] = cur_loc;

                t_size        = util.util.align(t_size, GetPointerSize());
                c.lv_sizes[i] = t_size;

                c.lv_types[i] = type;
                c.lv_locs[i]  = GetLVLocation(cur_loc, t_size, c);

                cur_loc += t_size;

                // align to pointer size
                int diff = cur_loc % GetPointerSize();
                if (diff != 0)
                {
                    cur_loc = cur_loc - diff + GetPointerSize();
                }
            }

            /* Do the same for local args */
            int la_count = m.GetMethodDefSigParamCountIncludeThis(
                c.ms.msig);

            int[] la_locs = new int[la_count];
            c.la_locs         = new Reg[la_count];
            c.la_needs_assign = new bool[la_count];
            int la_count2 = m.GetMethodDefSigParamCount(
                c.ms.msig);
            int laidx = 0;
            //cur_loc = 0;

            var  cc           = cc_map[c.ms.CallingConvention];
            var  cc_class_map = cc_classmap[c.ms.CallingConvention];
            bool has_hidden   = ir.Opcode.GetCTFromType(c.ret_ts) == ir.Opcode.ct_vt;
            int  stack_loc    = 0;

            metadata.TypeSpec hidden_ts = null;
            if (has_hidden)
            {
                hidden_ts = m.SystemIntPtr;
            }
            var la_phys_locs = GetRegLocs(new ir.Param
            {
                m  = m,
                ms = c.ms,
            }, ref stack_loc, cc, cc_class_map,
                                          c.ms.CallingConvention,
                                          out c.la_sizes, out c.la_types,
                                          hidden_ts);

            if (has_hidden)
            {
                // Strip hidden argument off the values we return
                Reg[] la_phys_locs_new = new Reg[la_phys_locs.Length - 1];
                for (int i = 0; i < la_phys_locs_new.Length; i++)
                {
                    la_phys_locs_new[i] = la_phys_locs[i + 1];
                }
                la_phys_locs = la_phys_locs_new;

                int[] la_sizes = new int[la_phys_locs.Length];
                for (int i = 0; i < la_phys_locs_new.Length; i++)
                {
                    la_sizes[i] = c.la_sizes[i + 1];
                }
                c.la_sizes = la_sizes;

                metadata.TypeSpec[] la_types = new metadata.TypeSpec[la_phys_locs.Length];
                for (int i = 0; i < la_phys_locs_new.Length; i++)
                {
                    la_types[i] = c.la_types[i + 1];
                }
                c.la_types = la_types;
            }
            c.incoming_args = la_phys_locs;

            if (la_count != la_count2)
            {
                var this_size = GetCTSize(ir.Opcode.ct_object);
                c.la_locs[laidx]  = GetLALocation(cur_loc, this_size, c);
                c.la_sizes[laidx] = this_size;

                // value type methods have mptr to type as their this pointer
                if (ms.type.IsValueType)
                {
                    c.la_types[laidx] = ms.type.ManagedPointer;
                }
                else
                {
                    c.la_types[laidx] = ms.type;
                }

                la_locs[laidx] = cur_loc;
                //cur_loc += this_size;

                laidx++;
            }
            idx = m.GetMethodDefSigRetTypeIndex(
                ms.msig);
            // pass by rettype
            m.GetTypeSpec(ref idx, c.ms.gtparams, c.ms.gmparams);

            for (int i = 0; i < la_count; i++)
            {
                var mreg = la_phys_locs[i];
                metadata.TypeSpec type = m.SystemObject;
                if (i > 0 || !m.GetMethodDefSigHasNonExplicitThis(c.ms.msig))
                {
                    type = m.GetTypeSpec(ref idx, c.ms.gtparams, c.ms.gmparams);
                }

                if (mreg.type == rt_stack)
                {
                    la_phys_locs[i]      = GetLALocation(mreg.stack_loc, util.util.align(c.la_sizes[i], GetPointerSize()), c);
                    c.la_locs[i]         = la_phys_locs[i];
                    c.la_needs_assign[i] = false;
                }
                else if (mreg.type == rt_contents)
                {
                    c.la_locs[i]         = la_phys_locs[i];
                    c.la_needs_assign[i] = false;
                }
                else
                {
                    c.la_needs_assign[i] = true;

                    var la_size = util.util.align(GetSize(type), GetPointerSize());
                    c.la_locs[i] = GetLVLocation(cur_loc, la_size, c);

                    la_locs[i] = cur_loc;
                    cur_loc   += la_size;
                }
            }

            if (has_hidden)
            {
                cur_loc += psize;
            }
            c.lv_total_size = cur_loc;
        }
Esempio n. 8
0
 protected internal virtual int GetCTFromTypeForCC(metadata.TypeSpec t)
 {
     return(ir.Opcode.GetCTFromType(t));
 }
Esempio n. 9
0
        public DwarfDIE GetTypeDie(metadata.TypeSpec ts, bool add_ns = true)
        {
            DwarfTypeDIE ret;

            if (type_dies.TryGetValue(ts, out ret))
            {
                return(ret);
            }
            if (ts.SimpleType != 0)
            {
                DwarfDIE dret;
                if (basetype_dies.TryGetValue(ts.SimpleType, out dret))
                {
                    return(dret);
                }
            }
            ret           = new DwarfTypeDIE();
            ret.ts        = ts;
            ret.t         = t;
            ret.dcu       = this;
            type_dies[ts] = ret;

            if (add_ns)
            {
                // Generate namespace too
                var ns = GetNSDie(ts.Namespace);
                ns.Children.Add(ret);
            }

            // Ensure base classes etc are referenced
            if (ts.GetExtends() != null)
            {
                GetTypeDie(ts.GetExtends());
            }
            switch (ts.stype)
            {
            case metadata.TypeSpec.SpecialType.Array:
            case metadata.TypeSpec.SpecialType.SzArray:
            case metadata.TypeSpec.SpecialType.MPtr:
            case metadata.TypeSpec.SpecialType.Ptr:
                if (ts.other != null)
                {
                    GetTypeDie(ts.other);
                }
                break;
            }

            // Ensure field types are referenced
            if (ts.SimpleType == 0x1c ||    // Object
                ts.SimpleType == 0x0e ||    // String
                (ts.SimpleType == 0 &&
                 ts.stype == metadata.TypeSpec.SpecialType.None &&
                 ts.m == m)) // Class/struct in current module
            {
                bool is_tls;
                List <metadata.TypeSpec> fld_types = new List <metadata.TypeSpec>();
                List <string>            fnames    = new List <string>();
                List <int> foffsets = new List <int>();

                layout.Layout.GetFieldOffset(ts, null, t, out is_tls,
                                             false, fld_types, fnames, foffsets);
                for (int i = 0; i < fld_types.Count; i++)
                {
                    var ft = fld_types[i];

                    var fdie = new DwarfMemberDIE();
                    fdie.dcu         = dcu;
                    fdie.Name        = fnames[i];
                    fdie.FieldOffset = foffsets[i];
                    fdie.FieldType   = GetTypeDie(ft);
                    fdie.t           = t;
                    ret.Children.Add(fdie);
                }

                layout.Layout.GetFieldOffset(ts, null, t, out is_tls,
                                             true, fld_types);
                foreach (var ft in fld_types)
                {
                    GetTypeDie(ft);
                }
            }

            return(ret);
        }
Esempio n. 10
0
        static void Main(string[] args)
        {
            if (args.Length != 4)
            {
                disp_usage();
                return;
            }
            libtysila5.libtysila.AssemblyLoader al = new libtysila5.libtysila.AssemblyLoader(
                new tysila4.FileSystemFileLoader());
            tysila4.Program.search_dirs.Add(args[0]);
            tysila4.Program.search_dirs.Add(new System.IO.FileInfo(args[2]).DirectoryName);

            /* Load up all types in corefx files */
            Dictionary <string, string> map = new Dictionary <string, string>();
            var indir = new System.IO.DirectoryInfo(args[0]);
            var files = indir.GetFiles(args[1]);

            foreach (var fi in files)
            {
                var m = al.GetAssembly(fi.FullName);

                for (int i = 1; i <= m.table_rows[metadata.MetadataStream.tid_TypeDef]; i++)
                {
                    var flags            = m.GetIntEntry(metadata.MetadataStream.tid_TypeDef, i, 0);
                    metadata.TypeSpec ts = new metadata.TypeSpec {
                        m = m, tdrow = i
                    };

                    if ((flags & 0x7) == 0x1 || (flags & 0x7) == 0x2)
                    {
                        // public
                        var nspace   = ts.Namespace;
                        var name     = ts.Name;
                        var fullname = nspace + "." + name;
                        map[fullname] = fi.Name;
                    }
                }
            }

            /* Generate a mapping from type name/namespaces to the files they are contained in */
            var infiledi = al.LoadAssembly(args[2]);
            var infile   = new metadata.PEFile().Parse(infiledi, al, false);
            var o        = new System.IO.StreamWriter(args[3]);

            for (int i = 1; i <= infile.table_rows[metadata.MetadataStream.tid_TypeDef]; i++)
            {
                var flags            = infile.GetIntEntry(metadata.MetadataStream.tid_TypeDef, i, 0);
                metadata.TypeSpec ts = new metadata.TypeSpec {
                    m = infile, tdrow = i
                };

                if ((flags & 0x7) == 0x1 || (flags & 0x7) == 0x2)
                {
                    // public
                    var nspace   = ts.Namespace;
                    var name     = ts.Name;
                    var fullname = nspace + "." + name;

                    if (map.ContainsKey(fullname))
                    {
                        o.WriteLine(infile.AssemblyName + "!" + fullname + "=" + map[fullname]);
                    }
                }
            }
            for (int i = 1; i <= infile.table_rows[metadata.MetadataStream.tid_ExportedType]; i++)
            {
                var nspace   = infile.GetStringEntry(metadata.MetadataStream.tid_ExportedType, i, 3);
                var name     = infile.GetStringEntry(metadata.MetadataStream.tid_ExportedType, i, 2);
                var fullname = nspace + "." + name;

                if (map.ContainsKey(fullname))
                {
                    o.WriteLine(infile.AssemblyName + "!" + fullname + "=" + map[fullname]);
                }
            }
            o.Close();
        }
Esempio n. 11
0
 public virtual Reg AllocateValueType(Code c, metadata.TypeSpec ts, ref long alloced, ref int cur_stack)
 {
     return(AllocateStackLocation(c, GetSize(ts), ref cur_stack));
 }
Esempio n. 12
0
        protected internal virtual Reg[] GetRegLocs(ir.Param csite,
                                                    ref int stack_loc,
                                                    Dictionary <int, int[]> cc,
                                                    Dictionary <int, int> cc_classmap,
                                                    string cc_name,
                                                    out int[] la_sizes,
                                                    out metadata.TypeSpec[] la_types,
                                                    metadata.TypeSpec has_hidden = null)
        {
            var m   = csite.m;
            var idx = (int)csite.v2;

            metadata.TypeSpec[] gtparams = null;
            metadata.TypeSpec[] gmparams = null;
            if (csite.ms != null)
            {
                idx      = csite.ms.msig;
                m        = csite.ms.m;
                gtparams = csite.ms.gtparams;
                gmparams = csite.ms.gmparams;
            }
            Dictionary <int, int> cc_next = new Dictionary <int, int>(
                new GenericEqualityComparer <int>());

            var  act_pcount = m.GetMethodDefSigParamCount(idx);
            var  pcount     = act_pcount;
            bool has_this   = m.GetMethodDefSigHasNonExplicitThis(idx);

            idx = m.GetMethodDefSigRetTypeIndex(idx);

            if (has_this)
            {
                pcount++;
            }
            if (has_hidden != null)
            {
                pcount++;
            }

            // Skip rettype
            bool is_req;
            uint token;

            while (m.GetRetTypeCustomMod(ref idx, out is_req, out token))
            {
                ;
            }
            m.GetTypeSpec(ref idx, gtparams, gmparams);

            // Read types of parameters
            Target.Reg[] ret = new Target.Reg[pcount];
            la_sizes = new int[pcount];
            la_types = new metadata.TypeSpec[pcount];

            List <metadata.TypeSpec> la_locs = new List <metadata.TypeSpec>();

            if (has_hidden != null)
            {
                la_locs.Add(has_hidden);
            }
            if (has_this)
            {
                // value type methods have mptr to type as their this pointer
                if (csite.ms.type.IsValueType)
                {
                    la_locs.Add(csite.ms.type.ManagedPointer);
                }
                else
                {
                    la_locs.Add(csite.ms.type);
                }
            }
            for (int i = 0; i < act_pcount; i++)
            {
                while (m.GetRetTypeCustomMod(ref idx, out is_req, out token))
                {
                    ;
                }
                la_locs.Add(m.GetTypeSpec(ref idx, gtparams, gmparams));
            }


            for (int i = 0; i < pcount; i++)
            {
                metadata.TypeSpec v = la_locs[i];

                la_types[i] = v;
                var size = GetSize(v);
                la_sizes[i] = size;

                var ct = GetCTFromTypeForCC(v); ir.Opcode.GetCTFromType(v);
                if (cc_classmap.ContainsKey(ct))
                {
                    ct = cc_classmap[ct];
                }
                else
                {
                    ct = GetCCClassFromCT(ct, size, v, cc_name);
                }

                Reg r = null;

                int cur_cc_next;
                if (cc_next.TryGetValue(ct, out cur_cc_next) == false)
                {
                    cur_cc_next = 0;
                }

                int[] cc_map;
                if (cc.TryGetValue(ct, out cc_map))
                {
                    if (cur_cc_next >= cc_map.Length)
                    {
                        cur_cc_next = cc_map.Length - 1;
                    }

                    var reg_id = cc_map[cur_cc_next];
                    if (regs[reg_id].type == rt_stack)
                    {
                        Reg rstack = new Reg()
                        {
                            type      = rt_stack,
                            id        = regs[reg_id].id,
                            size      = size,
                            stack_loc = stack_loc,
                            name      = regs[reg_id].name,
                            mask      = regs[reg_id].mask
                        };
                        stack_loc += size;

                        var diff = stack_loc % size;
                        if (diff != 0)
                        {
                            stack_loc = stack_loc + size - diff;
                        }
                        r = rstack;
                    }
                    else
                    {
                        r = regs[reg_id];
                    }
                }
                else
                {
                    r = GetRegLoc(csite, ref stack_loc,
                                  cur_cc_next, ct, v, cc_name);
                }
                cc_next[ct] = cur_cc_next + 1;

                ret[i] = r;
            }

            return(ret);
        }
Esempio n. 13
0
 public virtual int GetCCClassFromCT(int ct, int size, metadata.TypeSpec ts, string cc)
 {
     return(ct);
 }
Esempio n. 14
0
        static void Main(string[] args)
        {
            var    argc = args.Length;
            char   c;
            var    go          = new XGetoptCS.XGetopt();
            var    arg_str     = "t:L:f:e:o:d:qDC:H:m:i";
            string target      = "x86";
            string debug_file  = null;
            string output_file = null;
            string epoint      = null;
            string cfile       = null;
            string hfile       = null;
            bool   quiet       = false;
            bool   require_metadata_version_match = true;
            bool   interactive = false;
            string act_epoint  = null;
            Dictionary <string, object> opts = new Dictionary <string, object>();

            while ((c = go.Getopt(argc, args, arg_str)) != '\0')
            {
                switch (c)
                {
                case 't':
                    target = go.Optarg;
                    break;

                case 'L':
                    new_search_dirs.Add(go.Optarg);
                    break;

                case 'd':
                    debug_file = go.Optarg;
                    break;

                case 'o':
                    output_file = go.Optarg;
                    break;

                case 'e':
                    epoint = go.Optarg;
                    break;

                case 'q':
                    quiet = true;
                    break;

                case 'D':
                    require_metadata_version_match = false;
                    break;

                case 'C':
                    cfile = go.Optarg;
                    break;

                case 'H':
                    hfile = go.Optarg;
                    break;

                case 'f':
                    parse_f_option(go);
                    break;

                case 'i':
                    interactive = true;
                    break;

                case 'g':
                    do_dwarf = true;
                    break;

                case 'm':
                {
                    var    opt    = go.Optarg;
                    object optval = true;
                    if (opt.Contains("="))
                    {
                        var optvals = opt.Substring(opt.IndexOf("=") + 1);
                        opt = opt.Substring(0, opt.IndexOf("="));

                        int intval;
                        if (optvals.ToLower() == "false" || optvals.ToLower() == "off" || optvals.ToLower() == "no")
                        {
                            optval = false;
                        }
                        else if (optvals.ToLower() == "true" || optvals.ToLower() == "on" || optvals.ToLower() == "yes")
                        {
                            optval = true;
                        }
                        else if (int.TryParse(optvals, out intval))
                        {
                            optval = intval;
                        }
                        else
                        {
                            optval = optvals;
                        }
                    }
                    else if (opt.StartsWith("no-"))
                    {
                        opt    = opt.Substring(3);
                        optval = false;
                    }
                    opts[opt] = optval;
                }
                break;
                }
            }

            var fname = go.Optarg;

            if (fname == String.Empty)
            {
                Console.WriteLine("No input file specified");
                return;
            }

            // Insert library directories specified on the command line before the defaults
            search_dirs.InsertRange(0, new_search_dirs);

            if (cfile != null && hfile == null)
            {
                Console.WriteLine("-H must be used if -C is used");
                return;
            }

            libtysila5.libtysila.AssemblyLoader al = new libtysila5.libtysila.AssemblyLoader(
                new FileSystemFileLoader());

            /* Load up type forwarders */
            foreach (var libdir in search_dirs)
            {
                try
                {
                    var di = new DirectoryInfo(libdir);
                    if (di.Exists)
                    {
                        foreach (var tfw_file in di.GetFiles("*.tfw"))
                        {
                            var tfr = new StreamReader(tfw_file.OpenRead());
                            while (!tfr.EndOfStream)
                            {
                                var tfr_line   = tfr.ReadLine();
                                var tfr_lsplit = tfr_line.Split('=');
                                al.TypeForwarders[tfr_lsplit[0]] = tfr_lsplit[1];
                            }
                            tfr.Close();
                        }
                    }
                }
                catch (Exception) { }
            }

            //search_dirs.Add(@"..\mono\corlib");
            al.RequireVersionMatch = require_metadata_version_match;

            // add containing directory of input to search dirs
            var ifi = new FileInfo(fname);

            search_dirs.Add(ifi.DirectoryName);

            var m = al.GetAssembly(fname);

            if (m == null)
            {
                Console.WriteLine("Input file " + fname + " not found");
                throw new Exception(fname + " not found");
            }

            t = libtysila5.target.Target.targets[target];
            // try and set target options
            foreach (var kvp in opts)
            {
                if (!t.Options.TrySet(kvp.Key, kvp.Value))
                {
                    Console.WriteLine("Unable to set target option " + kvp.Key + " to " + kvp.Value.ToString());
                    return;
                }
            }

            if (interactive)
            {
                if (new Interactive(m, t).DoInteractive() == false)
                {
                    return;
                }
            }

            libtysila5.dwarf.DwarfCU dwarf = null;
            if (do_dwarf)
            {
                dwarf = new libtysila5.dwarf.DwarfCU(t, m);
            }

            libtysila5.TysilaState s = new libtysila5.TysilaState();

            if (output_file != null)
            {
                var bf = new binary_library.elf.ElfFile(binary_library.Bitness.Bits32);
                s.bf = bf;
                bf.Init();
                bf.Architecture = target;
                var st = new libtysila5.StringTable(
                    m.GetStringEntry(metadata.MetadataStream.tid_Module,
                                     1, 1), al, t);
                s.st = st;
                s.r  = new libtysila5.CachingRequestor(m);
                t.InitIntcalls();

                /* for now, just assemble all public and protected
                 * non-generic methods in public types, plus the
                 * entry point */
                StringBuilder debug = new StringBuilder();
                for (int i = 1; i <= m.table_rows[metadata.MetadataStream.tid_MethodDef]; i++)
                {
                    metadata.MethodSpec ms = new metadata.MethodSpec
                    {
                        m     = m,
                        mdrow = i,
                        msig  = 0
                    };

                    ms.type = new metadata.TypeSpec
                    {
                        m     = m,
                        tdrow = m.methoddef_owners[ms.mdrow]
                    };

                    var mflags = m.GetIntEntry(metadata.MetadataStream.tid_MethodDef,
                                               i, 2);
                    var tflags = m.GetIntEntry(metadata.MetadataStream.tid_TypeDef,
                                               ms.type.tdrow, 0);

                    mflags &= 0x7;
                    tflags &= 0x7;

                    ms.msig = (int)m.GetIntEntry(metadata.MetadataStream.tid_MethodDef,
                                                 i, 4);

                    /* See if this is the entry point */
                    int tid, row;
                    m.InterpretToken(m.entry_point_token, out tid, out row);
                    if (tid == metadata.MetadataStream.tid_MethodDef)
                    {
                        if (row == i)
                        {
                            if (epoint != null)
                            {
                                ms.aliases = new List <string> {
                                    epoint
                                }
                            }
                            ;

                            mflags = 6;
                            tflags = 1;

                            ms.AlwaysCompile = true;
                            act_epoint       = ms.MangleMethod();
                        }
                    }

                    /* See if we have an always compile attribute */
                    if (ms.HasCustomAttribute("_ZN14libsupcs#2Edll8libsupcs22AlwaysCompileAttribute_7#2Ector_Rv_P1u1t") ||
                        ms.type.HasCustomAttribute("_ZN14libsupcs#2Edll8libsupcs22AlwaysCompileAttribute_7#2Ector_Rv_P1u1t"))
                    {
                        mflags = 6;
                        tflags = 1;

                        ms.AlwaysCompile = true;
                    }

                    if (ms.type.IsGenericTemplate == false &&
                        ms.IsGenericTemplate == false &&
                        (mflags == 0x4 || mflags == 0x5 || mflags == 0x6) &&
                        tflags != 0)
                    {
                        s.r.MethodRequestor.Request(ms);
                    }
                }

                /* Also assemble all public non-generic type infos */
                for (int i = 1; i <= m.table_rows[metadata.MetadataStream.tid_TypeDef]; i++)
                {
                    var flags = (int)m.GetIntEntry(metadata.MetadataStream.tid_TypeDef,
                                                   i, 0);
                    if (((flags & 0x7) != 0x1) &&
                        ((flags & 0x7) != 0x2))
                    {
                        continue;
                    }
                    var ts = new metadata.TypeSpec {
                        m = m, tdrow = i
                    };
                    if (ts.IsGeneric)
                    {
                        continue;
                    }
                    s.r.StaticFieldRequestor.Request(ts);
                    s.r.VTableRequestor.Request(ts.Box);
                }

                /* If corlib, add in the default equality comparers so we don't have to jit these
                 * commonly used classes */
                if (m.is_corlib)
                {
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemByte }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt8 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt16 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt16 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt32 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt32 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt64 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt64 }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemString }), ".ctor"));
                    s.r.MethodRequestor.Request(m.GetMethodSpec(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemObject }), ".ctor"));

                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemByte }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt8 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt16 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt16 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt32 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt32 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemInt64 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemUInt64 }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemString }));
                    s.r.VTableRequestor.Request(m.GetTypeSpec("System.Collections.Generic", "GenericEqualityComparer`1", new metadata.TypeSpec[] { m.SystemObject }));
                }

                /* Generate a thread-local data section.  We may not use it. */
                var tlsos = bf.CreateContentsSection();
                tlsos.Name          = ".tdata";
                tlsos.IsAlloc       = true;
                tlsos.IsExecutable  = false;
                tlsos.IsWriteable   = true;
                tlsos.IsThreadLocal = true;

                while (!s.r.Empty)
                {
                    if (!s.r.MethodRequestor.Empty)
                    {
                        var ms = s.r.MethodRequestor.GetNext();

                        ISection tsect    = null;
                        ISection datasect = null;
                        if (func_sects && !ms.ms.AlwaysCompile)
                        {
                            tsect    = get_decorated_section(bf, bf.GetTextSection(), "." + ms.ms.MangleMethod());
                            datasect = get_decorated_section(bf, bf.GetDataSection(), "." + ms.ms.MangleMethod() + "_SignatureTable");
                        }
                        else if (class_sects && !ms.ms.AlwaysCompile)
                        {
                            tsect    = get_decorated_section(bf, bf.GetTextSection(), "." + ms.ms.type.MangleType());
                            datasect = get_decorated_section(bf, bf.GetDataSection(), "." + ms.ms.type.MangleType() + "_SignatureTable");
                        }

                        libtysila5.libtysila.AssembleMethod(ms.ms,
                                                            bf, t, s, debug, m, ms.c, tsect, datasect, dwarf);
                        if (!quiet)
                        {
                            Console.WriteLine(ms.ms.m.MangleMethod(ms.ms));
                        }
                    }
                    else if (!s.r.StaticFieldRequestor.Empty)
                    {
                        var sf = s.r.StaticFieldRequestor.GetNext();

                        ISection tsect = null;
                        if (data_sects && !sf.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetDataSection(), "." + sf.MangleType() + "S");
                        }
                        else if (class_sects && !sf.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetDataSection(), "." + sf.MangleType() + "S");
                        }

                        libtysila5.layout.Layout.OutputStaticFields(sf,
                                                                    t, bf, m, tsect, tlsos);
                        if (!quiet)
                        {
                            Console.WriteLine(sf.MangleType() + "S");
                        }
                    }
                    else if (!s.r.EHRequestor.Empty)
                    {
                        var eh = s.r.EHRequestor.GetNext();

                        ISection tsect = null;
                        if (func_sects && !eh.ms.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetRDataSection(), "." + eh.ms.MangleMethod() + "EH");
                        }
                        else if (class_sects && !eh.ms.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetRDataSection(), "." + eh.ms.type.MangleType() + "EH");
                        }

                        libtysila5.layout.Layout.OutputEHdr(eh,
                                                            t, bf, s, m, tsect);
                        if (!quiet)
                        {
                            Console.WriteLine(eh.ms.MangleMethod() + "EH");
                        }
                    }
                    else if (!s.r.VTableRequestor.Empty)
                    {
                        var vt = s.r.VTableRequestor.GetNext();

                        ISection tsect     = null;
                        ISection data_sect = null;
                        if (data_sects && !vt.AlwaysCompile)
                        {
                            tsect     = get_decorated_section(bf, bf.GetRDataSection(), "." + vt.MangleType());
                            data_sect = get_decorated_section(bf, bf.GetDataSection(), "." + vt.MangleType() + "_SignatureTable");
                        }
                        else if (class_sects && !vt.AlwaysCompile)
                        {
                            tsect     = get_decorated_section(bf, bf.GetTextSection(), "." + vt.MangleType());
                            data_sect = get_decorated_section(bf, bf.GetDataSection(), "." + vt.MangleType() + "_SignatureTable");
                        }

                        libtysila5.layout.Layout.OutputVTable(vt,
                                                              t, bf, s, m, tsect, data_sect);
                        if (!quiet)
                        {
                            Console.WriteLine(vt.MangleType());
                        }
                    }
                    else if (!s.r.DelegateRequestor.Empty)
                    {
                        var d = s.r.DelegateRequestor.GetNext();
                        libtysila5.ir.ConvertToIR.CreateDelegate(d, t, s);
                        if (!quiet)
                        {
                            Console.WriteLine(d.MangleType() + "D");
                        }
                    }
                    else if (!s.r.BoxedMethodRequestor.Empty)
                    {
                        var bm = s.r.BoxedMethodRequestor.GetNext();

                        ISection tsect = null;
                        if (func_sects && !bm.ms.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetTextSection(), "." + bm.ms.MangleMethod());
                        }
                        else if (class_sects && !bm.ms.AlwaysCompile)
                        {
                            tsect = get_decorated_section(bf, bf.GetTextSection(), "." + bm.ms.type.MangleType());
                        }

                        libtysila5.libtysila.AssembleBoxedMethod(bm.ms,
                                                                 bf, t, s, debug, tsect);
                        if (!quiet)
                        {
                            Console.WriteLine(bm.ms.MangleMethod());
                        }
                    }
                }

                if (debug_file != null)
                {
                    string d = debug.ToString();

                    StreamWriter sw = new StreamWriter(debug_file);
                    sw.Write(d);
                    sw.Close();
                }

                if (tlsos.Length > 0)
                {
                    bf.AddSection(tlsos);
                }

                /* String table */
                st.WriteToOutput(bf, m, t);

                /* Include original metadata */
                var rdata = bf.GetRDataSection();
                rdata.Align(t.GetPointerSize());
                var mdsym = bf.CreateSymbol();
                mdsym.Name       = m.AssemblyName;
                mdsym.ObjectType = binary_library.SymbolObjectType.Object;
                mdsym.Offset     = (ulong)rdata.Data.Count;
                mdsym.Type       = binary_library.SymbolType.Global;
                var len = m.file.GetLength();
                mdsym.Size = len;
                rdata.AddSymbol(mdsym);

                for (int i = 0; i < len; i++)
                {
                    rdata.Data.Add(m.file.ReadByte(i));
                }

                var mdsymend = bf.CreateSymbol();
                mdsymend.Name       = m.AssemblyName + "_end";
                mdsymend.ObjectType = binary_library.SymbolObjectType.Object;
                mdsymend.Offset     = (ulong)rdata.Data.Count;
                mdsymend.Type       = binary_library.SymbolType.Global;
                mdsymend.Size       = 0;
                rdata.AddSymbol(mdsymend);

                /* Add resource symbol if present */
                if (m.GetPEFile().ResourcesSize != 0)
                {
                    var rsym = bf.CreateSymbol();
                    rsym.Name       = m.AssemblyName + "_resources";
                    rsym.ObjectType = SymbolObjectType.Object;
                    rsym.Offset     = (ulong)m.GetPEFile().ResourcesOffset + mdsym.Offset;
                    rsym.Type       = SymbolType.Global;
                    rsym.Size       = m.GetPEFile().ResourcesSize;
                    rdata.AddSymbol(rsym);
                }

                /* Add comment */
                var csect = bf.CreateContentsSection();
                csect.IsAlloc      = false;
                csect.IsExecutable = false;
                csect.IsWriteable  = false;
                csect.Name         = ".comment";
                var cbytes = Encoding.ASCII.GetBytes(comment);
                foreach (var cbyte in cbytes)
                {
                    csect.Data.Add(cbyte);
                }
                csect.Data.Add(0);
                if (act_epoint != null)
                {
                    var epbytes = Encoding.ASCII.GetBytes("entry: " +
                                                          act_epoint);
                    foreach (var epbyte in epbytes)
                    {
                        csect.Data.Add(epbyte);
                    }
                    csect.Data.Add(0);
                }
                bf.AddSection(csect);

                /* Add debugger sections */
                if (dwarf != null)
                {
                    var dwarf_sects = new libtysila5.dwarf.DwarfSections(bf);
                    dwarf.WriteToOutput(dwarf_sects);
                }


                /* Write output file */
                bf.Filename = output_file;
                bf.Write();
            }

            if (hfile != null)
            {
                COutput.WriteHeader(m, t, hfile, cfile);
            }
        }
Esempio n. 15
0
 public static extern void *JitCompile(metadata.TypeSpec ts);
Esempio n. 16
0
        public virtual string GetCType(metadata.TypeSpec ts, out int bytesize)
        {
            switch (ts.stype)
            {
            case metadata.TypeSpec.SpecialType.None:
                switch (ts.SimpleType)
                {
                case 0x02:
                case 0x08:
                    bytesize = 4;
                    return("int32_t");

                case 0x03:
                case 0x06:
                    bytesize = 2;
                    return("int16_t");

                case 0x04:
                    bytesize = 1;
                    return("int8_t");

                case 0x05:
                    bytesize = 1;
                    return("uint8_t");

                case 0x07:
                    bytesize = 2;
                    return("uint16_t");

                case 0x09:
                    bytesize = 4;
                    return("uint32_t");

                case 0x0a:
                    bytesize = 8;
                    return("int64_t");

                case 0x0b:
                    bytesize = 8;
                    return("uint64_t");

                case 0x0c:
                    bytesize = 4;
                    return("float");

                case 0x0d:
                    bytesize = 8;
                    return("double");

                case 0x18:
                    bytesize = GetPointerSize();
                    return("INTPTR");

                case 0x19:
                    bytesize = GetPointerSize();
                    return("UINTPTR");
                }
                break;
            }
            bytesize = GetPointerSize();
            return("INTPTR");
        }
Esempio n. 17
0
        public virtual string GetCType(metadata.TypeSpec ts)
        {
            int b;

            return(GetCType(ts, out b));
        }
Esempio n. 18
0
 protected internal virtual void AddExtraVTableFields(metadata.TypeSpec ts, IList <byte> d, ref ulong offset)
 {
 }