Esempio n. 1
0
        public static LLVMTypeRef ToLLVMType(this Type type)
        {
            if (type.IsConstructedGenericType && type.GetGenericTypeDefinition() == typeof(Vector128 <>))
            {
                var et = type.GetGenericArguments()[0];
                return(LLVMTypeRef.CreateVector(et.ToLLVMType(), 16U / (uint)Marshal.SizeOf(et)));
            }
            if (typeof(MulticastDelegate).IsAssignableFrom(type))
            {
                var mi = type.GetMethod("Invoke");
                return(LLVMTypeRef.CreateFunction(mi.ReturnType.ToLLVMType(),
                                                  mi.GetParameters().Select(x => x.ParameterType.ToLLVMType()).ToArray(), false));
            }
            if (type == typeof(void))
            {
                return(LLVMTypeRef.Void);
            }
            if (type.IsPointer)
            {
                return(LLVMTypeRef.Int64);
            }
            switch (Activator.CreateInstance(type))
            {
            case sbyte _:
            case byte _: return(LLVMTypeRef.Int8);

            case short _:
            case ushort _: return(LLVMTypeRef.Int16);

            case int _:
            case uint _: return(LLVMTypeRef.Int32);

            case long _:
            case ulong _: return(LLVMTypeRef.Int64);

            case Int128 _:
            case UInt128 _: return(LLVMTypeRef.CreateInt(128));

            case float _: return(LLVMTypeRef.Float);

            case double _: return(LLVMTypeRef.Double);

            case bool _: return(LLVMTypeRef.Int1);

            default: throw new NotSupportedException(type.Name);
            }
        }