set "COMPlus_JitDump=Main GetEnumerator"
```
-See [Setting configuration variables](../../../workflow/testing/viewing-jit-dumps.md#setting-configuration-variables) for more
+See [Setting configuration variables](../../../workflow/testing/coreclr/viewing-jit-dumps.md#setting-configuration-variables) for more
details on this.
Full instructions for dumping the compilation of some managed code can be found here:
-[viewing-jit-dumps.md](../../../workflow/testing/viewing-jit-dumps.md)
+[viewing-jit-dumps.md](../../../workflow/testing/coreclr/viewing-jit-dumps.md)
## Reading expression trees
============================
1. Perform a build of the repo.
-2. Open solution \<reporoot\>\artifacts\obj\Windows_NT.\<platform\>.\<configuration\>\CoreCLR.sln in Visual Studio. \<platform\> and \<configuration\> are based
+2. Open solution \<reporoot\>\artifacts\obj\coreclr\Windows_NT.\<platform\>.\<configuration\>\CoreCLR.sln in Visual Studio. \<platform\> and \<configuration\> are based
on type of build you did. By default they are 'x64' and 'Debug'.
3. Right-click the INSTALL project and choose ‘Set as StartUp Project’
4. Bring up the properties page for the INSTALL project
jmpTabBase = GetEmitter()->emitBBTableDataGenBeg(jumpCount, false);
- JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", Compiler::s_compMethodsCount, jmpTabBase);
+ JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", compiler->compMethodID, jmpTabBase);
for (unsigned i = 0; i < jumpCount; i++)
{
BasicBlock* target = *jumpTable++;
noway_assert(target->bbFlags & BBF_JMP_TARGET);
- JITDUMP(" DD L_M%03u_" FMT_BB "\n", Compiler::s_compMethodsCount, target->bbNum);
+ JITDUMP(" DD L_M%03u_" FMT_BB "\n", compiler->compMethodID, target->bbNum);
GetEmitter()->emitDataGenData(i, target);
}
jmpTabOffs = 0;
- JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", Compiler::s_compMethodsCount, jmpTabBase);
+ JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", compiler->compMethodID, jmpTabBase);
for (unsigned i = 0; i < jumpCount; i++)
{
BasicBlock* target = *jumpTable++;
noway_assert(target->bbFlags & BBF_JMP_TARGET);
- JITDUMP(" DD L_M%03u_" FMT_BB "\n", Compiler::s_compMethodsCount, target->bbNum);
+ JITDUMP(" DD L_M%03u_" FMT_BB "\n", compiler->compMethodID, target->bbNum);
GetEmitter()->emitDataGenData(i, target);
};
#ifdef DEBUG
if (compiler->opts.dspCode)
{
- printf("\n L_M%03u_" FMT_BB ":\n", Compiler::s_compMethodsCount, bb->bbNum);
+ printf("\n L_M%03u_" FMT_BB ":\n", compiler->compMethodID, bb->bbNum);
}
#endif
}
}
printf(" ");
- ipMapping->ipmdNativeLoc.Print();
+ ipMapping->ipmdNativeLoc.Print(compiler->compMethodID);
// We can only call this after code generation. Is there any way to tell when it's legal to call?
// printf(" [%x]", ipMapping->ipmdNativeLoc.CodeOffset(GetEmitter()));
jmpTabOffs = 0;
- JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", Compiler::s_compMethodsCount, jmpTabBase);
+ JITDUMP("\n J_M%03u_DS%02u LABEL DWORD\n", compiler->compMethodID, jmpTabBase);
for (unsigned i = 0; i < jumpCount; i++)
{
BasicBlock* target = *jumpTable++;
noway_assert(target->bbFlags & BBF_JMP_TARGET);
- JITDUMP(" DD L_M%03u_" FMT_BB "\n", Compiler::s_compMethodsCount, target->bbNum);
+ JITDUMP(" DD L_M%03u_" FMT_BB "\n", compiler->compMethodID, target->bbNum);
GetEmitter()->emitDataGenData(i, target);
};
#ifdef DEBUG
/* static */
-unsigned Compiler::s_compMethodsCount = 0; // to produce unique label names
+LONG Compiler::s_compMethodsCount = 0; // to produce unique label names
#endif
#if MEASURE_MEM_ALLOC
if (opts.disAsm || opts.dspEmit || verbose)
{
- s_compMethodsCount = ~info.compMethodHash() & 0xffff;
+ compMethodID = ~info.compMethodHash() & 0xffff;
}
else
{
- s_compMethodsCount++;
+ compMethodID = InterlockedIncrement(&s_compMethodsCount);
}
#endif
//-------------------------- Global Compiler Data ------------------------------------
#ifdef DEBUG
- static unsigned s_compMethodsCount; // to produce unique label names
- unsigned compGenTreeID;
- unsigned compStatementID;
- unsigned compBasicBlockID;
+private:
+ static LONG s_compMethodsCount; // to produce unique label names
+#endif
+
+public:
+#ifdef DEBUG
+ LONG compMethodID;
+ unsigned compGenTreeID;
+ unsigned compStatementID;
+ unsigned compBasicBlockID;
#endif
BasicBlock* compCurBB; // the current basic block in process
}
#ifdef DEBUG
-void emitLocation::Print() const
+void emitLocation::Print(LONG compMethodID) const
{
unsigned insNum = emitGetInsNumFromCodePos(codePos);
unsigned insOfs = emitGetInsOfsFromCodePos(codePos);
- printf("(G_M%03u_IG%02u,ins#%d,ofs#%d)", Compiler::s_compMethodsCount, ig->igNum, insNum, insOfs);
+ printf("(G_M%03u_IG%02u,ins#%d,ofs#%d)", compMethodID, ig->igNum, insNum, insOfs);
}
#endif // DEBUG
#ifdef DEBUG
if (emitComp->opts.dspCode)
{
- printf("\n G_M%03u_IG%02u:", Compiler::s_compMethodsCount, ig->igNum);
+ printf("\n G_M%03u_IG%02u:", emitComp->compMethodID, ig->igNum);
if (emitComp->verbose)
{
printf(" ; offs=%06XH, funclet=%02u, bbWeight=%s", ig->igOffs, ig->igFuncIdx,
const int TEMP_BUFFER_LEN = 40;
char buff[TEMP_BUFFER_LEN];
- sprintf_s(buff, TEMP_BUFFER_LEN, "G_M%03u_IG%02u: ", Compiler::s_compMethodsCount, ig->igNum);
+ sprintf_s(buff, TEMP_BUFFER_LEN, "G_M%03u_IG%02u: ", emitComp->compMethodID, ig->igNum);
printf("%s; ", buff);
if ((igPrev == nullptr) || (igPrev->igFuncIdx != ig->igFuncIdx))
{
{
printf("Binding: ");
emitDispIns(jmp, false, false, false);
- printf("Binding L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, jmp->idAddr()->iiaBBlabel->bbNum);
+ printf("Binding L_M%03u_" FMT_BB, emitComp->compMethodID, jmp->idAddr()->iiaBBlabel->bbNum);
}
#endif // DEBUG
{
if (tgtIG)
{
- printf("to G_M%03u_IG%02u\n", Compiler::s_compMethodsCount, tgtIG->igNum);
+ printf("to G_M%03u_IG%02u\n", emitComp->compMethodID, tgtIG->igNum);
}
else
{
}
else
{
- printf("\nG_M%03u_IG%02u:\n", Compiler::s_compMethodsCount, ig->igNum);
+ printf("\nG_M%03u_IG%02u:\n", emitComp->compMethodID, ig->igNum);
}
}
#endif // DEBUG
const char* blockLabelFormat = "G_M%03u_IG%02u";
char blockLabel[64];
char firstLabel[64];
- sprintf_s(blockLabel, _countof(blockLabel), blockLabelFormat, Compiler::s_compMethodsCount, ig->igNum);
- sprintf_s(firstLabel, _countof(firstLabel), blockLabelFormat, Compiler::s_compMethodsCount,
- igFirst->igNum);
+ sprintf_s(blockLabel, _countof(blockLabel), blockLabelFormat, emitComp->compMethodID, ig->igNum);
+ sprintf_s(firstLabel, _countof(firstLabel), blockLabelFormat, emitComp->compMethodID, igFirst->igNum);
if (isRelative)
{
if (ig->igOffs == offs)
{
// Found it!
- sprintf_s(buf[curBuf], TEMP_BUFFER_LEN, "G_M%03u_IG%02u", Compiler::s_compMethodsCount, ig->igNum);
+ sprintf_s(buf[curBuf], TEMP_BUFFER_LEN, "G_M%03u_IG%02u", emitComp->compMethodID, ig->igNum);
retbuf = buf[curBuf];
curBuf = (curBuf + 1) % 4;
return retbuf;
bool emitLocation::IsPreviousInsNum(const emitter* emit) const;
#ifdef DEBUG
- void Print() const;
+ void Print(LONG compMethodID) const;
#endif // DEBUG
private:
{
printf("reloc ");
}
- printf("%s ADDRESS J_M%03u_DS%02u", (id->idIns() == INS_movw) ? "LOW" : "HIGH",
- Compiler::s_compMethodsCount, imm);
+ printf("%s ADDRESS J_M%03u_DS%02u", (id->idIns() == INS_movw) ? "LOW" : "HIGH", emitComp->compMethodID,
+ imm);
// After the MOVT, dump the table
if (id->idIns() == INS_movt)
if (isBound)
{
- printf("\n\n J_M%03u_DS%02u LABEL DWORD", Compiler::s_compMethodsCount, imm);
+ printf("\n\n J_M%03u_DS%02u LABEL DWORD", emitComp->compMethodID, imm);
/* Display the label table (it's stored as "BasicBlock*" values) */
lab = (insGroup*)emitCodeGetCookie(*bbp++);
assert(lab);
- printf("\n DD G_M%03u_IG%02u", Compiler::s_compMethodsCount, lab->igNum);
+ printf("\n DD G_M%03u_IG%02u", emitComp->compMethodID, lab->igNum);
} while (--cnt);
}
}
case IF_T2_M1: // Load Label
emitDispReg(id->idReg1(), attr, true);
if (id->idIsBound())
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
else
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
break;
case IF_T1_I: // Special Compare-and-branch
}
}
else if (id->idIsBound())
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
else
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
break;
}
else if (id->idIsBound())
{
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
}
else
{
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
}
break;
emitDispReg(id->idReg1(), size, true);
if (id->idIsBound())
{
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
}
else
{
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
break;
emitDispImm(emitGetInsSC(id), true);
if (id->idIsBound())
{
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
}
else
{
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
break;
}
else if (id->idIsBound())
{
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
}
else
{
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
}
printf("]");
{
printf("reloc ");
}
- printf("J_M%03u_DS%02u", Compiler::s_compMethodsCount, id->idDebugOnlyInfo()->idMemCookie);
+ printf("J_M%03u_DS%02u", emitComp->compMethodID, id->idDebugOnlyInfo()->idMemCookie);
disp -= id->idDebugOnlyInfo()->idMemCookie;
}
#else
#define SIZE_LETTER "D"
#endif
- printf("\n\n J_M%03u_DS%02u LABEL " SIZE_LETTER "WORD", Compiler::s_compMethodsCount, jtno);
+ printf("\n\n J_M%03u_DS%02u LABEL " SIZE_LETTER "WORD", emitComp->compMethodID, jtno);
/* Display the label table (it's stored as "BasicBlock*" values) */
lab = (insGroup*)emitCodeGetCookie(*bbp++);
assert(lab);
- printf("\n D" SIZE_LETTER " G_M%03u_IG%02u", Compiler::s_compMethodsCount, lab->igNum);
+ printf("\n D" SIZE_LETTER " G_M%03u_IG%02u", emitComp->compMethodID, lab->igNum);
} while (--cnt);
}
}
if (id->idIsBound())
{
- printf("G_M%03u_IG%02u", Compiler::s_compMethodsCount, id->idAddr()->iiaIGlabel->igNum);
+ printf("G_M%03u_IG%02u", emitComp->compMethodID, id->idAddr()->iiaIGlabel->igNum);
}
else
{
- printf("L_M%03u_" FMT_BB, Compiler::s_compMethodsCount, id->idAddr()->iiaBBlabel->bbNum);
+ printf("L_M%03u_" FMT_BB, emitComp->compMethodID, id->idAddr()->iiaBBlabel->bbNum);
}
break;