Blame source/compiler/aslcompile.c

Packit Service 1fb00e
/******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Module Name: aslcompile - top level compile module
Packit Service 1fb00e
 *
Packit Service 1fb00e
 *****************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Copyright (C) 2000 - 2018, Intel Corp.
Packit Service 1fb00e
 * All rights reserved.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Redistribution and use in source and binary forms, with or without
Packit Service 1fb00e
 * modification, are permitted provided that the following conditions
Packit Service 1fb00e
 * are met:
Packit Service 1fb00e
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1fb00e
 *    notice, this list of conditions, and the following disclaimer,
Packit Service 1fb00e
 *    without modification.
Packit Service 1fb00e
 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
Packit Service 1fb00e
 *    substantially similar to the "NO WARRANTY" disclaimer below
Packit Service 1fb00e
 *    ("Disclaimer") and any redistribution must be conditioned upon
Packit Service 1fb00e
 *    including a substantially similar Disclaimer requirement for further
Packit Service 1fb00e
 *    binary redistribution.
Packit Service 1fb00e
 * 3. Neither the names of the above-listed copyright holders nor the names
Packit Service 1fb00e
 *    of any contributors may be used to endorse or promote products derived
Packit Service 1fb00e
 *    from this software without specific prior written permission.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * Alternatively, this software may be distributed under the terms of the
Packit Service 1fb00e
 * GNU General Public License ("GPL") version 2 as published by the Free
Packit Service 1fb00e
 * Software Foundation.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * NO WARRANTY
Packit Service 1fb00e
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 1fb00e
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 1fb00e
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
Packit Service 1fb00e
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 1fb00e
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 1fb00e
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 1fb00e
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 1fb00e
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
Packit Service 1fb00e
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
Packit Service 1fb00e
 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
Packit Service 1fb00e
 * POSSIBILITY OF SUCH DAMAGES.
Packit Service 1fb00e
 */
Packit Service 1fb00e
Packit Service 1fb00e
#include "aslcompiler.h"
Packit Service 1fb00e
#include "acnamesp.h"
Packit Service 1fb00e
Packit Service 1fb00e
#include <stdio.h>
Packit Service 1fb00e
#include <time.h>
Packit Service 1fb00e
#include <acapps.h>
Packit Service 1fb00e
Packit Service 1fb00e
#define _COMPONENT          ACPI_COMPILER
Packit Service 1fb00e
        ACPI_MODULE_NAME    ("aslcompile")
Packit Service 1fb00e
Packit Service 1fb00e
/*
Packit Service 1fb00e
 * Main parser entry
Packit Service 1fb00e
 * External is here in case the parser emits the same external in the
Packit Service 1fb00e
 * generated header. (Newer versions of Bison)
Packit Service 1fb00e
 */
Packit Service 1fb00e
int
Packit Service 1fb00e
AslCompilerparse(
Packit Service 1fb00e
    void);
Packit Service 1fb00e
Packit Service 1fb00e
/* Local prototypes */
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
CmFlushSourceCode (
Packit Service 1fb00e
    void);
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
CmDumpAllEvents (
Packit Service 1fb00e
    void);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CmDoCompile
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      Status (0 = OK)
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: This procedure performs the entire compile
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
int
Packit Service 1fb00e
CmDoCompile (
Packit Service 1fb00e
    void)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ACPI_STATUS             Status;
Packit Service 1fb00e
    UINT8                   FullCompile;
Packit Service 1fb00e
    UINT8                   Event;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    FullCompile = UtBeginEvent ("*** Total Compile time ***");
Packit Service 1fb00e
    Event = UtBeginEvent ("Open input and output files");
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Preprocess input file");
Packit Service 1fb00e
    if (Gbl_PreprocessFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Enter compiler name as a #define */
Packit Service 1fb00e
Packit Service 1fb00e
        PrAddDefine (ASL_DEFINE, "", FALSE);
Packit Service 1fb00e
Packit Service 1fb00e
        /* Preprocessor */
Packit Service 1fb00e
Packit Service 1fb00e
        PrDoPreprocess ();
Packit Service 1fb00e
        Gbl_CurrentLineNumber = 1;
Packit Service 1fb00e
        Gbl_LogicalLineNumber = 1;
Packit Service 1fb00e
Packit Service 1fb00e
        if (Gbl_PreprocessOnly)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            UtEndEvent (Event);
Packit Service 1fb00e
            CmCleanupAndExit ();
Packit Service 1fb00e
            return (0);
Packit Service 1fb00e
        }
