2022年6月10日15:32:51
luajit开发文档中文版(一)下载和安装
luajit开发文档中文版(二)LuaJIT扩展
luajit开发文档中文版(三)FAQ 常见问题
luajit开发文档wiki中文版(一) 总目录
luajit开发文档wiki中文版(二) LuaJIT 扩展
luajit开发文档wiki中文版(三)性能调优和测试
luajit开发文档wiki中文版(四) LuaJIT 内部结构
luajit开发文档wiki中文版(五) 系统集成
luajit开发文档wiki中文版(六) LuaJIT 开发
LuaJIT 是Lua编程语言的即时编译器(JIT) 。Lua 是一种功能强大、动态且轻量级的编程语言。它可以嵌入或用作通用的独立语言。
LuaJIT 版权所有 © 2005-2022 Mike Pall,在 MIT 开源许可下发布。
兼容性
Windows | Linux | BSD | macOS | POSIX |
Embedded | Android | iOS |
PS3 | PS4 | PS Vita | Xbox 360 |
GCC | CLANG LLVM |
MSVC |
x86 | x64 | ARM | PPC | e500 | MIPS |
Lua 5.1 API+ABI |
+ JIT | + BitOp | + FFI | Drop-in DLL/.so |
概述
3x - 100x |
115 KB VM |
90 KB JIT |
63 KLOC C |
24 KLOC ASM |
11 KLOC Lua |
LuaJIT 已成功用作游戏、设备、网络和图形应用程序、数值模拟、交易平台和许多其他专业应用程序中的脚本中间件。它可以从嵌入式设备、智能手机、台式机扩展到服务器场。它结合了高灵活性、高性能和无与伦比的低内存占用。
LuaJIT 自 2005 年以来一直在持续发展。它被广泛认为是最快的动态语言实现之一。自首次发布以来,它在许多跨语言基准测试中的表现都优于其他动态语言——通常有很大的优势。
对于LuaJIT 2.0,整个 VM 已经从头开始重写,并不断优化性能。它结合了用汇编程序编写的高速解释器和最先进的 JIT 编译器。
创新的跟踪编译器集成了先进的、基于 SSA 的优化和高度调整的代码生成后端。与动态语言相关的开销大幅减少,使其能够突破传统上为离线静态语言编译器保留的性能范围。
下载
公共 git 存储库
公共git存储库包含积极开发的分支的当前状态。您可以使用以下命令克隆它:
git clone https://luajit.org/git/luajit.git
注意:这不是可浏览的资源,存储库只能通过 git 客户端访问。
这会在luajit 下创建一个新的目录树。更改它,切换到您要使用的分支并按照通常的构建说明进行操作。使用git pull从(只读)公共存储库中获取更新。还有一个 可浏览的镜像 和一个 GitHub 镜像。
git master分支将被逐步淘汰并固定到 v2.0分支。请改用 版本化分支v2.1 或v2.0 。
积极开发的分支发布
仅偶尔发布。强烈建议您关注 git 分支。
需要发布的发行版应该定期对分支进行快照。不要试图挑选或反向移植单个更改,无论独立的单个更改看起来如何(因为它们通常不是)。
注意:每个版本的 tar.gz 和 zip 文件具有相同的内容——您只需要下载其中一个。
文件名 | 日期 | .tar.gz | 。压缩 |
LuaJIT-2.1.0-beta3 | 2017-05-01 | 1001K ▼ | 1130K ▼ |
LuaJIT-2.0.5 | 2017-05-01 | 830K ▼ | 940K ▼ |
历史版本
这是历史版本的存档包的列表。请考虑使用积极开发的版本,除非您有特殊需要。
文件名 | 日期 | .tar.gz | 。压缩 |
LuaJIT-1.1.8 | 2012-04-16 | 362K ▼ | 423K ▼ |
LuaJIT-1.0.3 | 2005-09-08 | 301K ▼ |
SHA256 校验和
1ad2e34b111c802f9d0cdf019e986909123237a28c746b21295b63c9e785d9c3 LuaJIT-2.1.0-beta3.tar.gz
fcc4069bfaf909f762844d6404a8c5940591b00237ffce1781e887a0964140da LuaJIT-2.1.0-beta3.zip
874b1f8297c697821f561f9b73b57ffd419ed8f4278c82e05b48806d30c1e979 LuaJIT-2.0.5.tar.gz
95f655cff930781619f0fbbab707fb8c05f406d9007a3505c8243e3dbbfacec8 LuaJIT-2.0.5.zip
42f095d0215d76c29b7b040ad52dddc1783ffc6e3021b8a831627973a8a32862 LuaJIT-1.1.8.tar.gz
d59751726e6d3f22a4b3cfb158d728b8feea6aa3b9ee30af610685bc28b0e6c8 LuaJIT-1.1.8.zip
e39204aad8d2a3f9ef74a4a515fedf3cce3f55ff247af8ae50f2a8cb01f257c3 LuaJIT-1.0.3.tar.gz
安装
LuaJIT 仅作为源包分发。本页介绍了如何使用不同的操作系统和 C 编译器构建和安装 LuaJIT。
对于不耐烦的人(在 POSIX 系统上)
make && sudo make install
要求
系统
LuaJIT 目前在大多数系统上都是开箱即用的:
OS | Min. Version | Requirements | LuaJIT Versions |
Windows | 7 | x86 or x64, ARM64: TBA | v2.0 – |
Linux | v2.0 – | ||
*BSD | v2.0 – | ||
macOS (OSX) | 10.4 | v2.1 – | |
POSIX | mmap, dlopen | v2.0 – | |
Android | 4.0 | Recent Android NDK | v2.0 – |
iOS | 3.0 | Xcode iOS SDK | v2.1 – |
PS3 | PS3 SDK | v2.0 – v2.1 EOL | |
PS4 | PS4 SDK (ORBIS) | v2.0 – | |
PS5 | PS5 SDK (PROSPERO) | v2.1 – | |
PS Vita | PS Vita SDK (PSP2) | v2.0 – v2.1 EOL | |
Xbox 360 | Xbox 360 SDK (XEDK) | v2.0 – v2.1 EOL | |
Xbox One | Xbox One SDK (DURANGO) | v2.1 – | |
Nintendo Switch | NintendoSDK + NX Addon | v2.1 – |
代码库为更多系统定义了兼容性,但没有官方支持。
工具链
构建 LuaJIT 需要基于 GCC、Clang/LLVM 或 MSVC++ 的最新工具链。
基于 Makefile 的构建系统需要 GNU Make 并支持交叉构建。为 MSVC++ 构建和控制台交叉构建提供了批处理文件。
CPU 架构
CPU | Bits | Requirements | Variants | LuaJIT Versions |
x86 | 32 | v2.1+: SSE2 | v2.0 – | |
x64 | 64 | v2.0 – | ||
ARM | 32 | ARMv5+, ARM9E+ | hard-fp + soft-fp | v2.0 – |
ARM64 | 64 | ARM64le + ARM64be | v2.1 – | |
PPC32 | 32 | hard-fp + soft-fp | v2.0 – v2.1 EOL | |
PPC/e500 | 32 | e500v2 | v2.0 EOL | |
MIPS32 | 32 | MIPS32r1 – r5 | hard-fp + soft-fp | v2.0 – |
MIPS64 | 64 | MIPS64r1 – r5 | hard-fp + soft-fp | v2.1 – |
MIPS64 | 64 | MIPS64r6 | hard-fp + soft-fp | v2.1 EOL |
RISC-V | 64 | RVA22+ | TBA |
没有计划添加历史架构或继续支持报废 (EOL) 架构,因为不再有新的 CPU 通常可用。同样,没有计划支持边缘和/或事实上的死架构。
配置 LuaJIT
标准配置应该适用于大多数安装。通常不需要调整设置。以下文件包含所有用户可配置的设置:
- src/luaconf.h设置一些配置变量。
- Makefile具有安装LuaJIT 的设置(仅限 POSIX)。
- src/Makefile具有在 POSIX、MinGW 或 Cygwin 下编译LuaJIT 的设置。
- src/msvcbuild.bat具有使用 MSVC (Visual Studio) 编译 LuaJIT 的设置。
在更改任何设置之前,请阅读这些文件中的说明。
POSIX 系统(Linux、macOS、*BSD 等)
先决条件
根据您的发行版,您可能需要安装 GCC 包、开发头文件和/或完整的 SDK。例如,在当前的 Debian/Ubuntu 上,使用包管理器 安装libc6-dev 。
获取最新版本的推荐方法是从 git 存储库中拉取。
或者下载最新的 LuaJIT 源代码包(选择 .tar.gz)。将其移动到您选择的目录,打开终端窗口并切换到该目录。现在解压缩存档并更改为新创建的目录(将 XX.YY.ZZ 替换为您下载的版本):
tar zxf LuaJIT-XX.YY.ZZ.tar.gz
cd LuaJIT-XX.YY.ZZ
构建 LuaJIT
提供的 Makefile 尝试自动检测您的操作系统和编译器所需的设置。它们需要使用 GNU Make 运行,无论如何,这可能是您系统上的默认设置。只需运行:
make
这始终会构建本机二进制文件,具体取决于您运行此命令的主机操作系统。检查 交叉编译部分以获取更多选项。
默认情况下,仅在前缀/usr/local下搜索模块。您可以通过附加PREFIX选项为搜索路径添加额外的前缀 ,例如:
make PREFIX=/home/myself/lj2
请使用 LuaJIT 2.1 分支为 macOS (OSX)编译。
安装 LuaJIT
顶层 Makefile 默认安装 LuaJIT 在 /usr/local下,即可执行文件最终在 /usr/local/bin等等。您需要 root 权限才能写入此路径。因此,假设您的系统上安装了 sudo,请运行以下命令并输入您的 sudo 密码:
sudo make install
否则将目录前缀指定为绝对路径,例如:
make install PREFIX=/home/myself/lj2
显然,在构建和安装期间给出的前缀需要相同。
安装其中一个开源 SDK(MinGW或 Cygwin),它带有修改后的 GCC 以及所需的开发头文件。或者安装微软的 Visual Studio (MSVC)。
接下来,从 git 存储库中提取或下载源包并使用存档管理器(例如 Windows 资源管理器)将其解压到您选择的目录。
使用 MSVC 构建
打开“Visual Studio 命令提示符”(x86 或 x64),cd到您解压缩源代码的目录并运行以下命令:
cd src
msvcbuild
检查msvcbuild.bat文件以获取更多选项。然后按照下面的安装说明进行操作。
使用 MinGW 或 Cygwin 构建
打开命令提示符窗口并确保 MinGW 或 Cygwin 程序在您的路径中。然后cd到 git 存储库的目录或解压缩源的目录。然后为 MinGW 运行此命令:
mingw32-make
Or this command for Cygwin:
make
Then follow the installation instructions below.
然后按照下面的安装说明进行操作。
安装 LuaJIT
将luajit.exe和lua51.dll(在src 目录下构建)复制到新创建的目录下(任何位置都可以)。在其下方添加lua和lua\jit目录,并将所有 Lua 文件从发行版的src\jit目录复制到后一个目录。
没有硬编码的绝对路径名——所有模块都是相对于安装luajit.exe的目录加载的(参见src/luaconf.h)。
交叉编译 LuaJIT
基于 GNU Makefile 的构建系统允许在任何主机上为任何受支持的目标进行交叉编译,只要两种架构具有相同的指针大小。如果您想在 x64 操作系统上交叉编译到任何 32 位目标,您需要安装 multilib 开发包(例如 Debian/Ubuntu 上的 libc6-dev-i386)并构建 32 位主机部分(HOST_CC="gcc - m32" )。
每当主机操作系统和目标操作系统不同时,您都需要指定TARGET_SYS,否则会出现汇编程序或链接器错误。例如,如果您在 Windows 或 macOS 主机上为嵌入式 Linux 或 Android 进行编译,则需要将TARGET_SYS=Linux添加到下面的示例中。对于最小的目标操作系统,您可能需要禁用src/Makefile中的内置分配器 并使用TARGET_SYS=Other。不要忘记为安装步骤指定相同的TARGET_SYS。
下面的示例仅显示了一些流行的目标 - 请查看src/Makefile中的注释以获取更多详细信息。
# Cross-compile to a 32 bit binary on a multilib x64 OS
make CC="gcc -m32"
# Cross-compile on Debian/Ubuntu for Windows (mingw32 package)
make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows
CROSS前缀允许指定标准 的GNU 交叉编译工具链(Binutils、GCC 和匹配的 libc)。前缀可能会因构建工具链 的--target不同而有所不同(注意CROSS前缀后面有一个"-")。下面的示例使用适用于 Linux 的规范工具链三元组。
由于在运行时通常没有简单的方法来检测 CPU 功能,因此使用正确的 CPU 或架构设置进行编译非常重要。您可以在自己构建工具链时指定这些。或将 -mcpu=...或-march=...添加到TARGET_CFLAGS。对于 ARM,拥有正确的-mfloat-abi=...设置也很重要。否则 LuaJIT 可能无法以目标 CPU 的全部性能运行。
# ARM soft-float
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
TARGET_CFLAGS="-mfloat-abi=soft"
# ARM soft-float ABI with VFP (example for Cortex-A8)
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"
# ARM hard-float ABI with VFP (armhf, requires recent toolchain)
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
# PPC
make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
# PPC/e500v2 (fast interpreter only)
make HOST_CC="gcc -m32" CROSS=powerpc-e500v2-linux-gnuspe-
# MIPS big-endian
make HOST_CC="gcc -m32" CROSS=mips-linux-
# MIPS little-endian
make HOST_CC="gcc -m32" CROSS=mipsel-linux-
您可以使用Android NDK为Android进行 交叉编译。请调整环境变量以匹配安装位置和所需的目标平台。例如,Android 4.1 对应于 ABI 级别 16。
# Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.1+ (JB)
NDKDIR=/opt/android/ndk
NDKBIN=$NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin
NDKCROSS=$NDKBIN/arm-linux-androideabi-
NDKCC=$NDKBIN/armv7a-linux-androideabi16-clang
make HOST_CC="gcc -m32" CROSS=$NDKCROSS \
STATIC_CC=$NDKCC DYNAMIC_CC="$NDKCC -fPIC" \
TARGET_LD=$NDKCC TARGET_AR="$NDKBIN/llvm-ar rcus" \
TARGET_STRIP=$NDKBIN/llvm-strip
请使用 LuaJIT 2.1 分支为 iOS (iPhone/iPad) 编译。
控制台的交叉编译
为控制台构建 LuaJIT 需要支持的主机编译器(x86 或 x64)和来自官方控制台 SDK 的交叉编译器。
由于控制台的限制,JIT 编译器被禁用,只构建快速解释器。这仍然比普通 Lua 快,但比 JIT 编译器慢得多。FFI 也被禁用,因为它在这样的环境中不是很有用。
以下命令构建一个静态库libluajit.a,它可以链接到您的游戏,就像 Lua 库一样。
要从Linux 主机(需要 32 位 GCC,即 multilib Linux/x64)或 Windows 主机(需要 32 位 MinGW) 交叉编译PS3 ,请运行以下命令:
make HOST_CC="gcc -m32" CROSS=ppu-lv2-
要从 Windows 主机交叉编译其他控制台,请打开“用于 VS 的本机工具命令提示符”。您需要选择 32 位或 64 位版本的主机编译器来匹配目标。然后cd到下面的src目录,您已在其中解压缩了源代码并运行表中给出的构建命令:
Console | Bits | Build Command |
PS4 | 64 | ps4build |
PS Vita | 32 | psvitabuild |
Xbox 360 | 32 | xedkbuild |
请查看相应*.bat 文件中的注释以获取更多选项。
嵌入 LuaJIT
LuaJIT 与 Lua 5.1 API 兼容。如果你已经将 Lua 嵌入到你的应用程序中,你可能不需要做任何事情来切换到 LuaJIT,除了链接到不同的库:
- 强烈建议使用提供的构建系统单独构建 LuaJIT。请不要尝试将各个源文件集成到您的构建树中。您很可能会弄错内部构建依赖项或弄乱编译器标志。像对待任何其他外部库一样对待 LuaJIT,并根据您的需要将您的应用程序与动态库或静态库链接。
- 如果你想使用require()加载为普通 Lua 编译的 C 模块,你需要确保公共符号(例如lua_pushnumber)也被导出:
- 在 POSIX 系统上,您可以链接到共享库或将静态库链接到您的应用程序。在后一种情况下,您需要从主可执行文件中导出所有公共符号(例如Linux 上的-Wl、-E)并添加外部依赖项(例如Linux 上的-lm -ldl)。
- 由于 Windows 符号绑定到特定的 DLL 名称,因此您需要链接到由LuaJIT构建创建的 lua51.dll(不要重命名 DLL)。仅当您不打算在运行时加载 Lua/C 模块时,才可以在 Windows 上静态链接 LuaJIT。
使用 C API 函数初始化 LuaJIT 的其他提示:
- 这是一个 将 Lua 或 LuaJIT 嵌入应用程序的简单示例。
- 确保使用luaL_newstate。避免使用 lua_newstate,因为它使用系统中(较慢的)默认内存分配器(在 64 位架构上不支持此功能)。
- 确保使用luaL_openlibs而不是直接调用luaopen_base等的旧 Lua 5.0 风格。
- 要更改或扩展要加载的标准库列表, 请将 src/lib_init.c复制到您的项目并进行相应修改。确保jit库已加载,否则不会激活 JIT 编译器。
- 用于按位运算的bit.*模块已经内置。无需将 Lua BitOp静态链接到您的应用程序。
分发维护者的提示
LuaJIT 构建系统为大多数基于 POSIX 的发行版的需求提供了额外的规定。如果您是某个发行版的包维护者,请利用这些功能,并避免以无法形容的方式修补、颠覆、自动工具化或弄乱构建系统。
绝对不需要修补luaconf.h或任何 Makefile。并且请不要为您的软件包手动挑选文件 - 只需使用make install创建的任何文件。它创建的所有文件和目录 都是有原因的。
构建系统使用 GNU make 并根据您构建它的主机自动检测大多数设置。即使在沙盒中,这对于本机构建也应该可以正常工作。您可能需要将以下一些标志传递给 make和make install命令行以进行常规分发构建:
- PREFIX覆盖安装路径,通常应设置为/usr。设置此项还会更改模块路径和查找共享库所需的路径。
- DESTDIR是一个绝对路径,允许您安装到影子树而不是构建系统的根树。
- MULTILIB为多库系统设置特定于体系结构的库路径组件。默认值为lib。
- 查看顶级Makefile和src/Makefile 以了解要调整的其他变量。以下变量可能会被覆盖,但不建议这样做,除非像交叉构建这样的特殊需求: BUILDMODE、CC、HOST_CC、STATIC_CC、DYNAMIC_CC、CFLAGS、HOST_CFLAGS、TARGET_CFLAGS、LDFLAGS、HOST_LDFLAGS、TARGET_LDFLAGS、TARGET_SHLDFLAGS、TARGET_FLAGS、LIBS、HOST_LIBS , TARGET_LIBS, 交叉, HOST_SYS, TARGET_SYS
构建系统有一个合并构建的特殊目标,即 make amalg。这会将 LuaJIT 内核编译为一个巨大的 C 文件,并允许 GCC 生成更快、更短的代码。唉,这在构建过程中需要大量内存。这对某些用户来说可能是个问题,这就是默认情况下不启用它的原因。但对于大多数构建农场来说,这应该不是问题。建议二进制发行版在其 LuaJIT 构建中使用此目标。
The tl;dr version of the above:
make amalg PREFIX=/usr && \
make install PREFIX=/usr DESTDIR=/tmp/buildroot
最后,如果您遇到任何困难,请先 与我联系,而不是将损坏的软件包发布给毫无戒心的用户。因为无论如何,他们通常会向我(上游)而不是你(包维护者)抱怨
运行 LuaJIT
LuaJIT 只有一个独立的可执行文件,在 POSIX 系统上称为luajit ,在 Windows上称为luajit.exe 。它可用于从命令行运行简单的 Lua 语句或整个 Lua 应用程序。它也有一个交互模式。
命令行选项
luajit独立可执行文件只是常规lua独立可执行文件的略微修改版本。它也支持相同的基本选项。luajit -h 打印可用选项的简短列表。有关详细信息,请查看 Lua 手册 。
LuaJIT 有一些额外的选项:
-b[选项] 输入输出
此选项保存或列出字节码。接受以下附加选项:
- -l — 仅列出字节码。
- -s — 去除调试信息(这是默认设置)。
- -g - 保留调试信息。
- -n name - 设置模块名称(默认值:从输入名称自动检测)
- -t type - 设置输出文件类型(默认值:从输出名称自动检测)。
- -a arch — 覆盖对象文件的体系结构(默认值:本机)。
- -o os — 覆盖目标文件的操作系统(默认值:本机)。
- -e chunk — 使用块字符串作为输入。
- -(单个减号)— 使用标准输入作为输入和/或标准输出作为输出。
输出文件类型是根据输出文件名的扩展名自动检测的:
- c — C 源文件,导出的字节码数据。
- h — C 头文件,静态字节码数据。
- obj或o - 对象文件,导出的字节码数据(特定于操作系统和体系结构)。
- raw或任何其他扩展 - 原始字节码文件(便携式)。
笔记:
- 有关字节码可移植性和兼容性的信息,另请参见string.dump() 。
- 原始字节码格式的文件会被自动检测,并且可以像任何 Lua 源文件一样加载。例如,直接从命令行或使用 loadfile()、 dofile( )等。
- 要将模块的字节码静态嵌入到您的应用程序中,请生成一个目标文件并将其与您的应用程序链接。
- 在大多数基于 ELF 的系统(例如 Linux)上,您需要在链接应用程序时显式导出全局符号,例如:-Wl,-E
- require()尝试从导出的符号(在Windows 上的*.exe或lua51.dll中)和package.cpath中的共享库加载嵌入的字节码数据。
典型使用示例:
luajit -b test.lua test.out # 保存字节码到 test.out
luajit -bg test.lua test.out # 保存调试信息
luajit -be "print('hello world')" test.out # 保存命令行脚本
luajit - bl test.lua # List to stdout
luajit -bl test.lua test.txt # List to test.txt
luajit -ble "print('hello world')" # List cmdline script
luajit -b test.lua test.obj # Generate object file
# 将 test.obj 与您的应用程序链接并使用 require("test") 加载它
-j cmd[=arg[,arg...]]
此选项执行 LuaJIT 控制命令或激活可加载扩展模块之一。该命令首先在 jit.*库中查找。如果找不到匹配的函数,则加载名为jit.
以下是可用的 LuaJIT 控制命令:
- -jon — 打开 JIT 编译器(默认)。
- -joff — 关闭 JIT 编译器(仅使用解释器)。
- -jflush — 刷新已编译代码的整个缓存。
- -jv — 显示有关 JIT 编译器进度的详细信息。
- -jdump — 转储在各个编译器阶段使用的代码和结构。
-jv和-jdump命令是用 Lua编写的扩展模块。它们主要用于调试 JIT 编译器本身。有关它们的选项和输出格式的描述,请阅读源代码开头的注释块。它们可以在源代码分发的lib目录中找到,也可以安装在jit目录下。默认情况下,这是POSIX 系统上的/usr/local/share/luajit-XX.YY.ZZ/jit(将 XX.YY.ZZ 替换为已安装的版本)。
-O[级别]-O[+]标志 -O-标志-Oparam=值
此选项允许对 JIT 编译器使用的优化进行微调控制。这主要用于调试 LuaJIT 本身。请注意,JIT 编译器非常快(我们讨论的是微秒到毫秒的范围)。禁用优化对其开销没有任何明显的影响,但通常会生成运行速度较慢的代码。
第一种形式设置了一个优化级别——这使得优化标志的特定组合成为可能。-O0关闭所有优化,数字越大,优化越多。省略级别(即仅-O)设置默认优化级别,在当前版本 中为-O3 。
第二种形式添加或删除单个优化标志。第三种形式将 VM 或 JIT 编译器的参数设置为特定值。
您可以多次使用此选项(如-Ocse -O-dce -Ohotloop=10)或使用逗号分隔多个设置(如-O+cse,-dce,hotloop=10)。这些设置从左到右应用,以后的设置会覆盖之前的设置。您可以自由混合这三种形式,但请注意,设置优化级别会覆盖所有早期标志。
以下是可用的标志以及启用它们的优化级别:
Flag | -O1 | -O2 | -O3 | |
fold | • | • | • | 恒定折叠、简化和重新关联 |
cse | • | • | • | 公共子表达式消除 |
dce | • | • | • | 死码消除 |
narrow | • | • | 将数字缩小为整数 | |
loop | • | • | 循环优化(代码提升) | |
fwd | • | 负载转发 (L2L) 和存储转发 (S2L) | ||
dse | • | 死存储消除 | ||
abc | • | 数组边界检查消除 | ||
sink | • | 分配/存储下沉 | ||
fuse | • | 将操作数融合为指令 |
以下是参数及其默认设置:
Parameter | Default | |
maxtrace | 1000 | 缓存中的跟踪数的最大值 |
maxrecord | 4000 | 记录的 IR 指令数的最大值 |
maxirconst | 500 | 迹线的 IR 常数数的最大值 |
maxside | 100 | 根迹线的边迹数的最大值 |
maxsnap | 500 | 跟踪的快照数的最大值 |
hotloop | 56 | 检测热循环或热调用的迭代次数 |
hotexit | 10 | 开始边跟踪的退出次数 |
tryside | 4 | 编译侧迹的尝试次数 |
instunroll | 4 | 不稳定循环的展开因子的最大值 |
loopunroll | 15 | 侧迹中循环操作的展开因子的最大值 |
callunroll | 3 | 伪递归调用的展开因子的最大值 |
recunroll | 2 | 真正递归的展开因子最小值 |
sizemcode | 32 | 每个机器代码区域的大小(以 KBytes 为单位) (Windows: 64K) |
maxmcode | 512 | 所有机器代码区域的总大小的最大值,以千字节为单位 |