如何在GCC中获取C程序的抽象语法树

4

如何在gcc中获取C程序的抽象语法树?
我正在尝试自动向输入的C程序插入OpenMP编译指令。
我需要分析嵌套的for循环以查找依赖项,以便插入适当的OpenMP编译指令。
因此,基本上我想做的是遍历和分析输入C程序的抽象语法树。
我该如何实现这一点?


3
他们说相比于GCC,Clang更适合这项任务。不过我都没有尝试过,所以不能保证。 - n. m.
但是我只需要使用gcc。 - Vishal Vijay
3
这听起来像是一种人为的限制。为什么你必须只使用GCC? - Ira Baxter
如果您致力于GCC,这里有另一种可能性,虽然超出了您的范围,但在其他方面可能会有所帮助... http://rosecompiler.org/ - High Performance Mark
2个回答

1
你需要完整的数据流来查找“依赖项”。然后,您将需要实际“插入”OpenMP调用。
您需要一个程序转换系统。GCC可能具有依赖信息,但对于定制项目而言,它非常难以使用。其他人提到了Clang和Rose。Clang可能是一个不错的选择,但自定义分析/转换不是其主要目的。Rose旨在支持自定义工具,但我认为它在实践中使用起来相当复杂,因为它使用了EDG前端,该前端并未设计用于支持转换。
[以下文本被管理员删除。我已经恢复了它,因为它是此任务的有效转换系统之一。我对它的责任绝不会减少其作为对OP有用答案的价值。]
我们的DMS软件重构工具包,配备C前端,专门设计为程序转换系统。它具有完整的数据流分析(包括指针分析、调用图构建和范围分析),并以合理的方式与AST相结合。它提供源到源的重写规则,使得可以以表面语法形式表达AST中的更改;您可以阅读变换而不是检查一堆过程性代码。通过修改AST,DMS可以重新生成包括可编译注释在内的源代码。

OP明确表示他只想使用gcc... 这似乎是一个不好的选择,但这是他的选择。 - user18428
@Ira Baxter 感谢您提供的信息。我会和我的团队讨论并稍后回复您。 - Vishal Vijay

0

gccxml 不会为函数体生成 AST 或者任何东西。事实上, OP 明显想要他的循环代码的 AST。 - Ira Baxter
1
你说得对,感谢指出。我编辑了答案,指向一个可以转储函数体的gccxml分支。 - user18428
好的,那么他如何使用这些AST获取计算之间的依赖关系呢? - Ira Baxter
显然不是一项容易的任务。我猜你所推广的产品会很好地完成这项工作。 - user18428
DMS内置了各种依赖分析,并提供了构建其他依赖分析的框架。即使有良好的依赖分析基础,OP想要做的事情也不容易。在我看来,如果没有这个基础,他可能会感到绝望。 - Ira Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接