infix
A JIT-Powered FFI Library for C
Loading...
Searching...
No Matches
abi_riscv64.c File Reference

Implements the FFI logic for the RISC-V RV64GC (lp64d) architecture. More...

#include "arch/riscv/abi_riscv64_common.h"
#include "arch/riscv/abi_riscv64_emitters.h"
#include "common/infix_internals.h"
#include "common/utility.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
Include dependency graph for abi_riscv64.c:

Classes

struct  rv64_arg_class
 
struct  rv64_all_leaf
 
struct  rv64_all_leaf_list
 
struct  rv64_return_class
 
struct  rv64_direct_scratch_info
 

Macros

#define RV_NUM_GPR_ARGS   8
 
#define RV_NUM_FPR_ARGS   8
 
#define RV_MAX_FLATTENED_FIELDS   32
 
#define RV_MAX_FLATTEN_DEPTH   32
 
#define RV_FWD_SAVED_SIZE   32
 
#define RV_REV_SAVED_SIZE   16
 

Functions

static infix_status prepare_forward_call_frame_riscv64 (infix_arena_t *arena, infix_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_fn)
 
static infix_status generate_forward_prologue_riscv64 (code_buffer *buf, infix_call_frame_layout *layout)
 
static infix_status generate_forward_argument_moves_riscv64 (code_buffer *buf, infix_call_frame_layout *layout, infix_type **arg_types, size_t num_args, c23_maybe_unused size_t num_fixed_args)
 
static infix_status generate_forward_call_instruction_riscv64 (code_buffer *, infix_call_frame_layout *)
 
static infix_status generate_forward_epilogue_riscv64 (code_buffer *buf, infix_call_frame_layout *layout, infix_type *ret_type)
 
static infix_status prepare_reverse_call_frame_riscv64 (infix_arena_t *arena, infix_reverse_call_frame_layout **out_layout, infix_reverse_t *context)
 
static infix_status generate_reverse_prologue_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout)
 
static infix_status generate_reverse_argument_marshalling_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
 
static infix_status generate_reverse_dispatcher_call_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
 
static infix_status generate_reverse_epilogue_riscv64 (code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
 
static infix_status prepare_direct_forward_call_frame_riscv64 (infix_arena_t *arena, infix_direct_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, infix_direct_arg_handler_t *handlers, void *target_fn)
 
static infix_status generate_direct_forward_prologue_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout)
 
static infix_status generate_direct_forward_argument_moves_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout)
 
static infix_status generate_direct_forward_call_instruction_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout)
 
static infix_status generate_direct_forward_epilogue_riscv64 (code_buffer *buf, infix_direct_call_frame_layout *layout, infix_type *ret_type)
 
static void rv64_emit_compute_addr (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t offset)
 
