aicasm_symbol.h revision 39220
123925Sgibbs/* 223925Sgibbs * Aic7xxx SCSI host adapter firmware asssembler symbol table definitions 323925Sgibbs * 423925Sgibbs * Copyright (c) 1997 Justin T. Gibbs. 523925Sgibbs * All rights reserved. 623925Sgibbs * 723925Sgibbs * Redistribution and use in source and binary forms, with or without 823925Sgibbs * modification, are permitted provided that the following conditions 923925Sgibbs * are met: 1023925Sgibbs * 1. Redistributions of source code must retain the above copyright 1126997Sgibbs * notice, this list of conditions, and the following disclaimer, 1226997Sgibbs * without modification, immediately at the beginning of the file. 1339220Sgibbs * 2. The name of the author may not be used to endorse or promote products 1423925Sgibbs * derived from this software without specific prior written permission. 1523925Sgibbs * 1623925Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1723925Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1823925Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1923925Sgibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 2023925Sgibbs * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2123925Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2223925Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2323925Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2423925Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2523925Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2623925Sgibbs * SUCH DAMAGE. 2723925Sgibbs * 2839220Sgibbs * $Id: aicasm_symbol.h,v 1.3 1997/09/27 19:37:30 gibbs Exp $ 2923925Sgibbs */ 3023925Sgibbs 3123925Sgibbs#include <sys/queue.h> 3223925Sgibbs 3323925Sgibbstypedef enum { 3423925Sgibbs UNINITIALIZED, 3523925Sgibbs REGISTER, 3623925Sgibbs ALIAS, 3723925Sgibbs SCBLOC, 3823925Sgibbs SRAMLOC, 3923925Sgibbs MASK, 4023925Sgibbs BIT, 4123925Sgibbs CONST, 4229897Sgibbs DOWNLOAD_CONST, 4323925Sgibbs LABEL, 4423925Sgibbs CONDITIONAL 4523925Sgibbs}symtype; 4623925Sgibbs 4723925Sgibbstypedef enum { 4823925Sgibbs RO = 0x01, 4923925Sgibbs WO = 0x02, 5023925Sgibbs RW = 0x03 5123925Sgibbs}amode_t; 5223925Sgibbs 5323925Sgibbsstruct reg_info { 5423925Sgibbs u_int8_t address; 5523925Sgibbs int size; 5623925Sgibbs amode_t mode; 5723925Sgibbs u_int8_t valid_bitmask; 5823925Sgibbs int typecheck_masks; 5923925Sgibbs}; 6023925Sgibbs 6123925Sgibbstypedef SLIST_HEAD(symlist, symbol_node) symlist_t; 6223925Sgibbs 6323925Sgibbsstruct mask_info { 6423925Sgibbs symlist_t symrefs; 6523925Sgibbs u_int8_t mask; 6623925Sgibbs}; 6723925Sgibbs 6823925Sgibbsstruct const_info { 6923925Sgibbs u_int8_t value; 7023925Sgibbs int define; 7123925Sgibbs}; 7223925Sgibbs 7323925Sgibbsstruct alias_info { 7423925Sgibbs struct symbol *parent; 7523925Sgibbs}; 7623925Sgibbs 7723925Sgibbsstruct label_info { 7823925Sgibbs int address; 7923925Sgibbs}; 8023925Sgibbs 8123925Sgibbsstruct cond_info { 8239220Sgibbs int func_num; 8323925Sgibbs}; 8423925Sgibbs 8523925Sgibbstypedef struct expression_info { 8623925Sgibbs symlist_t referenced_syms; 8723925Sgibbs int value; 8823925Sgibbs} expression_t; 8923925Sgibbs 9023925Sgibbstypedef struct symbol { 9123925Sgibbs char *name; 9223925Sgibbs symtype type; 9323925Sgibbs union { 9423925Sgibbs struct reg_info *rinfo; 9523925Sgibbs struct mask_info *minfo; 9623925Sgibbs struct const_info *cinfo; 9723925Sgibbs struct alias_info *ainfo; 9823925Sgibbs struct label_info *linfo; 9923925Sgibbs struct cond_info *condinfo; 10023925Sgibbs }info; 10123925Sgibbs} symbol_t; 10223925Sgibbs 10323925Sgibbstypedef struct symbol_ref { 10423925Sgibbs symbol_t *symbol; 10523925Sgibbs int offset; 10623925Sgibbs} symbol_ref_t; 10723925Sgibbs 10823925Sgibbstypedef struct symbol_node { 10923925Sgibbs SLIST_ENTRY(symbol_node) links; 11023925Sgibbs symbol_t *symbol; 11123925Sgibbs}symbol_node_t; 11223925Sgibbs 11339220Sgibbstypedef enum { 11439220Sgibbs SCOPE_ROOT, 11539220Sgibbs SCOPE_IF, 11639220Sgibbs SCOPE_ELSE_IF, 11739220Sgibbs SCOPE_ELSE 11839220Sgibbs} scope_type; 11923925Sgibbs 12039220Sgibbstypedef struct patch_info { 12139220Sgibbs int skip_patch; 12239220Sgibbs int skip_instr; 12339220Sgibbs} patch_info_t; 12439220Sgibbs 12539220Sgibbstypedef struct scope { 12639220Sgibbs SLIST_ENTRY(scope) scope_stack_links; 12739220Sgibbs TAILQ_ENTRY(scope) scope_links; 12839220Sgibbs TAILQ_HEAD(, scope) inner_scope; 12939220Sgibbs scope_type type; 13039220Sgibbs int inner_scope_patches; 13139220Sgibbs int begin_addr; 13239220Sgibbs int end_addr; 13339220Sgibbs patch_info_t patches[2]; 13439220Sgibbs int func_num; 13539220Sgibbs} scope_t; 13639220Sgibbs 13739220SgibbsSLIST_HEAD(scope_list, scope); 13839220SgibbsTAILQ_HEAD(scope_tailq, scope); 13939220Sgibbs 14023925Sgibbsvoid symbol_delete __P((symbol_t *symbol)); 14123925Sgibbs 14223925Sgibbsvoid symtable_open __P((void)); 14323925Sgibbs 14423925Sgibbsvoid symtable_close __P((void)); 14523925Sgibbs 14623925Sgibbssymbol_t * 14723925Sgibbs symtable_get __P((char *name)); 14823925Sgibbs 14923925Sgibbssymbol_node_t * 15023925Sgibbs symlist_search __P((symlist_t *symlist, char *symname)); 15123925Sgibbs 15223925Sgibbsvoid 15323925Sgibbs symlist_add __P((symlist_t *symlist, symbol_t *symbol, int how)); 15423925Sgibbs#define SYMLIST_INSERT_HEAD 0x00 15523925Sgibbs#define SYMLIST_SORT 0x01 15623925Sgibbs 15723925Sgibbsvoid symlist_free __P((symlist_t *symlist)); 15823925Sgibbs 15923925Sgibbsvoid symlist_merge __P((symlist_t *symlist_dest, symlist_t *symlist_src1, 16023925Sgibbs symlist_t *symlist_src2)); 16123925Sgibbsvoid symtable_dump __P((FILE *ofile)); 162