作者nevak (^o^)
看板CompilerDev
标题Re: [问题] clang pragma with template id
时间Tue Jun 30 06:31:56 2020
感谢回答,最近赶专案暂时还没时间继续这个部分,把我们想做的再讲详细一点好了
我们的功能主要是code transform,pragma是让programmer有机会提供一些资讯
举例来说如果要做loop unroll,可以透过pragma提示我们要unroll几层
(当然实际上我们不是做unroll,因为unroll hint原本就有了XD)
void Calulate() {
for (// 16 iterations) {
#pragma unroll=2
}
}
实务上发现,有时候同一个for-loop code可能在不同使用场景需要有不同的unroll设定
因此可能的写法是copy-paste这个for-loop,并且设定不同的unroll pragma
但这样明显不是很好,而我们试图想做的是支援template的写法
template<unsigned U>
void Calculate() {
for (// 16 iterations) {
#pragma unroll=U
}
}
如此一来programmer可以透过template指定对应场景需要的unroll设定
对我们来说,就是要想办法解出透过template设定的U的值
我们这个阶段最终就是根据pragma对stmt加上一些attribute之後分析时可以拿来参考
附带一提我也觉得parser很难搞,感觉完成度跟其他部分差很多
※ 引述《mshockwave (夏克维夫)》之铭言:
: 我不确定能不能回答你的问题 但小弟最近刚好也在玩 clang pragma handler
: 就来献丑一下:我尝试过非常多的方法 但结论就是尽量不要去碰 parser
: 原因不外乎 clang parser不像是 preprocessor 有 pragma, attribute, 甚至
: PPCallback(注),或是AST部分有 ASTConsumer 可以用 plugin 上下其手的地方
: parser的生态系非常封闭,如果不是从头parse到尾的话很容易出错
: 所以我在做我自己的pragma handler 的时候一律是直接注入自己生成,或者客制化的
: Token。
: 我有点看不懂你最终想要做什麽,但假设你的 pragma 是会生出一堆新的程式码
: 也就是 class UserConfig,那我觉得你可以在解析完 value = 3*3之後,直接
: 生出一串构成 UserConfig class 的 Tokens,也就是 'class' 'UserConfig' '{'
: 等等。
: 接下来就是要注入这些 Token,方法有好几种。其中一种是利用
: Preprocessor::EnterTokenStream 来注入。但老实讲我没亲身用过这函式所以不确定
: 到底好不好用,你可能要详细阅读一下他在 Preprocessor.cpp 里面的注解
: 另外一个方法是把你刚刚那串 Tokens 定义成一个新的 Macro。动态插入一个 macro 蛮
: 简单的,但缺点当然就是你在程式码的某个地方事先就要呼叫那个 macro 他才会被
: 展开
: 希望这些对你有帮助
: 注:PPCallback不能用 plugin 的方式来插入,但你可以在 PragmaHandler 里面呼叫
: Preprocessor::addPPCallback 来插入一个客制的PPCallback
: ※ 引述《nevak (^o^)》之铭言:
: : 庆祝CompilerDev开版,贡献(?)一题发问
: : 最近工作上需要增加一些pragma支援
: : 原本我们的parser可以正确处理pragma中设定的参数
: : 例如以下片段,Current Support部分
: : https://gitlab.com/snippets/1985048
: : 目前我们是利用clang::Parser::ParseConstantExpression 去parse参数
: : http://tiny.cc/byukqz
: : 因此只要是constant expression都可以解出来,例如3 * 3
: : 我们现在想要增加支援static const class member
: : 理论上也可以透过template去做设定,例如以下片段Expected Support
: : https://gitlab.com/snippets/1985048
: : 想请问一下关於这个实做有没有什麽提示该从何处下手
: : 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.231.25.86 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1593469919.A.F0A.html
1F:推 threecia: 感谢大神分享好文 07/06 10:17