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