#pragma once
#include <string>
#include <stddef.h>
#include <stdint.h>
namespace Luau
{
namespace CodeGen
{
enum CodeGenFlags
{
CodeGen_OnlyNativeModules = 1 << 0,
CodeGen_ColdFunctions = 1 << 1,
};
enum class CodeGenCounter : unsigned
{
RegularBlockExecuted = 1,
FallbackBlockExecuted = 2,
VmExitTaken = 3,
};
using AllocationCallback = void(void* context, void* oldPointer, size_t oldSize, void* newPointer, size_t newSize);
struct IrBuilder;
struct IrOp;
using HostVectorOperationBytecodeType = uint8_t (*)(const char* member, size_t memberLength);
using HostVectorAccessHandler = bool (*)(IrBuilder& builder, const char* member, size_t memberLength, int resultReg, int sourceReg, int pcpos);
using HostVectorNamecallHandler =
bool (*)(IrBuilder& builder, const char* member, size_t memberLength, int argResReg, int sourceReg, int params, int results, int pcpos);
enum class HostMetamethod
{
Add,
Sub,
Mul,
Div,
Idiv,
Mod,
Pow,
Minus,
Equal,
LessThan,
LessEqual,
Length,
Concat,
};
using HostUserdataOperationBytecodeType = uint8_t (*)(uint8_t type, const char* member, size_t memberLength);
using HostUserdataMetamethodBytecodeType = uint8_t (*)(uint8_t lhsTy, uint8_t rhsTy, HostMetamethod method);
using HostUserdataAccessHandler =
bool (*)(IrBuilder& builder, uint8_t type, const char* member, size_t memberLength, int resultReg, int sourceReg, int pcpos);
using HostUserdataMetamethodHandler =
bool (*)(IrBuilder& builder, uint8_t lhsTy, uint8_t rhsTy, int resultReg, IrOp lhs, IrOp rhs, HostMetamethod method, int pcpos);
using HostUserdataNamecallHandler = bool (*)(
IrBuilder& builder,
uint8_t type,
const char* member,
size_t memberLength,
int argResReg,
int sourceReg,
int params,
int results,
int pcpos
);
struct HostIrHooks
{
HostVectorOperationBytecodeType vectorAccessBytecodeType = nullptr;
HostVectorOperationBytecodeType vectorNamecallBytecodeType = nullptr;
HostVectorAccessHandler vectorAccess = nullptr;
HostVectorNamecallHandler vectorNamecall = nullptr;
HostUserdataOperationBytecodeType userdataAccessBytecodeType = nullptr;
HostUserdataMetamethodBytecodeType userdataMetamethodBytecodeType = nullptr;
HostUserdataOperationBytecodeType userdataNamecallBytecodeType = nullptr;
HostUserdataAccessHandler userdataAccess = nullptr;
HostUserdataMetamethodHandler userdataMetamethod = nullptr;
HostUserdataNamecallHandler userdataNamecall = nullptr;
};
struct CompilationOptions
{
unsigned int flags = 0;
HostIrHooks hooks;
const char* const* userdataTypes = nullptr;
bool recordCounters = false;
};
using AnnotatorFn = void (*)(void* context, std::string& result, int fid, int instpos);
enum class IncludeIrPrefix
{
No,
Yes
};
enum class IncludeUseInfo
{
No,
Yes
};
enum class IncludeCfgInfo
{
No,
Yes
};
enum class IncludeRegFlowInfo
{
No,
Yes
};
struct AssemblyOptions
{
enum Target
{
Host,
A64,
A64_NoFeatures,
X64_Windows,
X64_SystemV,
};
Target target = Host;
CompilationOptions compilationOptions;
bool outputBinary = false;
bool includeAssembly = false;
bool includeIr = false;
bool includeOutlinedCode = false;
bool includeIrTypes = false;
IncludeIrPrefix includeIrPrefix = IncludeIrPrefix::Yes;
IncludeUseInfo includeUseInfo = IncludeUseInfo::Yes;
IncludeCfgInfo includeCfgInfo = IncludeCfgInfo::Yes;
IncludeRegFlowInfo includeRegFlowInfo = IncludeRegFlowInfo::Yes;
AnnotatorFn annotator = nullptr;
void* annotatorContext = nullptr;
};
}
}