Home | History | Annotate | Download | only in gas
      1 /*
      2  * GAS-compatible parser header file
      3  *
      4  *  Copyright (C) 2005-2007  Peter Johnson
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. Neither the name of the author nor the names of other contributors
     15  *    may be used to endorse or promote products derived from this
     16  *    software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
     19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
     22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     28  * POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 #ifndef YASM_GAS_PARSER_H
     31 #define YASM_GAS_PARSER_H
     32 
     33 #define YYCTYPE         unsigned char
     34 
     35 #define MAX_SAVED_LINE_LEN  80
     36 
     37 enum tokentype {
     38     INTNUM = 258,
     39     FLTNUM,
     40     STRING,
     41     REG,
     42     REGGROUP,
     43     SEGREG,
     44     TARGETMOD,
     45     LEFT_OP,
     46     RIGHT_OP,
     47     ID,
     48     LABEL,
     49     CPP_LINE_MARKER,
     50     NASM_LINE_MARKER,
     51     NONE
     52 };
     53 
     54 typedef union {
     55     unsigned int int_info;
     56     yasm_intnum *intn;
     57     yasm_floatnum *flt;
     58     yasm_bytecode *bc;
     59     uintptr_t arch_data;
     60     struct {
     61         char *contents;
     62         size_t len;
     63     } str;
     64 } yystype;
     65 #define YYSTYPE yystype
     66 
     67 enum gas_parser_state {
     68     INITIAL,
     69     COMMENT,
     70     SECTION_DIRECTIVE,
     71     NASM_FILENAME
     72 };
     73 
     74 typedef struct yasm_parser_gas {
     75     /*@only@*/ yasm_object *object;
     76 
     77     /* last "base" label for local (.) labels */
     78     /*@null@*/ char *locallabel_base;
     79     size_t locallabel_base_len;
     80 
     81     /* .line/.file: we have to see both to start setting linemap versions */
     82     int dir_fileline;
     83     /*@null@*/ char *dir_file;
     84     unsigned long dir_line;
     85 
     86     /* Have we seen a line marker? */
     87     int seen_line_marker;
     88 
     89     /*@dependent@*/ yasm_preproc *preproc;
     90     /*@dependent@*/ yasm_errwarns *errwarns;
     91 
     92     /*@dependent@*/ yasm_linemap *linemap;
     93 
     94     /*@null@*/ yasm_bytecode *prev_bc;
     95     yasm_bytecode *temp_bc;
     96 
     97     int save_input;
     98     YYCTYPE save_line[2][MAX_SAVED_LINE_LEN];
     99     int save_last;
    100 
    101     /* Line data storage used in preproc_input(). */
    102     char *line, *linepos;
    103     size_t lineleft;
    104 
    105     yasm_scanner s;
    106     enum gas_parser_state state;
    107 
    108     int token;          /* enum tokentype or any character */
    109     yystype tokval;
    110     char tokch;         /* first character of token */
    111 
    112     /* one token of lookahead; used sparingly */
    113     int peek_token;     /* NONE if none */
    114     yystype peek_tokval;
    115     char peek_tokch;
    116 
    117     /* Index of local labels; what's stored here is the /next/ index,
    118      * so these are all 0 at start.
    119      */
    120     unsigned long local[10];
    121 
    122     /* Parser-handled directives HAMT lookup */
    123     HAMT *dirs;
    124 
    125     int intel_syntax;
    126 
    127     int is_nasm_preproc;
    128     int is_cpp_preproc;
    129 } yasm_parser_gas;
    130 
    131 /* shorter access names to commonly used parser_gas fields */
    132 #define p_object        (parser_gas->object)
    133 #define p_symtab        (parser_gas->object->symtab)
    134 #define cursect         (parser_gas->object->cur_section)
    135 #define curtok          (parser_gas->token)
    136 #define curval          (parser_gas->tokval)
    137 
    138 #define INTNUM_val              (curval.intn)
    139 #define FLTNUM_val              (curval.flt)
    140 #define STRING_val              (curval.str)
    141 #define REG_val                 (curval.arch_data)
    142 #define REGGROUP_val            (curval.arch_data)
    143 #define SEGREG_val              (curval.arch_data)
    144 #define TARGETMOD_val           (curval.arch_data)
    145 #define ID_val                  (curval.str.contents)
    146 #define ID_len                  (curval.str.len)
    147 #define LABEL_val               (curval.str.contents)
    148 #define LABEL_len               (curval.str.len)
    149 
    150 #define cur_line        (yasm_linemap_get_current(parser_gas->linemap))
    151 
    152 #define p_expr_new(l,o,r)       yasm_expr_create(o,l,r,cur_line)
    153 #define p_expr_new_tree(l,o,r)  yasm_expr_create_tree(l,o,r,cur_line)
    154 #define p_expr_new_branch(o,r)  yasm_expr_create_branch(o,r,cur_line)
    155 #define p_expr_new_ident(r)     yasm_expr_create_ident(r,cur_line)
    156 
    157 yasm_bytecode *parse_instr_intel(yasm_parser_gas *parser_gas);
    158 
    159 void gas_parser_parse(yasm_parser_gas *parser_gas);
    160 void gas_parser_cleanup(yasm_parser_gas *parser_gas);
    161 int gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas);
    162 
    163 #endif
    164