LLVM初探

LLVM是编译器的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序编译时间,链接时间,运行时间,以及空闲时间,对开发这保持开放,并兼容已有的脚本(来自百度百科),它的全称是Low Level Virtual Machine

LLVM的优势

  • 以下来自机翻
  • LLVM使用具有严格定义语义的简单低级语言。
  • 它包括C和C++前端。Java、Scheme和其他语言的前端正在开发中。
  • 它包括一个积极的优化器,包括标量、过程间、概要文件驱动和一些简单的循环优化。
  • 它支持编译模型,包括链接时间、安装时间、运行时和脱机优化。
  • LLVM完全支持精确的垃圾收集。
  • LLVM代码生成器相对容易重定目标,并且使用了强大的目标描述语言。
  • LLVM有大量的文档,并且托管了各种各样的项目。
  • 此外,LLVM还提供了使开发更容易的工具。
  • LLVM正在积极发展,并在不断扩展、增强和改进。
  • LLVM在OSI批准的“Apache许可证版本2.0”许可证下免费提供。

LLVM适合人群

1.对C和C ++程序的编译时,链接时(过程间)和运行时转换感兴趣的编译器研究人员;
2.对可移植的,与语言无关的指令集和编译框架感兴趣的虚拟机研究人员
3.对编译器/硬件技术感兴趣的架构研究员
4.对静态分析或插桩技术感兴趣的安全研究人员
5.想要快速开发编译器原型的教师或开发人员
6.希望获得更好性能的最终用户开发者

LLVM架构

clang介绍

前面提到过LLVM项目的一个子项目,基于LLVM架构的C/C++/Objective-C编译器前端,它具有以下优点。

  1. 编译速度快,在部分平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
  2. 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
  3. 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用,如Xcode集成了Clang的很多命令
  4. 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告,类比Xcode编译时生成的中间产物文件,如诊断信息。
  5. 设计清晰简单,容易理解,易于扩展增强.

Clang与LLVM之间的关系

在LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成),在iOS的构建中,一般把clang作为编译器的前端,LLVM作为后端,负责优化代码,生成不同的平台的目标代码。
e

工作流程:
1.目标代码经过clang,进行词法,语法分析,语议分析,生成出版的中间代码
2.然后经过LLVM后端对代码结构进行优化,最终生成目标代码

在Xcode中新建一个OC工程,使用如下命令编译main.c文件

  • 查看工作流程 shell xxx@xxxx Test % clang -ccc-print-phases main.m
    0: input, "main.m", objective-c. 输入`main.m`文件
    1: preprocessor, {0}, objective-c-cpp-output //预备编译,宏定义的代码替换
    2: compiler, {1}, ir //编译器编译,生成中间代码
    3: backend, {2}, assembler //后端生成目标代码
    4: assembler, {3}, object //汇编
    5: linker, {4}, image //链接镜像文件(动态库)
    6: bind-arch, "x86_64", {5}, image //编译成指定架构,这里采用的是模拟器测试
  • 词法分析测试: 代码会被分割为一个个很小的单元,检测语法格式,如匹配大括号是否配对,是否缺少分号结尾。
    执行clang -fmodules -E -Xclang -dump-tokens main.m
  • 语法树-AST: (Abstract Syntax Tree)
    执行clang -fmodules -fsyntax-only -Xclang -ast-dump main.m,这里按照递归的方式列出了每个函数和变量的解析(翻译)过程。

LLVM IR

  • LLVM的中间代码(IR)有以下3种表示方式,
  • text:便于阅读的文本格式,类似于汇编语言,拓展名.ll, $ clang -S -emit-llvm main.m
  • memory:内存格式
  • bitcode:二进制格式,拓展名.bc, clang -c -emit-llvm main.m

LLVM和Clang在Xcode中的应用

  • LLVM overview

  • Clang overview

  • LLVM Optimize

  • LLVM Code generate overview

  • 其他工具的扩展支持

  • 可以通过man clang来查看它的帮助命令,在Xcode点击三角形Run的时候也可以在控制台看到构建的各个步骤.

LLVM LTO Optimize

  • LTO:(link Time Optimize), 优化方式主要有以下三种
  • 不同文件的inline函数优化
  • 清理不需要的代码
  • 对程序全局进行优化
  • 传统的link方式,多个文件有交集
  • LTO优化: 相比传统的link,主要是对.o文件进行优化后,附加一些优化信息,再进行link

  • Apple内部的构建已经开始广泛使用

    • 通常比常规版本中的可执行文件快10%(官方数据提供)
    • 通过文件引导优化,Profile Guide Optimize(PGO),按照配置进行优化
      • 将频繁调用且依赖性较强的函数专为内联函数
      • 虚函数的调用推测,改为直接调用
      • 寄存器分配优化
      • 条件分支的优化,如switch,将高概率出现的值单独拧出来处理
      • 函数布局,将类似指令,功能相关的函数放到相同的section,尽量安排在一起
      • 总的来说,就是提高CPU的的缓存命中率和分支预测的成功率。
    • 优化大小时减少代码大小
  • LTO优化需在编译时间和运行性能之间做权衡,优化过度会造成,在debug info的时候非常不方便

    • 编译时大量的内存开销
    • 优化不是并行运行的
    • 增量构建的重复的工作
  • 新的LTO又进行了如下改进,可以看到上面的lto.o文件被拆分了多个,避免了局部修改带来的开销

    • 分析和内联函数不合并对象文件
    • 提升编译速度
    • 二次编译有链接器缓存,避免再次重新链接。如Xcode中的Module Cache
  • 开启LTO优化
    一般使用incremental增量式的LTO,优化会影响debug效率,最好不要在开发环境下启用

    如果需要在debug环境下开启,则建议将Debug Information Level改成Line tables only

Code Size Improvements

指定LLVM/clang的优化级别

  • 根据官方推荐,使用-Os具有最大收益,代码执行效率的提升和可执行文件的体积最优

  • 设置参数

    SWIFT_OPTIMIZATION_LEVEL = "-O"
    GCC_OPTIMIZATION_LEVEL = s
    


  • size command检测优化的结果

  • __TEXT具体包含的内容

  • 更加详细的信息

  • 组合优化

LLVM bitcode

  • 它是一种特殊的中间代码,让应用支持Bitcode,将多个arm架构发布到AppStore,当用户在下载ipa包的时候,appStore根据用户手机的具体arm架构将ipa的的bitcode转换成用户手机目标平台的机器码,减少内存。
  • 编译过程

参考链接

https://devstreaming-cdn.apple.com/videos/wwdc/2019/409t7ah0xy3ocqab4a/409/409_whats_new_in_clang_and_llvm.pdf?dl=1
https://devstreaming-cdn.apple.com/videos/wwdc/2016/405i2ilotov3bazyei1/405/405_whats_new_in_llvm.pdf?dl=1
https://llvm.zcopy.site/
https://gclxry.com/visual-studio-profile-guided-optimization/
https://www.jianshu.com/p/1367dad95445
https://llvm.zcopy.site/post/61090.html
https://llvm.org/
https://llvm.org/docs/

clang命令速查表


OVERVIEW: clang LLVM compiler

USAGE: clang [options] file...

