Mercurial > hg-old > index.cgi
view src/pragma.c @ 3:46e532283947
Add TODO list
author | lost |
---|---|
date | Fri, 03 Oct 2008 06:16:20 +0000 |
parents | 57495da01900 |
children | 34568fab6058 |
line wrap: on
line source
/* * pragma.c * * stuff associated with lwasm specific strangeness */ #include <ctype.h> #include <stdlib.h> #include <string.h> #include "lwasm.h" /* A pragma is a means of controlling code generation. The pseudo op "*pragma" which will be treated as a comment by an assembler that doesn't recognize it and thus will not cause assembly errors. This is the preferred way of flagging a pragma if it will not cause incorrect execution of the program. The pseudo op "pragma" which will cause an error on an assembler that does not understand it. In the case of "*pragma", unrecognized pragmas MUST be silently ignored. In the case of "pragma", unrecognized pragmas should raise an error. LWASM understands the following pragmas: index0tonone noindex0tonone When set (index0tonone), an expression that evaluates to 0, other than a bare constant, in a <offset>,r operand will cause the code for ",r" to be emitted rather than "0,r". If not set (noindex0tonone), the "0,r" output will be emitted. The default is to perform the optimization. This particular optimization will save a cycle for a direct operation. For an indirect operation, however, it will save several cycles and a program byte which may be very useful. */ void pseudo_pragma_real(asmstate_t *as, sourceline_t *cl, char **optr, int error) { char pragma[128]; int c = 0; while (isspace(**optr)) (*optr)++; while (c < 127 && **optr && !isspace(**optr)) { pragma[c++] = **optr; (*optr)++; } if (c == 0 || (**optr && !isspace(**optr))) { if (error) errorp1(ERR_PRAGMA); return; } pragma[c] = 0; if (!strcmp(pragma, "noindex0tonone")) { as -> pragmas |= PRAGMA_NOINDEX0TONONE; } else if (!strcmp(pragma, "index0tonone")) { as -> pragmas &= ~PRAGMA_NOINDEX0TONONE; } else { if (error) errorp1(ERR_PRAGMA); } } void pseudo_pragma(asmstate_t *as, sourceline_t *cl, char **optr) { pseudo_pragma_real(as, cl, optr, 1); } void pseudo_starpragma(asmstate_t *as, sourceline_t *cl, char **optr) { pseudo_pragma_real(as, cl, optr, 0); }