发布于 2015-05-27 11:39:40
免责声明:我不是CLR或RyuJIT方面的专家。这一切我可能完全错了。
我在“部分 of RyuJIT章 of 运行时之书”中看到了下面的运行时之书
对于具有跟踪生存期的lvlVars,或者对于涉及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()编写的。
希望这将作为一个起点,如果您想进一步探讨。
https://stackoverflow.com/questions/30416520
复制相似问题