public static ObjectDataBuilder.Reservation Write(ref ObjectDataBuilder dataBuilder, string name, IDictionary <string, List <ObjectDataBuilder.Reservation> > nameTable) { List <ObjectDataBuilder.Reservation> relatedNameReferences; if (!nameTable.TryGetValue(name, out relatedNameReferences)) { relatedNameReferences = new List <ObjectDataBuilder.Reservation>(); nameTable[name] = relatedNameReferences; } relatedNameReferences.Add(dataBuilder.ReserveInt()); return(dataBuilder.ReserveInt()); }
public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) { ObjectDataBuilder builder = new ObjectDataBuilder(factory, relocsOnly); builder.RequireInitialPointerAlignment(); builder.AddSymbol(this); EmitHeaderPrefix(ref builder); // Don't bother sorting if we're not emitting the contents if (!relocsOnly) { _items.MergeSort((x, y) => Comparer <int> .Default.Compare((int)x.Id, (int)y.Id)); } // ReadyToRunHeader.Flags builder.EmitInt((int)_flags); // ReadyToRunHeader.NumberOfSections ObjectDataBuilder.Reservation sectionCountReservation = builder.ReserveInt(); int count = 0; foreach (var item in _items) { // Skip empty entries if (!relocsOnly && item.Node is ObjectNode on && on.ShouldSkipEmittingObjectNode(factory)) { continue; } // Unmarked nodes are not part of the graph if (!item.Node.Marked && !(item.Node is ObjectNode)) { Debug.Assert(item.Node is DelayLoadMethodCallThunkNodeRange); continue; } builder.EmitInt((int)item.Id); builder.EmitReloc(item.StartSymbol, RelocType.IMAGE_REL_BASED_ADDR32NB); // The header entry for the runtime functions table should not include the 4 byte 0xffffffff sentinel // value in the covered range. int delta = item.Id == ReadyToRunSectionType.RuntimeFunctions ? RuntimeFunctionsTableNode.SentinelSizeAdjustment : 0; builder.EmitReloc(item.StartSymbol, RelocType.IMAGE_REL_SYMBOL_SIZE, delta); count++; } builder.EmitInt(sectionCountReservation, count); return(builder.ToObjectData()); }
public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) { ObjectDataBuilder builder = new ObjectDataBuilder(factory, relocsOnly); builder.RequireInitialPointerAlignment(); builder.AddSymbol(this); // Don't bother sorting if we're not emitting the contents if (!relocsOnly) { _items.Sort((x, y) => Comparer <int> .Default.Compare((int)x.Id, (int)y.Id)); } // ReadyToRunHeader.Magic builder.EmitInt((int)(ReadyToRunHeaderConstants.Signature)); // ReadyToRunHeader.MajorVersion builder.EmitShort((short)(ReadyToRunHeaderConstants.CurrentMajorVersion)); builder.EmitShort((short)(ReadyToRunHeaderConstants.CurrentMinorVersion)); // ReadyToRunHeader.Flags builder.EmitInt(0); // ReadyToRunHeader.NumberOfSections ObjectDataBuilder.Reservation sectionCountReservation = builder.ReserveInt(); int count = 0; foreach (var item in _items) { // Skip empty entries if (!relocsOnly && item.Node.ShouldSkipEmittingObjectNode(factory)) { continue; } builder.EmitInt((int)item.Id); builder.EmitReloc(item.StartSymbol, RelocType.IMAGE_REL_BASED_ADDR32NB); if (!relocsOnly) { builder.EmitInt(item.Node.GetData(factory).Data.Length); } count++; } builder.EmitInt(sectionCountReservation, count); return(builder.ToObjectData()); }
public override ObjectData GetData(NodeFactory factory, bool relocsOnly = false) { ObjectDataBuilder builder = new ObjectDataBuilder(factory, relocsOnly); builder.RequireInitialPointerAlignment(); builder.AddSymbol(this); EmitHeaderPrefix(ref builder); // Don't bother sorting if we're not emitting the contents if (!relocsOnly) { _items.MergeSort((x, y) => Comparer <int> .Default.Compare((int)x.Id, (int)y.Id)); } // ReadyToRunHeader.Flags builder.EmitInt((int)_flags); // ReadyToRunHeader.NumberOfSections ObjectDataBuilder.Reservation sectionCountReservation = builder.ReserveInt(); int count = 0; foreach (var item in _items) { // Skip empty entries if (!relocsOnly && item.Node.ShouldSkipEmittingObjectNode(factory)) { continue; } builder.EmitInt((int)item.Id); builder.EmitReloc(item.StartSymbol, RelocType.IMAGE_REL_BASED_ADDR32NB); builder.EmitReloc(item.StartSymbol, RelocType.IMAGE_REL_SYMBOL_SIZE); count++; } builder.EmitInt(sectionCountReservation, count); return(builder.ToObjectData()); }
public override void EncodeData(ref ObjectDataBuilder dataBuilder, NodeFactory factory, bool relocsOnly) { ProfileDataNode nextElementInList = ((ProfileDataSectionNode)ContainingNode).NextElementToEncode; if (nextElementInList != null) { dataBuilder.EmitPointerReloc(nextElementInList, -OffsetFromStartOfObjectToSymbol); } else { dataBuilder.EmitZeroPointer(); } if (relocsOnly) { return; } EcmaMethod ecmaMethod = (EcmaMethod)_methodNode.Method.GetTypicalMethodDefinition(); int startOffset = dataBuilder.CountBytes; var reservation = dataBuilder.ReserveInt(); dataBuilder.EmitInt(0); // CORBBTPROF_METHOD_HEADER::cDetail dataBuilder.EmitInt(ecmaMethod.MetadataReader.GetToken(ecmaMethod.Handle)); // CORBBT_METHOD_INFO::token dataBuilder.EmitInt(_ilSize); // CORBBT_METHOD_INFO::ILSize dataBuilder.EmitInt(_blockCount); // CORBBT_METHOD_INFO::cBlock int sizeOfCORBBTPROF_METHOD_HEADER = dataBuilder.CountBytes - startOffset; Debug.Assert(sizeOfCORBBTPROF_METHOD_HEADER == (OffsetFromStartOfObjectToSymbol - _targetDetails.PointerSize)); dataBuilder.EmitInt(reservation, sizeOfCORBBTPROF_METHOD_HEADER + _profileData.Length); dataBuilder.EmitBytes(_profileData); while ((dataBuilder.CountBytes & (dataBuilder.TargetPointerSize - 1)) != 0) { dataBuilder.EmitByte(0); } }
public static ObjectDataBuilder.Reservation Write(ref ObjectDataBuilder dataBuilder, ushort id) { dataBuilder.EmitInt(id); return(dataBuilder.ReserveInt()); }