1 /* $NetBSD: aicasm_symbol.h,v 1.1 2000/03/15 02:09:15 fvdl Exp $ */ 2 3 /* 4 * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions 5 * 6 * Copyright (c) 1997 Justin T. Gibbs. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions, and the following disclaimer, 14 * without modification. 15 * 2. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * $FreeBSD: src/sys/dev/aic7xxx/aicasm_symbol.h,v 1.6 1999/12/06 18:23:31 gibbs Exp $ 31 */ 32 33 #include <sys/queue.h> 34 35 typedef enum { 36 UNINITIALIZED, 37 REGISTER, 38 ALIAS, 39 SCBLOC, 40 SRAMLOC, 41 MASK, 42 BIT, 43 CONST, 44 DOWNLOAD_CONST, 45 LABEL, 46 CONDITIONAL 47 }symtype; 48 49 typedef enum { 50 RO = 0x01, 51 WO = 0x02, 52 RW = 0x03 53 }amode_t; 54 55 struct reg_info { 56 u_int8_t address; 57 int size; 58 amode_t mode; 59 u_int8_t valid_bitmask; 60 int typecheck_masks; 61 }; 62 63 typedef SLIST_HEAD(symlist, symbol_node) symlist_t; 64 65 struct mask_info { 66 symlist_t symrefs; 67 u_int8_t mask; 68 }; 69 70 struct const_info { 71 u_int8_t value; 72 int define; 73 }; 74 75 struct alias_info { 76 struct symbol *parent; 77 }; 78 79 struct label_info { 80 int address; 81 }; 82 83 struct cond_info { 84 int func_num; 85 }; 86 87 typedef struct expression_info { 88 symlist_t referenced_syms; 89 int value; 90 } expression_t; 91 92 typedef struct symbol { 93 char *name; 94 symtype type; 95 union { 96 struct reg_info *rinfo; 97 struct mask_info *minfo; 98 struct const_info *cinfo; 99 struct alias_info *ainfo; 100 struct label_info *linfo; 101 struct cond_info *condinfo; 102 }info; 103 } symbol_t; 104 105 typedef struct symbol_ref { 106 symbol_t *symbol; 107 int offset; 108 } symbol_ref_t; 109 110 typedef struct symbol_node { 111 SLIST_ENTRY(symbol_node) links; 112 symbol_t *symbol; 113 }symbol_node_t; 114 115 typedef enum { 116 SCOPE_ROOT, 117 SCOPE_IF, 118 SCOPE_ELSE_IF, 119 SCOPE_ELSE 120 } scope_type; 121 122 typedef struct patch_info { 123 int skip_patch; 124 int skip_instr; 125 } patch_info_t; 126 127 typedef struct scope { 128 SLIST_ENTRY(scope) scope_stack_links; 129 TAILQ_ENTRY(scope) scope_links; 130 TAILQ_HEAD(, scope) inner_scope; 131 scope_type type; 132 int inner_scope_patches; 133 int begin_addr; 134 int end_addr; 135 patch_info_t patches[2]; 136 int func_num; 137 } scope_t; 138 139 SLIST_HEAD(scope_list, scope); 140 TAILQ_HEAD(scope_tailq, scope); 141 142 void symbol_delete __P((symbol_t *symbol)); 143 144 void symtable_open __P((void)); 145 146 void symtable_close __P((void)); 147 148 symbol_t * 149 symtable_get __P((char *name)); 150 151 symbol_node_t * 152 symlist_search __P((symlist_t *symlist, char *symname)); 153 154 void 155 symlist_add __P((symlist_t *symlist, symbol_t *symbol, int how)); 156 #define SYMLIST_INSERT_HEAD 0x00 157 #define SYMLIST_SORT 0x01 158 159 void symlist_free __P((symlist_t *symlist)); 160 161 void symlist_merge __P((symlist_t *symlist_dest, symlist_t *symlist_src1, 162 symlist_t *symlist_src2)); 163 void symtable_dump __P((FILE *ofile)); 164