第 1 章 armclang 命令行选项
本章总结了 armclang 支持的选项。
armclang 提供了许多命令行选项,包括大多数 Clang 命令行选项以及一些特定于 Arm 的选项。有关社区功能命令行选项的其他信息,请参阅 LLVM 编译器基础结构项目网站 http://llvm.org 上的 Clang 和 LLVM 文档。
注意
请注意以下几点:
• 两个 Arm 编译器版本之间生成的代码可能不同。
• 对于功能版本,可能存在显着的代码生成差异。
它包含以下部分:
• 1.1 支持级别定义(第 1-17 页)。
• 1.2 armclang 命令行选项摘要(第1-21 页)。
• 1.3 -C(第 1-25 页)。
• 1.4 -c(第 1-27 页)。
• 1.5 -D(第 1-28 页)。
• 1.6 -E(第 1-29 页)。
• 1.7 -e(第 1-30 页)。
• 1.8 -fbare-metal-pie(第 1-31 页)。
• 1.9 -fbracket-depth=N(第 1-32 页)。
• 1.10 -fcommon、-fno-common(第 1-33 页)。
• 1.11 -fdata-sections、-fno-data-sections(第 1-34 页)。
• 1.12 -ffast-math、-fno-fast-math(第 1-35 页)。
• 1.13 -ffp-mode(第 1-36 页)。
• 1.14 -ffunction-sections、-fno-function-sections(第 1-38 页)。
• 1.15 @file(第 1-40 页)。
• 1.16 -fldm-stm、-fno-ldm-stm(第 1-41 页)。
• 1.17 -fno-inline-functions(第 1-42 页)。
• 1.18 -flto(第 1-43 页)。
• 1.19 -fexceptions、-fno-exceptions(第 1-44 页)。
• 1.20 -fomit-frame-pointer、-fno-omit-frame-pointer(第 1-45 页)。
• 1.21 -fropi、-fno-ropi(第 1-46 页)。
• 1.22 -fropi-lowering、-fno-ropi-lowering(第 1-47 页)。
• 1.23 -frwpi、-fno-rwpi(第 1-48 页)。
• 1.24 -frwpi-lowering、-fno-rwpi-lowering(第 1-49 页)。
• 1.25 -fshort-enums、-fno-short-enums(第 1-50 页)。
• 1.26 -fshort-wchar、-fno-short-wchar(第 1-52 页)。
• 1.27 -fstrict-aliasing、-fno-strict-aliasing(第 1-53 页)。
• 1.28 -fvectorize、-fno-vectorize(第 1-54 页)。
• 1.29 -ftrapv(第 1-55 页)。
• 1.30 -fwrapv(第 1-56 页)。
• 1.31 -g、-gdwarf-2、-gdwarf-3、-gdwarf-4(第 1-57 页)。
• 1.32 -I(第 1-58 页)。
• 1.33 -include(第 1-59 页)。
• 1.34 -L(第 1-60 页)。
• 1.35 -l(第 1-61 页)。
• 1.36 -M、-MM(第 1-62 页)。
• 1.37 -MD、-MMD(第 1-63 页)。
• 1.38 -MF(第 1-64 页)。
• 1.39 -MG(第 1-65 页)。
• 1.40 -MP(第 1-66 页)。
• 1.41 -MT(第 1-67 页)。
• 1.42 - 3 月(第 1-68 页)。
• 1.43 -marm(第 1-70 页)。
• 1.44 -mbig-endian(第 1-71 页)。
• 1.45 -mcmse(第 1-72 页)。
• 1.46 -mcpu(第 1-74 页)。
• 1.47 -mexecute-only(第 1-78 页)。
• 1.48 -mfloat-abi(第 1-79 页)。
• 1.49 -mfpu(第 1-80 页)。
• 1.50 -mimplicit-it(第 1-82 页)。
• 1.51 -mlittle-endian(第 1-83 页)。
• 1.52 -mno-neg-immediates(第 1-84 页)。
• 1.53 -munaligned-access、-mno-unaligned-access(第 1-86 页)。
• 1.54 -mthumb(第 1-87 页)。
• 1.55 -nostdlib(第 1-88 页)。
• 1.56 -nostdlibinc(第 1-89 页)。
• 1.57 -o(第 1-90 页)。
• 1.58 -O(第 1-91 页)。
• 1.59 -pedantic(第 1-93 页)。
• 1.60 -pedantic-errors(第 1-94 页)。
• 1.61 -S(第 1-95 页)。
• 1.62 -save-temps(第 1-96 页)。
• 1.63 -std(第 1-97 页)。
• 1.64 --target(第 1-99 页)。
• 1.65 -U(第 1-100 页)。
• 1.66 -u 第 1-101 页。
• 1.67 -v(第 1-102 页)。
• 1.68 --version(第 1-103 页)。
• 1.69 --version_number(第 1-104 页)。
• 1.70 --vsn(第 1-105 页)。
• 1.71 -W(第 1-106 页)。
• 1.72 -Wl(第 1-107 页)。
• 1.73 -Xlinker(第 1-108 页)。
• 1.74 -x(第 1-109 页)。
• 1.75 -###(第 1-110 页)。
1.1 支持级别定义
这描述了对各种 Arm Compiler 6 功能的支持级别。
Arm Compiler 6 基于 Clang 和 LLVM 技术构建。因此,它具有比文档中描述的产品特性集更多的功能。以下定义阐明了对这些特性所期望的功能的支持和保证级别。
Arm 欢迎有关使用所有 Arm Compiler 6 功能的反馈,并努力支持用户达到适合该功能的水平。您可以通过 https://developer.arm.com/support 联系支持。
文档中的标识
Arm Compiler 6 文档中记录的所有功能都是产品功能,除非明确说明。明确说明了非产品功能的限制。
产品特性
产品特性适用于生产环境。该功能经过充分测试,预计在功能和更新版本中保持稳定。
• Arm 努力提前通知产品特性的重大功能更改。
• 如果您有支持和维护合同,Arm 将为使用所有产品功能提供全面支持。
• Arm 欢迎对产品功能的反馈。
• Arm 遇到或发现的任何产品功能问题都会考虑在 Arm 编译器的未来版本中进行修复。
除了完全支持的产品功能外,某些产品功能只是 alpha 或 beta 质量。
Beta 产品功能
Beta 产品功能已实现完整,但尚未经过充分测试以被视为适合在生产环境中使用。
Beta 产品功能用 [BETA] 表示。
• Arm 努力记录对 beta 产品功能的已知限制。
• Beta 产品功能有望最终成为 Arm Compiler 6 未来版本中的产品功能。
• Arm 鼓励使用测试版产品功能,并欢迎提供反馈。
• Arm 遇到或发现的任何与 beta 产品功能有关的问题都将考虑在 Arm 编译器的未来版本中进行修复。
Alpha 产品功能
Alpha 产品功能实现不完整,在未来版本中可能会发生变化,因此稳定性水平低于 Beta 产品功能。
Alpha 产品功能用 [ALPHA] 表示。
• Arm 努力记录 alpha 产品功能的已知限制。
• Arm 鼓励使用 alpha 产品功能,并欢迎就这些功能提供反馈。
• Arm 遇到或发现的任何与 alpha 产品功能有关的问题都会考虑在 Arm 编译器的未来版本中进行修复。
社区功能
Arm Compiler 6 基于 LLVM 技术构建,并尽可能保留该技术的功能。这意味着 Arm 编译器中还有其他可用的功能,这些功能未在文档中列出。这些附加功能称为社区功能。有关这些社区功能的信息,请参阅 Clang/LLVM 项目的文档。
在文档中引用社区功能的地方,它们用 [COMMUNITY] 表示。
• Arm 不对这些功能的质量水平或功能程度做出任何声明,除非在本文档中明确说明。
• 功能可能会在功能版本之间发生显着变化。
• Arm 不保证社区功能将在更新版本中保持功能,尽管预计不太可能发生变化。
某些社区功能在未来可能会成为产品功能,但 Arm 没有为此提供路线图。 Arm 有兴趣了解您对这些功能的使用情况,并欢迎提供反馈。
Arm 会尽最大努力支持客户使用这些功能,除非这些功能不受支持。
Arm 接受有关这些功能的缺陷报告,但不保证这些问题将在未来的版本中得到修复。
社区功能使用指南
在评估社区功能发挥功能的可能性时,需要考虑几个因素:
• 下图显示了 Arm Compiler 6 工具链的结构:
图 1-1 Arm Compiler 6 中的集成边界。
虚线框是工具链组件,这些组件之间的任何交互都是集成边界。跨越集成边界的社区特性可能在功能上有很大的限制。例外情况是,如果交互被编入 Arm Compiler 6 支持的标准之一。请参阅 Arm® 架构的应用程序二进制接口 (ABI)。不跨越集成边界的社区功能更有可能按预期工作。
• 主要在针对Linux 或BSD 等托管环境时使用的功能在针对裸机环境时可能有很大的限制,或者可能不适用。
• 编译器功能的Clang 实现,尤其是那些在其他工具链中已经存在很长时间的功能,很可能已经成熟。新特性的功能,例如对新语言特性的支持,可能不太成熟,因此更可能具有有限的功能。
不支持的功能
对于产品和社区功能类别,已知特定功能和用例无法正常运行,或者不适合与 Arm Compiler 6 一起使用。
文档中说明了产品功能的限制。 Arm 无法提供不支持的功能或社区功能用例的详尽列表。社区功能的已知限制在第 1-17 页的社区功能中列出。
已知不受支持的功能列表
以下是不受支持的功能的不完整列表,并且可能会随时间而变化: • 不支持 Clang 选项 -stdlib=libstdc++。
• 当与标准C++ 库链接时,局部变量的C++ 静态初始化不是线程安全的。对于线程安全,您必须提供您自己的线程安全函数实现,如标准 C++ 库实现定义中所述。
注意 此限制不适用于 [ALPHA] 支持的多线程 C++ 库。
• 不支持使用 C11 库功能。
• 不支持任何专门与非 Arm 架构相关的社区功能。
• 不支持对实现早于 Armv7 或 Armv6-M 架构的目标进行编译。
• 由于当前 Arm C 库的限制,AArch64 状态不支持 long double 数据类型。
• 由于当前 Arm C 库的限制,不支持复数。
1.2 armclang 命令行选项总结
这里提供了 Arm 编译器 6 支持的 armclang 命令行选项的总结。
命令行选项要么影响编译和汇编,要么只影响编译。仅影响编译而不影响 armclang 集成汇编器的命令行选项在表中显示为仅编译。影响编译和汇编的命令行选项在表中显示为编译和汇编。
注意
影响汇编的命令行选项适用于 armclang 集成汇编器,不适用于 armasm。这些选项影响内联汇编和汇编语言源文件。
注意
汇编语言源文件是使用 armclang 集成汇编器汇编的。可以包含内联汇编代码的 C 和 C++ 语言源文件是使用 armclang 编译器编译的。仅显示为 Compilation 的命令行选项不会影响集成汇编器,但它们会影响内联汇编代码。
表 1-1 armclang 命令行选项
选项 描述 编译或汇编
-C 在预处理输出中保留注释。 编译和组装。
-c 只执行编译步骤,不调用armlink。 编译和组装。
-D 定义一个预处理器宏。 编译和组装。
-E 只执行预处理步骤,不编译或链接。 编译和组装。
-e 指定映像的唯一初始入口点。 编译和组装。
-fbare-metal-pie 生成与位置无关的代码。 仅编译。
-fbracket-depth 设置嵌套括号、方括号和大括号的限制。 编译和组装。
-fcommon, -fno-common 为暂定定义生成通用的零初始化值。 仅编译。
-fdata-sections, -fno-data-sections 启用或禁用为源文件中的每个变量生成一个 ELF 节。 仅编译。
-ffast-math, -fno-fast-math 启用或禁用主动浮点优化。 仅编译。
-ffp-mode 指定浮点标准一致性。 仅编译。
-ffunction-sections, -fno-function-sections 启用或禁用为源文件中的每个函数生成一个 ELF 节。 仅编译。
@file 从文件中读取命令行选项列表。 编译和组装。
-fldm-stm, -fno-ldm-stm 启用或禁用 LDM 和 STM 指令的生成。仅限 AArch32。 仅编译。
-fno-inline-functions 在优化级别 -O2 和 -O3 禁用函数的自动内联。 仅编译。
-flto 启用链接时间优化,并输出包装在 ELF 文件中的位码以进行链接时间优化。 仅编译。
-fexceptions, -fno-exceptions 启用或禁用支持 C++ 异常所需的代码生成。 仅编译。
-fomit-frame-pointer, -fno-omit-frame-pointer 在函数调用期间启用或禁用堆栈帧指针的存储。 仅编译。
-fropi, -fno-ropi 启用或禁用只读位置无关 (ROPI) 代码的生成。 仅编译。
-fropi-lowering, -fno-ropi-lowering 在生成只读位置无关 (ROPI) 代码时启用或禁用运行时静态初始化。 仅编译。
-frwpi, -fno-rwpi 启用或禁用读写位置无关 (RWPI) 代码的生成。 仅编译。
-frwpi-lowering, -fno-rwpi-lowering 在生成读写位置无关 (RWPI) 代码时启用或禁用运行时静态初始化。 仅编译。
-fshort-enums, -fno-short-enums 允许或不允许编译器将枚举类型的大小设置为可以容纳所有枚举值的最小数据类型。 仅编译。
-fshort-wchar, -fno-short-wchar 将 wchar_t 的大小设置为 2 或 4 个字节。 仅编译。
-fstrict-aliasing, -fno-strict-aliasing 指示编译器应用或不应用可用的最严格的别名规则。 仅编译。
-fvectorize, -fno-vectorize 启用或禁用直接从优化级别 -O1 和更高级别的 C 或 C++ 代码生成高级 SIMD 矢量指令。 仅编译。
-ftrapv 指示编译器为加法、减法和乘法运算的有符号算术溢出生成陷阱。 仅编译。
-fwrapv 指示编译器假定加法、减法和乘法的有符号算术溢出使用二进制补码表示形式进行换行。 仅编译。
-g、-gdwarf-2、-gdwarf-3、-gdwarf-4 添加调试表以进行源级调试。 编译和组装。
-I 将指定目录添加到搜索位置列表以查找包含文件。 编译和组装。
-include 在编译开始时包含指定文件的源代码。 仅编译。
-L 指定链接器搜索用户库的路径列表。 仅编译。
-l 将指定的库添加到搜索到的库列表中。 仅编译。
-M, -MM 生成适合 make 实用程序使用的 makefile 依赖规则列表。 编译和组装。
-MD, -MMD 编译或汇编源文件并生成适合 make 实用程序使用的 makefile 依赖规则列表。 编译和组装。
-MF 为 -M 和 -MD 选项生成的 makefile 依赖规则指定文件名。 仅编译。
-MG 打印头文件的依赖行,即使头文件丢失。 仅编译。
-MP 发出虚拟依赖规则,以解决如果您删除头文件而不对 makefile 进行相应更新而生成的错误。 仅编译。
-MT 更改依赖生成选项生成的 makefile 依赖规则的目标。 编译和组装。
-march 以架构配置文件为目标,生成在该架构的任何处理器上运行的通用代码。 编译和组装。
-marm 请求编译器以 A32 指令集为目标。 仅编译。
-mbig-endian 使用字节不变的大端 (BE-8) 数据生成适用于 Arm 处理器的代码。 编译和组装。
-mcmse 为 Armv8-M 安全扩展的安全状态生成代码。 仅编译。
-mcpu 以特定处理器为目标,为该特定处理器生成优化代码。 编译和组装。
-mexecute-only 生成只执行代码,并防止编译器生成对代码段的任何数据访问。 仅编译。
-mfloat-abi 指定是使用硬件指令还是软件库函数进行浮点运算,以及使用哪些寄存器来传递浮点参数和返回值。 仅编译。
-mfpu 指定目标 FPU 架构,即目标上可用的浮点硬件。 编译和组装。
-mimplicit-it 如果在 IT 块之外有条件指令,则指定集成汇编器的行为。 编译和组装。
-mlittle-endian 使用 little-endian 数据生成适用于 Arm 处理器的代码。 编译和组装。
-mno-neg-immediates 禁止用有效等效指令替换无效指令,这些指令使用指定立即数的逻辑逆或负值。 编译和组装。
-munaligned-access, -mno-unaligned-access 启用或禁用对 Arm 处理器上数据的非对齐访问。 仅编译。
-mthumb 请求编译器以 T32 指令集为目标。 仅编译。
-o 指定输出文件的名称。 编译和组装。
-O 指定编译源文件时使用的优化级别。 仅编译。
-S 输出编译器生成的机器码的反汇编。 仅编译。
-save-temps 指示编译器从指定的 C/C++ 文件生成中间程序集文件。 仅编译。
-std 指定要编译的语言标准。 仅编译。
--target 为指定的目标三元组生成代码。 编译和组装。
-U 删除指定预处理器宏的任何初始定义。 仅编译。
-u 防止删除未定义的指定符号。 编译和组装。
-v 显示调用编译器和子工具(如 armlink)的命令,并执行这些命令。 编译和组装。
--version 显示与 --vsn 相同的信息。 编译和组装。
--version_number 显示您正在使用的 armclang 版本。 编译和组装。
--vsn 显示版本信息和许可证详细信息。 编译和组装。
-W 控制诊断。 仅编译。
-Wl 指定在编译后执行链接步骤时传递给链接器的链接器命令行选项。 仅编译。
-Xlinker 指定在编译后执行链接步骤时传递给链接器的链接器命令行选项。 仅编译。
-x 指定源文件的语言。 编译和组装。
-### 显示调用编译器和子工具(例如 armlink)的命令,而不执行这些命令。 编译和组装。
1.2 ~ 1.75 略
详细命令行描述请参见《armclang Reference Guide》