1//
2// Copyright (c) Microsoft. All rights reserved.
3// Licensed under the MIT license. See LICENSE file in the project root for full license information.
4//
5
6//----------------------------------------------------------
7// SpmiDumpHelper.cpp - a helper to dump structs that are used in JitEEInterface calls and spmi collections.
8//----------------------------------------------------------
9
10#include "standardpch.h"
11#include "spmidumphelper.h"
12#include "spmirecordhelper.h"
13#include <assert.h>
14
15std::string SpmiDumpHelper::DumpAgnostic_CORINFO_RESOLVED_TOKENin(
16 const MethodContext::Agnostic_CORINFO_RESOLVED_TOKENin& tokenIn)
17{
18 char buffer[MAX_BUFFER_SIZE];
19 sprintf_s(buffer, MAX_BUFFER_SIZE, "tc-%016llX ts-%016llX tok-%08X tt-%u", tokenIn.tokenContext, tokenIn.tokenScope,
20 tokenIn.token, tokenIn.tokenType);
21 return std::string(buffer);
22}
23
24std::string SpmiDumpHelper::DumpAgnostic_CORINFO_RESOLVED_TOKENout(
25 const MethodContext::Agnostic_CORINFO_RESOLVED_TOKENout& tokenOut)
26{
27 char buffer[MAX_BUFFER_SIZE];
28 sprintf_s(buffer, MAX_BUFFER_SIZE, "cls-%016llX meth-%016llX fld-%016llX ti-%u ts-%u mi-%u ms-%u", tokenOut.hClass,
29 tokenOut.hMethod, tokenOut.hField, tokenOut.pTypeSpec_Index, tokenOut.cbTypeSpec,
30 tokenOut.pMethodSpec_Index, tokenOut.cbMethodSpec);
31 return std::string(buffer);
32}
33
34std::string SpmiDumpHelper::DumpAgnostic_CORINFO_RESOLVED_TOKEN(
35 const MethodContext::Agnostic_CORINFO_RESOLVED_TOKEN& token)
36{
37 return DumpAgnostic_CORINFO_RESOLVED_TOKENin(token.inValue) + std::string(" ") +
38 DumpAgnostic_CORINFO_RESOLVED_TOKENout(token.outValue);
39}
40
41std::string SpmiDumpHelper::DumpAgnostic_CORINFO_LOOKUP_KIND(
42 const MethodContext::Agnostic_CORINFO_LOOKUP_KIND& lookupKind)
43{
44 char buffer[MAX_BUFFER_SIZE];
45 sprintf_s(buffer, MAX_BUFFER_SIZE, "nrl-%u rlk-%u", lookupKind.needsRuntimeLookup, lookupKind.runtimeLookupKind);
46 return std::string(buffer);
47}
48
49std::string SpmiDumpHelper::DumpAgnostic_CORINFO_CONST_LOOKUP(
50 const MethodContext::Agnostic_CORINFO_CONST_LOOKUP& constLookup)
51{
52 char buffer[MAX_BUFFER_SIZE];
53 sprintf_s(buffer, MAX_BUFFER_SIZE, "at - %u handle/address-%016llX", constLookup.accessType, constLookup.handle);
54 return std::string(buffer);
55}
56
57std::string SpmiDumpHelper::DumpAgnostic_CORINFO_RUNTIME_LOOKUP(
58 const MethodContext::Agnostic_CORINFO_RUNTIME_LOOKUP& lookup)
59{
60 char buffer[MAX_BUFFER_SIZE];
61 sprintf_s(buffer, MAX_BUFFER_SIZE, " sig-%016llX hlp-%u ind-%u tfn-%u tff-%u { ", lookup.signature, lookup.helper,
62 lookup.indirections, lookup.testForNull, lookup.testForFixup);
63 std::string resultDump(buffer);
64 for (int i = 0; i < CORINFO_MAXINDIRECTIONS; i++)
65 {
66 sprintf_s(buffer, MAX_BUFFER_SIZE, "%016llX ", lookup.offsets[i]);
67 resultDump += std::string(buffer);
68 }
69 resultDump += std::string("}");
70 return resultDump;
71}
72
73std::string SpmiDumpHelper::DumpAgnostic_CORINFO_LOOKUP(const MethodContext::Agnostic_CORINFO_LOOKUP& lookup)
74{
75 std::string kind = DumpAgnostic_CORINFO_LOOKUP_KIND(lookup.lookupKind);
76 std::string lookupDescription;
77 if (lookup.lookupKind.needsRuntimeLookup)
78 {
79 lookupDescription = DumpAgnostic_CORINFO_RUNTIME_LOOKUP(lookup.runtimeLookup);
80 }
81 else
82 {
83 lookupDescription = DumpAgnostic_CORINFO_CONST_LOOKUP(lookup.constLookup);
84 }
85 return kind + std::string(" ") + lookupDescription;
86}
87
88std::string SpmiDumpHelper::DumpAgnostic_CORINFO_SIG_INFO(const MethodContext::Agnostic_CORINFO_SIG_INFO& sigInfo)
89{
90 char buffer[MAX_BUFFER_SIZE];
91 sprintf_s(buffer, MAX_BUFFER_SIZE, "{flg-%08X na-%u cc-%u ci-%u mc-%u mi-%u args-%016llX scp-%016llX tok-%08X}",
92 sigInfo.flags, sigInfo.numArgs, sigInfo.sigInst_classInstCount, sigInfo.sigInst_classInst_Index,
93 sigInfo.sigInst_methInstCount, sigInfo.sigInst_methInst_Index, sigInfo.args, sigInfo.scope,
94 sigInfo.token);
95 return std::string(buffer);
96}
97