Packit Service 1fb00e
    }
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Build the parse tree */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Parse source code and build parse tree");
Packit Service 1fb00e
    AslCompilerparse();
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Check for parser-detected syntax errors */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_SyntaxError)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        fprintf (stderr,
Packit Service 1fb00e
            "Compiler aborting due to parser-detected syntax error(s)\n");
Packit Service 1fb00e
        LsDumpParseTree ();
Packit Service 1fb00e
        goto ErrorExit;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Did the parse tree get successfully constructed? */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Gbl_ParseTreeRoot)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /*
Packit Service 1fb00e
         * If there are no errors, then we have some sort of
Packit Service 1fb00e
         * internal problem.
Packit Service 1fb00e
         */
Packit Service 1fb00e
        AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
Packit Service 1fb00e
            NULL, "- Could not resolve parse tree root node");
Packit Service 1fb00e
Packit Service 1fb00e
        goto ErrorExit;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Flush out any remaining source after parse tree is complete */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Flush source input");
Packit Service 1fb00e
    CmFlushSourceCode ();
Packit Service 1fb00e
Packit Service 1fb00e
    /* Prune the parse tree if requested (debug purposes only) */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_PruneParseTree)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AslPruneParseTree (Gbl_PruneDepth, Gbl_PruneType);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Optional parse tree dump, compiler debug output only */
Packit Service 1fb00e
Packit Service 1fb00e
    LsDumpParseTree ();
Packit Service 1fb00e
Packit Service 1fb00e
    OpcGetIntegerWidth (Gbl_ParseTreeRoot->Asl.Child);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Pre-process parse tree for any operator transforms */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Parse tree transforms");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
Packit Service 1fb00e
        TrAmlTransformWalkBegin, TrAmlTransformWalkEnd, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Generate AML opcodes corresponding to the parse tokens */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Generate AML opcodes");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Generating AML opcodes\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
Packit Service 1fb00e
        OpcAmlOpcodeWalk, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Now that the input is parsed, we can open the AML output file.
Packit Service 1fb00e
     * Note: by default, the name of this file comes from the table
Packit Service 1fb00e
     * descriptor within the input file.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Event = UtBeginEvent ("Open AML output file");
Packit Service 1fb00e
    Status = FlOpenAmlOutputFile (Gbl_OutputFilenamePrefix);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AePrintErrorLog (ASL_FILE_STDERR);
Packit Service 1fb00e
        return (-1);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Interpret and generate all compile-time constants */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Constant folding via AML interpreter");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
        "Interpreting compile-time constant expressions\n\n");
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_FoldConstants)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
Packit Service 1fb00e
            NULL, OpcAmlConstantWalk, NULL);
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DbgPrint (ASL_PARSE_OUTPUT, "    Optional folding disabled\n");
Packit Service 1fb00e
    }
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Update AML opcodes if necessary, after constant folding */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Updating AML opcodes after constant folding");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
        "Updating AML opcodes after constant folding\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
Packit Service 1fb00e
        NULL, OpcAmlOpcodeUpdateWalk, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Calculate all AML package lengths */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Generate AML package lengths");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Generating Package lengths\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
Packit Service 1fb00e
        LnPackageLengthWalk, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_ParseOnlyFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AePrintErrorLog (ASL_FILE_STDERR);
Packit Service 1fb00e
        UtDisplaySummary (ASL_FILE_STDERR);
Packit Service 1fb00e
        if (Gbl_DebugFlag)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Print error summary to the stdout also */
Packit Service 1fb00e
Packit Service 1fb00e
            AePrintErrorLog (ASL_FILE_STDOUT);
Packit Service 1fb00e
            UtDisplaySummary (ASL_FILE_STDOUT);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        UtEndEvent (FullCompile);
Packit Service 1fb00e
        return (0);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Create an internal namespace and use it as a symbol table
Packit Service 1fb00e
     */
Packit Service 1fb00e
Packit Service 1fb00e
    /* Namespace loading */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Create ACPI Namespace");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Creating ACPI Namespace\n\n");
Packit Service 1fb00e
    Status = LdLoadNamespace (Gbl_ParseTreeRoot);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        goto ErrorExit;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Namespace cross-reference */
Packit Service 1fb00e
Packit Service 1fb00e
    AslGbl_NamespaceEvent = UtBeginEvent (
Packit Service 1fb00e
        "Cross reference parse tree and Namespace");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Cross referencing namespace\n\n");
