mirror of
https://github.com/love2d/megasource.git
synced 2026-08-12 00:20:55 +02:00
update LuaJIT to LuaJIT/LuaJIT@68354f4
This commit is contained in:
+1
-1
@@ -1 +1 @@
|
||||
1734355927
|
||||
1762386122
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
===============================================================================
|
||||
LuaJIT -- a Just-In-Time Compiler for Lua. https://luajit.org/
|
||||
|
||||
Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# For MSVC, please follow the instructions given in src/msvcbuild.bat.
|
||||
# For MinGW and Cygwin, cd to src and run make with the Makefile there.
|
||||
#
|
||||
# Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
# Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
##############################################################################
|
||||
|
||||
MAJVER= 2
|
||||
@@ -110,7 +110,7 @@ else
|
||||
endif
|
||||
TARGET_SYS?= $(HOST_SYS)
|
||||
|
||||
ifeq (Darwin,$(TARGET_SYS))
|
||||
ifneq (,$(filter $(TARGET_SYS),Darwin iOS))
|
||||
INSTALL_SONAME= $(INSTALL_DYLIBNAME)
|
||||
INSTALL_SOSHORT1= $(INSTALL_DYLIBSHORT1)
|
||||
INSTALL_SOSHORT2= $(INSTALL_DYLIBSHORT2)
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.
|
||||
|
||||
Project Homepage: https://luajit.org/
|
||||
|
||||
LuaJIT is Copyright (C) 2005-2023 Mike Pall.
|
||||
LuaJIT is Copyright (C) 2005-2025 Mike Pall.
|
||||
LuaJIT is free software, released under the MIT license.
|
||||
See full Copyright Notice in the COPYRIGHT file or in luajit.h.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2004-2023 Mike Pall.
|
||||
/* Copyright (C) 2004-2025 Mike Pall.
|
||||
*
|
||||
* You are welcome to use the general ideas of this design for your own sites.
|
||||
* But please do not steal the stylesheet, the layout or the color scheme.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2004-2023 Mike Pall.
|
||||
/* Copyright (C) 2004-2025 Mike Pall.
|
||||
*
|
||||
* You are welcome to use the general ideas of this design for your own sites.
|
||||
* But please do not steal the stylesheet, the layout or the color scheme.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Contact</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -94,7 +94,7 @@ don't like that, please complain to Google or Microsoft, not me.
|
||||
<h2>Copyright</h2>
|
||||
<p>
|
||||
All documentation is
|
||||
Copyright © 2005-2023 Mike Pall.
|
||||
Copyright © 2005-2025 Mike Pall.
|
||||
</p>
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ Copyright © 2005-2023 Mike Pall.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>String Buffer Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -679,7 +679,7 @@ mappings of files are OK, but only if the file does not change.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Lua/C API Extensions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -173,7 +173,7 @@ Also note that this mechanism is not without overhead.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -316,7 +316,7 @@ without undue conversion penalties.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>ffi.* API Functions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -558,7 +558,7 @@ named <tt>i</tt>.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Semantics</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -1259,7 +1259,7 @@ compiled.</li>
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Tutorial</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -587,7 +587,7 @@ it to a local variable in the function scope is unnecessary.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>jit.* Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -187,7 +187,7 @@ if you want to know more.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Profiler</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -349,7 +349,7 @@ use.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Extensions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -492,7 +492,7 @@ C++ destructors.</li>
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Installation</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -117,7 +117,7 @@ hold all user-configurable settings:
|
||||
<li><tt>Makefile</tt> has settings for <b>installing</b> LuaJIT (POSIX
|
||||
only).</li>
|
||||
<li><tt>src/Makefile</tt> has settings for <b>compiling</b> LuaJIT
|
||||
under POSIX, MinGW or Cygwin.</li>
|
||||
under POSIX or MinGW.</li>
|
||||
<li><tt>src/msvcbuild.bat</tt> has settings for compiling LuaJIT with
|
||||
MSVC (Visual Studio).</li>
|
||||
</ul>
|
||||
@@ -195,10 +195,8 @@ Obviously the prefixes given during build and installation need to be the same.
|
||||
<h2 id="windows">Windows Systems</h2>
|
||||
<h3>Prerequisites</h3>
|
||||
<p>
|
||||
Either install one of the open source SDKs
|
||||
(<a href="http://mingw.org/"><span class="ext">»</span> MinGW</a> or
|
||||
<a href="https://www.cygwin.com/"><span class="ext">»</span> Cygwin</a>), which come with a modified
|
||||
GCC plus the required development headers.
|
||||
Either install the open source SDK <a href="http://mingw.org/"><span class="ext">»</span> MinGW</a>,
|
||||
which comes with a modified GCC plus the required development headers.
|
||||
Or install Microsoft's Visual Studio (MSVC).
|
||||
</p>
|
||||
<h3>Building with MSVC</h3>
|
||||
@@ -217,9 +215,9 @@ Then follow the installation instructions below.
|
||||
<p>
|
||||
For an x64 to ARM64 cross-build run this first: <tt>vcvarsall.bat x64_arm64</tt>
|
||||
</p>
|
||||
<h3>Building with MinGW or Cygwin</h3>
|
||||
<h3>Building with MinGW</h3>
|
||||
<p>
|
||||
Open a command prompt window and make sure the MinGW or Cygwin programs
|
||||
Open a command prompt window and make sure the MinGW programs
|
||||
are in your path. Then <tt>cd</tt> to the directory of the git repository.
|
||||
Then run this command for MinGW:
|
||||
</p>
|
||||
@@ -227,12 +225,6 @@ Then run this command for MinGW:
|
||||
mingw32-make
|
||||
</pre>
|
||||
<p>
|
||||
Or this command for Cygwin:
|
||||
</p>
|
||||
<pre class="code">
|
||||
make
|
||||
</pre>
|
||||
<p>
|
||||
Then follow the installation instructions below.
|
||||
</p>
|
||||
<h3>Installing LuaJIT</h3>
|
||||
@@ -249,6 +241,19 @@ absolute path names — all modules are loaded relative to the
|
||||
directory where <tt>luajit.exe</tt> is installed
|
||||
(see <tt>src/luaconf.h</tt>).
|
||||
</p>
|
||||
<p>
|
||||
The final directory layout should look like this:
|
||||
</p>
|
||||
<pre class="code">
|
||||
├── luajit.exe
|
||||
├── lua51.dll
|
||||
├── <- put your own classic Lua/C API modules (*.dll) here
|
||||
└── lua
|
||||
├── <- put your own Lua modules (*.lua) here
|
||||
└── jit
|
||||
├── bc.lua
|
||||
└── (etc …)
|
||||
</pre>
|
||||
|
||||
<h2 id="cross">Cross-compiling LuaJIT</h2>
|
||||
<p>
|
||||
@@ -572,7 +577,7 @@ to me (the upstream) and not you (the package maintainer), anyway.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>LuaJIT</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -122,7 +122,7 @@ Lua is a powerful, dynamic and light-weight programming language.
|
||||
It may be embedded or used as a general-purpose, stand-alone language.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT is Copyright © 2005-2023 Mike Pall, released under the
|
||||
LuaJIT is Copyright © 2005-2025 Mike Pall, released under the
|
||||
<a href="https://www.opensource.org/licenses/mit-license.php"><span class="ext">»</span> MIT open source license</a>.
|
||||
</p>
|
||||
<p>
|
||||
@@ -193,7 +193,7 @@ Please select a sub-topic in the navigation bar to learn more about LuaJIT.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Running LuaJIT</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2025">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -299,15 +299,15 @@ Here are the parameters and their default settings:
|
||||
<tr class="even">
|
||||
<td class="param_name">recunroll</td><td class="param_default">2</td><td class="param_desc">Min. unroll factor for true recursion</td></tr>
|
||||
<tr class="odd separate">
|
||||
<td class="param_name">sizemcode</td><td class="param_default">32</td><td class="param_desc">Size of each machine code area in KBytes (Windows: 64K)</td></tr>
|
||||
<td class="param_name">sizemcode</td><td class="param_default">64</td><td class="param_desc">Size of each machine code area in KBytes</td></tr>
|
||||
<tr class="even">
|
||||
<td class="param_name">maxmcode</td><td class="param_default">512</td><td class="param_desc">Max. total size of all machine code areas in KBytes</td></tr>
|
||||
<td class="param_name">maxmcode</td><td class="param_default">2048</td><td class="param_desc">Max. total size of all machine code areas in KBytes</td></tr>
|
||||
</table>
|
||||
<br class="flush">
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2023
|
||||
Copyright © 2005-2025
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM ARM encoding engine.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM ARM module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM ARM64 encoding engine.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM ARM64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@@ -244,6 +244,10 @@ local map_cond = {
|
||||
hs = 2, lo = 3,
|
||||
}
|
||||
|
||||
local map_bti = {
|
||||
c = 0x40, j = 0x80, jc = 0xc0,
|
||||
}
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
local parse_reg_type
|
||||
@@ -475,6 +479,12 @@ local function parse_cond(expr, inv)
|
||||
return shl(bit.bxor(c, inv), 12)
|
||||
end
|
||||
|
||||
local function parse_map(expr, map)
|
||||
local x = map[expr]
|
||||
if not x then werror("bad operand") end
|
||||
return x
|
||||
end
|
||||
|
||||
local function parse_load(params, nparams, n, op)
|
||||
if params[n+2] then werror("too many operands") end
|
||||
local scale = shr(op, 30)
|
||||
@@ -823,11 +833,21 @@ map_op = {
|
||||
tbz_3 = "36000000DTBw|36000000DTBx",
|
||||
tbnz_3 = "37000000DTBw|37000000DTBx",
|
||||
|
||||
-- Branch Target Identification.
|
||||
bti_1 = "d503241ft",
|
||||
|
||||
-- ARM64e: Pointer authentication codes (PAC).
|
||||
blraaz_1 = "d63f081fNx",
|
||||
blrabz_1 = "d63f0c1fNx",
|
||||
braa_2 = "d71f0800NDx",
|
||||
brab_2 = "d71f0c00NDx",
|
||||
braaz_1 = "d61f081fNx",
|
||||
brabz_1 = "d61f0c1fNx",
|
||||
paciasp_0 = "d503233f",
|
||||
pacibsp_0 = "d503237f",
|
||||
autiasp_0 = "d50323bf",
|
||||
autibsp_0 = "d50323ff",
|
||||
retaa_0 = "d65f0bff",
|
||||
retab_0 = "d65f0fff",
|
||||
|
||||
-- Miscellaneous instructions.
|
||||
@@ -996,6 +1016,8 @@ local function parse_template(params, template, nparams, pos)
|
||||
op = op + parse_cond(q, 0); n = n + 1
|
||||
elseif p == "c" then
|
||||
op = op + parse_cond(q, 1); n = n + 1
|
||||
elseif p == "t" then
|
||||
op = op + parse_map(q, map_bti); n = n + 1
|
||||
|
||||
else
|
||||
assert(false)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM MIPS encoding engine.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM MIPS32/MIPS64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM MIPS64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
-- This module just sets 64 bit mode for the combined MIPS/MIPS64 module.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM PPC/PPC64 encoding engine.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM PPC/PPC64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
--
|
||||
-- Support for various extensions contributed by Caio Souza Oliveira.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM encoding engine prototypes.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM x64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
-- This module just sets 64 bit mode for the combined x86/x64 module.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM x86 encoding engine.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM x86/x64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- DynASM. A dynamic assembler for code generation engines.
|
||||
-- Originally designed and implemented for LuaJIT.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- See below for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@@ -17,7 +17,7 @@ local _info = {
|
||||
url = "https://luajit.org/dynasm.html",
|
||||
license = "MIT",
|
||||
copyright = [[
|
||||
Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
||||
@@ -74,7 +74,7 @@ luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end"
|
||||
Runs some nested loops and shows the resulting traces.
|
||||
.SH COPYRIGHT
|
||||
.PP
|
||||
\fBLuaJIT\fR is Copyright \(co 2005-2023 Mike Pall.
|
||||
\fBLuaJIT\fR is Copyright \(co 2005-2025 Mike Pall.
|
||||
.br
|
||||
\fBLuaJIT\fR is open source software, released under the MIT license.
|
||||
.SH SEE ALSO
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# Also works with MinGW and Cygwin on Windows.
|
||||
# Please check msvcbuild.bat for building with MSVC on Windows.
|
||||
#
|
||||
# Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
# Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
##############################################################################
|
||||
|
||||
MAJVER= 2
|
||||
@@ -302,6 +302,9 @@ endif
|
||||
ifneq (,$(INSTALL_LJLIBD))
|
||||
TARGET_XCFLAGS+= -DLUA_LJDIR=\"$(INSTALL_LJLIBD)\"
|
||||
endif
|
||||
ifeq (,$(shell $(TARGET_CC) -o /dev/null -c -x c /dev/null -fno-strict-float-cast-overflow 2>/dev/null || echo 1))
|
||||
TARGET_XCFLAGS+= -fno-strict-float-cast-overflow
|
||||
endif
|
||||
|
||||
##############################################################################
|
||||
# Target system detection.
|
||||
@@ -354,6 +357,9 @@ else
|
||||
ifeq (GNU/kFreeBSD,$(TARGET_SYS))
|
||||
TARGET_XLIBS+= -ldl
|
||||
endif
|
||||
ifeq (GNU,$(TARGET_SYS))
|
||||
TARGET_XLIBS+= -ldl
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@@ -440,6 +446,14 @@ ifneq (,$(findstring LJ_ABI_PAUTH 1,$(TARGET_TESTARCH)))
|
||||
DASM_AFLAGS+= -D PAUTH
|
||||
TARGET_ARCH+= -DLJ_ABI_PAUTH=1
|
||||
endif
|
||||
ifneq (,$(findstring LJ_ABI_BRANCH_TRACK 1,$(TARGET_TESTARCH)))
|
||||
DASM_AFLAGS+= -D BRANCH_TRACK
|
||||
TARGET_ARCH+= -DLJ_ABI_BRANCH_TRACK=1
|
||||
endif
|
||||
ifneq (,$(findstring LJ_ABI_SHADOW_STACK 1,$(TARGET_TESTARCH)))
|
||||
DASM_AFLAGS+= -D SHADOW_STACK
|
||||
TARGET_ARCH+= -DLJ_ABI_SHADOW_STACK=1
|
||||
endif
|
||||
DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH))))
|
||||
ifeq (Windows,$(TARGET_SYS))
|
||||
DASM_AFLAGS+= -D WIN
|
||||
|
||||
@@ -25,7 +25,7 @@ lib_ffi.o: lib_ffi.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
|
||||
lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h
|
||||
lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
|
||||
lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_buf.h lj_str.h lj_state.h \
|
||||
lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h
|
||||
lj_strfmt.h lj_ff.h lj_ffdef.h lj_lib.h lj_strscan.h lj_libdef.h
|
||||
lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
|
||||
lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \
|
||||
lj_state.h lj_bc.h lj_ctype.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h \
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** This is a tool to build the hand-tuned assembler code required for
|
||||
** LuaJIT's bytecode interpreter. It supports a variety of output formats
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _BUILDVM_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: Assembler source code emitter.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: IR folding hash table generator.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: library definition compiler.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: PE object emitter.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Only used for building on Windows, since we cannot assume the presence
|
||||
** of a suitable assembler. The host and target byte order must match.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- Lua script to dump the bytecode of the library functions written in Lua.
|
||||
-- The resulting 'buildvm_libbc.h' is used for the build process of LuaJIT.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- Lua script to generate a customized, minified version of Lua.
|
||||
-- The resulting 'minilua' is used for the build process of LuaJIT.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- Lua script to embed the rolling release version in luajit.h.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT bytecode listing module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT module to save/list bytecode.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM64 disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
--
|
||||
-- Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
|
||||
@@ -695,7 +695,10 @@ local map_br = { -- Branches, exception generating and system instructions.
|
||||
},
|
||||
{ -- System instructions.
|
||||
shift = 0, mask = 0x3fffff,
|
||||
[0x03201f] = "nop"
|
||||
[0x03201f] = "nop",
|
||||
[0x03245f] = "bti c",
|
||||
[0x03249f] = "bti j",
|
||||
[0x0324df] = "bti jc",
|
||||
},
|
||||
{ -- Unconditional branch, register.
|
||||
shift = 0, mask = 0xfffc1f,
|
||||
@@ -920,7 +923,7 @@ local function disass_ins(ctx)
|
||||
elseif p == "B" then
|
||||
local addr = ctx.addr + pos + parse_immpc(op, name)
|
||||
ctx.rel = addr
|
||||
x = "0x"..tohex(addr)
|
||||
x = format("0x%08x", addr)
|
||||
elseif p == "T" then
|
||||
x = bor(band(rshift(op, 26), 32), band(rshift(op, 19), 31))
|
||||
elseif p == "V" then
|
||||
@@ -1171,6 +1174,9 @@ local function disass_ins(ctx)
|
||||
end
|
||||
end
|
||||
second0 = true
|
||||
elseif p == " " then
|
||||
operands[#operands+1] = pat:match(" (.*)")
|
||||
break
|
||||
else
|
||||
assert(false)
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM64BE disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- ARM64 instructions are always little-endian. So just forward to the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT/X license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the big-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64EL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64R6 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the r6 big-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64R6EL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the r6 little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPSEL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT PPC disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT/X license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT x64 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the 64 bit functions from the combined
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT x86/x64 disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
@@ -122,7 +122,7 @@ local map_opc2 = {
|
||||
"movlhpsXrm$movhpsXrm|movshdupXrm|movhpdXrm",
|
||||
"movhpsXmr||movhpdXmr",
|
||||
"$prefetcht!Bm","hintnopVm","hintnopVm","hintnopVm",
|
||||
"hintnopVm","hintnopVm","hintnopVm","hintnopVm",
|
||||
"hintnopVm","hintnopVm","endbr*hintnopVm","hintnopVm",
|
||||
--2x
|
||||
"movUmx$","movUmy$","movUxm$","movUym$","movUmz$",nil,"movUzm$",nil,
|
||||
"movapsXrm||movapdXrm",
|
||||
@@ -804,6 +804,24 @@ map_act = {
|
||||
return dispatch(ctx, map_opcvm[ctx.mrm])
|
||||
end,
|
||||
|
||||
-- Special NOP for endbr64/endbr32.
|
||||
endbr = function(ctx, name, pat)
|
||||
if ctx.rep then
|
||||
local pos = ctx.pos
|
||||
local b = byte(ctx.code, pos)
|
||||
local text
|
||||
if b == 0xfa then text = "endbr64"
|
||||
elseif b == 0xfb then text = "endbr64"
|
||||
end
|
||||
if text then
|
||||
ctx.pos = pos + 1
|
||||
ctx.rep = nil
|
||||
return putop(ctx, text)
|
||||
end
|
||||
end
|
||||
return dispatch(ctx, pat)
|
||||
end,
|
||||
|
||||
-- Floating point opcode dispatch.
|
||||
fp = function(ctx, name, pat)
|
||||
local mrm = getmrm(ctx); if not mrm then return incomplete(ctx) end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT compiler dump module.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT profiler.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- Verbose mode of the LuaJIT compiler.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT profiler zones.
|
||||
--
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2025 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Auxiliary library for the Lua/C API.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major parts taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Base and coroutine library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
@@ -146,6 +146,8 @@ LJLIB_CF(getfenv) LJLIB_REC(.)
|
||||
cTValue *o = L->base;
|
||||
if (!(o < L->top && tvisfunc(o))) {
|
||||
int level = lj_lib_optint(L, 1, 1);
|
||||
if (level < 0)
|
||||
lj_err_arg(L, 1, LJ_ERR_INVLVL);
|
||||
o = lj_debug_frame(L, level, &level);
|
||||
if (o == NULL)
|
||||
lj_err_arg(L, 1, LJ_ERR_INVLVL);
|
||||
@@ -168,6 +170,8 @@ LJLIB_CF(setfenv)
|
||||
setgcref(L->env, obj2gco(t));
|
||||
return 0;
|
||||
}
|
||||
if (level < 0)
|
||||
lj_err_arg(L, 1, LJ_ERR_INVLVL);
|
||||
o = lj_debug_frame(L, level, &level);
|
||||
if (o == NULL)
|
||||
lj_err_arg(L, 1, LJ_ERR_INVLVL);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bit manipulation library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_bit_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_buffer_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Debug library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_ffi_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Library initialization.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major parts taken verbatim from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** I/O library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "lj_strfmt.h"
|
||||
#include "lj_ff.h"
|
||||
#include "lj_lib.h"
|
||||
#include "lj_strscan.h"
|
||||
|
||||
/* Userdata payload for I/O file. */
|
||||
typedef struct IOFileUD {
|
||||
@@ -323,13 +324,14 @@ LJLIB_CF(io_method_seek)
|
||||
FILE *fp = io_tofile(L)->fp;
|
||||
int opt = lj_lib_checkopt(L, 2, 1, "\3set\3cur\3end");
|
||||
int64_t ofs = 0;
|
||||
cTValue *o;
|
||||
TValue *o;
|
||||
int res;
|
||||
if (opt == 0) opt = SEEK_SET;
|
||||
else if (opt == 1) opt = SEEK_CUR;
|
||||
else if (opt == 2) opt = SEEK_END;
|
||||
o = L->base+2;
|
||||
if (o < L->top) {
|
||||
if (tvisstr(o)) lj_strscan_num(strV(o), o);
|
||||
if (tvisint(o))
|
||||
ofs = (int64_t)intV(o);
|
||||
else if (tvisnum(o))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** JIT library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_jit_c
|
||||
@@ -479,12 +479,21 @@ static int jitopt_param(jit_State *J, const char *str)
|
||||
size_t len = *(const uint8_t *)lst;
|
||||
lj_assertJ(len != 0, "bad JIT_P_STRING");
|
||||
if (strncmp(str, lst+1, len) == 0 && str[len] == '=') {
|
||||
int32_t n = 0;
|
||||
uint32_t n = 0;
|
||||
const char *p = &str[len+1];
|
||||
while (*p >= '0' && *p <= '9')
|
||||
n = n*10 + (*p++ - '0');
|
||||
if (*p) return 0; /* Malformed number. */
|
||||
J->param[i] = n;
|
||||
if (*p || (int32_t)n < 0) return 0; /* Malformed number. */
|
||||
if (i == JIT_P_sizemcode) { /* Adjust to required range here. */
|
||||
#if LJ_TARGET_JUMPRANGE
|
||||
uint32_t maxkb = ((1 << (LJ_TARGET_JUMPRANGE - 10)) - 64);
|
||||
#else
|
||||
uint32_t maxkb = ((1 << (31 - 10)) - 64);
|
||||
#endif
|
||||
n = (n + (LJ_PAGESIZE >> 10) - 1) & ~((LJ_PAGESIZE >> 10) - 1);
|
||||
if (n > maxkb) n = maxkb;
|
||||
}
|
||||
J->param[i] = (int32_t)n;
|
||||
if (i == JIT_P_hotloop)
|
||||
lj_dispatch_init_hotcount(J2G(J));
|
||||
return 1; /* Ok. */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Math library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** OS library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Package library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** String library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Table library.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Public Lua/C API.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Target architecture selection.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_ARCH_H
|
||||
@@ -96,6 +96,9 @@
|
||||
#elif defined(__QNX__)
|
||||
#define LJ_TARGET_QNX 1
|
||||
#define LUAJIT_OS LUAJIT_OS_POSIX
|
||||
#elif defined(__GNU__)
|
||||
#define LJ_TARGET_HURD 1
|
||||
#define LUAJIT_OS LUAJIT_OS_POSIX
|
||||
#else
|
||||
#define LUAJIT_OS LUAJIT_OS_OTHER
|
||||
#endif
|
||||
@@ -216,6 +219,29 @@
|
||||
#error "macOS requires GC64 -- don't disable it"
|
||||
#endif
|
||||
|
||||
#if !defined(LJ_ABI_BRANCH_TRACK) && (__CET__ & 1) && \
|
||||
LJ_TARGET_GC64 && defined(LUAJIT_ENABLE_CET_BR)
|
||||
/*
|
||||
** Control-Flow Enforcement Technique (CET) indirect branch tracking (IBT).
|
||||
** This is not enabled by default because it causes a notable slowdown of
|
||||
** the interpreter on all x64 CPUs, whether they have CET enabled or not.
|
||||
** If your toolchain enables -fcf-protection=branch by default, you need
|
||||
** to build with: make amalg XCFLAGS=-DLUAJIT_ENABLE_CET_BR
|
||||
*/
|
||||
#define LJ_ABI_BRANCH_TRACK 1
|
||||
#endif
|
||||
|
||||
#if !defined(LJ_ABI_SHADOW_STACK) && (__CET__ & 2)
|
||||
/*
|
||||
** Control-Flow Enforcement Technique (CET) shadow stack (CET-SS).
|
||||
** It has no code overhead and doesn't cause any slowdowns when unused.
|
||||
** It can also be unconditionally enabled since all code already follows
|
||||
** a strict CALL to RET correspondence for performance reasons (all modern
|
||||
** CPUs use a (non-enforcing) shadow stack for return branch prediction).
|
||||
*/
|
||||
#define LJ_ABI_SHADOW_STACK 1
|
||||
#endif
|
||||
|
||||
#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM
|
||||
|
||||
#define LJ_ARCH_NAME "arm"
|
||||
@@ -262,6 +288,11 @@
|
||||
#if !defined(LJ_ABI_PAUTH) && defined(__arm64e__)
|
||||
#define LJ_ABI_PAUTH 1
|
||||
#endif
|
||||
#if !defined(LJ_ABI_BRANCH_TRACK) && (__ARM_FEATURE_BTI_DEFAULT & 1) && \
|
||||
defined(LUAJIT_ENABLE_CET_BR)
|
||||
/* See comments about LUAJIT_ENABLE_CET_BR above. */
|
||||
#define LJ_ABI_BRANCH_TRACK 1
|
||||
#endif
|
||||
#define LJ_TARGET_ARM64 1
|
||||
#define LJ_TARGET_EHRETREG 0
|
||||
#define LJ_TARGET_EHRAREG 30
|
||||
@@ -270,6 +301,7 @@
|
||||
#define LJ_TARGET_MASKROT 1
|
||||
#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
|
||||
#define LJ_TARGET_GC64 1
|
||||
#define LJ_PAGESIZE 16384
|
||||
#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
|
||||
|
||||
#define LJ_ARCH_VERSION 80
|
||||
@@ -425,7 +457,7 @@
|
||||
#define LJ_TARGET_MIPS 1
|
||||
#define LJ_TARGET_EHRETREG 4
|
||||
#define LJ_TARGET_EHRAREG 31
|
||||
#define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */
|
||||
#define LJ_TARGET_JUMPRANGE 28 /* 2^28 = 256MB-aligned region */
|
||||
#define LJ_TARGET_MASKSHIFT 1
|
||||
#define LJ_TARGET_MASKROT 1
|
||||
#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_asm_c
|
||||
@@ -93,6 +93,10 @@ typedef struct ASMState {
|
||||
MCode *invmcp; /* Points to invertible loop branch (or NULL). */
|
||||
MCode *flagmcp; /* Pending opportunity to merge flag setting ins. */
|
||||
MCode *realign; /* Realign loop if not NULL. */
|
||||
MCode *mctail; /* Tail of trace before stack adjust + jmp. */
|
||||
#if LJ_TARGET_PPC || LJ_TARGET_ARM64
|
||||
MCode *mcexit; /* Pointer to exit stubs. */
|
||||
#endif
|
||||
|
||||
#ifdef LUAJIT_RANDOM_RA
|
||||
/* Randomize register allocation. OK for fuzz testing, not for production. */
|
||||
@@ -2541,7 +2545,7 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
|
||||
RA_DBGX((as, "===== STOP ====="));
|
||||
|
||||
/* General trace setup. Emit tail of trace. */
|
||||
asm_tail_prep(as);
|
||||
asm_tail_prep(as, T->link);
|
||||
as->mcloop = NULL;
|
||||
as->flagmcp = NULL;
|
||||
as->topslot = 0;
|
||||
@@ -2586,6 +2590,9 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
|
||||
asm_head_side(as);
|
||||
else
|
||||
asm_head_root(as);
|
||||
#if LJ_ABI_BRANCH_TRACK
|
||||
emit_branch_track(as);
|
||||
#endif
|
||||
asm_phi_fixup(as);
|
||||
|
||||
if (J->curfinal->nins >= T->nins) { /* IR didn't grow? */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_ASM_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** ARM IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
@@ -79,18 +79,43 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)
|
||||
/* Generate an exit stub group at the bottom of the reserved MCode memory. */
|
||||
static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)
|
||||
{
|
||||
ExitNo i;
|
||||
int ind = 0;
|
||||
MCode *target = (MCode *)(void *)lj_vm_exit_handler;
|
||||
MCode *mxp = as->mcbot;
|
||||
int i;
|
||||
if (mxp + 4*4+4*EXITSTUBS_PER_GROUP >= as->mctop)
|
||||
if (mxp + 6+EXITSTUBS_PER_GROUP >= as->mctop)
|
||||
asm_mclimit(as);
|
||||
/* str lr, [sp]; bl ->vm_exit_handler; .long DISPATCH_address, group. */
|
||||
*mxp++ = ARMI_STR|ARMI_LS_P|ARMI_LS_U|ARMF_D(RID_LR)|ARMF_N(RID_SP);
|
||||
*mxp = ARMI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)-2)&0x00ffffffu);
|
||||
mxp++;
|
||||
if ((((target - mxp - 2) + 0x00800000u) >> 24) == 0) {
|
||||
/* str lr, [sp]; bl ->vm_exit_handler;
|
||||
** .long DISPATCH_address, group.
|
||||
*/
|
||||
*mxp++ = ARMI_STR | ARMI_LS_P | ARMI_LS_U | ARMF_D(RID_LR) | ARMF_N(RID_SP);
|
||||
*mxp = ARMI_BL | ((target - mxp - 2) & 0x00ffffffu); mxp++;
|
||||
} else if ((as->flags & JIT_F_ARMV6T2)) {
|
||||
/*
|
||||
** str lr, [sp]; movw/movt lr, vm_exit_handler; blx lr;
|
||||
** .long DISPATCH_address, group;
|
||||
*/
|
||||
*mxp++ = ARMI_STR | ARMI_LS_P | ARMI_LS_U | ARMF_D(RID_LR) | ARMF_N(RID_SP);
|
||||
*mxp++ = emit_movw_k((uint32_t)target) | ARMF_D(RID_LR);
|
||||
*mxp++ = emit_movt_k((uint32_t)target) | ARMF_D(RID_LR);
|
||||
*mxp++ = ARMI_BLXr | ARMF_M(RID_LR);
|
||||
ind = 2;
|
||||
} else {
|
||||
/* .long vm_exit_handler;
|
||||
** str lr, [sp]; ldr lr, [pc, #-16]; blx lr;
|
||||
** .long DISPATCH_address, group;
|
||||
*/
|
||||
*mxp++ = (MCode)target;
|
||||
*mxp++ = ARMI_STR | ARMI_LS_P | ARMI_LS_U | ARMF_D(RID_LR) | ARMF_N(RID_SP);
|
||||
*mxp++ = ARMI_LDRL | ARMF_D(RID_LR) | 16;
|
||||
*mxp++ = ARMI_BLXr | ARMF_M(RID_LR);
|
||||
ind = 1;
|
||||
}
|
||||
*mxp++ = (MCode)i32ptr(J2GG(as->J)->dispatch); /* DISPATCH address */
|
||||
*mxp++ = group*EXITSTUBS_PER_GROUP;
|
||||
for (i = 0; i < EXITSTUBS_PER_GROUP; i++)
|
||||
*mxp++ = ARMI_B|((-6-i)&0x00ffffffu);
|
||||
*mxp++ = ARMI_B | ((-6-ind-i) & 0x00ffffffu);
|
||||
lj_mcode_sync(as->mcbot, mxp);
|
||||
lj_mcode_commitbot(as->J, mxp);
|
||||
as->mcbot = mxp;
|
||||
@@ -1927,7 +1952,7 @@ static void asm_hiop(ASMState *as, IRIns *ir)
|
||||
} else if ((ir-1)->o == IR_MIN || (ir-1)->o == IR_MAX) {
|
||||
as->curins--; /* Always skip the loword min/max. */
|
||||
if (uselo || usehi)
|
||||
asm_sfpmin_max(as, ir-1, (ir-1)->o == IR_MIN ? CC_PL : CC_LE);
|
||||
asm_sfpmin_max(as, ir-1, (ir-1)->o == IR_MIN ? CC_HS : CC_LS);
|
||||
return;
|
||||
#elif LJ_HASFFI
|
||||
} else if ((ir-1)->o == IR_CONV) {
|
||||
@@ -2210,33 +2235,46 @@ static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
/* Fixup the tail code. */
|
||||
static void asm_tail_fixup(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop;
|
||||
MCode *target;
|
||||
MCode *target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)(void *)lj_vm_exit_interp;
|
||||
MCode *mcp = as->mctail;
|
||||
int32_t spadj = as->T->spadjust;
|
||||
if (spadj == 0) {
|
||||
as->mctop = --p;
|
||||
} else {
|
||||
/* Patch stack adjustment. */
|
||||
if (spadj) { /* Emit stack adjustment. */
|
||||
uint32_t k = emit_isk12(ARMI_ADD, spadj);
|
||||
lj_assertA(k, "stack adjustment %d does not fit in K12", spadj);
|
||||
p[-2] = (ARMI_ADD^k) | ARMF_D(RID_SP) | ARMF_N(RID_SP);
|
||||
*mcp++ = (ARMI_ADD^k) | ARMF_D(RID_SP) | ARMF_N(RID_SP);
|
||||
}
|
||||
/* Patch exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;
|
||||
p[-1] = ARMI_B|(((target-p)-1)&0x00ffffffu);
|
||||
if ((((target - mcp - 2) + 0x00800000u) >> 24) == 0) {
|
||||
*mcp = ARMI_B | ((target - mcp - 2) & 0x00ffffffu); mcp++;
|
||||
} else if ((as->flags & JIT_F_ARMV6T2)) {
|
||||
*mcp++ = emit_movw_k((uint32_t)target) | ARMF_D(RID_LR);
|
||||
*mcp++ = emit_movt_k((uint32_t)target) | ARMF_D(RID_LR);
|
||||
*mcp++ = ARMI_BX | ARMF_M(RID_LR);
|
||||
} else {
|
||||
*mcp++ = ARMI_LDRL | ARMI_LS_U | ARMF_D(RID_LR) | 0;
|
||||
*mcp++ = ARMI_BX | ARMF_M(RID_LR);
|
||||
*mcp++ = (MCode)target;
|
||||
}
|
||||
while (as->mctop > mcp) *--as->mctop = ARMI_NOP;
|
||||
}
|
||||
|
||||
/* Prepare tail of code. */
|
||||
static void asm_tail_prep(ASMState *as)
|
||||
static void asm_tail_prep(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop - 1; /* Leave room for exit branch. */
|
||||
if (as->loopref) {
|
||||
as->invmcp = as->mcp = p;
|
||||
} else {
|
||||
as->mcp = p-1; /* Leave room for stack pointer adjustment. */
|
||||
if (!lnk) {
|
||||
MCode *target = (MCode *)(void *)lj_vm_exit_interp;
|
||||
if ((((target - p - 2) + 0x00800000u) >> 24) ||
|
||||
(((target - p - 1) + 0x00800000u) >> 24)) p -= 2;
|
||||
}
|
||||
p--; /* Leave room for stack pointer adjustment. */
|
||||
as->mcp = p;
|
||||
as->invmcp = NULL;
|
||||
}
|
||||
*p = 0; /* Prevent load/store merging. */
|
||||
as->mctail = p;
|
||||
}
|
||||
|
||||
/* -- Trace setup --------------------------------------------------------- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** ARM64 IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
|
||||
** Sponsored by Cisco Systems, Inc.
|
||||
@@ -51,15 +51,27 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)
|
||||
static void asm_exitstub_setup(ASMState *as, ExitNo nexits)
|
||||
{
|
||||
ExitNo i;
|
||||
int ind;
|
||||
MCode *target = (MCode *)(void *)lj_vm_exit_handler;
|
||||
MCode *mxp = as->mctop;
|
||||
if (mxp - (nexits + 3 + MCLIM_REDZONE) < as->mclim)
|
||||
if (mxp - (nexits + 4 + MCLIM_REDZONE) < as->mclim)
|
||||
asm_mclimit(as);
|
||||
/* 1: str lr,[sp]; bl ->vm_exit_handler; movz w0,traceno; bl <1; bl <1; ... */
|
||||
ind = !A64F_S_OK(target - (mxp - nexits - 2), 26);
|
||||
/* !ind: 1: str lr,[sp]; bl ->vm_exit_handler; movz w0,traceno;
|
||||
** ind: 1: str lr,[sp]; ldr lr, [gl, K64_VXH]; blr lr; movz w0,traceno;
|
||||
** bl <1; bl <1; ...
|
||||
*/
|
||||
for (i = nexits-1; (int32_t)i >= 0; i--)
|
||||
*--mxp = A64I_LE(A64I_BL | A64F_S26(-3-i));
|
||||
*--mxp = A64I_LE(A64I_BL | A64F_S26(-3-ind-i));
|
||||
as->mcexit = mxp;
|
||||
*--mxp = A64I_LE(A64I_MOVZw | A64F_U16(as->T->traceno));
|
||||
mxp--;
|
||||
*mxp = A64I_LE(A64I_BL | A64F_S26(((MCode *)(void *)lj_vm_exit_handler-mxp)));
|
||||
if (ind) {
|
||||
*--mxp = A64I_LE(A64I_BLR_AUTH | A64F_N(RID_LR));
|
||||
*--mxp = A64I_LE(A64I_LDRx | A64F_D(RID_LR) | A64F_N(RID_GL) | A64F_U12(glofs(as, &as->J->k64[LJ_K64_VM_EXIT_HANDLER]) >> 3));
|
||||
} else {
|
||||
mxp--;
|
||||
*mxp = A64I_LE(A64I_BL | A64F_S26(target-mxp));
|
||||
}
|
||||
*--mxp = A64I_LE(A64I_STRx | A64F_D(RID_LR) | A64F_N(RID_SP));
|
||||
as->mctop = mxp;
|
||||
}
|
||||
@@ -67,7 +79,7 @@ static void asm_exitstub_setup(ASMState *as, ExitNo nexits)
|
||||
static MCode *asm_exitstub_addr(ASMState *as, ExitNo exitno)
|
||||
{
|
||||
/* Keep this in-sync with exitstub_trace_addr(). */
|
||||
return as->mctop + exitno + 3;
|
||||
return as->mcexit + exitno;
|
||||
}
|
||||
|
||||
/* Emit conditional branch to exit for guard. */
|
||||
@@ -1917,34 +1929,42 @@ static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
/* Fixup the tail code. */
|
||||
static void asm_tail_fixup(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop;
|
||||
MCode *mcp = as->mctail;
|
||||
MCode *target;
|
||||
/* Undo the sp adjustment in BC_JLOOP when exiting to the interpreter. */
|
||||
int32_t spadj = as->T->spadjust + (lnk ? 0 : sps_scale(SPS_FIXED));
|
||||
if (spadj == 0) {
|
||||
*--p = A64I_LE(A64I_NOP);
|
||||
as->mctop = p;
|
||||
} else {
|
||||
/* Patch stack adjustment. */
|
||||
if (spadj) { /* Emit stack adjustment. */
|
||||
uint32_t k = emit_isk12(spadj);
|
||||
lj_assertA(k, "stack adjustment %d does not fit in K12", spadj);
|
||||
p[-2] = (A64I_ADDx^k) | A64F_D(RID_SP) | A64F_N(RID_SP);
|
||||
*mcp++ = (A64I_ADDx^k) | A64F_D(RID_SP) | A64F_N(RID_SP);
|
||||
}
|
||||
/* Patch exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;
|
||||
p[-1] = A64I_B | A64F_S26((target-p)+1);
|
||||
/* Emit exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)(void *)lj_vm_exit_interp;
|
||||
if (lnk || A64F_S_OK(target - mcp, 26)) {
|
||||
*mcp = A64I_B | A64F_S26(target - mcp); mcp++;
|
||||
} else {
|
||||
*mcp++ = A64I_LDRx | A64F_D(RID_LR) | A64F_N(RID_GL) | A64F_U12(glofs(as, &as->J->k64[LJ_K64_VM_EXIT_INTERP]) >> 3);
|
||||
*mcp++ = A64I_BR_AUTH | A64F_N(RID_LR);
|
||||
}
|
||||
while (as->mctop > mcp) *--as->mctop = A64I_LE(A64I_NOP);
|
||||
}
|
||||
|
||||
/* Prepare tail of code. */
|
||||
static void asm_tail_prep(ASMState *as)
|
||||
static void asm_tail_prep(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop - 1; /* Leave room for exit branch. */
|
||||
if (as->loopref) {
|
||||
as->invmcp = as->mcp = p;
|
||||
} else {
|
||||
as->mcp = p-1; /* Leave room for stack pointer adjustment. */
|
||||
if (!lnk) {
|
||||
MCode *target = (MCode *)(void *)lj_vm_exit_interp;
|
||||
if (!A64F_S_OK(target - p, 26) || !A64F_S_OK(target - (p+1), 26)) p--;
|
||||
}
|
||||
p--; /* Leave room for stack pointer adjustment. */
|
||||
as->mcp = p;
|
||||
as->invmcp = NULL;
|
||||
}
|
||||
as->mctail = p;
|
||||
*p = 0; /* Prevent load/store merging. */
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** MIPS IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
@@ -92,13 +92,23 @@ static MCode *asm_sparejump_use(MCode *mcarea, MCode tjump)
|
||||
/* Setup exit stub after the end of each trace. */
|
||||
static void asm_exitstub_setup(ASMState *as)
|
||||
{
|
||||
uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler;
|
||||
MCode *mxp = as->mctop;
|
||||
/* sw TMP, 0(sp); j ->vm_exit_handler; li TMP, traceno */
|
||||
*--mxp = MIPSI_LI|MIPSF_T(RID_TMP)|as->T->traceno;
|
||||
*--mxp = MIPSI_J|((((uintptr_t)(void *)lj_vm_exit_handler)>>2)&0x03ffffffu);
|
||||
lj_assertA(((uintptr_t)mxp ^ (uintptr_t)(void *)lj_vm_exit_handler)>>28 == 0,
|
||||
"branch target out of range");
|
||||
*--mxp = MIPSI_SW|MIPSF_T(RID_TMP)|MIPSF_S(RID_SP)|0;
|
||||
*--mxp = MIPSI_LI | MIPSF_T(RID_TMP) | as->T->traceno;
|
||||
if (((uintptr_t)(mxp-1) ^ target) >> 28 == 0) {
|
||||
/* sw TMP, 0(sp); j ->vm_exit_handler; li TMP, traceno */
|
||||
*--mxp = MIPSI_J | ((target >> 2) & 0x03ffffffu);
|
||||
} else {
|
||||
/* sw TMP, 0(sp); li TMP, K*_VXH(jgl); jr TMP ; li TMP, traceno */
|
||||
*--mxp = MIPSI_JR | MIPSF_S(RID_TMP);
|
||||
*--mxp = MIPSI_AL | MIPSF_T(RID_TMP) | MIPSF_S(RID_JGL) |
|
||||
#if LJ_64
|
||||
jglofs(as, &as->J->k64[LJ_K64_VM_EXIT_HANDLER]);
|
||||
#else
|
||||
jglofs(as, &as->J->k32[LJ_K32_VM_EXIT_HANDLER]);
|
||||
#endif
|
||||
}
|
||||
*--mxp = MIPSI_SW | MIPSF_T(RID_TMP) | MIPSF_S(RID_SP) | 0;
|
||||
as->mctop = mxp;
|
||||
}
|
||||
|
||||
@@ -428,7 +438,8 @@ static void asm_callround(ASMState *as, IRIns *ir, IRCallID id)
|
||||
{
|
||||
/* The modified regs must match with the *.dasc implementation. */
|
||||
RegSet drop = RID2RSET(RID_R1)|RID2RSET(RID_R12)|RID2RSET(RID_FPRET)|
|
||||
RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(REGARG_FIRSTFPR)
|
||||
RID2RSET(RID_F2)|RID2RSET(RID_F4)|RID2RSET(REGARG_FIRSTFPR)|
|
||||
RID2RSET(RID_CFUNCADDR)
|
||||
#if LJ_TARGET_MIPSR6
|
||||
|RID2RSET(RID_F21)
|
||||
#endif
|
||||
@@ -514,7 +525,7 @@ static void asm_tointg(ASMState *as, IRIns *ir, Reg r)
|
||||
{
|
||||
/* The modified regs must match with the *.dasc implementation. */
|
||||
RegSet drop = RID2RSET(REGARG_FIRSTGPR)|RID2RSET(RID_RET)|RID2RSET(RID_RET+1)|
|
||||
RID2RSET(RID_R1)|RID2RSET(RID_R12);
|
||||
RID2RSET(RID_R1)|RID2RSET(RID_R12)|RID2RSET(RID_CFUNCADDR);
|
||||
if (ra_hasreg(ir->r)) rset_clear(drop, ir->r);
|
||||
ra_evictset(as, drop);
|
||||
/* Return values are in RID_RET (converted value) and RID_RET+1 (status). */
|
||||
@@ -2699,18 +2710,37 @@ static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
/* Fixup the tail code. */
|
||||
static void asm_tail_fixup(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *target = lnk ? traceref(as->J,lnk)->mcode : (MCode *)lj_vm_exit_interp;
|
||||
uintptr_t target = lnk ? (uintptr_t)traceref(as->J, lnk)->mcode : (uintptr_t)(void *)lj_vm_exit_interp;
|
||||
MCode *mcp = as->mctail;
|
||||
int32_t spadj = as->T->spadjust;
|
||||
MCode *p = as->mctop-1;
|
||||
*p = spadj ? (MIPSI_AADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
|
||||
p[-1] = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu);
|
||||
if (((uintptr_t)mcp ^ target) >> 28 == 0) {
|
||||
*mcp++ = MIPSI_J | ((target >> 2) & 0x03ffffffu);
|
||||
} else {
|
||||
*mcp++ = MIPSI_AL | MIPSF_T(RID_TMP) | MIPSF_S(RID_JGL) |
|
||||
#if LJ_64
|
||||
jglofs(as, &as->J->k64[LJ_K64_VM_EXIT_INTERP]);
|
||||
#else
|
||||
jglofs(as, &as->J->k32[LJ_K32_VM_EXIT_INTERP]);
|
||||
#endif
|
||||
*mcp++ = MIPSI_JR | MIPSF_S(RID_TMP);
|
||||
}
|
||||
*mcp++ = spadj ? (MIPSI_AADDIU|MIPSF_T(RID_SP)|MIPSF_S(RID_SP)|spadj) : MIPSI_NOP;
|
||||
}
|
||||
|
||||
/* Prepare tail of code. */
|
||||
static void asm_tail_prep(ASMState *as)
|
||||
static void asm_tail_prep(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
as->mcp = as->mctop-2; /* Leave room for branch plus nop or stack adj. */
|
||||
as->invmcp = as->loopref ? as->mcp : NULL;
|
||||
as->mcp = as->mctop - 2; /* Leave room for branch plus nop or stack adj. */
|
||||
if (as->loopref) {
|
||||
as->invmcp = as->mcp;
|
||||
} else {
|
||||
if (!lnk) {
|
||||
uintptr_t target = (uintptr_t)(void *)lj_vm_exit_interp;
|
||||
if (((uintptr_t)as->mcp ^ target) >> 28 != 0) as->mcp--;
|
||||
}
|
||||
as->invmcp = NULL;
|
||||
}
|
||||
as->mctail = as->mcp;
|
||||
}
|
||||
|
||||
/* -- Trace setup --------------------------------------------------------- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** PPC IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
@@ -48,23 +48,38 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)
|
||||
static void asm_exitstub_setup(ASMState *as, ExitNo nexits)
|
||||
{
|
||||
ExitNo i;
|
||||
int ind;
|
||||
uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler;
|
||||
MCode *mxp = as->mctop;
|
||||
if (mxp - (nexits + 3 + MCLIM_REDZONE) < as->mclim)
|
||||
if (mxp - (nexits + 4 + MCLIM_REDZONE) < as->mclim)
|
||||
asm_mclimit(as);
|
||||
/* 1: mflr r0; bl ->vm_exit_handler; li r0, traceno; bl <1; bl <1; ... */
|
||||
ind = ((target - (uintptr_t)(mxp - nexits - 2) + 0x02000000u) >> 26) ? 2 : 0;
|
||||
/* !ind: 1: mflr r0; bl ->vm_exit_handler; li r0, traceno;
|
||||
** ind: 1: lwz r0, K32_VXH(jgl); mtctr r0; mflr r0; bctrl; li r0, traceno;
|
||||
** bl <1; bl <1; ...
|
||||
*/
|
||||
for (i = nexits-1; (int32_t)i >= 0; i--)
|
||||
*--mxp = PPCI_BL|(((-3-i)&0x00ffffffu)<<2);
|
||||
*--mxp = PPCI_BL | (((-3-ind-i) & 0x00ffffffu) << 2);
|
||||
as->mcexit = mxp;
|
||||
*--mxp = PPCI_LI|PPCF_T(RID_TMP)|as->T->traceno; /* Read by exit handler. */
|
||||
mxp--;
|
||||
*mxp = PPCI_BL|((((MCode *)(void *)lj_vm_exit_handler-mxp)&0x00ffffffu)<<2);
|
||||
*--mxp = PPCI_MFLR|PPCF_T(RID_TMP);
|
||||
if (ind) {
|
||||
*--mxp = PPCI_BCTRL;
|
||||
*--mxp = PPCI_MFLR | PPCF_T(RID_TMP);
|
||||
*--mxp = PPCI_MTCTR | PPCF_T(RID_TMP);
|
||||
*--mxp = PPCI_LWZ | PPCF_T(RID_TMP) | PPCF_A(RID_JGL) |
|
||||
jglofs(as, &as->J->k32[LJ_K32_VM_EXIT_HANDLER]);
|
||||
} else {
|
||||
mxp--;
|
||||
*mxp = PPCI_BL | ((target - (uintptr_t)mxp) & 0x03fffffcu);
|
||||
*--mxp = PPCI_MFLR | PPCF_T(RID_TMP);
|
||||
}
|
||||
as->mctop = mxp;
|
||||
}
|
||||
|
||||
static MCode *asm_exitstub_addr(ASMState *as, ExitNo exitno)
|
||||
{
|
||||
/* Keep this in-sync with exitstub_trace_addr(). */
|
||||
return as->mctop + exitno + 3;
|
||||
return as->mcexit + exitno;
|
||||
}
|
||||
|
||||
/* Emit conditional branch to exit for guard. */
|
||||
@@ -2218,34 +2233,43 @@ static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
/* Fixup the tail code. */
|
||||
static void asm_tail_fixup(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop;
|
||||
MCode *target;
|
||||
uintptr_t target = lnk ? (uintptr_t)traceref(as->J, lnk)->mcode : (uintptr_t)(void *)lj_vm_exit_interp;
|
||||
MCode *mcp = as->mctail;
|
||||
int32_t spadj = as->T->spadjust;
|
||||
if (spadj == 0) {
|
||||
*--p = PPCI_NOP;
|
||||
*--p = PPCI_NOP;
|
||||
as->mctop = p;
|
||||
} else {
|
||||
/* Patch stack adjustment. */
|
||||
if (spadj) { /* Emit stack adjustment. */
|
||||
lj_assertA(checki16(CFRAME_SIZE+spadj), "stack adjustment out of range");
|
||||
p[-3] = PPCI_ADDI | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | (CFRAME_SIZE+spadj);
|
||||
p[-2] = PPCI_STWU | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | spadj;
|
||||
*mcp++ = PPCI_ADDI | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | (CFRAME_SIZE+spadj);
|
||||
*mcp++ = PPCI_STWU | PPCF_T(RID_TMP) | PPCF_A(RID_SP) | spadj;
|
||||
}
|
||||
/* Patch exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;
|
||||
p[-1] = PPCI_B|(((target-p+1)&0x00ffffffu)<<2);
|
||||
/* Emit exit branch. */
|
||||
if ((((target - (uintptr_t)mcp) + 0x02000000u) >> 26) == 0) {
|
||||
*mcp = PPCI_B | ((target - (uintptr_t)mcp) & 0x03fffffcu); mcp++;
|
||||
} else {
|
||||
*mcp++ = PPCI_LWZ | PPCF_T(RID_TMP) | PPCF_A(RID_JGL) |
|
||||
jglofs(as, &as->J->k32[LJ_K32_VM_EXIT_INTERP]);
|
||||
*mcp++ = PPCI_MTCTR | PPCF_T(RID_TMP);
|
||||
*mcp++ = PPCI_BCTR;
|
||||
}
|
||||
while (as->mctop > mcp) *--as->mctop = PPCI_NOP;
|
||||
}
|
||||
|
||||
/* Prepare tail of code. */
|
||||
static void asm_tail_prep(ASMState *as)
|
||||
static void asm_tail_prep(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop - 1; /* Leave room for exit branch. */
|
||||
if (as->loopref) {
|
||||
as->invmcp = as->mcp = p;
|
||||
} else {
|
||||
as->mcp = p-2; /* Leave room for stack pointer adjustment. */
|
||||
if (!lnk) {
|
||||
uintptr_t target = (uintptr_t)(void *)lj_vm_exit_interp;
|
||||
if ((((target - (uintptr_t)p) + 0x02000000u) >> 26) ||
|
||||
(((target - (uintptr_t)(p-2)) + 0x02000000u) >> 26)) p -= 2;
|
||||
}
|
||||
p -= 2; /* Leave room for stack pointer adjustment. */
|
||||
as->mcp = p;
|
||||
as->invmcp = NULL;
|
||||
}
|
||||
as->mctail = p;
|
||||
}
|
||||
|
||||
/* -- Trace setup --------------------------------------------------------- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** x86/x64 IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Guard handling ------------------------------------------------------ */
|
||||
@@ -9,9 +9,12 @@
|
||||
static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)
|
||||
{
|
||||
ExitNo i, groupofs = (group*EXITSTUBS_PER_GROUP) & 0xff;
|
||||
MCode *target = (MCode *)(void *)lj_vm_exit_handler;
|
||||
MCode *mxp = as->mcbot;
|
||||
MCode *mxpstart = mxp;
|
||||
if (mxp + (2+2)*EXITSTUBS_PER_GROUP+8+5 >= as->mctop)
|
||||
if (mxp + ((2+2)*EXITSTUBS_PER_GROUP +
|
||||
(LJ_GC64 ? 0 : 8) +
|
||||
(LJ_64 ? 6 : 5)) >= as->mctop)
|
||||
asm_mclimit(as);
|
||||
/* Push low byte of exitno for each exit stub. */
|
||||
*mxp++ = XI_PUSHi8; *mxp++ = (MCode)groupofs;
|
||||
@@ -30,8 +33,13 @@ static MCode *asm_exitstub_gen(ASMState *as, ExitNo group)
|
||||
*(int32_t *)mxp = ptr2addr(J2GG(as->J)->dispatch); mxp += 4;
|
||||
#endif
|
||||
/* Jump to exit handler which fills in the ExitState. */
|
||||
*mxp++ = XI_JMP; mxp += 4;
|
||||
*((int32_t *)(mxp-4)) = jmprel(as->J, mxp, (MCode *)(void *)lj_vm_exit_handler);
|
||||
if (jmprel_ok(mxp + 5, target)) { /* Direct jump. */
|
||||
*mxp++ = XI_JMP; mxp += 4;
|
||||
*((int32_t *)(mxp-4)) = jmprel(as->J, mxp, target);
|
||||
} else { /* RIP-relative indirect jump. */
|
||||
*mxp++ = XI_GROUP5; *mxp++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP; mxp += 4;
|
||||
*((int32_t *)(mxp-4)) = (int32_t)((group ? as->J->exitstubgroup[0] : mxpstart) - 8 - mxp);
|
||||
}
|
||||
/* Commit the code for this group (even if assembly fails later on). */
|
||||
lj_mcode_commitbot(as->J, mxp);
|
||||
as->mcbot = mxp;
|
||||
@@ -45,6 +53,16 @@ static void asm_exitstub_setup(ASMState *as, ExitNo nexits)
|
||||
ExitNo i;
|
||||
if (nexits >= EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR)
|
||||
lj_trace_err(as->J, LJ_TRERR_SNAPOV);
|
||||
#if LJ_64
|
||||
if (as->J->exitstubgroup[0] == NULL) {
|
||||
/* Store the two potentially out-of-range targets below group 0. */
|
||||
MCode *mxp = as->mcbot;
|
||||
while ((uintptr_t)mxp & 7) *mxp++ = XI_INT3;
|
||||
*((void **)mxp) = (void *)lj_vm_exit_interp; mxp += 8;
|
||||
*((void **)mxp) = (void *)lj_vm_exit_handler; mxp += 8;
|
||||
as->mcbot = mxp; /* Don't bother to commit, done in asm_exitstub_gen. */
|
||||
}
|
||||
#endif
|
||||
for (i = 0; i < (nexits+EXITSTUBS_PER_GROUP-1)/EXITSTUBS_PER_GROUP; i++)
|
||||
if (as->J->exitstubgroup[i] == NULL)
|
||||
as->J->exitstubgroup[i] = asm_exitstub_gen(as, i);
|
||||
@@ -396,7 +414,7 @@ static Reg asm_fuseloadk64(ASMState *as, IRIns *ir)
|
||||
"bad interned 64 bit constant");
|
||||
} else {
|
||||
while ((uintptr_t)as->mcbot & 7) *as->mcbot++ = XI_INT3;
|
||||
*(uint64_t*)as->mcbot = *k;
|
||||
*(uint64_t *)as->mcbot = *k;
|
||||
ir->i = (int32_t)(as->mctop - as->mcbot);
|
||||
as->mcbot += 8;
|
||||
as->mclim = as->mcbot + MCLIM_REDZONE;
|
||||
@@ -728,7 +746,7 @@ static void *asm_callx_func(ASMState *as, IRIns *irf, IRRef func)
|
||||
p = (MCode *)(void *)ir_k64(irf)->u64;
|
||||
else
|
||||
p = (MCode *)(void *)(uintptr_t)(uint32_t)irf->i;
|
||||
if (p - as->mcp == (int32_t)(p - as->mcp))
|
||||
if (jmprel_ok(p, as->mcp))
|
||||
return p; /* Call target is still in +-2GB range. */
|
||||
/* Avoid the indirect case of emit_call(). Try to hoist func addr. */
|
||||
}
|
||||
@@ -2084,7 +2102,8 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa)
|
||||
RegSet allow = RSET_GPR;
|
||||
Reg dest, right;
|
||||
int32_t k = 0;
|
||||
if (as->flagmcp == as->mcp) { /* Drop test r,r instruction. */
|
||||
if (as->flagmcp == as->mcp && xa != XOg_X_IMUL) {
|
||||
/* Drop test r,r instruction. */
|
||||
MCode *p = as->mcp + ((LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2);
|
||||
MCode *q = p[0] == 0x0f ? p+1 : p;
|
||||
if ((*q & 15) < 14) {
|
||||
@@ -2805,6 +2824,8 @@ static void asm_gc_check(ASMState *as)
|
||||
emit_rr(as, XO_TEST, RID_RET, RID_RET);
|
||||
args[0] = ASMREF_TMP1; /* global_State *g */
|
||||
args[1] = ASMREF_TMP2; /* MSize steps */
|
||||
/* Insert nop to simplify GC exit recognition in lj_asm_patchexit. */
|
||||
if (!jmprel_ok(as->mcp, (MCode *)(void *)ci->func)) *--as->mcp = XI_NOP;
|
||||
asm_gencall(as, ci, args);
|
||||
tmp = ra_releasetmp(as, ASMREF_TMP1);
|
||||
#if LJ_GC64
|
||||
@@ -2918,40 +2939,36 @@ static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
static void asm_tail_fixup(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
/* Note: don't use as->mcp swap + emit_*: emit_op overwrites more bytes. */
|
||||
MCode *p = as->mctop;
|
||||
MCode *target, *q;
|
||||
MCode *mcp = as->mctail;
|
||||
MCode *target;
|
||||
int32_t spadj = as->T->spadjust;
|
||||
if (spadj == 0) {
|
||||
p -= LJ_64 ? 7 : 6;
|
||||
} else {
|
||||
MCode *p1;
|
||||
/* Patch stack adjustment. */
|
||||
if (spadj) { /* Emit stack adjustment. */
|
||||
if (LJ_64) *mcp++ = 0x48;
|
||||
if (checki8(spadj)) {
|
||||
p -= 3;
|
||||
p1 = p-6;
|
||||
*p1 = (MCode)spadj;
|
||||
*mcp++ = XI_ARITHi8;
|
||||
*mcp++ = MODRM(XM_REG, XOg_ADD, RID_ESP);
|
||||
*mcp++ = (MCode)spadj;
|
||||
} else {
|
||||
p1 = p-9;
|
||||
*(int32_t *)p1 = spadj;
|
||||
*mcp++ = XI_ARITHi;
|
||||
*mcp++ = MODRM(XM_REG, XOg_ADD, RID_ESP);
|
||||
*(int32_t *)mcp = spadj; mcp += 4;
|
||||
}
|
||||
#if LJ_64
|
||||
p1[-3] = 0x48;
|
||||
#endif
|
||||
p1[-2] = (MCode)(checki8(spadj) ? XI_ARITHi8 : XI_ARITHi);
|
||||
p1[-1] = MODRM(XM_REG, XOg_ADD, RID_ESP);
|
||||
}
|
||||
/* Patch exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;
|
||||
*(int32_t *)(p-4) = jmprel(as->J, p, target);
|
||||
p[-5] = XI_JMP;
|
||||
/* Emit exit branch. */
|
||||
target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)(void *)lj_vm_exit_interp;
|
||||
if (lnk || jmprel_ok(mcp + 5, target)) { /* Direct jump. */
|
||||
*mcp++ = XI_JMP; mcp += 4;
|
||||
*(int32_t *)(mcp-4) = jmprel(as->J, mcp, target);
|
||||
} else { /* RIP-relative indirect jump. */
|
||||
*mcp++ = XI_GROUP5; *mcp++ = XM_OFS0 + (XOg_JMP<<3) + RID_EBP; mcp += 4;
|
||||
*((int32_t *)(mcp-4)) = (int32_t)(as->J->exitstubgroup[0] - 16 - mcp);
|
||||
}
|
||||
/* Drop unused mcode tail. Fill with NOPs to make the prefetcher happy. */
|
||||
for (q = as->mctop-1; q >= p; q--)
|
||||
*q = XI_NOP;
|
||||
as->mctop = p;
|
||||
while (as->mctop > mcp) *--as->mctop = XI_NOP;
|
||||
}
|
||||
|
||||
/* Prepare tail of code. */
|
||||
static void asm_tail_prep(ASMState *as)
|
||||
static void asm_tail_prep(ASMState *as, TraceNo lnk)
|
||||
{
|
||||
MCode *p = as->mctop;
|
||||
/* Realign and leave room for backwards loop branch or exit branch. */
|
||||
@@ -2963,15 +2980,17 @@ static void asm_tail_prep(ASMState *as)
|
||||
as->mctop = p;
|
||||
p -= (as->loopinv ? 5 : 2); /* Space for short/near jmp. */
|
||||
} else {
|
||||
p -= 5; /* Space for exit branch (near jmp). */
|
||||
p -= (LJ_64 && !lnk) ? 6 : 5; /* Space for exit branch. */
|
||||
}
|
||||
if (as->loopref) {
|
||||
as->invmcp = as->mcp = p;
|
||||
} else {
|
||||
/* Leave room for ESP adjustment: add esp, imm or lea esp, [esp+imm] */
|
||||
as->mcp = p - (LJ_64 ? 7 : 6);
|
||||
/* Leave room for ESP adjustment: add esp, imm */
|
||||
p -= LJ_64 ? 7 : 6;
|
||||
as->mcp = p;
|
||||
as->invmcp = NULL;
|
||||
}
|
||||
as->mctail = p;
|
||||
}
|
||||
|
||||
/* -- Trace setup --------------------------------------------------------- */
|
||||
@@ -3131,6 +3150,10 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
|
||||
} else if (*p == XI_CALL &&
|
||||
(void *)(p+5+*(int32_t *)(p+1)) == (void *)lj_gc_step_jit) {
|
||||
pgc = p+7; /* Do not patch GC check exit. */
|
||||
} else if (LJ_64 && *p == 0xff &&
|
||||
p[1] == MODRM(XM_REG, XOg_CALL, RID_RET) &&
|
||||
p[2] == XI_NOP) {
|
||||
pgc = p+5; /* Do not patch GC check exit. */
|
||||
}
|
||||
}
|
||||
lj_mcode_sync(T->mcode, T->mcode + T->szmcode);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Internal assertions.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_assert_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode instruction modes.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bc_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode instruction format.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BC_H
|
||||
@@ -259,6 +259,11 @@ static LJ_AINLINE int bc_isret(BCOp op)
|
||||
return (op == BC_RETM || op == BC_RET || op == BC_RET0 || op == BC_RET1);
|
||||
}
|
||||
|
||||
static LJ_AINLINE int bc_isret_or_tail(BCOp op)
|
||||
{
|
||||
return (op == BC_CALLMT || op == BC_CALLT || bc_isret(op));
|
||||
}
|
||||
|
||||
LJ_DATA const uint16_t lj_bc_mode[];
|
||||
LJ_DATA const uint16_t lj_bc_ofs[];
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode dump definitions.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BCDUMP_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode reader.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bcread_c
|
||||
@@ -179,7 +179,7 @@ static const void *bcread_varinfo(GCproto *pt)
|
||||
}
|
||||
|
||||
/* Read a single constant key/value of a template table. */
|
||||
static void bcread_ktabk(LexState *ls, TValue *o)
|
||||
static void bcread_ktabk(LexState *ls, TValue *o, GCtab *t)
|
||||
{
|
||||
MSize tp = bcread_uleb128(ls);
|
||||
if (tp >= BCDUMP_KTAB_STR) {
|
||||
@@ -191,6 +191,8 @@ static void bcread_ktabk(LexState *ls, TValue *o)
|
||||
} else if (tp == BCDUMP_KTAB_NUM) {
|
||||
o->u32.lo = bcread_uleb128(ls);
|
||||
o->u32.hi = bcread_uleb128(ls);
|
||||
} else if (t && tp == BCDUMP_KTAB_NIL) { /* Restore nil value marker. */
|
||||
settabV(ls->L, o, t);
|
||||
} else {
|
||||
lj_assertLS(tp <= BCDUMP_KTAB_TRUE, "bad constant type %d", tp);
|
||||
setpriV(o, ~tp);
|
||||
@@ -207,15 +209,15 @@ static GCtab *bcread_ktab(LexState *ls)
|
||||
MSize i;
|
||||
TValue *o = tvref(t->array);
|
||||
for (i = 0; i < narray; i++, o++)
|
||||
bcread_ktabk(ls, o);
|
||||
bcread_ktabk(ls, o, NULL);
|
||||
}
|
||||
if (nhash) { /* Read hash entries. */
|
||||
MSize i;
|
||||
for (i = 0; i < nhash; i++) {
|
||||
TValue key;
|
||||
bcread_ktabk(ls, &key);
|
||||
bcread_ktabk(ls, &key, NULL);
|
||||
lj_assertLS(!tvisnil(&key), "nil key");
|
||||
bcread_ktabk(ls, lj_tab_set(ls->L, t, &key));
|
||||
bcread_ktabk(ls, lj_tab_set(ls->L, t, &key), t);
|
||||
}
|
||||
}
|
||||
return t;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode writer.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bcwrite_c
|
||||
@@ -71,6 +71,8 @@ static void bcwrite_ktabk(BCWriteCtx *ctx, cTValue *o, int narrow)
|
||||
*p++ = BCDUMP_KTAB_NUM;
|
||||
p = lj_strfmt_wuleb128(p, o->u32.lo);
|
||||
p = lj_strfmt_wuleb128(p, o->u32.hi);
|
||||
} else if (tvistab(o)) { /* Write the nil value marker as a nil. */
|
||||
*p++ = BCDUMP_KTAB_NIL;
|
||||
} else {
|
||||
lj_assertBCW(tvispri(o), "unhandled type %d", itype(o));
|
||||
*p++ = BCDUMP_KTAB_NIL+~itype(o);
|
||||
@@ -133,7 +135,7 @@ static void bcwrite_ktab_sorted_hash(BCWriteCtx *ctx, Node *node, MSize nhash)
|
||||
TValue **heap = ctx->heap;
|
||||
MSize i = nhash;
|
||||
for (;; node--) { /* Build heap. */
|
||||
if (!tvisnil(&node->key)) {
|
||||
if (!tvisnil(&node->val)) {
|
||||
bcwrite_ktabk_heap_insert(heap, --i, nhash, &node->key);
|
||||
if (i == 0) break;
|
||||
}
|
||||
@@ -163,7 +165,7 @@ static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)
|
||||
MSize i, hmask = t->hmask;
|
||||
Node *node = noderef(t->node);
|
||||
for (i = 0; i <= hmask; i++)
|
||||
nhash += !tvisnil(&node[i].key);
|
||||
nhash += !tvisnil(&node[i].val);
|
||||
}
|
||||
/* Write number of array slots and hash slots. */
|
||||
p = lj_strfmt_wuleb128(p, narray);
|
||||
@@ -184,7 +186,7 @@ static void bcwrite_ktab(BCWriteCtx *ctx, char *p, const GCtab *t)
|
||||
} else {
|
||||
MSize i = nhash;
|
||||
for (;; node--)
|
||||
if (!tvisnil(&node->key)) {
|
||||
if (!tvisnil(&node->val)) {
|
||||
bcwrite_ktabk(ctx, &node->key, 0);
|
||||
bcwrite_ktabk(ctx, &node->val, 1);
|
||||
if (--i == 0) break;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_buf_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BUF_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** C data arithmetic.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "lj_obj.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** C data arithmetic.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_CARITH_H
|
||||
|
||||
+27
-14
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI C call handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "lj_obj.h"
|
||||
@@ -781,17 +781,24 @@ static unsigned int ccall_classify_struct(CTState *cts, CType *ct)
|
||||
{
|
||||
CTSize sz = ct->size;
|
||||
unsigned int r = 0, n = 0, isu = (ct->info & CTF_UNION);
|
||||
while (ct->sib) {
|
||||
while (ct->sib && n <= 4) {
|
||||
unsigned int m = 1;
|
||||
CType *sct;
|
||||
ct = ctype_get(cts, ct->sib);
|
||||
if (ctype_isfield(ct->info)) {
|
||||
sct = ctype_rawchild(cts, ct);
|
||||
if (ctype_isarray(sct->info)) {
|
||||
CType *cct = ctype_rawchild(cts, sct);
|
||||
if (!cct->size) continue;
|
||||
m = sct->size / cct->size;
|
||||
sct = cct;
|
||||
}
|
||||
if (ctype_isfp(sct->info)) {
|
||||
r |= sct->size;
|
||||
if (!isu) n++; else if (n == 0) n = 1;
|
||||
if (!isu) n += m; else if (n < m) n = m;
|
||||
} else if (ctype_iscomplex(sct->info)) {
|
||||
r |= (sct->size >> 1);
|
||||
if (!isu) n += 2; else if (n < 2) n = 2;
|
||||
if (!isu) n += 2*m; else if (n < 2*m) n = 2*m;
|
||||
} else if (ctype_isstruct(sct->info)) {
|
||||
goto substruct;
|
||||
} else {
|
||||
@@ -803,10 +810,11 @@ static unsigned int ccall_classify_struct(CTState *cts, CType *ct)
|
||||
sct = ctype_rawchild(cts, ct);
|
||||
substruct:
|
||||
if (sct->size > 0) {
|
||||
unsigned int s = ccall_classify_struct(cts, sct);
|
||||
unsigned int s = ccall_classify_struct(cts, sct), sn;
|
||||
if (s <= 1) goto noth;
|
||||
r |= (s & 255);
|
||||
if (!isu) n += (s >> 8); else if (n < (s >>8)) n = (s >> 8);
|
||||
sn = (s >> 8) * m;
|
||||
if (!isu) n += sn; else if (n < sn) n = sn;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -893,7 +901,9 @@ static void ccall_copy_struct(CCallState *cc, CType *ctr, void *dp, void *sp,
|
||||
|
||||
/* -- Common C call handling ---------------------------------------------- */
|
||||
|
||||
/* Infer the destination CTypeID for a vararg argument. */
|
||||
/* Infer the destination CTypeID for a vararg argument.
|
||||
** Note: may reallocate cts->tab and invalidate CType pointers.
|
||||
*/
|
||||
CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o)
|
||||
{
|
||||
if (tvisnumber(o)) {
|
||||
@@ -921,13 +931,16 @@ CTypeID lj_ccall_ctid_vararg(CTState *cts, cTValue *o)
|
||||
}
|
||||
}
|
||||
|
||||
/* Setup arguments for C call. */
|
||||
/* Setup arguments for C call.
|
||||
** Note: may reallocate cts->tab and invalidate CType pointers.
|
||||
*/
|
||||
static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
||||
CCallState *cc)
|
||||
{
|
||||
int gcsteps = 0;
|
||||
TValue *o, *top = L->top;
|
||||
CTypeID fid;
|
||||
CTInfo info = ct->info; /* lj_ccall_ctid_vararg may invalidate ct pointer. */
|
||||
CType *ctr;
|
||||
MSize maxgpr, ngpr = 0, nsp = 0, narg;
|
||||
#if CCALL_NARG_FPR
|
||||
@@ -946,7 +959,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
||||
#if LJ_TARGET_X86
|
||||
/* x86 has several different calling conventions. */
|
||||
cc->resx87 = 0;
|
||||
switch (ctype_cconv(ct->info)) {
|
||||
switch (ctype_cconv(info)) {
|
||||
case CTCC_FASTCALL: maxgpr = 2; break;
|
||||
case CTCC_THISCALL: maxgpr = 1; break;
|
||||
default: maxgpr = 0; break;
|
||||
@@ -963,7 +976,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
||||
} else if (ctype_iscomplex(ctr->info) || ctype_isstruct(ctr->info)) {
|
||||
/* Preallocate cdata object and anchor it after arguments. */
|
||||
CTSize sz = ctr->size;
|
||||
GCcdata *cd = lj_cdata_new(cts, ctype_cid(ct->info), sz);
|
||||
GCcdata *cd = lj_cdata_new(cts, ctype_cid(info), sz);
|
||||
void *dp = cdataptr(cd);
|
||||
setcdataV(L, L->top++, cd);
|
||||
if (ctype_isstruct(ctr->info)) {
|
||||
@@ -986,7 +999,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
||||
}
|
||||
|
||||
#if LJ_TARGET_ARM64 && LJ_ABI_WIN
|
||||
if ((ct->info & CTF_VARARG)) {
|
||||
if ((info & CTF_VARARG)) {
|
||||
nsp -= maxgpr * CTSIZE_PTR; /* May end up with negative nsp. */
|
||||
ngpr = maxgpr;
|
||||
nfpr = CCALL_NARG_FPR;
|
||||
@@ -1007,7 +1020,7 @@ static int ccall_set_args(lua_State *L, CTState *cts, CType *ct,
|
||||
lj_assertL(ctype_isfield(ctf->info), "field expected");
|
||||
did = ctype_cid(ctf->info);
|
||||
} else {
|
||||
if (!(ct->info & CTF_VARARG))
|
||||
if (!(info & CTF_VARARG))
|
||||
lj_err_caller(L, LJ_ERR_FFI_NUMARG); /* Too many arguments. */
|
||||
did = lj_ccall_ctid_vararg(cts, o); /* Infer vararg type. */
|
||||
isva = 1;
|
||||
@@ -1178,11 +1191,11 @@ int lj_ccall_func(lua_State *L, GCcdata *cd)
|
||||
ct = ctype_rawchild(cts, ct);
|
||||
}
|
||||
if (ctype_isfunc(ct->info)) {
|
||||
CTypeID id = ctype_typeid(cts, ct);
|
||||
CCallState cc;
|
||||
int gcsteps, ret;
|
||||
cc.func = (void (*)(void))cdata_getptr(cdataptr(cd), sz);
|
||||
gcsteps = ccall_set_args(L, cts, ct, &cc);
|
||||
ct = (CType *)((intptr_t)ct-(intptr_t)cts->tab);
|
||||
cts->cb.slot = ~0u;
|
||||
lj_vm_ffi_call(&cc);
|
||||
if (cts->cb.slot != ~0u) { /* Blacklist function that called a callback. */
|
||||
@@ -1190,7 +1203,7 @@ int lj_ccall_func(lua_State *L, GCcdata *cd)
|
||||
tv.u64 = ((uintptr_t)(void *)cc.func >> 2) | U64x(800000000, 00000000);
|
||||
setboolV(lj_tab_set(L, cts->miscmap, &tv), 1);
|
||||
}
|
||||
ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab); /* May be reallocated. */
|
||||
ct = ctype_get(cts, id); /* Table may have been reallocated. */
|
||||
gcsteps += ccall_get_results(L, cts, ct, &cc, &ret);
|
||||
#if LJ_TARGET_X86 && LJ_ABI_WIN
|
||||
/* Automatically detect __stdcall and fix up C function declaration. */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI C call handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_CCALL_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI C callback handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "lj_obj.h"
|
||||
@@ -34,22 +34,29 @@
|
||||
|
||||
#elif LJ_TARGET_X86ORX64
|
||||
|
||||
#if LJ_ABI_BRANCH_TRACK
|
||||
#define CALLBACK_MCODE_SLOTSZ 8
|
||||
#else
|
||||
#define CALLBACK_MCODE_SLOTSZ 4
|
||||
#endif
|
||||
#define CALLBACK_MCODE_NSLOT (128 / CALLBACK_MCODE_SLOTSZ)
|
||||
|
||||
#define CALLBACK_MCODE_HEAD (LJ_64 ? 8 : 0)
|
||||
#define CALLBACK_MCODE_GROUP (-2+1+2+(LJ_GC64 ? 10 : 5)+(LJ_64 ? 6 : 5))
|
||||
|
||||
#define CALLBACK_SLOT2OFS(slot) \
|
||||
(CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/32) + 4*(slot))
|
||||
(CALLBACK_MCODE_HEAD + CALLBACK_MCODE_GROUP*((slot)/CALLBACK_MCODE_NSLOT) + CALLBACK_MCODE_SLOTSZ*(slot))
|
||||
|
||||
static MSize CALLBACK_OFS2SLOT(MSize ofs)
|
||||
{
|
||||
MSize group;
|
||||
ofs -= CALLBACK_MCODE_HEAD;
|
||||
group = ofs / (32*4 + CALLBACK_MCODE_GROUP);
|
||||
return (ofs % (32*4 + CALLBACK_MCODE_GROUP))/4 + group*32;
|
||||
group = ofs / (128 + CALLBACK_MCODE_GROUP);
|
||||
return (ofs % (128 + CALLBACK_MCODE_GROUP))/CALLBACK_MCODE_SLOTSZ + group*CALLBACK_MCODE_NSLOT;
|
||||
}
|
||||
|
||||
#define CALLBACK_MAX_SLOT \
|
||||
(((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+4*32))*32)
|
||||
(((CALLBACK_MCODE_SIZE-CALLBACK_MCODE_HEAD)/(CALLBACK_MCODE_GROUP+128))*CALLBACK_MCODE_NSLOT)
|
||||
|
||||
#elif LJ_TARGET_ARM
|
||||
|
||||
@@ -57,6 +64,10 @@ static MSize CALLBACK_OFS2SLOT(MSize ofs)
|
||||
|
||||
#elif LJ_TARGET_ARM64
|
||||
|
||||
#if LJ_ABI_BRANCH_TRACK
|
||||
#define CALLBACK_MCODE_SLOTSZ 12
|
||||
#endif
|
||||
|
||||
#define CALLBACK_MCODE_HEAD 32
|
||||
|
||||
#elif LJ_TARGET_PPC
|
||||
@@ -81,8 +92,11 @@ static MSize CALLBACK_OFS2SLOT(MSize ofs)
|
||||
#endif
|
||||
|
||||
#ifndef CALLBACK_SLOT2OFS
|
||||
#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + 8*(slot))
|
||||
#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/8)
|
||||
#ifndef CALLBACK_MCODE_SLOTSZ
|
||||
#define CALLBACK_MCODE_SLOTSZ 8
|
||||
#endif
|
||||
#define CALLBACK_SLOT2OFS(slot) (CALLBACK_MCODE_HEAD + CALLBACK_MCODE_SLOTSZ*(slot))
|
||||
#define CALLBACK_OFS2SLOT(ofs) (((ofs)-CALLBACK_MCODE_HEAD)/CALLBACK_MCODE_SLOTSZ)
|
||||
#define CALLBACK_MAX_SLOT (CALLBACK_OFS2SLOT(CALLBACK_MCODE_SIZE))
|
||||
#endif
|
||||
|
||||
@@ -118,9 +132,13 @@ static void *callback_mcode_init(global_State *g, uint8_t *page)
|
||||
*(void **)p = target; p += 8;
|
||||
#endif
|
||||
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
||||
#if LJ_ABI_BRANCH_TRACK
|
||||
*(uint32_t *)p = XI_ENDBR64; p += 4;
|
||||
#endif
|
||||
/* mov al, slot; jmp group */
|
||||
*p++ = XI_MOVrib | RID_EAX; *p++ = (uint8_t)slot;
|
||||
if ((slot & 31) == 31 || slot == CALLBACK_MAX_SLOT-1) {
|
||||
if ((slot & (CALLBACK_MCODE_NSLOT-1)) == (CALLBACK_MCODE_NSLOT-1) ||
|
||||
slot == CALLBACK_MAX_SLOT-1) {
|
||||
/* push ebp/rbp; mov ah, slot>>8; mov ebp, &g. */
|
||||
*p++ = XI_PUSH + RID_EBP;
|
||||
*p++ = XI_MOVrib | (RID_EAX+4); *p++ = (uint8_t)(slot >> 8);
|
||||
@@ -140,7 +158,8 @@ static void *callback_mcode_init(global_State *g, uint8_t *page)
|
||||
*p++ = XI_JMP; *(int32_t *)p = target-(p+4); p += 4;
|
||||
#endif
|
||||
} else {
|
||||
*p++ = XI_JMPs; *p++ = (uint8_t)((2+2)*(31-(slot&31)) - 2);
|
||||
*p++ = XI_JMPs;
|
||||
*p++ = (uint8_t)(CALLBACK_MCODE_SLOTSZ*(CALLBACK_MCODE_NSLOT-1-(slot&(CALLBACK_MCODE_NSLOT-1))) - 2);
|
||||
}
|
||||
}
|
||||
return p;
|
||||
@@ -181,6 +200,9 @@ static void *callback_mcode_init(global_State *g, uint32_t *page)
|
||||
((void **)p)[1] = g;
|
||||
p += 4;
|
||||
for (slot = 0; slot < CALLBACK_MAX_SLOT; slot++) {
|
||||
#if LJ_ABI_BRANCH_TRACK
|
||||
*p++ = A64I_BTI_C;
|
||||
#endif
|
||||
*p++ = A64I_LE(A64I_MOVZw | A64F_D(RID_X9) | A64F_U16(slot));
|
||||
*p = A64I_LE(A64I_B | A64F_S26((page-p) & 0x03ffffffu));
|
||||
p++;
|
||||
@@ -262,6 +284,14 @@ static void *callback_mcode_init(global_State *g, uint32_t *page)
|
||||
#define CCPROT_CREATE 0
|
||||
#endif
|
||||
|
||||
/* Check for macOS hardened runtime. */
|
||||
#if defined(LUAJIT_ENABLE_OSX_HRT) && LUAJIT_SECURITY_MCODE != 0 && defined(MAP_JIT) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 110000
|
||||
#include <pthread.h>
|
||||
#define CCMAP_CREATE MAP_JIT
|
||||
#else
|
||||
#define CCMAP_CREATE 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Allocate and initialize area for callback function pointers. */
|
||||
@@ -276,10 +306,13 @@ static void callback_mcode_new(CTState *cts)
|
||||
if (!p)
|
||||
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
||||
#elif LJ_TARGET_POSIX
|
||||
p = mmap(NULL, sz, (PROT_READ|PROT_WRITE|CCPROT_CREATE), MAP_PRIVATE|MAP_ANONYMOUS,
|
||||
-1, 0);
|
||||
p = mmap(NULL, sz, PROT_READ|PROT_WRITE|CCPROT_CREATE,
|
||||
MAP_PRIVATE|MAP_ANONYMOUS|CCMAP_CREATE, -1, 0);
|
||||
if (p == MAP_FAILED)
|
||||
lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
|
||||
#if CCMAP_CREATE
|
||||
pthread_jit_write_protect_np(0);
|
||||
#endif
|
||||
#else
|
||||
/* Fallback allocator. Fails if memory is not executable by default. */
|
||||
p = lj_mem_new(cts->L, sz);
|
||||
@@ -296,8 +329,12 @@ static void callback_mcode_new(CTState *cts)
|
||||
LJ_WIN_VPROTECT(p, sz, PAGE_EXECUTE_READ, &oprot);
|
||||
}
|
||||
#elif LJ_TARGET_POSIX
|
||||
#if CCMAP_CREATE
|
||||
pthread_jit_write_protect_np(1);
|
||||
#else
|
||||
mprotect(p, sz, (PROT_READ|PROT_EXEC));
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Free area for callback function pointers. */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI C callback handling.
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2025 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_CCALLBACK_H
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user