基于GCC实现可跳转至下序标签的协程宏方案问询
GCC下协程宏的标签连续跳转实现求助
我正在实现一套用于高效协程的宏,协程函数包含运行、清理、检查多个执行阶段——目前用switch/case实现,运行阶段走switch的贯穿执行路径,其他阶段仅在错误场景触发。
我需要实现标签可直接跳转到序列中的下一个标签,示例如下:
step1: ... goto step2; // 等价于跳转到__COUNTER__+1对应的标签
期望的宏使用语法:
BEGIN AWAIT action1(); AWAIT action2(); AWAIT action3(); END
展开后的目标代码结构需类似:
if (0) { if (pass == CLEANING) { clean1: clean(1); goto clean2; // <- 需要自动生成跳转到下一个清理标签 } else ... } case 1: action1(); if (0) { if (pass == CLEANING) { clean2: // 无清理代码,期望编译器优化移除 goto clean3; // <- 跳转到下一个清理标签 } else ... } case 2: action2(); if (0) { if (pass == CLEANING) { clean3: clean(3); goto clean4; // <- 跳转到下一个清理标签 } else ... } case 3: action3(); if (0) { clean4: // 完成 }
我希望不通过switch分发执行阶段,直接用goto连接标签。用__COUNTER__生成标签很容易,但无法实现goto label ## __COUNTER__ + 1这类预处理阶段的标签跳转生成。
已尝试以下方案但均不符合需求:
- 跳转表:无法提前知晓步骤数量,无法预先构建
- 多阶段跳转表:在-O1/O2/Og优化级别下无法被移除,仅O3可用,不符合要求
- 获取
__COUNTER__的前值:需要运行时处理,且枚举保存的计数器值无法拼接成标签 - asm goto:不确定能否动态创建标签名
- 标签引用:
__COUNTER__+1无法在预处理阶段计算,无法实现 - 批量定义
#define INCREMENT_3 4这类宏:虽可行,但担心耗尽编号,且不清楚__COUNTER__的作用范围是否跨翻译单元
请问基于GCC有其他可行的实现方案吗?
内容的提问来源于stack exchange,提问作者Yaroslaff Fedin
相关产品推荐
相关产品推荐