Packit Service 1fb00e
    Status = XfCrossReferenceNamespace ();
Packit Service 1fb00e
    if (ACPI_FAILURE (Status))
Packit Service 1fb00e
    {
Packit Service 1fb00e
        goto ErrorExit;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Namespace - Check for non-referenced objects */
Packit Service 1fb00e
Packit Service 1fb00e
    LkFindUnreferencedObjects ();
Packit Service 1fb00e
    UtEndEvent (AslGbl_NamespaceEvent);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Resolve External Declarations */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_DoExternals)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Event = UtBeginEvent ("Resolve all Externals");
Packit Service 1fb00e
        DbgPrint (ASL_DEBUG_OUTPUT, "\nResolve Externals\n\n");
Packit Service 1fb00e
Packit Service 1fb00e
        if (Gbl_DoExternalsInPlace)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
Packit Service 1fb00e
                ExAmlExternalWalkBegin, NULL, NULL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else
Packit Service 1fb00e
        {
Packit Service 1fb00e
            TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
Packit Service 1fb00e
                ExAmlExternalWalkBegin, ExAmlExternalWalkEnd, NULL);
Packit Service 1fb00e
        }
Packit Service 1fb00e
        UtEndEvent (Event);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Semantic analysis. This can happen only after the
Packit Service 1fb00e
     * namespace has been loaded and cross-referenced.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * part one - check control methods
Packit Service 1fb00e
     */
Packit Service 1fb00e
    Event = UtBeginEvent ("Analyze control method return types");
Packit Service 1fb00e
    AnalysisWalkInfo.MethodStack = NULL;
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - Method analysis\n\n");
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_CrossReferenceOutput)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        OtPrintHeaders ("Part 1: Object Reference Map "
Packit Service 1fb00e
            "(Object references from within each control method)");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_TWICE,
Packit Service 1fb00e
        MtMethodAnalysisWalkBegin,
Packit Service 1fb00e
        MtMethodAnalysisWalkEnd, &AnalysisWalkInfo);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Generate the object cross-reference file if requested */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Generate cross-reference file");
Packit Service 1fb00e
    OtCreateXrefFile ();
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Semantic error checking part two - typing of method returns */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Determine object types returned by methods");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - Method typing\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
Packit Service 1fb00e
        NULL, AnMethodTypingWalkEnd, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Semantic error checking part three - operand type checking */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Analyze AML operand types");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
        "Semantic analysis - Operand type checking\n\n");
Packit Service 1fb00e
    if (Gbl_DoTypechecking)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD,
Packit Service 1fb00e
            NULL, AnOperandTypecheckWalkEnd, &AnalysisWalkInfo);
Packit Service 1fb00e
    }
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Semantic error checking part four - other miscellaneous checks */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Miscellaneous analysis");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Semantic analysis - miscellaneous\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
Packit Service 1fb00e
        AnOtherSemanticAnalysisWalkBegin,
Packit Service 1fb00e
        NULL, &AnalysisWalkInfo);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * ASL-/ASL+ converter: Gbl_ParseTreeRoot->CommentList contains the
Packit Service 1fb00e
     * very last comment of a given ASL file because it's the last constructed
Packit Service 1fb00e
     * node during compilation. We take the very last comment and save it in a
Packit Service 1fb00e
     * global for it to be used by the disassembler.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (AcpiGbl_CaptureComments)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AcpiGbl_LastListHead = Gbl_ParseTreeRoot->Asl.CommentList;
Packit Service 1fb00e
        Gbl_ParseTreeRoot->Asl.CommentList = NULL;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Calculate all AML package lengths */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Finish AML package length generation");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Generating Package lengths\n\n");
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
Packit Service 1fb00e
        LnInitLengthsWalk, NULL);
Packit Service 1fb00e
    TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_UPWARD, NULL,
Packit Service 1fb00e
        LnPackageLengthWalk, NULL);
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    /* Code generation - emit the AML */
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Generate AML code and write output files");
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n");
Packit Service 1fb00e
    CgGenerateAmlOutput ();
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    Event = UtBeginEvent ("Write optional output files");
Packit Service 1fb00e
    CmDoOutputFiles ();
Packit Service 1fb00e
    UtEndEvent (Event);
Packit Service 1fb00e
Packit Service 1fb00e
    UtEndEvent (FullCompile);
Packit Service 1fb00e
    CmCleanupAndExit ();
Packit Service 1fb00e
    return (0);
