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); }
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(); }