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