zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    安装WebStorm
    Could not obtain transaction-synchronized Session
    Hibernate4 No Session found for current thread原因
    Spring3系列7- 自动扫描组件或Bean
    论坛角色
    firefox浏览器无法显示bootstrap图标问题总结
    express文件上传中间件Multer最新使用说明
    判断圆和矩形是否相交C
    转化为用欧几里得算法判断互质的问题D
    (记录前面算过的后面仍然会用的数减小复杂度)A
  • 原文地址:https://www.cnblogs.com/wwoo/p/llvm-chu-tan.html
Copyright © 2011-2022 走看看