Home | History | Annotate | Line # | Download | only in compiler
aslerror.c revision 1.7
      1 /******************************************************************************
      2  *
      3  * Module Name: aslerror - Error handling and statistics
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2017, 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 #include "aslcompiler.h"
     45 
     46 #define _COMPONENT          ACPI_COMPILER
     47         ACPI_MODULE_NAME    ("aslerror")
     48 
     49 /* Local prototypes */
     50 
     51 static void
     52 AeAddToErrorLog (
     53     ASL_ERROR_MSG           *Enode);
     54 
     55 
     56 /*******************************************************************************
     57  *
     58  * FUNCTION:    AslAbort
     59  *
     60  * PARAMETERS:  None
     61  *
     62  * RETURN:      None
     63  *
     64  * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
     65  *              I/O errors.
     66  *
     67  ******************************************************************************/
     68 
     69 void
     70 AslAbort (
     71     void)
     72 {
     73 
     74     AePrintErrorLog (ASL_FILE_STDERR);
     75     if (Gbl_DebugFlag)
     76     {
     77         /* Print error summary to stdout also */
     78 
     79         AePrintErrorLog (ASL_FILE_STDOUT);
     80     }
     81 
     82     exit (1);
     83 }
     84 
     85 
     86 /*******************************************************************************
     87  *
     88  * FUNCTION:    AeClearErrorLog
     89  *
     90  * PARAMETERS:  None
     91  *
     92  * RETURN:      None
     93  *
     94  * DESCRIPTION: Empty the error list
     95  *
     96  ******************************************************************************/
     97 
     98 void
     99 AeClearErrorLog (
    100     void)
    101 {
    102     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
    103     ASL_ERROR_MSG           *Next;
    104 
    105     /* Walk the error node list */
    106 
    107     while (Enode)
    108     {
    109         Next = Enode->Next;
    110         ACPI_FREE (Enode);
    111         Enode = Next;
    112     }
    113 
    114     Gbl_ErrorLog = NULL;
    115 }
    116 
    117 
    118 /*******************************************************************************
    119  *
    120  * FUNCTION:    AeAddToErrorLog
    121  *
    122  * PARAMETERS:  Enode       - An error node to add to the log
    123  *
    124  * RETURN:      None
    125  *
    126  * DESCRIPTION: Add a new error node to the error log. The error log is
    127  *              ordered by the "logical" line number (cumulative line number
    128  *              including all include files.)
    129  *
    130  ******************************************************************************/
    131 
    132 static void
    133 AeAddToErrorLog (
    134     ASL_ERROR_MSG           *Enode)
    135 {
    136     ASL_ERROR_MSG           *Next;
    137     ASL_ERROR_MSG           *Prev;
    138 
    139 
    140     /* If Gbl_ErrorLog is null, this is the first error node */
    141 
    142     if (!Gbl_ErrorLog)
    143     {
    144         Gbl_ErrorLog = Enode;
    145         return;
    146     }
    147 
    148     /*
    149      * Walk error list until we find a line number greater than ours.
    150      * List is sorted according to line number.
    151      */
    152     Prev = NULL;
    153     Next = Gbl_ErrorLog;
    154 
    155     while ((Next) &&
    156            (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
    157     {
    158         Prev = Next;
    159         Next = Next->Next;
    160     }
    161 
    162     /* Found our place in the list */
    163 
    164     Enode->Next = Next;
    165 
    166     if (Prev)
    167     {
    168         Prev->Next = Enode;
    169     }
    170     else
    171     {
    172         Gbl_ErrorLog = Enode;
    173     }
    174 }
    175 
    176 
    177 /*******************************************************************************
    178  *
    179  * FUNCTION:    AePrintException
    180  *
    181  * PARAMETERS:  FileId          - ID of output file
    182  *              Enode           - Error node to print
    183  *              Header          - Additional text before each message
    184  *
    185  * RETURN:      None
    186  *
    187  * DESCRIPTION: Print the contents of an error node.
    188  *
    189  * NOTE:        We don't use the FlxxxFile I/O functions here because on error
    190  *              they abort the compiler and call this function!  Since we
    191  *              are reporting errors here, we ignore most output errors and
    192  *              just try to get out as much as we can.
    193  *
    194  ******************************************************************************/
    195 
    196 void
    197 AePrintException (
    198     UINT32                  FileId,
    199     ASL_ERROR_MSG           *Enode,
    200     char                    *Header)
    201 {
    202     UINT8                   SourceByte;
    203     int                     Actual;
    204     size_t                  RActual;
    205     UINT32                  MsgLength;
    206     const char              *MainMessage;
    207     char                    *ExtraMessage;
    208     UINT32                  SourceColumn;
    209     UINT32                  ErrorColumn;
    210     FILE                    *OutputFile;
    211     FILE                    *SourceFile = NULL;
    212     long                    FileSize;
    213     BOOLEAN                 PrematureEOF = FALSE;
    214     UINT32                  Total = 0;
    215 
    216 
    217     if (Gbl_NoErrors)
    218     {
    219         return;
    220     }
    221 
    222     /*
    223      * Only listing files have a header, and remarks/optimizations
    224      * are always output
    225      */
    226     if (!Header)
    227     {
    228         /* Ignore remarks if requested */
    229 
    230         switch (Enode->Level)
    231         {
    232         case ASL_WARNING:
    233         case ASL_WARNING2:
    234         case ASL_WARNING3:
    235 
    236             if (!Gbl_DisplayWarnings)
    237             {
    238                 return;
    239             }
    240             break;
    241 
    242         case ASL_REMARK:
    243 
    244             if (!Gbl_DisplayRemarks)
    245             {
    246                 return;
    247             }
    248             break;
    249 
    250         case ASL_OPTIMIZATION:
    251 
    252             if (!Gbl_DisplayOptimizations)
    253             {
    254                 return;
    255             }
    256             break;
    257 
    258         default:
    259 
    260             break;
    261         }
    262     }
    263 
    264     /* Get the various required file handles */
    265 
    266     OutputFile = Gbl_Files[FileId].Handle;
    267 
    268     if (!Enode->SourceLine)
    269     {
    270         /*
    271          * Use the merged header/source file if present, otherwise
    272          * use input file
    273          */
    274         SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
    275         if (!SourceFile)
    276         {
    277             SourceFile = Gbl_Files[ASL_FILE_INPUT].Handle;
    278         }
    279 
    280         if (SourceFile)
    281         {
    282             /* Determine if the error occurred at source file EOF */
    283 
    284             fseek (SourceFile, 0, SEEK_END);
    285             FileSize = ftell (SourceFile);
    286 
    287             if ((long) Enode->LogicalByteOffset >= FileSize)
    288             {
    289                 PrematureEOF = TRUE;
    290             }
    291         }
    292     }
    293 
    294     if (Header)
    295     {
    296         fprintf (OutputFile, "%s", Header);
    297     }
    298 
    299     /* Print filename and line number if present and valid */
    300 
    301     if (Enode->Filename)
    302     {
    303         if (Gbl_VerboseErrors)
    304         {
    305             fprintf (OutputFile, "%-8s", Enode->Filename);
    306 
    307             if (Enode->LineNumber)
    308             {
    309                 if (Enode->SourceLine)
    310                 {
    311                     fprintf (OutputFile, " %6u: %s",
    312                         Enode->LineNumber, Enode->SourceLine);
    313                 }
    314                 else
    315                 {
    316                     fprintf (OutputFile, " %6u: ", Enode->LineNumber);
    317 
    318                     /*
    319                      * If not at EOF, get the corresponding source code line
    320                      * and display it. Don't attempt this if we have a
    321                      * premature EOF condition.
    322                      */
    323                     if (!PrematureEOF)
    324                     {
    325                         /*
    326                          * Seek to the offset in the combined source file,
    327                          * read the source line, and write it to the output.
    328                          */
    329                         Actual = fseek (SourceFile,
    330                             (long) Enode->LogicalByteOffset, (int) SEEK_SET);
    331                         if (Actual)
    332                         {
    333                             fprintf (OutputFile,
    334                                 "[*** iASL: Seek error on source code temp file %s ***]",
    335                                 Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    336                         }
    337                         else
    338                         {
    339                             RActual = fread (&SourceByte, 1, 1, SourceFile);
    340                             if (RActual != 1)
    341                             {
    342                                 fprintf (OutputFile,
    343                                     "[*** iASL: Read error on source code temp file %s ***]",
    344                                     Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    345                             }
    346                             else
    347                             {
    348                                 /* Read/write the source line, up to the maximum line length */
    349 
    350                                 while (RActual && SourceByte && (SourceByte != '\n'))
    351                                 {
    352                                     if (Total < 256)
    353                                     {
    354                                         /* After the max line length, we will just read the line, no write */
    355 
    356                                         if (fwrite (&SourceByte, 1, 1, OutputFile) != 1)
    357                                         {
    358                                             printf ("[*** iASL: Write error on output file ***]\n");
    359                                             return;
    360                                         }
    361                                     }
    362                                     else if (Total == 256)
    363                                     {
    364                                         fprintf (OutputFile,
    365                                             "\n[*** iASL: Very long input line, message below refers to column %u ***]",
    366                                             Enode->Column);
    367                                     }
    368 
    369                                     RActual = fread (&SourceByte, 1, 1, SourceFile);
    370                                     if (RActual != 1)
    371                                     {
    372                                         fprintf (OutputFile,
    373                                             "[*** iASL: Read error on source code temp file %s ***]",
    374                                             Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
    375                                         return;
    376                                     }
    377                                     Total++;
    378                                 }
    379                             }
    380                         }
    381                     }
    382 
    383                     fprintf (OutputFile, "\n");
    384                 }
    385             }
    386         }
    387         else
    388         {
    389             /*
    390              * Less verbose version of the error message, enabled via the
    391              * -vi switch. The format is compatible with MS Visual Studio.
    392              */
    393             fprintf (OutputFile, "%s", Enode->Filename);
    394 
    395             if (Enode->LineNumber)
    396             {
    397                 fprintf (OutputFile, "(%u) : ",
    398                     Enode->LineNumber);
    399             }
    400         }
    401     }
    402 
    403     /* If a NULL message ID, just print the raw message */
    404 
    405     if (Enode->MessageId == 0)
    406     {
    407         fprintf (OutputFile, "%s\n", Enode->Message);
    408         return;
    409     }
    410 
    411     /* Decode the message ID */
    412 
    413     fprintf (OutputFile, "%s %4.4d -",
    414         AeDecodeExceptionLevel (Enode->Level),
    415         AeBuildFullExceptionCode (Enode->Level, Enode->MessageId));
    416 
    417     MainMessage = AeDecodeMessageId (Enode->MessageId);
    418     ExtraMessage = Enode->Message;
    419 
    420     /* If a NULL line number, just print the decoded message */
    421 
    422     if (!Enode->LineNumber)
    423     {
    424         fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
    425         return;
    426     }
    427 
    428     MsgLength = strlen (MainMessage);
    429     if (MsgLength == 0)
    430     {
    431         /* Use the secondary/extra message as main message */
    432 
    433         MainMessage = Enode->Message;
    434         if (!MainMessage)
    435         {
    436             MainMessage = "";
    437         }
    438 
    439         MsgLength = strlen (MainMessage);
    440         ExtraMessage = NULL;
    441     }
    442 
    443     if (Gbl_VerboseErrors && !PrematureEOF)
    444     {
    445         if (Total >= 256)
    446         {
    447             fprintf (OutputFile, "    %s",
    448                 MainMessage);
    449         }
    450         else
    451         {
    452             SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
    453             ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
    454 
    455             if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
    456             {
    457                 fprintf (OutputFile, "%*s%s",
    458                     (int) ((SourceColumn - 1) - ErrorColumn),
    459                     MainMessage, " ^ ");
    460             }
    461             else
    462             {
    463                 fprintf (OutputFile, "%*s %s",
    464                     (int) ((SourceColumn - ErrorColumn) + 1), "^",
    465                     MainMessage);
    466             }
    467         }
    468     }
    469     else
    470     {
    471         fprintf (OutputFile, " %s", MainMessage);
    472     }
    473 
    474     /* Print the extra info message if present */
    475 
    476     if (ExtraMessage)
    477     {
    478         fprintf (OutputFile, " (%s)", ExtraMessage);
    479     }
    480 
    481     if (PrematureEOF)
    482     {
    483         fprintf (OutputFile, " and premature End-Of-File");
    484     }
    485 
    486     fprintf (OutputFile, "\n");
    487     if (Gbl_VerboseErrors)
    488     {
    489         fprintf (OutputFile, "\n");
    490     }
    491 }
    492 
    493 
    494 /*******************************************************************************
    495  *
    496  * FUNCTION:    AePrintErrorLog
    497  *
    498  * PARAMETERS:  FileId           - Where to output the error log
    499  *
    500  * RETURN:      None
    501  *
    502  * DESCRIPTION: Print the entire contents of the error log
    503  *
    504  ******************************************************************************/
    505 
    506 void
    507 AePrintErrorLog (
    508     UINT32                  FileId)
    509 {
    510     ASL_ERROR_MSG           *Enode = Gbl_ErrorLog;
    511 
    512 
    513     /* Walk the error node list */
    514 
    515     while (Enode)
    516     {
    517         AePrintException (FileId, Enode, NULL);
    518         Enode = Enode->Next;
    519     }
    520 }
    521 
    522 
    523 /*******************************************************************************
    524  *
    525  * FUNCTION:    AslCommonError2
    526  *
    527  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    528  *              MessageId           - Index into global message buffer
    529  *              LineNumber          - Actual file line number
    530  *              Column              - Column in current line
    531  *              SourceLine          - Actual source code line
    532  *              Filename            - source filename
    533  *              ExtraMessage        - additional error message
    534  *
    535  * RETURN:      None
    536  *
    537  * DESCRIPTION: Create a new error node and add it to the error log
    538  *
    539  ******************************************************************************/
    540 
    541 void
    542 AslCommonError2 (
    543     UINT8                   Level,
    544     UINT16                  MessageId,
    545     UINT32                  LineNumber,
    546     UINT32                  Column,
    547     char                    *SourceLine,
    548     char                    *Filename,
    549     char                    *ExtraMessage)
    550 {
    551     char                    *MessageBuffer = NULL;
    552     char                    *LineBuffer;
    553     ASL_ERROR_MSG           *Enode;
    554 
    555 
    556     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
    557 
    558     if (ExtraMessage)
    559     {
    560         /* Allocate a buffer for the message and a new error node */
    561 
    562         MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1);
    563 
    564         /* Keep a copy of the extra message */
    565 
    566         strcpy (MessageBuffer, ExtraMessage);
    567     }
    568 
    569     LineBuffer = UtLocalCalloc (strlen (SourceLine) + 1);
    570     strcpy (LineBuffer, SourceLine);
    571 
    572     /* Initialize the error node */
    573 
    574     if (Filename)
    575     {
    576         Enode->Filename = Filename;
    577         Enode->FilenameLength = strlen (Filename);
    578         if (Enode->FilenameLength < 6)
    579         {
    580             Enode->FilenameLength = 6;
    581         }
    582     }
    583 
    584     Enode->MessageId            = MessageId;
    585     Enode->Level                = Level;
    586     Enode->LineNumber           = LineNumber;
    587     Enode->LogicalLineNumber    = LineNumber;
    588     Enode->LogicalByteOffset    = 0;
    589     Enode->Column               = Column;
    590     Enode->Message              = MessageBuffer;
    591     Enode->SourceLine           = LineBuffer;
    592 
    593     /* Add the new node to the error node list */
    594 
    595     AeAddToErrorLog (Enode);
    596 
    597     if (Gbl_DebugFlag)
    598     {
    599         /* stderr is a file, send error to it immediately */
    600 
    601         AePrintException (ASL_FILE_STDERR, Enode, NULL);
    602     }
    603 
    604     Gbl_ExceptionCount[Level]++;
    605 }
    606 
    607 
    608 /*******************************************************************************
    609  *
    610  * FUNCTION:    AslCommonError
    611  *
    612  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    613  *              MessageId           - Index into global message buffer
    614  *              CurrentLineNumber   - Actual file line number
    615  *              LogicalLineNumber   - Cumulative line number
    616  *              LogicalByteOffset   - Byte offset in source file
    617  *              Column              - Column in current line
    618  *              Filename            - source filename
    619  *              ExtraMessage        - additional error message
    620  *
    621  * RETURN:      None
    622  *
    623  * DESCRIPTION: Create a new error node and add it to the error log
    624  *
    625  ******************************************************************************/
    626 
    627 void
    628 AslCommonError (
    629     UINT8                   Level,
    630     UINT16                  MessageId,
    631     UINT32                  CurrentLineNumber,
    632     UINT32                  LogicalLineNumber,
    633     UINT32                  LogicalByteOffset,
    634     UINT32                  Column,
    635     char                    *Filename,
    636     char                    *ExtraMessage)
    637 {
    638     char                    *MessageBuffer = NULL;
    639     ASL_ERROR_MSG           *Enode;
    640 
    641 
    642     Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
    643 
    644     if (ExtraMessage)
    645     {
    646         /* Allocate a buffer for the message and a new error node */
    647 
    648         MessageBuffer = UtStringCacheCalloc (strlen (ExtraMessage) + 1);
    649 
    650         /* Keep a copy of the extra message */
    651 
    652         strcpy (MessageBuffer, ExtraMessage);
    653     }
    654 
    655     /* Initialize the error node */
    656 
    657     if (Filename)
    658     {
    659         Enode->Filename = Filename;
    660         Enode->FilenameLength = strlen (Filename);
    661         if (Enode->FilenameLength < 6)
    662         {
    663             Enode->FilenameLength = 6;
    664         }
    665     }
    666 
    667     Enode->MessageId            = MessageId;
    668     Enode->Level                = Level;
    669     Enode->LineNumber           = CurrentLineNumber;
    670     Enode->LogicalLineNumber    = LogicalLineNumber;
    671     Enode->LogicalByteOffset    = LogicalByteOffset;
    672     Enode->Column               = Column;
    673     Enode->Message              = MessageBuffer;
    674     Enode->SourceLine           = NULL;
    675 
    676     /* Add the new node to the error node list */
    677 
    678     AeAddToErrorLog (Enode);
    679 
    680     if (Gbl_DebugFlag)
    681     {
    682         /* stderr is a file, send error to it immediately */
    683 
    684         AePrintException (ASL_FILE_STDERR, Enode, NULL);
    685     }
    686 
    687     Gbl_ExceptionCount[Level]++;
    688     if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
    689     {
    690         printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT);
    691 
    692         Gbl_SourceLine = 0;
    693         Gbl_NextError = Gbl_ErrorLog;
    694         CmCleanupAndExit ();
    695         exit(1);
    696     }
    697 
    698     return;
    699 }
    700 
    701 
    702 /*******************************************************************************
    703  *
    704  * FUNCTION:    AslDisableException
    705  *
    706  * PARAMETERS:  MessageIdString     - ID to be disabled
    707  *
    708  * RETURN:      Status
    709  *
    710  * DESCRIPTION: Enter a message ID into the global disabled messages table
    711  *
    712  ******************************************************************************/
    713 
    714 ACPI_STATUS
    715 AslDisableException (
    716     char                    *MessageIdString)
    717 {
    718     UINT32                  MessageId;
    719 
    720 
    721     /* Convert argument to an integer and validate it */
    722 
    723     MessageId = (UINT32) strtoul (MessageIdString, NULL, 0);
    724 
    725     if ((MessageId < 2000) || (MessageId > 5999))
    726     {
    727         printf ("\"%s\" is not a valid warning/remark ID\n",
    728             MessageIdString);
    729         return (AE_BAD_PARAMETER);
    730     }
    731 
    732     /* Insert value into the global disabled message array */
    733 
    734     if (Gbl_DisabledMessagesIndex >= ASL_MAX_DISABLED_MESSAGES)
    735     {
    736         printf ("Too many messages have been disabled (max %u)\n",
    737             ASL_MAX_DISABLED_MESSAGES);
    738         return (AE_LIMIT);
    739     }
    740 
    741     Gbl_DisabledMessages[Gbl_DisabledMessagesIndex] = MessageId;
    742     Gbl_DisabledMessagesIndex++;
    743     return (AE_OK);
    744 }
    745 
    746 
    747 /*******************************************************************************
    748  *
    749  * FUNCTION:    AslIsExceptionDisabled
    750  *
    751  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    752  *              MessageId           - Index into global message buffer
    753  *
    754  * RETURN:      TRUE if exception/message should be ignored
    755  *
    756  * DESCRIPTION: Check if the user has specified options such that this
    757  *              exception should be ignored
    758  *
    759  ******************************************************************************/
    760 
    761 BOOLEAN
    762 AslIsExceptionDisabled (
    763     UINT8                   Level,
    764     UINT16                  MessageId)
    765 {
    766     UINT32                  EncodedMessageId;
    767     UINT32                  i;
    768 
    769 
    770     switch (Level)
    771     {
    772     case ASL_WARNING2:
    773     case ASL_WARNING3:
    774 
    775         /* Check for global disable via -w1/-w2/-w3 options */
    776 
    777         if (Level > Gbl_WarningLevel)
    778         {
    779             return (TRUE);
    780         }
    781         /* Fall through */
    782 
    783     case ASL_WARNING:
    784     case ASL_REMARK:
    785         /*
    786          * Ignore this warning/remark if it has been disabled by
    787          * the user (-vw option)
    788          */
    789         EncodedMessageId = AeBuildFullExceptionCode (Level, MessageId);
    790         for (i = 0; i < Gbl_DisabledMessagesIndex; i++)
    791         {
    792             /* Simple implementation via fixed array */
    793 
    794             if (EncodedMessageId == Gbl_DisabledMessages[i])
    795             {
    796                 return (TRUE);
    797             }
    798         }
    799         break;
    800 
    801     default:
    802         break;
    803     }
    804 
    805     return (FALSE);
    806 }
    807 
    808 
    809 /*******************************************************************************
    810  *
    811  * FUNCTION:    AslError
    812  *
    813  * PARAMETERS:  Level               - Seriousness (Warning/error, etc.)
    814  *              MessageId           - Index into global message buffer
    815  *              Op                  - Parse node where error happened
    816  *              ExtraMessage        - additional error message
    817  *
    818  * RETURN:      None
    819  *
    820  * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
    821  *              except the parser.)
    822  *
    823  ******************************************************************************/
    824 
    825 void
    826 AslError (
    827     UINT8                   Level,
    828     UINT16                  MessageId,
    829     ACPI_PARSE_OBJECT       *Op,
    830     char                    *ExtraMessage)
    831 {
    832 
    833     /* Check if user wants to ignore this exception */
    834 
    835     if (Gbl_AllExceptionsDisabled ||
    836         AslIsExceptionDisabled (Level, MessageId))
    837     {
    838         return;
    839     }
    840 
    841     if (Op)
    842     {
    843         AslCommonError (Level, MessageId, Op->Asl.LineNumber,
    844             Op->Asl.LogicalLineNumber,
    845             Op->Asl.LogicalByteOffset,
    846             Op->Asl.Column,
    847             Op->Asl.Filename, ExtraMessage);
    848     }
    849     else
    850     {
    851         AslCommonError (Level, MessageId, 0,
    852             0, 0, 0, NULL, ExtraMessage);
    853     }
    854 }
    855 
    856 
    857 /*******************************************************************************
    858  *
    859  * FUNCTION:    AslCoreSubsystemError
    860  *
    861  * PARAMETERS:  Op                  - Parse node where error happened
    862  *              Status              - The ACPICA Exception
    863  *              ExtraMessage        - additional error message
    864  *              Abort               - TRUE -> Abort compilation
    865  *
    866  * RETURN:      None
    867  *
    868  * DESCRIPTION: Error reporting routine for exceptions returned by the ACPICA
    869  *              core subsystem.
    870  *
    871  ******************************************************************************/
    872 
    873 void
    874 AslCoreSubsystemError (
    875     ACPI_PARSE_OBJECT       *Op,
    876     ACPI_STATUS             Status,
    877     char                    *ExtraMessage,
    878     BOOLEAN                 Abort)
    879 {
    880 
    881     snprintf (MsgBuffer, sizeof(MsgBuffer), "%s %s", AcpiFormatException (Status), ExtraMessage);
    882 
    883     if (Op)
    884     {
    885         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
    886             Op->Asl.LineNumber,
    887             Op->Asl.LogicalLineNumber,
    888             Op->Asl.LogicalByteOffset,
    889             Op->Asl.Column,
    890             Op->Asl.Filename, MsgBuffer);
    891     }
    892     else
    893     {
    894         AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION,
    895             0, 0, 0, 0, NULL, MsgBuffer);
    896     }
    897 
    898     if (Abort)
    899     {
    900         AslAbort ();
    901     }
    902 }
    903 
    904 
    905 /*******************************************************************************
    906  *
    907  * FUNCTION:    AslCompilererror
    908  *
    909  * PARAMETERS:  CompilerMessage         - Error message from the parser
    910  *
    911  * RETURN:      Status (0 for now)
    912  *
    913  * DESCRIPTION: Report an error situation discovered in a production
    914  *              NOTE: don't change the name of this function, it is called
    915  *              from the auto-generated parser.
    916  *
    917  ******************************************************************************/
    918 
    919 int
    920 AslCompilererror (
    921     const char              *CompilerMessage)
    922 {
    923 
    924     Gbl_SyntaxError++;
    925 
    926     AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
    927         Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
    928         Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
    929         ACPI_CAST_PTR (char, CompilerMessage));
    930 
    931     return (0);
    932 }
    933