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