链接时间优化 (LTO)

链接时间优化 (LTO) 功能在 IBM® Open XL Fortran for AIX® 17.1.1中受支持。

IBM Open XL Fortran for AIX 17.1.1 生成的 LTO 信息与 IBM XL Fortran for AIX 16.1.0 的过程间分析 (IPA) 信息在以下方面不兼容:
  • IBM Open XL Fortran for AIX 17.1.1将以静默方式忽略由 IBM XL Fortran for AIX 16.1.0 或更低发行版创建的对象文件中的 IPA 信息。 
  • IBM XL Fortran for AIX 16.1.0 或更低发行版使用 -qipa=noobject 选项创建的对象文件仅包含 IPA 信息,因此它们在 IBM Open XL Fortran for AIX 17.1.1中不可用。 
  • IBM XL Fortran for AIX 16.1.0 或更低发行版无法读取 IBM Open XL Fortran for AIX 17.1.1 使用 -qlto 选项创建的 缺省情况下,对象 文件。
要使用 LTO 编译程序,请在编译步骤和链接步骤中指定 -qlto 选项:
  • 在编译步骤上指定 -qlto 时,编译器将生成 LLVM IR 而不是对象代码,以便在链接步骤上准备 LTO。
  • 当在链接步骤中指定了 -qlto 时,编译器会在调用链接器时添加额外的链接器选项,例如 -bplugin:<path-to-libLTO.so> 。 链接程序可以处理本机 XCOFF 对象和 LLVM IR 对象的混合,然后通过 libLTO.so 插件对 LLVM IR 对象调用 LTO 优化。
注意:
  • 使用 LTO 时请注意系统需求:
    表 1. LTO 的系统需求
    特征 AIX 7.2 的最低需求 AIX 7.3 的最低需求
    -qlto AIX 7.2 TL5 SP51 AIX 7.3 TL11
    -qfat-lto-objects AIX 7.2 TL5 SP5 AIX 7.3 TL1
    备注信息:
    1. 在 IBM AIX 7.2 TL5 SP4 或更低版本以及 IBM AIX 7.3 TL0 SP2 或更低版本上也支持 LTO; 但是,请注意,在使用 -qlto 编译的对象中定义的非缺省可视性符号不一定会保留以满足链接期间在没有 -qlto 的情况下编译的对象中的引用。
  • 当同时指定了 -qlto-qfat-lto-objects 选项时, IBM XL Fortran for AIX 16.1.0 和更低发行版可以读取由 IBM Open XL Fortran for AIX 17.1.1 创建的对象文件,但将以静默方式忽略对象文件中嵌入的 LTO 信息。
  • IBM Open XL Fortran for AIX 17.1.1中,不支持 -qlto=thin 选项。 LTO 方式只能设置为完整方式。

检测对象文件中的 LTO 使用情况

LTO 通过在编译步骤中将描述程序的 LLVM 位代码存储到对象文件中来工作。 在链接步骤期间, LLVM 位码用于执行链接时间优化。

检测非胖 LTO 对象文件中的 LTO 启用

缺省情况下,如果使用 -qlto 选项编译源文件,那么只会将 LLVM 位码存储到对象文件中。 您可以使用以下文件命令来识别以此方式构建的文件,该命令将对象文件标识为 LLVM IR 位码文件:
file file.o
file.o: LLVM IR bitcode

检测胖 LTO 对象文件中的 LTO 启用

如果使用 -qlto-qfat-lto-objects 选项编译源文件,那么生成的对象文件是同时包含本机对象代码和 LLVM 位码的 XCOFF 对象文件。 LLVM 位码存储在 XCOFF 对象文件的 .info 部分中,并带有 LLVMLTO标签。 您可以使用以下文件命令来识别以此方式构建的文件:
strings -a file.o | grep 'LLVMLTO'
LLVMLTO
或者,您可以拆解对象文件,并在 .info 部分中查找 LLVMLTO 。 以下是包含 LTO 信息的已拆解 .info 部分的示例:
/opt/IBM/openxlf/17.1.1/exe/ibm-llvm-objdump --section=.info --full-contents file.o
Contents of section .info:
0000 ffffffff 00000000 00000aa4 4c4c564d ............LLVM
0010 4c544f00 00000018 4243c0de 35140000 LTO.....BC..5...
注: 如果对象文件不包含 LTO 信息,那么 ibm-llvm-objdump 实用程序将发出一条警告消息,指示对象文件不包含 .info 部分,或者显示不包含 LLVMLTO.info 部分。

在链接期间检测 LTO

要检测 LTO 是否在链接时出现,请使用下列其中一种方法:
  • 在链接步骤期间指定 -bloadmap:<filename>-bnoquiet 选项,并在输出中查找 lto 。 将显示参与 LTO 的所有对象文件。
  • 在链接步骤期间指定 -bmap:<filename> 选项,并在生成的文件中查找 ld-temp.o 。 如果找到 ld-temp.o ,那么它指示某些源文件是使用 -qlto编译的,它们的相应对象文件参与了 LTO。