aicasm_symbol.h revision 50477
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 *
2850477Speter * $FreeBSD: head/sys/dev/aic7xxx/aicasm/aicasm_symbol.h 50477 1999-08-28 01:08:13Z peter $
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