aslstartup.c revision 241973
1227064Sbz/******************************************************************************
2250340Sdavidcs *
3227064Sbz * Module Name: aslstartup - Compiler startup routines, called from main
4227064Sbz *
5227064Sbz *****************************************************************************/
6227064Sbz
7227064Sbz/*
8227064Sbz * Copyright (C) 2000 - 2012, Intel Corp.
9227064Sbz * All rights reserved.
10227064Sbz *
11227064Sbz * Redistribution and use in source and binary forms, with or without
12227064Sbz * modification, are permitted provided that the following conditions
13227064Sbz * are met:
14227064Sbz * 1. Redistributions of source code must retain the above copyright
15227064Sbz *    notice, this list of conditions, and the following disclaimer,
16227064Sbz *    without modification.
17227064Sbz * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18227064Sbz *    substantially similar to the "NO WARRANTY" disclaimer below
19227064Sbz *    ("Disclaimer") and any redistribution must be conditioned upon
20227064Sbz *    including a substantially similar Disclaimer requirement for further
21227064Sbz *    binary redistribution.
22227064Sbz * 3. Neither the names of the above-listed copyright holders nor the names
23227064Sbz *    of any contributors may be used to endorse or promote products derived
24227064Sbz *    from this software without specific prior written permission.
25227064Sbz *
26227064Sbz * Alternatively, this software may be distributed under the terms of the
27227064Sbz * GNU General Public License ("GPL") version 2 as published by the Free
28227064Sbz * Software Foundation.
29227064Sbz *
30227064Sbz * NO WARRANTY
31227064Sbz * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32227064Sbz * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33227064Sbz * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34227064Sbz * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35227064Sbz * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36227064Sbz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37227064Sbz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38227064Sbz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39227064Sbz * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40227064Sbz * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41227064Sbz * POSSIBILITY OF SUCH DAMAGES.
42227064Sbz */
43227064Sbz
44227064Sbz
45227064Sbz#include <contrib/dev/acpica/compiler/aslcompiler.h>
46227064Sbz#include <contrib/dev/acpica/include/actables.h>
47227064Sbz#include <contrib/dev/acpica/include/acapps.h>
48227064Sbz
49227064Sbz#define _COMPONENT          ACPI_COMPILER
50227064Sbz        ACPI_MODULE_NAME    ("aslstartup")
51227064Sbz
52227064Sbz
53227064Sbz#define ASL_MAX_FILES   256
54227064Sbzstatic char             *FileList[ASL_MAX_FILES];
55227064Sbzstatic BOOLEAN          AslToFile = TRUE;
56227064Sbz
57227064Sbz
58227064Sbz/* Local prototypes */
59227064Sbz
60227064Sbzstatic char **
61227064SbzAsDoWildcard (
62227064Sbz    char                    *DirectoryPathname,
63227064Sbz    char                    *FileSpecifier);
64227064Sbz
65227064Sbzstatic UINT8
66227064SbzAslDetectSourceFileType (
67227064Sbz    ASL_FILE_INFO           *Info);
68227064Sbz
69227064Sbz
70227064Sbz/*******************************************************************************
71227064Sbz *
72227064Sbz * FUNCTION:    AslInitializeGlobals
73227064Sbz *
74227064Sbz * PARAMETERS:  None
75227064Sbz *
76227064Sbz * RETURN:      None
77227064Sbz *
78227064Sbz * DESCRIPTION: Re-initialize globals needed to restart the compiler. This
79227064Sbz *              allows multiple files to be disassembled and/or compiled.
80227064Sbz *
81227064Sbz ******************************************************************************/
82227064Sbz
83227064Sbzvoid
84227064SbzAslInitializeGlobals (
85227064Sbz    void)
86227064Sbz{
87227064Sbz    UINT32                  i;
88227064Sbz
89227064Sbz
90227064Sbz    /* Init compiler globals */
91227064Sbz
92227064Sbz    Gbl_CurrentColumn = 0;
93227064Sbz    Gbl_CurrentLineNumber = 1;
94227064Sbz    Gbl_LogicalLineNumber = 1;
95227064Sbz    Gbl_CurrentLineOffset = 0;
96227064Sbz    Gbl_InputFieldCount = 0;
97227064Sbz    Gbl_InputByteCount = 0;
98227064Sbz    Gbl_NsLookupCount = 0;
99227064Sbz    Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
100227064Sbz
101227064Sbz    Gbl_ErrorLog = NULL;
102227064Sbz    Gbl_NextError = NULL;
103227064Sbz    Gbl_Signature = NULL;
104227064Sbz    Gbl_FileType = 0;
105227064Sbz
106227064Sbz    TotalExecutableOpcodes = 0;
107227064Sbz    TotalNamedObjects = 0;
108227064Sbz    TotalKeywords = 0;
109227064Sbz    TotalParseNodes = 0;
110227064Sbz    TotalMethods = 0;
111227064Sbz    TotalAllocations = 0;
112227064Sbz    TotalAllocated = 0;
113227064Sbz    TotalFolds = 0;
114227064Sbz
115227064Sbz    AslGbl_NextEvent = 0;
116227064Sbz    for (i = 0; i < ASL_NUM_REPORT_LEVELS; i++)
117227064Sbz    {
118227064Sbz        Gbl_ExceptionCount[i] = 0;
119227064Sbz    }
120227064Sbz
121227064Sbz    for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++)
122227064Sbz    {
123227064Sbz        Gbl_Files[i].Handle = NULL;
124227064Sbz        Gbl_Files[i].Filename = NULL;
125227064Sbz    }
126227064Sbz}
127227064Sbz
128227064Sbz
129227064Sbz/******************************************************************************
130227064Sbz *
131227064Sbz * FUNCTION:    AsDoWildcard
132227064Sbz *
133227064Sbz * PARAMETERS:  None
134227064Sbz *
135227064Sbz * RETURN:      None
136227064Sbz *
137227064Sbz * DESCRIPTION: Process files via wildcards. This function is for the Windows
138227064Sbz *              case only.
139227064Sbz *
140227064Sbz ******************************************************************************/
141227064Sbz
142227064Sbzstatic char **
143227064SbzAsDoWildcard (
144227064Sbz    char                    *DirectoryPathname,
145227064Sbz    char                    *FileSpecifier)
146227064Sbz{
147227064Sbz#ifdef WIN32
148227064Sbz    void                    *DirInfo;
149227064Sbz    char                    *Filename;
150227064Sbz    int                     FileCount;
151227064Sbz
152227064Sbz
153227064Sbz    FileCount = 0;
154227064Sbz
155227064Sbz    /* Open parent directory */
156227064Sbz
157227064Sbz    DirInfo = AcpiOsOpenDirectory (DirectoryPathname, FileSpecifier, REQUEST_FILE_ONLY);
158227064Sbz    if (!DirInfo)
159227064Sbz    {
160227064Sbz        /* Either the directory of file does not exist */
161227064Sbz
162227064Sbz        Gbl_Files[ASL_FILE_INPUT].Filename = FileSpecifier;
163227064Sbz        FlFileError (ASL_FILE_INPUT, ASL_MSG_OPEN);
164227064Sbz        AslAbort ();
165227064Sbz    }
166227064Sbz
167227064Sbz    /* Process each file that matches the wildcard specification */
168227064Sbz
169227064Sbz    while ((Filename = AcpiOsGetNextFilename (DirInfo)))
170227064Sbz    {
171227064Sbz        /* Add the filename to the file list */
172227064Sbz
173227064Sbz        FileList[FileCount] = AcpiOsAllocate (strlen (Filename) + 1);
174227064Sbz        strcpy (FileList[FileCount], Filename);
175227064Sbz        FileCount++;
176227064Sbz
177227064Sbz        if (FileCount >= ASL_MAX_FILES)
178227064Sbz        {
179227064Sbz            printf ("Max files reached\n");
180227064Sbz            FileList[0] = NULL;
181227064Sbz            return (FileList);
182227064Sbz        }
183227064Sbz    }
184227064Sbz
185227064Sbz    /* Cleanup */
186227064Sbz
187227064Sbz    AcpiOsCloseDirectory (DirInfo);
188227064Sbz    FileList[FileCount] = NULL;
189227064Sbz    return (FileList);
190227064Sbz
191227064Sbz#else
192227064Sbz    /*
193227064Sbz     * Linux/Unix cases - Wildcards are expanded by the shell automatically.
194227064Sbz     * Just return the filename in a null terminated list
195227064Sbz     */
196227064Sbz    FileList[0] = AcpiOsAllocate (strlen (FileSpecifier) + 1);
197227064Sbz    strcpy (FileList[0], FileSpecifier);
198227064Sbz    FileList[1] = NULL;
199227064Sbz
200227064Sbz    return (FileList);
201227064Sbz#endif
202227064Sbz}
203227064Sbz
204227064Sbz
205227064Sbz/*******************************************************************************
206227064Sbz *
207227064Sbz * FUNCTION:    AslDetectSourceFileType
208227064Sbz *
209227064Sbz * PARAMETERS:  Info            - Name/Handle for the file (must be open)
210227064Sbz *
211227064Sbz * RETURN:      File Type
212227064Sbz *
213227064Sbz * DESCRIPTION: Determine the type of the input file. Either binary (contains
214227064Sbz *              non-ASCII characters), ASL file, or an ACPI Data Table file.
215227064Sbz *
216227064Sbz ******************************************************************************/
217227064Sbz
218227064Sbzstatic UINT8
219227064SbzAslDetectSourceFileType (
220227064Sbz    ASL_FILE_INFO           *Info)
221227064Sbz{
222227064Sbz    char                    *FileChar;
223227064Sbz    UINT8                   Type;
224227064Sbz    ACPI_STATUS             Status;
225227064Sbz
226227064Sbz
227227064Sbz    /* Check for 100% ASCII source file (comments are ignored) */
228227064Sbz
229227064Sbz    Status = FlCheckForAscii (Info->Handle, Info->Filename, TRUE);
230227064Sbz    if (ACPI_FAILURE (Status))
231227064Sbz    {
232227064Sbz        printf ("Non-ascii input file - %s\n", Info->Filename);
233227064Sbz
234227064Sbz        if (!Gbl_IgnoreErrors)
235227064Sbz        {
236227064Sbz            Type = ASL_INPUT_TYPE_BINARY;
237227064Sbz            goto Cleanup;
238227064Sbz        }
239227064Sbz    }
240227064Sbz
241227064Sbz    /*
242227064Sbz     * File is ASCII. Determine if this is an ASL file or an ACPI data
243227064Sbz     * table file.
244227064Sbz     */
245227064Sbz    while (fgets (Gbl_CurrentLineBuffer, Gbl_LineBufferSize, Info->Handle))
246227064Sbz    {
247227064Sbz        /* Uppercase the buffer for caseless compare */
248227064Sbz
249227064Sbz        FileChar = Gbl_CurrentLineBuffer;
250227064Sbz        while (*FileChar)
251227064Sbz        {
252227064Sbz            *FileChar = (char) toupper ((int) *FileChar);
253227064Sbz            FileChar++;
254227064Sbz        }
255227064Sbz
256227064Sbz        /* Presence of "DefinitionBlock" indicates actual ASL code */
257227064Sbz
258227064Sbz        if (strstr (Gbl_CurrentLineBuffer, "DEFINITIONBLOCK"))
259227064Sbz        {
260227064Sbz            /* Appears to be an ASL file */
261227064Sbz
262227064Sbz            Type = ASL_INPUT_TYPE_ASCII_ASL;
263227064Sbz            goto Cleanup;
264227064Sbz        }
265227064Sbz    }
266227064Sbz
267227064Sbz    /* Not an ASL source file, default to a data table source file */
268227064Sbz
269227064Sbz    Type = ASL_INPUT_TYPE_ASCII_DATA;
270227064Sbz
271227064SbzCleanup:
272227064Sbz
273227064Sbz    /* Must seek back to the start of the file */
274227064Sbz
275227064Sbz    fseek (Info->Handle, 0, SEEK_SET);
276227064Sbz    return (Type);
277227064Sbz}
278227064Sbz
279227064Sbz
280227064Sbz/*******************************************************************************
281227064Sbz *
282227064Sbz * FUNCTION:    AslDoOneFile
283227064Sbz *
284227064Sbz * PARAMETERS:  Filename        - Name of the file
285227064Sbz *
286227064Sbz * RETURN:      Status
287227064Sbz *
288227064Sbz * DESCRIPTION: Process a single file - either disassemble, compile, or both
289227064Sbz *
290227064Sbz ******************************************************************************/
291227064Sbz
292227064SbzACPI_STATUS
293227064SbzAslDoOneFile (
294227064Sbz    char                    *Filename)
295227064Sbz{
296227064Sbz    ACPI_STATUS             Status;
297227064Sbz
298227064Sbz
299227064Sbz    /* Re-initialize "some" compiler/preprocessor globals */
300227064Sbz
301227064Sbz    AslInitializeGlobals ();
302227064Sbz    PrInitializeGlobals ();
303227064Sbz
304227064Sbz    Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
305227064Sbz
306227064Sbz    /*
307227064Sbz     * AML Disassembly (Optional)
308227064Sbz     */
309227064Sbz    if (Gbl_DisasmFlag || Gbl_GetAllTables)
310227064Sbz    {
311227064Sbz        /* ACPICA subsystem initialization */
312227064Sbz
313227064Sbz        Status = AdInitialize ();
314227064Sbz        if (ACPI_FAILURE (Status))
315227064Sbz        {
316227064Sbz            return (Status);
317227064Sbz        }
318227064Sbz
319227064Sbz        Status = AcpiAllocateRootTable (4);
320227064Sbz        if (ACPI_FAILURE (Status))
321227064Sbz        {
322227064Sbz            AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
323227064Sbz                AcpiFormatException (Status));
324227064Sbz            return (Status);
325227064Sbz        }
326227064Sbz
327227064Sbz        /* This is where the disassembly happens */
328227064Sbz
329227064Sbz        AcpiGbl_DbOpt_disasm = TRUE;
330227064Sbz        Status = AdAmlDisassemble (AslToFile,
331227064Sbz                    Gbl_Files[ASL_FILE_INPUT].Filename,
332227064Sbz                    Gbl_OutputFilenamePrefix,
333227064Sbz                    &Gbl_Files[ASL_FILE_INPUT].Filename,
334227064Sbz                    Gbl_GetAllTables);
335227064Sbz        if (ACPI_FAILURE (Status))
336227064Sbz        {
337227064Sbz            return (Status);
338227064Sbz        }
339227064Sbz
340227064Sbz        /* Shutdown compiler and ACPICA subsystem */
341227064Sbz
342227064Sbz        AeClearErrorLog ();
343227064Sbz        (void) AcpiTerminate ();
344227064Sbz
345227064Sbz        /*
346227064Sbz         * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
347227064Sbz         * .DSL disassembly file, which can now be compiled if requested
348227064Sbz         */
349227064Sbz        if (Gbl_DoCompile)
350227064Sbz        {
351227064Sbz            AcpiOsPrintf ("\nCompiling \"%s\"\n",
352227064Sbz                Gbl_Files[ASL_FILE_INPUT].Filename);
353227064Sbz        }
354227064Sbz        else
355227064Sbz        {
356227064Sbz            Gbl_Files[ASL_FILE_INPUT].Filename = NULL;
357227064Sbz            return (AE_OK);
358227064Sbz        }
359227064Sbz    }
360227064Sbz
361227064Sbz    /*
362227064Sbz     * Open the input file. Here, this should be an ASCII source file,
363227064Sbz     * either an ASL file or a Data Table file
364227064Sbz     */
365227064Sbz    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
366227064Sbz    if (ACPI_FAILURE (Status))
367227064Sbz    {
368227064Sbz        AePrintErrorLog (ASL_FILE_STDERR);
369227064Sbz        return (AE_ERROR);
370227064Sbz    }
371227064Sbz
372227064Sbz    /* Determine input file type */
373227064Sbz
374227064Sbz    Gbl_FileType = AslDetectSourceFileType (&Gbl_Files[ASL_FILE_INPUT]);
375227064Sbz    if (Gbl_FileType == ASL_INPUT_TYPE_BINARY)
376227064Sbz    {
377227064Sbz        return (AE_ERROR);
378227064Sbz    }
379227064Sbz
380227064Sbz    /*
381227064Sbz     * If -p not specified, we will use the input filename as the
382227064Sbz     * output filename prefix
383227064Sbz     */
384227064Sbz    if (Gbl_UseDefaultAmlFilename)
385227064Sbz    {
386227064Sbz        Gbl_OutputFilenamePrefix = Gbl_Files[ASL_FILE_INPUT].Filename;
387227064Sbz    }
388227064Sbz
389227064Sbz    /* Open the optional output files (listings, etc.) */
390227064Sbz
391227064Sbz    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
392227064Sbz    if (ACPI_FAILURE (Status))
393227064Sbz    {
394227064Sbz        AePrintErrorLog (ASL_FILE_STDERR);
395227064Sbz        return (AE_ERROR);
396227064Sbz    }
397227064Sbz
398227064Sbz    /*
399227064Sbz     * Compilation of ASL source versus DataTable source uses different
400227064Sbz     * compiler subsystems
401227064Sbz     */
402227064Sbz    switch (Gbl_FileType)
403227064Sbz    {
404227064Sbz    /*
405227064Sbz     * Data Table Compilation
406227064Sbz     */
407227064Sbz    case ASL_INPUT_TYPE_ASCII_DATA:
408227064Sbz
409227064Sbz        Status = DtDoCompile ();
410227064Sbz        if (ACPI_FAILURE (Status))
411227064Sbz        {
412227064Sbz            return (Status);
413227064Sbz        }
414227064Sbz
415227064Sbz        if (Gbl_Signature)
416227064Sbz        {
417227064Sbz            ACPI_FREE (Gbl_Signature);
418227064Sbz            Gbl_Signature = NULL;
419227064Sbz        }
420227064Sbz
421227064Sbz        /* Check if any errors occurred during compile */
422227064Sbz
423227064Sbz        Status = AslCheckForErrorExit ();
424227064Sbz        if (ACPI_FAILURE (Status))
425227064Sbz        {
426227064Sbz            return (Status);
427227064Sbz        }
428227064Sbz
429227064Sbz        /* Cleanup (for next source file) and exit */
430227064Sbz
431227064Sbz        AeClearErrorLog ();
432227064Sbz        PrTerminatePreprocessor ();
433227064Sbz        return (Status);
434227064Sbz
435227064Sbz    /*
436227064Sbz     * ASL Compilation
437227064Sbz     */
438227064Sbz    case ASL_INPUT_TYPE_ASCII_ASL:
439227064Sbz
440227064Sbz        /* ACPICA subsystem initialization */
441227064Sbz
442227064Sbz        Status = AdInitialize ();
443227064Sbz        if (ACPI_FAILURE (Status))
444227064Sbz        {
445227064Sbz            return (Status);
446227064Sbz        }
447227064Sbz
448227064Sbz        (void) CmDoCompile ();
449227064Sbz        (void) AcpiTerminate ();
450227064Sbz
451227064Sbz        /* Check if any errors occurred during compile */
452227064Sbz
453227064Sbz        Status = AslCheckForErrorExit ();
454227064Sbz        if (ACPI_FAILURE (Status))
455227064Sbz        {
456227064Sbz            return (Status);
457227064Sbz        }
458227064Sbz
459227064Sbz        /* Cleanup (for next source file) and exit */
460227064Sbz
461227064Sbz        AeClearErrorLog ();
462227064Sbz        PrTerminatePreprocessor ();
463227064Sbz        return (AE_OK);
464227064Sbz
465227064Sbz    case ASL_INPUT_TYPE_BINARY:
466227064Sbz
467227064Sbz        AePrintErrorLog (ASL_FILE_STDERR);
468227064Sbz        return (AE_ERROR);
469227064Sbz
470227064Sbz    default:
471227064Sbz        printf ("Unknown file type %X\n", Gbl_FileType);
472227064Sbz        return (AE_ERROR);
473227064Sbz    }
474227064Sbz}
475227064Sbz
476227064Sbz
477227064Sbz/*******************************************************************************
478227064Sbz *
479227064Sbz * FUNCTION:    AslDoOnePathname
480227064Sbz *
481227064Sbz * PARAMETERS:  Pathname            - Full pathname, possibly with wildcards
482227064Sbz *
483227064Sbz * RETURN:      Status
484227064Sbz *
485227064Sbz * DESCRIPTION: Process one pathname, possible terminated with a wildcard
486227064Sbz *              specification. If a wildcard, it is expanded and the multiple
487227064Sbz *              files are processed.
488227064Sbz *
489227064Sbz ******************************************************************************/
490227064Sbz
491227064SbzACPI_STATUS
492227064SbzAslDoOnePathname (
493227064Sbz    char                    *Pathname,
494227064Sbz    ASL_PATHNAME_CALLBACK   PathCallback)
495227064Sbz{
496227064Sbz    ACPI_STATUS             Status = AE_OK;
497227064Sbz    char                    **WildcardList;
498227064Sbz    char                    *Filename;
499227064Sbz    char                    *FullPathname;
500227064Sbz
501227064Sbz
502227064Sbz    /* Split incoming path into a directory/filename combo */
503227064Sbz
504227064Sbz    Status = FlSplitInputPathname (Pathname, &Gbl_DirectoryPath, &Filename);
505227064Sbz    if (ACPI_FAILURE (Status))
506227064Sbz    {
507227064Sbz        return (Status);
508227064Sbz    }
509227064Sbz
510227064Sbz    /* Expand possible wildcard into a file list (Windows/DOS only) */
511227064Sbz
512227064Sbz    WildcardList = AsDoWildcard (Gbl_DirectoryPath, Filename);
513227064Sbz    while (*WildcardList)
514227064Sbz    {
515227064Sbz        FullPathname = ACPI_ALLOCATE (
516227064Sbz            strlen (Gbl_DirectoryPath) + strlen (*WildcardList) + 1);
517227064Sbz
518227064Sbz        /* Construct a full path to the file */
519227064Sbz
520227064Sbz        strcpy (FullPathname, Gbl_DirectoryPath);
521227064Sbz        strcat (FullPathname, *WildcardList);
522227064Sbz
523227064Sbz        /*
524227064Sbz         * If -p not specified, we will use the input filename as the
525227064Sbz         * output filename prefix
526227064Sbz         */
527227064Sbz        if (Gbl_UseDefaultAmlFilename)
528227064Sbz        {
529227064Sbz            Gbl_OutputFilenamePrefix = FullPathname;
530227064Sbz        }
531227064Sbz
532227064Sbz        /* Save status from all compiles */
533227064Sbz
534227064Sbz        Status |= (*PathCallback) (FullPathname);
535227064Sbz
536227064Sbz        ACPI_FREE (FullPathname);
537227064Sbz        ACPI_FREE (*WildcardList);
538227064Sbz        *WildcardList = NULL;
539227064Sbz        WildcardList++;
540227064Sbz    }
541227064Sbz
542227064Sbz    ACPI_FREE (Gbl_DirectoryPath);
543227064Sbz    ACPI_FREE (Filename);
544227064Sbz    return (Status);
545227064Sbz}
546227064Sbz
547227064Sbz
548227064Sbz/*******************************************************************************
549227064Sbz *
550227064Sbz * FUNCTION:    AslCheckForErrorExit
551227064Sbz *
552227064Sbz * PARAMETERS:  None. Examines global exception count array
553227064Sbz *
554227064Sbz * RETURN:      Status
555227064Sbz *
556227064Sbz * DESCRIPTION: Determine if compiler should abort with error status
557227064Sbz *
558227064Sbz ******************************************************************************/
559227064Sbz
560227064SbzACPI_STATUS
561227064SbzAslCheckForErrorExit (
562227064Sbz    void)
563227064Sbz{
564227064Sbz
565227064Sbz    /*
566227064Sbz     * Return non-zero exit code if there have been errors, unless the
567227064Sbz     * global ignore error flag has been set
568227064Sbz     */
569227064Sbz    if (!Gbl_IgnoreErrors)
570227064Sbz    {
571227064Sbz        if (Gbl_ExceptionCount[ASL_ERROR] > 0)
572227064Sbz        {
573227064Sbz            return (AE_ERROR);
574227064Sbz        }
575227064Sbz
576227064Sbz        /* Optionally treat warnings as errors */
577227064Sbz
578227064Sbz        if (Gbl_WarningsAsErrors)
579227064Sbz        {
580227064Sbz            if ((Gbl_ExceptionCount[ASL_WARNING] > 0)  ||
581227064Sbz                (Gbl_ExceptionCount[ASL_WARNING2] > 0) ||
582227064Sbz                (Gbl_ExceptionCount[ASL_WARNING3] > 0))
583227064Sbz            {
584227064Sbz                return (AE_ERROR);
585227064Sbz            }
586227064Sbz        }
587227064Sbz    }
588227064Sbz
589227064Sbz    return (AE_OK);
590227064Sbz}
591227064Sbz