Home | History | Annotate | Line # | Download | only in compiler
aslerror.c revision 1.1.1.2.4.2
      1  1.1.1.2.4.2  rmind 
      2  1.1.1.2.4.2  rmind /******************************************************************************
      3  1.1.1.2.4.2  rmind  *
      4  1.1.1.2.4.2  rmind  * Module Name: aslerror - Error handling and statistics
      5  1.1.1.2.4.2  rmind  *
      6  1.1.1.2.4.2  rmind  *****************************************************************************/
      7  1.1.1.2.4.2  rmind 
      8  1.1.1.2.4.2  rmind /*
      9  1.1.1.2.4.2  rmind  * Copyright (C) 2000 - 2011, Intel Corp.
     10  1.1.1.2.4.2  rmind  * All rights reserved.
     11  1.1.1.2.4.2  rmind  *
     12  1.1.1.2.4.2  rmind  * Redistribution and use in source and binary forms, with or without
     13  1.1.1.2.4.2  rmind  * modification, are permitted provided that the following conditions
     14  1.1.1.2.4.2  rmind  * are met:
     15  1.1.1.2.4.2  rmind  * 1. Redistributions of source code must retain the above copyright
     16  1.1.1.2.4.2  rmind  *    notice, this list of conditions, and the following disclaimer,
     17  1.1.1.2.4.2  rmind  *    without modification.
     18  1.1.1.2.4.2  rmind  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  1.1.1.2.4.2  rmind  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  1.1.1.2.4.2  rmind  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  1.1.1.2.4.2  rmind  *    including a substantially similar Disclaimer requirement for further
     22  1.1.1.2.4.2  rmind  *    binary redistribution.
     23  1.1.1.2.4.2  rmind  * 3. Neither the names of the above-listed copyright holders nor the names
     24  1.1.1.2.4.2  rmind  *    of any contributors may be used to endorse or promote products derived
     25  1.1.1.2.4.2  rmind  *    from this software without specific prior written permission.
     26  1.1.1.2.4.2  rmind  *
     27  1.1.1.2.4.2  rmind  * Alternatively, this software may be distributed under the terms of the
     28  1.1.1.2.4.2  rmind  * GNU General Public License ("GPL") version 2 as published by the Free
     29  1.1.1.2.4.2  rmind  * Software Foundation.
     30  1.1.1.2.4.2  rmind  *
     31  1.1.1.2.4.2  rmind  * NO WARRANTY
     32  1.1.1.2.4.2  rmind  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  1.1.1.2.4.2  rmind  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  1.1.1.2.4.2  rmind  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  1.1.1.2.4.2  rmind  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  1.1.1.2.4.2  rmind  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  1.1.1.2.4.2  rmind  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  1.1.1.2.4.2  rmind  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  1.1.1.2.4.2  rmind  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  1.1.1.2.4.2  rmind  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  1.1.1.2.4.2  rmind  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  1.1.1.2.4.2  rmind  * POSSIBILITY OF SUCH DAMAGES.
     43  1.1.1.2.4.2  rmind  */
     44  1.1.1.2.4.2  rmind 
     45  1.1.1.2.4.2  rmind #define ASL_EXCEPTIONS
     46  1.1.1.2.4.2  rmind #include "aslcompiler.h"
     47  1.1.1.2.4.2  rmind 
     48  1.1.1.2.4.2  rmind #define _COMPONENT          ACPI_COMPILER
     49  1.1.1.2.4.2  rmind         ACPI_MODULE_NAME    ("aslerror")
     50  1.1.1.2.4.2  rmind 
     51  1.1.1.2.4.2  rmind /* Local prototypes */
     52  1.1.1.2.4.2  rmind 
     53  1.1.1.2.4.2  rmind static void
     54  1.1.1.2.4.2  rmind AeAddToErrorLog (
     55  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode);
     56  1.1.1.2.4.2  rmind 
     57  1.1.1.2.4.2  rmind 
     58  1.1.1.2.4.2  rmind void
     59  1.1.1.2.4.2  rmind AeClearErrorLog (
     60  1.1.1.2.4.2  rmind     void)
     61  1.1.1.2.4.2  rmind {
     62  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
     63  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Next;
     64  1.1.1.2.4.2  rmind 
     65  1.1.1.2.4.2  rmind     /* Walk the error node list */
     66  1.1.1.2.4.2  rmind 
     67  1.1.1.2.4.2  rmind     while (Enode)
     68  1.1.1.2.4.2  rmind     {
     69  1.1.1.2.4.2  rmind         Next = Enode->Next;
     70  1.1.1.2.4.2  rmind         ACPI_FREE (Enode);
     71  1.1.1.2.4.2  rmind         Enode = Next;
     72  1.1.1.2.4.2  rmind     }
     73  1.1.1.2.4.2  rmind 
     74  1.1.1.2.4.2  rmind     Gbl_ErrorLog = NULL;
     75  1.1.1.2.4.2  rmind }
     76  1.1.1.2.4.2  rmind 
     77  1.1.1.2.4.2  rmind 
     78  1.1.1.2.4.2  rmind /*******************************************************************************
     79  1.1.1.2.4.2  rmind  *
     80  1.1.1.2.4.2  rmind  * FUNCTION:    AeAddToErrorLog
     81  1.1.1.2.4.2  rmind  *
     82  1.1.1.2.4.2  rmind  * PARAMETERS:  Enode       - An error node to add to the log
     83  1.1.1.2.4.2  rmind  *
     84  1.1.1.2.4.2  rmind  * RETURN:      None
     85  1.1.1.2.4.2  rmind  *
     86  1.1.1.2.4.2  rmind  * DESCRIPTION: Add a new error node to the error log.  The error log is
     87  1.1.1.2.4.2  rmind  *              ordered by the "logical" line number (cumulative line number
     88  1.1.1.2.4.2  rmind  *              including all include files.)
     89  1.1.1.2.4.2  rmind  *
     90  1.1.1.2.4.2  rmind  ******************************************************************************/
     91  1.1.1.2.4.2  rmind 
     92  1.1.1.2.4.2  rmind static void
     93  1.1.1.2.4.2  rmind AeAddToErrorLog (
     94  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode)
     95  1.1.1.2.4.2  rmind {
     96  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Next;
     97  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Prev;
     98  1.1.1.2.4.2  rmind 
     99  1.1.1.2.4.2  rmind 
    100  1.1.1.2.4.2  rmind     /* If Gbl_ErrorLog is null, this is the first error node */
    101  1.1.1.2.4.2  rmind 
    102  1.1.1.2.4.2  rmind     if (!Gbl_ErrorLog)
    103  1.1.1.2.4.2  rmind     {
    104  1.1.1.2.4.2  rmind         Gbl_ErrorLog = Enode;
    105  1.1.1.2.4.2  rmind         return;
    106  1.1.1.2.4.2  rmind     }
    107  1.1.1.2.4.2  rmind 
    108  1.1.1.2.4.2  rmind     /*
    109  1.1.1.2.4.2  rmind      * Walk error list until we find a line number greater than ours.
    110  1.1.1.2.4.2  rmind      * List is sorted according to line number.
    111  1.1.1.2.4.2  rmind      */
    112  1.1.1.2.4.2  rmind     Prev = NULL;
    113  1.1.1.2.4.2  rmind     Next = Gbl_ErrorLog;
    114  1.1.1.2.4.2  rmind 
    115  1.1.1.2.4.2  rmind     while ((Next) &&
    116  1.1.1.2.4.2  rmind            (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
    117  1.1.1.2.4.2  rmind     {
    118  1.1.1.2.4.2  rmind         Prev = Next;
    119  1.1.1.2.4.2  rmind         Next = Next->Next;
    120  1.1.1.2.4.2  rmind     }
    121  1.1.1.2.4.2  rmind 
    122  1.1.1.2.4.2  rmind     /* Found our place in the list */
    123  1.1.1.2.4.2  rmind 
    124  1.1.1.2.4.2  rmind     Enode->Next = Next;
    125  1.1.1.2.4.2  rmind 
    126  1.1.1.2.4.2  rmind     if (Prev)
    127  1.1.1.2.4.2  rmind     {
    128  1.1.1.2.4.2  rmind         Prev->Next = Enode;
    129  1.1.1.2.4.2  rmind     }
    130  1.1.1.2.4.2  rmind     else
    131  1.1.1.2.4.2  rmind     {
    132  1.1.1.2.4.2  rmind         Gbl_ErrorLog = Enode;
    133  1.1.1.2.4.2  rmind     }
    134  1.1.1.2.4.2  rmind }
    135  1.1.1.2.4.2  rmind 
    136  1.1.1.2.4.2  rmind 
    137  1.1.1.2.4.2  rmind /*******************************************************************************
    138  1.1.1.2.4.2  rmind  *
    139  1.1.1.2.4.2  rmind  * FUNCTION:    AePrintException
    140  1.1.1.2.4.2  rmind  *
    141  1.1.1.2.4.2  rmind  * PARAMETERS:  FileId          - ID of output file
    142  1.1.1.2.4.2  rmind  *              Enode           - Error node to print
    143  1.1.1.2.4.2  rmind  *              Header          - Additional text before each message
    144  1.1.1.2.4.2  rmind  *
    145  1.1.1.2.4.2  rmind  * RETURN:      None
    146  1.1.1.2.4.2  rmind  *
    147  1.1.1.2.4.2  rmind  * DESCRIPTION: Print the contents of an error node.
    148  1.1.1.2.4.2  rmind  *
    149  1.1.1.2.4.2  rmind  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
    150  1.1.1.2.4.2  rmind  *              they abort the compiler and call this function!  Since we
    151  1.1.1.2.4.2  rmind  *              are reporting errors here, we ignore most output errors and
    152  1.1.1.2.4.2  rmind  *              just try to get out as much as we can.
    153  1.1.1.2.4.2  rmind  *
    154  1.1.1.2.4.2  rmind  ******************************************************************************/
    155  1.1.1.2.4.2  rmind 
    156  1.1.1.2.4.2  rmind void
    157  1.1.1.2.4.2  rmind AePrintException (
    158  1.1.1.2.4.2  rmind     UINT32                  FileId,
    159  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode,
    160  1.1.1.2.4.2  rmind     char                    *Header)
    161  1.1.1.2.4.2  rmind {
    162  1.1.1.2.4.2  rmind     UINT8                   SourceByte;
    163  1.1.1.2.4.2  rmind     int                     Actual;
    164  1.1.1.2.4.2  rmind     size_t                  RActual;
    165  1.1.1.2.4.2  rmind     UINT32                  MsgLength;
    166  1.1.1.2.4.2  rmind     char                    *MainMessage;
    167  1.1.1.2.4.2  rmind     char                    *ExtraMessage;
    168  1.1.1.2.4.2  rmind     UINT32                  SourceColumn;
    169  1.1.1.2.4.2  rmind     UINT32                  ErrorColumn;
    170  1.1.1.2.4.2  rmind     FILE                    *OutputFile;
    171  1.1.1.2.4.2  rmind     FILE                    *SourceFile;
    172  1.1.1.2.4.2  rmind     long                    FileSize;
    173  1.1.1.2.4.2  rmind     BOOLEAN                 PrematureEOF = FALSE;
    174  1.1.1.2.4.2  rmind 
    175  1.1.1.2.4.2  rmind 
    176  1.1.1.2.4.2  rmind     if (Gbl_NoErrors)
    177  1.1.1.2.4.2  rmind     {
    178  1.1.1.2.4.2  rmind         return;
    179  1.1.1.2.4.2  rmind     }
    180  1.1.1.2.4.2  rmind 
    181  1.1.1.2.4.2  rmind     /*
    182  1.1.1.2.4.2  rmind      * Only listing files have a header, and remarks/optimizations
    183  1.1.1.2.4.2  rmind      * are always output
    184  1.1.1.2.4.2  rmind      */
    185  1.1.1.2.4.2  rmind     if (!Header)
    186  1.1.1.2.4.2  rmind     {
    187  1.1.1.2.4.2  rmind         /* Ignore remarks if requested */
    188  1.1.1.2.4.2  rmind 
    189  1.1.1.2.4.2  rmind         switch (Enode->Level)
    190  1.1.1.2.4.2  rmind         {
    191  1.1.1.2.4.2  rmind         case ASL_REMARK:
    192  1.1.1.2.4.2  rmind             if (!Gbl_DisplayRemarks)
    193  1.1.1.2.4.2  rmind             {
    194  1.1.1.2.4.2  rmind                 return;
    195  1.1.1.2.4.2  rmind             }
    196  1.1.1.2.4.2  rmind             break;
    197  1.1.1.2.4.2  rmind 
    198  1.1.1.2.4.2  rmind         case ASL_OPTIMIZATION:
    199  1.1.1.2.4.2  rmind             if (!Gbl_DisplayOptimizations)
    200  1.1.1.2.4.2  rmind             {
    201  1.1.1.2.4.2  rmind                 return;
    202  1.1.1.2.4.2  rmind             }
    203  1.1.1.2.4.2  rmind             break;
    204  1.1.1.2.4.2  rmind 
    205  1.1.1.2.4.2  rmind         default:
    206  1.1.1.2.4.2  rmind             break;
    207  1.1.1.2.4.2  rmind         }
    208  1.1.1.2.4.2  rmind     }
    209  1.1.1.2.4.2  rmind 
    210  1.1.1.2.4.2  rmind     /* Get the file handles */
    211  1.1.1.2.4.2  rmind 
    212  1.1.1.2.4.2  rmind     OutputFile = Gbl_Files[FileId].Handle;
    213  1.1.1.2.4.2  rmind 
    214  1.1.1.2.4.2  rmind     /* Use the merged header/source file if present, otherwise use input file */
    215  1.1.1.2.4.2  rmind 
    216  1.1.1.2.4.2  rmind     SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
    217  1.1.1.2.4.2  rmind     if (!SourceFile)
    218  1.1.1.2.4.2  rmind     {
    219  1.1.1.2.4.2  rmind         SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
    220  1.1.1.2.4.2  rmind     }
    221  1.1.1.2.4.2  rmind 
    222  1.1.1.2.4.2  rmind     if (SourceFile)
    223  1.1.1.2.4.2  rmind     {
    224  1.1.1.2.4.2  rmind         /* Determine if the error occurred at source file EOF */
    225  1.1.1.2.4.2  rmind 
    226  1.1.1.2.4.2  rmind         fseek (SourceFile, 0, SEEK_END);
    227  1.1.1.2.4.2  rmind         FileSize = ftell (SourceFile);
    228  1.1.1.2.4.2  rmind 
    229  1.1.1.2.4.2  rmind         if ((long) Enode->LogicalByteOffset >= FileSize)
    230  1.1.1.2.4.2  rmind         {
    231  1.1.1.2.4.2  rmind             PrematureEOF = TRUE;
    232  1.1.1.2.4.2  rmind         }
    233  1.1.1.2.4.2  rmind     }
    234  1.1.1.2.4.2  rmind 
    235  1.1.1.2.4.2  rmind     if (Header)
    236  1.1.1.2.4.2  rmind     {
    237  1.1.1.2.4.2  rmind         fprintf (OutputFile, "%s", Header);
    238  1.1.1.2.4.2  rmind     }
    239  1.1.1.2.4.2  rmind 
    240  1.1.1.2.4.2  rmind     /* Print filename and line number if present and valid */
    241  1.1.1.2.4.2  rmind 
    242  1.1.1.2.4.2  rmind     if (Enode->Filename)
    243  1.1.1.2.4.2  rmind     {
    244  1.1.1.2.4.2  rmind         if (Gbl_VerboseErrors)
    245  1.1.1.2.4.2  rmind         {
    246  1.1.1.2.4.2  rmind             fprintf (OutputFile, "%6s", Enode->Filename);
    247  1.1.1.2.4.2  rmind 
    248  1.1.1.2.4.2  rmind             if (Enode->LineNumber)
    249  1.1.1.2.4.2  rmind             {
    250  1.1.1.2.4.2  rmind                 fprintf (OutputFile, " %6u: ", Enode->LineNumber);
    251  1.1.1.2.4.2  rmind 
    252  1.1.1.2.4.2  rmind                 /*
    253  1.1.1.2.4.2  rmind                  * If not at EOF, get the corresponding source code line and
    254  1.1.1.2.4.2  rmind                  * display it. Don't attempt this if we have a premature EOF
    255  1.1.1.2.4.2  rmind                  * condition.
    256  1.1.1.2.4.2  rmind                  */
    257  1.1.1.2.4.2  rmind                 if (!PrematureEOF)
    258  1.1.1.2.4.2  rmind                 {
    259  1.1.1.2.4.2  rmind                     /*
    260  1.1.1.2.4.2  rmind                      * Seek to the offset in the combined source file, read
    261  1.1.1.2.4.2  rmind                      * the source line, and write it to the output.
    262  1.1.1.2.4.2  rmind                      */
    263  1.1.1.2.4.2  rmind                     Actual = fseek (SourceFile, (long) Enode->LogicalByteOffset,
    264  1.1.1.2.4.2  rmind                                 (int) SEEK_SET);
    265  1.1.1.2.4.2  rmind                     if (Actual)
    266  1.1.1.2.4.2  rmind                     {
    267  1.1.1.2.4.2  rmind                         fprintf (OutputFile,
    268  1.1.1.2.4.2  rmind                             "[*** iASL: Seek error on source code temp file %s ***]",
    269  1.1.1.2.4.2  rmind                             Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    270  1.1.1.2.4.2  rmind                     }
    271  1.1.1.2.4.2  rmind                     else
    272  1.1.1.2.4.2  rmind                     {
    273  1.1.1.2.4.2  rmind                         RActual = fread (&SourceByte, 1, 1, SourceFile);
    274  1.1.1.2.4.2  rmind                         if (!RActual)
    275  1.1.1.2.4.2  rmind                         {
    276  1.1.1.2.4.2  rmind                             fprintf (OutputFile,
    277  1.1.1.2.4.2  rmind                                 "[*** iASL: Read error on source code temp file %s ***]",
    278  1.1.1.2.4.2  rmind                                 Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    279  1.1.1.2.4.2  rmind                         }
    280  1.1.1.2.4.2  rmind 
    281  1.1.1.2.4.2  rmind                         else while (RActual && SourceByte && (SourceByte != '\n'))
    282  1.1.1.2.4.2  rmind                         {
    283  1.1.1.2.4.2  rmind                             fwrite (&SourceByte, 1, 1, OutputFile);
    284  1.1.1.2.4.2  rmind                             RActual = fread (&SourceByte, 1, 1, SourceFile);
    285  1.1.1.2.4.2  rmind                         }
    286  1.1.1.2.4.2  rmind                     }
    287  1.1.1.2.4.2  rmind                 }
    288  1.1.1.2.4.2  rmind 
    289  1.1.1.2.4.2  rmind                 fprintf (OutputFile, "\n");
    290  1.1.1.2.4.2  rmind             }
    291  1.1.1.2.4.2  rmind         }
    292  1.1.1.2.4.2  rmind         else
    293  1.1.1.2.4.2  rmind         {
    294  1.1.1.2.4.2  rmind             fprintf (OutputFile, "%s", Enode->Filename);
    295  1.1.1.2.4.2  rmind 
    296  1.1.1.2.4.2  rmind             if (Enode->LineNumber)
    297  1.1.1.2.4.2  rmind             {
    298  1.1.1.2.4.2  rmind                 fprintf (OutputFile, "(%u) : ", Enode->LineNumber);
    299  1.1.1.2.4.2  rmind             }
    300  1.1.1.2.4.2  rmind         }
    301  1.1.1.2.4.2  rmind     }
    302  1.1.1.2.4.2  rmind 
    303  1.1.1.2.4.2  rmind     /* NULL message ID, just print the raw message */
    304  1.1.1.2.4.2  rmind 
    305  1.1.1.2.4.2  rmind     if (Enode->MessageId == 0)
    306  1.1.1.2.4.2  rmind     {
    307  1.1.1.2.4.2  rmind         fprintf (OutputFile, "%s\n", Enode->Message);
    308  1.1.1.2.4.2  rmind     }
    309  1.1.1.2.4.2  rmind     else
    310  1.1.1.2.4.2  rmind     {
    311  1.1.1.2.4.2  rmind         /* Decode the message ID */
    312  1.1.1.2.4.2  rmind 
    313  1.1.1.2.4.2  rmind         fprintf (OutputFile, "%s %4.4d - ",
    314  1.1.1.2.4.2  rmind                     AslErrorLevel[Enode->Level],
    315  1.1.1.2.4.2  rmind                     Enode->MessageId + ((Enode->Level+1) * 1000));
    316  1.1.1.2.4.2  rmind 
    317  1.1.1.2.4.2  rmind         MainMessage = AslMessages[Enode->MessageId];
    318  1.1.1.2.4.2  rmind         ExtraMessage = Enode->Message;
    319  1.1.1.2.4.2  rmind 
    320  1.1.1.2.4.2  rmind         if (Enode->LineNumber)
    321  1.1.1.2.4.2  rmind         {
    322  1.1.1.2.4.2  rmind             MsgLength = strlen (MainMessage);
    323  1.1.1.2.4.2  rmind             if (MsgLength == 0)
    324  1.1.1.2.4.2  rmind             {
    325  1.1.1.2.4.2  rmind                 MainMessage = Enode->Message;
    326  1.1.1.2.4.2  rmind 
    327  1.1.1.2.4.2  rmind                 MsgLength = strlen (MainMessage);
    328  1.1.1.2.4.2  rmind                 ExtraMessage = NULL;
    329  1.1.1.2.4.2  rmind             }
    330  1.1.1.2.4.2  rmind 
    331  1.1.1.2.4.2  rmind             if (Gbl_VerboseErrors && !PrematureEOF)
    332  1.1.1.2.4.2  rmind             {
    333  1.1.1.2.4.2  rmind                 SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
    334  1.1.1.2.4.2  rmind                 ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
    335  1.1.1.2.4.2  rmind 
    336  1.1.1.2.4.2  rmind                 if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
    337  1.1.1.2.4.2  rmind                 {
    338  1.1.1.2.4.2  rmind                     fprintf (OutputFile, "%*s%s",
    339  1.1.1.2.4.2  rmind                         (int) ((SourceColumn - 1) - ErrorColumn),
    340  1.1.1.2.4.2  rmind                         MainMessage, " ^ ");
    341  1.1.1.2.4.2  rmind                 }
    342  1.1.1.2.4.2  rmind                 else
    343  1.1.1.2.4.2  rmind                 {
    344  1.1.1.2.4.2  rmind                     fprintf (OutputFile, "%*s %s",
    345  1.1.1.2.4.2  rmind                         (int) ((SourceColumn - ErrorColumn) + 1), "^",
    346  1.1.1.2.4.2  rmind                         MainMessage);
    347  1.1.1.2.4.2  rmind                 }
    348  1.1.1.2.4.2  rmind             }
    349  1.1.1.2.4.2  rmind             else
    350  1.1.1.2.4.2  rmind             {
    351  1.1.1.2.4.2  rmind                 fprintf (OutputFile, " %s", MainMessage);
    352  1.1.1.2.4.2  rmind             }
    353  1.1.1.2.4.2  rmind 
    354  1.1.1.2.4.2  rmind             /* Print the extra info message if present */
    355  1.1.1.2.4.2  rmind 
    356  1.1.1.2.4.2  rmind             if (ExtraMessage)
    357  1.1.1.2.4.2  rmind             {
    358  1.1.1.2.4.2  rmind                 fprintf (OutputFile, " (%s)", ExtraMessage);
    359  1.1.1.2.4.2  rmind             }
    360  1.1.1.2.4.2  rmind 
    361  1.1.1.2.4.2  rmind             if (PrematureEOF)
    362  1.1.1.2.4.2  rmind             {
    363  1.1.1.2.4.2  rmind                 fprintf (OutputFile, " and premature End-Of-File");
    364  1.1.1.2.4.2  rmind             }
    365  1.1.1.2.4.2  rmind 
    366  1.1.1.2.4.2  rmind             fprintf (OutputFile, "\n");
    367  1.1.1.2.4.2  rmind             if (Gbl_VerboseErrors)
    368  1.1.1.2.4.2  rmind             {
    369  1.1.1.2.4.2  rmind                 fprintf (OutputFile, "\n");
    370  1.1.1.2.4.2  rmind             }
    371  1.1.1.2.4.2  rmind         }
    372  1.1.1.2.4.2  rmind         else
    373  1.1.1.2.4.2  rmind         {
    374  1.1.1.2.4.2  rmind             fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
    375  1.1.1.2.4.2  rmind         }
    376  1.1.1.2.4.2  rmind     }
    377  1.1.1.2.4.2  rmind }
    378  1.1.1.2.4.2  rmind 
    379  1.1.1.2.4.2  rmind 
    380  1.1.1.2.4.2  rmind /*******************************************************************************
    381  1.1.1.2.4.2  rmind  *
    382  1.1.1.2.4.2  rmind  * FUNCTION:    AePrintErrorLog
    383  1.1.1.2.4.2  rmind  *
    384  1.1.1.2.4.2  rmind  * PARAMETERS:  FileId           - Where to output the error log
    385  1.1.1.2.4.2  rmind  *
    386  1.1.1.2.4.2  rmind  * RETURN:      None
    387  1.1.1.2.4.2  rmind  *
    388  1.1.1.2.4.2  rmind  * DESCRIPTION: Print the entire contents of the error log
    389  1.1.1.2.4.2  rmind  *
    390  1.1.1.2.4.2  rmind  ******************************************************************************/
    391  1.1.1.2.4.2  rmind 
    392  1.1.1.2.4.2  rmind void
    393  1.1.1.2.4.2  rmind AePrintErrorLog (
    394  1.1.1.2.4.2  rmind     UINT32                  FileId)
    395  1.1.1.2.4.2  rmind {
    396  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
    397  1.1.1.2.4.2  rmind 
    398  1.1.1.2.4.2  rmind 
    399  1.1.1.2.4.2  rmind     /* Walk the error node list */
    400  1.1.1.2.4.2  rmind 
    401  1.1.1.2.4.2  rmind     while (Enode)
    402  1.1.1.2.4.2  rmind     {
    403  1.1.1.2.4.2  rmind         AePrintException (FileId, Enode, NULL);
    404  1.1.1.2.4.2  rmind         Enode = Enode->Next;
    405  1.1.1.2.4.2  rmind     }
    406  1.1.1.2.4.2  rmind }
    407  1.1.1.2.4.2  rmind 
    408  1.1.1.2.4.2  rmind 
    409  1.1.1.2.4.2  rmind /*******************************************************************************
    410  1.1.1.2.4.2  rmind  *
    411  1.1.1.2.4.2  rmind  * FUNCTION:    AslCommonError
    412  1.1.1.2.4.2  rmind  *
    413  1.1.1.2.4.2  rmind  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    414  1.1.1.2.4.2  rmind  *              MessageId           - Index into global message buffer
    415  1.1.1.2.4.2  rmind  *              CurrentLineNumber   - Actual file line number
    416  1.1.1.2.4.2  rmind  *              LogicalLineNumber   - Cumulative line number
    417  1.1.1.2.4.2  rmind  *              LogicalByteOffset   - Byte offset in source file
    418  1.1.1.2.4.2  rmind  *              Column              - Column in current line
    419  1.1.1.2.4.2  rmind  *              Filename            - source filename
    420  1.1.1.2.4.2  rmind  *              ExtraMessage        - additional error message
    421  1.1.1.2.4.2  rmind  *
    422  1.1.1.2.4.2  rmind  * RETURN:      None
    423  1.1.1.2.4.2  rmind  *
    424  1.1.1.2.4.2  rmind  * DESCRIPTION: Create a new error node and add it to the error log
    425  1.1.1.2.4.2  rmind  *
    426  1.1.1.2.4.2  rmind  ******************************************************************************/
    427  1.1.1.2.4.2  rmind 
    428  1.1.1.2.4.2  rmind void
    429  1.1.1.2.4.2  rmind AslCommonError (
    430  1.1.1.2.4.2  rmind     UINT8                   Level,
    431  1.1.1.2.4.2  rmind     UINT8                   MessageId,
    432  1.1.1.2.4.2  rmind     UINT32                  CurrentLineNumber,
    433  1.1.1.2.4.2  rmind     UINT32                  LogicalLineNumber,
    434  1.1.1.2.4.2  rmind     UINT32                  LogicalByteOffset,
    435  1.1.1.2.4.2  rmind     UINT32                  Column,
    436  1.1.1.2.4.2  rmind     char                    *Filename,
    437  1.1.1.2.4.2  rmind     char                    *ExtraMessage)
    438  1.1.1.2.4.2  rmind {
    439  1.1.1.2.4.2  rmind     UINT32                  MessageSize;
    440  1.1.1.2.4.2  rmind     char                    *MessageBuffer = NULL;
    441  1.1.1.2.4.2  rmind     ASL_ERROR_MSG           *Enode;
    442  1.1.1.2.4.2  rmind 
    443  1.1.1.2.4.2  rmind 
    444  1.1.1.2.4.2  rmind     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
    445  1.1.1.2.4.2  rmind 
    446  1.1.1.2.4.2  rmind     if (ExtraMessage)
    447  1.1.1.2.4.2  rmind     {
    448  1.1.1.2.4.2  rmind         /* Allocate a buffer for the message and a new error node */
    449  1.1.1.2.4.2  rmind 
    450  1.1.1.2.4.2  rmind         MessageSize   = strlen (ExtraMessage) + 1;
    451  1.1.1.2.4.2  rmind         MessageBuffer = UtLocalCalloc (MessageSize);
    452  1.1.1.2.4.2  rmind 
    453  1.1.1.2.4.2  rmind         /* Keep a copy of the extra message */
    454  1.1.1.2.4.2  rmind 
    455  1.1.1.2.4.2  rmind         ACPI_STRCPY (MessageBuffer, ExtraMessage);
    456  1.1.1.2.4.2  rmind     }
    457  1.1.1.2.4.2  rmind 
    458  1.1.1.2.4.2  rmind     /* Initialize the error node */
    459  1.1.1.2.4.2  rmind 
    460  1.1.1.2.4.2  rmind     if (Filename)
    461  1.1.1.2.4.2  rmind     {
    462  1.1.1.2.4.2  rmind         Enode->Filename       = Filename;
    463  1.1.1.2.4.2  rmind         Enode->FilenameLength = strlen (Filename);
    464  1.1.1.2.4.2  rmind         if (Enode->FilenameLength < 6)
    465  1.1.1.2.4.2  rmind         {
    466  1.1.1.2.4.2  rmind             Enode->FilenameLength = 6;
    467  1.1.1.2.4.2  rmind         }
    468  1.1.1.2.4.2  rmind     }
    469  1.1.1.2.4.2  rmind 
    470  1.1.1.2.4.2  rmind     Enode->MessageId            = MessageId;
    471  1.1.1.2.4.2  rmind     Enode->Level                = Level;
    472  1.1.1.2.4.2  rmind     Enode->LineNumber           = CurrentLineNumber;
    473  1.1.1.2.4.2  rmind     Enode->LogicalLineNumber    = LogicalLineNumber;
    474  1.1.1.2.4.2  rmind     Enode->LogicalByteOffset    = LogicalByteOffset;
    475  1.1.1.2.4.2  rmind     Enode->Column               = Column;
    476  1.1.1.2.4.2  rmind     Enode->Message              = MessageBuffer;
    477  1.1.1.2.4.2  rmind 
    478  1.1.1.2.4.2  rmind     /* Add the new node to the error node list */
    479  1.1.1.2.4.2  rmind 
    480  1.1.1.2.4.2  rmind     AeAddToErrorLog (Enode);
    481  1.1.1.2.4.2  rmind 
    482  1.1.1.2.4.2  rmind     if (Gbl_DebugFlag)
    483  1.1.1.2.4.2  rmind     {
    484  1.1.1.2.4.2  rmind         /* stderr is a file, send error to it immediately */
    485  1.1.1.2.4.2  rmind 
    486  1.1.1.2.4.2  rmind         AePrintException (ASL_FILE_STDERR, Enode, NULL);
    487  1.1.1.2.4.2  rmind     }
    488  1.1.1.2.4.2  rmind 
    489  1.1.1.2.4.2  rmind     Gbl_ExceptionCount[Level]++;
    490  1.1.1.2.4.2  rmind     if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
    491  1.1.1.2.4.2  rmind     {
    492  1.1.1.2.4.2  rmind         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
    493  1.1.1.2.4.2  rmind 
    494  1.1.1.2.4.2  rmind         Gbl_SourceLine = 0;
    495  1.1.1.2.4.2  rmind         Gbl_NextError = Gbl_ErrorLog;
    496  1.1.1.2.4.2  rmind         CmDoOutputFiles ();
    497  1.1.1.2.4.2  rmind         CmCleanupAndExit ();
    498  1.1.1.2.4.2  rmind         exit(1);
    499  1.1.1.2.4.2  rmind     }
    500  1.1.1.2.4.2  rmind 
    501  1.1.1.2.4.2  rmind     return;
    502  1.1.1.2.4.2  rmind }
    503  1.1.1.2.4.2  rmind 
    504  1.1.1.2.4.2  rmind 
    505  1.1.1.2.4.2  rmind /*******************************************************************************
    506  1.1.1.2.4.2  rmind  *
    507  1.1.1.2.4.2  rmind  * FUNCTION:    AslError
    508  1.1.1.2.4.2  rmind  *
    509  1.1.1.2.4.2  rmind  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    510  1.1.1.2.4.2  rmind  *              MessageId           - Index into global message buffer
    511  1.1.1.2.4.2  rmind  *              Op                  - Parse node where error happened
    512  1.1.1.2.4.2  rmind  *              ExtraMessage        - additional error message
    513  1.1.1.2.4.2  rmind  *
    514  1.1.1.2.4.2  rmind  * RETURN:      None
    515  1.1.1.2.4.2  rmind  *
    516  1.1.1.2.4.2  rmind  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
    517  1.1.1.2.4.2  rmind  *              except the parser.)
    518  1.1.1.2.4.2  rmind  *
    519  1.1.1.2.4.2  rmind  ******************************************************************************/
    520  1.1.1.2.4.2  rmind 
    521  1.1.1.2.4.2  rmind void
    522  1.1.1.2.4.2  rmind AslError (
    523  1.1.1.2.4.2  rmind     UINT8                   Level,
    524  1.1.1.2.4.2  rmind     UINT8                   MessageId,
    525  1.1.1.2.4.2  rmind     ACPI_PARSE_OBJECT       *Op,
    526  1.1.1.2.4.2  rmind     char                    *ExtraMessage)
    527  1.1.1.2.4.2  rmind {
    528  1.1.1.2.4.2  rmind 
    529  1.1.1.2.4.2  rmind     switch (Level)
    530  1.1.1.2.4.2  rmind     {
    531  1.1.1.2.4.2  rmind     case ASL_WARNING2:
    532  1.1.1.2.4.2  rmind     case ASL_WARNING3:
    533  1.1.1.2.4.2  rmind         if (Gbl_WarningLevel < Level)
    534  1.1.1.2.4.2  rmind         {
    535  1.1.1.2.4.2  rmind             return;
    536  1.1.1.2.4.2  rmind         }
    537  1.1.1.2.4.2  rmind         break;
    538  1.1.1.2.4.2  rmind 
    539  1.1.1.2.4.2  rmind     default:
    540  1.1.1.2.4.2  rmind         break;
    541  1.1.1.2.4.2  rmind     }
    542  1.1.1.2.4.2  rmind 
    543  1.1.1.2.4.2  rmind 
    544  1.1.1.2.4.2  rmind     if (Op)
    545  1.1.1.2.4.2  rmind     {
    546  1.1.1.2.4.2  rmind         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
    547  1.1.1.2.4.2  rmind                         Op->Asl.LogicalLineNumber,
    548  1.1.1.2.4.2  rmind                         Op->Asl.LogicalByteOffset,
    549  1.1.1.2.4.2  rmind                         Op->Asl.Column,
    550  1.1.1.2.4.2  rmind                         Op->Asl.Filename, ExtraMessage);
    551  1.1.1.2.4.2  rmind     }
    552  1.1.1.2.4.2  rmind     else
    553  1.1.1.2.4.2  rmind     {
    554  1.1.1.2.4.2  rmind         AslCommonError (Level, MessageId, 0,
    555  1.1.1.2.4.2  rmind                         0, 0, 0, NULL, ExtraMessage);
    556  1.1.1.2.4.2  rmind     }
    557  1.1.1.2.4.2  rmind }
    558  1.1.1.2.4.2  rmind 
    559  1.1.1.2.4.2  rmind 
    560  1.1.1.2.4.2  rmind /*******************************************************************************
    561  1.1.1.2.4.2  rmind  *
    562  1.1.1.2.4.2  rmind  * FUNCTION:    AslCoreSubsystemError
    563  1.1.1.2.4.2  rmind  *
    564  1.1.1.2.4.2  rmind  * PARAMETERS:  Op                  - Parse node where error happened
    565  1.1.1.2.4.2  rmind  *              Status              - The ACPI CA Exception
    566  1.1.1.2.4.2  rmind  *              ExtraMessage        - additional error message
    567  1.1.1.2.4.2  rmind  *              Abort               - TRUE -> Abort compilation
    568  1.1.1.2.4.2  rmind  *
    569  1.1.1.2.4.2  rmind  * RETURN:      None
    570  1.1.1.2.4.2  rmind  *
    571  1.1.1.2.4.2  rmind  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPI
    572  1.1.1.2.4.2  rmind  *              CA core subsystem.
    573  1.1.1.2.4.2  rmind  *
    574  1.1.1.2.4.2  rmind  ******************************************************************************/
    575  1.1.1.2.4.2  rmind 
    576  1.1.1.2.4.2  rmind void
    577  1.1.1.2.4.2  rmind AslCoreSubsystemError (
    578  1.1.1.2.4.2  rmind     ACPI_PARSE_OBJECT       *Op,
    579  1.1.1.2.4.2  rmind     ACPI_STATUS             Status,
    580  1.1.1.2.4.2  rmind     char                    *ExtraMessage,
    581  1.1.1.2.4.2  rmind     BOOLEAN                 Abort)
    582  1.1.1.2.4.2  rmind {
    583  1.1.1.2.4.2  rmind 
    584  1.1.1.2.4.2  rmind     sprintf (MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
    585  1.1.1.2.4.2  rmind 
    586  1.1.1.2.4.2  rmind     if (Op)
    587  1.1.1.2.4.2  rmind     {
    588  1.1.1.2.4.2  rmind         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Op->Asl.LineNumber,
    589  1.1.1.2.4.2  rmind                         Op->Asl.LogicalLineNumber,
    590  1.1.1.2.4.2  rmind                         Op->Asl.LogicalByteOffset,
    591  1.1.1.2.4.2  rmind                         Op->Asl.Column,
    592  1.1.1.2.4.2  rmind                         Op->Asl.Filename, MsgBuffer);
    593  1.1.1.2.4.2  rmind     }
    594  1.1.1.2.4.2  rmind     else
    595  1.1.1.2.4.2  rmind     {
    596  1.1.1.2.4.2  rmind         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, 0,
    597  1.1.1.2.4.2  rmind                         0, 0, 0, NULL, MsgBuffer);
    598  1.1.1.2.4.2  rmind     }
    599  1.1.1.2.4.2  rmind 
    600  1.1.1.2.4.2  rmind     if (Abort)
    601  1.1.1.2.4.2  rmind     {
    602  1.1.1.2.4.2  rmind         AslAbort ();
    603  1.1.1.2.4.2  rmind     }
    604  1.1.1.2.4.2  rmind }
    605  1.1.1.2.4.2  rmind 
    606  1.1.1.2.4.2  rmind 
    607  1.1.1.2.4.2  rmind /*******************************************************************************
    608  1.1.1.2.4.2  rmind  *
    609  1.1.1.2.4.2  rmind  * FUNCTION:    AslCompilererror
    610  1.1.1.2.4.2  rmind  *
    611  1.1.1.2.4.2  rmind  * PARAMETERS:  CompilerMessage         - Error message from the parser
    612  1.1.1.2.4.2  rmind  *
    613  1.1.1.2.4.2  rmind  * RETURN:      Status (0 for now)
    614  1.1.1.2.4.2  rmind  *
    615  1.1.1.2.4.2  rmind  * DESCRIPTION: Report an error situation discovered in a production
    616  1.1.1.2.4.2  rmind  *              NOTE: don't change the name of this function, it is called
    617  1.1.1.2.4.2  rmind  *              from the auto-generated parser.
    618  1.1.1.2.4.2  rmind  *
    619  1.1.1.2.4.2  rmind  ******************************************************************************/
    620  1.1.1.2.4.2  rmind 
    621  1.1.1.2.4.2  rmind int
    622  1.1.1.2.4.2  rmind AslCompilererror (
    623  1.1.1.2.4.2  rmind     char                    *CompilerMessage)
    624  1.1.1.2.4.2  rmind {
    625  1.1.1.2.4.2  rmind 
    626  1.1.1.2.4.2  rmind     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
    627  1.1.1.2.4.2  rmind                     Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
    628  1.1.1.2.4.2  rmind                     Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
    629  1.1.1.2.4.2  rmind                     CompilerMessage);
    630  1.1.1.2.4.2  rmind 
    631  1.1.1.2.4.2  rmind     return 0;
    632  1.1.1.2.4.2  rmind }
    633  1.1.1.2.4.2  rmind 
    634  1.1.1.2.4.2  rmind 
    635