Packit Service 1fb00e
Packit Service 1fb00e
ErrorExit:
Packit Service 1fb00e
    UtEndEvent (FullCompile);
Packit Service 1fb00e
    CmCleanupAndExit ();
Packit Service 1fb00e
    return (-1);
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AslCompilerSignon
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  FileId      - ID of the output file
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Display compiler signon
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AslCompilerSignon (
Packit Service 1fb00e
    UINT32                  FileId)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    *Prefix = "";
Packit Service 1fb00e
    char                    *UtilityName;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Set line prefix depending on the destination file type */
Packit Service 1fb00e
Packit Service 1fb00e
    switch (FileId)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case ASL_FILE_ASM_SOURCE_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_ASM_INCLUDE_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        Prefix = "; ";
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case ASL_FILE_HEX_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Prefix = "; ";
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) ||
Packit Service 1fb00e
                 (Gbl_HexOutputFlag == HEX_OUTPUT_ASL))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            FlPrintFile (ASL_FILE_HEX_OUTPUT, "/*\n");
Packit Service 1fb00e
            Prefix = " * ";
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case ASL_FILE_C_SOURCE_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_OFFSET_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_INCLUDE_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        Prefix = " * ";
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* No other output types supported */
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Running compiler or disassembler? */
Packit Service 1fb00e
Packit Service 1fb00e
    if (AcpiGbl_DisasmFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        UtilityName = AML_DISASSEMBLER_NAME;
Packit Service 1fb00e
    }
Packit Service 1fb00e
    else
Packit Service 1fb00e
    {
Packit Service 1fb00e
        UtilityName = ASL_COMPILER_NAME;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Compiler signon with copyright */
Packit Service 1fb00e
Packit Service 1fb00e
    FlPrintFile (FileId, "%s\n", Prefix);
Packit Service 1fb00e
    FlPrintFile (FileId, ACPI_COMMON_HEADER (UtilityName, Prefix));
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    AslCompilerFileHeader
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  FileId      - ID of the output file
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Header used at the beginning of output files
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
AslCompilerFileHeader (
Packit Service 1fb00e
    UINT32                  FileId)
Packit Service 1fb00e
{
Packit Service 1fb00e
    struct tm               *NewTime;
Packit Service 1fb00e
    time_t                  Aclock;
Packit Service 1fb00e
    char                    *Prefix = "";
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    /* Set line prefix depending on the destination file type */
Packit Service 1fb00e
Packit Service 1fb00e
    switch (FileId)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case ASL_FILE_ASM_SOURCE_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_ASM_INCLUDE_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        Prefix = "; ";
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case ASL_FILE_HEX_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Prefix = "; ";
Packit Service 1fb00e
        }
Packit Service 1fb00e
        else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) ||
Packit Service 1fb00e
                 (Gbl_HexOutputFlag == HEX_OUTPUT_ASL))
Packit Service 1fb00e
        {
Packit Service 1fb00e
            Prefix = " * ";
Packit Service 1fb00e
        }
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    case ASL_FILE_C_SOURCE_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_OFFSET_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_INCLUDE_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        Prefix = " * ";
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* No other output types supported */
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Compilation header with timestamp */
Packit Service 1fb00e
Packit Service 1fb00e
    (void) time (&Aclock);
Packit Service 1fb00e
    NewTime = localtime (&Aclock);
Packit Service 1fb00e
Packit Service 1fb00e
    FlPrintFile (FileId,
Packit Service 1fb00e
        "%sCompilation of \"%s\" - %s%s\n",
Packit Service 1fb00e
        Prefix, Gbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
Packit Service 1fb00e
        Prefix);
Packit Service 1fb00e
Packit Service 1fb00e
    switch (FileId)
