libyasm

libyasm/arch.h

Go to the documentation of this file.
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