LLVM中基于statepoint-example策略实现GC的路径确认及示例寻求
基于LLVM Statepoint API实现GC的步骤确认与示例求助
我是LLVM新手,正尝试实现一个基于statepoint API的垃圾回收器(GC)。已查阅所有相关文档,大致清楚后续方向,但不确定该路径是否正确。
我未能在网上找到采用statepoint-example策略的运行时实现。LLVM文档提到仓库中/llvm/runtime/目录下有示例,但似乎已不存在。
以下是我对所需步骤的理解:
相较于gc_root,我选择使用statepoint API,因为文档推荐新项目采用该方案。我认为需要完成以下步骤:
- 声明一个
UseStatepoints = true且UseRS4GC = true的自定义GC策略,或使用内置的statepoint-example策略。除非遇到技术问题,否则我计划使用statepoint-example。 - 通过
setGC为所有函数标注使用该策略:
#include <llvm/IR/IRBuilder.h> // ... Function *fn = Function::Create(prototype, Function::ExternalLinkage, function_name, module.get()); fn->setGC("statepoint-example");
- 使用
RewriteStatepointsForGC转换 pass,它会自动插入@llvm.experimental.gc.statepoint和@llvm.experimental.gc.relocate等注解。 - 使用
PlaceSafepoints转换 pass,在安全点自动添加safepoint_poll调用。 - 我的GC应包含一个初始化阶段,在应用启动前调用,通过
GCMetadataPrinter中的GCFunctionMetadata::roots_begin()和end()访问栈映射。栈映射格式如下:
Header { uint8 : Stack Map Version (current version is 3) uint8 : Reserved (expected to be 0) uint16 : Reserved (expected to be 0) } uint32 : NumFunctions uint32 : NumConstants uint32 : NumRecords StkSizeRecord[NumFunctions] { uint64 : Function Address uint64 : Stack Size (or UINT64_MAX if not statically known) uint64 : Record Count } Constants[NumConstants] { uint64 : LargeConstant } StkMapRecord[NumRecords] { uint64 : PatchPoint ID uint32 : Instruction Offset uint16 : Reserved (record flags) uint16 : NumLocations Location[NumLocations] { uint8 : Register | Direct | Indirect | Constant | ConstantIndex uint8 : Reserved (expected to be 0) uint16 : Location Size uint16 : Dwarf RegNum uint16 : Reserved (expected to be 0) int32 : Offset or SmallConstant } uint32 : Padding (only if required to align to 8 byte) uint16 : Padding uint16 : NumLiveOuts LiveOuts[NumLiveOuts] { uint16 : Dwarf RegNum uint8 : Reserved uint8 : Size in Bytes } uint32 : Padding (only if required to align to 8 byte) }
随后我可(可选地)将栈映射转换为便于GC处理的数据结构。
6. 运行时需实现safepoint_poll函数,该函数会在安全点(步骤4)被调用,并利用步骤5收集的数据判断是否需要执行垃圾回收。
恳请有经验的人士确认我的路径是否正确,若能告知相关示例实现的位置则更佳。
感谢!
内容的提问来源于stack exchange,提问作者Remo H. Jansen
相关产品推荐
相关产品推荐

