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
    
  • 相关阅读:
    convert image to base64 and post to RESTful wcf
    在android webview实现截屏的手动tounchmove裁剪图片
    How to use jquery ajax and android request security RESTful WCF
    using swfUpload in asp.net mvc
    using HttpClient and sending json data to RESTful server in adroind
    ODP.NET数据访问
    android image watermark
    解决国内不能访问github的问题
    idapro权威指南第二版阅读笔记第九章 交叉引用和绘图功能
    idapro权威指南第二版阅读笔记第二章 逆向和反汇编工具
  • 原文地址:https://www.cnblogs.com/wwoo/p/llvm-chu-tan.html
Copyright © 2011-2022 走看看