Packit Service 1fb00e
    {
Packit Service 1fb00e
    case ASL_FILE_C_SOURCE_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_OFFSET_OUTPUT:
Packit Service 1fb00e
    case ASL_FILE_C_INCLUDE_OUTPUT:
Packit Service 1fb00e
Packit Service 1fb00e
        FlPrintFile (FileId, " */\n");
Packit Service 1fb00e
        break;
Packit Service 1fb00e
Packit Service 1fb00e
    default:
Packit Service 1fb00e
Packit Service 1fb00e
        /* Nothing to do for other output types */
Packit Service 1fb00e
Packit Service 1fb00e
        break;
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CmFlushSourceCode
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Read in any remaining source code after the parse tree
Packit Service 1fb00e
 *              has been constructed.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
CmFlushSourceCode (
Packit Service 1fb00e
    void)
Packit Service 1fb00e
{
Packit Service 1fb00e
    char                    Buffer;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    while (FlReadFile (ASL_FILE_INPUT, &Buffer, 1) != AE_ERROR)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        AslInsertLineBuffer ((int) Buffer);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    AslResetCurrentLineBuffer ();
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CmDoOutputFiles
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Create all "listing" type files
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
CmDoOutputFiles (
Packit Service 1fb00e
    void)
Packit Service 1fb00e
{
Packit Service 1fb00e
Packit Service 1fb00e
    /* Create listings and hex files */
Packit Service 1fb00e
Packit Service 1fb00e
    LsDoListings ();
Packit Service 1fb00e
    HxDoHexOutput ();
Packit Service 1fb00e
Packit Service 1fb00e
    /* Dump the namespace to the .nsp file if requested */
Packit Service 1fb00e
Packit Service 1fb00e
    (void) NsDisplayNamespace ();
Packit Service 1fb00e
Packit Service 1fb00e
    /* Dump the device mapping file */
Packit Service 1fb00e
Packit Service 1fb00e
    MpEmitMappingInfo ();
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CmDumpAllEvents
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Dump all compiler events
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
static void
Packit Service 1fb00e
CmDumpAllEvents (
Packit Service 1fb00e
    void)
Packit Service 1fb00e
{
Packit Service 1fb00e
    ASL_EVENT_INFO          *Event;
Packit Service 1fb00e
    UINT32                  Delta;
Packit Service 1fb00e
    UINT32                  MicroSeconds;
Packit Service 1fb00e
    UINT32                  MilliSeconds;
Packit Service 1fb00e
    UINT32                  i;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    Event = AslGbl_Events;
Packit Service 1fb00e
Packit Service 1fb00e
    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
Packit Service 1fb00e
    if (Gbl_CompileTimesFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        printf ("\nElapsed time for major events\n\n");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    for (i = 0; i < AslGbl_NextEvent; i++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        if (Event->Valid)
Packit Service 1fb00e
        {
Packit Service 1fb00e
            /* Delta will be in 100-nanosecond units */
Packit Service 1fb00e
Packit Service 1fb00e
            Delta = (UINT32) (Event->EndTime - Event->StartTime);
Packit Service 1fb00e
Packit Service 1fb00e
            MicroSeconds = Delta / ACPI_100NSEC_PER_USEC;
Packit Service 1fb00e
            MilliSeconds = Delta / ACPI_100NSEC_PER_MSEC;
Packit Service 1fb00e
Packit Service 1fb00e
            /* Round milliseconds up */
Packit Service 1fb00e
Packit Service 1fb00e
            if ((MicroSeconds - (MilliSeconds * ACPI_USEC_PER_MSEC)) >= 500)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                MilliSeconds++;
Packit Service 1fb00e
            }
Packit Service 1fb00e
Packit Service 1fb00e
            DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
Packit Service 1fb00e
                MicroSeconds, MilliSeconds, Event->EventName);
Packit Service 1fb00e
Packit Service 1fb00e
            if (Gbl_CompileTimesFlag)
Packit Service 1fb00e
            {
Packit Service 1fb00e
                printf ("%8u usec %8u msec - %s\n",
Packit Service 1fb00e
                    MicroSeconds, MilliSeconds, Event->EventName);
Packit Service 1fb00e
            }
Packit Service 1fb00e
        }
Packit Service 1fb00e
Packit Service 1fb00e
        Event++;
Packit Service 1fb00e
    }
Packit Service 1fb00e
}
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
/*******************************************************************************
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * FUNCTION:    CmCleanupAndExit
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * PARAMETERS:  None
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * RETURN:      None.
Packit Service 1fb00e
 *
Packit Service 1fb00e
 * DESCRIPTION: Close all open files and exit the compiler
Packit Service 1fb00e
 *
Packit Service 1fb00e
 ******************************************************************************/
Packit Service 1fb00e
Packit Service 1fb00e
void
Packit Service 1fb00e
CmCleanupAndExit (
Packit Service 1fb00e
    void)
Packit Service 1fb00e
{
Packit Service 1fb00e
    UINT32                  i;
Packit Service 1fb00e
    BOOLEAN                 DeleteAmlFile = FALSE;
Packit Service 1fb00e
Packit Service 1fb00e
Packit Service 1fb00e
    AslCheckExpectedExceptions ();
Packit Service 1fb00e
    AePrintErrorLog (ASL_FILE_STDERR);
Packit Service 1fb00e
    if (Gbl_DebugFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        /* Print error summary to stdout also */
Packit Service 1fb00e
Packit Service 1fb00e
        AePrintErrorLog (ASL_FILE_STDOUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Emit compile times if enabled */
Packit Service 1fb00e
Packit Service 1fb00e
    CmDumpAllEvents ();
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_CompileTimesFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        printf ("\nMiscellaneous compile statistics\n\n");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
Packit Service 1fb00e
        printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalNamedObjects, "Named objects");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalMethods, "Control methods");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalAllocations, "Memory Allocations");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalAllocated, "Total allocated memory");
Packit Service 1fb00e
        printf ("%11u : %s\n", TotalFolds, "Constant subtrees folded");
Packit Service 1fb00e
        printf ("\n");
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_NsLookupCount)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
            "\n\nMiscellaneous compile statistics\n\n");