OPTIONS:
  -###                    Print (but do not run) the commands to run for this compilation
  --analyzer-output <value>
                          静态分析器报告输出格式 (html|plist|plist-multi-file|plist-html|text).
  --analyze               运行静态分析仪
  -arcmt-migrate-emit-errors                提交arc错误,尽管迁移可以解决错误
  -arcmt-migrate-report-output <value>              报告输出
  -B <dir>                将文件`dir`隐式的添加到搜索路径中,方便二进制查找
  -CC                     在预处理中包含内部宏的注释
  -cfguard                发出windows控制流所需要的保护表
  -cl-denorms-are-zero    OpenCL only. Allow denormals to be flushed to zero.
  -cl-fast-relaxed-math   OpenCL only. Sets -cl-finite-math-only and -cl-unsafe-math-optimizations, and defines __FAST_RELAXED_MATH__.
  -cl-finite-math-only    OpenCL only. Allow floating-point optimizations that assume arguments and results are not NaNs or +-Inf.
  -cl-fp32-correctly-rounded-divide-sqrt
                          OpenCL only. Specify that single precision floating-point divide and sqrt used in the program source are correctly rounded.
  -cl-kernel-arg-info     OpenCL only. Generate kernel argument metadata.
  -cl-mad-enable          OpenCL only. Allow use of less precise MAD computations in the generated binary.
  -cl-no-signed-zeros     OpenCL only. Allow use of less precise no signed zeros computations in the generated binary.
  -cl-opt-disable         OpenCL only. This option disables all optimizations. By default optimizations are enabled.
  -cl-single-precision-constant
                          OpenCL only. Treat double precision floating-point constant as single precision constant.
  -cl-std=<value>         OpenCL language standard to compile for.
  -cl-strict-aliasing     OpenCL only. This option is added for compatibility with OpenCL 1.0.
  -cl-uniform-work-group-size
                          OpenCL only. Defines that the global work-size be a multiple of the work-group size specified to clEnqueueNDRangeKernel
  -cl-unsafe-math-optimizations
                          OpenCL only. Allow unsafe floating-point optimizations.  Also implies -cl-no-signed-zeros and -cl-mad-enable.
  --config <value>        Specifies configuration file
  --cuda-compile-host-device
                          Compile CUDA code for both host and device (default).  Has no effect on non-CUDA compilations.
  --cuda-device-only      Compile CUDA code for device only
  --cuda-gpu-arch=<value> CUDA GPU architecture (e.g. sm_35).  May be specified more than once.
  --cuda-host-only        Compile CUDA code for host only.  Has no effect on non-CUDA compilations.
  --cuda-include-ptx=<value>
                          Include PTX for the following GPU architecture (e.g. sm_35) or 'all'. May be specified more than once.
  --cuda-noopt-device-debug
                          Enable device-side debug info generation. Disables ptxas optimizations.
  --cuda-path-ignore-env  Ignore environment variables to detect CUDA installation
  --cuda-path=<value>     CUDA installation path
  -cxx-isystem <directory>
                          向C++系统添加目录包括搜索路径
  -C                      在预处理输出中包含注释
  -c                      只运行预处理、编译和组装步骤
  -dD                     除正常输出外,以-E模式打印宏定义
  -dependency-dot <value> 要写入点格式标头依赖项的文件名 -依赖文件<value>
  -dI                     除了正常输出外,在-E模式下打印include指令
  -dM                     以-E模式而不是正常输出打印宏定义
  -D <macro>=<value>      定义宏变量
  -emit-ast               ***搜集输入源文件的语法分析树文****
  -emit-llvm              对汇编程序和对象文件使用LLVM表示
  -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang<value>
                          Trivial automatic variable initialization to zero is only here for benchmarks, it'll eventually be removed, and I'm OK with that because I'm only using it to benchmark
  -E                      只运行预处理器
  -faddrsig               发出地址重要性表
  -faligned-allocation    启用C++ 17对齐的分配函数
  -fallow-editor-placeholders  将编辑器占位符视为有效源代码
  -fansi-escape-codes     使用ANSI转义代码进行诊断
  -fapinotes-cache-path=<directory>  不执行任何操作;API注释不再与模块分开缓存
  -fapinotes-modules      启用基于模块的外部API notes支持
  -fapinotes-swift-version=<version>  指定筛选API注释时要使用的Swift版本
  -fapinotes              启用外部API notes支持
  -fapple-kext            使用苹果的内核扩展ABI
  -fapple-link-rtlib      强制链接clang builtins运行库
  -fapple-pragma-pack     启用Apple gcc兼容的pragma包处理
  -fapplication-extension 将代码限制为可用于应用程序扩展的代码
  -fblocks                启用“块”语言功能
  -fborland-extensions    接受Borland编译器支持的非标准构造
  -fbuild-session-file=<file>
                          ***使用<file>的最后修改时间作为构建会话时间戳 ***
  -fbuild-session-timestamp=<time since Epoch in seconds>
                          当前生成会话开始的时间
  -fbuiltin-module-map    ***加载clang 内置的模块映射文件***
  -fc++-static-destructors 启用C++静态析构函数注册(默认)
  -fcall-saved-x10        Make the x10 register call-saved (AArch64 only)
  -fcall-saved-x11        Make the x11 register call-saved (AArch64 only)
  -fcall-saved-x12        Make the x12 register call-saved (AArch64 only)
  -fcall-saved-x13        Make the x13 register call-saved (AArch64 only)
  -fcall-saved-x14        Make the x14 register call-saved (AArch64 only)
  -fcall-saved-x15        Make the x15 register call-saved (AArch64 only)
  -fcall-saved-x18        Make the x18 register call-saved (AArch64 only)
  -fcall-saved-x8         Make the x8 register call-saved (AArch64 only)
  -fcall-saved-x9         Make the x9 register call-saved (AArch64 only)
  -fcf-protection=<value> 控制流程结构保护。选项:return、branch、full、none。
  -fcf-protection         允许 cf-protection 在 'full' 模式
  -fchar8_t               允许 C++ 内置的类型 char8_t
  -fclang-abi-compat=<version>
                          尝试匹配Clang<version>
  -fcolor-diagnostics     在诊断中使用颜色
  -fcomment-block-commands=<arg>
                          将<arg>中的每个逗号分隔参数视为文档注释块命令
  -fcomplete-member-pointers
                          如果成员指针基类型在Microsoft ABI下是重要的,则要求它们是完整的
  -fcoroutines-ts         启用对C++协同程序TS的支持
  -fcoverage-mapping      生成覆盖率映射以启用代码覆盖率分析
  -fcs-profile-generate=<directory>
                          生成插入指令的代码以将上下文相关的执行计数收集到<directory>/默认值.proflow(被LLVM_PROFILE_FILE env var覆盖)
  -fcuda-approx-transcendentals
                          Use approximate transcendental functions
  -fcuda-flush-denormals-to-zero
                          Flush denormal floating point values to zero in CUDA device mode.
  -fcuda-short-ptr        使用32位指针访问常量/本地/共享地址空间。
  -fcxx-exceptions        启用C++异常
  -fdata-sections         将每个数据放入自己的部分(仅限ELF)
  -fdebug-compilation-dir <value>
                          要嵌入调试信息中的编译目录。
  -fdebug-info-for-profiling
                          发出额外的调试信息以使示例配置文件更准确。
  -fdebug-macro           发出宏调试信息
  -fdebug-prefix-map=<value>
                          在调试信息中重新映射文件源路径
  -fdebug-ranges-base-address
                          在调试范围中使用DWARF基地址选择项
  -fdebug-types-section   将调试类型放入它们自己的部分(仅限ELF)
  -fdeclspec              允许declspec作为关键字
  -fdelayed-template-parsing
                          解析翻译单元末尾的模板化函数定义
  -fdelete-null-pointer-checks
                          将空指针的使用视为未定义的行为。
  -fdiagnostics-absolute-paths
                          在诊断中打印绝对路径
  -fdiagnostics-hotness-threshold=<number>
                          如果优化备注没有至少此配置文件计数,则阻止输出优化备注
  -fdiagnostics-parseable-fixits
                          以机器可解析的形式打印修复它
  -fdiagnostics-print-source-range-info
                          以数字形式打印源范围跨度
  -fdiagnostics-show-hotness
                          Enable profile hotness information in diagnostic line
  -fdiagnostics-show-note-include-stack
                          *** 显示诊断注释的包含堆栈 ***
  -fdiagnostics-show-option
                          使用可映射诊断打印选项名称
  -fdiagnostics-show-template-tree
                          打印不同模板的模板比较树
  -fdigraphs              启用替代令牌表示 '<:', ':>', '<%', '%>', '%:', '%:%:' (default)
  -fdiscard-value-names   丢弃LLVM-IR中的值名称
  -fdollars-in-identifiers
                          Allow '$' in identifiers
  -fdouble-square-bracket-attributes
                          Enable '[[]]' attributes in all C and C++ language modes
  -fdwarf-exceptions      Use DWARF style exceptions
  -fembed-bitcode-marker  嵌入占位符LLVM IR数据作为标记
  -fembed-bitcode=<option>
                          *** 嵌入LLVM位代码,(用于翻译不同平台目标代码)*** (option: off, all, bitcode, marker)
  -fembed-bitcode         嵌入LLVM-IR位码作为数据
  -femit-all-decls        提交所有声明,即使未使用
  -fc-tls          使用emutls函数访问线程本地变量
  -fenable-matrix         Enable matrix data type and related builtin functions
  -fexceptions            启用对异常处理的支持
  -fexperimental-isel     Enables the experimental global instruction selector
  -fexperimental-new-pass-manager
                          Enables an experimental new pass manager in LLVM.
  -ffast-math             *** 允许激进的、有损的浮点优化 ***
  -ffine-grained-bitfield-accesses
                          Use separate accesses for consecutive bitfield runs with legal widths and alignments.
  -ffixed-point           Enable fixed point types
  -ffixed-r19             Reserve register r19 (Hexagon only)
  -ffixed-r9              Reserve the r9 register (ARM only)
  -ffixed-x10             Reserve the 10 register (AArch64 only)
  -ffixed-x11             Reserve the 11 register (AArch64 only)
  -ffixed-x12             Reserve the 12 register (AArch64 only)
  -ffixed-x13             Reserve the 13 register (AArch64 only)
  -ffixed-x14             Reserve the 14 register (AArch64 only)
  -ffixed-x15             Reserve the 15 register (AArch64 only)
  -ffixed-x18             Reserve the 18 register (AArch64 only)
  -ffixed-x1              Reserve the 1 register (AArch64 only)
  -ffixed-x20             Reserve the 20 register (AArch64 only)
  -ffixed-x21             Reserve the 21 register (AArch64 only)
  -ffixed-x22             Reserve the 22 register (AArch64 only)
  -ffixed-x23             Reserve the 23 register (AArch64 only)
  -ffixed-x24             Reserve the 24 register (AArch64 only)
  -ffixed-x25             Reserve the 25 register (AArch64 only)
  -ffixed-x26             Reserve the 26 register (AArch64 only)
  -ffixed-x27             Reserve the 27 register (AArch64 only)
  -ffixed-x28             Reserve the 28 register (AArch64 only)
  -ffixed-x2              Reserve the 2 register (AArch64 only)
  -ffixed-x3              Reserve the 3 register (AArch64 only)
  -ffixed-x4              Reserve the 4 register (AArch64 only)
  -ffixed-x5              Reserve the 5 register (AArch64 only)
  -ffixed-x6              Reserve the 6 register (AArch64 only)
  -ffixed-x7              Reserve the 7 register (AArch64 only)
  -ffixed-x9              Reserve the 9 register (AArch64 only)
  -fforce-emit-vtables    发出更多的虚拟表来改善去虚拟化
  -fforce-enable-int128   允许int128_t类型
  -ffp-contract=<value>   Form fused FP ops (e.g. FMAs): fast (everywhere) | on (according to FP_CONTRACT pragma, default) | off (never fuse)
  -ffreestanding          断言编译发生在独立环境中
  -ffunction-sections     将每个函数放在自己的节中(仅限ELF)
  -fgnu-keywords          不管语言标准如何,都允许GNU扩展关键字
  -fgnu-runtime           生成与标准GNU Objective-C运行时兼容的输出
  -fgnu89-inline          ***使用gnu89内联语义***
  -fgpu-rdc               生成可重定位设备代码,也称为独立编译模式。
  -fimplicit-module-maps  隐式地在文件系统中搜索模块映射文件。 
  -finline-functions      内联适当函数
  -finline-hint-functions 显式或隐式)标记为内联的内联函数
  -finstrument-function-entry-bare  仅在内联后插入函数项,不带插入调用的参数
  -finstrument-functions  Generate calls to instrument function entry and exit
  -fintegrated-as         Enable the integrated assembler
  -fkeep-static-consts    Keep static const variables even if unused
  -flto-jobs=<value>      Controls the backend parallelism of -flto=thin (default of 0 means the number of threads will be derived from the number of CPUs detected)
  -flto=<value>           将LTO模式设置为“full”或“thin”
  -flto                   在“完全”模式下启用LTO
  -fmath-errno            需要数学函数通过设置errno来指示错误
  -fmax-type-align=<value>
                          指定要对缺少显式对齐的指针强制执行的最大对齐方式
  -fmerge-all-constants   允许合并常量
  -fmodule-file=[<name>=]<file>
                         指定模块名到预编译模块文件的映射,或者在省略名称的情况下加载模块文件。
  -fmodule-map-file=<file>
                          加载此模块映射文件***
  -fmodule-name=<name>    指定要生成的模块的名称***
  -fmodules-cache-path=<directory>
                          指定模块缓存路径***
  -fmodules-decluse       要求声明模块中使用的模块 *** 
  -fmodules-disable-diagnostic-validation  加载模块时禁用诊断选项验证 ***
  -fmodules-ignore-macro=<value> 生成和加载模块时忽略给定宏的定义 *** 
  -fmodules-prune-after=<seconds>
                          指定将认为模块文件未使用的间隔(以秒为单位) ***
  -fmodules-prune-interval=<seconds>
                          指定尝试修剪模块缓存的间隔(秒) *** 
  -fmodules-search-all    Search even non-imported modules to resolve references
  -fmodules-strict-decluse
                          Like -fmodules-decluse 但要求所有头都在模块中  -fmodules-ts            启用对C++模块TS的支持
  -fmodules-user-build-path <directory>
                          指定模块用户生成路径
  -fmodules-validate-input-files-content
                          Validate PCM input files based on content if mtime differs
  -fmodules-validate-once-per-build-session
                          如果模块在此生成会话期间已成功验证或加载,则不要验证模块的输入文件***
  -fmodules-validate-system-headers
                          加载模块时验证模块所依赖的系统头 *** 
  -fmodules               启用“模块”语言功能 ***
  -fms-compatibility-version=<value>
                          Dot-separated value representing the Microsoft compiler version number to report in _MSC_VER (0 = don't define it (default))
  -fms-compatibility      Enable full Microsoft Visual C++ compatibility
  -fms-extensions         接受Microsoft编译器支持的一些非标准构造
  -fmsc-version=<value>   Microsoft compiler version number to report in _MSC_VER (0 = don't define it (default))
  -fnew-alignment=<align> Specifies the largest alignment guaranteed by '::operator new(size_t)'
  -fno-access-control     禁用C++访问控制 ***
  -fno-addrsig            不发出地址重要性表 ***
  -fno-apinotes-modules   禁用基于模块的外部API notes支持*** 
  -fno-apinotes           禁用外部API注解支持
  -fno-assume-sane-operator-new 不要假定C++的全局运算符new不能别名指针
  -fno-autolink           禁用为自动库链接生成链接器指令
  -fno-builtin-<value>    禁用特定函数的隐式内置知识
  -fno-builtin            禁用函数的隐式内置知识
  -fno-c++-static-destructors
                          Disable C++ static destructor registration
  -fno-char8_t            Disable C++ builtin type char8_t
  -fno-common             Compile common globals like normal definitions
  -fno-complete-member-pointers
                          Do not require member pointer base types to be complete if they would be significant under the Microsoft ABI
  -fno-constant-cfstrings 禁用创建CodeFoundation类型常量字符串 ****
  -fno-constant-nsarray-literals
                          禁用从数组文本创建CodeFoundation类型常量初始值设定项“NSArray” ****
  -fno-constant-nsdictionary-literals
                         禁用从字典文本创建CodeFoundation类型常量初始值设定项`NSDictionary`s
                         无法从数字文本创建CodeFoundation类型常量初始值设定项“NSNumber”
  -fno-coverage-mapping   禁用代码覆盖率分析
  -fno-crash-diagnostics  禁用自动生成预处理的源文件和脚本,以便在clang崩溃期间进行复制
  -fno-debug-info-for-profiling
                          不要为示例探查器发出额外的调试信息。
  -fno-debug-macro        不发出宏调试信息
  -fno-declspec           不允许作为关键字
  -fno-delayed-template-parsing
                          禁用延迟模板分析
  -fno-delete-null-pointer-checks
                          不要将空指针的使用视为未定义的行为。
  -fno-diagnostics-fixit-info
                          不包括诊断信息
  -fno-digraphs           不允许替代令牌表示'<:', ':>', '<%', '%>', '%:', '%:%:'
  -fno-discard-value-names  不要丢弃LLVM-IR中的值名
  -fno-dollars-in-identifiers 在标识符中不允许使用“$”
  -fno-double-square-bracket-attributes  在所有C和C++语言模式中禁用'[]]属性
  -fno-elide-constructors 禁用C++复制构造器删除
  -fno-elide-type         Do not elide types when printing diagnostics
  -fno-experimental-isel  Disables the experimental global instruction selector
  -fno-experimental-new-pass-manager
                          Disables an experimental new pass manager in LLVM.
  -fno-fine-grained-bitfield-accesses
                          Use large-integer access for consecutive bitfield runs.
  -fno-fixed-point        Disable fixed point types
  -fno-force-enable-int128
                          Disable support for int128_t type
  -fno-gnu-inline-asm     Disable GNU style inline asm
  -fno-integrated-as      Disable the integrated assembler
  -fno-jump-tables        Do not use jump tables for lowering switches
  -fno-lax-vector-conversions
                          Disallow implicit conversions between vectors with a different number of elements or different element types
  -fno-lto                Disable LTO mode (default)
  -fno-merge-all-constants
                          Disallow merging of constants
  -fno-objc-infer-related-result-type
                          do not infer Objective-C related result type based on method family
  -fno-operator-names     Do not treat C++ operator name keywords as synonyms for operators
  -fno-plt                Do not use the PLT to make function calls
  -fno-preserve-as-comments
                          Do not preserve comments in inline assembly
  -fno-profile-generate   Disable generation of profile instrumentation.
  -fno-profile-instr-generate
                          Disable generation of profile instrumentation.
  -fno-profile-instr-use  Disable using instrumentation data for profile-guided optimization
  -fno-register-global-dtors-with-atexit
                          Don't use atexit or __cxa_atexit to register global destructors
  -fno-reroll-loops       Turn off loop reroller
  -fno-rtlib-add-rpath    Do not add -rpath with architecture-specific resource directory to the linker flags
  -fno-rtti-data          Control emission of RTTI data
  -fno-rtti               Disable generation of rtti information
  -fno-sanitize-address-poison-custom-array-cookie
                          Disable poisoning array cookies when using custom operator new[] in AddressSanitizer
  -fno-sanitize-address-use-after-scope
                          在AddressSanitizer中禁用作用域检测后使用
  -fno-sanitize-address-use-odr-indicator
                          Disable ODR indicator globals
  -fno-sanitize-blacklist Don't use blacklist file for sanitizers
  -fno-sanitize-cfi-cross-dso
                          Disable control flow integrity (CFI) checks for cross-DSO calls.
  -fno-sanitize-coverage=<value>
                          Disable specified features of coverage instrumentation for Sanitizers
  -fno-sanitize-memory-track-origins
                          Disable origins tracking in MemorySanitizer
  -fno-sanitize-memory-use-after-dtor
                          Disable use-after-destroy detection in MemorySanitizer
  -fno-sanitize-recover=<value>
                          Disable recovery for specified sanitizers
  -fno-sanitize-stats     Disable sanitizer statistics gathering.
  -fno-sanitize-thread-atomics
                          Disable atomic operations instrumentation in ThreadSanitizer
  -fno-sanitize-thread-func-entry-exit
                          Disable function entry/exit instrumentation in ThreadSanitizer
  -fno-sanitize-thread-memory-access
                          Disable memory access instrumentation in ThreadSanitizer
  -fno-sanitize-trap=<value>
                          Disable trapping for specified sanitizers
  -fno-short-wchar        Force wchar_t to be an unsigned int
  -fno-show-column        Do not include column number on diagnostics
  -fno-show-source-location
                          Do not include source location information with diagnostics
  -fno-signed-char        Char is unsigned
  -fno-signed-zeros       Allow optimizations that ignore the sign of floating point zeros
  -fno-spell-checking     Disable spell-checking
  -fno-stack-check        Disable stack checking
  -fno-stack-protector    Disable the use of stack protectors
  -fno-stack-size-section Don't emit section containing metadata on function stack sizes
  -fno-standalone-debug   Limit debug information produced to reduce size of debug binary
  -fno-strict-float-cast-overflow
                          Relax language rules and try to match the behavior of the target's native float-to-int conversion instructions
  -fno-temp-file          Directly create compilation output files. This may lead to incorrect incremental builds if the compiler crashes
  -fno-threadsafe-statics Do not emit code to make initialization of local statics thread safe
  -fno-trigraphs          Do not process trigraph sequences
  -fno-unroll-loops       Turn off loop unroller
  -fno-use-cxa-atexit     Don't use __cxa_atexit for calling destructors
  -fno-use-init-array     Don't use .init_array instead of .ctors
  -fobjc-arc-exceptions   Use EH-safe code when synthesizing retains and releases in -fobjc-arc
  -fobjc-arc              Synthesize retain and release calls for Objective-C pointers
  -fobjc-exceptions       Enable Objective-C exceptions
  -fobjc-runtime=<value>  Specify the target Objective-C runtime kind and version
  -fobjc-weak             Enable ARC-style weak references in Objective-C
  -fopenmp-simd           Emit OpenMP code only for SIMD-based constructs.
  -fopenmp-targets=<value>
                          Specify comma-separated list of triples OpenMP offloading targets to be supported
  -fopenmp                Parse OpenMP pragmas and generate parallel code.
  -foptimization-record-file=<file>
                          Specify the output name of the file containing the optimization remarks. Implies -fsave-optimization-record. On Darwin platforms, this cannot be used with multiple -arch <arch> options.
  -foptimization-record-passes=<regex>
                          Only include passes which match a specified regular expression in the generated optimization record (by default, include all passes)
  -forder-file-instrumentation
                          Generate instrumented code to collect order file into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)
  -fpack-struct=<value>   Specify the default maximum struct packing alignment
  -fpascal-strings        Recognize and construct Pascal-style string literals
  -fpass-plugin=<dsopath> Load pass plugin from a dynamic shared object file (only with new pass manager).
  -fpcc-struct-return     Override the default ABI to return all structs on the stack
  -fpch-validate-input-files-content
                          Validate PCH input files based on content if mtime differs
  -fplt                   Use the PLT to make function calls
  -fplugin=<dsopath>      Load the named plugin (dynamic shared object)
  -fprebuilt-module-path=<directory>
                          Specify the prebuilt module path
  -fprofile-exclude-files=<value>
                          Instrument only functions from files where names don't match all the regexes separated by a semi-colon
  -fprofile-filter-files=<value>
                          Instrument only functions from files where names match any regex separated by a semi-colon
  -fprofile-generate=<directory>
                          Generate instrumented code to collect execution counts into <directory>/default.profraw (overridden by LLVM_PROFILE_FILE env var)
  -fprofile-generate      Generate instrumented code to collect execution counts into default.profraw (overridden by LLVM_PROFILE_FILE env var)
  -fprofile-instr-generate=<file>
                          Generate instrumented code to collect execution counts into <file> (overridden by LLVM_PROFILE_FILE env var)
  -fprofile-instr-generate
                          Generate instrumented code to collect execution counts into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)
  -fprofile-instr-use=<value>
                          Use instrumentation data for profile-guided optimization
  -fprofile-remapping-file=<file>
                          Use the remappings described in <file> to match the profile data against names in the program
  -fprofile-sample-accurate
                          Specifies that the sample profile is accurate
  -fprofile-sample-use=<value>
                          Enable sample-based profile guided optimizations
  -fprofile-use=<pathname>
                          Use instrumentation data for profile-guided optimization. If pathname is a directory, it reads from <pathname>/default.profdata. Otherwise, it reads from file <pathname>.
  -fptrauth-auth-traps    Enable traps on authentication failures
  -fptrauth-calls         Enable signing and authentication of all indirect calls
  -fptrauth-indirect-gotos
                          Enable signing and authentication of indirect goto targets
  -fptrauth-intrinsics    Enable pointer-authentication intrinsics
  -fptrauth-returns       Enable signing and authentication of return addresses
  -fptrauth-soft          Enable software lowering of pointer authentication
  -freciprocal-math       Allow division operations to be reassociated
  -freg-struct-return     Override the default ABI to return small structs in registers
  -fregister-global-dtors-with-atexit
                          Use atexit or __cxa_atexit to register global destructors
  -frelaxed-template-template-args
                          Enable C++17 relaxed template template argument matching
  -freroll-loops          Turn on loop reroller
  -frtlib-add-rpath       Add -rpath with architecture-specific resource directory to the linker flags
  -fsanitize-address-field-padding=<value>
                          Level of field padding for AddressSanitizer
  -fsanitize-address-globals-dead-stripping
                          Enable linker dead stripping of globals in AddressSanitizer
  -fsanitize-address-poison-custom-array-cookie
                          Enable poisoning array cookies when using custom operator new[] in AddressSanitizer
  -fsanitize-address-use-after-scope
                          Enable use-after-scope detection in AddressSanitizer
  -fsanitize-address-use-odr-indicator
                          Enable ODR indicator globals to avoid false ODR violation reports in partially sanitized programs at the cost of an increase in binary size
  -fsanitize-blacklist=<value>
                          Path to blacklist file for sanitizers
  -fsanitize-cfi-cross-dso
                          Enable control flow integrity (CFI) checks for cross-DSO calls.
  -fsanitize-cfi-icall-generalize-pointers
                          Generalize pointers in CFI indirect call type signature checks
  -fsanitize-coverage=<value>
                          Specify the type of coverage instrumentation for Sanitizers
  -fsanitize-hwaddress-abi=<value>
                          Select the HWAddressSanitizer ABI to target (interceptor or platform, default interceptor)
  -fsanitize-memory-track-origins=<value>
                          Enable origins tracking in MemorySanitizer
  -fsanitize-memory-track-origins
                          Enable origins tracking in MemorySanitizer
  -fsanitize-memory-use-after-dtor
                          Enable use-after-destroy detection in MemorySanitizer
  -fsanitize-recover=<value>
                          Enable recovery for specified sanitizers
  -fsanitize-stats        Enable sanitizer statistics gathering.
  -fsanitize-system-blacklist=<value>
                          Path to system blacklist file for sanitizers
  -fsanitize-thread-atomics
                          Enable atomic operations instrumentation in ThreadSanitizer (default)
  -fsanitize-thread-func-entry-exit
                          Enable function entry/exit instrumentation in ThreadSanitizer (default)
  -fsanitize-thread-memory-access
                          Enable memory access instrumentation in ThreadSanitizer (default)
  -fsanitize-trap=<value> Enable trapping for specified sanitizers
  -fsanitize-undefined-strip-path-components=<number>
                          Strip (or keep only, if negative) a given number of path components when emitting check metadata.
  -fsanitize=<check>      Turn on runtime checks for various forms of undefined or suspicious behavior. See user manual for available checks
  -fsave-optimization-record=<format>
                          Generate an optimization record file in a specific format
  -fsave-optimization-record
                          Generate a YAML optimization record file
  -fseh-exceptions        Use SEH style exceptions
  -fshort-enums           Allocate to an enum type only as many bytes as it needs for the declared range of possible values
  -fshort-wchar           Force wchar_t to be a short unsigned int
  -fshow-overloads=<value>
                          Which overload candidates to show when overload resolution fails: best|all; defaults to all
  -fsized-deallocation    Enable C++14 sized global deallocation functions
  -fsjlj-exceptions       Use SjLj style exceptions
  -fslp-vectorize         Enable the superword-level parallelism vectorization passes
  -fsplit-dwarf-inlining  Provide minimal debug info in the object/executable to facilitate online symbolication/stack traces in the absence of .dwo/.dwp files when using Split DWARF
  -fsplit-lto-unit        Enables splitting of the LTO unit.
  -fstack-check           Enable stack checking
  -fstack-protector-all   Enable stack protectors for all functions
  -fstack-protector-strong
                          Enable stack protectors for some functions vulnerable to stack smashing. Compared to -fstack-protector, this uses a stronger heuristic that includes functions containing arrays of any size (and any type), as well as any calls to alloca or the taking of an address from a local variable
  -fstack-protector       Enable stack protectors for some functions vulnerable to stack smashing. This uses a loose heuristic which considers functions vulnerable if they contain a char (or 8bit integer) array or constant sized calls to alloca, which are of greater size than ssp-buffer-size (default: 8 bytes). All variable sized calls to alloca are considered vulnerable
  -fstack-size-section    Emit section containing metadata on function stack sizes
  -fstandalone-debug      Emit full debug info for all types used by the program
  -fstrict-enums          Enable optimizations based on the strict definition of an enum's value range
  -fstrict-float-cast-overflow
                          Assume that overflowing float-to-int casts are undefined (default)
  -fstrict-return         Always treat control flow paths that fall off the end of a non-void function as unreachable
  -fstrict-vtable-pointers
                          Enable optimizations based on the strict rules for overwriting polymorphic C++ objects
  -ftarget-variant-availability-checks
                          Enable availability checks for the target variant platform
  -fthinlto-index=<value> Perform ThinLTO importing using provided function summary index
  -ftrap-function=<value> Issue call to specified function rather than a trap instruction
  -ftrapv-handler=<function name>
                          Specify the function to be called on overflow
  -ftrapv                 Trap on integer overflow
  -ftrigraphs             Process trigraph sequences
  -ftrivial-auto-var-init=<value>
                          Initialize trivial automatic stack variables: uninitialized (default) | pattern
  -funique-section-names  Use unique names for text and data sections (ELF Only)
  -funroll-loops          Turn on loop unroller
  -fuse-init-array        Use .init_array instead of .ctors
  -fvalidate-ast-input-files-content
                          Compute and store the hash of input files used to build an AST. Files with mismatching mtime's are considered valid if both contents is identical
  -fveclib=<value>        Use the given vector functions library
  -fvectorize             Enable the loop vectorization passes
  -fvisibility-global-new-delete-hidden
                          Give global C++ operator new and delete declarations hidden visibility
  -fvisibility-inlines-hidden
                          Give inline C++ member functions hidden visibility by default
  -fvisibility-ms-compat  Give global types 'default' visibility and global functions and variables 'hidden' visibility by default
  -fvisibility=<value>    Set the default symbol visibility for all global declarations
  -fwhole-program-vtables Enables whole-program vtable optimization. Requires -flto
  -fwrapv                 Treat signed integer overflow as two's complement
  -fwritable-strings      Store string literals as writable data
  -fxray-always-emit-customevents
                          Determine whether to always emit __xray_customevent(...) calls even if the function it appears in is not always instrumented.
  -fxray-always-emit-typedevents
                          Determine whether to always emit __xray_typedevent(...) calls even if the function it appears in is not always instrumented.
  -fxray-always-instrument= <value>
                          DEPRECATED: Filename defining the whitelist for imbuing the 'always instrument' XRay attribute.
  -fxray-attr-list= <value>
                          Filename defining the list of functions/types for imbuing XRay attributes.
  -fxray-instruction-threshold= <value>
                          Sets the minimum function size to instrument with XRay
  -fxray-instrumentation-bundle= <value>
                          Select which XRay instrumentation points to emit. Options: all, none, function, custom. Default is 'all'.
  -fxray-instrument       Generate XRay instrumentation sleds on function entry and exit
  -fxray-link-deps        Tells clang to add the link dependencies for XRay.
  -fxray-modes= <value>   List of modes to link in by default into XRay instrumented binaries.
  -fxray-never-instrument= <value>
                          DEPRECATED: Filename defining the whitelist for imbuing the 'never instrument' XRay attribute.
  -fzvector               Enable System z vector language extension
  -F <value>              Add directory to framework include search path
  --gcc-toolchain=<value> Use the gcc toolchain at the given directory
  -gcodeview-ghash        Emit type record hashes in a .debug$H section
  -gcodeview              Generate CodeView debug information
  -gdwarf-2               Generate source-level debug information with dwarf version 2
  -gdwarf-3               Generate source-level debug information with dwarf version 3
  -gdwarf-4               Generate source-level debug information with dwarf version 4
  -gdwarf-5               Generate source-level debug information with dwarf version 5
  -gembed-source          Embed source text in DWARF debug sections
  -gline-directives-only  Emit debug line info directives only
  -gline-tables-only      Emit debug line number tables only
  -gmodules               Generate debug info with external references to clang modules or precompiled headers
  -gno-embed-source       Restore the default behavior of not embedding source text in DWARF debug sections
  -gsplit-dwarf=<value>   Set DWARF fission mode to either 'split' or 'single'
  -gz=<value>             DWARF debug sections compression type
  -gz                     DWARF debug sections compression type
  -G <size>               Put objects of at most <size> bytes into small data section (MIPS / Hexagon)
  -g                      Generate source-level debug information
  --help-hidden           Display help for hidden options
  -help                   Display available options
  --hip-device-lib-path=<value>
                          HIP device library path
  --hip-device-lib=<value>
                          HIP device library
  --hip-link              Link clang-offload-bundler bundles for HIP
  -H                      Show header includes and nesting depth
  -I-                     Restrict all prior -I flags to double-quoted inclusion and remove current directory from include path
  -iapinotes-modules <directory>
                          Add directory to the API notes search path referenced by module name
  -idirafter <value>      Add directory to AFTER include search path
  -iframeworkwithsysroot <directory>
                          Add directory to SYSTEM framework search path, absolute paths are relative to -isysroot
  -iframework <value>     Add directory to SYSTEM framework search path
  -imacros <file>         Include macros from file before parsing
  -include-pch <file>     Include precompiled header file
  -include <file>         Include file before parsing
  -index-header-map       Make the next included directory (-I or -F) an indexer header map
  -index-ignore-system-symbols
                          Ignore symbols from system headers
  -index-record-codegen-name
                          Record the codegen name for symbols
  -index-store-path <value>
                          Enable indexing with the specified data store path
  -iprefix <dir>          Set the -iwithprefix/-iwithprefixbefore prefix
  -iquote <directory>     Add directory to QUOTE include search path
  -isysroot <dir>         Set the system root directory (usually /)
  -isystem-after <directory>
                          Add directory to end of the SYSTEM include search path
  -isystem <directory>    Add directory to SYSTEM include search path
  -ivfsoverlay <value>    Overlay the virtual filesystem described by file over the real file system
  -iwithprefixbefore <dir>
                          Set directory to include search path with prefix
  -iwithprefix <dir>      Set directory to SYSTEM include search path with prefix
  -iwithsysroot <directory>
                          Add directory to SYSTEM include search path, absolute paths are relative to -isysroot
  -I <dir>                Add directory to include search path
  --libomptarget-nvptx-path=<value>
                          Path to libomptarget-nvptx libraries
  -L <dir>                Add directory to library search path
  -mabicalls              Enable SVR4-style position-independent code (Mips only)
  -malign-double          Align doubles to two words in structs (x86 only)
  -mbackchain             Link stack frames through backchain on System Z
  -mbranch-protection=<value>
                          Enforce targets of indirect branches and function returns
  -mcmse                  Allow use of CMSE (Armv8-M Security Extensions)
  -mcode-object-v3        Enable code object v3 (AMDGPU only)
  -mcrc                   Allow use of CRC instructions (ARM/Mips only)
  -mcumode                CU wavefront execution mode is used (AMDGPU only)
  -MD                     Write a depfile containing user and system headers
  -meabi <value>          Set EABI type, e.g. 4, 5 or gnu (default depends on triple)
  -membedded-data         Place constants in the .rodata section instead of the .sdata section even if they meet the -G <size> threshold (MIPS)
  -mexecute-only          Disallow generation of data access to code sections (ARM only)
  -mextern-sdata          Assume that externally defined data is in the small data if it meets the -G <size> threshold (MIPS)
  -mfentry                Insert calls to fentry at function entry (x86 only)
  -mfix-cortex-a53-835769 Workaround Cortex-A53 erratum 835769 (AArch64 only)
  -mfp32                  Use 32-bit floating point registers (MIPS only)
  -mfp64                  Use 64-bit floating point registers (MIPS only)
  -MF <file>              Write depfile output from -MMD, -MD, -MM, or -M to <file>
  -mgeneral-regs-only     Generate code which only uses the general purpose registers (AArch64 only)
  -mglobal-merge          Enable merging of globals
  -mgpopt                 Use GP relative accesses for symbols known to be in a small data section (MIPS)
  -MG                     Add missing headers to depfile
  -mhvx-length=<value>    Set Hexagon Vector Length
  -mhvx=<value>           Enable Hexagon Vector eXtensions
  -mhvx                   Enable Hexagon Vector eXtensions
  -miamcu                 Use Intel MCU ABI
  --migrate               Run the migrator
  -mincremental-linker-compatible
                          (integrated-as) Emit an object file which can be used with an incremental linker
  -mindirect-jump=<value> Change indirect jump instructions to inhibit speculation
  -mios-version-min=<value>
                          Set iOS deployment target
  -MJ <value>             Write a compilation database entry per input
  -mllvm <value>          Additional arguments to forward to LLVM's option processing
  -mlocal-sdata           Extend the -G behaviour to object local data (MIPS)
  -mlong-calls            Generate branches with extended addressability, usually via indirect jumps.
  -mmacosx-version-min=<value>
                          Set Mac OS X deployment target
  -mmadd4                 Enable the generation of 4-operand madd.s, madd.d and related instructions.
  -MMD                    Write a depfile containing user headers
  -mmemops                Enable generation of memop instructions
  -mms-bitfields          Set the default structure layout to be compatible with the Microsoft compiler standard
  -mmsa                   Enable MSA ASE (MIPS only)
  -mmt                    Enable MT ASE (MIPS only)
  -MM                     Like -MMD, but also implies -E and writes to stdout by default
  -mno-abicalls           Disable SVR4-style position-independent code (Mips only)
  -mno-code-object-v3     Disable code object v3 (AMDGPU only)
  -mno-crc                Disallow use of CRC instructions (Mips only)
  -mno-cumode             WGP wavefront execution mode is used (AMDGPU only)
  -mno-embedded-data      Do not place constants in the .rodata section instead of the .sdata if they meet the -G <size> threshold (MIPS)
  -mno-execute-only       Allow generation of data access to code sections (ARM only)
  -mno-extern-sdata       Do not assume that externally defined data is in the small data if it meets the -G <size> threshold (MIPS)
  -mno-fix-cortex-a53-835769
                          Don't workaround Cortex-A53 erratum 835769 (AArch64 only)
  -mno-global-merge       Disable merging of globals
  -mno-gpopt              Do not use GP relative accesses for symbols known to be in a small data section (MIPS)
  -mno-hvx                Disable Hexagon Vector eXtensions
  -mno-implicit-float     Don't generate implicit floating point instructions
  -mno-incremental-linker-compatible
                          (integrated-as) Emit an object file which cannot be used with an incremental linker
  -mno-local-sdata        Do not extend the -G behaviour to object local data (MIPS)
  -mno-long-calls         Restore the default behaviour of not generating long calls
  -mno-madd4              Disable the generation of 4-operand madd.s, madd.d and related instructions.
  -mno-memops             Disable generation of memop instructions
  -mno-movt               Disallow use of movt/movw pairs (ARM only)
  -mno-ms-bitfields       Do not set the default structure layout to be compatible with the Microsoft compiler standard
  -mno-msa                Disable MSA ASE (MIPS only)
  -mno-mt                 Disable MT ASE (MIPS only)
  -mno-neg-immediates     Disallow converting instructions with negative immediates to their negation or inversion.
  -mno-nvj                Disable generation of new-value jumps
  -mno-nvs                Disable generation of new-value stores
  -mno-outline            Disable function outlining (AArch64 only)
  -mno-packets            Disable generation of instruction packets
  -mno-relax              Disable linker relaxation
  -mno-restrict-it        Allow generation of deprecated IT blocks for ARMv8. It is off by default for ARMv8 Thumb mode
  -mno-sram-ecc           Disable SRAM ECC (AMDGPU only)
  -mno-stack-arg-probe    Disable stack probes which are enabled by default
  -mno-tls-direct-seg-refs
                          Disable direct TLS access through segment registers
  -mno-unaligned-access   Force all memory accesses to be aligned (AArch32/AArch64 only)
  -mno-wavefrontsize64    Wavefront size 32 is used
  -mno-xnack              Disable XNACK (AMDGPU only)
  -mnocrc                 Disallow use of CRC instructions (ARM only)
  -mnvj                   Enable generation of new-value jumps
  -mnvs                   Enable generation of new-value stores
  -module-dependency-dir <value>
                          Directory to dump module dependencies to
  -module-file-info       Provide information about a particular module file
  -momit-leaf-frame-pointer
                          Omit frame pointer setup for leaf functions
  -moutline               Enable function outlining (AArch64 only)
  -mpackets               Enable generation of instruction packets
  -mpie-copy-relocations  Use copy relocations support for PIE builds
  -mprefer-vector-width=<value>
                          Specifies preferred vector width for auto-vectorization. Defaults to 'none' which allows target specific decisions.
  -MP                     Create phony target for each dependency (other than main file)
  -mqdsp6-compat          Enable hexagon-qdsp6 backward compatibility
  -MQ <value>             Specify name of main file output to quote in depfile
  -mrelax-all             (integrated-as) Relax all machine instructions
  -mrelax                 Enable linker relaxation
  -mrestrict-it           Disallow generation of deprecated IT blocks for ARMv8. It is on by default for ARMv8 Thumb mode.
  -mrtd                   Make StdCall calling convention the default
  -msign-return-address=<value>
                          Select return address signing scope
  -msoft-float            Use software floating point
  -msram-ecc              Enable SRAM ECC (AMDGPU only)
  -mstack-alignment=<value>
                          Set the stack alignment
  -mstack-arg-probe       Enable stack probes
  -mstack-probe-size=<value>
                          Set the stack probe size
  -mstackrealign          Force realign the stack at entry to every function
  -mthread-model <value>  The thread model to use, e.g. posix, single (posix by default)
  -mtls-direct-seg-refs   Enable direct TLS access through segment registers (default)
  -mtp=<value>            Thread pointer access method (AArch32/AArch64 only)
  -MT <value>             Specify name of main file output in depfile
  -munaligned-access      Allow memory accesses to be unaligned (AArch32/AArch64 only)
  -MV                     Use NMake/Jom format for the depfile
  -mwavefrontsize64       Wavefront size 64 is used
  -mxnack                 Enable XNACK (AMDGPU only)
  -M                      Like -MD, but also implies -E and writes to stdout by default
  --no-cuda-gpu-arch=<value>
                          Remove GPU architecture (e.g. sm_35) from the list of GPUs to compile for. 'all' resets the list to its default value.
  --no-cuda-include-ptx=<value>
                          Do not include PTX for the following GPU architecture (e.g. sm_35) or 'all'. May be specified more than once.
  --no-cuda-version-check Don't error out if the detected version of the CUDA install is too low for the requested CUDA gpu architecture.
  --no-system-header-prefix=<prefix>
                          Treat all #include paths starting with <prefix> as not including a system header.
  -nobuiltininc           Disable builtin #include directories
  -nostdinc++             Disable standard #include directories for the C++ standard library
  -ObjC++                 Treat source input files as Objective-C++ inputs
  -objcmt-atomic-property Make migration to 'atomic' properties
  -objcmt-migrate-all     Enable migration to modern ObjC
  -objcmt-migrate-annotation
                          Enable migration to property and method annotations
  -objcmt-migrate-designated-init
                          Enable migration to infer NS_DESIGNATED_INITIALIZER for initializer methods
  -objcmt-migrate-instancetype
                          Enable migration to infer instancetype for method result type
  -objcmt-migrate-literals
                          Enable migration to modern ObjC literals
  -objcmt-migrate-ns-macros
                          Enable migration to NS_ENUM/NS_OPTIONS macros
  -objcmt-migrate-property-dot-syntax
                          Enable migration of setter/getter messages to property-dot syntax
  -objcmt-migrate-property
                          Enable migration to modern ObjC property
  -objcmt-migrate-protocol-conformance
                          Enable migration to add protocol conformance on classes
  -objcmt-migrate-readonly-property
                          Enable migration to modern ObjC readonly property
  -objcmt-migrate-readwrite-property
                          Enable migration to modern ObjC readwrite property
  -objcmt-migrate-subscripting
                          Enable migration to modern ObjC subscripting
  -objcmt-ns-nonatomic-iosonly
                          Enable migration to use NS_NONATOMIC_IOSONLY macro for setting property's 'atomic' attribute
  -objcmt-returns-innerpointer-property
                          Enable migration to annotate property with NS_RETURNS_INNER_POINTER
  -objcmt-whitelist-dir-path=<value>
                          Only modify files with a filename contained in the provided directory path
  -ObjC                   Treat source input files as Objective-C inputs
  -o <file>               Write output to <file>
  -pg                     Enable mcount instrumentation
  -pipe                   Use pipes between commands, when possible
  --precompile            Only precompile the input
  -print-effective-triple Print the effective target triple
  -print-file-name=<file> Print the full library path of <file>
  -print-ivar-layout      Enable Objective-C Ivar layout bitmap print trace
  -print-libgcc-file-name Print the library path for the currently used compiler runtime library ("libgcc.a" or "libclang_rt.builtins.*.a")
  -print-prog-name=<name> Print the full program path of <name>
  -print-resource-dir     Print the resource directory pathname
  -print-search-dirs      Print the paths used for finding libraries and programs
  -print-supported-cpus   Print supported cpu models for the given target (if target is not specified, it will print the supported cpus for the default target)
  -print-target-triple    Print the normalized target triple
  -pthread                Support POSIX threads in generated code
  --ptxas-path=<value>    Path to ptxas (used for compiling CUDA code)
  -P                      Disable linemarker output in -E mode
  -Qn                     Do not emit metadata containing compiler name and version
  -Qunused-arguments      Don't emit warning for unused driver arguments
  -Qy                     Emit metadata containing compiler name and version
  -relocatable-pch        Whether to build a relocatable precompiled header
  -rewrite-legacy-objc    Rewrite Legacy Objective-C source to C++
  -rewrite-objc           Rewrite Objective-C source to C++
  -Rpass-analysis=<value> Report transformation analysis from optimization passes whose name matches the given POSIX regular expression
  -Rpass-missed=<value>   Report missed transformations by optimization passes whose name matches the given POSIX regular expression
  -Rpass=<value>          Report transformations performed by optimization passes whose name matches the given POSIX regular expression
  -rtlib=<value>          Compiler runtime library to use
  -R<remark>              Enable the specified remark
  -save-stats=<value>     Save llvm statistics.
  -save-stats             Save llvm statistics.
  -save-temps=<value>     Save intermediate compilation results.
  -save-temps             Save intermediate compilation results
  -serialize-diagnostics <value>
                          Serialize compiler diagnostics to a file
  -shared-libsan          Dynamically link the sanitizer runtime
  -static-libsan          Statically link the sanitizer runtime
  -std=<value>            Language standard to compile for
  -stdlib=<value>         C++ standard library to use
  --system-header-prefix=<prefix>
                          Treat all #include paths starting with <prefix> as including a system header.
  -S                      Only run preprocess and compilation steps
  -target-variant <value> Generate code that may run on a particular variant of the deployment target
  --target=<value>        Generate code for the given target
  -Tbss <addr>            Set starting address of BSS to <addr>
  -Tdata <addr>           Set starting address of DATA to <addr>
  -time                   Time individual commands
  -traditional-cpp        Enable some traditional CPP emulation
  -trigraphs              Process trigraph sequences
  -Ttext <addr>           Set starting address of TEXT to <addr>
  -T <script>             Specify <script> as linker script
  -undef                  undef all system defines
  -unwindlib=<value>      Unwind library to use
  -U <macro>              Undefine macro <macro>
  --verify-debug-info     Verify the binary representation of debug output
  -verify-pch             Load and verify that a pre-compiled header file is not stale
  --version               Print version information
  -v                      Show commands to run and use verbose output
  -Wa,<arg>               Pass the comma separated arguments in <arg> to the assembler
  -Wdeprecated            Enable warnings for deprecated constructs and define __DEPRECATED
  -Wl,<arg>               Pass the comma separated arguments in <arg> to the linker
  -working-directory <value>
                          Resolve file paths relative to the specified directory
  -Wp,<arg>               Pass the comma separated arguments in <arg> to the preprocessor
  -W<warning>             Enable the specified warning
  -w                      Suppress all warnings
  -Xanalyzer <arg>        Pass <arg> to the static analyzer
  -Xassembler <arg>       Pass <arg> to the assembler
  -Xclang <arg>           Pass <arg> to the clang compiler
  -Xcuda-fatbinary <arg>  Pass <arg> to fatbinary invocation
  -Xcuda-ptxas <arg>      Pass <arg> to the ptxas assembler
  -Xlinker <arg>          Pass <arg> to the linker
  -Xopenmp-target=<triple> <arg>
                          Pass <arg> to the target offloading toolchain identified by <triple>.
  -Xopenmp-target <arg>   Pass <arg> to the target offloading toolchain.
  -Xpreprocessor <arg>    Pass <arg> to the preprocessor
  -x <language>           Treat subsequent input files as having type <language>
  -z <arg>                Pass -z <arg> to the linker
posted @ 2020-10-10 23:59  阿甘左  阅读(2115)  评论(0编辑  收藏  举报