【问题标题】:Using GCC to output commented & annotated intermediate files使用 GCC 输出带注释和注释的中间文件
【发布时间】:2013-10-11 23:08:03
【问题描述】:

是否可以说服 GCC 发出一个中间文件,其中显示:

  1. cmets
  2. 原始出处
  3. 扩展的宏定义
  4. 编译器应用的优化
  5. 生成的 C 或 C++ 代码将转换为汇编代码?

我宁愿看到中间 C/C++ 而不是汇编程序,但如果它有足够的注释,我也可以只使用汇编程序。

我正在尝试对几乎完全由宏组成的库进行逆向工程以扩展它。我还想看看优化的效果,以便给编译器更多的机会做更多的优化。 (也就是说,看看我之前的尝试在哪里无效)

【问题讨论】:

  • 您已经知道哪些选项?我想你知道-E 用于预处理(因此扩展宏)和-S -g -fverbose-asm 用于某种半注释程序集。我不确定 GCC 是否可以在优化后发出中间语言代码,您可能想看看 Clang - 它编译为完全指定的 LLVM 中间语言,可能比 x86 asm 更容易阅读。 (我不认为任何编译器实际上对 C(++) 源代码进行了优化,因此会发出可读的 C(++) 优化代码。)
  • @us2012:我(部分)知道-save-temps,但由于我无法理解的原因,我无法让它工作。如,我找不到生成的文件。

标签: c++ linux gcc g++


【解决方案1】:

GCC 不是直接在 C++ 代码中应用优化,而是在一些内部语言无关格式(称为 GIMPLE)中应用优化,这些格式不能轻易地还原为 C++ 代码。

根据你的需要,你可以

  • 只需扩展宏:g++ -E

  • 或查看汇编器输出,您可以在其中看到哪一行 C++ 代码映射到哪个汇编器块:

    g++ -g ... && objdump -S output
    

    我不建议直接从 gcc(带 -S)输出汇编,因为生成的注解几乎没用。

【讨论】:

    【解决方案2】:

    1 和 2 显示在原始来源中。

    3 您可以使用 -E 获取具有扩展宏定义(实际上是完全预处理)的源代码。

    4 各个优化阶段的中间代码可以通过-da或各种-fdump-rtl-xxx、-fdump-tree-xxx等-fdump-xxx选项获得。

    这些都记录在这里:

    http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Debugging-Options.html#Debugging-Options

    5 我认为 GCC 不会进行源到源的转换,因此生成的 C++ 代码是原始 C++ 代码。

    这里描述了 GCC 所做的转换:

    http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多