我可以为 gfortran 使用哪些 gcc 编译器选项

Posted

技术标签:

【中文标题】我可以为 gfortran 使用哪些 gcc 编译器选项【英文标题】:what gcc compiler options can I use for gfortran 【发布时间】:2017-09-06 16:19:29 【问题描述】:

我研究了Option Summary for gfortran,但没有发现用于检测整数溢出的编译器选项。然后我找到了 GCC(GNU Compiler Collection)标志选项-fsanitize=signed-integer-overflowhere,并在调用gfortran 时使用它。它有效——可以在运行时检测到整数溢出!

那么-fsanitize=signed-integer-overflow 在这里做什么呢?只是在gfortran 生成的机器代码中添加一些检查整数溢出的机器级片段?

GCC (GNU Compiler Collection) flag options 和 gfortran compiler options 之间是什么关系?我可以为gfortran, g++ 等使用哪些 gcc 编译器选项?

【问题讨论】:

【参考方案1】:

有 GCC - GNU Compiler Collection。它共享通用的后端和中间端,并具有不同语言的前端。例如 C、C++ 和 Fortran 的前端,通常由命令 gccg++gfortran 调用。

实际上更复杂,您可以在 Fortran 源代码上调用 gcc,在 C 源代码上调用 gfortran,除了链接的库(还有其他一些优点)之外,它的工作原理几乎相同。将根据文件扩展名或请求的语言调用适当的前端。

您可以查看几乎所有提到的前端的所有 GCC(不仅仅是gcc)标志。有某些特定于语言的标志。通常你会收到类似

的警告
gfortran -fcheck=all source.c
cc1: warning: command line option ‘-fcheck=all’ is valid for Fortran but not for C

但是文件会编译得很好,这个选项会被忽略,你会得到一个警告。请注意,它是一个 C 文件,由 gfortran 命令编译就可以了。

清理选项是 AFAIK,不是特定于语言的,并且适用于在 GCC 中实现的多种语言,对于一些明显特定于语言的检查可能有一些例外。尤其是您所询问的-fsanitize=signed-integer-overflow,它对 C 和 C++ 都非常有效。有符号整数溢出是 C 和 C++ 中未定义的行为,Fortran 标准不允许这样做(这实际上意味着相同,Fortran 只是使用不同的词)。

【讨论】:

抱歉,gcc 给您带来了困惑,我的意思是 GCC(问题已经更新)。如果使用了错误的标志选项,编译器会发出警告,这很好。但是,对于那些不抱怨的选项,有些不起作用!例如,-fsanitize=bounds-fsanitize=integer-divide-by-zero 都不适用于 gfortran。所以我想在调用编译器时仍然可以使用来自 GCC 的非语言特定标志选项,比如gfortran,但不应该依赖这些标志选项。只有那些为特定编译器记录的编译器选项才能保证工作。 GFortran 手册中提到的选项是在 GFortran 前端实现的,因此是特定于 Fortran 的。 GCC 手册包含特定于 C、C++ 的选项、通用选项以及仅对特定目标(后端)有效的选项。其中一些选项可能与 GFortran 完美配合,而其他选项可能不会。【参考方案2】:

这不是对您问题的非常精确的答案,但是啊哈!当学习编译器时,学习 gcc(GNU 编译器Collection),就像 llvm,是 three-stage compiler 的一个例子。

“前端”解析您感兴趣的任何语言的语法,并生成一个抽象语法树 (AST),它以独立于语言的方式表示您的程序。 然后“中间端”(可怕的名字,但“聪明的一点”)将该 AST 重组为另一个语义等效但更容易转换为机器代码的 AST。 然后“后端”将重组后的 AST 转换为一个或另一个处理器的汇编器,可能会在此过程中进行特定于平台的微优化。

这就是为什么(大量)gcc/llvm 选项对于(显然非常普遍)不同的语言出乎意料地通用的原因。一些选项是特定于 C、Fortran、Objective-C 或其他的,但它们中的大多数(可能)与中间和最后一位有关,因此对于 gcc/ 的所有语言都是通用的llvm 支持。

因此,各种选项特定于第 1、2 或 3 阶段,但可能不方便这样标记;但是,考虑到这一点,您可能会合理地直觉什么与您感兴趣的特定语言相关。


(出于这种原因,我会教条地声称 CC++FortranJavaPerlPython 本质上是一种语言,只有微不足道的句法和库细节来区分方言)。

【讨论】:

感谢您的深入解释!不好的是,当调用特定语言编译器时,例如gfortran,使用某些 GCC 标志选项时,编译器不会发出警告并且标志选项不起作用。

以上是关于我可以为 gfortran 使用哪些 gcc 编译器选项的主要内容,如果未能解决你的问题,请参考以下文章

与 gcc、g++ 和 gfortran 链接

在ubuntu上安装了gfortran编译器,出现了大问题哦!!求助啊!!

配置编译器(GCC和GFortran)

使用 GCC 和 GFORTRAN 进行矢量化

在gfortran中使用“pragma GCC优化”

在 centos 6 中安装编译器 gfortran