10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: aslcompile - top level compile module
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "aslcompiler.h"
15379eafdd7SSascha Wildner #include "acnamesp.h"
1540d02842fSSascha Wildner 
1550d02842fSSascha Wildner #include <stdio.h>
1560d02842fSSascha Wildner #include <time.h>
1570d02842fSSascha Wildner #include <acapps.h>
1580d02842fSSascha Wildner 
1590d02842fSSascha Wildner #define _COMPONENT          ACPI_COMPILER
1600d02842fSSascha Wildner         ACPI_MODULE_NAME    ("aslcompile")
1610d02842fSSascha Wildner 
1620d02842fSSascha Wildner /*
1630d02842fSSascha Wildner  * Main parser entry
1640d02842fSSascha Wildner  * External is here in case the parser emits the same external in the
1650d02842fSSascha Wildner  * generated header. (Newer versions of Bison)
1660d02842fSSascha Wildner  */
1670d02842fSSascha Wildner int
1680d02842fSSascha Wildner AslCompilerparse(
1690d02842fSSascha Wildner     void);
1700d02842fSSascha Wildner 
1710d02842fSSascha Wildner /* Local prototypes */
1720d02842fSSascha Wildner 
1730d02842fSSascha Wildner static void
1740d02842fSSascha Wildner CmFlushSourceCode (
1750d02842fSSascha Wildner     void);
1760d02842fSSascha Wildner 
1770d02842fSSascha Wildner static void
1780d02842fSSascha Wildner CmDumpAllEvents (
1790d02842fSSascha Wildner     void);
1800d02842fSSascha Wildner 
181a4b9c0c9SSascha Wildner static void
182a4b9c0c9SSascha Wildner CmFinishFiles(
183a4b9c0c9SSascha Wildner     BOOLEAN                 DeleteAmlFile);
184a4b9c0c9SSascha Wildner 
1850d02842fSSascha Wildner 
1860d02842fSSascha Wildner /*******************************************************************************
1870d02842fSSascha Wildner  *
18879eafdd7SSascha Wildner  * FUNCTION:    CmDoCompile
18979eafdd7SSascha Wildner  *
19079eafdd7SSascha Wildner  * PARAMETERS:  None
19179eafdd7SSascha Wildner  *
19279eafdd7SSascha Wildner  * RETURN:      Status (0 = OK)
19379eafdd7SSascha Wildner  *
19479eafdd7SSascha Wildner  * DESCRIPTION: This procedure performs the entire compile
19579eafdd7SSascha Wildner  *
19679eafdd7SSascha Wildner  ******************************************************************************/
19779eafdd7SSascha Wildner 
198a4b9c0c9SSascha Wildner ACPI_STATUS
CmDoCompile(void)19979eafdd7SSascha Wildner CmDoCompile (
20079eafdd7SSascha Wildner     void)
20179eafdd7SSascha Wildner {
20279eafdd7SSascha Wildner     UINT8                   FullCompile;
20379eafdd7SSascha Wildner     UINT8                   Event;
204a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *FileNode;
20579eafdd7SSascha Wildner 
20679eafdd7SSascha Wildner 
20779eafdd7SSascha Wildner     FullCompile = UtBeginEvent ("*** Total Compile time ***");
20879eafdd7SSascha Wildner     Event = UtBeginEvent ("Open input and output files");
20979eafdd7SSascha Wildner     UtEndEvent (Event);
21079eafdd7SSascha Wildner 
21179eafdd7SSascha Wildner     Event = UtBeginEvent ("Preprocess input file");
212806343b9SSascha Wildner     if (AslGbl_PreprocessFlag)
21379eafdd7SSascha Wildner     {
214267c04fdSSascha Wildner         /* Enter compiler name as a #define */
215267c04fdSSascha Wildner 
216267c04fdSSascha Wildner         PrAddDefine (ASL_DEFINE, "", FALSE);
217267c04fdSSascha Wildner 
21879eafdd7SSascha Wildner         /* Preprocessor */
21979eafdd7SSascha Wildner 
22079eafdd7SSascha Wildner         PrDoPreprocess ();
221806343b9SSascha Wildner         AslGbl_CurrentLineNumber = 1;
222806343b9SSascha Wildner         AslGbl_LogicalLineNumber = 1;
223e5412f1eSSascha Wildner         AslGbl_CurrentLineOffset = 0;
22425ca8c79SSascha Wildner 
225806343b9SSascha Wildner         if (AslGbl_PreprocessOnly)
22679eafdd7SSascha Wildner         {
22779eafdd7SSascha Wildner             UtEndEvent (Event);
228a4b9c0c9SSascha Wildner             return (AE_OK);
22979eafdd7SSascha Wildner         }
23079eafdd7SSascha Wildner     }
23179eafdd7SSascha Wildner     UtEndEvent (Event);
23279eafdd7SSascha Wildner 
23325ca8c79SSascha Wildner 
23479eafdd7SSascha Wildner     /* Build the parse tree */
23579eafdd7SSascha Wildner 
23679eafdd7SSascha Wildner     Event = UtBeginEvent ("Parse source code and build parse tree");
23779eafdd7SSascha Wildner     AslCompilerparse();
23879eafdd7SSascha Wildner     UtEndEvent (Event);
23979eafdd7SSascha Wildner 
240fe7b5cb4SSascha Wildner     /* Check for parser-detected syntax errors */
24179eafdd7SSascha Wildner 
242806343b9SSascha Wildner     if (AslGbl_SyntaxError)
24379eafdd7SSascha Wildner     {
244820c5b08SSascha Wildner         fprintf (stderr,
245820c5b08SSascha Wildner             "Compiler aborting due to parser-detected syntax error(s)\n");
246a4b9c0c9SSascha Wildner 
247a4b9c0c9SSascha Wildner         /* Flag this error in the FileNode for compilation summary */
248a4b9c0c9SSascha Wildner 
249a4b9c0c9SSascha Wildner         FileNode = FlGetCurrentFileNode ();
250a4b9c0c9SSascha Wildner         FileNode->ParserErrorDetected = TRUE;
251a4b9c0c9SSascha Wildner         AslGbl_ParserErrorDetected = TRUE;
25279eafdd7SSascha Wildner         LsDumpParseTree ();
25379eafdd7SSascha Wildner         goto ErrorExit;
25479eafdd7SSascha Wildner     }
25579eafdd7SSascha Wildner 
25679eafdd7SSascha Wildner     /* Did the parse tree get successfully constructed? */
25779eafdd7SSascha Wildner 
258806343b9SSascha Wildner     if (!AslGbl_ParseTreeRoot)
25979eafdd7SSascha Wildner     {
26079eafdd7SSascha Wildner         /*
26179eafdd7SSascha Wildner          * If there are no errors, then we have some sort of
26279eafdd7SSascha Wildner          * internal problem.
26379eafdd7SSascha Wildner          */
26479eafdd7SSascha Wildner         AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
26579eafdd7SSascha Wildner             NULL, "- Could not resolve parse tree root node");
26679eafdd7SSascha Wildner 
26779eafdd7SSascha Wildner         goto ErrorExit;
26879eafdd7SSascha Wildner     }
26979eafdd7SSascha Wildner 
27079eafdd7SSascha Wildner     /* Flush out any remaining source after parse tree is complete */
27179eafdd7SSascha Wildner 
27279eafdd7SSascha Wildner     Event = UtBeginEvent ("Flush source input");
27379eafdd7SSascha Wildner     CmFlushSourceCode ();
27479eafdd7SSascha Wildner 
2752e2672b8SSascha Wildner     /* Prune the parse tree if requested (debug purposes only) */
2762e2672b8SSascha Wildner 
277806343b9SSascha Wildner     if (AslGbl_PruneParseTree)
2782e2672b8SSascha Wildner     {
279806343b9SSascha Wildner         AslPruneParseTree (AslGbl_PruneDepth, AslGbl_PruneType);
2802e2672b8SSascha Wildner     }
2812e2672b8SSascha Wildner 
28279eafdd7SSascha Wildner     /* Optional parse tree dump, compiler debug output only */
28379eafdd7SSascha Wildner 
28479eafdd7SSascha Wildner     LsDumpParseTree ();
28579eafdd7SSascha Wildner 
28671c97a3cSSascha Wildner     UtEndEvent (Event);
287a4b9c0c9SSascha Wildner     UtEndEvent (FullCompile);
288a4b9c0c9SSascha Wildner     return (AE_OK);
289a4b9c0c9SSascha Wildner 
290a4b9c0c9SSascha Wildner ErrorExit:
291a4b9c0c9SSascha Wildner     UtEndEvent (FullCompile);
292a4b9c0c9SSascha Wildner     return (AE_ERROR);
29379eafdd7SSascha Wildner }
29479eafdd7SSascha Wildner 
295a4b9c0c9SSascha Wildner 
296a4b9c0c9SSascha Wildner /*******************************************************************************
297a4b9c0c9SSascha Wildner  *
298a4b9c0c9SSascha Wildner  * FUNCTION:    CmDoAslMiddleAndBackEnd
299a4b9c0c9SSascha Wildner  *
300a4b9c0c9SSascha Wildner  * PARAMETERS:  None
301a4b9c0c9SSascha Wildner  *
302a4b9c0c9SSascha Wildner  * RETURN:      Status of middle-end and back-end
303a4b9c0c9SSascha Wildner  *
304a4b9c0c9SSascha Wildner  * DESCRIPTION: Perform compiler middle-end (type checking and semantic
305a4b9c0c9SSascha Wildner  *              analysis) and back-end (code generation)
306a4b9c0c9SSascha Wildner  *
307a4b9c0c9SSascha Wildner  ******************************************************************************/
308a4b9c0c9SSascha Wildner 
309a4b9c0c9SSascha Wildner int
CmDoAslMiddleAndBackEnd(void)310a4b9c0c9SSascha Wildner CmDoAslMiddleAndBackEnd (
311a4b9c0c9SSascha Wildner     void)
312a4b9c0c9SSascha Wildner {
313a4b9c0c9SSascha Wildner     UINT8                   Event;
314a4b9c0c9SSascha Wildner     ACPI_STATUS             Status;
315a4b9c0c9SSascha Wildner 
316a4b9c0c9SSascha Wildner 
317e5412f1eSSascha Wildner     OpcGetIntegerWidth (AslGbl_ParseTreeRoot->Asl.Child);
318e5412f1eSSascha Wildner 
319e5412f1eSSascha Wildner     /* Pre-process parse tree for any operator transforms */
320e5412f1eSSascha Wildner 
321e5412f1eSSascha Wildner     Event = UtBeginEvent ("Parse tree transforms");
322e5412f1eSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
323e5412f1eSSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
324e5412f1eSSascha Wildner         TrAmlTransformWalkBegin, TrAmlTransformWalkEnd, NULL);
325e5412f1eSSascha Wildner     UtEndEvent (Event);
326e5412f1eSSascha Wildner 
327e5412f1eSSascha Wildner     /* Generate AML opcodes corresponding to the parse tokens */
328e5412f1eSSascha Wildner 
329e5412f1eSSascha Wildner     Event = UtBeginEvent ("Generate AML opcodes");
330e5412f1eSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Generating AML opcodes\n\n");
331e5412f1eSSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
332e5412f1eSSascha Wildner         NULL, OpcAmlOpcodeWalk, NULL);
333e5412f1eSSascha Wildner     UtEndEvent (Event);
334e5412f1eSSascha Wildner 
335e5412f1eSSascha Wildner 
33679eafdd7SSascha Wildner     /* Interpret and generate all compile-time constants */
33779eafdd7SSascha Wildner 
33879eafdd7SSascha Wildner     Event = UtBeginEvent ("Constant folding via AML interpreter");
33979eafdd7SSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT,
3407c9678bcSSascha Wildner         "Interpreting compile-time constant expressions\n\n");
3415943f66cSSascha Wildner 
342806343b9SSascha Wildner     if (AslGbl_FoldConstants)
3435943f66cSSascha Wildner     {
344806343b9SSascha Wildner         TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
3450d27ae55SSascha Wildner             NULL, OpcAmlConstantWalk, NULL);
3465943f66cSSascha Wildner     }
3475943f66cSSascha Wildner     else
3485943f66cSSascha Wildner     {
3495943f66cSSascha Wildner         DbgPrint (ASL_PARSE_OUTPUT, "    Optional folding disabled\n");
3505943f66cSSascha Wildner     }
35179eafdd7SSascha Wildner     UtEndEvent (Event);
35279eafdd7SSascha Wildner 
35379eafdd7SSascha Wildner     /* Update AML opcodes if necessary, after constant folding */
35479eafdd7SSascha Wildner 
35579eafdd7SSascha Wildner     Event = UtBeginEvent ("Updating AML opcodes after constant folding");
35679eafdd7SSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT,
3577c9678bcSSascha Wildner         "Updating AML opcodes after constant folding\n\n");
358806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
35979eafdd7SSascha Wildner         NULL, OpcAmlOpcodeUpdateWalk, NULL);
36079eafdd7SSascha Wildner     UtEndEvent (Event);
36179eafdd7SSascha Wildner 
36279eafdd7SSascha Wildner     /* Calculate all AML package lengths */
36379eafdd7SSascha Wildner 
36479eafdd7SSascha Wildner     Event = UtBeginEvent ("Generate AML package lengths");
3657c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Generating Package lengths\n\n");
366806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
36779eafdd7SSascha Wildner         LnPackageLengthWalk, NULL);
36879eafdd7SSascha Wildner     UtEndEvent (Event);
36979eafdd7SSascha Wildner 
370806343b9SSascha Wildner     if (AslGbl_ParseOnlyFlag)
37179eafdd7SSascha Wildner     {
37279eafdd7SSascha Wildner         AePrintErrorLog (ASL_FILE_STDERR);
37379eafdd7SSascha Wildner         UtDisplaySummary (ASL_FILE_STDERR);
374806343b9SSascha Wildner         if (AslGbl_DebugFlag)
37579eafdd7SSascha Wildner         {
37679eafdd7SSascha Wildner             /* Print error summary to the stdout also */
37779eafdd7SSascha Wildner 
37879eafdd7SSascha Wildner             AePrintErrorLog (ASL_FILE_STDOUT);
37979eafdd7SSascha Wildner             UtDisplaySummary (ASL_FILE_STDOUT);
38079eafdd7SSascha Wildner         }
38179eafdd7SSascha Wildner         return (0);
38279eafdd7SSascha Wildner     }
38379eafdd7SSascha Wildner 
38479eafdd7SSascha Wildner     /*
38579eafdd7SSascha Wildner      * Create an internal namespace and use it as a symbol table
38679eafdd7SSascha Wildner      */
38779eafdd7SSascha Wildner 
38879eafdd7SSascha Wildner     /* Namespace loading */
38979eafdd7SSascha Wildner 
39079eafdd7SSascha Wildner     Event = UtBeginEvent ("Create ACPI Namespace");
3917c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Creating ACPI Namespace\n\n");
392806343b9SSascha Wildner     Status = LdLoadNamespace (AslGbl_ParseTreeRoot);
39379eafdd7SSascha Wildner     UtEndEvent (Event);
39479eafdd7SSascha Wildner     if (ACPI_FAILURE (Status))
39579eafdd7SSascha Wildner     {
396a4b9c0c9SSascha Wildner         return (-1);
39779eafdd7SSascha Wildner     }
39879eafdd7SSascha Wildner 
39979eafdd7SSascha Wildner     /* Namespace cross-reference */
40079eafdd7SSascha Wildner 
401820c5b08SSascha Wildner     AslGbl_NamespaceEvent = UtBeginEvent (
402820c5b08SSascha Wildner         "Cross reference parse tree and Namespace");
4037c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Cross referencing namespace\n\n");
40479eafdd7SSascha Wildner     Status = XfCrossReferenceNamespace ();
40579eafdd7SSascha Wildner     if (ACPI_FAILURE (Status))
40679eafdd7SSascha Wildner     {
407a4b9c0c9SSascha Wildner         return (-1);
40879eafdd7SSascha Wildner     }
40979eafdd7SSascha Wildner 
41079eafdd7SSascha Wildner     /* Namespace - Check for non-referenced objects */
41179eafdd7SSascha Wildner 
41279eafdd7SSascha Wildner     LkFindUnreferencedObjects ();
41379eafdd7SSascha Wildner     UtEndEvent (AslGbl_NamespaceEvent);
41479eafdd7SSascha Wildner 
4157c9678bcSSascha Wildner     /* Resolve External Declarations */
4167c9678bcSSascha Wildner 
4177c9678bcSSascha Wildner     Event = UtBeginEvent ("Resolve all Externals");
4187c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n");
419d638c6eeSSascha Wildner 
420806343b9SSascha Wildner     if (AslGbl_DoExternalsInPlace)
421d638c6eeSSascha Wildner     {
422806343b9SSascha Wildner         TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
423d638c6eeSSascha Wildner             ExAmlExternalWalkBegin, NULL, NULL);
424d638c6eeSSascha Wildner     }
425d638c6eeSSascha Wildner     else
426d638c6eeSSascha Wildner     {
427806343b9SSascha Wildner         TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
4287c9678bcSSascha Wildner             ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
429d638c6eeSSascha Wildner     }
4307c9678bcSSascha Wildner     UtEndEvent (Event);
4317c9678bcSSascha Wildner 
43279eafdd7SSascha Wildner     /*
43379eafdd7SSascha Wildner      * Semantic analysis. This can happen only after the
43479eafdd7SSascha Wildner      * namespace has been loaded and cross-referenced.
43579eafdd7SSascha Wildner      *
43679eafdd7SSascha Wildner      * part one - check control methods
43779eafdd7SSascha Wildner      */
43879eafdd7SSascha Wildner     Event = UtBeginEvent ("Analyze control method return types");
439806343b9SSascha Wildner     AslGbl_AnalysisWalkInfo.MethodStack = NULL;
44079eafdd7SSascha Wildner 
4417c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - Method analysis\n\n");
4427c9678bcSSascha Wildner 
443806343b9SSascha Wildner     if (AslGbl_CrossReferenceOutput)
4447c9678bcSSascha Wildner     {
4457c9678bcSSascha Wildner         OtPrintHeaders ("Part 1: Object Reference Map "
4467c9678bcSSascha Wildner             "(Object references from within each control method)");
4477c9678bcSSascha Wildner     }
4487c9678bcSSascha Wildner 
449806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
45079eafdd7SSascha Wildner         MtMethodAnalysisWalkBegin,
451806343b9SSascha Wildner         MtMethodAnalysisWalkEnd, &AslGbl_AnalysisWalkInfo);
45279eafdd7SSascha Wildner     UtEndEvent (Event);
45379eafdd7SSascha Wildner 
4547c9678bcSSascha Wildner     /* Generate the object cross-reference file if requested */
4557c9678bcSSascha Wildner 
4567c9678bcSSascha Wildner     Event = UtBeginEvent ("Generate cross-reference file");
4577c9678bcSSascha Wildner     OtCreateXrefFile ();
4587c9678bcSSascha Wildner     UtEndEvent (Event);
4597c9678bcSSascha Wildner 
46079eafdd7SSascha Wildner     /* Semantic error checking part two - typing of method returns */
46179eafdd7SSascha Wildner 
46279eafdd7SSascha Wildner     Event = UtBeginEvent ("Determine object types returned by methods");
4637c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - Method typing\n\n");
464806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
46579eafdd7SSascha Wildner         NULL, AnMethodTypingWalkEnd, NULL);
46679eafdd7SSascha Wildner     UtEndEvent (Event);
46779eafdd7SSascha Wildner 
46879eafdd7SSascha Wildner     /* Semantic error checking part three - operand type checking */
46979eafdd7SSascha Wildner 
47079eafdd7SSascha Wildner     Event = UtBeginEvent ("Analyze AML operand types");
471820c5b08SSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT,
4727c9678bcSSascha Wildner         "Semantic analysis - Operand type checking\n\n");
473806343b9SSascha Wildner     if (AslGbl_DoTypechecking)
474c6400d37SSascha Wildner     {
475806343b9SSascha Wildner         TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
476806343b9SSascha Wildner             NULL, AnOperandTypecheckWalkEnd, &AslGbl_AnalysisWalkInfo);
477c6400d37SSascha Wildner     }
47879eafdd7SSascha Wildner     UtEndEvent (Event);
47979eafdd7SSascha Wildner 
48079eafdd7SSascha Wildner     /* Semantic error checking part four - other miscellaneous checks */
48179eafdd7SSascha Wildner 
48279eafdd7SSascha Wildner     Event = UtBeginEvent ("Miscellaneous analysis");
4837c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - miscellaneous\n\n");
484806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
48579eafdd7SSascha Wildner         AnOtherSemanticAnalysisWalkBegin,
486806343b9SSascha Wildner         NULL, &AslGbl_AnalysisWalkInfo);
48779eafdd7SSascha Wildner     UtEndEvent (Event);
48879eafdd7SSascha Wildner 
489d638c6eeSSascha Wildner     /*
490d638c6eeSSascha Wildner      * ASL-/ASL+ converter: Gbl_ParseTreeRoot->CommentList contains the
491d638c6eeSSascha Wildner      * very last comment of a given ASL file because it's the last constructed
492d638c6eeSSascha Wildner      * node during compilation. We take the very last comment and save it in a
493d638c6eeSSascha Wildner      * global for it to be used by the disassembler.
494d638c6eeSSascha Wildner      */
4957bcb6cafSSascha Wildner     if (AcpiGbl_CaptureComments)
496d638c6eeSSascha Wildner     {
497806343b9SSascha Wildner         AcpiGbl_LastListHead = AslGbl_ParseTreeRoot->Asl.CommentList;
498806343b9SSascha Wildner         AslGbl_ParseTreeRoot->Asl.CommentList = NULL;
499d638c6eeSSascha Wildner     }
500d638c6eeSSascha Wildner 
50179eafdd7SSascha Wildner     /* Calculate all AML package lengths */
50279eafdd7SSascha Wildner 
50379eafdd7SSascha Wildner     Event = UtBeginEvent ("Finish AML package length generation");
5047c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Generating Package lengths\n\n");
505806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
50679eafdd7SSascha Wildner         LnInitLengthsWalk, NULL);
507806343b9SSascha Wildner     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
50879eafdd7SSascha Wildner         LnPackageLengthWalk, NULL);
50979eafdd7SSascha Wildner     UtEndEvent (Event);
51079eafdd7SSascha Wildner 
51179eafdd7SSascha Wildner     /* Code generation - emit the AML */
51279eafdd7SSascha Wildner 
51379eafdd7SSascha Wildner     Event = UtBeginEvent ("Generate AML code and write output files");
5147c9678bcSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n");
515a4b9c0c9SSascha Wildner 
516a4b9c0c9SSascha Wildner     AslGbl_CurrentDB = AslGbl_ParseTreeRoot->Asl.Child;
517a4b9c0c9SSascha Wildner 
518a4b9c0c9SSascha Wildner     while (AslGbl_CurrentDB)
519a4b9c0c9SSascha Wildner     {
520a4b9c0c9SSascha Wildner         switch  (FlSwitchFileSet(AslGbl_CurrentDB->Asl.Filename))
521a4b9c0c9SSascha Wildner         {
522a4b9c0c9SSascha Wildner             case SWITCH_TO_DIFFERENT_FILE:
523a4b9c0c9SSascha Wildner                 /*
524a4b9c0c9SSascha Wildner                  * Reset these parameters when definition blocks belong in
525a4b9c0c9SSascha Wildner                  * different files. If they belong in the same file, there is
526a4b9c0c9SSascha Wildner                  * no need to reset these parameters
527a4b9c0c9SSascha Wildner                  */
528a4b9c0c9SSascha Wildner                 FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
529a4b9c0c9SSascha Wildner                 AslGbl_SourceLine = 0;
530a4b9c0c9SSascha Wildner                 AslGbl_NextError = AslGbl_ErrorLog;
531a4b9c0c9SSascha Wildner 
532a4b9c0c9SSascha Wildner                 /* fall-through */
533a4b9c0c9SSascha Wildner 
534a4b9c0c9SSascha Wildner             case SWITCH_TO_SAME_FILE:
535a4b9c0c9SSascha Wildner 
53679eafdd7SSascha Wildner                 CgGenerateAmlOutput ();
537a4b9c0c9SSascha Wildner                 CmDoOutputFiles ();
538a4b9c0c9SSascha Wildner                 AslGbl_CurrentDB = AslGbl_CurrentDB->Asl.Next;
539a4b9c0c9SSascha Wildner 
540a4b9c0c9SSascha Wildner                 break;
541a4b9c0c9SSascha Wildner 
542a4b9c0c9SSascha Wildner             default: /* FILE_NOT_FOUND */
543a4b9c0c9SSascha Wildner 
544a4b9c0c9SSascha Wildner                 /* The requested file could not be found. Get out of here */
545a4b9c0c9SSascha Wildner 
546a4b9c0c9SSascha Wildner                 AslGbl_CurrentDB = NULL;
547a4b9c0c9SSascha Wildner                 break;
548a4b9c0c9SSascha Wildner         }
549a4b9c0c9SSascha Wildner     }
55079eafdd7SSascha Wildner     UtEndEvent (Event);
55179eafdd7SSascha Wildner 
55279eafdd7SSascha Wildner     Event = UtBeginEvent ("Write optional output files");
55379eafdd7SSascha Wildner     UtEndEvent (Event);
55479eafdd7SSascha Wildner 
55579eafdd7SSascha Wildner     return (0);
55679eafdd7SSascha Wildner }
55779eafdd7SSascha Wildner 
55879eafdd7SSascha Wildner 
55979eafdd7SSascha Wildner /*******************************************************************************
56079eafdd7SSascha Wildner  *
5610d02842fSSascha Wildner  * FUNCTION:    AslCompilerSignon
5620d02842fSSascha Wildner  *
5630d02842fSSascha Wildner  * PARAMETERS:  FileId      - ID of the output file
5640d02842fSSascha Wildner  *
5650d02842fSSascha Wildner  * RETURN:      None
5660d02842fSSascha Wildner  *
5670d02842fSSascha Wildner  * DESCRIPTION: Display compiler signon
5680d02842fSSascha Wildner  *
5690d02842fSSascha Wildner  ******************************************************************************/
5700d02842fSSascha Wildner 
5710d02842fSSascha Wildner void
AslCompilerSignon(UINT32 FileId)5720d02842fSSascha Wildner AslCompilerSignon (
5730d02842fSSascha Wildner     UINT32                  FileId)
5740d02842fSSascha Wildner {
5750d02842fSSascha Wildner     char                    *Prefix = "";
5760d02842fSSascha Wildner     char                    *UtilityName;
5770d02842fSSascha Wildner 
5780d02842fSSascha Wildner 
5790d02842fSSascha Wildner     /* Set line prefix depending on the destination file type */
5800d02842fSSascha Wildner 
5810d02842fSSascha Wildner     switch (FileId)
5820d02842fSSascha Wildner     {
5830d02842fSSascha Wildner     case ASL_FILE_ASM_SOURCE_OUTPUT:
5840d02842fSSascha Wildner     case ASL_FILE_ASM_INCLUDE_OUTPUT:
5850d02842fSSascha Wildner 
5860d02842fSSascha Wildner         Prefix = "; ";
5870d02842fSSascha Wildner         break;
5880d02842fSSascha Wildner 
5890d02842fSSascha Wildner     case ASL_FILE_HEX_OUTPUT:
5900d02842fSSascha Wildner 
591806343b9SSascha Wildner         if (AslGbl_HexOutputFlag == HEX_OUTPUT_ASM)
5920d02842fSSascha Wildner         {
5930d02842fSSascha Wildner             Prefix = "; ";
5940d02842fSSascha Wildner         }
595806343b9SSascha Wildner         else if ((AslGbl_HexOutputFlag == HEX_OUTPUT_C) ||
596806343b9SSascha Wildner                  (AslGbl_HexOutputFlag == HEX_OUTPUT_ASL))
5970d02842fSSascha Wildner         {
5980d02842fSSascha Wildner             FlPrintFile (ASL_FILE_HEX_OUTPUT, "/*\n");
5990d02842fSSascha Wildner             Prefix = " * ";
6000d02842fSSascha Wildner         }
6010d02842fSSascha Wildner         break;
6020d02842fSSascha Wildner 
6030d02842fSSascha Wildner     case ASL_FILE_C_SOURCE_OUTPUT:
6040d02842fSSascha Wildner     case ASL_FILE_C_OFFSET_OUTPUT:
6050d02842fSSascha Wildner     case ASL_FILE_C_INCLUDE_OUTPUT:
6060d02842fSSascha Wildner 
6070d02842fSSascha Wildner         Prefix = " * ";
6080d02842fSSascha Wildner         break;
6090d02842fSSascha Wildner 
6100d02842fSSascha Wildner     default:
6110d02842fSSascha Wildner 
6120d02842fSSascha Wildner         /* No other output types supported */
6130d02842fSSascha Wildner 
6140d02842fSSascha Wildner         break;
6150d02842fSSascha Wildner     }
6160d02842fSSascha Wildner 
6170d02842fSSascha Wildner     /* Running compiler or disassembler? */
6180d02842fSSascha Wildner 
6191093ca81SSascha Wildner     if (AcpiGbl_DisasmFlag)
6200d02842fSSascha Wildner     {
6210d02842fSSascha Wildner         UtilityName = AML_DISASSEMBLER_NAME;
6220d02842fSSascha Wildner     }
6230d02842fSSascha Wildner     else
6240d02842fSSascha Wildner     {
6250d02842fSSascha Wildner         UtilityName = ASL_COMPILER_NAME;
6260d02842fSSascha Wildner     }
6270d02842fSSascha Wildner 
6280d02842fSSascha Wildner     /* Compiler signon with copyright */
6290d02842fSSascha Wildner 
6300d02842fSSascha Wildner     FlPrintFile (FileId, "%s\n", Prefix);
6310d02842fSSascha Wildner     FlPrintFile (FileId, ACPI_COMMON_HEADER (UtilityName, Prefix));
6320d02842fSSascha Wildner }
6330d02842fSSascha Wildner 
6340d02842fSSascha Wildner 
6350d02842fSSascha Wildner /*******************************************************************************
6360d02842fSSascha Wildner  *
6370d02842fSSascha Wildner  * FUNCTION:    AslCompilerFileHeader
6380d02842fSSascha Wildner  *
6390d02842fSSascha Wildner  * PARAMETERS:  FileId      - ID of the output file
6400d02842fSSascha Wildner  *
6410d02842fSSascha Wildner  * RETURN:      None
6420d02842fSSascha Wildner  *
6430d02842fSSascha Wildner  * DESCRIPTION: Header used at the beginning of output files
6440d02842fSSascha Wildner  *
6450d02842fSSascha Wildner  ******************************************************************************/
6460d02842fSSascha Wildner 
6470d02842fSSascha Wildner void
AslCompilerFileHeader(UINT32 FileId)6480d02842fSSascha Wildner AslCompilerFileHeader (
6490d02842fSSascha Wildner     UINT32                  FileId)
6500d02842fSSascha Wildner {
651ff3cb46dSSascha Wildner     char                    *NewTime;
6520d02842fSSascha Wildner     time_t                  Aclock;
6530d02842fSSascha Wildner     char                    *Prefix = "";
6540d02842fSSascha Wildner 
6550d02842fSSascha Wildner 
6560d02842fSSascha Wildner     /* Set line prefix depending on the destination file type */
6570d02842fSSascha Wildner 
6580d02842fSSascha Wildner     switch (FileId)
6590d02842fSSascha Wildner     {
6600d02842fSSascha Wildner     case ASL_FILE_ASM_SOURCE_OUTPUT:
6610d02842fSSascha Wildner     case ASL_FILE_ASM_INCLUDE_OUTPUT:
6620d02842fSSascha Wildner 
6630d02842fSSascha Wildner         Prefix = "; ";
6640d02842fSSascha Wildner         break;
6650d02842fSSascha Wildner 
6660d02842fSSascha Wildner     case ASL_FILE_HEX_OUTPUT:
6670d02842fSSascha Wildner 
668806343b9SSascha Wildner         if (AslGbl_HexOutputFlag == HEX_OUTPUT_ASM)
6690d02842fSSascha Wildner         {
6700d02842fSSascha Wildner             Prefix = "; ";
6710d02842fSSascha Wildner         }
672806343b9SSascha Wildner         else if ((AslGbl_HexOutputFlag == HEX_OUTPUT_C) ||
673806343b9SSascha Wildner                  (AslGbl_HexOutputFlag == HEX_OUTPUT_ASL))
6740d02842fSSascha Wildner         {
6750d02842fSSascha Wildner             Prefix = " * ";
6760d02842fSSascha Wildner         }
6770d02842fSSascha Wildner         break;
6780d02842fSSascha Wildner 
6790d02842fSSascha Wildner     case ASL_FILE_C_SOURCE_OUTPUT:
6800d02842fSSascha Wildner     case ASL_FILE_C_OFFSET_OUTPUT:
6810d02842fSSascha Wildner     case ASL_FILE_C_INCLUDE_OUTPUT:
6820d02842fSSascha Wildner 
6830d02842fSSascha Wildner         Prefix = " * ";
6840d02842fSSascha Wildner         break;
6850d02842fSSascha Wildner 
6860d02842fSSascha Wildner     default:
6870d02842fSSascha Wildner 
6880d02842fSSascha Wildner         /* No other output types supported */
6890d02842fSSascha Wildner 
6900d02842fSSascha Wildner         break;
6910d02842fSSascha Wildner     }
6920d02842fSSascha Wildner 
6930d02842fSSascha Wildner     /* Compilation header with timestamp */
6940d02842fSSascha Wildner 
695ff3cb46dSSascha Wildner     Aclock = time (NULL);
696ff3cb46dSSascha Wildner     NewTime = ctime (&Aclock);
6970d02842fSSascha Wildner 
6980d02842fSSascha Wildner     FlPrintFile (FileId,
699ff3cb46dSSascha Wildner         "%sCompilation of \"%s\" -",
700ff3cb46dSSascha Wildner         Prefix, AslGbl_Files[ASL_FILE_INPUT].Filename);
701ff3cb46dSSascha Wildner 
702ff3cb46dSSascha Wildner     if (NewTime)
703ff3cb46dSSascha Wildner     {
704ff3cb46dSSascha Wildner         FlPrintFile (FileId, " %s%s\n", NewTime, Prefix);
705ff3cb46dSSascha Wildner     }
7060d02842fSSascha Wildner 
7070d02842fSSascha Wildner     switch (FileId)
7080d02842fSSascha Wildner     {
7090d02842fSSascha Wildner     case ASL_FILE_C_SOURCE_OUTPUT:
7100d02842fSSascha Wildner     case ASL_FILE_C_OFFSET_OUTPUT:
7110d02842fSSascha Wildner     case ASL_FILE_C_INCLUDE_OUTPUT:
7120d02842fSSascha Wildner 
7130d02842fSSascha Wildner         FlPrintFile (FileId, " */\n");
7140d02842fSSascha Wildner         break;
7150d02842fSSascha Wildner 
7160d02842fSSascha Wildner     default:
7170d02842fSSascha Wildner 
7180d02842fSSascha Wildner         /* Nothing to do for other output types */
7190d02842fSSascha Wildner 
7200d02842fSSascha Wildner         break;
7210d02842fSSascha Wildner     }
7220d02842fSSascha Wildner }
7230d02842fSSascha Wildner 
7240d02842fSSascha Wildner 
7250d02842fSSascha Wildner /*******************************************************************************
7260d02842fSSascha Wildner  *
7270d02842fSSascha Wildner  * FUNCTION:    CmFlushSourceCode
7280d02842fSSascha Wildner  *
7290d02842fSSascha Wildner  * PARAMETERS:  None
7300d02842fSSascha Wildner  *
7310d02842fSSascha Wildner  * RETURN:      None
7320d02842fSSascha Wildner  *
7330d02842fSSascha Wildner  * DESCRIPTION: Read in any remaining source code after the parse tree
7340d02842fSSascha Wildner  *              has been constructed.
7350d02842fSSascha Wildner  *
7360d02842fSSascha Wildner  ******************************************************************************/
7370d02842fSSascha Wildner 
7380d02842fSSascha Wildner static void
CmFlushSourceCode(void)7390d02842fSSascha Wildner CmFlushSourceCode (
7400d02842fSSascha Wildner     void)
7410d02842fSSascha Wildner {
7420d02842fSSascha Wildner     char                    Buffer;
7430d02842fSSascha Wildner 
7440d02842fSSascha Wildner 
7450d02842fSSascha Wildner     while (FlReadFile (ASL_FILE_INPUT, &Buffer, 1) != AE_ERROR)
7460d02842fSSascha Wildner     {
7470d02842fSSascha Wildner         AslInsertLineBuffer ((int) Buffer);
7480d02842fSSascha Wildner     }
7490d02842fSSascha Wildner 
7500d02842fSSascha Wildner     AslResetCurrentLineBuffer ();
7510d02842fSSascha Wildner }
7520d02842fSSascha Wildner 
7530d02842fSSascha Wildner 
7540d02842fSSascha Wildner /*******************************************************************************
7550d02842fSSascha Wildner  *
7560d02842fSSascha Wildner  * FUNCTION:    CmDoOutputFiles
7570d02842fSSascha Wildner  *
7580d02842fSSascha Wildner  * PARAMETERS:  None
7590d02842fSSascha Wildner  *
7600d02842fSSascha Wildner  * RETURN:      None.
7610d02842fSSascha Wildner  *
7620d02842fSSascha Wildner  * DESCRIPTION: Create all "listing" type files
7630d02842fSSascha Wildner  *
7640d02842fSSascha Wildner  ******************************************************************************/
7650d02842fSSascha Wildner 
7660d02842fSSascha Wildner void
CmDoOutputFiles(void)7670d02842fSSascha Wildner CmDoOutputFiles (
7680d02842fSSascha Wildner     void)
7690d02842fSSascha Wildner {
7700d02842fSSascha Wildner 
7710d02842fSSascha Wildner     /* Create listings and hex files */
7720d02842fSSascha Wildner 
7730d02842fSSascha Wildner     LsDoListings ();
7740d02842fSSascha Wildner     HxDoHexOutput ();
7750d02842fSSascha Wildner 
7760d02842fSSascha Wildner     /* Dump the namespace to the .nsp file if requested */
7770d02842fSSascha Wildner 
7780d02842fSSascha Wildner     (void) NsDisplayNamespace ();
7792e2672b8SSascha Wildner 
7802e2672b8SSascha Wildner     /* Dump the device mapping file */
7812e2672b8SSascha Wildner 
7822e2672b8SSascha Wildner     MpEmitMappingInfo ();
7830d02842fSSascha Wildner }
7840d02842fSSascha Wildner 
7850d02842fSSascha Wildner 
7860d02842fSSascha Wildner /*******************************************************************************
7870d02842fSSascha Wildner  *
7880d02842fSSascha Wildner  * FUNCTION:    CmDumpAllEvents
7890d02842fSSascha Wildner  *
7900d02842fSSascha Wildner  * PARAMETERS:  None
7910d02842fSSascha Wildner  *
7920d02842fSSascha Wildner  * RETURN:      None.
7930d02842fSSascha Wildner  *
7940d02842fSSascha Wildner  * DESCRIPTION: Dump all compiler events
7950d02842fSSascha Wildner  *
7960d02842fSSascha Wildner  ******************************************************************************/
7970d02842fSSascha Wildner 
7980d02842fSSascha Wildner static void
CmDumpAllEvents(void)7990d02842fSSascha Wildner CmDumpAllEvents (
8000d02842fSSascha Wildner     void)
8010d02842fSSascha Wildner {
8020d02842fSSascha Wildner     ASL_EVENT_INFO          *Event;
8030d02842fSSascha Wildner     UINT32                  Delta;
804820c5b08SSascha Wildner     UINT32                  MicroSeconds;
805820c5b08SSascha Wildner     UINT32                  MilliSeconds;
8060d02842fSSascha Wildner     UINT32                  i;
8070d02842fSSascha Wildner 
8080d02842fSSascha Wildner 
8090d02842fSSascha Wildner     Event = AslGbl_Events;
8100d02842fSSascha Wildner 
8110d02842fSSascha Wildner     DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
812806343b9SSascha Wildner     if (AslGbl_CompileTimesFlag)
8130d02842fSSascha Wildner     {
8140d02842fSSascha Wildner         printf ("\nElapsed time for major events\n\n");
8150d02842fSSascha Wildner     }
8160d02842fSSascha Wildner 
8170d02842fSSascha Wildner     for (i = 0; i < AslGbl_NextEvent; i++)
8180d02842fSSascha Wildner     {
8190d02842fSSascha Wildner         if (Event->Valid)
8200d02842fSSascha Wildner         {
8210d02842fSSascha Wildner             /* Delta will be in 100-nanosecond units */
8220d02842fSSascha Wildner 
8230d02842fSSascha Wildner             Delta = (UINT32) (Event->EndTime - Event->StartTime);
8240d02842fSSascha Wildner 
825820c5b08SSascha Wildner             MicroSeconds = Delta / ACPI_100NSEC_PER_USEC;
826820c5b08SSascha Wildner             MilliSeconds = Delta / ACPI_100NSEC_PER_MSEC;
8270d02842fSSascha Wildner 
8280d02842fSSascha Wildner             /* Round milliseconds up */
8290d02842fSSascha Wildner 
830820c5b08SSascha Wildner             if ((MicroSeconds - (MilliSeconds * ACPI_USEC_PER_MSEC)) >= 500)
8310d02842fSSascha Wildner             {
832820c5b08SSascha Wildner                 MilliSeconds++;
8330d02842fSSascha Wildner             }
8340d02842fSSascha Wildner 
8350d02842fSSascha Wildner             DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
836820c5b08SSascha Wildner                 MicroSeconds, MilliSeconds, Event->EventName);
8370d02842fSSascha Wildner 
838806343b9SSascha Wildner             if (AslGbl_CompileTimesFlag)
8390d02842fSSascha Wildner             {
8400d02842fSSascha Wildner                 printf ("%8u usec %8u msec - %s\n",
841820c5b08SSascha Wildner                     MicroSeconds, MilliSeconds, Event->EventName);
8420d02842fSSascha Wildner             }
8430d02842fSSascha Wildner         }
8440d02842fSSascha Wildner 
8450d02842fSSascha Wildner         Event++;
8460d02842fSSascha Wildner     }
8470d02842fSSascha Wildner }
8480d02842fSSascha Wildner 
8490d02842fSSascha Wildner 
8500d02842fSSascha Wildner /*******************************************************************************
8510d02842fSSascha Wildner  *
8520d02842fSSascha Wildner  * FUNCTION:    CmCleanupAndExit
8530d02842fSSascha Wildner  *
8540d02842fSSascha Wildner  * PARAMETERS:  None
8550d02842fSSascha Wildner  *
8560d02842fSSascha Wildner  * RETURN:      None.
8570d02842fSSascha Wildner  *
8580d02842fSSascha Wildner  * DESCRIPTION: Close all open files and exit the compiler
8590d02842fSSascha Wildner  *
8600d02842fSSascha Wildner  ******************************************************************************/
8610d02842fSSascha Wildner 
862e5412f1eSSascha Wildner int
CmCleanupAndExit(void)8630d02842fSSascha Wildner CmCleanupAndExit (
8640d02842fSSascha Wildner     void)
8650d02842fSSascha Wildner {
866e5412f1eSSascha Wildner     int                     Status = 0;
8670d02842fSSascha Wildner     BOOLEAN                 DeleteAmlFile = FALSE;
868a4b9c0c9SSascha Wildner     ASL_GLOBAL_FILE_NODE    *CurrentFileNode = AslGbl_FilesList;
8690d02842fSSascha Wildner 
8700d02842fSSascha Wildner 
871a4b9c0c9SSascha Wildner     /* Check if any errors occurred during compile */
872a4b9c0c9SSascha Wildner 
873a4b9c0c9SSascha Wildner     (void) AslCheckForErrorExit ();
874a4b9c0c9SSascha Wildner 
8750d02842fSSascha Wildner     AePrintErrorLog (ASL_FILE_STDERR);
876806343b9SSascha Wildner     if (AslGbl_DebugFlag)
8770d02842fSSascha Wildner     {
8780d02842fSSascha Wildner         /* Print error summary to stdout also */
8790d02842fSSascha Wildner 
8800d02842fSSascha Wildner         AePrintErrorLog (ASL_FILE_STDOUT);
8810d02842fSSascha Wildner     }
8820d02842fSSascha Wildner 
8830d02842fSSascha Wildner     /* Emit compile times if enabled */
8840d02842fSSascha Wildner 
8850d02842fSSascha Wildner     CmDumpAllEvents ();
8860d02842fSSascha Wildner 
887806343b9SSascha Wildner     if (AslGbl_CompileTimesFlag)
8880d02842fSSascha Wildner     {
8890d02842fSSascha Wildner         printf ("\nMiscellaneous compile statistics\n\n");
890806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalParseNodes, "Parse nodes");
891806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_NsLookupCount, "Namespace searches");
892806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalNamedObjects, "Named objects");
893806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalMethods, "Control methods");
894806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalAllocations, "Memory Allocations");
895806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalAllocated, "Total allocated memory");
896806343b9SSascha Wildner         printf ("%11u : %s\n", AslGbl_TotalFolds, "Constant subtrees folded");
8970d02842fSSascha Wildner         printf ("\n");
8980d02842fSSascha Wildner     }
8990d02842fSSascha Wildner 
900806343b9SSascha Wildner     if (AslGbl_NsLookupCount)
9010d02842fSSascha Wildner     {
9020d02842fSSascha Wildner         DbgPrint (ASL_DEBUG_OUTPUT,
9030d02842fSSascha Wildner             "\n\nMiscellaneous compile statistics\n\n");
9040d02842fSSascha Wildner 
9050d02842fSSascha Wildner         DbgPrint (ASL_DEBUG_OUTPUT,
9060d02842fSSascha Wildner             "%32s : %u\n", "Total Namespace searches",
907806343b9SSascha Wildner             AslGbl_NsLookupCount);
9080d02842fSSascha Wildner 
9090d02842fSSascha Wildner         DbgPrint (ASL_DEBUG_OUTPUT,
9100d02842fSSascha Wildner             "%32s : %u usec\n", "Time per search", ((UINT32)
9110d02842fSSascha Wildner             (AslGbl_Events[AslGbl_NamespaceEvent].EndTime -
9120d02842fSSascha Wildner                 AslGbl_Events[AslGbl_NamespaceEvent].StartTime) / 10) /
913806343b9SSascha Wildner                 AslGbl_NsLookupCount);
9140d02842fSSascha Wildner     }
9150d02842fSSascha Wildner 
916806343b9SSascha Wildner     if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
9170d02842fSSascha Wildner     {
9186721db86SSascha Wildner         printf ("\nMaximum error count (%d) exceeded\n",
9190d02842fSSascha Wildner             ASL_MAX_ERROR_COUNT);
9200d02842fSSascha Wildner     }
9210d02842fSSascha Wildner 
9220d02842fSSascha Wildner     UtDisplaySummary (ASL_FILE_STDOUT);
9230d02842fSSascha Wildner 
9240d02842fSSascha Wildner     /*
925e5412f1eSSascha Wildner      * Delete the AML file if there are errors and the force AML output option
926e5412f1eSSascha Wildner      * (-f) has not been used.
927e5412f1eSSascha Wildner      *
928e5412f1eSSascha Wildner      * Return -1 as a status of the compiler if no AML files are generated. If
929e5412f1eSSascha Wildner      * the AML file is generated in the presence of errors, return 0. In the
930e5412f1eSSascha Wildner      * latter case, the errors were ignored by the user so the compilation is
931e5412f1eSSascha Wildner      * considered successful.
9320d02842fSSascha Wildner      */
933e5412f1eSSascha Wildner     if (AslGbl_ParserErrorDetected || AslGbl_PreprocessOnly ||
934e5412f1eSSascha Wildner         ((AslGbl_ExceptionCount[ASL_ERROR] > 0) &&
935806343b9SSascha Wildner         (!AslGbl_IgnoreErrors) &&
936a4b9c0c9SSascha Wildner         AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle))
9370d02842fSSascha Wildner     {
9380d02842fSSascha Wildner         DeleteAmlFile = TRUE;
939e5412f1eSSascha Wildner         Status = -1;
9400d02842fSSascha Wildner     }
9410d02842fSSascha Wildner 
9420d02842fSSascha Wildner     /* Close all open files */
9430d02842fSSascha Wildner 
944a4b9c0c9SSascha Wildner     while (CurrentFileNode)
945a4b9c0c9SSascha Wildner     {
946e5412f1eSSascha Wildner         /*
947e5412f1eSSascha Wildner          * Set the program return status based on file errors. If there are any
948e5412f1eSSascha Wildner          * errors and during compilation, the command is not considered
949e5412f1eSSascha Wildner          * successful.
950e5412f1eSSascha Wildner          */
951e5412f1eSSascha Wildner         if (Status != -1 && !AslGbl_IgnoreErrors &&
952e5412f1eSSascha Wildner             CurrentFileNode->ParserErrorDetected)
953e5412f1eSSascha Wildner         {
954e5412f1eSSascha Wildner             Status = -1;
955e5412f1eSSascha Wildner         }
956e5412f1eSSascha Wildner 
957a4b9c0c9SSascha Wildner         switch  (FlSwitchFileSet (CurrentFileNode->Files[ASL_FILE_INPUT].Filename))
958a4b9c0c9SSascha Wildner         {
959a4b9c0c9SSascha Wildner             case SWITCH_TO_SAME_FILE:
960a4b9c0c9SSascha Wildner             case SWITCH_TO_DIFFERENT_FILE:
961a4b9c0c9SSascha Wildner 
962a4b9c0c9SSascha Wildner                 CmFinishFiles (DeleteAmlFile);
963a4b9c0c9SSascha Wildner                 CurrentFileNode = CurrentFileNode->Next;
964a4b9c0c9SSascha Wildner                 break;
965a4b9c0c9SSascha Wildner 
966a4b9c0c9SSascha Wildner             case FILE_NOT_FOUND:
967a4b9c0c9SSascha Wildner             default:
968a4b9c0c9SSascha Wildner 
969a4b9c0c9SSascha Wildner                 CurrentFileNode = NULL;
970a4b9c0c9SSascha Wildner                 break;
971a4b9c0c9SSascha Wildner         }
972a4b9c0c9SSascha Wildner     }
973a4b9c0c9SSascha Wildner 
974a4b9c0c9SSascha Wildner     /* Final cleanup after compiling one file */
975a4b9c0c9SSascha Wildner 
976a4b9c0c9SSascha Wildner     if (!AslGbl_DoAslConversion)
977a4b9c0c9SSascha Wildner     {
978a4b9c0c9SSascha Wildner         UtDeleteLocalCaches ();
979a4b9c0c9SSascha Wildner     }
980e5412f1eSSascha Wildner 
981e5412f1eSSascha Wildner     return (Status);
982a4b9c0c9SSascha Wildner }
983a4b9c0c9SSascha Wildner 
984a4b9c0c9SSascha Wildner 
985a4b9c0c9SSascha Wildner /*******************************************************************************
986a4b9c0c9SSascha Wildner  *
987a4b9c0c9SSascha Wildner  * FUNCTION:    CmFinishFiles
988a4b9c0c9SSascha Wildner  *
989a4b9c0c9SSascha Wildner  * PARAMETERS:  DeleteAmlFile
990a4b9c0c9SSascha Wildner  *
991a4b9c0c9SSascha Wildner  * RETURN:      None.
992a4b9c0c9SSascha Wildner  *
993a4b9c0c9SSascha Wildner  * DESCRIPTION: Close all open files, delete AML files depending on the
994a4b9c0c9SSascha Wildner  *              function parameter is true.
995a4b9c0c9SSascha Wildner  *
996a4b9c0c9SSascha Wildner  ******************************************************************************/
997a4b9c0c9SSascha Wildner 
998a4b9c0c9SSascha Wildner static void
CmFinishFiles(BOOLEAN DeleteAmlFile)999a4b9c0c9SSascha Wildner CmFinishFiles(
1000a4b9c0c9SSascha Wildner     BOOLEAN                 DeleteAmlFile)
1001a4b9c0c9SSascha Wildner {
1002a4b9c0c9SSascha Wildner     UINT32                  i;
1003a4b9c0c9SSascha Wildner 
1004a4b9c0c9SSascha Wildner 
10050d02842fSSascha Wildner     /*
100625ca8c79SSascha Wildner      * Take care with the preprocessor file (.pre), it might be the same
10070d02842fSSascha Wildner      * as the "input" file, depending on where the compiler has terminated
10080d02842fSSascha Wildner      * or aborted. Prevent attempt to close the same file twice in
10090d02842fSSascha Wildner      * loop below.
10100d02842fSSascha Wildner      */
1011806343b9SSascha Wildner     if (AslGbl_Files[ASL_FILE_PREPROCESSOR].Handle ==
1012806343b9SSascha Wildner         AslGbl_Files[ASL_FILE_INPUT].Handle)
10130d02842fSSascha Wildner     {
1014806343b9SSascha Wildner         AslGbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
10150d02842fSSascha Wildner     }
10160d02842fSSascha Wildner 
10170d02842fSSascha Wildner     /* Close the standard I/O files */
10180d02842fSSascha Wildner 
10190d02842fSSascha Wildner     for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
10200d02842fSSascha Wildner     {
1021a4b9c0c9SSascha Wildner         /*
1022a4b9c0c9SSascha Wildner          * Some files such as debug output files could be pointing to
1023a4b9c0c9SSascha Wildner          * stderr or stdout. Leave these alone.
1024a4b9c0c9SSascha Wildner          */
1025a4b9c0c9SSascha Wildner         if (AslGbl_Files[i].Handle != stderr &&
1026a4b9c0c9SSascha Wildner             AslGbl_Files[i].Handle != stdout)
1027a4b9c0c9SSascha Wildner         {
10280d02842fSSascha Wildner             FlCloseFile (i);
10290d02842fSSascha Wildner         }
1030a4b9c0c9SSascha Wildner     }
10310d02842fSSascha Wildner 
10320d02842fSSascha Wildner     /* Delete AML file if there are errors */
10330d02842fSSascha Wildner 
10340d02842fSSascha Wildner     if (DeleteAmlFile)
10350d02842fSSascha Wildner     {
10360d02842fSSascha Wildner         FlDeleteFile (ASL_FILE_AML_OUTPUT);
10370d02842fSSascha Wildner     }
10380d02842fSSascha Wildner 
103925ca8c79SSascha Wildner     /* Delete the preprocessor temp file unless full debug was specified */
10400d02842fSSascha Wildner 
1041806343b9SSascha Wildner     if (AslGbl_PreprocessFlag && !AslGbl_KeepPreprocessorTempFile)
10420d02842fSSascha Wildner     {
10430d02842fSSascha Wildner         FlDeleteFile (ASL_FILE_PREPROCESSOR);
10440d02842fSSascha Wildner     }
10450d02842fSSascha Wildner 
10460d02842fSSascha Wildner     /*
10470d02842fSSascha Wildner      * Delete intermediate ("combined") source file (if -ls flag not set)
10480d02842fSSascha Wildner      * This file is created during normal ASL/AML compiles. It is not
10490d02842fSSascha Wildner      * created by the data table compiler.
10500d02842fSSascha Wildner      *
10510d02842fSSascha Wildner      * If the -ls flag is set, then the .SRC file should not be deleted.
10520d02842fSSascha Wildner      * In this case, Gbl_SourceOutputFlag is set to TRUE.
10530d02842fSSascha Wildner      *
10540d02842fSSascha Wildner      * Note: Handles are cleared by FlCloseFile above, so we look at the
10550d02842fSSascha Wildner      * filename instead, to determine if the .SRC file was actually
10560d02842fSSascha Wildner      * created.
10570d02842fSSascha Wildner      */
1058806343b9SSascha Wildner     if (!AslGbl_SourceOutputFlag)
10590d02842fSSascha Wildner     {
10600d02842fSSascha Wildner         FlDeleteFile (ASL_FILE_SOURCE_OUTPUT);
10610d02842fSSascha Wildner     }
1062d638c6eeSSascha Wildner }
1063