Compare commits

...

6 Commits

Author SHA1 Message Date
RichardAH
9b1ac4b7b3 Merge branch 'dev' into ccache-100G 2025-12-16 14:16:55 +10:00
tequ
374b361daa Use Self hosted runner (#639) 2025-12-16 14:16:36 +10:00
tequ
52ccf27aa3 Hook API Refactor1: whitelist api at Enum.h (#605) 2025-12-10 19:32:03 +10:00
tequ
10cf8d8a01 Merge branch 'dev' into ccache-100G 2025-12-01 20:18:07 +09:00
tequ
693b42a530 Merge branch 'dev' into ccache-100G 2025-11-27 10:39:21 +09:00
tequ
6e78104e3d Increase ccache size from 10G to 100G in release-builder.sh for improved build performance 2025-11-26 15:52:02 +09:00
6 changed files with 168 additions and 108 deletions

View File

@@ -28,6 +28,10 @@ inputs:
description: 'Cache version for invalidation'
required: false
default: '1'
gha_cache_enabled:
description: 'Whether to use actions/cache (disable for self-hosted with volume mounts)'
required: false
default: 'true'
ccache_enabled:
description: 'Whether to use ccache'
required: false
@@ -72,7 +76,7 @@ runs:
echo "name=${SAFE_BRANCH}" >> $GITHUB_OUTPUT
- name: Restore ccache directory for main branch
if: inputs.ccache_enabled == 'true'
if: inputs.gha_cache_enabled == 'true' && inputs.ccache_enabled == 'true'
id: ccache-restore
uses: ./.github/actions/xahau-ga-cache-restore
with:
@@ -84,7 +88,7 @@ runs:
cache-type: ccache-main
- name: Restore ccache directory for current branch
if: inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
if: inputs.gha_cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
id: ccache-restore-current-branch
uses: ./.github/actions/xahau-ga-cache-restore
with:
@@ -103,6 +107,11 @@ runs:
# Create cache directories
mkdir -p ~/.ccache-main ~/.ccache-current
# Keep config separate from cache_dir so configs aren't swapped when CCACHE_DIR changes between steps
mkdir -p ~/.config/ccache
export CCACHE_CONFIGPATH="$HOME/.config/ccache/ccache.conf"
echo "CCACHE_CONFIGPATH=$CCACHE_CONFIGPATH" >> $GITHUB_ENV
# Configure ccache settings AFTER cache restore (prevents stale cached config)
ccache --set-config=max_size=${{ inputs.ccache_max_size }}
ccache --set-config=hash_dir=${{ inputs.ccache_hash_dir }}
@@ -237,14 +246,14 @@ runs:
run: ccache -s
- name: Save ccache directory for main branch
if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch
if: success() && inputs.gha_cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name == inputs.main_branch
uses: actions/cache/save@v4
with:
path: ~/.ccache-main
key: ${{ steps.ccache-restore.outputs.cache-primary-key }}
- name: Save ccache directory for current branch
if: success() && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
if: success() && inputs.gha_cache_enabled == 'true' && inputs.ccache_enabled == 'true' && steps.safe-branch.outputs.name != inputs.main_branch
uses: actions/cache/save@v4
with:
path: ~/.ccache-current

View File

@@ -17,8 +17,8 @@ inputs:
description: 'Cache version for invalidation'
required: false
default: '1'
cache_enabled:
description: 'Whether to use caching'
gha_cache_enabled:
description: 'Whether to use actions/cache (disable for self-hosted with volume mounts)'
required: false
default: 'true'
main_branch:
@@ -64,7 +64,7 @@ runs:
using: 'composite'
steps:
- name: Restore Conan cache
if: inputs.cache_enabled == 'true'
if: inputs.gha_cache_enabled == 'true'
id: cache-restore-conan
uses: ./.github/actions/xahau-ga-cache-restore
with:
@@ -76,6 +76,17 @@ runs:
${{ runner.os }}-conan-v${{ inputs.cache_version }}-${{ inputs.compiler-id }}-
cache-type: Conan
- name: Configure Conan cache paths
if: inputs.gha_cache_enabled == 'false'
shell: bash
# For self-hosted runners, register cache paths to be used as volumes
# This allows the cache to be shared between containers
run: |
mkdir -p /.conan-cache/conan2 /.conan-cache/conan2_download /.conan-cache/conan2_sources
echo 'core.cache:storage_path=/.conan-cache/conan2' > ~/.conan2/global.conf
echo 'core.download:download_cache=/.conan-cache/conan2_download' >> ~/.conan2/global.conf
echo 'core.sources:download_cache=/.conan-cache/conan2_sources' >> ~/.conan2/global.conf
- name: Configure Conan
shell: bash
run: |
@@ -152,7 +163,7 @@ runs:
..
- name: Save Conan cache
if: success() && inputs.cache_enabled == 'true' && steps.cache-restore-conan.outputs.cache-hit != 'true'
if: success() && inputs.gha_cache_enabled == 'true' && steps.cache-restore-conan.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: ~/.conan2

View File

@@ -33,7 +33,7 @@ jobs:
fetch-depth: 2 # Only get the last 2 commits, to avoid fetching all history
build:
runs-on: [self-hosted, vanity]
runs-on: [self-hosted, xahaud-build]
needs: [checkout]
defaults:
run:
@@ -74,7 +74,7 @@ jobs:
fi
tests:
runs-on: [self-hosted, vanity]
runs-on: [self-hosted, xahaud-build]
needs: [build, checkout]
defaults:
run:
@@ -84,7 +84,7 @@ jobs:
run: /bin/bash docker-unit-tests.sh
cleanup:
runs-on: [self-hosted, vanity]
runs-on: [self-hosted, xahaud-build]
needs: [tests, checkout]
if: always()
steps:

View File

@@ -14,7 +14,7 @@ concurrency:
jobs:
matrix-setup:
runs-on: ubuntu-latest
runs-on: [self-hosted, generic, 20.04]
container: python:3-slim
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
@@ -176,7 +176,16 @@ jobs:
build:
needs: matrix-setup
runs-on: ubuntu-latest
runs-on: [self-hosted, generic, 20.04]
container:
image: ubuntu:24.04
volumes:
- /home/runner/.conan-cache:/.conan-cache
- /home/runner/.ccache-main:/github/home/.ccache-main
- /home/runner/.ccache-current:/github/home/.ccache-current
defaults:
run:
shell: bash
outputs:
artifact_name: ${{ steps.set-artifact-name.outputs.artifact_name }}
strategy:
@@ -191,23 +200,22 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Get commit message
id: get-commit-message
uses: ./.github/actions/xahau-ga-get-commit-message
with:
event-name: ${{ github.event_name }}
head-commit-message: ${{ github.event.head_commit.message }}
pr-head-sha: ${{ github.event.pull_request.head.sha }}
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y ninja-build ${{ matrix.cc }} ${{ matrix.cxx }} ccache
apt-get update
apt-get install -y software-properties-common
add-apt-repository ppa:ubuntu-toolchain-r/test -y
apt-get update
apt-get install -y python3 python-is-python3 pipx
pipx ensurepath
apt-get install -y cmake ninja-build ${{ matrix.cc }} ${{ matrix.cxx }} ccache
apt-get install -y perl # for openssl build
apt-get install -y libsqlite3-dev # for xahaud build
# Install the specific GCC version needed for Clang
if [ -n "${{ matrix.clang_gcc_toolchain }}" ]; then
echo "=== Installing GCC ${{ matrix.clang_gcc_toolchain }} for Clang ==="
sudo apt-get install -y gcc-${{ matrix.clang_gcc_toolchain }} g++-${{ matrix.clang_gcc_toolchain }} libstdc++-${{ matrix.clang_gcc_toolchain }}-dev
apt-get install -y gcc-${{ matrix.clang_gcc_toolchain }} g++-${{ matrix.clang_gcc_toolchain }} libstdc++-${{ matrix.clang_gcc_toolchain }}-dev
echo "=== GCC versions available after installation ==="
ls -la /usr/lib/gcc/x86_64-linux-gnu/ | grep -E "^d"
@@ -238,7 +246,7 @@ jobs:
echo "Hiding GCC $version -> renaming to $counter (will be seen as GCC version $counter)"
# Safety check: ensure target doesn't already exist
if [ ! -e "/usr/lib/gcc/x86_64-linux-gnu/$counter" ]; then
sudo mv "$dir" "/usr/lib/gcc/x86_64-linux-gnu/$counter"
mv "$dir" "/usr/lib/gcc/x86_64-linux-gnu/$counter"
else
echo "ERROR: Cannot rename GCC $version - /usr/lib/gcc/x86_64-linux-gnu/$counter already exists"
exit 1
@@ -262,11 +270,12 @@ jobs:
# Install libc++ dev packages if using libc++ (not needed for libstdc++)
if [ "${{ matrix.stdlib }}" = "libcxx" ]; then
sudo apt-get install -y libc++-${{ matrix.compiler_version }}-dev libc++abi-${{ matrix.compiler_version }}-dev
apt-get install -y libc++-${{ matrix.compiler_version }}-dev libc++abi-${{ matrix.compiler_version }}-dev
fi
# Install Conan 2
pip install --upgrade "conan>=2.0,<3"
pipx install "conan>=2.0,<3"
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Check environment
run: |
@@ -280,6 +289,14 @@ jobs:
echo "---- Full Environment ----"
env
- name: Get commit message
id: get-commit-message
uses: ./.github/actions/xahau-ga-get-commit-message
with:
event-name: ${{ github.event_name }}
head-commit-message: ${{ github.event.head_commit.message }}
pr-head-sha: ${{ github.event.pull_request.head.sha }}
- name: Install dependencies
uses: ./.github/actions/xahau-ga-dependencies
with:
@@ -293,6 +310,7 @@ jobs:
cc: ${{ matrix.cc }}
cxx: ${{ matrix.cxx }}
stdlib: ${{ matrix.stdlib }}
gha_cache_enabled: 'false' # Disable caching for self hosted runner
- name: Build
uses: ./.github/actions/xahau-ga-build
@@ -307,6 +325,8 @@ jobs:
main_branch: ${{ env.MAIN_BRANCH_NAME }}
stdlib: ${{ matrix.stdlib }}
clang_gcc_toolchain: ${{ matrix.clang_gcc_toolchain || '' }}
gha_cache_enabled: 'false' # Disable caching for self hosted runner
ccache_max_size: '100G'
- name: Set artifact name
id: set-artifact-name

View File

@@ -192,7 +192,7 @@ ENV PATH=/usr/local/bin:$PATH
# Configure ccache and Conan 2
# NOTE: Using echo commands instead of heredocs because heredocs in Docker RUN commands are finnicky
RUN /hbb_exe/activate-exec bash -c "ccache -M 10G && \
RUN /hbb_exe/activate-exec bash -c "ccache -M 100G && \
ccache -o cache_dir=/cache/ccache && \
ccache -o compiler_check=content && \
mkdir -p ~/.conan2 /cache/conan2 /cache/conan2_download /cache/conan2_sources && \

View File

@@ -367,90 +367,110 @@ const uint8_t max_emit = 255;
const uint8_t max_params = 16;
const double fee_base_multiplier = 1.1f;
#define I32 0x7FU
#define I64 0x7EU
#define HOOK_WRAP_PARAMS(...) __VA_ARGS__
#define HOOK_API_DEFINITION(RETURN_TYPE, FUNCTION_NAME, PARAMS_TUPLE) \
{ \
#FUNCTION_NAME, \
{ \
RETURN_TYPE, HOOK_WRAP_PARAMS PARAMS_TUPLE \
} \
}
using APIWhitelist = std::map<std::string, std::vector<uint8_t>>;
// RH NOTE: Find descriptions of api functions in ./impl/applyHook.cpp and
// hookapi.h (include for hooks) this is a map of the api name to its return
// code (vec[0] and its parameters vec[>0]) as wasm type codes
static const std::map<std::string, std::vector<uint8_t>> import_whitelist{
{"_g", {0x7FU, 0x7FU, 0x7FU}},
{"accept", {0x7EU, 0x7FU, 0x7FU, 0x7EU}},
{"rollback", {0x7EU, 0x7FU, 0x7FU, 0x7EU}},
{"util_raddr", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"util_accid", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"util_verify", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"util_sha512h", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"util_keylet",
{0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"sto_validate", {0x7EU, 0x7FU, 0x7FU}},
{"sto_subfield", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"sto_subarray", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"sto_emplace", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"sto_erase", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"etxn_burden", {0x7EU}},
{"etxn_details", {0x7EU, 0x7FU, 0x7FU}},
{"etxn_fee_base", {0x7EU, 0x7FU, 0x7FU}},
{"etxn_reserve", {0x7EU, 0x7FU}},
{"etxn_generation", {0x7EU}},
{"etxn_nonce", {0x7EU, 0x7FU, 0x7FU}},
{"emit", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"float_set", {0x7EU, 0x7FU, 0x7EU}},
{"float_multiply", {0x7EU, 0x7EU, 0x7EU}},
{"float_mulratio", {0x7EU, 0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"float_negate", {0x7EU, 0x7EU}},
{"float_compare", {0x7EU, 0x7EU, 0x7EU, 0x7FU}},
{"float_sum", {0x7EU, 0x7EU, 0x7EU}},
{"float_sto",
{0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7EU, 0x7FU}},
{"float_sto_set", {0x7EU, 0x7FU, 0x7FU}},
{"float_invert", {0x7EU, 0x7EU}},
{"float_divide", {0x7EU, 0x7EU, 0x7EU}},
{"float_one", {0x7EU}},
{"float_mantissa", {0x7EU, 0x7EU}},
{"float_sign", {0x7EU, 0x7EU}},
{"float_int", {0x7EU, 0x7EU, 0x7FU, 0x7FU}},
{"float_log", {0x7EU, 0x7EU}},
{"float_root", {0x7EU, 0x7EU, 0x7FU}},
{"fee_base", {0x7EU}},
{"ledger_seq", {0x7EU}},
{"ledger_last_time", {0x7EU}},
{"ledger_last_hash", {0x7EU, 0x7FU, 0x7FU}},
{"ledger_nonce", {0x7EU, 0x7FU, 0x7FU}},
{"ledger_keylet", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"hook_account", {0x7EU, 0x7FU, 0x7FU}},
{"hook_hash", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"hook_param_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"hook_param", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"hook_again", {0x7EU}},
{"hook_skip", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"hook_pos", {0x7EU}},
{"slot", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"slot_clear", {0x7EU, 0x7FU}},
{"slot_count", {0x7EU, 0x7FU}},
{"slot_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"slot_size", {0x7EU, 0x7FU}},
{"slot_subarray", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"slot_subfield", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"slot_type", {0x7EU, 0x7FU, 0x7FU}},
{"slot_float", {0x7EU, 0x7FU}},
{"state_set", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"state_foreign_set",
{0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"state", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"state_foreign",
{0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"trace", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"trace_num", {0x7EU, 0x7FU, 0x7FU, 0x7EU}},
{"trace_float", {0x7EU, 0x7FU, 0x7FU, 0x7EU}},
{"otxn_burden", {0x7EU}},
{"otxn_field", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"otxn_generation", {0x7EU}},
{"otxn_id", {0x7EU, 0x7FU, 0x7FU, 0x7FU}},
{"otxn_type", {0x7EU}},
{"otxn_slot", {0x7EU, 0x7FU}},
{"otxn_param", {0x7EU, 0x7FU, 0x7FU, 0x7FU, 0x7FU}},
{"meta_slot", {0x7EU, 0x7FU}}};
static const APIWhitelist import_whitelist{
// clang-format off
HOOK_API_DEFINITION(I32, _g, (I32, I32)),
HOOK_API_DEFINITION(I64, accept, (I32, I32, I64)),
HOOK_API_DEFINITION(I64, rollback, (I32, I32, I64)),
HOOK_API_DEFINITION(I64, util_raddr, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, util_accid, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, util_verify, (I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, util_sha512h, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, util_keylet, (I32, I32, I32, I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, sto_validate, (I32, I32)),
HOOK_API_DEFINITION(I64, sto_subfield, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, sto_subarray, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, sto_emplace, (I32, I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, sto_erase, (I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, etxn_burden, ()),
HOOK_API_DEFINITION(I64, etxn_details, (I32, I32)),
HOOK_API_DEFINITION(I64, etxn_fee_base, (I32, I32)),
HOOK_API_DEFINITION(I64, etxn_reserve, (I32)),
HOOK_API_DEFINITION(I64, etxn_generation, ()),
HOOK_API_DEFINITION(I64, etxn_nonce, (I32, I32)),
HOOK_API_DEFINITION(I64, emit, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, float_set, (I32, I64)),
HOOK_API_DEFINITION(I64, float_multiply, (I64, I64)),
HOOK_API_DEFINITION(I64, float_mulratio, (I64, I32, I32, I32)),
HOOK_API_DEFINITION(I64, float_negate, (I64)),
HOOK_API_DEFINITION(I64, float_compare, (I64, I64, I32)),
HOOK_API_DEFINITION(I64, float_sum, (I64, I64)),
HOOK_API_DEFINITION(I64, float_sto, (I32, I32, I32, I32, I32, I32, I64, I32)),
HOOK_API_DEFINITION(I64, float_sto_set, (I32, I32)),
HOOK_API_DEFINITION(I64, float_invert, (I64)),
HOOK_API_DEFINITION(I64, float_divide, (I64, I64)),
HOOK_API_DEFINITION(I64, float_one, ()),
HOOK_API_DEFINITION(I64, float_mantissa, (I64)),
HOOK_API_DEFINITION(I64, float_sign, (I64)),
HOOK_API_DEFINITION(I64, float_int, (I64, I32, I32)),
HOOK_API_DEFINITION(I64, float_log, (I64)),
HOOK_API_DEFINITION(I64, float_root, (I64, I32)),
HOOK_API_DEFINITION(I64, fee_base, ()),
HOOK_API_DEFINITION(I64, ledger_seq, ()),
HOOK_API_DEFINITION(I64, ledger_last_time, ()),
HOOK_API_DEFINITION(I64, ledger_last_hash, (I32, I32)),
HOOK_API_DEFINITION(I64, ledger_nonce, (I32, I32)),
HOOK_API_DEFINITION(I64, ledger_keylet, (I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, hook_account, (I32, I32)),
HOOK_API_DEFINITION(I64, hook_hash, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, hook_param_set, (I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, hook_param, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, hook_again, ()),
HOOK_API_DEFINITION(I64, hook_skip, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, hook_pos, ()),
HOOK_API_DEFINITION(I64, slot, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, slot_clear, (I32)),
HOOK_API_DEFINITION(I64, slot_count, (I32)),
HOOK_API_DEFINITION(I64, slot_set, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, slot_size, (I32)),
HOOK_API_DEFINITION(I64, slot_subarray, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, slot_subfield, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, slot_type, (I32, I32)),
HOOK_API_DEFINITION(I64, slot_float, (I32)),
HOOK_API_DEFINITION(I64, state_set, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, state_foreign_set, (I32, I32, I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, state, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, state_foreign, (I32, I32, I32, I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, trace, (I32, I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, trace_num, (I32, I32, I64)),
HOOK_API_DEFINITION(I64, trace_float, (I32, I32, I64)),
HOOK_API_DEFINITION(I64, otxn_burden, ()),
HOOK_API_DEFINITION(I64, otxn_field, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, otxn_generation, ()),
HOOK_API_DEFINITION(I64, otxn_id, (I32, I32, I32)),
HOOK_API_DEFINITION(I64, otxn_type, ()),
HOOK_API_DEFINITION(I64, otxn_slot, (I32)),
HOOK_API_DEFINITION(I64, otxn_param, (I32, I32, I32, I32)),
HOOK_API_DEFINITION(I64, meta_slot, (I32)),
// clang-format on
};
// featureHooks1
static const std::map<std::string, std::vector<uint8_t>> import_whitelist_1{
{"xpop_slot", {0x7EU, 0x7FU, 0x7FU}}};
static const APIWhitelist import_whitelist_1{
// clang-format off
HOOK_API_DEFINITION(I64, xpop_slot, (I32, I32)),
// clang-format on
};
#undef HOOK_API_DEFINITION
#undef I32
#undef I64
}; // namespace hook_api
#endif