Home | History | Annotate | Line # | Download | only in compiler
preprocess.h revision 1.1.1.14
      1 /******************************************************************************
      2  *
      3  * Module Name: preprocess.h - header for iASL Preprocessor
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2023, 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 MERCHANTABILITY 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)    ((AslGbl_MainTokenBuffer - t) + 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 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    143 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    144 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MacroTokenReplaceBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    145 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    146 
    147 PR_EXTERN UINT32                AslGbl_PreprocessorLineNumber;
    148 PR_EXTERN int                   AslGbl_IfDepth;
    149 PR_EXTERN PR_FILE_NODE          *AslGbl_InputFileList;
    150 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (AslGbl_PreprocessorError, FALSE);
    151 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (AslGbl_IgnoringThisCodeBlock, FALSE);
    152 PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*AslGbl_DefineList, NULL);
    153 PR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*AslGbl_DirectiveStack, NULL);
    154 
    155 #if 0 /* TBD for macros */
    156 PR_EXTERN char                  PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
    157 #endif
    158 
    159 
    160 /*
    161  * prscan - Preprocessor entry
    162  */
    163 void
    164 PrInitializePreprocessor (
    165     void);
    166 
    167 void
    168 PrInitializeGlobals (
    169     void);
    170 
    171 void
    172 PrTerminatePreprocessor (
    173     void);
    174 
    175 void
    176 PrDoPreprocess (
    177     void);
    178 
    179 UINT64
    180 PrIsDefined (
    181     char                    *Identifier);
    182 
    183 UINT64
    184 PrResolveDefine (
    185     char                    *Identifier);
    186 
    187 int
    188 PrInitLexer (
    189     char                    *String);
    190 
    191 void
    192 PrTerminateLexer (
    193     void);
    194 
    195 
    196 /*
    197  * prmacros - Support for #defines and macros
    198  */
    199 void
    200 PrDumpPredefinedNames (
    201     void);
    202 
    203 PR_DEFINE_INFO *
    204 PrAddDefine (
    205     char                    *Token,
    206     char                    *Token2,
    207     BOOLEAN                 Persist);
    208 
    209 void
    210 PrRemoveDefine (
    211     char                    *DefineName);
    212 
    213 PR_DEFINE_INFO *
    214 PrMatchDefine (
    215     char                    *MatchString);
    216 
    217 void
    218 PrAddMacro (
    219     char                    *Name,
    220     char                    **Next);
    221 
    222 void
    223 PrDoMacroInvocation (
    224     char                    *TokenBuffer,
    225     char                    *MacroStart,
    226     PR_DEFINE_INFO          *DefineInfo,
    227     char                    **Next);
    228 
    229 
    230 /*
    231  * prexpress - #if expression support
    232  */
    233 ACPI_STATUS
    234 PrResolveIntegerExpression (
    235     char                    *Line,
    236     UINT64                  *ReturnValue);
    237 
    238 char *
    239 PrPrioritizeExpression (
    240     char                    *OriginalLine);
    241 
    242 /*
    243  * prparser - lex/yacc expression parser
    244  */
    245 UINT64
    246 PrEvaluateExpression (
    247     char                    *ExprString);
    248 
    249 
    250 /*
    251  * prutils - Preprocessor utilities
    252  */
    253 char *
    254 PrGetNextToken (
    255     char                    *Buffer,
    256     char                    *MatchString,
    257     char                    **Next);
    258 
    259 void
    260 PrError (
    261     UINT8                   Level,
    262     UINT16                  MessageId,
    263     UINT32                  Column);
    264 
    265 void
    266 PrReplaceResizeSubstring(
    267     PR_MACRO_ARG            *Args,
    268     UINT32                  Diff1,
    269     UINT32                  Diff2,
    270     UINT32                  i,
    271     char                    *Token);
    272 
    273 char *
    274 PrReplaceData (
    275     char                    *Buffer,
    276     UINT32                  LengthToRemove,
    277     char                    *BufferToAdd,
    278     UINT32                  LengthToAdd);
    279 
    280 FILE *
    281 PrOpenIncludeFile (
    282     char                    *Filename,
    283     char                    *OpenMode,
    284     char                    **FullPathname);
    285 
    286 FILE *
    287 PrOpenIncludeWithPrefix (
    288     char                    *PrefixDir,
    289     char                    *Filename,
    290     char                    *OpenMode,
    291     char                    **FullPathname);
    292 
    293 void
    294 PrPushInputFileStack (
    295     FILE                    *InputFile,
    296     char                    *Filename);
    297 
    298 BOOLEAN
    299 PrPopInputFileStack (
    300     void);
    301 
    302 #endif
    303