static void rv64_mem_ld (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_sd (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_mem_lw (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_sw (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_mem_lbu (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_lhu (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_sb (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_mem_sh (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_mem_fld (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_fsd (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_mem_flw (code_buffer *buf, uint8_t rd, uint8_t rs_base, int32_t off)
 
static void rv64_mem_fsw (code_buffer *buf, uint8_t rs_base, uint8_t data, int32_t off)
 
static void rv64_emit_stack_sub (code_buffer *buf, uint32_t amount)
 
static void rv64_emit_stack_add (code_buffer *buf, uint32_t amount)
 
static void rv64_emit_load_gpr_value_sized (code_buffer *buf, uint8_t rd, uint8_t addr_reg, size_t size, bool is_signed)
 
static void rv64_emit_load_gpr_value (code_buffer *buf, uint8_t rd, uint8_t addr_reg, const infix_type *type)
 
static void rv64_emit_copy_memory (code_buffer *buf, uint8_t dst_base, int32_t dst_off, uint8_t src_base, int32_t src_off, size_t size)
 
static void rv64_emit_store_gpr_low_bytes (code_buffer *buf, uint8_t base, uint8_t rd, int32_t off, size_t size)
 
static void rv64_emit_store_gpr_return (code_buffer *buf, uint8_t base, size_t size)
 
static void rv64_emit_store_fp_value (code_buffer *buf, uint8_t base, uint8_t fa, int32_t off, size_t size)
 
static void rv64_emit_load_fp_value (code_buffer *buf, uint8_t base, uint8_t fa, int32_t off, size_t size)
 
static bool rv64_flatten_all_recursive (const infix_type *type, size_t base_offset, rv64_all_leaf_list *out, size_t depth)
 
static bool rv64_flatten_all (const infix_type *type, rv64_all_leaf_list *out)
 
static void rv64_emit_load_fp_aggregate (code_buffer *buf, uint8_t addr_reg, uint8_t base_fpr, const infix_type *type)
 
static void rv64_emit_store_fp_aggregate (code_buffer *buf, uint8_t addr_reg, uint8_t base_fpr, const infix_type *type)
 
static void rv64_emit_load_mixed (code_buffer *buf, uint8_t addr_reg, uint8_t gpr_reg, uint8_t fpr_reg, const infix_type *type)
 
static void rv64_emit_store_mixed (code_buffer *buf, uint8_t addr_reg, uint8_t gpr_reg, uint8_t fpr_reg, const infix_type *type)
 
static bool rv64_return_in_memory (const infix_type *type)
 
static rv64_return_class rv64_classify_return (const infix_type *type)
 
static uint32_t rv64_stack_place (uint32_t *stack_offset, const infix_type *type)
 
static rv64_arg_class rv64_classify_integer (infix_type *type, bool is_variadic_arg, size_t *gpr_count, uint32_t *stack_offset, bool *variadic_stack_mode)
 
static rv64_arg_class rv64_classify_arg (infix_type *type, bool is_variadic_arg, size_t *gpr_count, size_t *vpr_count, uint32_t *stack_offset, bool *variadic_stack_mode)
 
static infix_status generate_forward_call_instruction_riscv64 (code_buffer *buf, c23_maybe_unused infix_call_frame_layout *layout)
 
static rv64_direct_scratch_info rv64_direct_scratch (const infix_direct_arg_layout *arg)
 
static size_t rv64_direct_standard_alloc (const infix_direct_call_frame_layout *layout)
 
static infix_status generate_direct_forward_call_instruction_riscv64 (code_buffer *buf, c23_maybe_unused infix_direct_call_frame_layout *layout)
 

Variables

static const riscv_gpr GPR_ARGS [] = {X_A0_REG, X_A1_REG, X_A2_REG, X_A3_REG, X_A4_REG, X_A5_REG, X_A6_REG, X_A7_REG}
 
static const riscv_fpr FPR_ARGS []
 
const infix_forward_abi_spec g_riscv64_forward_spec
 
const infix_reverse_abi_spec g_riscv64_reverse_spec
 
const infix_direct_forward_abi_spec g_riscv64_direct_forward_spec
 

Detailed Description

Implements the FFI logic for the RISC-V RV64GC (lp64d) architecture.

Copyright (c) 2026 Sanko Robinson

This source code is dual-licensed under the Artistic License 2.0 or the MIT License. You may choose to use this code under the terms of either license.

SPDX-License-Identifier: (Artistic-2.0 OR MIT)

The documentation blocks within this file are licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).

SPDX-License-Identifier: CC-BY-4.0

Macro Definition Documentation

◆ RV_FWD_SAVED_SIZE

#define RV_FWD_SAVED_SIZE   32

◆ RV_MAX_FLATTEN_DEPTH

#define RV_MAX_FLATTEN_DEPTH   32

◆ RV_MAX_FLATTENED_FIELDS

#define RV_MAX_FLATTENED_FIELDS   32

◆ RV_NUM_FPR_ARGS

#define RV_NUM_FPR_ARGS   8

◆ RV_NUM_GPR_ARGS

#define RV_NUM_GPR_ARGS   8

◆ RV_REV_SAVED_SIZE

#define RV_REV_SAVED_SIZE   16

Function Documentation

◆ generate_direct_forward_argument_moves_riscv64()

static infix_status generate_direct_forward_argument_moves_riscv64 ( code_buffer buf,
infix_direct_call_frame_layout layout 
)
static

◆ generate_direct_forward_call_instruction_riscv64() [1/2]

static infix_status generate_direct_forward_call_instruction_riscv64 ( code_buffer buf,
c23_maybe_unused infix_direct_call_frame_layout layout 
)
static

◆ generate_direct_forward_call_instruction_riscv64() [2/2]

static infix_status generate_direct_forward_call_instruction_riscv64 ( code_buffer buf,
infix_direct_call_frame_layout layout 
)
static

◆ generate_direct_forward_epilogue_riscv64()

static infix_status generate_direct_forward_epilogue_riscv64 ( code_buffer buf,
infix_direct_call_frame_layout layout,
infix_type ret_type 
)
static

◆ generate_direct_forward_prologue_riscv64()

static infix_status generate_direct_forward_prologue_riscv64 ( code_buffer buf,
infix_direct_call_frame_layout layout 
)
static

◆ generate_forward_argument_moves_riscv64()

static infix_status generate_forward_argument_moves_riscv64 ( code_buffer buf,
infix_call_frame_layout layout,
infix_type **  arg_types,
size_t  num_args,
c23_maybe_unused size_t  num_fixed_args 
)
static

◆ generate_forward_call_instruction_riscv64() [1/2]

static infix_status generate_forward_call_instruction_riscv64 ( code_buffer ,
infix_call_frame_layout  
)
static

◆ generate_forward_call_instruction_riscv64() [2/2]

static infix_status generate_forward_call_instruction_riscv64 ( code_buffer buf,
c23_maybe_unused infix_call_frame_layout layout 
)
static

◆ generate_forward_epilogue_riscv64()

static infix_status generate_forward_epilogue_riscv64 ( code_buffer buf,
infix_call_frame_layout layout,
infix_type ret_type 
)
static

◆ generate_forward_prologue_riscv64()

static infix_status generate_forward_prologue_riscv64 ( code_buffer buf,
infix_call_frame_layout layout 
)
static

◆ generate_reverse_argument_marshalling_riscv64()

static infix_status generate_reverse_argument_marshalling_riscv64 ( code_buffer buf,
infix_reverse_call_frame_layout layout,
infix_reverse_t context 
)
static

◆ generate_reverse_dispatcher_call_riscv64()

static infix_status generate_reverse_dispatcher_call_riscv64 ( code_buffer buf,
infix_reverse_call_frame_layout layout,
infix_reverse_t context 
)
static

◆ generate_reverse_epilogue_riscv64()

static infix_status generate_reverse_epilogue_riscv64 ( code_buffer buf,
infix_reverse_call_frame_layout layout,
infix_reverse_t context 
)
static

◆ generate_reverse_prologue_riscv64()

static infix_status generate_reverse_prologue_riscv64 ( code_buffer buf,
infix_reverse_call_frame_layout layout 
)
static

◆ prepare_direct_forward_call_frame_riscv64()

static infix_status prepare_direct_forward_call_frame_riscv64 ( infix_arena_t arena,
infix_direct_call_frame_layout **  out_layout,
infix_type ret_type,
infix_type **  arg_types,
size_t  num_args,
infix_direct_arg_handler_t handlers,
void *  target_fn 
)
static

◆ prepare_forward_call_frame_riscv64()

static infix_status prepare_forward_call_frame_riscv64 ( infix_arena_t arena,
infix_call_frame_layout **  out_layout,
infix_type ret_type,
infix_type **  arg_types,
size_t  num_args,
size_t  num_fixed_args,
void *  target_fn 
)
static

◆ prepare_reverse_call_frame_riscv64()

static infix_status prepare_reverse_call_frame_riscv64 ( infix_arena_t arena,
infix_reverse_call_frame_layout **  out_layout,
infix_reverse_t context 
)
static

◆ rv64_classify_arg()

static rv64_arg_class rv64_classify_arg ( infix_type type,
bool  is_variadic_arg,
size_t *  gpr_count,
size_t *  vpr_count,
uint32_t *  stack_offset,
bool *  variadic_stack_mode 
)
static

◆ rv64_classify_integer()

static rv64_arg_class rv64_classify_integer ( infix_type type,
bool  is_variadic_arg,
size_t *  gpr_count,
uint32_t *  stack_offset,
bool *  variadic_stack_mode 
)
static

◆ rv64_classify_return()

static rv64_return_class rv64_classify_return ( const infix_type type)
static

◆ rv64_direct_scratch()

static rv64_direct_scratch_info rv64_direct_scratch ( const infix_direct_arg_layout arg)
static

◆ rv64_direct_standard_alloc()

static size_t rv64_direct_standard_alloc ( const infix_direct_call_frame_layout layout)
static

◆ rv64_emit_compute_addr()

static void rv64_emit_compute_addr ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  offset 
)
static

◆ rv64_emit_copy_memory()

static void rv64_emit_copy_memory ( code_buffer buf,
uint8_t  dst_base,
int32_t  dst_off,
uint8_t  src_base,
int32_t  src_off,
size_t  size 
)
static

◆ rv64_emit_load_fp_aggregate()

static void rv64_emit_load_fp_aggregate ( code_buffer buf,
uint8_t  addr_reg,
uint8_t  base_fpr,
const infix_type type 
)
static

◆ rv64_emit_load_fp_value()

static void rv64_emit_load_fp_value ( code_buffer buf,
uint8_t  base,
uint8_t  fa,
int32_t  off,
size_t  size 
)
static

◆ rv64_emit_load_gpr_value()

static void rv64_emit_load_gpr_value ( code_buffer buf,
uint8_t  rd,
uint8_t  addr_reg,
const infix_type type 
)
static

◆ rv64_emit_load_gpr_value_sized()

static void rv64_emit_load_gpr_value_sized ( code_buffer buf,
uint8_t  rd,
uint8_t  addr_reg,
size_t  size,
bool  is_signed 
)
static

◆ rv64_emit_load_mixed()

static void rv64_emit_load_mixed ( code_buffer buf,
uint8_t  addr_reg,
uint8_t  gpr_reg,
uint8_t  fpr_reg,
const infix_type type 
)
static

◆ rv64_emit_stack_add()

static void rv64_emit_stack_add ( code_buffer buf,
uint32_t  amount 
)
static

◆ rv64_emit_stack_sub()

static void rv64_emit_stack_sub ( code_buffer buf,
uint32_t  amount 
)
static

◆ rv64_emit_store_fp_aggregate()

static void rv64_emit_store_fp_aggregate ( code_buffer buf,
uint8_t  addr_reg,
uint8_t  base_fpr,
const infix_type type 
)
static

◆ rv64_emit_store_fp_value()

static void rv64_emit_store_fp_value ( code_buffer buf,
uint8_t  base,
uint8_t  fa,
int32_t  off,
size_t  size 
)
static

◆ rv64_emit_store_gpr_low_bytes()

static void rv64_emit_store_gpr_low_bytes ( code_buffer buf,
uint8_t  base,
uint8_t  rd,
int32_t  off,
size_t  size 
)
static

◆ rv64_emit_store_gpr_return()

static void rv64_emit_store_gpr_return ( code_buffer buf,
uint8_t  base,
size_t  size 
)
static

◆ rv64_emit_store_mixed()

static void rv64_emit_store_mixed ( code_buffer buf,
uint8_t  addr_reg,
uint8_t  gpr_reg,
uint8_t  fpr_reg,
const infix_type type 
)
static

◆ rv64_flatten_all()

static bool rv64_flatten_all ( const infix_type type,
rv64_all_leaf_list out 
)
static

◆ rv64_flatten_all_recursive()

static bool rv64_flatten_all_recursive ( const infix_type type,
size_t  base_offset,
rv64_all_leaf_list out,
size_t  depth 
)
static

◆ rv64_mem_fld()

static void rv64_mem_fld ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_flw()

static void rv64_mem_flw ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_fsd()

static void rv64_mem_fsd ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_mem_fsw()

static void rv64_mem_fsw ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_mem_lbu()

static void rv64_mem_lbu ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_ld()

static void rv64_mem_ld ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_lhu()

static void rv64_mem_lhu ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_lw()

static void rv64_mem_lw ( code_buffer buf,
uint8_t  rd,
uint8_t  rs_base,
int32_t  off 
)
static

◆ rv64_mem_sb()

static void rv64_mem_sb ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_mem_sd()

static void rv64_mem_sd ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_mem_sh()

static void rv64_mem_sh ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_mem_sw()

static void rv64_mem_sw ( code_buffer buf,
uint8_t  rs_base,
uint8_t  data,
int32_t  off 
)
static

◆ rv64_return_in_memory()

static bool rv64_return_in_memory ( const infix_type type)
static

◆ rv64_stack_place()

static uint32_t rv64_stack_place ( uint32_t *  stack_offset,
const infix_type type 
)
static

Variable Documentation

◆ FPR_ARGS

const riscv_fpr FPR_ARGS[]
static
Initial value:
= {
@ F_FA5_REG
f15: FP Argument 6.
Definition abi_riscv64_common.h:105
@ F_FA1_REG
f11: FP Argument 2 / caller-saved.
Definition abi_riscv64_common.h:101
@ F_FA7_REG
f17: FP Argument 8.
Definition abi_riscv64_common.h:107
@ F_FA4_REG
f14: FP Argument 5.
Definition abi_riscv64_common.h:104
@ F_FA0_REG
f10: FP Argument 1 / FP Return value / caller-saved.
Definition abi_riscv64_common.h:100
@ F_FA2_REG
f12: FP Argument 3.
Definition abi_riscv64_common.h:102
@ F_FA3_REG
f13: FP Argument 4.
Definition abi_riscv64_common.h:103
@ F_FA6_REG
f16: FP Argument 7.
Definition abi_riscv64_common.h:106

◆ g_riscv64_direct_forward_spec

const infix_direct_forward_abi_spec g_riscv64_direct_forward_spec
Initial value:
= {
.prepare_direct_forward_call_frame = prepare_direct_forward_call_frame_riscv64,
.generate_direct_forward_prologue = generate_direct_forward_prologue_riscv64,
.generate_direct_forward_argument_moves = generate_direct_forward_argument_moves_riscv64,
.generate_direct_forward_call_instruction = generate_direct_forward_call_instruction_riscv64,
.generate_direct_forward_epilogue = generate_direct_forward_epilogue_riscv64}
static infix_status generate_direct_forward_call_instruction_riscv64(code_buffer *buf, infix_direct_call_frame_layout *layout)
static infix_status prepare_direct_forward_call_frame_riscv64(infix_arena_t *arena, infix_direct_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, infix_direct_arg_handler_t *handlers, void *target_fn)
Definition abi_riscv64.c:1520
static infix_status generate_direct_forward_argument_moves_riscv64(code_buffer *buf, infix_direct_call_frame_layout *layout)
Definition abi_riscv64.c:1588
static infix_status generate_direct_forward_prologue_riscv64(code_buffer *buf, infix_direct_call_frame_layout *layout)
Definition abi_riscv64.c:1569
static infix_status generate_direct_forward_epilogue_riscv64(code_buffer *buf, infix_direct_call_frame_layout *layout, infix_type *ret_type)
Definition abi_riscv64.c:1753

◆ g_riscv64_forward_spec

const infix_forward_abi_spec g_riscv64_forward_spec
Initial value:
= {
.prepare_forward_call_frame = prepare_forward_call_frame_riscv64,
.generate_forward_prologue = generate_forward_prologue_riscv64,
.generate_forward_argument_moves = generate_forward_argument_moves_riscv64,
.generate_forward_call_instruction = generate_forward_call_instruction_riscv64,
.generate_forward_epilogue = generate_forward_epilogue_riscv64}
static infix_status generate_forward_argument_moves_riscv64(code_buffer *buf, infix_call_frame_layout *layout, infix_type **arg_types, size_t num_args, c23_maybe_unused size_t num_fixed_args)
Definition abi_riscv64.c:1112
static infix_status generate_forward_prologue_riscv64(code_buffer *buf, infix_call_frame_layout *layout)
Definition abi_riscv64.c:1086
static infix_status generate_forward_call_instruction_riscv64(code_buffer *, infix_call_frame_layout *)
static infix_status generate_forward_epilogue_riscv64(code_buffer *buf, infix_call_frame_layout *layout, infix_type *ret_type)
Definition abi_riscv64.c:1210
static infix_status prepare_forward_call_frame_riscv64(infix_arena_t *arena, infix_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_fn)
Definition abi_riscv64.c:1017

◆ g_riscv64_reverse_spec

const infix_reverse_abi_spec g_riscv64_reverse_spec
Initial value:
= {
.prepare_reverse_call_frame = prepare_reverse_call_frame_riscv64,
.generate_reverse_prologue = generate_reverse_prologue_riscv64,
.generate_reverse_argument_marshalling = generate_reverse_argument_marshalling_riscv64,
.generate_reverse_dispatcher_call = generate_reverse_dispatcher_call_riscv64,
.generate_reverse_epilogue = generate_reverse_epilogue_riscv64}
static infix_status generate_reverse_prologue_riscv64(code_buffer *buf, infix_reverse_call_frame_layout *layout)
Definition abi_riscv64.c:1292
static infix_status generate_reverse_argument_marshalling_riscv64(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Definition abi_riscv64.c:1307
static infix_status prepare_reverse_call_frame_riscv64(infix_arena_t *arena, infix_reverse_call_frame_layout **out_layout, infix_reverse_t *context)
Definition abi_riscv64.c:1250
static infix_status generate_reverse_dispatcher_call_riscv64(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Definition abi_riscv64.c:1404
static infix_status generate_reverse_epilogue_riscv64(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Definition abi_riscv64.c:1422

◆ GPR_ARGS