⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aicasm_symbol.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
voidaic_print_include(FILE *dfile, char *include_file){	if (dfile == NULL)		return;	fprintf(dfile, "\n#include \"%s\"\n\n", include_file);}voidaic_print_reg_dump_types(FILE *ofile){	if (ofile == NULL)		return;			fprintf(ofile,"typedef int (%sreg_print_t)(u_int, u_int *, u_int);\n""typedef struct %sreg_parse_entry {\n""	char	*name;\n""	uint8_t	 value;\n""	uint8_t	 mask;\n""} %sreg_parse_entry_t;\n""\n",		prefix, prefix, prefix);}static voidaic_print_reg_dump_start(FILE *dfile, symbol_node_t *regnode){	if (dfile == NULL)		return;	fprintf(dfile,"static %sreg_parse_entry_t %s_parse_table[] = {\n",		prefix,		regnode->symbol->name);}static voidaic_print_reg_dump_end(FILE *ofile, FILE *dfile,		       symbol_node_t *regnode, u_int num_entries){	char *lower_name;	char *letter;	lower_name = strdup(regnode->symbol->name);	if (lower_name == NULL)		 stop("Unable to strdup symbol name", EX_SOFTWARE);		for (letter = lower_name; *letter != '\0'; letter++)		*letter = tolower(*letter);	if (dfile != NULL) {		if (num_entries != 0)			fprintf(dfile,"\n""};\n""\n");		fprintf(dfile,"int\n""%s%s_print(u_int regvalue, u_int *cur_col, u_int wrap)\n""{\n""	return (%sprint_register(%s%s, %d, \"%s\",\n""	    0x%02x, regvalue, cur_col, wrap));\n""}\n""\n",			prefix,			lower_name,			prefix,			num_entries != 0 ? regnode->symbol->name : "NULL",			num_entries != 0 ? "_parse_table" : "",			num_entries,			regnode->symbol->name,			regnode->symbol->info.rinfo->address);	}	fprintf(ofile,"#if AIC_DEBUG_REGISTERS\n""%sreg_print_t %s%s_print;\n""#else\n""#define %s%s_print(regvalue, cur_col, wrap) \\\n""    %sprint_register(NULL, 0, \"%s\", 0x%02x, regvalue, cur_col, wrap)\n""#endif\n""\n",		prefix,		prefix,		lower_name,		prefix,		lower_name,		prefix,		regnode->symbol->name,		regnode->symbol->info.rinfo->address);}static voidaic_print_reg_dump_entry(FILE *dfile, symbol_node_t *curnode){	int num_tabs;	if (dfile == NULL)		return;	fprintf(dfile,"	{ \"%s\",",		curnode->symbol->name);	num_tabs = 3 - (strlen(curnode->symbol->name) + 5) / 8;	while (num_tabs-- > 0)		fputc('\t', dfile);	fprintf(dfile, "0x%02x, 0x%02x }",		curnode->symbol->info.finfo->value,		curnode->symbol->info.finfo->mask);}voidsymtable_dump(FILE *ofile, FILE *dfile){	/*	 * Sort the registers by address with a simple insertion sort.	 * Put bitmasks next to the first register that defines them.	 * Put constants at the end.	 */	symlist_t	 registers;	symlist_t	 masks;	symlist_t	 constants;	symlist_t	 download_constants;	symlist_t	 aliases;	symlist_t	 exported_labels;	symbol_node_t	*curnode;	symbol_node_t	*regnode;	DBT		 key;	DBT		 data;	int		 flag;	u_int		 i;	if (symtable == NULL)		return;	SLIST_INIT(&registers);	SLIST_INIT(&masks);	SLIST_INIT(&constants);	SLIST_INIT(&download_constants);	SLIST_INIT(&aliases);	SLIST_INIT(&exported_labels);	flag = R_FIRST;	while (symtable->seq(symtable, &key, &data, flag) == 0) {		symbol_t *cursym;		memcpy(&cursym, data.data, sizeof(cursym));		switch(cursym->type) {		case REGISTER:		case SCBLOC:		case SRAMLOC:			symlist_add(&registers, cursym, SYMLIST_SORT);			break;		case MASK:		case FIELD:		case ENUM:		case ENUM_ENTRY:			symlist_add(&masks, cursym, SYMLIST_SORT);			break;		case CONST:			symlist_add(&constants, cursym,				    SYMLIST_INSERT_HEAD);			break;		case DOWNLOAD_CONST:			symlist_add(&download_constants, cursym,				    SYMLIST_INSERT_HEAD);			break;		case ALIAS:			symlist_add(&aliases, cursym,				    SYMLIST_INSERT_HEAD);			break;		case LABEL:			if (cursym->info.linfo->exported == 0)				break;			symlist_add(&exported_labels, cursym,				    SYMLIST_INSERT_HEAD);			break;		default:			break;		}		flag = R_NEXT;	}	/* Register dianostic functions/declarations first. */	aic_print_file_prologue(ofile);	aic_print_reg_dump_types(ofile);	aic_print_file_prologue(dfile);	aic_print_include(dfile, stock_include_file);	SLIST_FOREACH(curnode, &registers, links) {		switch(curnode->symbol->type) {		case REGISTER:		case SCBLOC:		case SRAMLOC:		{			symlist_t	*fields;			symbol_node_t	*fieldnode;			int		 num_entries;			num_entries = 0;			fields = &curnode->symbol->info.rinfo->fields;			SLIST_FOREACH(fieldnode, fields, links) {				if (num_entries == 0)					aic_print_reg_dump_start(dfile,								 curnode);				else if (dfile != NULL)					fputs(",\n", dfile);				num_entries++;				aic_print_reg_dump_entry(dfile, fieldnode);			}			aic_print_reg_dump_end(ofile, dfile,					       curnode, num_entries);		}		default:			break;		}	}	/* Fold in the masks and bits */	while (SLIST_FIRST(&masks) != NULL) {		char *regname;		curnode = SLIST_FIRST(&masks);		SLIST_REMOVE_HEAD(&masks, links);		regnode = SLIST_FIRST(&curnode->symbol->info.finfo->symrefs);		regname = regnode->symbol->name;		regnode = symlist_search(&registers, regname);		SLIST_INSERT_AFTER(regnode, curnode, links);	}	/* Add the aliases */	while (SLIST_FIRST(&aliases) != NULL) {		char *regname;		curnode = SLIST_FIRST(&aliases);		SLIST_REMOVE_HEAD(&aliases, links);		regname = curnode->symbol->info.ainfo->parent->name;		regnode = symlist_search(&registers, regname);		SLIST_INSERT_AFTER(regnode, curnode, links);	}	/* Output generated #defines. */	while (SLIST_FIRST(&registers) != NULL) {		symbol_node_t *curnode;		u_int value;		char *tab_str;		char *tab_str2;		curnode = SLIST_FIRST(&registers);		SLIST_REMOVE_HEAD(&registers, links);		switch(curnode->symbol->type) {		case REGISTER:		case SCBLOC:		case SRAMLOC:			fprintf(ofile, "\n");			value = curnode->symbol->info.rinfo->address;			tab_str = "\t";			tab_str2 = "\t\t";			break;		case ALIAS:		{			symbol_t *parent;			parent = curnode->symbol->info.ainfo->parent;			value = parent->info.rinfo->address;			tab_str = "\t";			tab_str2 = "\t\t";			break;		}		case MASK:		case FIELD:		case ENUM:		case ENUM_ENTRY:			value = curnode->symbol->info.finfo->value;			tab_str = "\t\t";			tab_str2 = "\t";			break;		default:			value = 0; /* Quiet compiler */			tab_str = NULL;			tab_str2 = NULL;			stop("symtable_dump: Invalid symbol type "			     "encountered", EX_SOFTWARE);			break;		}		fprintf(ofile, "#define%s%-16s%s0x%02x\n",			tab_str, curnode->symbol->name, tab_str2,			value);		free(curnode);	}	fprintf(ofile, "\n\n");	while (SLIST_FIRST(&constants) != NULL) {		symbol_node_t *curnode;		curnode = SLIST_FIRST(&constants);		SLIST_REMOVE_HEAD(&constants, links);		fprintf(ofile, "#define\t%-8s\t0x%02x\n",			curnode->symbol->name,			curnode->symbol->info.cinfo->value);		free(curnode);	}		fprintf(ofile, "\n\n/* Downloaded Constant Definitions */\n");	for (i = 0; SLIST_FIRST(&download_constants) != NULL; i++) {		symbol_node_t *curnode;		curnode = SLIST_FIRST(&download_constants);		SLIST_REMOVE_HEAD(&download_constants, links);		fprintf(ofile, "#define\t%-8s\t0x%02x\n",			curnode->symbol->name,			curnode->symbol->info.cinfo->value);		free(curnode);	}	fprintf(ofile, "#define\tDOWNLOAD_CONST_COUNT\t0x%02x\n", i);	fprintf(ofile, "\n\n/* Exported Labels */\n");	while (SLIST_FIRST(&exported_labels) != NULL) {		symbol_node_t *curnode;		curnode = SLIST_FIRST(&exported_labels);		SLIST_REMOVE_HEAD(&exported_labels, links);		fprintf(ofile, "#define\tLABEL_%-8s\t0x%02x\n",			curnode->symbol->name,			curnode->symbol->info.linfo->address);		free(curnode);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -