⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aslcompile.c

📁 acpi tools for linux include acpiexec and acpixtract
💻 C
📖 第 1 页 / 共 2 页
字号:
        }        else if (Byte == '/')        {            OpeningComment = TRUE;        }        /* Check for an ASCII character */        if (!isascii (Byte))        {            if (BadBytes < 10)            {                AcpiOsPrintf (                    "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",                    Byte, Status.Line, Status.Offset);            }            BadBytes++;        }        /* Update line counter */        else if (Byte == 0x0A)        {            Status.Line++;        }        Status.Offset++;    }    /* Seek back to the beginning of the source file */    fseek (FileInfo->Handle, 0, SEEK_SET);    /* Were there any non-ASCII characters in the file? */    if (BadBytes)    {        AcpiOsPrintf (            "%u non-ASCII characters found in input source text, could be a binary file\n",            BadBytes);        AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);        return (AE_BAD_CHARACTER);    }    /* File is OK */    return (AE_OK);}/******************************************************************************* * * FUNCTION:    CmDoCompile * * PARAMETERS:  None * * RETURN:      Status (0 = OK) * * DESCRIPTION: This procedure performs the entire compile * ******************************************************************************/intCmDoCompile (    void){    ACPI_STATUS             Status;    UINT8                   FullCompile;    UINT8                   Event;    FullCompile = UtBeginEvent ("*** Total Compile time ***");    Event = UtBeginEvent ("Open input and output files");    /* Open the required input and output files */    Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);    if (ACPI_FAILURE (Status))    {        AePrintErrorLog (ASL_FILE_STDERR);        return -1;    }    /* Check for 100% ASCII source file (comments are ignored) */    Status = FlCheckForAscii (&Gbl_Files[ASL_FILE_INPUT]);    if (ACPI_FAILURE (Status))    {        AePrintErrorLog (ASL_FILE_STDERR);        return -1;    }    Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);    if (ACPI_FAILURE (Status))    {        AePrintErrorLog (ASL_FILE_STDERR);        return -1;    }    UtEndEvent (Event);    /* Build the parse tree */    Event = UtBeginEvent ("Parse source code and build parse tree");    AslCompilerparse();    UtEndEvent (Event);    /* Flush out any remaining source after parse tree is complete */    Event = UtBeginEvent ("Flush source input");    CmFlushSourceCode ();    /* Did the parse tree get successfully constructed? */    if (!RootNode)    {        CmCleanupAndExit ();        return -1;    }    /* Optional parse tree dump, compiler debug output only */    LsDumpParseTree ();    OpcGetIntegerWidth (RootNode);    UtEndEvent (Event);    /* Pre-process parse tree for any operator transforms */    Event = UtBeginEvent ("Parse tree transforms");    DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,        TrAmlTransformWalk, NULL, NULL);    UtEndEvent (Event);    /* Generate AML opcodes corresponding to the parse tokens */    Event = UtBeginEvent ("Generate AML opcodes");    DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating AML opcodes\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,        OpcAmlOpcodeWalk, NULL);    UtEndEvent (Event);    /*     * Now that the input is parsed, we can open the AML output file.     * Note: by default, the name of this file comes from the table descriptor     * within the input file.     */    Event = UtBeginEvent ("Open AML output file");    Status = FlOpenAmlOutputFile (Gbl_OutputFilenamePrefix);    if (ACPI_FAILURE (Status))    {        AePrintErrorLog (ASL_FILE_STDERR);        return -1;    }    UtEndEvent (Event);    /* Interpret and generate all compile-time constants */    Event = UtBeginEvent ("Constant folding via AML interpreter");    DbgPrint (ASL_DEBUG_OUTPUT,        "\nInterpreting compile-time constant expressions\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,        OpcAmlConstantWalk, NULL, NULL);    UtEndEvent (Event);    /* Update AML opcodes if necessary, after constant folding */    Event = UtBeginEvent ("Updating AML opcodes after constant folding");    DbgPrint (ASL_DEBUG_OUTPUT,        "\nUpdating AML opcodes after constant folding\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD,        NULL, OpcAmlOpcodeUpdateWalk, NULL);    UtEndEvent (Event);    /* Calculate all AML package lengths */    Event = UtBeginEvent ("Generate AML package lengths");    DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,        LnPackageLengthWalk, NULL);    UtEndEvent (Event);    if (Gbl_ParseOnlyFlag)    {        AePrintErrorLog (ASL_FILE_STDOUT);        UtDisplaySummary (ASL_FILE_STDOUT);        if (Gbl_DebugFlag)        {            /* Print error summary to the debug file */            AePrintErrorLog (ASL_FILE_STDERR);            UtDisplaySummary (ASL_FILE_STDERR);        }        return 0;    }    /*     * Create an internal namespace and use it as a symbol table     */    /* Namespace loading */    Event = UtBeginEvent ("Create ACPI Namespace");    Status = LdLoadNamespace (RootNode);    UtEndEvent (Event);    if (ACPI_FAILURE (Status))    {        return -1;    }    /* Namespace cross-reference */    AslGbl_NamespaceEvent = UtBeginEvent ("Cross reference parse tree and Namespace");    Status = LkCrossReferenceNamespace ();    if (ACPI_FAILURE (Status))    {        return -1;    }    /* Namespace - Check for non-referenced objects */    LkFindUnreferencedObjects ();    UtEndEvent (AslGbl_NamespaceEvent);    /*     * Semantic analysis.  This can happen only after the     * namespace has been loaded and cross-referenced.     *     * part one - check control methods     */    Event = UtBeginEvent ("Analyze control method return types");    AnalysisWalkInfo.MethodStack = NULL;    DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method analysis\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,        AnMethodAnalysisWalkBegin,        AnMethodAnalysisWalkEnd, &AnalysisWalkInfo);    UtEndEvent (Event);    /* Semantic error checking part two - typing of method returns */    Event = UtBeginEvent ("Determine object types returned by methods");    DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method typing\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,        AnMethodTypingWalkBegin,        AnMethodTypingWalkEnd, NULL);    UtEndEvent (Event);    /* Semantic error checking part three - operand type checking */    Event = UtBeginEvent ("Analyze AML operand types");    DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Operand type checking\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,        AnOperandTypecheckWalkBegin,        AnOperandTypecheckWalkEnd, &AnalysisWalkInfo);    UtEndEvent (Event);    /* Semantic error checking part four - other miscellaneous checks */    Event = UtBeginEvent ("Miscellaneous analysis");    DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - miscellaneous\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,        AnOtherSemanticAnalysisWalkBegin,        AnOtherSemanticAnalysisWalkEnd, &AnalysisWalkInfo);    UtEndEvent (Event);    /* Calculate all AML package lengths */    Event = UtBeginEvent ("Finish AML package length generation");    DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");    TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,        LnInitLengthsWalk, NULL);    TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,        LnPackageLengthWalk, NULL);    UtEndEvent (Event);    /* Code generation - emit the AML */    Event = UtBeginEvent ("Generate AML code and write output files");    CgGenerateAmlOutput ();    UtEndEvent (Event);    Event = UtBeginEvent ("Write optional output files");    CmDoOutputFiles ();    UtEndEvent (Event);    UtEndEvent (FullCompile);    CmCleanupAndExit ();    return 0;}/******************************************************************************* * * FUNCTION:    CmDoOutputFiles * * PARAMETERS:  None * * RETURN:      None. * * DESCRIPTION: Create all "listing" type files * ******************************************************************************/voidCmDoOutputFiles (    void){    /* Create listings and hex files */    LsDoListings ();    LsDoHexOutput ();    /* Dump the namespace to the .nsp file if requested */    (void) LsDisplayNamespace ();}/******************************************************************************* * * FUNCTION:    CmDumpEvent * * PARAMETERS:  Event           - A compiler event struct * * RETURN:      None. * * DESCRIPTION: Dump a compiler event struct * ******************************************************************************/static voidCmDumpEvent (    ASL_EVENT_INFO          *Event){    UINT32                  Delta;    UINT32                  USec;    UINT32                  MSec;    if (!Event->Valid)    {        return;    }    /* Delta will be in 100-nanosecond units */    Delta = (UINT32) (Event->EndTime - Event->StartTime);    USec = Delta / 10;    MSec = Delta / 10000;    /* Round milliseconds up */    if ((USec - (MSec * 1000)) >= 500)    {        MSec++;    }    DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",        USec, MSec, Event->EventName);}/******************************************************************************* * * FUNCTION:    CmCleanupAndExit * * PARAMETERS:  None * * RETURN:      None. * * DESCRIPTION: Close all open files and exit the compiler * ******************************************************************************/voidCmCleanupAndExit (    void){    UINT32                  i;    AePrintErrorLog (ASL_FILE_STDOUT);    if (Gbl_DebugFlag)    {        /* Print error summary to the debug file */        AePrintErrorLog (ASL_FILE_STDERR);    }    DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");    for (i = 0; i < AslGbl_NextEvent; i++)    {        CmDumpEvent (&AslGbl_Events[i]);    }    if (Gbl_CompileTimesFlag)    {        printf ("\nElapsed time for major events\n\n");        for (i = 0; i < AslGbl_NextEvent; i++)        {            CmDumpEvent (&AslGbl_Events[i]);        }        printf ("\nMiscellaneous compile statistics\n\n");        printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");        printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");        printf ("%11u : %s\n", TotalNamedObjects, "Named objects");        printf ("%11u : %s\n", TotalMethods, "Control methods");        printf ("%11u : %s\n", TotalAllocations, "Memory Allocations");        printf ("%11u : %s\n", TotalAllocated, "Total allocated memory");        printf ("%11u : %s\n", TotalFolds, "Constant subtrees folded");        printf ("\n");    }    if (Gbl_NsLookupCount)    {        DbgPrint (ASL_DEBUG_OUTPUT, "\n\nMiscellaneous compile statistics\n\n");        DbgPrint (ASL_DEBUG_OUTPUT, "%32s : %d\n", "Total Namespace searches",            Gbl_NsLookupCount);        DbgPrint (ASL_DEBUG_OUTPUT, "%32s : %d usec\n", "Time per search",            ((UINT32) (AslGbl_Events[AslGbl_NamespaceEvent].EndTime -                        AslGbl_Events[AslGbl_NamespaceEvent].StartTime) /                        10) / Gbl_NsLookupCount);    }    /* Close all open files */    for (i = 2; i < ASL_MAX_FILE_TYPE; i++)    {        FlCloseFile (i);    }    /*     * TBD: SourceOutput should be .TMP, then rename if we want to keep it?     */    if (!Gbl_SourceOutputFlag)    {        remove (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);    }    /* Delete AML file if there are errors */    if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))    {        remove (Gbl_Files[ASL_FILE_AML_OUTPUT].Filename);    }    if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)    {        printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT);    }    UtDisplaySummary (ASL_FILE_STDOUT);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -