Home | History | Annotate | Line # | Download | only in compiler
preprocess.h revision 1.1.1.7
      1 /******************************************************************************
      2  *
      3  * Module Name: preprocess.h - header for iASL Preprocessor
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2018, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #define __PREPROCESS_H__
     45 
     46 #ifndef _PREPROCESS
     47 #define _PREPROCESS
     48 
     49 #undef PR_EXTERN
     50 
     51 #ifdef _DECLARE_PR_GLOBALS
     52 #define PR_EXTERN
     53 #define PR_INIT_GLOBAL(a,b)         (a)=(b)
     54 #else
     55 #define PR_EXTERN                   extern
     56 #define PR_INIT_GLOBAL(a,b)         (a)
     57 #endif
     58 
     59 
     60 /*
     61  * Configuration
     62  */
     63 #define PR_MAX_MACRO_ARGS       32              /* Max number of macro args */
     64 #define PR_MAX_ARG_INSTANCES    24              /* Max instances of any one arg */
     65 #define PR_LINES_PER_BLOCK      4096            /* Max input source lines per block */
     66 
     67 
     68 /*
     69  * Local defines and macros
     70  */
     71 #define PR_TOKEN_SEPARATORS     " ,(){}\t\n"
     72 #define PR_MACRO_SEPARATORS     " ,(){}~!*/%+-<>=&^|\"\t\n"
     73 #define PR_MACRO_ARGUMENTS      " ,\t\n"
     74 #define PR_EXPR_SEPARATORS      " ,(){}~!*/%+-<>=&^|\"\t\n"
     75 
     76 #define PR_PREFIX_ID            "Pr(%.4u) - "             /* Used for debug output */
     77 
     78 #define THIS_TOKEN_OFFSET(t)    ((t-Gbl_MainTokenBuffer) + 1)
     79 
     80 
     81 /*
     82  * Preprocessor structures
     83  */
     84 typedef struct pr_macro_arg
     85 {
     86     char                        *Name;
     87     UINT32                      Offset[PR_MAX_ARG_INSTANCES];
     88     UINT16                      UseCount;
     89 
     90 } PR_MACRO_ARG;
     91 
     92 typedef struct pr_define_info
     93 {
     94     struct pr_define_info       *Previous;
     95     struct pr_define_info       *Next;
     96     char                        *Identifier;
     97     char                        *Replacement;
     98     char                        *Body;          /* Macro body */
     99     PR_MACRO_ARG                *Args;          /* Macro arg list */
    100     UINT16                      ArgCount;       /* Macro arg count */
    101     BOOLEAN                     Persist;        /* Keep for entire compiler run */
    102 
    103 } PR_DEFINE_INFO;
    104 
    105 typedef struct pr_directive_info
    106 {
    107     char                        *Name;          /* Directive name */
    108     UINT8                       ArgCount;       /* Required # of args */
    109 
    110 } PR_DIRECTIVE_INFO;
    111 
    112 typedef struct pr_operator_info
    113 {
    114     char                        *Op;
    115 
    116 } PR_OPERATOR_INFO;
    117 
    118 typedef struct pr_file_node
    119 {
    120     struct pr_file_node         *Next;
    121     FILE                        *File;
    122     char                        *Filename;
    123     UINT32                      CurrentLineNumber;
    124 
    125 } PR_FILE_NODE;
    126 
    127 #define MAX_ARGUMENT_LENGTH     24
    128 
    129 typedef struct directive_info
    130 {
    131     struct directive_info       *Next;
    132     char                        Argument[MAX_ARGUMENT_LENGTH];
    133     int                         Directive;
    134     BOOLEAN                     IgnoringThisCodeBlock;
    135 
    136 } DIRECTIVE_INFO;
    137 
    138 
    139 /*
    140  * Globals
    141  */
    142 #if 0 /* TBD for macros */
    143 PR_EXTERN char                  PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    144 #endif
    145 
    146 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    147 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    148 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    149 
    150 PR_EXTERN UINT32                Gbl_PreprocessorLineNumber;
    151 PR_EXTERN int                   Gbl_IfDepth;
    152 PR_EXTERN PR_FILE_NODE          *Gbl_InputFileList;
    153 PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
    154 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE);
    155 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_IgnoringThisCodeBlock, FALSE);
    156 PR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*Gbl_DirectiveStack, NULL);
    157 
    158 /*
    159  * prscan - Preprocessor entry
    160  */
    161 void
    162 PrInitializePreprocessor (
    163     void);
    164 
    165 void
    166 PrInitializeGlobals (
    167     void);
    168 
    169 void
    170 PrTerminatePreprocessor (
    171     void);
    172 
    173 void
    174 PrDoPreprocess (
    175     void);
    176 
    177 UINT64
    178 PrIsDefined (
    179     char                    *Identifier);
    180 
    181 UINT64
    182 PrResolveDefine (
    183     char                    *Identifier);
    184 
    185 int
    186 PrInitLexer (
    187     char                    *String);
    188 
    189 void
    190 PrTerminateLexer (
    191     void);
    192 
    193 
    194 /*
    195  * prmacros - Support for #defines and macros
    196  */
    197 void
    198 PrDumpPredefinedNames (
    199     void);
    200 
    201 PR_DEFINE_INFO *
    202 PrAddDefine (
    203     char                    *Token,
    204     char                    *Token2,
    205     BOOLEAN                 Persist);
    206 
    207 void
    208 PrRemoveDefine (
    209     char                    *DefineName);
    210 
    211 PR_DEFINE_INFO *
    212 PrMatchDefine (
    213     char                    *MatchString);
    214 
    215 void
    216 PrAddMacro (
    217     char                    *Name,
    218     char                    **Next);
    219 
    220 void
    221 PrDoMacroInvocation (
    222     char                    *TokenBuffer,
    223     char                    *MacroStart,
    224     PR_DEFINE_INFO          *DefineInfo,
    225     char                    **Next);
    226 
    227 
    228 /*
    229  * prexpress - #if expression support
    230  */
    231 ACPI_STATUS
    232 PrResolveIntegerExpression (
    233     char                    *Line,
    234     UINT64                  *ReturnValue);
    235 
    236 char *
    237 PrPrioritizeExpression (
    238     char                    *OriginalLine);
    239 
    240 /*
    241  * prparser - lex/yacc expression parser
    242  */
    243 UINT64
    244 PrEvaluateExpression (
    245     char                    *ExprString);
    246 
    247 
    248 /*
    249  * prutils - Preprocesor utilities
    250  */
    251 char *
    252 PrGetNextToken (
    253     char                    *Buffer,
    254     char                    *MatchString,
    255     char                    **Next);
    256 
    257 void
    258 PrError (
    259     UINT8                   Level,
    260     UINT16                  MessageId,
    261     UINT32                  Column);
    262 
    263 void
    264 PrReplaceData (
    265     char                    *Buffer,
    266     UINT32                  LengthToRemove,
    267     char                    *BufferToAdd,
    268     UINT32                  LengthToAdd);
    269 
    270 FILE *
    271 PrOpenIncludeFile (
    272     char                    *Filename,
    273     char                    *OpenMode,
    274     char                    **FullPathname);
    275 
    276 FILE *
    277 PrOpenIncludeWithPrefix (
    278     char                    *PrefixDir,
    279     char                    *Filename,
    280     char                    *OpenMode,
    281     char                    **FullPathname);
    282 
    283 void
    284 PrPushInputFileStack (
    285     FILE                    *InputFile,
    286     char                    *Filename);
    287 
    288 BOOLEAN
    289 PrPopInputFileStack (
    290     void);
    291 
    292 #endif
    293