|
libyasm
|
00001 00030 #ifndef YASM_ARCH_H 00031 #define YASM_ARCH_H 00032 00034 typedef enum yasm_arch_create_error { 00035 YASM_ARCH_CREATE_OK = 0, 00036 YASM_ARCH_CREATE_BAD_MACHINE, 00037 YASM_ARCH_CREATE_BAD_PARSER 00038 } yasm_arch_create_error; 00039 00041 typedef enum yasm_arch_insnprefix { 00042 YASM_ARCH_NOTINSNPREFIX = 0, 00043 YASM_ARCH_INSN, 00044 YASM_ARCH_PREFIX 00045 } yasm_arch_insnprefix; 00046 00050 typedef enum yasm_arch_regtmod { 00051 YASM_ARCH_NOTREGTMOD = 0, 00052 YASM_ARCH_REG, 00053 YASM_ARCH_REGGROUP, 00054 YASM_ARCH_SEGREG, 00055 YASM_ARCH_TARGETMOD 00056 } yasm_arch_regtmod; 00057 00058 #ifndef YASM_DOXYGEN 00059 00062 typedef struct yasm_arch_base { 00064 const struct yasm_arch_module *module; 00065 } yasm_arch_base; 00066 #endif 00067 00074 typedef struct yasm_arch_machine { 00076 const char *name; 00077 00079 const char *keyword; 00080 } yasm_arch_machine; 00081 00088 typedef struct yasm_arch_module { 00092 const char *name; 00093 00097 const char *keyword; 00098 00100 /*@null@*/ const yasm_directive *directives; 00101 00106 /*@only@*/ yasm_arch * (*create) (const char *machine, const char *parser, 00107 /*@out@*/ yasm_arch_create_error *error); 00108 00112 void (*destroy) (/*@only@*/ yasm_arch *arch); 00113 00117 const char * (*get_machine) (const yasm_arch *arch); 00118 00122 unsigned int (*get_address_size) (const yasm_arch *arch); 00123 00127 int (*set_var) (yasm_arch *arch, const char *var, unsigned long val); 00128 00132 yasm_arch_insnprefix (*parse_check_insnprefix) 00133 (yasm_arch *arch, const char *id, size_t id_len, unsigned long line, 00134 /*@out@*/ /*@only@*/ yasm_bytecode **bc, /*@out@*/ uintptr_t *prefix); 00135 00139 yasm_arch_regtmod (*parse_check_regtmod) 00140 (yasm_arch *arch, const char *id, size_t id_len, 00141 /*@out@*/ uintptr_t *data); 00142 00146 const unsigned char ** (*get_fill) (const yasm_arch *arch); 00147 00151 int (*floatnum_tobytes) (yasm_arch *arch, const yasm_floatnum *flt, 00152 unsigned char *buf, size_t destsize, 00153 size_t valsize, size_t shift, int warn); 00154 00158 int (*intnum_tobytes) (yasm_arch *arch, const yasm_intnum *intn, 00159 unsigned char *buf, size_t destsize, size_t valsize, 00160 int shift, const yasm_bytecode *bc, 00161 int warn); 00162 00166 unsigned int (*get_reg_size) (yasm_arch *arch, uintptr_t reg); 00167 00171 uintptr_t (*reggroup_get_reg) (yasm_arch *arch, uintptr_t reggroup, 00172 unsigned long regindex); 00173 00177 void (*reg_print) (yasm_arch *arch, uintptr_t reg, FILE *f); 00178 00182 void (*segreg_print) (yasm_arch *arch, uintptr_t segreg, FILE *f); 00183 00187 yasm_effaddr * (*ea_create) (yasm_arch *arch, /*@keep@*/ yasm_expr *e); 00188 00192 void (*ea_destroy) (/*@only@*/ yasm_effaddr *ea); 00193 00197 void (*ea_print) (const yasm_effaddr *ea, FILE *f, int indent_level); 00198 00202 /*@only@*/ yasm_bytecode * (*create_empty_insn) (yasm_arch *arch, 00203 unsigned long line); 00204 00209 const yasm_arch_machine *machines; 00210 00215 const char *default_machine_keyword; 00216 00221 unsigned int wordsize; 00222 00227 unsigned int min_insn_len; 00228 } yasm_arch_module; 00229 00234 const char *yasm_arch_name(const yasm_arch *arch); 00235 00240 const char *yasm_arch_keyword(const yasm_arch *arch); 00241 00246 unsigned int yasm_arch_wordsize(const yasm_arch *arch); 00247 00252 unsigned int yasm_arch_min_insn_len(const yasm_arch *arch); 00253 00263 /*@only@*/ yasm_arch *yasm_arch_create(const yasm_arch_module *module, 00264 const char *machine, const char *parser, 00265 /*@out@*/ yasm_arch_create_error *error); 00266 00270 void yasm_arch_destroy(/*@only@*/ yasm_arch *arch); 00271 00276 const char *yasm_arch_get_machine(const yasm_arch *arch); 00277 00282 unsigned int yasm_arch_get_address_size(const yasm_arch *arch); 00283 00290 int yasm_arch_set_var(yasm_arch *arch, const char *var, unsigned long val); 00291 00307 yasm_arch_insnprefix yasm_arch_parse_check_insnprefix 00308 (yasm_arch *arch, const char *id, size_t id_len, unsigned long line, 00309 /*@out@*/ /*@only@*/ yasm_bytecode **bc, /*@out@*/ uintptr_t *prefix); 00310 00323 yasm_arch_regtmod yasm_arch_parse_check_regtmod 00324 (yasm_arch *arch, const char *id, size_t id_len, 00325 /*@out@*/ uintptr_t *data); 00326 00332 const unsigned char **yasm_arch_get_fill(const yasm_arch *arch); 00333 00348 int yasm_arch_floatnum_tobytes(yasm_arch *arch, const yasm_floatnum *flt, 00349 unsigned char *buf, size_t destsize, 00350 size_t valsize, size_t shift, int warn); 00351 00368 int yasm_arch_intnum_tobytes(yasm_arch *arch, const yasm_intnum *intn, 00369 unsigned char *buf, size_t destsize, 00370 size_t valsize, int shift, 00371 const yasm_bytecode *bc, int warn); 00372 00378 unsigned int yasm_arch_get_reg_size(yasm_arch *arch, uintptr_t reg); 00379 00388 uintptr_t yasm_arch_reggroup_get_reg(yasm_arch *arch, uintptr_t reggroup, 00389 unsigned long regindex); 00390 00396 void yasm_arch_reg_print(yasm_arch *arch, uintptr_t reg, FILE *f); 00397 00403 void yasm_arch_segreg_print(yasm_arch *arch, uintptr_t segreg, FILE *f); 00404 00410 yasm_effaddr *yasm_arch_ea_create(yasm_arch *arch, /*@keep@*/ yasm_expr *e); 00411 00416 void yasm_arch_ea_destroy(yasm_arch *arch, /*@only@*/ yasm_effaddr *ea); 00417 00424 void yasm_arch_ea_print(const yasm_arch *arch, const yasm_effaddr *ea, 00425 FILE *f, int indent_level); 00426 00433 /*@only@*/ yasm_bytecode *yasm_arch_create_empty_insn(yasm_arch *arch, 00434 unsigned long line); 00435 00436 #ifndef YASM_DOXYGEN 00437 00438 /* Inline macro implementations for arch functions */ 00439 00440 #define yasm_arch_name(arch) \ 00441 (((yasm_arch_base *)arch)->module->name) 00442 #define yasm_arch_keyword(arch) \ 00443 (((yasm_arch_base *)arch)->module->keyword) 00444 #define yasm_arch_wordsize(arch) \ 00445 (((yasm_arch_base *)arch)->module->wordsize) 00446 #define yasm_arch_min_insn_len(arch) \ 00447 (((yasm_arch_base *)arch)->module->min_insn_len) 00448 00449 #define yasm_arch_create(module, machine, parser, error) \ 00450 module->create(machine, parser, error) 00451 00452 #define yasm_arch_destroy(arch) \ 00453 ((yasm_arch_base *)arch)->module->destroy(arch) 00454 #define yasm_arch_get_machine(arch) \ 00455 ((yasm_arch_base *)arch)->module->get_machine(arch) 00456 #define yasm_arch_get_address_size(arch) \ 00457 ((yasm_arch_base *)arch)->module->get_address_size(arch) 00458 #define yasm_arch_set_var(arch, var, val) \ 00459 ((yasm_arch_base *)arch)->module->set_var(arch, var, val) 00460 #define yasm_arch_parse_check_insnprefix(arch, id, id_len, line, bc, prefix) \ 00461 ((yasm_arch_base *)arch)->module->parse_check_insnprefix \ 00462 (arch, id, id_len, line, bc, prefix) 00463 #define yasm_arch_parse_check_regtmod(arch, id, id_len, data) \ 00464 ((yasm_arch_base *)arch)->module->parse_check_regtmod \ 00465 (arch, id, id_len, data) 00466 #define yasm_arch_get_fill(arch) \ 00467 ((yasm_arch_base *)arch)->module->get_fill(arch) 00468 #define yasm_arch_floatnum_tobytes(arch, flt, buf, destsize, valsize, shift, \ 00469 warn) \ 00470 ((yasm_arch_base *)arch)->module->floatnum_tobytes \ 00471 (arch, flt, buf, destsize, valsize, shift, warn) 00472 #define yasm_arch_intnum_tobytes(arch, intn, buf, destsize, valsize, shift, \ 00473 bc, warn) \ 00474 ((yasm_arch_base *)arch)->module->intnum_tobytes \ 00475 (arch, intn, buf, destsize, valsize, shift, bc, warn) 00476 #define yasm_arch_get_reg_size(arch, reg) \ 00477 ((yasm_arch_base *)arch)->module->get_reg_size(arch, reg) 00478 #define yasm_arch_reggroup_get_reg(arch, regg, regi) \ 00479 ((yasm_arch_base *)arch)->module->reggroup_get_reg(arch, regg, regi) 00480 #define yasm_arch_reg_print(arch, reg, f) \ 00481 ((yasm_arch_base *)arch)->module->reg_print(arch, reg, f) 00482 #define yasm_arch_segreg_print(arch, segreg, f) \ 00483 ((yasm_arch_base *)arch)->module->segreg_print(arch, segreg, f) 00484 #define yasm_arch_ea_create(arch, e) \ 00485 ((yasm_arch_base *)arch)->module->ea_create(arch, e) 00486 #define yasm_arch_ea_destroy(arch, ea) \ 00487 ((yasm_arch_base *)arch)->module->ea_destroy(ea) 00488 #define yasm_arch_ea_print(arch, ea, f, i) \ 00489 ((yasm_arch_base *)arch)->module->ea_print(ea, f, i) 00490 #define yasm_arch_create_empty_insn(arch, line) \ 00491 ((yasm_arch_base *)arch)->module->create_empty_insn(arch, line) 00492 00493 #endif 00494 00495 #endif
1.7.3