diff options
author | gibbs <gibbs@FreeBSD.org> | 2001-07-18 21:03:32 +0000 |
---|---|---|
committer | gibbs <gibbs@FreeBSD.org> | 2001-07-18 21:03:32 +0000 |
commit | 42ab5fc8018c503f657d4badb2ba2ebe64f23768 (patch) | |
tree | ddd7fb60cb076b56748bdc3e8cf396bd354eebe8 | |
parent | 99b71dfa30b022850a80e470aee72b6362f8aa53 (diff) | |
download | FreeBSD-src-42ab5fc8018c503f657d4badb2ba2ebe64f23768.zip FreeBSD-src-42ab5fc8018c503f657d4badb2ba2ebe64f23768.tar.gz |
Add support for parsing version strings out of assembler source files
and outputing them in generated files.
Fixed a few other scanner bugs that for some reason didn't show up until
these modifications were made.
MFC after: 10 days
-rw-r--r-- | sys/dev/aic7xxx/aicasm/aicasm.c | 29 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aicasm/aicasm.h | 3 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aicasm/aicasm_gram.y | 48 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aicasm/aicasm_scan.l | 57 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aicasm/aicasm_symbol.c | 10 |
5 files changed, 111 insertions, 36 deletions
diff --git a/sys/dev/aic7xxx/aicasm/aicasm.c b/sys/dev/aic7xxx/aicasm/aicasm.c index 1402b3a..dfb3ef7 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm.c +++ b/sys/dev/aic7xxx/aicasm/aicasm.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm.c#6 $ + * $Id: //depot/src/aic7xxx/aicasm/aicasm.c#8 $ * * $FreeBSD$ */ @@ -180,7 +180,8 @@ main(int argc, char *argv[]) includes_search_curdir = 0; for (include_dir = SLIST_FIRST(&search_path); include_dir != NULL; - include_dir = SLIST_NEXT(include_dir, links)) + include_dir = SLIST_NEXT(include_dir, + links)) /* * All entries before a '-I-' only * apply to includes specified with @@ -276,9 +277,9 @@ back_patch() { struct instruction *cur_instr; - for(cur_instr = STAILQ_FIRST(&seq_program); - cur_instr != NULL; - cur_instr = STAILQ_NEXT(cur_instr, links)) { + for (cur_instr = STAILQ_FIRST(&seq_program); + cur_instr != NULL; + cur_instr = STAILQ_NEXT(cur_instr, links)) { if (cur_instr->patch_label != NULL) { struct ins_format3 *f3_instr; u_int address; @@ -312,13 +313,15 @@ output_code() instrcount = 0; fprintf(ofile, "/* - * DO NOT EDIT - This file is automatically generated. - */\n"); + * DO NOT EDIT - This file is automatically generated + * from the following source files: + * +%s */\n", versions); fprintf(ofile, "static uint8_t seqprog[] = {\n"); - for(cur_instr = STAILQ_FIRST(&seq_program); - cur_instr != NULL; - cur_instr = STAILQ_NEXT(cur_instr, links)) { + for (cur_instr = STAILQ_FIRST(&seq_program); + cur_instr != NULL; + cur_instr = STAILQ_NEXT(cur_instr, links)) { fprintf(ofile, "%s\t0x%02x, 0x%02x, 0x%02x, 0x%02x", cur_instr == STAILQ_FIRST(&seq_program) ? "" : ",\n", @@ -340,9 +343,9 @@ output_code() /* * Output patch information. Patch functions first. */ - for(cur_node = SLIST_FIRST(&patch_functions); - cur_node != NULL; - cur_node = SLIST_NEXT(cur_node,links)) { + for (cur_node = SLIST_FIRST(&patch_functions); + cur_node != NULL; + cur_node = SLIST_NEXT(cur_node,links)) { fprintf(ofile, "static int ahc_patch%d_func(struct ahc_softc *ahc); diff --git a/sys/dev/aic7xxx/aicasm/aicasm.h b/sys/dev/aic7xxx/aicasm/aicasm.h index 692dc04..361a9b2 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm.h +++ b/sys/dev/aic7xxx/aicasm/aicasm.h @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm.h#4 $ + * $Id: //depot/src/aic7xxx/aicasm/aicasm.h#5 $ * * $FreeBSD$ */ @@ -69,6 +69,7 @@ extern int includes_search_curdir; /* False if we've seen -I- */ extern char *appname; extern int yylineno; extern char *yyfilename; +extern char *versions; void stop(const char *errstring, int err_code); void include_file(char *file_name, include_type type); diff --git a/sys/dev/aic7xxx/aicasm/aicasm_gram.y b/sys/dev/aic7xxx/aicasm/aicasm_gram.y index 91425f3..f562e6e 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_gram.y +++ b/sys/dev/aic7xxx/aicasm/aicasm_gram.y @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_gram.y#6 $ + * $Id: //depot/src/aic7xxx/aicasm/aicasm_gram.y#7 $ * * $FreeBSD$ */ @@ -53,6 +53,7 @@ int yylineno; char *yyfilename; +char *versions; static symbol_t *cur_symbol; static symtype cur_symtype; static symbol_t *accumulator; @@ -79,6 +80,7 @@ static void test_writable_symbol(symbol_t *symbol); static void type_check(symbol_t *symbol, expression_t *expression, int and_op); static void make_expression(expression_t *immed, int value); static void add_conditional(symbol_t *symbol); +static void add_version(const char *verstring); static int is_download_const(expression_t *immed); #define YYDEBUG 1 @@ -124,11 +126,11 @@ static int is_download_const(expression_t *immed); %token <value> T_NUMBER -%token <str> T_PATH +%token <str> T_PATH T_STRING %token <sym> T_CEXPR -%token T_EOF T_INCLUDE +%token T_EOF T_INCLUDE T_VERSION %token <value> T_SHR T_SHL T_ROR T_ROL @@ -180,6 +182,8 @@ static int is_download_const(expression_t *immed); program: include | program include +| version +| program version | register | program register | constant @@ -202,9 +206,18 @@ program: include: T_INCLUDE '<' T_PATH '>' - { include_file($3, BRACKETED_INCLUDE); } + { + include_file($3, BRACKETED_INCLUDE); + } | T_INCLUDE '"' T_PATH '"' - { include_file($3, QUOTED_INCLUDE); } + { + include_file($3, QUOTED_INCLUDE); + } +; + +version: + T_VERSION '=' T_STRING + { add_version($3); } ; register: @@ -623,11 +636,6 @@ immediate_or_a: expression { $$ = $1; - if ($$.value == 0) { - stop("Immediate value of 0 not valid for opcode", - EX_DATAERR); - /* NOTREACHED */ - } } | T_A { @@ -1443,6 +1451,26 @@ add_conditional(symbol_t *symbol) symlist_add(&patch_functions, symbol, SYMLIST_INSERT_HEAD); } +static void +add_version(const char *verstring) +{ + const char prefix[] = " * "; + int newlen; + int oldlen; + + newlen = strlen(verstring) + strlen(prefix); + oldlen = 0; + if (versions != NULL) + oldlen = strlen(versions); + versions = realloc(versions, newlen + oldlen + 2); + if (versions == NULL) + stop("Can't allocate version string", EX_SOFTWARE); + strcpy(&versions[oldlen], prefix); + strcpy(&versions[oldlen + strlen(prefix)], verstring); + versions[newlen + oldlen] = '\n'; + versions[newlen + oldlen + 1] = '\0'; +} + void yyerror(const char *string) { diff --git a/sys/dev/aic7xxx/aicasm/aicasm_scan.l b/sys/dev/aic7xxx/aicasm/aicasm_scan.l index 7bfe505..1ec85ed 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_scan.l +++ b/sys/dev/aic7xxx/aicasm/aicasm_scan.l @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#4 $ + * $Id: //depot/src/aic7xxx/aicasm/aicasm_scan.l#5 $ * * $FreeBSD$ */ @@ -54,6 +54,7 @@ char string_buf[MAX_STR_CONST]; char *string_buf_ptr; int parren_count; +int quote_count; %} PATH [-/A-Za-z0-9_.]*[./][-/A-Za-z0-9_.]* @@ -63,6 +64,7 @@ SPACE [ \t]+ %x COMMENT %x CEXPR %x INCLUDE +%x STRING %% \n { ++yylineno; } @@ -94,8 +96,9 @@ if[ \t]*\( { } <CEXPR>\n { ++yylineno; } <CEXPR>[^()\n]+ { - char *yptr = yytext; + char *yptr; + yptr = yytext; while (*yptr != '\0') { /* Remove duplicate spaces */ if (*yptr == '\t') @@ -109,6 +112,25 @@ if[ \t]*\( { } } +VERSION { return T_VERSION; } +\" { + string_buf_ptr = string_buf; + BEGIN STRING; + } +<STRING>[^"]+ { + char *yptr; + + yptr = yytext; + while (*yptr) + *string_buf_ptr++ = *yptr++; + } +<STRING>\" { + /* All done */ + BEGIN INITIAL; + *string_buf_ptr = '\0'; + yylval.str = string_buf; + return T_STRING; + } {SPACE} ; /* Register/SCB/SRAM definition keywords */ @@ -175,7 +197,7 @@ nop { return T_NOP; } else { return T_ELSE; } /* Allowed Symbols */ -[-+,:()~|&."{};<>[\]!] { return yytext[0]; } +[-+,:()~|&."{};<>[\]!=] { return yytext[0]; } /* Number processing */ 0[0-7]* { @@ -194,17 +216,36 @@ else { return T_ELSE; } } /* Include Files */ -#include { return T_INCLUDE; BEGIN INCLUDE;} -<INCLUDE>[<>\"] { return yytext[0]; } -<INCLUDE>{PATH} { yylval.str = strdup(yytext); return T_PATH; } -<INCLUDE>; { BEGIN INITIAL; return yytext[0]; } +#include{SPACE} { + BEGIN INCLUDE; + quote_count = 0; + return T_INCLUDE; + } +<INCLUDE>[<] { return yytext[0]; } +<INCLUDE>[>] { BEGIN INITIAL; return yytext[0]; } +<INCLUDE>[\"] { + if (quote_count != 0) + BEGIN INITIAL; + quote_count++; + return yytext[0]; + } <INCLUDE>. { stop("Invalid include line", EX_DATAERR); } /* For parsing C include files with #define foo */ #define { yylval.value = TRUE; return T_CONST; } /* Throw away macros */ #define[^\n]*[()]+[^\n]* ; -{PATH} { yylval.str = strdup(yytext); return T_PATH; } +<INITIAL,INCLUDE>{PATH} { + char *yptr; + + yptr = yytext; + string_buf_ptr = string_buf; + while (*yptr) + *string_buf_ptr++ = *yptr++; + yylval.str = string_buf; + *string_buf_ptr = '\0'; + return T_PATH; + } {WORD} { yylval.sym = symtable_get(yytext); return T_SYMBOL; } diff --git a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c index 974c8c4..e0af1a8 100644 --- a/sys/dev/aic7xxx/aicasm/aicasm_symbol.c +++ b/sys/dev/aic7xxx/aicasm/aicasm_symbol.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.c#4 $ + * $Id: //depot/src/aic7xxx/aicasm/aicasm_symbol.c#7 $ * * $FreeBSD$ */ @@ -36,7 +36,7 @@ #include <sys/types.h> #ifdef __linux__ -#include <db1/db.h> +#include "aicdb.h" #else #include <db.h> #endif @@ -389,8 +389,10 @@ symtable_dump(FILE *ofile) /* Output what we have */ fprintf(ofile, "/* - * DO NOT EDIT - This file is automatically generated. - */\n"); + * DO NOT EDIT - This file is automatically generated + * from the following source files: + * +%s */\n", versions); while (SLIST_FIRST(®isters) != NULL) { symbol_node_t *curnode; u_int8_t value; |