public void AddProcessedMethodData(ProcessedMethodData processedMethodData) { MethodDesc method = processedMethodData.Method; string reason = processedMethodData.Reason; // Format is // ldtoken method // variable amount of extra metadata about the method // pop try { EntityHandle methodHandle = _emitter.GetMethodRef(method); _il.OpCode(ILOpCode.Ldtoken); _il.Token(methodHandle); _il.OpCode(ILOpCode.Pop); } catch (Exception ex) { PrintWarning($"Exception {ex} while attempting to generate method lists"); } }
public void AddProcessedMethodData(MethodProfileData processedMethodData) { MethodDesc method = processedMethodData.Method; // Format is // ldtoken method // variable amount of extra metadata about the method, Extension data is encoded via ldstr "id" // pop // Extensions generated by this emitter: // // ldstr "ExclusiveWeight" // Any ldc.i4 or ldc.r4 or ldc.r8 instruction to indicate the exclusive weight // // ldstr "WeightedCallData" // ldc.i4 <Count of methods called> // Repeat <Count of methods called times> // ldtoken <Method called from this method> // ldc.i4 <Weight associated with calling the <Method called from this method>> // // ldstr "InstrumentationDataStart" // Encoded ints and longs, using ldc.i4, and ldc.i8 instructions as well as ldtoken <type> instructions // ldstr "InstrumentationDataEnd" as a terminator try { EntityHandle methodHandle = _emitter.GetMethodRef(method); _il.OpCode(ILOpCode.Ldtoken); _il.Token(methodHandle); if (processedMethodData.ExclusiveWeight != 0) { _il.LoadString(_emitter.GetUserStringHandle("ExclusiveWeight")); if (((double)(int)processedMethodData.ExclusiveWeight) == processedMethodData.ExclusiveWeight) { _il.LoadConstantI4((int)processedMethodData.ExclusiveWeight); } else { _il.LoadConstantR8(processedMethodData.ExclusiveWeight); } } if ((processedMethodData.CallWeights != null) && processedMethodData.CallWeights.Count > 0) { _il.LoadString(_emitter.GetUserStringHandle("WeightedCallData")); _il.LoadConstantI4(processedMethodData.CallWeights.Count); foreach (var entry in processedMethodData.CallWeights) { EntityHandle calledMethod = _emitter.GetMethodRef(entry.Key); _il.OpCode(ILOpCode.Ldtoken); _il.Token(calledMethod); _il.LoadConstantI4(entry.Value); } } if (processedMethodData.SchemaData != null) { _il.LoadString(_emitter.GetUserStringHandle("InstrumentationDataStart")); PgoProcessor.EncodePgoData <TypeSystemEntityOrUnknown, TypeSystemEntityOrUnknown>(processedMethodData.SchemaData, this, true); } _il.OpCode(ILOpCode.Pop); } catch (Exception ex) { Program.PrintWarning($"Exception {ex} while attempting to generate method lists"); } }