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