免责声明:我不是 CLR 或 RyuJIT 方面的专家。我可能完全错了。
我在Book of the Runtime的RyuJIT chapter中遇到了以下section:
对于具有跟踪生命周期的 lvlVar,或者对于涉及 GC 引用的表达式,我们会报告引用的有效范围。这是由发射器完成的,发射器将此信息添加到指令组,并在 GC 信息更改时终止指令组。
可以在jit/jitgcinfo.h 中找到似乎存储此信息的结构,如下所示:
struct varPtrDsc
{
varPtrDsc * vpdNext;
unsigned vpdVarNum; // which variable is this about?
unsigned vpdBegOfs ; // the offset where life starts
unsigned vpdEndOfs; // the offset where life starts
};
我上面引用的段落表明这些字段由“发射器”填充,我相信它们的意思是jit/emit.cpp。
生命周期的开始在emitter::emitGCvarLiveSet()中设置;相关摘录是(为简洁起见,删去空格):
/* Allocate a lifetime record */
desc = new (emitComp, CMK_GC) varPtrDsc;
desc->vpdBegOfs = emitCurCodeOffs(addr);
#ifdef DEBUG
desc->vpdEndOfs = 0xFACEDEAD;
#endif
desc->vpdVarNum = offs;
desc->vpdNext = NULL;
生命周期的结束以类似的方式设置,在emitter::emitGCvarDeadSet():
/* Record the death code offset */
assert(desc->vpdEndOfs == 0xFACEDEAD);
desc->vpdEndOfs = emitCurCodeOffs(addr);
最后,表格似乎是用jit/gcencode.cpp 编写的,特别是GCInfo::gcMakeVarPtrTable()。
如果您想进一步探索,希望这将成为一个起点。