void initLexer(int flags) { int i; /* add our reserved words */ for (i = 0; i < N_ELEMENTS(init_words); i++) { AddSymbol(&reservedWords, init_words[i].name, SYM_RESERVED, (void *)init_words[i].val); } /* add builtin functions */ for (i = 0; i < N_ELEMENTS(builtinfuncs); i++) { AddSymbol(&reservedWords, builtinfuncs[i].name, SYM_BUILTIN, (void *)&builtinfuncs[i]); } /* and builtin constants */ for (i = 0; i < N_ELEMENTS(constants); i++) { AddSymbol(&reservedWords, constants[i].name, constants[i].type, AstInteger(constants[i].val)); } /* C keywords */ for (i = 0; i < N_ELEMENTS(c_words); i++) { AddSymbol(&ckeywords, c_words[i], SYM_RESERVED, NULL); } /* add the PASM instructions */ InitPasm(flags); }
void PrintDataBlockForGas(FILE *f, ParserState *P, int inlineAsm) { AST *ast; int saveState; if (gl_errors != 0) return; saveState = P->printLabelsVerbatim; P->printLabelsVerbatim = 1; if (inlineAsm) { fprintf(f, "__asm__(\n"); fprintf(f, "\"\t\t.section .%s.cog, \\\"ax\\\"\\n\"\n", P->basename); } /* print constant declarations */ PrintConstantsGas(f, P, inlineAsm); if (inlineAsm) { fprintf(f, "\"\t\t.compress off\\n\"\n"); } startLine(f, inlineAsm); fprintf(f, "..start"); endLine(f, inlineAsm); for (ast = P->datblock; ast; ast = ast->right) { /* print anything for start of line here */ startLine(f, inlineAsm); switch (ast->kind) { case AST_BYTELIST: outputGasDataList(f, ".byte", ast->left); break; case AST_WORDLIST: outputGasDataList(f, ".word", ast->left); break; case AST_LONGLIST: outputGasDataList(f, ".long", ast->left); break; case AST_INSTRHOLDER: outputGasInstruction(f, ast->left); break; case AST_IDENTIFIER: outputGasLabel(f, ast); break; case AST_FILE: ERROR(ast, "File directive not supported in GAS output"); break; case AST_ORG: outputGasDirective(f, ".org", ast->left); break; case AST_RES: outputGasDirective(f, ".res", ast->left); break; case AST_FIT: outputGasDirective(f, ".fit", ast->left ? ast->left : AstInteger(496)); break; default: ERROR(ast, "unknown element in data block"); break; } /* print end of line stuff here */ endLine(f, inlineAsm); } if (inlineAsm) { fprintf(f, "\"\t\t.compress default\\n\"\n"); fprintf(f, "\"\t\t.text\\n\"\n"); fprintf(f, "\n);\n"); } P->printLabelsVerbatim = saveState; }