Packit Service 1fb00e
Packit Service 1fb00e
        DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
            "%32s : %u\n", "Total Namespace searches",
Packit Service 1fb00e
            Gbl_NsLookupCount);
Packit Service 1fb00e
Packit Service 1fb00e
        DbgPrint (ASL_DEBUG_OUTPUT,
Packit Service 1fb00e
            "%32s : %u usec\n", "Time per search", ((UINT32)
Packit Service 1fb00e
            (AslGbl_Events[AslGbl_NamespaceEvent].EndTime -
Packit Service 1fb00e
                AslGbl_Events[AslGbl_NamespaceEvent].StartTime) / 10) /
Packit Service 1fb00e
                Gbl_NsLookupCount);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        printf ("\nMaximum error count (%u) exceeded\n",
Packit Service 1fb00e
            ASL_MAX_ERROR_COUNT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    UtDisplaySummary (ASL_FILE_STDOUT);
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * We will delete the AML file if there are errors and the
Packit Service 1fb00e
     * force AML output option has not been used.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if ((Gbl_ExceptionCount[ASL_ERROR] > 0) &&
Packit Service 1fb00e
        (!Gbl_IgnoreErrors) &&
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        DeleteAmlFile = TRUE;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Close all open files */
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Take care with the preprocessor file (.pre), it might be the same
Packit Service 1fb00e
     * as the "input" file, depending on where the compiler has terminated
Packit Service 1fb00e
     * or aborted. Prevent attempt to close the same file twice in
Packit Service 1fb00e
     * loop below.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (Gbl_Files[ASL_FILE_PREPROCESSOR].Handle ==
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_INPUT].Handle)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Close the standard I/O files */
Packit Service 1fb00e
Packit Service 1fb00e
    for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        FlCloseFile (i);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Delete AML file if there are errors */
Packit Service 1fb00e
Packit Service 1fb00e
    if (DeleteAmlFile)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        FlDeleteFile (ASL_FILE_AML_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Delete the preprocessor temp file unless full debug was specified */
Packit Service 1fb00e
Packit Service 1fb00e
    if (Gbl_PreprocessFlag && !Gbl_KeepPreprocessorTempFile)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        FlDeleteFile (ASL_FILE_PREPROCESSOR);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /*
Packit Service 1fb00e
     * Delete intermediate ("combined") source file (if -ls flag not set)
Packit Service 1fb00e
     * This file is created during normal ASL/AML compiles. It is not
Packit Service 1fb00e
     * created by the data table compiler.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * If the -ls flag is set, then the .SRC file should not be deleted.
Packit Service 1fb00e
     * In this case, Gbl_SourceOutputFlag is set to TRUE.
Packit Service 1fb00e
     *
Packit Service 1fb00e
     * Note: Handles are cleared by FlCloseFile above, so we look at the
Packit Service 1fb00e
     * filename instead, to determine if the .SRC file was actually
Packit Service 1fb00e
     * created.
Packit Service 1fb00e
     */
Packit Service 1fb00e
    if (!Gbl_SourceOutputFlag)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        FlDeleteFile (ASL_FILE_SOURCE_OUTPUT);
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
    /* Final cleanup after compiling one file */
Packit Service 1fb00e
Packit Service 1fb00e
    if (!Gbl_DoAslConversion)
Packit Service 1fb00e
    {
Packit Service 1fb00e
        UtDeleteLocalCaches ();
Packit Service 1fb00e
    }
Packit Service 1fb00e
Packit Service 1fb00e
}