luajit开发文档中文版(一)下载和安装

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.exelua51.dll(在src 目录下构建)复制到新创建的目录下(任何位置都可以)。在其下方添加lualua\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 并根据您构建它的主机自动检测大多数设置。即使在沙盒中,这对于本机构建也应该可以正常工作。您可能需要将以下一些标志传递给 makemake install命令行以进行常规分发构建:

  • PREFIX覆盖安装路径,通常应设置为/usr设置此项还会更改模块路径和查找共享库所需的路径。
  • DESTDIR是一个绝对路径,允许您安装到影子树而不是构建系统的根树。
  • MULTILIB为多库系统设置特定于体系结构的库路径组件。默认值为lib
  • 查看顶级Makefilesrc/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 头文件,静态字节码数据。
  • objo - 对象文件,导出的字节码数据(特定于操作系统和体系结构)。
  • raw或任何其他扩展 - 原始字节码文件(便携式)。

笔记:

  • 有关字节码可移植性和兼容性的信息,另请参见string.dump() 。
  • 原始字节码格式的文件会被自动检测,并且可以像任何 Lua 源文件一样加载。例如,直接从命令行或使用 loadfile()、 dofile( )等。
  • 要将模块的字节码静态嵌入到您的应用程序中,请生成一个目标文件并将其与您的应用程序链接。
  • 在大多数基于 ELF 的系统(例如 Linux)上,您需要在链接应用程序时显式导出全局符号,例如:-Wl,-E
  • require()尝试从导出的​​符号(在Windows 上的*.exelua51.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.<cmd>的模块,并使用指定的参数(如果有)调用模块的start() 函数。-jcmd之间的空格是可选的。

以下是可用的 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 所有机器代码区域的总大小的最大值,以千字节为单位
 

posted on 2022-06-13 11:29  zh7314  阅读(3178)  评论(0编辑  收藏  举报