2009-12-08 18:46:35 +00:00
|
|
|
/*
|
|
|
|
** LuaJIT VM builder.
|
|
|
|
** Copyright (C) 2005-2009 Mike Pall. See Copyright Notice in luajit.h
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _BUILDVM_H
|
|
|
|
#define _BUILDVM_H
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
#include "lj_def.h"
|
|
|
|
#include "lj_arch.h"
|
|
|
|
|
|
|
|
/* Hardcoded limits. Increase as needed. */
|
|
|
|
#define BUILD_MAX_RELOC 100 /* Max. number of relocations. */
|
|
|
|
#define BUILD_MAX_FOLD 4096 /* Max. number of fold rules. */
|
|
|
|
|
|
|
|
/* Prefix for scanned library definitions. */
|
|
|
|
#define LIBDEF_PREFIX "LJLIB_"
|
|
|
|
|
|
|
|
/* Prefix for scanned fold definitions. */
|
|
|
|
#define FOLDDEF_PREFIX "LJFOLD"
|
|
|
|
|
|
|
|
/* Prefixes for generated labels. */
|
|
|
|
#define LABEL_PREFIX "lj_"
|
|
|
|
#define LABEL_PREFIX_BC LABEL_PREFIX "BC_"
|
|
|
|
#define LABEL_PREFIX_FF LABEL_PREFIX "ff_"
|
|
|
|
#define LABEL_PREFIX_CF LABEL_PREFIX "cf_"
|
|
|
|
#define LABEL_PREFIX_FFH LABEL_PREFIX "ffh_"
|
|
|
|
#define LABEL_PREFIX_LIBCF LABEL_PREFIX "lib_cf_"
|
|
|
|
#define LABEL_PREFIX_LIBINIT LABEL_PREFIX "lib_init_"
|
|
|
|
|
|
|
|
/* Extra labels. */
|
|
|
|
#define LABEL_ASM_BEGIN LABEL_PREFIX "vm_asm_begin"
|
|
|
|
#define LABEL_OP_OFS LABEL_PREFIX "vm_op_ofs"
|
|
|
|
|
|
|
|
/* Forward declaration. */
|
|
|
|
struct dasm_State;
|
|
|
|
|
|
|
|
/* Build modes. */
|
|
|
|
#if LJ_TARGET_X86ORX64
|
|
|
|
#define BUILDDEFX(_) _(peobj)
|
|
|
|
#else
|
|
|
|
#define BUILDDEFX(_)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define BUILDDEF(_) \
|
|
|
|
_(asm) _(elfasm) _(coffasm) _(machasm) BUILDDEFX(_) _(raw) \
|
|
|
|
_(ffdef) _(libdef) _(recdef) _(vmdef) \
|
|
|
|
_(folddef)
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
#define BUILDENUM(name) BUILD_##name,
|
|
|
|
BUILDDEF(BUILDENUM)
|
|
|
|
#undef BUILDENUM
|
|
|
|
BUILD__MAX
|
|
|
|
} BuildMode;
|
|
|
|
|
|
|
|
/* Code relocation. */
|
|
|
|
typedef struct BuildReloc {
|
|
|
|
int32_t ofs;
|
|
|
|
int sym;
|
|
|
|
int type;
|
|
|
|
} BuildReloc;
|
|
|
|
|
|
|
|
/* Build context structure. */
|
|
|
|
typedef struct BuildCtx {
|
|
|
|
/* DynASM state pointer. Should be first member. */
|
|
|
|
struct dasm_State *D;
|
|
|
|
/* Parsed command line. */
|
|
|
|
BuildMode mode;
|
|
|
|
FILE *fp;
|
|
|
|
const char *outname;
|
|
|
|
char **args;
|
|
|
|
/* Code and symbols generated by DynASM. */
|
|
|
|
uint8_t *code;
|
|
|
|
size_t codesz;
|
|
|
|
int npc, nglob, nsym, nreloc;
|
|
|
|
void **glob;
|
|
|
|
int *perm;
|
|
|
|
int32_t *sym_ofs;
|
|
|
|
/* Strings generated by DynASM. */
|
|
|
|
const char *const *extnames;
|
|
|
|
const char *const *globnames;
|
|
|
|
const char *dasm_ident;
|
|
|
|
const char *dasm_arch;
|
|
|
|
/* Relocations. */
|
|
|
|
BuildReloc reloc[BUILD_MAX_RELOC];
|
|
|
|
} BuildCtx;
|
|
|
|
|
|
|
|
extern void owrite(BuildCtx *ctx, const void *ptr, size_t sz);
|
|
|
|
extern void emit_asm(BuildCtx *ctx);
|
|
|
|
extern void emit_peobj(BuildCtx *ctx);
|
|
|
|
extern void emit_lib(BuildCtx *ctx);
|
|
|
|
extern void emit_fold(BuildCtx *ctx);
|
|
|
|
|
|
|
|
extern const char *const bc_names[];
|
|
|
|
extern const char *const ir_names[];
|
|
|
|
extern const char *const irfpm_names[];
|
|
|
|
extern const char *const irfield_names[];
|
2009-12-08 19:35:29 +00:00
|
|
|
extern const char *const ircall_names[];
|
2009-12-08 18:46:35 +00:00
|
|
|
|
|
|
|
#endif
|