Ejemplo n.º 1
0
        private void GetLlvmType()
        {
            LLVM.Type retTy = _module.GetLlvmType(_method.ReturnType);
            if (_method.ReturnType.MetadataType == MetadataType.Class)
            {
                retTy = retTy.GetPointerTo();
            }

            List <LLVM.Type> paramsTy = new List <LLVM.Type>();

            if (_method.HasThis)
            {
                paramsTy.Add(_module.GetLlvmType(_method.DeclaringType).GetPointerTo());
            }

            if (_method.HasParameters)
            {
                foreach (ParameterDefinition p in _method.Parameters)
                {
                    LLVM.Type ty = _module.GetLlvmType(p.ParameterType);
                    if (p.ParameterType.MetadataType == MetadataType.Class)
                    {
                        ty = ty.GetPointerTo();
                    }
                    paramsTy.Add(ty);
                }
            }

            // TODO false -> varArg
            _type = LLVM.FunctionType.Get(retTy, paramsTy.ToArray(), false);
        }
Ejemplo n.º 2
0
        private void EmitValueType()
        {
            Console.WriteLine("emitValueType");
            if (!_cilType.IsDefinition)
            {
                Trace.Assert(false, "type is a TypeReference");
                return;
            }

            TypeDefinition   td     = (TypeDefinition)_cilType;
            List <LLVM.Type> l      = new List <LLVM.Type>();
            uint             offset = 0;

            foreach (FieldDefinition f in td.Fields)
            {
                if (f.IsStatic)
                {
                    continue;
                }
                LLVM.Type ty = _module.GetLlvmType(f.FieldType);
                if (f.FieldType.MetadataType == MetadataType.Class)
                {
                    ty = ty.GetPointerTo();
                }
                l.Add(ty);
                _fieldsOffsets[f] = offset;
                offset++;
            }
            LLVM.StructType sty = LlvmType as LLVM.StructType;
            sty.SetBody(l.ToArray(), false);

            EmitFields();
        }