private static extern uint GetArrayTypeIndex(IntPtr objWriter, ClassTypeDescriptor classDescriptor, ArrayTypeDescriptor arrayTypeDescriptor);
public uint GetClassTypeIndex(ClassTypeDescriptor classTypeDescriptor) { return(GetClassTypeIndex(_nativeObjectWriter, classTypeDescriptor)); }
public uint GetCompleteClassTypeIndex(ClassTypeDescriptor classTypeDescriptor, ClassFieldsTypeDescriptor classFieldsTypeDescriptior, DataFieldDescriptor[] fields) { return(GetCompleteClassTypeIndex(_nativeObjectWriter, classTypeDescriptor, classFieldsTypeDescriptior, fields)); }
private uint GetClassTypeIndex(TypeDesc type, bool needsCompleteType) { DefType defType = type as DefType; System.Diagnostics.Debug.Assert(defType != null, "GetClassTypeIndex was called with non def type"); ClassTypeDescriptor classTypeDescriptor = new ClassTypeDescriptor { IsStruct = type.IsValueType ? 1 : 0, Name = _objectWriter.GetMangledName(type), BaseClassId = 0 }; uint typeIndex = _objectWriter.GetClassTypeIndex(classTypeDescriptor); _knownTypes[type] = typeIndex; if (type.HasBaseType && !type.IsValueType) { classTypeDescriptor.BaseClassId = GetTypeIndex(defType.BaseType, true); } List <DataFieldDescriptor> fieldsDescs = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> nonGcStaticFields = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> gcStaticFields = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> threadStaticFields = new List <DataFieldDescriptor>(); bool isCanonical = defType.IsCanonicalSubtype(CanonicalFormKind.Any); foreach (var fieldDesc in defType.GetFields()) { if (fieldDesc.HasRva || fieldDesc.IsLiteral) { continue; } if (isCanonical && fieldDesc.IsStatic) { continue; } LayoutInt fieldOffset = fieldDesc.Offset; int fieldOffsetEmit = fieldOffset.IsIndeterminate ? 0xBAAD : fieldOffset.AsInt; DataFieldDescriptor field = new DataFieldDescriptor { FieldTypeIndex = GetVariableTypeIndex(GetFieldDebugType(fieldDesc), false), Offset = (ulong)fieldOffsetEmit, Name = fieldDesc.Name }; if (fieldDesc.IsStatic) { if (fieldDesc.IsThreadStatic) { threadStaticFields.Add(field); } else if (fieldDesc.HasGCStaticBase) { gcStaticFields.Add(field); } else { nonGcStaticFields.Add(field); } } else { fieldsDescs.Add(field); } } InsertStaticFieldRegionMember(fieldsDescs, defType, nonGcStaticFields, WindowsNodeMangler.NonGCStaticMemberName, "__type_" + WindowsNodeMangler.NonGCStaticMemberName, false); InsertStaticFieldRegionMember(fieldsDescs, defType, gcStaticFields, WindowsNodeMangler.GCStaticMemberName, "__type_" + WindowsNodeMangler.GCStaticMemberName, Abi == TargetAbi.CoreRT); InsertStaticFieldRegionMember(fieldsDescs, defType, threadStaticFields, WindowsNodeMangler.ThreadStaticMemberName, "__type_" + WindowsNodeMangler.ThreadStaticMemberName, Abi == TargetAbi.CoreRT); DataFieldDescriptor[] fields = new DataFieldDescriptor[fieldsDescs.Count]; for (int i = 0; i < fieldsDescs.Count; ++i) { fields[i] = fieldsDescs[i]; } LayoutInt elementSize = defType.GetElementSize(); int elementSizeEmit = elementSize.IsIndeterminate ? 0xBAAD : elementSize.AsInt; ClassFieldsTypeDescriptor fieldsDescriptor = new ClassFieldsTypeDescriptor { Size = (ulong)elementSizeEmit, FieldsCount = fieldsDescs.Count }; uint completeTypeIndex = _objectWriter.GetCompleteClassTypeIndex(classTypeDescriptor, fieldsDescriptor, fields); _completeKnownTypes[type] = completeTypeIndex; if (needsCompleteType) { return(completeTypeIndex); } else { return(typeIndex); } }
private static extern uint GetCompleteClassTypeIndex(IntPtr objWriter, ClassTypeDescriptor classTypeDescriptor, ClassFieldsTypeDescriptor classFieldsTypeDescriptior, DataFieldDescriptor[] fields);
private uint GetClassTypeIndex(TypeDesc type, bool needsCompleteType) { DefType defType = type as DefType; System.Diagnostics.Debug.Assert(defType != null, "GetClassTypeIndex was called with non def type"); ClassTypeDescriptor classTypeDescriptor = new ClassTypeDescriptor { IsStruct = type.IsValueType ? 1 : 0, Name = _objectWriter.GetMangledName(type), BaseClassId = 0, InstanceSize = 0 }; uint typeIndex = _objectWriter.GetClassTypeIndex(classTypeDescriptor); _knownTypes[type] = typeIndex; if (!defType.InstanceByteCount.IsIndeterminate) { classTypeDescriptor.InstanceSize = (ulong)defType.InstanceByteCount.AsInt; } if (type.HasBaseType && !type.IsValueType) { classTypeDescriptor.BaseClassId = GetTypeIndex(defType.BaseType, true); } List <DataFieldDescriptor> fieldsDescs = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> nonGcStaticFields = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> gcStaticFields = new List <DataFieldDescriptor>(); List <DataFieldDescriptor> threadStaticFields = new List <DataFieldDescriptor>(); List <StaticDataFieldDescriptor> staticsDescs = new List <StaticDataFieldDescriptor>(); string nonGcStaticDataName = NodeFactory.NameMangler.NodeMangler.NonGCStatics(type); string gcStaticDataName = NodeFactory.NameMangler.NodeMangler.GCStatics(type); string threadStaticDataName = NodeFactory.NameMangler.NodeMangler.ThreadStatics(type); bool IsCoreRTAbi = Abi == TargetAbi.CoreRT; bool isCanonical = defType.IsCanonicalSubtype(CanonicalFormKind.Any); foreach (var fieldDesc in defType.GetFields()) { if (fieldDesc.HasRva || fieldDesc.IsLiteral) { continue; } if (isCanonical && fieldDesc.IsStatic) { continue; } LayoutInt fieldOffset = fieldDesc.Offset; int fieldOffsetEmit = fieldOffset.IsIndeterminate ? 0xBAAD : fieldOffset.AsInt; DataFieldDescriptor field = new DataFieldDescriptor { FieldTypeIndex = GetVariableTypeIndex(GetFieldDebugType(fieldDesc), false), Offset = (ulong)fieldOffsetEmit, Name = fieldDesc.Name }; if (fieldDesc.IsStatic) { if (NodeFactory.Target.OperatingSystem != TargetOS.Windows) { StaticDataFieldDescriptor staticDesc = new StaticDataFieldDescriptor { StaticOffset = (ulong)fieldOffsetEmit }; // Mark field as static field.Offset = 0xFFFFFFFF; if (fieldDesc.IsThreadStatic) { staticDesc.StaticDataName = threadStaticDataName; staticDesc.IsStaticDataInObject = IsCoreRTAbi ? 1 : 0; } else if (fieldDesc.HasGCStaticBase) { staticDesc.StaticDataName = gcStaticDataName; staticDesc.IsStaticDataInObject = IsCoreRTAbi ? 1 : 0; } else { staticDesc.StaticDataName = nonGcStaticDataName; staticDesc.IsStaticDataInObject = 0; } staticsDescs.Add(staticDesc); } if (fieldDesc.IsThreadStatic) { threadStaticFields.Add(field); } else if (fieldDesc.HasGCStaticBase) { gcStaticFields.Add(field); } else { nonGcStaticFields.Add(field); } } else { fieldsDescs.Add(field); } } if (NodeFactory.Target.OperatingSystem == TargetOS.Windows) { InsertStaticFieldRegionMember(fieldsDescs, defType, nonGcStaticFields, WindowsNodeMangler.NonGCStaticMemberName, "__type_" + WindowsNodeMangler.NonGCStaticMemberName, false); InsertStaticFieldRegionMember(fieldsDescs, defType, gcStaticFields, WindowsNodeMangler.GCStaticMemberName, "__type_" + WindowsNodeMangler.GCStaticMemberName, IsCoreRTAbi); InsertStaticFieldRegionMember(fieldsDescs, defType, threadStaticFields, WindowsNodeMangler.ThreadStaticMemberName, "__type_" + WindowsNodeMangler.ThreadStaticMemberName, IsCoreRTAbi); } else { fieldsDescs.AddRange(nonGcStaticFields); fieldsDescs.AddRange(gcStaticFields); fieldsDescs.AddRange(threadStaticFields); } DataFieldDescriptor[] fields = new DataFieldDescriptor[fieldsDescs.Count]; for (int i = 0; i < fieldsDescs.Count; ++i) { fields[i] = fieldsDescs[i]; } StaticDataFieldDescriptor[] statics = new StaticDataFieldDescriptor[staticsDescs.Count]; for (int i = 0; i < staticsDescs.Count; ++i) { statics[i] = staticsDescs[i]; } LayoutInt elementSize = defType.GetElementSize(); int elementSizeEmit = elementSize.IsIndeterminate ? 0xBAAD : elementSize.AsInt; ClassFieldsTypeDescriptor fieldsDescriptor = new ClassFieldsTypeDescriptor { Size = (ulong)elementSizeEmit, FieldsCount = fieldsDescs.Count, }; uint completeTypeIndex = _objectWriter.GetCompleteClassTypeIndex(classTypeDescriptor, fieldsDescriptor, fields, statics); _completeKnownTypes[type] = completeTypeIndex; if (needsCompleteType) { return(completeTypeIndex); } else { return(typeIndex); } }
uint ITypesDebugInfoWriter.GetArrayTypeIndex(ClassTypeDescriptor classDescriptor, ArrayTypeDescriptor arrayTypeDescriptor) { return(_dbgInfoWriter.GetArrayTypeIndex(classDescriptor, arrayTypeDescriptor, _nodeFactory.Target.PointerSize)); }
uint ITypesDebugInfoWriter.GetCompleteClassTypeIndex(ClassTypeDescriptor classTypeDescriptor, ClassFieldsTypeDescriptor classFieldsTypeDescriptior, DataFieldDescriptor[] fields) { return(_dbgInfoWriter.GetCompleteClassTypeIndex(classTypeDescriptor, classFieldsTypeDescriptior, fields)); }
uint ITypesDebugInfoWriter.GetClassTypeIndex(ClassTypeDescriptor classTypeDescriptor) { return(_dbgInfoWriter.GetClassTypeIndex(classTypeDescriptor)); }
public uint GetArrayTypeIndex(ClassTypeDescriptor classDescriptor, ArrayTypeDescriptor arrayTypeDescriptor) { return(GetArrayTypeIndex(_nativeObjectWriter, classDescriptor, arrayTypeDescriptor)); }