我已经使用 LLVM/Clang 及其中间表示(IR)有一段时间了。 我最近开始使用 GCC。 我想将 IR 位码转储到一个文件中,类似于 LLVM 中的 (-flto -save-temps flag)。 我可以在构建时使用“-fdump-tree-cfg-raw”标志获得 gimple IR,但 ...
我已经使用 LLVM/Clang 及其中间表示(IR)有一段时间了。 我最近开始使用 GCC。 我想将 IR 位码转储到一个文件中,类似于 LLVM 中的 (-flto -save-temps flag)。 我可以在构建时使用“-fdump-tree-cfg-raw”标志获得 gimple IR,但 ...
对于我的压轴年的项目我正在学习有关编译器技术,以及我目前正试图与GCC中间表示( 原GIMPLE)进行实验,并从不同的源文件(C,CPP和Java),使用GCC-得到控制流图5.4 。 到目前为止,我可以使用-fdump-tree-all-graph-raw生成*.004t.gimple和 ...
我需要减少代码中的分支数量。 有一个称为基准的基准,它具有一些代码,例如: 我在机器描述文件* .md中写了一个模式以避免分支: 在简单比较的情况下可以使用: GCC发出: 但是,如果我尝试同样的方法,但是使用了索引变量(数组):它将无法正常工作: GC ...
我必须做一些GIMPLE_CALL语句操作。 这个GIMPLE_CALL将有两个参数,例如:foo(a,b)。 我的目标是将此方法更改为具有三个参数的不同方法,例如zoo(a,b,c) 在我目前的方法中,GCC在编译示例源程序时崩溃。 当我所做的只是替换方法名称(即不更改参数号) ...
我一直在寻找有关编写GCC插件的在线资源。 我目前正在使用GCC版本7.3.0。 我试图编写一个简单的插件,其中包含一个将在PLUGIN_FINISH_TYPE上调用的PLUGIN_FINISH_TYPE 。 工作正常。 接下来,我试图编写一个使用“简单通行证”的插件,类似于此处列出 ...
我想看看GCC使用的SSA格式,所以我尝试了以下简单的测试程序: 用gcc -fdump-tree-all ac编译,得到ac016t.ssa其中包含以下内容: 大部分内容都很清楚,但argc_5(D)是什么意思? 它与int D.2186有什么int D.2186吗? ...
我已经使用命令-fdump-tree-all和-fdump-rtl-all生成了转储输出文件,并且得到了很多转储文件。 我已经读过,GIMPLE中的代码采用伪C语法,RTL转储文件的级别太低,无法理解。 有什么方法可以理解GIMPLE和RTL转储文件? 是否有任何软件可以将其转换为C代码或 ...
我想将树(特别是树的类型)以二进制形式保存在文件中,并且需要将此树加载到其他编译单元中。 例如: 我有一个main.c具有2个功能: 并且我想保存结构的类型( myTypeStruct )并将其加载到另一个涉及test.c的编译单元中,如下所示: 使用gcc插件,我想加载 ...
嗨,我一直在为gcc 4.8和4.9做gcc插件,但是我在gcc 5.1.0中遇到问题。 问题是我无法在此新gcc版本中注册GIMPLE通行证。 这是一个示例插件代码: 使用此插件编译某些文件时,应打印一些B和C,但没有打印任何内容。 与gcc 4.9的区别在于类型“ pa ...
我知道这很难做到,我应该避免这样做,但是我有这样做的理由。 我想在编译时修改某些字段声明的顺序,例如: 必须转向: 如果我选择交换i和c的顺序,我想知道如何更改具有tree的字段声明的location 有人知道我该怎么做吗? 谢谢 ! 我使用的是g ++ 4.9. ...
我正在使用GCC插件创建通行证,这是我的通行证: 所以对于定义的每个函数都执行toto() ,是否可以在执行toto()时获得所有函数的数量,我如何只对整个文件执行一次遍历,并使用FOR_EACH_FUNCTION()? ...
我需要为此使用gcc plugins打印程序的被调用函数的名称,我创建了一个通行证,该通行证将在ssa pass之后被调用,我已经启动了该插件,并且可以使用gimple_stmt_iterator在其语句上循环: 如何使用其gimple节点打印被调用函数的名称? 我是否还可以打印其他信 ...
我需要转储所有Gimple树(有点-fdump-tree-whatever)。 我为此目的创建了一个插件,但是我不确定应该如何访问Gimple树。 插件已插入GIMPLE_PASS: 我尝试使用gsi(gimple_stmt_iterator)遍历基本块,但是,我的转储不完整。 ...
我正在尝试做一个像这样的简单插件示例: 但是GIMPLE_PASS不是gcc-plugin.h的预定义事件,我知道我必须对tree-pass.h PLUGIN_PASS_MANAGER_SETUP和struct pass_data做些事情,但是我不知道具体如何,也没有找到任何示例。 ...
GIMPLE 是 GCC 系统的内部表示之一。 可以通过 -fdump-* 编译器参数转储 GIMPLE 或任何其他内部表示。 但是有没有办法编译转储的 GIMPLE 或任何其他表示? 似乎 GCC 没有 GIMPLE 前端。 我想做的是转储、分析、修改然后重新编译转储的 GIMPLE 以执行各种 ...
我正在进行代码优化并通过gcc内部。 我在我的程序中写了一个简单的表达式,然后检查了该表达式的gimple表示,我被卡住了为什么gcc已经这样做了。 说我有一个表达式: 然后在gimple表示中它将被转换为 我不知道为什么gcc这样做。 它是某种优化,如果是,那么任何人都可 ...
根据这篇文章, gcc在生成代码之前使用了几种中间格式。 我读到GIMPLE格式使用三个地址代码,这似乎是最容易使用的中间语言。 但是我需要更多细节,因为我需要构建一个可以获取中间代码并在生成最终代码之前插入一些代码的工具。 为此,我首先需要知道如何生成GIMPLE格式代码并将其保存在 ...