00001
00034 #ifndef YASM_ARCH_H
00035 #define YASM_ARCH_H
00036
00038 typedef enum yasm_arch_create_error {
00039 YASM_ARCH_CREATE_OK = 0,
00040 YASM_ARCH_CREATE_BAD_MACHINE,
00041 YASM_ARCH_CREATE_BAD_PARSER
00042 } yasm_arch_create_error;
00043
00045 typedef enum yasm_arch_insnprefix {
00046 YASM_ARCH_NOTINSNPREFIX = 0,
00047 YASM_ARCH_INSN,
00048 YASM_ARCH_PREFIX
00049 } yasm_arch_insnprefix;
00050
00054 typedef enum yasm_arch_regtmod {
00055 YASM_ARCH_NOTREGTMOD = 0,
00056 YASM_ARCH_REG,
00057 YASM_ARCH_REGGROUP,
00058 YASM_ARCH_SEGREG,
00059 YASM_ARCH_TARGETMOD
00060 } yasm_arch_regtmod;
00061
00062 #ifndef YASM_DOXYGEN
00063
00066 typedef struct yasm_arch_base {
00068 const struct yasm_arch_module *module;
00069 } yasm_arch_base;
00070 #endif
00071
00078 typedef struct yasm_arch_machine {
00080 const char *name;
00081
00083 const char *keyword;
00084 } yasm_arch_machine;
00085
00092 typedef struct yasm_arch_module {
00096 const char *name;
00097
00101 const char *keyword;
00102
00104 const yasm_directive *directives;
00105
00110 yasm_arch * (*create) (const char *machine, const char *parser,
00111 yasm_arch_create_error *error);
00112
00116 void (*destroy) ( yasm_arch *arch);
00117
00121 const char * (*get_machine) (const yasm_arch *arch);
00122
00126 unsigned int (*get_address_size) (const yasm_arch *arch);
00127
00131 int (*set_var) (yasm_arch *arch, const char *var, unsigned long val);
00132
00136 yasm_arch_insnprefix (*parse_check_insnprefix)
00137 (yasm_arch *arch, const char *id, size_t id_len, unsigned long line,
00138 yasm_bytecode **bc, uintptr_t *prefix);
00139
00143 yasm_arch_regtmod (*parse_check_regtmod)
00144 (yasm_arch *arch, const char *id, size_t id_len,
00145 uintptr_t *data);
00146
00150 const unsigned char ** (*get_fill) (const yasm_arch *arch);
00151
00155 int (*floatnum_tobytes) (yasm_arch *arch, const yasm_floatnum *flt,
00156 unsigned char *buf, size_t destsize,
00157 size_t valsize, size_t shift, int warn);
00158
00162 int (*intnum_tobytes) (yasm_arch *arch, const yasm_intnum *intn,
00163 unsigned char *buf, size_t destsize, size_t valsize,
00164 int shift, const yasm_bytecode *bc,
00165 int warn);
00166
00170 unsigned int (*get_reg_size) (yasm_arch *arch, uintptr_t reg);
00171
00175 uintptr_t (*reggroup_get_reg) (yasm_arch *arch, uintptr_t reggroup,
00176 unsigned long regindex);
00177
00181 void (*reg_print) (yasm_arch *arch, uintptr_t reg, FILE *f);
00182
00186 void (*segreg_print) (yasm_arch *arch, uintptr_t segreg, FILE *f);
00187
00191 yasm_effaddr * (*ea_create) (yasm_arch *arch, yasm_expr *e);
00192
00196 void (*ea_destroy) ( yasm_effaddr *ea);
00197
00201 void (*ea_print) (const yasm_effaddr *ea, FILE *f, int indent_level);
00202
00206 yasm_bytecode * (*create_empty_insn) (yasm_arch *arch,
00207 unsigned long line);
00208
00213 const yasm_arch_machine *machines;
00214
00219 const char *default_machine_keyword;
00220
00225 unsigned int wordsize;
00226
00231 unsigned int min_insn_len;
00232 } yasm_arch_module;
00233
00238 const char *yasm_arch_name(const yasm_arch *arch);
00239
00244 const char *yasm_arch_keyword(const yasm_arch *arch);
00245
00250 unsigned int yasm_arch_wordsize(const yasm_arch *arch);
00251
00256 unsigned int yasm_arch_min_insn_len(const yasm_arch *arch);
00257
00267 yasm_arch *yasm_arch_create(const yasm_arch_module *module,
00268 const char *machine, const char *parser,
00269 yasm_arch_create_error *error);
00270
00274 void yasm_arch_destroy( yasm_arch *arch);
00275
00280 const char *yasm_arch_get_machine(const yasm_arch *arch);
00281
00286 unsigned int yasm_arch_get_address_size(const yasm_arch *arch);
00287
00294 int yasm_arch_set_var(yasm_arch *arch, const char *var, unsigned long val);
00295
00311 yasm_arch_insnprefix yasm_arch_parse_check_insnprefix
00312 (yasm_arch *arch, const char *id, size_t id_len, unsigned long line,
00313 yasm_bytecode **bc, uintptr_t *prefix);
00314
00327 yasm_arch_regtmod yasm_arch_parse_check_regtmod
00328 (yasm_arch *arch, const char *id, size_t id_len,
00329 uintptr_t *data);
00330
00336 const unsigned char **yasm_arch_get_fill(const yasm_arch *arch);
00337
00352 int yasm_arch_floatnum_tobytes(yasm_arch *arch, const yasm_floatnum *flt,
00353 unsigned char *buf, size_t destsize,
00354 size_t valsize, size_t shift, int warn);
00355
00372 int yasm_arch_intnum_tobytes(yasm_arch *arch, const yasm_intnum *intn,
00373 unsigned char *buf, size_t destsize,
00374 size_t valsize, int shift,
00375 const yasm_bytecode *bc, int warn);
00376
00382 unsigned int yasm_arch_get_reg_size(yasm_arch *arch, uintptr_t reg);
00383
00392 uintptr_t yasm_arch_reggroup_get_reg(yasm_arch *arch, uintptr_t reggroup,
00393 unsigned long regindex);
00394
00400 void yasm_arch_reg_print(yasm_arch *arch, uintptr_t reg, FILE *f);
00401
00407 void yasm_arch_segreg_print(yasm_arch *arch, uintptr_t segreg, FILE *f);
00408
00414 yasm_effaddr *yasm_arch_ea_create(yasm_arch *arch, yasm_expr *e);
00415
00420 void yasm_arch_ea_destroy(yasm_arch *arch, yasm_effaddr *ea);
00421
00428 void yasm_arch_ea_print(const yasm_arch *arch, const yasm_effaddr *ea,
00429 FILE *f, int indent_level);
00430
00437 yasm_bytecode *yasm_arch_create_empty_insn(yasm_arch *arch,
00438 unsigned long line);
00439
00440 #ifndef YASM_DOXYGEN
00441
00442
00443
00444 #define yasm_arch_name(arch) \
00445 (((yasm_arch_base *)arch)->module->name)
00446 #define yasm_arch_keyword(arch) \
00447 (((yasm_arch_base *)arch)->module->keyword)
00448 #define yasm_arch_wordsize(arch) \
00449 (((yasm_arch_base *)arch)->module->wordsize)
00450 #define yasm_arch_min_insn_len(arch) \
00451 (((yasm_arch_base *)arch)->module->min_insn_len)
00452
00453 #define yasm_arch_create(module, machine, parser, error) \
00454 module->create(machine, parser, error)
00455
00456 #define yasm_arch_destroy(arch) \
00457 ((yasm_arch_base *)arch)->module->destroy(arch)
00458 #define yasm_arch_get_machine(arch) \
00459 ((yasm_arch_base *)arch)->module->get_machine(arch)
00460 #define yasm_arch_get_address_size(arch) \
00461 ((yasm_arch_base *)arch)->module->get_address_size(arch)
00462 #define yasm_arch_set_var(arch, var, val) \
00463 ((yasm_arch_base *)arch)->module->set_var(arch, var, val)
00464 #define yasm_arch_parse_check_insnprefix(arch, id, id_len, line, bc, prefix) \
00465 ((yasm_arch_base *)arch)->module->parse_check_insnprefix \
00466 (arch, id, id_len, line, bc, prefix)
00467 #define yasm_arch_parse_check_regtmod(arch, id, id_len, data) \
00468 ((yasm_arch_base *)arch)->module->parse_check_regtmod \
00469 (arch, id, id_len, data)
00470 #define yasm_arch_get_fill(arch) \
00471 ((yasm_arch_base *)arch)->module->get_fill(arch)
00472 #define yasm_arch_floatnum_tobytes(arch, flt, buf, destsize, valsize, shift, \
00473 warn) \
00474 ((yasm_arch_base *)arch)->module->floatnum_tobytes \
00475 (arch, flt, buf, destsize, valsize, shift, warn)
00476 #define yasm_arch_intnum_tobytes(arch, intn, buf, destsize, valsize, shift, \
00477 bc, warn) \
00478 ((yasm_arch_base *)arch)->module->intnum_tobytes \
00479 (arch, intn, buf, destsize, valsize, shift, bc, warn)
00480 #define yasm_arch_get_reg_size(arch, reg) \
00481 ((yasm_arch_base *)arch)->module->get_reg_size(arch, reg)
00482 #define yasm_arch_reggroup_get_reg(arch, regg, regi) \
00483 ((yasm_arch_base *)arch)->module->reggroup_get_reg(arch, regg, regi)
00484 #define yasm_arch_reg_print(arch, reg, f) \
00485 ((yasm_arch_base *)arch)->module->reg_print(arch, reg, f)
00486 #define yasm_arch_segreg_print(arch, segreg, f) \
00487 ((yasm_arch_base *)arch)->module->segreg_print(arch, segreg, f)
00488 #define yasm_arch_ea_create(arch, e) \
00489 ((yasm_arch_base *)arch)->module->ea_create(arch, e)
00490 #define yasm_arch_ea_destroy(arch, ea) \
00491 ((yasm_arch_base *)arch)->module->ea_destroy(ea)
00492 #define yasm_arch_ea_print(arch, ea, f, i) \
00493 ((yasm_arch_base *)arch)->module->ea_print(ea, f, i)
00494 #define yasm_arch_create_empty_insn(arch, line) \
00495 ((yasm_arch_base *)arch)->module->create_empty_insn(arch, line)
00496
00497 #endif
00498
00499 #endif