Message ID | 20190408145153.5485-1-colin.king@canonical.com |
---|---|
State | Accepted |
Headers | show |
Series | [1/3] ACPICA: Update to version 20190405 | expand |
On 4/8/19 10:51 PM, Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/pipermail/devel/2019-April/001889.html > > This also required some rework with the fwts iasl interface > because of changes to where error messages are now being written > (stderr rather than stdout). > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpi/syntaxcheck/syntaxcheck.c | 4 +- > src/acpica/source/common/adisasm.c | 2 +- > src/acpica/source/compiler/aslcodegen.c | 52 +--- > src/acpica/source/compiler/aslcompile.c | 183 ++++++++++--- > src/acpica/source/compiler/aslcompiler.h | 61 ++++- > src/acpica/source/compiler/asldefine.h | 1 - > src/acpica/source/compiler/aslerror.c | 26 +- > src/acpica/source/compiler/aslfileio.c | 4 +- > src/acpica/source/compiler/aslfiles.c | 253 +++++++++++++++++- > src/acpica/source/compiler/aslglobal.h | 48 ++-- > src/acpica/source/compiler/asllisting.c | 7 +- > src/acpica/source/compiler/aslload.c | 1 + > src/acpica/source/compiler/aslmain.c | 81 ++++-- > src/acpica/source/compiler/aslmessages.c | 7 +- > src/acpica/source/compiler/aslmessages.h | 5 +- > src/acpica/source/compiler/asloperands.c | 25 ++ > src/acpica/source/compiler/asloptions.c | 1 - > src/acpica/source/compiler/aslstartup.c | 130 ++++----- > src/acpica/source/compiler/aslsupport.l | 12 +- > src/acpica/source/compiler/asltree.c | 70 ++++- > src/acpica/source/compiler/asltypes.h | 62 +++-- > src/acpica/source/compiler/aslutils.c | 156 +++++++++-- > src/acpica/source/compiler/aslxref.c | 18 ++ > src/acpica/source/compiler/dtcompile.c | 11 +- > .../source/compiler/fwts_iasl_interface.c | 42 +-- > src/acpica/source/compiler/prutils.c | 1 - > src/acpica/source/components/events/evgpe.c | 8 + > .../source/components/namespace/nsalloc.c | 5 + > src/acpica/source/include/acpixf.h | 2 +- > 29 files changed, 978 insertions(+), 300 deletions(-) > > diff --git a/src/acpi/syntaxcheck/syntaxcheck.c b/src/acpi/syntaxcheck/syntaxcheck.c > index 5d1ea112..d1eb0798 100644 > --- a/src/acpi/syntaxcheck/syntaxcheck.c > +++ b/src/acpi/syntaxcheck/syntaxcheck.c > @@ -488,9 +488,9 @@ static int syntaxcheck_single_table( > fwts_log_info(fw, "Checking ACPI table %s (#%d)", info->name, n); > fwts_log_nl(fw); > > - if (iasl_stdout) { > + if (iasl_stderr) { > /* Scan error text from assembly */ > - fwts_list_foreach(item, iasl_stdout) { > + fwts_list_foreach(item, iasl_stderr) { > int num; > char ch; > char *line = fwts_text_list_text(item); > diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c > index 518468b7..c73208f6 100644 > --- a/src/acpica/source/common/adisasm.c > +++ b/src/acpica/source/common/adisasm.c > @@ -579,7 +579,7 @@ AdDisassembleOneTable ( > if (AslGbl_MapfileFlag) > { > fprintf (stderr, "%14s %s - %u bytes\n", > - AslGbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, > + AslGbl_FileDescs[ASL_FILE_MAP_OUTPUT].ShortDescription, > AslGbl_Files[ASL_FILE_MAP_OUTPUT].Filename, > FlGetFileSize (ASL_FILE_MAP_OUTPUT)); > } > diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c > index 8edcb668..88e34824 100644 > --- a/src/acpica/source/compiler/aslcodegen.c > +++ b/src/acpica/source/compiler/aslcodegen.c > @@ -174,11 +174,11 @@ CgWriteTableHeader ( > ACPI_PARSE_OBJECT *Op); > > static void > -CgCloseTable ( > - void); > +CgWriteNode ( > + ACPI_PARSE_OBJECT *Op); > > static void > -CgWriteNode ( > +CgUpdateHeader ( > ACPI_PARSE_OBJECT *Op); > > > @@ -202,15 +202,12 @@ CgGenerateAmlOutput ( > > /* Generate the AML output file */ > > - FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); > - AslGbl_SourceLine = 0; > - AslGbl_NextError = AslGbl_ErrorLog; > - > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, > + ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY, > CgAmlWriteWalk, NULL, NULL); > > DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); > - CgCloseTable (); > + CgUpdateHeader (AslGbl_CurrentDB); > } > > > @@ -708,38 +705,13 @@ CgUpdateHeader ( > ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum)); > > FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); > -} > - > - > -/******************************************************************************* > - * > - * FUNCTION: CgCloseTable > - * > - * PARAMETERS: None. > - * > - * RETURN: None. > - * > - * DESCRIPTION: Complete the ACPI table by calculating the checksum and > - * re-writing each table header. This allows support for > - * multiple definition blocks in a single source file. > - * > - ******************************************************************************/ > - > -static void > -CgCloseTable ( > - void) > -{ > - ACPI_PARSE_OBJECT *Op; > - > > - /* Process all definition blocks */ > - > - Op = AslGbl_ParseTreeRoot->Asl.Child; > - while (Op) > - { > - CgUpdateHeader (Op); > - Op = Op->Asl.Next; > - } > + /* > + * Seek to the end of the file. This is done to support multiple file > + * compilation. Doing this simplifies other parts of the codebase because > + * it eliminates the need to seek for a different starting place. > + */ > + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); > } > > > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index c46b28da..845f15bc 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -178,6 +178,10 @@ static void > CmDumpAllEvents ( > void); > > +static void > +CmFinishFiles( > + BOOLEAN DeleteAmlFile); > + > > /******************************************************************************* > * > @@ -191,13 +195,13 @@ CmDumpAllEvents ( > * > ******************************************************************************/ > > -int > +ACPI_STATUS > CmDoCompile ( > void) > { > - ACPI_STATUS Status; > UINT8 FullCompile; > UINT8 Event; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > FullCompile = UtBeginEvent ("*** Total Compile time ***"); > @@ -221,7 +225,7 @@ CmDoCompile ( > { > UtEndEvent (Event); > CmCleanupAndExit (); > - return (0); > + return (AE_OK); > } > } > UtEndEvent (Event); > @@ -239,6 +243,12 @@ CmDoCompile ( > { > fprintf (stderr, > "Compiler aborting due to parser-detected syntax error(s)\n"); > + > + /* Flag this error in the FileNode for compilation summary */ > + > + FileNode = FlGetCurrentFileNode (); > + FileNode->ParserErrorDetected = TRUE; > + AslGbl_ParserErrorDetected = TRUE; > LsDumpParseTree (); > goto ErrorExit; > } > @@ -292,19 +302,35 @@ CmDoCompile ( > 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 (AslGbl_OutputFilenamePrefix); > - UtEndEvent (Event); > - if (ACPI_FAILURE (Status)) > - { > - AePrintErrorLog (ASL_FILE_STDERR); > - return (-1); > - } > + UtEndEvent (FullCompile); > + return (AE_OK); > + > +ErrorExit: > + UtEndEvent (FullCompile); > + return (AE_ERROR); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: CmDoAslMiddleAndBackEnd > + * > + * PARAMETERS: None > + * > + * RETURN: Status of middle-end and back-end > + * > + * DESCRIPTION: Perform compiler middle-end (type checking and semantic > + * analysis) and back-end (code generation) > + * > + ******************************************************************************/ > + > +int > +CmDoAslMiddleAndBackEnd ( > + void) > +{ > + UINT8 Event; > + ACPI_STATUS Status; > + > > /* Interpret and generate all compile-time constants */ > > @@ -351,7 +377,6 @@ CmDoCompile ( > AePrintErrorLog (ASL_FILE_STDOUT); > UtDisplaySummary (ASL_FILE_STDOUT); > } > - UtEndEvent (FullCompile); > return (0); > } > > @@ -367,7 +392,7 @@ CmDoCompile ( > UtEndEvent (Event); > if (ACPI_FAILURE (Status)) > { > - goto ErrorExit; > + return (-1); > } > > /* Namespace cross-reference */ > @@ -378,7 +403,7 @@ CmDoCompile ( > Status = XfCrossReferenceNamespace (); > if (ACPI_FAILURE (Status)) > { > - goto ErrorExit; > + return (-1); > } > > /* Namespace - Check for non-referenced objects */ > @@ -486,22 +511,47 @@ CmDoCompile ( > > Event = UtBeginEvent ("Generate AML code and write output files"); > DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n"); > - CgGenerateAmlOutput (); > + > + AslGbl_CurrentDB = AslGbl_ParseTreeRoot->Asl.Child; > + > + while (AslGbl_CurrentDB) > + { > + switch (FlSwitchFileSet(AslGbl_CurrentDB->Asl.Filename)) > + { > + case SWITCH_TO_DIFFERENT_FILE: > + /* > + * Reset these parameters when definition blocks belong in > + * different files. If they belong in the same file, there is > + * no need to reset these parameters > + */ > + FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); > + AslGbl_SourceLine = 0; > + AslGbl_NextError = AslGbl_ErrorLog; > + > + /* fall-through */ > + > + case SWITCH_TO_SAME_FILE: > + > + CgGenerateAmlOutput (); > + CmDoOutputFiles (); > + AslGbl_CurrentDB = AslGbl_CurrentDB->Asl.Next; > + > + break; > + > + default: /* FILE_NOT_FOUND */ > + > + /* The requested file could not be found. Get out of here */ > + > + AslGbl_CurrentDB = NULL; > + break; > + } > + } > UtEndEvent (Event); > > Event = UtBeginEvent ("Write optional output files"); > - CmDoOutputFiles (); > UtEndEvent (Event); > > - UtEndEvent (FullCompile); > - AslCheckExpectedExceptions (); > - CmCleanupAndExit (); > return (0); > - > -ErrorExit: > - UtEndEvent (FullCompile); > - CmCleanupAndExit (); > - return (-1); > } > > > @@ -808,10 +858,14 @@ void > CmCleanupAndExit ( > void) > { > - UINT32 i; > BOOLEAN DeleteAmlFile = FALSE; > + ASL_GLOBAL_FILE_NODE *CurrentFileNode = AslGbl_FilesList; > > > + /* Check if any errors occurred during compile */ > + > + (void) AslCheckForErrorExit (); > + > AePrintErrorLog (ASL_FILE_STDERR); > if (AslGbl_DebugFlag) > { > @@ -865,15 +919,63 @@ CmCleanupAndExit ( > * We will delete the AML file if there are errors and the > * force AML output option has not been used. > */ > - if ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && > + if (AslGbl_ParserErrorDetected || ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && > (!AslGbl_IgnoreErrors) && > - AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle)) > { > DeleteAmlFile = TRUE; > } > > /* Close all open files */ > > + while (CurrentFileNode) > + { > + switch (FlSwitchFileSet (CurrentFileNode->Files[ASL_FILE_INPUT].Filename)) > + { > + case SWITCH_TO_SAME_FILE: > + case SWITCH_TO_DIFFERENT_FILE: > + > + CmFinishFiles (DeleteAmlFile); > + CurrentFileNode = CurrentFileNode->Next; > + break; > + > + case FILE_NOT_FOUND: > + default: > + > + CurrentFileNode = NULL; > + break; > + } > + } > + > + /* Final cleanup after compiling one file */ > + > + if (!AslGbl_DoAslConversion) > + { > + UtDeleteLocalCaches (); > + } > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: CmFinishFiles > + * > + * PARAMETERS: DeleteAmlFile > + * > + * RETURN: None. > + * > + * DESCRIPTION: Close all open files, delete AML files depending on the > + * function parameter is true. > + * > + ******************************************************************************/ > + > +static void > +CmFinishFiles( > + BOOLEAN DeleteAmlFile) > +{ > + UINT32 i; > + > + > /* > * Take care with the preprocessor file (.pre), it might be the same > * as the "input" file, depending on where the compiler has terminated > @@ -890,7 +992,15 @@ CmCleanupAndExit ( > > for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++) > { > - FlCloseFile (i); > + /* > + * Some files such as debug output files could be pointing to > + * stderr or stdout. Leave these alone. > + */ > + if (AslGbl_Files[i].Handle != stderr && > + AslGbl_Files[i].Handle != stdout) > + { > + FlCloseFile (i); > + } > } > > /* Delete AML file if there are errors */ > @@ -923,11 +1033,4 @@ CmCleanupAndExit ( > { > FlDeleteFile (ASL_FILE_SOURCE_OUTPUT); > } > - > - /* Final cleanup after compiling one file */ > - > - if (!AslGbl_DoAslConversion) > - { > - UtDeleteLocalCaches (); > - } > } > diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h > index efcee77b..ad0e73f3 100644 > --- a/src/acpica/source/compiler/aslcompiler.h > +++ b/src/acpica/source/compiler/aslcompiler.h > @@ -254,10 +254,14 @@ void > AslCompilerFileHeader ( > UINT32 FileId); > > -int > +ACPI_STATUS > CmDoCompile ( > void); > > +int > +CmDoAslMiddleAndBackEnd ( > + void); > + > void > CmDoOutputFiles ( > void); > @@ -266,6 +270,10 @@ void > CmCleanupAndExit ( > void); > > +ACPI_STATUS > +AslDoDisassembly ( > + void); > + > > /* > * aslallocate - memory allocation > @@ -875,9 +883,10 @@ ExDoExternal ( > > /* Values for "Visitation" parameter above */ > > -#define ASL_WALK_VISIT_DOWNWARD 0x01 > -#define ASL_WALK_VISIT_UPWARD 0x02 > -#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) > +#define ASL_WALK_VISIT_DOWNWARD 0x01 > +#define ASL_WALK_VISIT_UPWARD 0x02 > +#define ASL_WALK_VISIT_DB_SEPARATELY 0x04 > +#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) > > > /* > @@ -1034,6 +1043,11 @@ FlSeekFile ( > UINT32 FileId, > long Offset); > > +void > +FlSeekFileSet ( > + UINT32 FileId, > + long Offset); > + > void > FlCloseFile ( > UINT32 FileId); > @@ -1068,6 +1082,34 @@ ACPI_STATUS > FlOpenMiscOutputFiles ( > char *InputFilename); > > +ACPI_STATUS > +FlInitOneFile ( > + char *InputFilename); > + > +ASL_FILE_SWITCH_STATUS > +FlSwitchFileSet ( > + char *InputFilename); > + > +FILE * > +FlGetFileHandle ( > + UINT32 OutFileId, > + UINT32 InFileId, > + char *Filename); > + > +ASL_GLOBAL_FILE_NODE * > +FlGetFileNode ( > + UINT32 FileId, > + char *Filename); > + > +ASL_GLOBAL_FILE_NODE * > +FlGetCurrentFileNode ( > + void); > + > +BOOLEAN > +FlInputFileExists ( > + char *InputFilename); > + > + > /* > * aslhwmap - hardware map summary > */ > @@ -1083,7 +1125,6 @@ ACPI_STATUS > LdLoadNamespace ( > ACPI_PARSE_OBJECT *RootOp); > > - > /* > * asllookup - namespace lookup functions > */ > @@ -1091,6 +1132,7 @@ void > LkFindUnreferencedObjects ( > void); > > + > /* > * aslhelp - help screens > */ > @@ -1118,6 +1160,7 @@ void > NsSetupNamespaceListing ( > void *Handle); > > + > /* > * asloptions - command line processing > */ > @@ -1126,6 +1169,7 @@ AslCommandLine ( > int argc, > char **argv); > > + > /* > * aslxref - namespace cross reference > */ > @@ -1220,6 +1264,11 @@ void > UtDisplaySummary ( > UINT32 FileId); > > +void > +UtDisplayOneSummary ( > + UINT32 FileId, > + BOOLEAN DisplayErrorSummary); > + > void > UtConvertByteToHex ( > UINT8 RawByte, > @@ -1271,6 +1320,7 @@ AuConvertUuidToString ( > char *UuIdBuffer, > char *OutString); > > + > /* > * aslresource - Resource template generation utilities > */ > @@ -1478,6 +1528,7 @@ ASL_RESOURCE_NODE * > RsDoPinGroupConfigDescriptor ( > ASL_RESOURCE_INFO *Info); > > + > /* > * aslrestype2d - DWord address descriptors > */ > diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h > index 8089d0b9..cffb0af1 100644 > --- a/src/acpica/source/compiler/asldefine.h > +++ b/src/acpica/source/compiler/asldefine.h > @@ -298,5 +298,4 @@ > #define COMMENT_CAPTURE_ON AslGbl_CommentState.CaptureComments = TRUE; > #define COMMENT_CAPTURE_OFF AslGbl_CommentState.CaptureComments = FALSE; > > - > #endif /* ASLDEFINE.H */ > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index a2f9fcef..db6d871d 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -474,10 +474,12 @@ AePrintErrorSourceLine ( > * Use the merged header/source file if present, otherwise > * use input file > */ > - SourceFile = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; > + SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT, > + ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename); > if (!SourceFile) > { > - SourceFile = AslGbl_Files[ASL_FILE_INPUT].Handle; > + SourceFile = FlGetFileHandle (ASL_FILE_INPUT, > + ASL_FILE_INPUT, Enode->Filename); > } > > if (SourceFile) > @@ -818,6 +820,7 @@ static void AslInitEnode ( > ASL_ERROR_MSG *SubError) > { > ASL_ERROR_MSG *Enode; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); > @@ -859,6 +862,23 @@ static void AslInitEnode ( > { > Enode->FilenameLength = 6; > } > + > + FileNode = FlGetCurrentFileNode (); > + if (!FileNode) > + { > + return; > + } > + > + if (!FlInputFileExists (Filename)) > + { > + /* > + * This means that this file is an include file. Record the .src > + * file as the error message source because this file is not in > + * the global file list. > + */ > + Enode->SourceFilename = > + FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename; > + } > } > } > > @@ -992,7 +1012,7 @@ AslLogNewError ( > } > > AslGbl_ExceptionCount[ModifiedLevel]++; > - if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > + if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > { > printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT); > > diff --git a/src/acpica/source/compiler/aslfileio.c b/src/acpica/source/compiler/aslfileio.c > index 3243ab51..3db7b533 100644 > --- a/src/acpica/source/compiler/aslfileio.c > +++ b/src/acpica/source/compiler/aslfileio.c > @@ -177,7 +177,7 @@ FlFileError ( > { > > sprintf (AslGbl_MsgBuffer, "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename, > - AslGbl_Files[FileId].Description, strerror (errno)); > + AslGbl_FileDescs[FileId].Description, strerror (errno)); > > AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer); > } > @@ -500,7 +500,7 @@ FlDeleteFile ( > if (remove (Info->Filename)) > { > printf ("%s (%s file) ", > - Info->Filename, Info->Description); > + Info->Filename, AslGbl_FileDescs[FileId].Description); > perror ("Could not delete"); > } > > diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c > index 0120af02..80a74e81 100644 > --- a/src/acpica/source/compiler/aslfiles.c > +++ b/src/acpica/source/compiler/aslfiles.c > @@ -170,6 +170,257 @@ FlParseInputPathname ( > #endif > > > +/******************************************************************************* > + * > + * FUNCTION: FlInitOneFile > + * > + * PARAMETERS: InputFilename - The user-specified ASL source file to be > + * compiled > + * > + * RETURN: Status > + * > + * DESCRIPTION: Initialize global file structure for one input file. This file > + * structure contains references to input, output, debugging, and > + * other miscellaneous files that are associated for a single > + * input ASL file. > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +FlInitOneFile ( > + char *InputFilename) > +{ > + UINT32 i; > + ASL_GLOBAL_FILE_NODE *NewFileNode; > + > + > + if (FlInputFileExists (InputFilename)) > + { > + AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); > + return (AE_ALREADY_EXISTS); > + } > + > + NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, > + UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); > + > + if (!NewFileNode) > + { > + AslError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, NULL, NULL); > + return (AE_NO_MEMORY); > + } > + > + NewFileNode->ParserErrorDetected = FALSE; > + NewFileNode->Next = AslGbl_FilesList; > + > + AslGbl_FilesList = NewFileNode; > + AslGbl_Files = NewFileNode->Files; > + > + for (i = 0; i < ASL_NUM_FILES; i++) > + { > + AslGbl_Files[i].Handle = NULL; > + AslGbl_Files[i].Filename = NULL; > + } > + > + AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > + AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > + > + if (AslGbl_VerboseErrors) > + { > + AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; > + } > + else > + { > + AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > + } > + > + AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; > + return (AE_OK); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlInputFileExists > + * > + * PARAMETERS: Filename - File name to be searched > + * > + * RETURN: Status > + * > + * DESCRIPTION: Returns true if the file name already exists. > + * > + ******************************************************************************/ > + > +BOOLEAN > +FlInputFileExists ( > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + while (Current) > + { > + if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) > + { > + return (TRUE); > + } > + > + Current = Current->Next; > + } > + > + return (FALSE); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlSwitchFileSet > + * > + * PARAMETERS: Op - Parse node for the LINE asl statement > + * > + * RETURN: None. > + * > + * DESCRIPTION: Set the current line number > + * > + ******************************************************************************/ > + > +ASL_FILE_SWITCH_STATUS > +FlSwitchFileSet ( > + char *InputFilename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; > + > + > + while (Current) > + { > + if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) > + { > + AslGbl_Files = Current->Files; > + AslGbl_TableSignature = Current->TableSignature; > + AslGbl_TableId = Current->TableId; > + > + if (!strcmp (InputFilename, PrevFilename)) > + { > + return (SWITCH_TO_SAME_FILE); > + } > + else > + { > + return (SWITCH_TO_DIFFERENT_FILE); > + } > + } > + > + Current = Current->Next; > + } > + > + return (FILE_NOT_FOUND); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetFileHandle > + * > + * PARAMETERS: OutFileId - denotes file type of output handle > + * InFileId - denotes file type of the input Filename > + * Filename > + * > + * RETURN: File handle > + * > + * DESCRIPTION: Get the file handle for a particular filename/FileId. This > + * function also allows the caller to specify the file Id of the > + * desired type. > + * > + ******************************************************************************/ > + > +FILE * > +FlGetFileHandle ( > + UINT32 OutFileId, > + UINT32 InFileId, > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + if (!Filename) > + { > + return (NULL); > + } > + > + while (Current) > + { > + if (!strcmp (Current->Files[InFileId].Filename, Filename)) > + { > + return (Current->Files[OutFileId].Handle); > + } > + > + Current = Current->Next; > + } > + > + return (NULL); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetFileNode > + * > + * PARAMETERS: FileId - File type (ID) of the input Filename > + * Filename - File to search for > + * > + * RETURN: A global file node > + * > + * DESCRIPTION: Get the file node for a particular filename/FileId. > + * > + ******************************************************************************/ > + > +ASL_GLOBAL_FILE_NODE * > +FlGetFileNode ( > + UINT32 FileId, > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + if (!Filename) > + { > + return (NULL); > + } > + > + while (Current) > + { > + if (!strcmp (Current->Files[FileId].Filename, Filename)) > + { > + return (Current); > + } > + > + Current = Current->Next; > + } > + > + return (NULL); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetCurrentFileNode > + * > + * PARAMETERS: None > + * > + * RETURN: Global file node > + * > + * DESCRIPTION: Get the current input file node > + * > + ******************************************************************************/ > + > +ASL_GLOBAL_FILE_NODE * > +FlGetCurrentFileNode ( > + void) > +{ > + return (FlGetFileNode ( > + ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename)); > +} > + > + > /******************************************************************************* > * > * FUNCTION: FlSetLineNumber > @@ -426,8 +677,6 @@ FlOpenIncludeWithPrefix ( > IncludeFile = fopen (Pathname, "r"); > if (!IncludeFile) > { > - fprintf (stderr, "Could not open include file %s\n", Pathname); > - ACPI_FREE (Pathname); > return (NULL); > } > > diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h > index bc7358cd..213c5408 100644 > --- a/src/acpica/source/compiler/aslglobal.h > +++ b/src/acpica/source/compiler/aslglobal.h > @@ -172,28 +172,27 @@ > UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; > > /* Table below must match ASL_FILE_TYPES in asltypes.h */ > - > -ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES] = > +ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES] = > { > - {NULL, NULL, "stdout: ", "Standard Output"}, > - {NULL, NULL, "stderr: ", "Standard Error"}, > - {NULL, NULL, "Table Input: ", "Source Input"}, > - {NULL, NULL, "Binary Output:", "AML Output"}, > - {NULL, NULL, "Source Output:", "Source Output"}, > - {NULL, NULL, "Preprocessor: ", "Preprocessor Output"}, > - {NULL, NULL, "Preprocessor: ", "Preprocessor Temp File"}, > - {NULL, NULL, "Listing File: ", "Listing Output"}, > - {NULL, NULL, "Hex Dump: ", "Hex Table Output"}, > - {NULL, NULL, "Namespace: ", "Namespace Output"}, > - {NULL, NULL, "Debug File: ", "Debug Output"}, > - {NULL, NULL, "ASM Source: ", "Assembly Code Output"}, > - {NULL, NULL, "C Source: ", "C Code Output"}, > - {NULL, NULL, "ASM Include: ", "Assembly Header Output"}, > - {NULL, NULL, "C Include: ", "C Header Output"}, > - {NULL, NULL, "Offset Table: ", "C Offset Table Output"}, > - {NULL, NULL, "Device Map: ", "Device Map Output"}, > - {NULL, NULL, "Cross Ref: ", "Cross-reference Output"}, > - {NULL, NULL, "Converter db :", "Converter debug Output"} > + {"stdout: ", "Standard Output"}, > + {"stderr: ", "Standard Error"}, > + {"Table Input: ", "Source Input"}, > + {"Binary Output:", "AML Output"}, > + {"Source Output:", "Source Output"}, > + {"Preprocessor: ", "Preprocessor Output"}, > + {"Preprocessor: ", "Preprocessor Temp File"}, > + {"Listing File: ", "Listing Output"}, > + {"Hex Dump: ", "Hex Table Output"}, > + {"Namespace: ", "Namespace Output"}, > + {"Debug File: ", "Debug Output"}, > + {"ASM Source: ", "Assembly Code Output"}, > + {"C Source: ", "C Code Output"}, > + {"ASM Include: ", "Assembly Header Output"}, > + {"C Include: ", "C Header Output"}, > + {"Offset Table: ", "C Offset Table Output"}, > + {"Device Map: ", "Device Map Output"}, > + {"Cross Ref: ", "Cross-reference Output"}, > + {"Converter dbg:", "Converter debug Output"} > }; > > /* Table below must match the defines with the same names in actypes.h */ > @@ -225,8 +224,8 @@ const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS] = > }; > > #else > +extern ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES]; > extern UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS]; > -extern ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES]; > extern const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS]; > #endif > > @@ -269,7 +268,6 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentColumn, 0); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineNumber, 1); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_LogicalLineNumber, 1); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineOffset, 0); > -ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_OriginalInputFileSize, 0); > ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_SyntaxError, 0); > > /* Exception reporting */ > @@ -300,6 +298,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ListingFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_IgnoreErrors, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_SourceOutputFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParseOnlyFlag, FALSE); > +ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParserErrorDetected, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_CompileTimesFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_FoldConstants, TRUE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_VerboseErrors, TRUE); > @@ -385,6 +384,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_SourceLine, 0); > ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_FileType, 0); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_Signature, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ParseTreeRoot, NULL); > +ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_CurrentDB, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ExternalsListHead, NULL); > ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*AslGbl_ListingNode, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT *AslGbl_FirstLevelInsertionNode; > @@ -403,6 +403,8 @@ ASL_EXTERN UINT16 ASL_INIT_GLOBAL (AslGbl_PruneType, 0); > ASL_EXTERN ASL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_IncludeFileStack, NULL); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO_SIG"); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); > +ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); > +ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); > > /* Specific to the -q option */ > > diff --git a/src/acpica/source/compiler/asllisting.c b/src/acpica/source/compiler/asllisting.c > index df3b7587..7bc118bc 100644 > --- a/src/acpica/source/compiler/asllisting.c > +++ b/src/acpica/source/compiler/asllisting.c > @@ -254,6 +254,7 @@ static void > LsGenerateListing ( > UINT32 FileId) > { > + UINT32 WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY; > > /* Start at the beginning of both the source and AML files */ > > @@ -271,7 +272,7 @@ LsGenerateListing ( > > LsDoOffsetTableHeader (FileId); > > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, > LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); > LsDoOffsetTableFooter (FileId); > return; > @@ -279,7 +280,7 @@ LsGenerateListing ( > > /* Process all parse nodes */ > > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, > LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); > > /* Final processing */ > @@ -847,7 +848,7 @@ LsFinishSourceListing ( > FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); > AePrintErrorLog (FileId); > FlPrintFile (FileId, "\n"); > - UtDisplaySummary (FileId); > + UtDisplayOneSummary (FileId, TRUE); > FlPrintFile (FileId, "\n"); > } > } > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index dfbdf7ce..a055bab0 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -324,6 +324,7 @@ LdLoadFieldElements ( > (Node->Flags & ANOBJ_IS_EXTERNAL)) > { > Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; > + Node->Flags &= ~ANOBJ_IS_EXTERNAL; > } > else > { > diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c > index 26f4a0c4..81f634e6 100644 > --- a/src/acpica/source/compiler/aslmain.c > +++ b/src/acpica/source/compiler/aslmain.c > @@ -255,6 +255,14 @@ main ( > } > } > > + /* ACPICA subsystem initialization */ > + > + Status = AdInitialize (); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > > /* Process each pathname/filename in the list, with possible wildcards */ > > @@ -280,17 +288,71 @@ main ( > Index2++; > } > > + /* > + * At this point, compilation of a data table or disassembly is complete. > + */ > + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA || AcpiGbl_DisasmFlag) > + { > + goto CleanupAndExit; > + } > + > + CmDoAslMiddleAndBackEnd (); > + > + /* > + * At this point, all semantic analysis has been completed. Check > + * expected error messages before cleanup or conversion. > + */ > + AslCheckExpectedExceptions (); > + > + /* ASL-to-ASL+ conversion - Perform immediate disassembly */ > + > + if (AslGbl_DoAslConversion) > + { > + /* re-initialize ACPICA subsystem for disassembler */ > + > + Status = AdInitialize (); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* > + * New input file is the output AML file from above. > + * New output is from the input ASL file from above. > + */ > + AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > + AslGbl_Files[ASL_FILE_INPUT].Filename = > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; > + > + CvDbgPrint ("Output filename: %s\n", AslGbl_OutputFilenamePrefix); > + fprintf (stderr, "\n"); > + > + AcpiGbl_DisasmFlag = TRUE; > + AslDoDisassembly (); > + AcpiGbl_DisasmFlag = FALSE; > + > + /* delete the AML file. This AML file should never be utilized by AML interpreters. */ > + > + FlDeleteFile (ASL_FILE_AML_OUTPUT); > + } > + > + > > CleanupAndExit: > > UtFreeLineBuffers (); > AslParserCleanup (); > + AcpiDmClearExternalFileList(); > + (void) AcpiTerminate (); > + > + /* CmCleanupAndExit is intended for the compiler only */ > > - if (AcpiGbl_ExternalFileList) > + if (!AcpiGbl_DisasmFlag) > { > - AcpiDmClearExternalFileList(); > + CmCleanupAndExit (); > } > > + > return (ReturnStatus); > } > > @@ -372,9 +434,6 @@ static void > AslInitialize ( > void) > { > - UINT32 i; > - > - > AcpiGbl_DmOpt_Verbose = FALSE; > > /* Default integer width is 32 bits */ > @@ -382,16 +441,4 @@ AslInitialize ( > AcpiGbl_IntegerBitWidth = 32; > AcpiGbl_IntegerNybbleWidth = 8; > AcpiGbl_IntegerByteWidth = 4; > - > - for (i = 0; i < ASL_NUM_FILES; i++) > - { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > - > - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > - > - AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; > - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; > } > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 0f31c655..d7e2eb43 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -353,8 +353,8 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)", > /* ASL_MSG_FOUND_HERE */ "Original name creation/declaration below: ", > /* ASL_MSG_ILLEGAL_RECURSION */ "Illegal recursive call to method that creates named objects", > -/* ASL_MSG_PLACE_HOLDER_00 */ "", /* TODO: fill in this slot with a new error message */ > -/* ASL_MSG_PLACE_HOLDER_01 */ "", /* TODO: fill in this slot with a new error message */ > +/* ASL_MSG_DUPLICATE_INPUT_FILE */ "Duplicate input files detected:", > +/* ASL_MSG_WARNING_AS_ERROR */ "Warnings detected during compilation", > /* ASL_MSG_OEM_TABLE_ID */ "Invalid OEM Table ID", > /* ASL_MSG_OEM_ID */ "Invalid OEM ID", > /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", > @@ -363,7 +363,8 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", > /* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist", > /* ASL_MSG_REGION_LENGTH */ "Operation Region declared with zero length", > -/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed" > +/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed", > +/* ASL_MSG_UNDEFINED_EXTERNAL */ "Named object was declared external but the actual definition does not exist" > }; > > /* Table compiler */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 817e192e..a7cd1f31 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -355,8 +355,8 @@ typedef enum > ASL_MSG_NULL_RESOURCE_TEMPLATE, > ASL_MSG_FOUND_HERE, > ASL_MSG_ILLEGAL_RECURSION, > - ASL_MSG_PLACE_HOLDER_00, > - ASL_MSG_PLACE_HOLDER_01, > + ASL_MSG_DUPLICATE_INPUT_FILE, > + ASL_MSG_WARNING_AS_ERROR, > ASL_MSG_OEM_TABLE_ID, > ASL_MSG_OEM_ID, > ASL_MSG_UNLOAD, > @@ -366,6 +366,7 @@ typedef enum > ASL_MSG_NAMEPATH_NOT_EXIST, > ASL_MSG_REGION_LENGTH, > ASL_MSG_TEMPORARY_OBJECT, > + ASL_MSG_UNDEFINED_EXTERNAL, > > /* These messages are used by the Data Table compiler only */ > > diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c > index 67e16fd5..4f4b636d 100644 > --- a/src/acpica/source/compiler/asloperands.c > +++ b/src/acpica/source/compiler/asloperands.c > @@ -1045,6 +1045,7 @@ OpnDoDefinitionBlock ( > ACPI_SIZE Length; > UINT32 i; > char *Filename; > + ACPI_STATUS Status; > > > /* > @@ -1062,6 +1063,12 @@ OpnDoDefinitionBlock ( > *Child->Asl.Value.Buffer && > (AslGbl_UseDefaultAmlFilename)) > { > + /* > + * The walk may traverse multiple definition blocks. Switch files > + * to ensure that the correct files are manipulated. > + */ > + FlSwitchFileSet (Op->Asl.Filename); > + > /* > * We will use the AML filename that is embedded in the source file > * for the output filename. > @@ -1076,6 +1083,22 @@ OpnDoDefinitionBlock ( > > AslGbl_OutputFilenamePrefix = Filename; > UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > + > + /* > + * Use the definition block file parameter instead of the input > + * filename. Since all files were opened previously, remove the > + * existing file and open a new file with the name of this > + * definiton block parameter. Since AML code generation has yet > + * to happen, the previous file can be removed without any impacts. > + */ > + FlCloseFile (ASL_FILE_AML_OUTPUT); > + FlDeleteFile (ASL_FILE_AML_OUTPUT); > + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > + if (ACPI_FAILURE (Status)) > + { > + AslError (ASL_ERROR, ASL_MSG_OUTPUT_FILE_OPEN, NULL, NULL); > + return; > + } > } > > Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > @@ -1086,6 +1109,7 @@ OpnDoDefinitionBlock ( > Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > if (Child->Asl.Value.String) > { > + AslGbl_FilesList->TableSignature = Child->Asl.Value.String; > AslGbl_TableSignature = Child->Asl.Value.String; > if (strlen (AslGbl_TableSignature) != ACPI_NAMESEG_SIZE) > { > @@ -1138,6 +1162,7 @@ OpnDoDefinitionBlock ( > > AslGbl_TableId = UtLocalCacheCalloc (Length + 1); > strcpy (AslGbl_TableId, Child->Asl.Value.String); > + AslGbl_FilesList->TableId = AslGbl_TableId; > > /* > * Convert anything non-alphanumeric to an underscore. This > diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c > index dc0b9079..dc00e1d2 100644 > --- a/src/acpica/source/compiler/asloptions.c > +++ b/src/acpica/source/compiler/asloptions.c > @@ -896,7 +896,6 @@ AslDoOptions ( > */ > AslGbl_VerboseErrors = FALSE; > AslGbl_DoSignon = FALSE; > - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > break; > > case 'o': > diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c > index c0f14c80..aee5ad60 100644 > --- a/src/acpica/source/compiler/aslstartup.c > +++ b/src/acpica/source/compiler/aslstartup.c > @@ -165,10 +165,6 @@ static UINT8 > AslDetectSourceFileType ( > ASL_FILE_INFO *Info); > > -static ACPI_STATUS > -AslDoDisassembly ( > - void); > - > > /* Globals */ > > @@ -227,12 +223,6 @@ AslInitializeGlobals ( > AslGbl_ExceptionCount[i] = 0; > } > > - for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++) > - { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > - > if (AcpiGbl_CaptureComments) > { > AslGbl_CommentState.SpacesBefore = 0; > @@ -343,25 +333,19 @@ Cleanup: > * RETURN: Status > * > * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build > - * namespace. > + * namespace. This function assumes that the ACPI subsystem has > + * been initialized. The caller of the initialization will also > + * terminate the ACPI subsystem. > * > ******************************************************************************/ > > -static ACPI_STATUS > +ACPI_STATUS > AslDoDisassembly ( > void) > { > ACPI_STATUS Status; > > > - /* ACPICA subsystem initialization */ > - > - Status = AdInitialize (); > - if (ACPI_FAILURE (Status)) > - { > - return (Status); > - } > - > Status = AcpiAllocateRootTable (4); > if (ACPI_FAILURE (Status)) > { > @@ -370,11 +354,6 @@ AslDoDisassembly ( > return (Status); > } > > - /* Handle additional output files for disassembler */ > - > - AslGbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; > - Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); > - > /* This is where the disassembly happens */ > > AcpiGbl_DmOpt_Disasm = TRUE; > @@ -390,10 +369,9 @@ AslDoDisassembly ( > > AcpiDmUnresolvedWarning (0); > > - /* Shutdown compiler and ACPICA subsystem */ > + /* Clear Error log */ > > AeClearErrorLog (); > - (void) AcpiTerminate (); > > /* > * AslGbl_Files[ASL_FILE_INPUT].Filename was replaced with the > @@ -406,11 +384,6 @@ AslDoDisassembly ( > return (AE_CTRL_CONTINUE); > } > > - /* No need to free the filename string */ > - > - AslGbl_Files[ASL_FILE_INPUT].Filename = NULL; > - > - UtDeleteLocalCaches (); > return (AE_OK); > } > > @@ -432,6 +405,8 @@ AslDoOneFile ( > char *Filename) > { > ACPI_STATUS Status; > + UINT8 Event; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > /* Re-initialize "some" compiler/preprocessor globals */ > @@ -450,6 +425,18 @@ AslDoOneFile ( > return (Status); > } > > + /* > + * There was an input file detected at this point. Each input ASL file is > + * associated with one global file node consisting of the input file and > + * all output files associated with it. This is useful when compiling > + * multiple files in one command. > + */ > + Status = FlInitOneFile(Filename); > + if (ACPI_FAILURE (Status)) > + { > + return (AE_ERROR); > + } > + > /* Take a copy of the input filename, convert any backslashes */ > > AslGbl_Files[ASL_FILE_INPUT].Filename = > @@ -458,18 +445,6 @@ AslDoOneFile ( > strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename); > UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); > > - /* > - * AML Disassembly (Optional) > - */ > - if (AcpiGbl_DisasmFlag) > - { > - Status = AslDoDisassembly (); > - if (Status != AE_CTRL_CONTINUE) > - { > - return (Status); > - } > - } > - > /* > * Open the input file. Here, this should be an ASCII source file, > * either an ASL file or a Data Table file > @@ -481,7 +456,13 @@ AslDoOneFile ( > return (AE_ERROR); > } > > - AslGbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > + FileNode = FlGetCurrentFileNode(); > + if (!FileNode) > + { > + return (AE_ERROR); > + } > + > + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > > /* Determine input file type */ > > @@ -500,6 +481,22 @@ AslDoOneFile ( > AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > } > > + /* > + * Open the output file. Note: by default, the name of this file comes from > + * the table descriptor within the input file. > + */ > + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_ASL) > + { > + Event = UtBeginEvent ("Open AML output file"); > + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > + UtEndEvent (Event); > + if (ACPI_FAILURE (Status)) > + { > + AePrintErrorLog (ASL_FILE_STDERR); > + return (AE_ERROR); > + } > + } > + > /* Open the optional output files (listings, etc.) */ > > Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); > @@ -550,20 +547,7 @@ AslDoOneFile ( > */ > case ASL_INPUT_TYPE_ASCII_ASL: > > - /* ACPICA subsystem initialization */ > - > - Status = AdInitialize (); > - if (ACPI_FAILURE (Status)) > - { > - return (Status); > - } > - > - (void) CmDoCompile (); > - (void) AcpiTerminate (); > - > - /* Check if any errors occurred during compile */ > - > - Status = AslCheckForErrorExit (); > + Status = CmDoCompile (); > if (ACPI_FAILURE (Status)) > { > return (Status); > @@ -574,27 +558,11 @@ AslDoOneFile ( > AeClearErrorLog (); > PrTerminatePreprocessor (); > > - /* ASL-to-ASL+ conversion - Perform immediate disassembly */ > - > - if (AslGbl_DoAslConversion) > - { > - /* > - * New input file is the output AML file from above. > - * New output is from the input ASL file from above. > - */ > - AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > - CvDbgPrint ("OUTPUTFILENAME: %s\n", AslGbl_OutputFilenamePrefix); > - AslGbl_Files[ASL_FILE_INPUT].Filename = > - AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; > - AcpiGbl_DisasmFlag = TRUE; > - fprintf (stderr, "\n"); > - AslDoDisassembly (); > - > - /* delete the AML file. This AML file should never be utilized by AML interpreters. */ > - > - FlDeleteFile (ASL_FILE_AML_OUTPUT); > - } > - > + /* > + * At this point, we know how many lines are in the input file. Save it > + * to display for post-compilation summary. > + */ > + FileNode->TotalLineCount = AslGbl_CurrentLineNumber; > return (AE_OK); > > /* > @@ -661,6 +629,8 @@ AslCheckForErrorExit ( > (AslGbl_ExceptionCount[ASL_WARNING2] > 0) || > (AslGbl_ExceptionCount[ASL_WARNING3] > 0)) > { > + AslError (ASL_ERROR, ASL_MSG_WARNING_AS_ERROR, NULL, > + "(reporting warnings as errors)"); > return (AE_ERROR); > } > } > diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l > index 5cac84dc..69c1399a 100644 > --- a/src/acpica/source/compiler/aslsupport.l > +++ b/src/acpica/source/compiler/aslsupport.l > @@ -532,14 +532,18 @@ count ( > { > case 2: > > - AslGbl_TotalKeywords++; > - AslGbl_TotalNamedObjects++; > + ++AslGbl_TotalKeywords; > + ++AslGbl_TotalNamedObjects; > + ++AslGbl_FilesList->TotalKeywords; > + ++AslGbl_FilesList->TotalNamedObjects; > break; > > case 3: > > - AslGbl_TotalKeywords++; > - AslGbl_TotalExecutableOpcodes++; > + ++AslGbl_TotalKeywords; > + ++AslGbl_TotalExecutableOpcodes; > + ++AslGbl_FilesList->TotalKeywords; > + ++AslGbl_FilesList->TotalExecutableOpcodes; > break; > > default: > diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c > index 6bb40888..62efc5fa 100644 > --- a/src/acpica/source/compiler/asltree.c > +++ b/src/acpica/source/compiler/asltree.c > @@ -462,6 +462,7 @@ TrLinkOpChildren ( > { > ACPI_PARSE_OBJECT *Child; > ACPI_PARSE_OBJECT *PrevChild; > + ACPI_PARSE_OBJECT *LastSibling; > va_list ap; > UINT32 i; > BOOLEAN FirstChild; > @@ -480,8 +481,18 @@ TrLinkOpChildren ( > { > case PARSEOP_ASL_CODE: > > - AslGbl_ParseTreeRoot = Op; > - Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > + if (!AslGbl_ParseTreeRoot) > + { > + DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n"); > + AslGbl_ParseTreeRoot = Op; > + Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > + } > + else > + { > + DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n"); > + Op = AslGbl_ParseTreeRoot; > + } > + > DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); > break; > > @@ -560,7 +571,27 @@ TrLinkOpChildren ( > if (FirstChild) > { > FirstChild = FALSE; > - Op->Asl.Child = Child; > + > + /* > + * In the case that multiple definition blocks are being compiled, > + * append the definition block to the end of the child list as the > + * last sibling. This is done to facilitate namespace cross- > + * reference between multiple definition blocks. > + */ > + if (Op->Asl.Child && > + (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)) > + { > + LastSibling = Op->Asl.Child; > + while (LastSibling->Asl.Next) > + { > + LastSibling = LastSibling->Asl.Next; > + } > + LastSibling->Asl.Next = Child; > + } > + else > + { > + Op->Asl.Child = Child; > + } > } > > /* Point all children to parent */ > @@ -825,6 +856,8 @@ TrWalkParseTree ( > BOOLEAN OpPreviouslyVisited; > ACPI_PARSE_OBJECT *StartOp = Op; > ACPI_STATUS Status; > + ACPI_PARSE_OBJECT *Restore = NULL; > + BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY; > > > if (!AslGbl_ParseTreeRoot) > @@ -835,7 +868,13 @@ TrWalkParseTree ( > Level = 0; > OpPreviouslyVisited = FALSE; > > - switch (Visitation) > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Restore = Op->Asl.Next; > + Op->Asl.Next = NULL; > + } > + switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY) > { > case ASL_WALK_VISIT_DOWNWARD: > > @@ -861,7 +900,7 @@ TrWalkParseTree ( > { > /* Exit immediately on any error */ > > - return (Status); > + goto ErrorExit; > } > } > > @@ -907,7 +946,7 @@ TrWalkParseTree ( > Status = AscendingCallback (Op, Level, Context); > if (ACPI_FAILURE (Status)) > { > - return (Status); > + goto ErrorExit; > } > } > else > @@ -956,7 +995,7 @@ TrWalkParseTree ( > Status = AscendingCallback (Op, Level, Context); > if (ACPI_FAILURE (Status)) > { > - return (Status); > + goto ErrorExit; > } > } > else > @@ -979,7 +1018,7 @@ TrWalkParseTree ( > { > /* Exit immediately on any error */ > > - return (Status); > + goto ErrorExit; > } > } > > @@ -1018,5 +1057,20 @@ TrWalkParseTree ( > > /* If we get here, the walk completed with no errors */ > > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Op->Asl.Next = Restore; > + } > + > return (AE_OK); > + > +ErrorExit: > + > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Op->Asl.Next = Restore; > + } > + return (Status); > } > diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h > index 628b2d37..8a6a0750 100644 > --- a/src/acpica/source/compiler/asltypes.h > +++ b/src/acpica/source/compiler/asltypes.h > @@ -221,10 +221,10 @@ typedef struct asl_analysis_walk_info > > typedef struct asl_mapping_entry > { > - UINT32 Value; > - UINT32 AcpiBtype; /* Object type or return type */ > - UINT16 AmlOpcode; > - UINT8 Flags; > + UINT32 Value; > + UINT32 AcpiBtype; /* Object type or return type */ > + UINT16 AmlOpcode; > + UINT8 Flags; > > } ASL_MAPPING_ENTRY; > > @@ -233,8 +233,8 @@ typedef struct asl_mapping_entry > > typedef struct asl_walk_info > { > - ACPI_PARSE_OBJECT **NodePtr; > - UINT32 *LevelPtr; > + ACPI_PARSE_OBJECT **NodePtr; > + UINT32 *LevelPtr; > > } ASL_WALK_INFO; > > @@ -243,10 +243,8 @@ typedef struct asl_walk_info > > typedef struct asl_file_info > { > - FILE *Handle; > - char *Filename; > - const char *ShortDescription; > - const char *Description; > + FILE *Handle; > + char *Filename; > > } ASL_FILE_INFO; > > @@ -258,6 +256,11 @@ typedef struct asl_file_status > } ASL_FILE_STATUS; > > > +typedef UINT32 ASL_FILE_SWITCH_STATUS; /* File switch status */ > +#define SWITCH_TO_DIFFERENT_FILE 0 > +#define SWITCH_TO_SAME_FILE 1 > +#define FILE_NOT_FOUND 2 > + > /* > * File types. Note: Any changes to this table must also be reflected > * in the Gbl_Files array. > @@ -295,10 +298,17 @@ typedef enum > > } ASL_FILE_TYPES; > > - > #define ASL_MAX_FILE_TYPE 18 > #define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1) > > +typedef struct asl_file_desc > +{ > + const char *ShortDescription; > + const char *Description; > + > +} ASL_FILE_DESC; > + > + > /* Name suffixes used to create filenames for output files */ > > #define FILE_SUFFIX_ASL_CODE "asl" > @@ -325,16 +335,16 @@ typedef enum > > typedef struct asl_cache_info > { > - void *Next; > - char Buffer[1]; > + void *Next; > + char Buffer[1]; > > } ASL_CACHE_INFO; > > > typedef struct asl_include_dir > { > - char *Dir; > - struct asl_include_dir *Next; > + char *Dir; > + struct asl_include_dir *Next; > > } ASL_INCLUDE_DIR; > > @@ -343,6 +353,11 @@ typedef struct asl_include_dir > * An entry in the exception list, one for each error/warning > * Note: SubError nodes would be treated with the same messageId and Level > * as the parent error node. > + * > + * The source filename represents the name of the .src of where the error > + * occurred. This is useful for errors that occur inside of include files. > + * Since include files aren't recorded as a part of the global files list, > + * this provides a way to get the included file. > */ > typedef struct asl_error_msg > { > @@ -355,6 +370,7 @@ typedef struct asl_error_msg > struct asl_error_msg *SubError; > char *Filename; > char *SourceLine; > + char *SourceFilename; > UINT32 FilenameLength; > UINT16 MessageId; > UINT8 Level; > @@ -362,6 +378,7 @@ typedef struct asl_error_msg > } ASL_ERROR_MSG; > > /* An entry in the expected messages array */ > + > typedef struct asl_expected_message > { > UINT32 MessageId; > @@ -479,4 +496,19 @@ typedef struct asl_file_node > > } ASL_FILE_NODE; > > +typedef struct asl_files_node > +{ > + struct asl_file_info Files[ASL_NUM_FILES]; > + struct asl_files_node *Next; > + char *TableSignature; > + char *TableId; > + UINT32 TotalLineCount; > + UINT32 OriginalInputFileSize; > + UINT32 TotalKeywords; > + UINT32 TotalNamedObjects; > + UINT32 TotalExecutableOpcodes; > + BOOLEAN ParserErrorDetected; > + > +} ASL_GLOBAL_FILE_NODE; > + > #endif /* __ASLTYPES_H */ > diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c > index 6b0d5eff..0b78f473 100644 > --- a/src/acpica/source/compiler/aslutils.c > +++ b/src/acpica/source/compiler/aslutils.c > @@ -174,6 +174,10 @@ UtAttachNameseg ( > ACPI_PARSE_OBJECT *Op, > char *Name); > > +static void > +UtDisplayErrorSummary ( > + UINT32 FileId); > + > > /******************************************************************************* > * > @@ -520,21 +524,23 @@ UtSetParseOpName ( > > /******************************************************************************* > * > - * FUNCTION: UtDisplaySummary > + * FUNCTION: UtDisplayOneSummary > * > * PARAMETERS: FileID - ID of outpout file > * > * RETURN: None > * > - * DESCRIPTION: Display compilation statistics > + * DESCRIPTION: Display compilation statistics for one input file > * > ******************************************************************************/ > > void > -UtDisplaySummary ( > - UINT32 FileId) > +UtDisplayOneSummary ( > + UINT32 FileId, > + BOOLEAN DisplayErrorSummary) > { > UINT32 i; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > if (FileId != ASL_FILE_STDOUT) > @@ -565,25 +571,41 @@ UtDisplaySummary ( > } > else > { > - FlPrintFile (FileId, > - "%-14s %s - %u lines, %u bytes, %u keywords\n", > - "ASL Input:", > - AslGbl_Files[ASL_FILE_INPUT].Filename, AslGbl_CurrentLineNumber, > - AslGbl_OriginalInputFileSize, AslGbl_TotalKeywords); > - > - /* AML summary */ > - > - if ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || (AslGbl_IgnoreErrors)) > + FileNode = FlGetCurrentFileNode (); > + if (!FileNode) > { > - if (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > + fprintf (stderr, "Summary could not be generated"); > + return; > + } > + if (FileNode->ParserErrorDetected) > + { > + FlPrintFile (FileId, > + "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n", > + "ASL Input:", AslGbl_Files[ASL_FILE_INPUT].Filename); > + } > + else > + { > + FlPrintFile (FileId, > + "%-14s %s - %7u bytes %6u keywords %6u source lines\n", > + "ASL Input:", > + AslGbl_Files[ASL_FILE_INPUT].Filename, > + FileNode->OriginalInputFileSize, > + FileNode->TotalKeywords, > + FileNode->TotalLineCount); > + > + /* AML summary */ > + > + if (!AslGbl_ParserErrorDetected && > + ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) && > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > { > FlPrintFile (FileId, > - "%-14s %s - %u bytes, %u named objects, " > - "%u executable opcodes\n", > + "%-14s %s - %7u bytes %6u opcodes %6u named objects\n", > "AML Output:", > AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, > FlGetFileSize (ASL_FILE_AML_OUTPUT), > - AslGbl_TotalNamedObjects, AslGbl_TotalExecutableOpcodes); > + FileNode->TotalExecutableOpcodes, > + FileNode->TotalNamedObjects); > } > } > } > @@ -612,14 +634,55 @@ UtDisplaySummary ( > } > > FlPrintFile (FileId, "%14s %s - %u bytes\n", > - AslGbl_Files[i].ShortDescription, > + AslGbl_FileDescs[i].ShortDescription, > AslGbl_Files[i].Filename, FlGetFileSize (i)); > } > > - /* Error summary */ > + > + /* > + * Optionally emit an error summary for a file. This is used to enhance the > + * appearance of listing files. > + */ > + if (DisplayErrorSummary) > + { > + UtDisplayErrorSummary (FileId); > + } > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: UtDisplayErrorSummary > + * > + * PARAMETERS: FileID - ID of outpout file > + * > + * RETURN: None > + * > + * DESCRIPTION: Display compilation statistics for all input files > + * > + ******************************************************************************/ > + > +static void > +UtDisplayErrorSummary ( > + UINT32 FileId) > +{ > + BOOLEAN ErrorDetected; > + > + > + ErrorDetected = AslGbl_ParserErrorDetected || > + ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors); > + > + if (ErrorDetected) > + { > + FlPrintFile (FileId, "\nCompilation failed. "); > + } > + else > + { > + FlPrintFile (FileId, "\nCompilation successful. "); > + } > > FlPrintFile (FileId, > - "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", > + "%u Errors, %u Warnings, %u Remarks", > AslGbl_ExceptionCount[ASL_ERROR], > AslGbl_ExceptionCount[ASL_WARNING] + > AslGbl_ExceptionCount[ASL_WARNING2] + > @@ -628,6 +691,19 @@ UtDisplaySummary ( > > if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) > { > + if (AslGbl_ParserErrorDetected) > + { > + FlPrintFile (FileId, > + "\nNo AML files were generated due to syntax error(s)\n"); > + return; > + } > + else if (ErrorDetected) > + { > + FlPrintFile (FileId, > + "\nNo AML files were generated due to compiler error(s)\n"); > + return; > + } > + > FlPrintFile (FileId, ", %u Optimizations", > AslGbl_ExceptionCount[ASL_OPTIMIZATION]); > > @@ -641,6 +717,46 @@ UtDisplaySummary ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: UtDisplaySummary > + * > + * PARAMETERS: FileID - ID of outpout file > + * > + * RETURN: None > + * > + * DESCRIPTION: Display compilation statistics for all input files > + * > + ******************************************************************************/ > + > +void > +UtDisplaySummary ( > + UINT32 FileId) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + while (Current) > + { > + switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename)) > + { > + case SWITCH_TO_SAME_FILE: > + case SWITCH_TO_DIFFERENT_FILE: > + > + UtDisplayOneSummary (FileId, FALSE); > + Current = Current->Next; > + break; > + > + case FILE_NOT_FOUND: > + default: > + > + Current = NULL; > + break; > + } > + } > + UtDisplayErrorSummary (FileId); > +} > + > /******************************************************************************* > * > * FUNCTION: UtCheckIntegerRange > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 99f6c4a0..9d6e5c0b 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -1185,6 +1185,24 @@ XfNamespaceLocateBegin ( > } > } > > + /* > + * 5) Check for external resolution > + * By this point, everything should be loaded in the namespace. If a > + * namespace lookup results in a namespace node that is an external, it > + * means that this named object was not defined in the input ASL. This > + * causes issues because there are plenty of incidents where developers > + * use the external keyword to suppress compiler errors about undefined > + * objects. Note: this only applies when compiling multiple definition > + * blocks. > + */ > + if (AslGbl_ParseTreeRoot->Asl.Child && AslGbl_ParseTreeRoot->Asl.Child->Asl.Next && > + (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL && > + Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL) && > + (Node->Flags & ANOBJ_IS_EXTERNAL)) > + { > + AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); > + } > + > /* 5) Check for a connection object */ > #if 0 > else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONNECTION) > diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c > index 95fcb2d4..09cb3e6c 100644 > --- a/src/acpica/source/compiler/dtcompile.c > +++ b/src/acpica/source/compiler/dtcompile.c > @@ -240,8 +240,7 @@ DtDoCompile ( > DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, > "Input file does not appear to be an ASL or data table source file"); > > - Status = AE_ERROR; > - goto CleanupAndExit; > + return (AE_ERROR); > } > > Event = UtBeginEvent ("Compile parse tree"); > @@ -259,7 +258,7 @@ DtDoCompile ( > DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, > "Could not compile input file"); > > - goto CleanupAndExit; > + return (Status); > } > > /* Create/open the binary output file */ > @@ -268,7 +267,7 @@ DtDoCompile ( > Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > if (ACPI_FAILURE (Status)) > { > - goto CleanupAndExit; > + return (Status); > } > > /* Write the binary, then the optional hex file */ > @@ -277,10 +276,6 @@ DtDoCompile ( > HxDoHexOutput (); > DtWriteTableToListing (); > > -CleanupAndExit: > - > - AcpiUtDeleteCaches (); > - CmCleanupAndExit (); > return (Status); > } > > diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c > index 9679e272..1699eb6c 100644 > --- a/src/acpica/source/compiler/fwts_iasl_interface.c > +++ b/src/acpica/source/compiler/fwts_iasl_interface.c > @@ -35,27 +35,17 @@ > */ > static void init_asl_core(void) > { > - int i; > - > AcpiOsInitialize(); > ACPI_DEBUG_INITIALIZE(); > AcpiGbl_ExternalFileList = NULL; > AcpiDbgLevel = 0; > PrInitializePreprocessor(); > - AcpiGbl_DmOpt_Verbose = FALSE; > - AcpiGbl_IntegerBitWidth = 64; > - AcpiGbl_IntegerNybbleWidth = 16; > - AcpiGbl_IntegerByteWidth = 8; > - > - for (i = 0; i < ASL_NUM_FILES; i++) { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > > - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDOUT"; > + /* From AslInitialize */ > + AcpiGbl_DmOpt_Verbose = FALSE; > + AcpiGbl_IntegerBitWidth = 32; > + AcpiGbl_IntegerNybbleWidth = 8; > + AcpiGbl_IntegerByteWidth = 4; > > AslGbl_LineBufferSize = 1024; > AslGbl_CurrentLineBuffer = NULL; > @@ -99,6 +89,7 @@ int fwts_iasl_disassemble_aml( > AslGbl_UseDefaultAmlFilename = FALSE; > AcpiGbl_CstyleDisassembly = FALSE; > AcpiGbl_DmOpt_Verbose = FALSE; > + AslGbl_ParserErrorDetected = FALSE; > UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > > /* Do we need to include external tables in? */ > @@ -135,6 +126,7 @@ int fwts_iasl_disassemble_aml( > (void)fclose(fpout); > _exit(1); > } > + AdInitialize(); > > /* ...and do the ACPICA disassambly... */ > AslDoOneFile((char *)tables[which]); > @@ -231,14 +223,28 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > (void)close(stderr_fds[0]); > > /* Setup ACPICA compiler globals */ > + AslGbl_WarningLevel = 0; > + AslGbl_NoErrors = FALSE; > AcpiGbl_DisasmFlag = FALSE; > + AslGbl_DisplayRemarks = TRUE; > + AslGbl_DisplayWarnings = TRUE; > + AslGbl_DisplayOptimizations = TRUE; > + /* AslGbl_CompileTimesFlag = TRUE; */ > AslGbl_DoCompile = TRUE; > AslGbl_PreprocessFlag = TRUE; > AslGbl_UseDefaultAmlFilename = FALSE; > AslGbl_OutputFilenamePrefix = (char*)source; > - UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > + UtConvertBackslashes(AslGbl_OutputFilenamePrefix); > > - (void)AslDoOneFile((char *)source); > + AdInitialize(); > + status = AslDoOneFile((char *)source); > + > + AslCheckExpectedExceptions(); > + UtFreeLineBuffers(); > + AslParserCleanup(); > + AcpiDmClearExternalFileList(); > + AcpiTerminate(); > + CmCleanupAndExit(); > > /* > * We need to flush buffered I/O on IASL stdout > @@ -246,7 +252,6 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > */ > (void)fflush(stdout); > (void)fflush(stderr); > - > _exit(0); > break; > default: > @@ -261,6 +266,7 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > if (fwts_iasl_read_output(stderr_fds[0], stderr_output, &stderr_len, &stderr_eof) < 0) > break; > } > + > (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); > (void)close(stdout_fds[0]); > (void)close(stderr_fds[0]); > diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c > index b5ddfa9f..f3d615ad 100644 > --- a/src/acpica/source/compiler/prutils.c > +++ b/src/acpica/source/compiler/prutils.c > @@ -455,7 +455,6 @@ PrOpenIncludeWithPrefix ( > IncludeFile = fopen (Pathname, OpenMode); > if (!IncludeFile) > { > - fprintf (stderr, "Could not open include file %s\n", Pathname); > return (NULL); > } > > diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c > index f5ea992a..7534f6d7 100644 > --- a/src/acpica/source/components/events/evgpe.c > +++ b/src/acpica/source/components/events/evgpe.c > @@ -240,6 +240,14 @@ AcpiEvEnableGpe ( > ACPI_FUNCTION_TRACE (EvEnableGpe); > > > + /* Clear the GPE (of stale events) */ > + > + Status = AcpiHwClearGpe(GpeEventInfo); > + if (ACPI_FAILURE(Status)) > + { > + return_ACPI_STATUS(Status); > + } > + > /* Enable the requested GPE */ > > Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE); > diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c > index ff178d49..12772308 100644 > --- a/src/acpica/source/components/namespace/nsalloc.c > +++ b/src/acpica/source/components/namespace/nsalloc.c > @@ -232,6 +232,11 @@ AcpiNsDeleteNode ( > ACPI_FUNCTION_NAME (NsDeleteNode); > > > + if (!Node) > + { > + return_VOID; > + } > + > /* Detach an object if there is one */ > > AcpiNsDetachObject (Node); > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index d3e4e7b5..be338bbe 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20190329 > +#define ACPI_CA_VERSION 0x20190405 > > #include "acconfig.h" > #include "actypes.h" Acked-by: Ivan Hu <ivan.hu@canonical.com>
On 2019-04-08 7:51 a.m., Colin King wrote: > From: Colin Ian King <colin.king@canonical.com> > > changes in this release of ACPICA are detailed at the following > link on the ACPICA developer mailing list: > > https://lists.acpica.org/pipermail/devel/2019-April/001889.html > > This also required some rework with the fwts iasl interface > because of changes to where error messages are now being written > (stderr rather than stdout). > > Signed-off-by: Colin Ian King <colin.king@canonical.com> > --- > src/acpi/syntaxcheck/syntaxcheck.c | 4 +- > src/acpica/source/common/adisasm.c | 2 +- > src/acpica/source/compiler/aslcodegen.c | 52 +--- > src/acpica/source/compiler/aslcompile.c | 183 ++++++++++--- > src/acpica/source/compiler/aslcompiler.h | 61 ++++- > src/acpica/source/compiler/asldefine.h | 1 - > src/acpica/source/compiler/aslerror.c | 26 +- > src/acpica/source/compiler/aslfileio.c | 4 +- > src/acpica/source/compiler/aslfiles.c | 253 +++++++++++++++++- > src/acpica/source/compiler/aslglobal.h | 48 ++-- > src/acpica/source/compiler/asllisting.c | 7 +- > src/acpica/source/compiler/aslload.c | 1 + > src/acpica/source/compiler/aslmain.c | 81 ++++-- > src/acpica/source/compiler/aslmessages.c | 7 +- > src/acpica/source/compiler/aslmessages.h | 5 +- > src/acpica/source/compiler/asloperands.c | 25 ++ > src/acpica/source/compiler/asloptions.c | 1 - > src/acpica/source/compiler/aslstartup.c | 130 ++++----- > src/acpica/source/compiler/aslsupport.l | 12 +- > src/acpica/source/compiler/asltree.c | 70 ++++- > src/acpica/source/compiler/asltypes.h | 62 +++-- > src/acpica/source/compiler/aslutils.c | 156 +++++++++-- > src/acpica/source/compiler/aslxref.c | 18 ++ > src/acpica/source/compiler/dtcompile.c | 11 +- > .../source/compiler/fwts_iasl_interface.c | 42 +-- > src/acpica/source/compiler/prutils.c | 1 - > src/acpica/source/components/events/evgpe.c | 8 + > .../source/components/namespace/nsalloc.c | 5 + > src/acpica/source/include/acpixf.h | 2 +- > 29 files changed, 978 insertions(+), 300 deletions(-) > > diff --git a/src/acpi/syntaxcheck/syntaxcheck.c b/src/acpi/syntaxcheck/syntaxcheck.c > index 5d1ea112..d1eb0798 100644 > --- a/src/acpi/syntaxcheck/syntaxcheck.c > +++ b/src/acpi/syntaxcheck/syntaxcheck.c > @@ -488,9 +488,9 @@ static int syntaxcheck_single_table( > fwts_log_info(fw, "Checking ACPI table %s (#%d)", info->name, n); > fwts_log_nl(fw); > > - if (iasl_stdout) { > + if (iasl_stderr) { > /* Scan error text from assembly */ > - fwts_list_foreach(item, iasl_stdout) { > + fwts_list_foreach(item, iasl_stderr) { > int num; > char ch; > char *line = fwts_text_list_text(item); > diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c > index 518468b7..c73208f6 100644 > --- a/src/acpica/source/common/adisasm.c > +++ b/src/acpica/source/common/adisasm.c > @@ -579,7 +579,7 @@ AdDisassembleOneTable ( > if (AslGbl_MapfileFlag) > { > fprintf (stderr, "%14s %s - %u bytes\n", > - AslGbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, > + AslGbl_FileDescs[ASL_FILE_MAP_OUTPUT].ShortDescription, > AslGbl_Files[ASL_FILE_MAP_OUTPUT].Filename, > FlGetFileSize (ASL_FILE_MAP_OUTPUT)); > } > diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c > index 8edcb668..88e34824 100644 > --- a/src/acpica/source/compiler/aslcodegen.c > +++ b/src/acpica/source/compiler/aslcodegen.c > @@ -174,11 +174,11 @@ CgWriteTableHeader ( > ACPI_PARSE_OBJECT *Op); > > static void > -CgCloseTable ( > - void); > +CgWriteNode ( > + ACPI_PARSE_OBJECT *Op); > > static void > -CgWriteNode ( > +CgUpdateHeader ( > ACPI_PARSE_OBJECT *Op); > > > @@ -202,15 +202,12 @@ CgGenerateAmlOutput ( > > /* Generate the AML output file */ > > - FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); > - AslGbl_SourceLine = 0; > - AslGbl_NextError = AslGbl_ErrorLog; > - > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, > + ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY, > CgAmlWriteWalk, NULL, NULL); > > DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); > - CgCloseTable (); > + CgUpdateHeader (AslGbl_CurrentDB); > } > > > @@ -708,38 +705,13 @@ CgUpdateHeader ( > ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum)); > > FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); > -} > - > - > -/******************************************************************************* > - * > - * FUNCTION: CgCloseTable > - * > - * PARAMETERS: None. > - * > - * RETURN: None. > - * > - * DESCRIPTION: Complete the ACPI table by calculating the checksum and > - * re-writing each table header. This allows support for > - * multiple definition blocks in a single source file. > - * > - ******************************************************************************/ > - > -static void > -CgCloseTable ( > - void) > -{ > - ACPI_PARSE_OBJECT *Op; > - > > - /* Process all definition blocks */ > - > - Op = AslGbl_ParseTreeRoot->Asl.Child; > - while (Op) > - { > - CgUpdateHeader (Op); > - Op = Op->Asl.Next; > - } > + /* > + * Seek to the end of the file. This is done to support multiple file > + * compilation. Doing this simplifies other parts of the codebase because > + * it eliminates the need to seek for a different starting place. > + */ > + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); > } > > > diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c > index c46b28da..845f15bc 100644 > --- a/src/acpica/source/compiler/aslcompile.c > +++ b/src/acpica/source/compiler/aslcompile.c > @@ -178,6 +178,10 @@ static void > CmDumpAllEvents ( > void); > > +static void > +CmFinishFiles( > + BOOLEAN DeleteAmlFile); > + > > /******************************************************************************* > * > @@ -191,13 +195,13 @@ CmDumpAllEvents ( > * > ******************************************************************************/ > > -int > +ACPI_STATUS > CmDoCompile ( > void) > { > - ACPI_STATUS Status; > UINT8 FullCompile; > UINT8 Event; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > FullCompile = UtBeginEvent ("*** Total Compile time ***"); > @@ -221,7 +225,7 @@ CmDoCompile ( > { > UtEndEvent (Event); > CmCleanupAndExit (); > - return (0); > + return (AE_OK); > } > } > UtEndEvent (Event); > @@ -239,6 +243,12 @@ CmDoCompile ( > { > fprintf (stderr, > "Compiler aborting due to parser-detected syntax error(s)\n"); > + > + /* Flag this error in the FileNode for compilation summary */ > + > + FileNode = FlGetCurrentFileNode (); > + FileNode->ParserErrorDetected = TRUE; > + AslGbl_ParserErrorDetected = TRUE; > LsDumpParseTree (); > goto ErrorExit; > } > @@ -292,19 +302,35 @@ CmDoCompile ( > 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 (AslGbl_OutputFilenamePrefix); > - UtEndEvent (Event); > - if (ACPI_FAILURE (Status)) > - { > - AePrintErrorLog (ASL_FILE_STDERR); > - return (-1); > - } > + UtEndEvent (FullCompile); > + return (AE_OK); > + > +ErrorExit: > + UtEndEvent (FullCompile); > + return (AE_ERROR); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: CmDoAslMiddleAndBackEnd > + * > + * PARAMETERS: None > + * > + * RETURN: Status of middle-end and back-end > + * > + * DESCRIPTION: Perform compiler middle-end (type checking and semantic > + * analysis) and back-end (code generation) > + * > + ******************************************************************************/ > + > +int > +CmDoAslMiddleAndBackEnd ( > + void) > +{ > + UINT8 Event; > + ACPI_STATUS Status; > + > > /* Interpret and generate all compile-time constants */ > > @@ -351,7 +377,6 @@ CmDoCompile ( > AePrintErrorLog (ASL_FILE_STDOUT); > UtDisplaySummary (ASL_FILE_STDOUT); > } > - UtEndEvent (FullCompile); > return (0); > } > > @@ -367,7 +392,7 @@ CmDoCompile ( > UtEndEvent (Event); > if (ACPI_FAILURE (Status)) > { > - goto ErrorExit; > + return (-1); > } > > /* Namespace cross-reference */ > @@ -378,7 +403,7 @@ CmDoCompile ( > Status = XfCrossReferenceNamespace (); > if (ACPI_FAILURE (Status)) > { > - goto ErrorExit; > + return (-1); > } > > /* Namespace - Check for non-referenced objects */ > @@ -486,22 +511,47 @@ CmDoCompile ( > > Event = UtBeginEvent ("Generate AML code and write output files"); > DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n"); > - CgGenerateAmlOutput (); > + > + AslGbl_CurrentDB = AslGbl_ParseTreeRoot->Asl.Child; > + > + while (AslGbl_CurrentDB) > + { > + switch (FlSwitchFileSet(AslGbl_CurrentDB->Asl.Filename)) > + { > + case SWITCH_TO_DIFFERENT_FILE: > + /* > + * Reset these parameters when definition blocks belong in > + * different files. If they belong in the same file, there is > + * no need to reset these parameters > + */ > + FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); > + AslGbl_SourceLine = 0; > + AslGbl_NextError = AslGbl_ErrorLog; > + > + /* fall-through */ > + > + case SWITCH_TO_SAME_FILE: > + > + CgGenerateAmlOutput (); > + CmDoOutputFiles (); > + AslGbl_CurrentDB = AslGbl_CurrentDB->Asl.Next; > + > + break; > + > + default: /* FILE_NOT_FOUND */ > + > + /* The requested file could not be found. Get out of here */ > + > + AslGbl_CurrentDB = NULL; > + break; > + } > + } > UtEndEvent (Event); > > Event = UtBeginEvent ("Write optional output files"); > - CmDoOutputFiles (); > UtEndEvent (Event); > > - UtEndEvent (FullCompile); > - AslCheckExpectedExceptions (); > - CmCleanupAndExit (); > return (0); > - > -ErrorExit: > - UtEndEvent (FullCompile); > - CmCleanupAndExit (); > - return (-1); > } > > > @@ -808,10 +858,14 @@ void > CmCleanupAndExit ( > void) > { > - UINT32 i; > BOOLEAN DeleteAmlFile = FALSE; > + ASL_GLOBAL_FILE_NODE *CurrentFileNode = AslGbl_FilesList; > > > + /* Check if any errors occurred during compile */ > + > + (void) AslCheckForErrorExit (); > + > AePrintErrorLog (ASL_FILE_STDERR); > if (AslGbl_DebugFlag) > { > @@ -865,15 +919,63 @@ CmCleanupAndExit ( > * We will delete the AML file if there are errors and the > * force AML output option has not been used. > */ > - if ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && > + if (AslGbl_ParserErrorDetected || ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && > (!AslGbl_IgnoreErrors) && > - AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle)) > { > DeleteAmlFile = TRUE; > } > > /* Close all open files */ > > + while (CurrentFileNode) > + { > + switch (FlSwitchFileSet (CurrentFileNode->Files[ASL_FILE_INPUT].Filename)) > + { > + case SWITCH_TO_SAME_FILE: > + case SWITCH_TO_DIFFERENT_FILE: > + > + CmFinishFiles (DeleteAmlFile); > + CurrentFileNode = CurrentFileNode->Next; > + break; > + > + case FILE_NOT_FOUND: > + default: > + > + CurrentFileNode = NULL; > + break; > + } > + } > + > + /* Final cleanup after compiling one file */ > + > + if (!AslGbl_DoAslConversion) > + { > + UtDeleteLocalCaches (); > + } > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: CmFinishFiles > + * > + * PARAMETERS: DeleteAmlFile > + * > + * RETURN: None. > + * > + * DESCRIPTION: Close all open files, delete AML files depending on the > + * function parameter is true. > + * > + ******************************************************************************/ > + > +static void > +CmFinishFiles( > + BOOLEAN DeleteAmlFile) > +{ > + UINT32 i; > + > + > /* > * Take care with the preprocessor file (.pre), it might be the same > * as the "input" file, depending on where the compiler has terminated > @@ -890,7 +992,15 @@ CmCleanupAndExit ( > > for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++) > { > - FlCloseFile (i); > + /* > + * Some files such as debug output files could be pointing to > + * stderr or stdout. Leave these alone. > + */ > + if (AslGbl_Files[i].Handle != stderr && > + AslGbl_Files[i].Handle != stdout) > + { > + FlCloseFile (i); > + } > } > > /* Delete AML file if there are errors */ > @@ -923,11 +1033,4 @@ CmCleanupAndExit ( > { > FlDeleteFile (ASL_FILE_SOURCE_OUTPUT); > } > - > - /* Final cleanup after compiling one file */ > - > - if (!AslGbl_DoAslConversion) > - { > - UtDeleteLocalCaches (); > - } > } > diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h > index efcee77b..ad0e73f3 100644 > --- a/src/acpica/source/compiler/aslcompiler.h > +++ b/src/acpica/source/compiler/aslcompiler.h > @@ -254,10 +254,14 @@ void > AslCompilerFileHeader ( > UINT32 FileId); > > -int > +ACPI_STATUS > CmDoCompile ( > void); > > +int > +CmDoAslMiddleAndBackEnd ( > + void); > + > void > CmDoOutputFiles ( > void); > @@ -266,6 +270,10 @@ void > CmCleanupAndExit ( > void); > > +ACPI_STATUS > +AslDoDisassembly ( > + void); > + > > /* > * aslallocate - memory allocation > @@ -875,9 +883,10 @@ ExDoExternal ( > > /* Values for "Visitation" parameter above */ > > -#define ASL_WALK_VISIT_DOWNWARD 0x01 > -#define ASL_WALK_VISIT_UPWARD 0x02 > -#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) > +#define ASL_WALK_VISIT_DOWNWARD 0x01 > +#define ASL_WALK_VISIT_UPWARD 0x02 > +#define ASL_WALK_VISIT_DB_SEPARATELY 0x04 > +#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) > > > /* > @@ -1034,6 +1043,11 @@ FlSeekFile ( > UINT32 FileId, > long Offset); > > +void > +FlSeekFileSet ( > + UINT32 FileId, > + long Offset); > + > void > FlCloseFile ( > UINT32 FileId); > @@ -1068,6 +1082,34 @@ ACPI_STATUS > FlOpenMiscOutputFiles ( > char *InputFilename); > > +ACPI_STATUS > +FlInitOneFile ( > + char *InputFilename); > + > +ASL_FILE_SWITCH_STATUS > +FlSwitchFileSet ( > + char *InputFilename); > + > +FILE * > +FlGetFileHandle ( > + UINT32 OutFileId, > + UINT32 InFileId, > + char *Filename); > + > +ASL_GLOBAL_FILE_NODE * > +FlGetFileNode ( > + UINT32 FileId, > + char *Filename); > + > +ASL_GLOBAL_FILE_NODE * > +FlGetCurrentFileNode ( > + void); > + > +BOOLEAN > +FlInputFileExists ( > + char *InputFilename); > + > + > /* > * aslhwmap - hardware map summary > */ > @@ -1083,7 +1125,6 @@ ACPI_STATUS > LdLoadNamespace ( > ACPI_PARSE_OBJECT *RootOp); > > - > /* > * asllookup - namespace lookup functions > */ > @@ -1091,6 +1132,7 @@ void > LkFindUnreferencedObjects ( > void); > > + > /* > * aslhelp - help screens > */ > @@ -1118,6 +1160,7 @@ void > NsSetupNamespaceListing ( > void *Handle); > > + > /* > * asloptions - command line processing > */ > @@ -1126,6 +1169,7 @@ AslCommandLine ( > int argc, > char **argv); > > + > /* > * aslxref - namespace cross reference > */ > @@ -1220,6 +1264,11 @@ void > UtDisplaySummary ( > UINT32 FileId); > > +void > +UtDisplayOneSummary ( > + UINT32 FileId, > + BOOLEAN DisplayErrorSummary); > + > void > UtConvertByteToHex ( > UINT8 RawByte, > @@ -1271,6 +1320,7 @@ AuConvertUuidToString ( > char *UuIdBuffer, > char *OutString); > > + > /* > * aslresource - Resource template generation utilities > */ > @@ -1478,6 +1528,7 @@ ASL_RESOURCE_NODE * > RsDoPinGroupConfigDescriptor ( > ASL_RESOURCE_INFO *Info); > > + > /* > * aslrestype2d - DWord address descriptors > */ > diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h > index 8089d0b9..cffb0af1 100644 > --- a/src/acpica/source/compiler/asldefine.h > +++ b/src/acpica/source/compiler/asldefine.h > @@ -298,5 +298,4 @@ > #define COMMENT_CAPTURE_ON AslGbl_CommentState.CaptureComments = TRUE; > #define COMMENT_CAPTURE_OFF AslGbl_CommentState.CaptureComments = FALSE; > > - > #endif /* ASLDEFINE.H */ > diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c > index a2f9fcef..db6d871d 100644 > --- a/src/acpica/source/compiler/aslerror.c > +++ b/src/acpica/source/compiler/aslerror.c > @@ -474,10 +474,12 @@ AePrintErrorSourceLine ( > * Use the merged header/source file if present, otherwise > * use input file > */ > - SourceFile = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; > + SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT, > + ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename); > if (!SourceFile) > { > - SourceFile = AslGbl_Files[ASL_FILE_INPUT].Handle; > + SourceFile = FlGetFileHandle (ASL_FILE_INPUT, > + ASL_FILE_INPUT, Enode->Filename); > } > > if (SourceFile) > @@ -818,6 +820,7 @@ static void AslInitEnode ( > ASL_ERROR_MSG *SubError) > { > ASL_ERROR_MSG *Enode; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); > @@ -859,6 +862,23 @@ static void AslInitEnode ( > { > Enode->FilenameLength = 6; > } > + > + FileNode = FlGetCurrentFileNode (); > + if (!FileNode) > + { > + return; > + } > + > + if (!FlInputFileExists (Filename)) > + { > + /* > + * This means that this file is an include file. Record the .src > + * file as the error message source because this file is not in > + * the global file list. > + */ > + Enode->SourceFilename = > + FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename; > + } > } > } > > @@ -992,7 +1012,7 @@ AslLogNewError ( > } > > AslGbl_ExceptionCount[ModifiedLevel]++; > - if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > + if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) > { > printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT); > > diff --git a/src/acpica/source/compiler/aslfileio.c b/src/acpica/source/compiler/aslfileio.c > index 3243ab51..3db7b533 100644 > --- a/src/acpica/source/compiler/aslfileio.c > +++ b/src/acpica/source/compiler/aslfileio.c > @@ -177,7 +177,7 @@ FlFileError ( > { > > sprintf (AslGbl_MsgBuffer, "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename, > - AslGbl_Files[FileId].Description, strerror (errno)); > + AslGbl_FileDescs[FileId].Description, strerror (errno)); > > AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer); > } > @@ -500,7 +500,7 @@ FlDeleteFile ( > if (remove (Info->Filename)) > { > printf ("%s (%s file) ", > - Info->Filename, Info->Description); > + Info->Filename, AslGbl_FileDescs[FileId].Description); > perror ("Could not delete"); > } > > diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c > index 0120af02..80a74e81 100644 > --- a/src/acpica/source/compiler/aslfiles.c > +++ b/src/acpica/source/compiler/aslfiles.c > @@ -170,6 +170,257 @@ FlParseInputPathname ( > #endif > > > +/******************************************************************************* > + * > + * FUNCTION: FlInitOneFile > + * > + * PARAMETERS: InputFilename - The user-specified ASL source file to be > + * compiled > + * > + * RETURN: Status > + * > + * DESCRIPTION: Initialize global file structure for one input file. This file > + * structure contains references to input, output, debugging, and > + * other miscellaneous files that are associated for a single > + * input ASL file. > + * > + ******************************************************************************/ > + > +ACPI_STATUS > +FlInitOneFile ( > + char *InputFilename) > +{ > + UINT32 i; > + ASL_GLOBAL_FILE_NODE *NewFileNode; > + > + > + if (FlInputFileExists (InputFilename)) > + { > + AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); > + return (AE_ALREADY_EXISTS); > + } > + > + NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, > + UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); > + > + if (!NewFileNode) > + { > + AslError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, NULL, NULL); > + return (AE_NO_MEMORY); > + } > + > + NewFileNode->ParserErrorDetected = FALSE; > + NewFileNode->Next = AslGbl_FilesList; > + > + AslGbl_FilesList = NewFileNode; > + AslGbl_Files = NewFileNode->Files; > + > + for (i = 0; i < ASL_NUM_FILES; i++) > + { > + AslGbl_Files[i].Handle = NULL; > + AslGbl_Files[i].Filename = NULL; > + } > + > + AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > + AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > + > + if (AslGbl_VerboseErrors) > + { > + AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; > + } > + else > + { > + AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > + } > + > + AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; > + return (AE_OK); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlInputFileExists > + * > + * PARAMETERS: Filename - File name to be searched > + * > + * RETURN: Status > + * > + * DESCRIPTION: Returns true if the file name already exists. > + * > + ******************************************************************************/ > + > +BOOLEAN > +FlInputFileExists ( > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + while (Current) > + { > + if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) > + { > + return (TRUE); > + } > + > + Current = Current->Next; > + } > + > + return (FALSE); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlSwitchFileSet > + * > + * PARAMETERS: Op - Parse node for the LINE asl statement > + * > + * RETURN: None. > + * > + * DESCRIPTION: Set the current line number > + * > + ******************************************************************************/ > + > +ASL_FILE_SWITCH_STATUS > +FlSwitchFileSet ( > + char *InputFilename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; > + > + > + while (Current) > + { > + if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) > + { > + AslGbl_Files = Current->Files; > + AslGbl_TableSignature = Current->TableSignature; > + AslGbl_TableId = Current->TableId; > + > + if (!strcmp (InputFilename, PrevFilename)) > + { > + return (SWITCH_TO_SAME_FILE); > + } > + else > + { > + return (SWITCH_TO_DIFFERENT_FILE); > + } > + } > + > + Current = Current->Next; > + } > + > + return (FILE_NOT_FOUND); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetFileHandle > + * > + * PARAMETERS: OutFileId - denotes file type of output handle > + * InFileId - denotes file type of the input Filename > + * Filename > + * > + * RETURN: File handle > + * > + * DESCRIPTION: Get the file handle for a particular filename/FileId. This > + * function also allows the caller to specify the file Id of the > + * desired type. > + * > + ******************************************************************************/ > + > +FILE * > +FlGetFileHandle ( > + UINT32 OutFileId, > + UINT32 InFileId, > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + if (!Filename) > + { > + return (NULL); > + } > + > + while (Current) > + { > + if (!strcmp (Current->Files[InFileId].Filename, Filename)) > + { > + return (Current->Files[OutFileId].Handle); > + } > + > + Current = Current->Next; > + } > + > + return (NULL); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetFileNode > + * > + * PARAMETERS: FileId - File type (ID) of the input Filename > + * Filename - File to search for > + * > + * RETURN: A global file node > + * > + * DESCRIPTION: Get the file node for a particular filename/FileId. > + * > + ******************************************************************************/ > + > +ASL_GLOBAL_FILE_NODE * > +FlGetFileNode ( > + UINT32 FileId, > + char *Filename) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + if (!Filename) > + { > + return (NULL); > + } > + > + while (Current) > + { > + if (!strcmp (Current->Files[FileId].Filename, Filename)) > + { > + return (Current); > + } > + > + Current = Current->Next; > + } > + > + return (NULL); > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: FlGetCurrentFileNode > + * > + * PARAMETERS: None > + * > + * RETURN: Global file node > + * > + * DESCRIPTION: Get the current input file node > + * > + ******************************************************************************/ > + > +ASL_GLOBAL_FILE_NODE * > +FlGetCurrentFileNode ( > + void) > +{ > + return (FlGetFileNode ( > + ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename)); > +} > + > + > /******************************************************************************* > * > * FUNCTION: FlSetLineNumber > @@ -426,8 +677,6 @@ FlOpenIncludeWithPrefix ( > IncludeFile = fopen (Pathname, "r"); > if (!IncludeFile) > { > - fprintf (stderr, "Could not open include file %s\n", Pathname); > - ACPI_FREE (Pathname); > return (NULL); > } > > diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h > index bc7358cd..213c5408 100644 > --- a/src/acpica/source/compiler/aslglobal.h > +++ b/src/acpica/source/compiler/aslglobal.h > @@ -172,28 +172,27 @@ > UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; > > /* Table below must match ASL_FILE_TYPES in asltypes.h */ > - > -ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES] = > +ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES] = > { > - {NULL, NULL, "stdout: ", "Standard Output"}, > - {NULL, NULL, "stderr: ", "Standard Error"}, > - {NULL, NULL, "Table Input: ", "Source Input"}, > - {NULL, NULL, "Binary Output:", "AML Output"}, > - {NULL, NULL, "Source Output:", "Source Output"}, > - {NULL, NULL, "Preprocessor: ", "Preprocessor Output"}, > - {NULL, NULL, "Preprocessor: ", "Preprocessor Temp File"}, > - {NULL, NULL, "Listing File: ", "Listing Output"}, > - {NULL, NULL, "Hex Dump: ", "Hex Table Output"}, > - {NULL, NULL, "Namespace: ", "Namespace Output"}, > - {NULL, NULL, "Debug File: ", "Debug Output"}, > - {NULL, NULL, "ASM Source: ", "Assembly Code Output"}, > - {NULL, NULL, "C Source: ", "C Code Output"}, > - {NULL, NULL, "ASM Include: ", "Assembly Header Output"}, > - {NULL, NULL, "C Include: ", "C Header Output"}, > - {NULL, NULL, "Offset Table: ", "C Offset Table Output"}, > - {NULL, NULL, "Device Map: ", "Device Map Output"}, > - {NULL, NULL, "Cross Ref: ", "Cross-reference Output"}, > - {NULL, NULL, "Converter db :", "Converter debug Output"} > + {"stdout: ", "Standard Output"}, > + {"stderr: ", "Standard Error"}, > + {"Table Input: ", "Source Input"}, > + {"Binary Output:", "AML Output"}, > + {"Source Output:", "Source Output"}, > + {"Preprocessor: ", "Preprocessor Output"}, > + {"Preprocessor: ", "Preprocessor Temp File"}, > + {"Listing File: ", "Listing Output"}, > + {"Hex Dump: ", "Hex Table Output"}, > + {"Namespace: ", "Namespace Output"}, > + {"Debug File: ", "Debug Output"}, > + {"ASM Source: ", "Assembly Code Output"}, > + {"C Source: ", "C Code Output"}, > + {"ASM Include: ", "Assembly Header Output"}, > + {"C Include: ", "C Header Output"}, > + {"Offset Table: ", "C Offset Table Output"}, > + {"Device Map: ", "Device Map Output"}, > + {"Cross Ref: ", "Cross-reference Output"}, > + {"Converter dbg:", "Converter debug Output"} > }; > > /* Table below must match the defines with the same names in actypes.h */ > @@ -225,8 +224,8 @@ const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS] = > }; > > #else > +extern ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES]; > extern UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS]; > -extern ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES]; > extern const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS]; > #endif > > @@ -269,7 +268,6 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentColumn, 0); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineNumber, 1); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_LogicalLineNumber, 1); > ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineOffset, 0); > -ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_OriginalInputFileSize, 0); > ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_SyntaxError, 0); > > /* Exception reporting */ > @@ -300,6 +298,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ListingFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_IgnoreErrors, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_SourceOutputFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParseOnlyFlag, FALSE); > +ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParserErrorDetected, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_CompileTimesFlag, FALSE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_FoldConstants, TRUE); > ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_VerboseErrors, TRUE); > @@ -385,6 +384,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_SourceLine, 0); > ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_FileType, 0); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_Signature, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ParseTreeRoot, NULL); > +ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_CurrentDB, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ExternalsListHead, NULL); > ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*AslGbl_ListingNode, NULL); > ASL_EXTERN ACPI_PARSE_OBJECT *AslGbl_FirstLevelInsertionNode; > @@ -403,6 +403,8 @@ ASL_EXTERN UINT16 ASL_INIT_GLOBAL (AslGbl_PruneType, 0); > ASL_EXTERN ASL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_IncludeFileStack, NULL); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO_SIG"); > ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); > +ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); > +ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); > > /* Specific to the -q option */ > > diff --git a/src/acpica/source/compiler/asllisting.c b/src/acpica/source/compiler/asllisting.c > index df3b7587..7bc118bc 100644 > --- a/src/acpica/source/compiler/asllisting.c > +++ b/src/acpica/source/compiler/asllisting.c > @@ -254,6 +254,7 @@ static void > LsGenerateListing ( > UINT32 FileId) > { > + UINT32 WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY; > > /* Start at the beginning of both the source and AML files */ > > @@ -271,7 +272,7 @@ LsGenerateListing ( > > LsDoOffsetTableHeader (FileId); > > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, > LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); > LsDoOffsetTableFooter (FileId); > return; > @@ -279,7 +280,7 @@ LsGenerateListing ( > > /* Process all parse nodes */ > > - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, > + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, > LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); > > /* Final processing */ > @@ -847,7 +848,7 @@ LsFinishSourceListing ( > FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); > AePrintErrorLog (FileId); > FlPrintFile (FileId, "\n"); > - UtDisplaySummary (FileId); > + UtDisplayOneSummary (FileId, TRUE); > FlPrintFile (FileId, "\n"); > } > } > diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c > index dfbdf7ce..a055bab0 100644 > --- a/src/acpica/source/compiler/aslload.c > +++ b/src/acpica/source/compiler/aslload.c > @@ -324,6 +324,7 @@ LdLoadFieldElements ( > (Node->Flags & ANOBJ_IS_EXTERNAL)) > { > Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; > + Node->Flags &= ~ANOBJ_IS_EXTERNAL; > } > else > { > diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c > index 26f4a0c4..81f634e6 100644 > --- a/src/acpica/source/compiler/aslmain.c > +++ b/src/acpica/source/compiler/aslmain.c > @@ -255,6 +255,14 @@ main ( > } > } > > + /* ACPICA subsystem initialization */ > + > + Status = AdInitialize (); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > > /* Process each pathname/filename in the list, with possible wildcards */ > > @@ -280,17 +288,71 @@ main ( > Index2++; > } > > + /* > + * At this point, compilation of a data table or disassembly is complete. > + */ > + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA || AcpiGbl_DisasmFlag) > + { > + goto CleanupAndExit; > + } > + > + CmDoAslMiddleAndBackEnd (); > + > + /* > + * At this point, all semantic analysis has been completed. Check > + * expected error messages before cleanup or conversion. > + */ > + AslCheckExpectedExceptions (); > + > + /* ASL-to-ASL+ conversion - Perform immediate disassembly */ > + > + if (AslGbl_DoAslConversion) > + { > + /* re-initialize ACPICA subsystem for disassembler */ > + > + Status = AdInitialize (); > + if (ACPI_FAILURE (Status)) > + { > + return (Status); > + } > + > + /* > + * New input file is the output AML file from above. > + * New output is from the input ASL file from above. > + */ > + AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > + AslGbl_Files[ASL_FILE_INPUT].Filename = > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; > + > + CvDbgPrint ("Output filename: %s\n", AslGbl_OutputFilenamePrefix); > + fprintf (stderr, "\n"); > + > + AcpiGbl_DisasmFlag = TRUE; > + AslDoDisassembly (); > + AcpiGbl_DisasmFlag = FALSE; > + > + /* delete the AML file. This AML file should never be utilized by AML interpreters. */ > + > + FlDeleteFile (ASL_FILE_AML_OUTPUT); > + } > + > + > > CleanupAndExit: > > UtFreeLineBuffers (); > AslParserCleanup (); > + AcpiDmClearExternalFileList(); > + (void) AcpiTerminate (); > + > + /* CmCleanupAndExit is intended for the compiler only */ > > - if (AcpiGbl_ExternalFileList) > + if (!AcpiGbl_DisasmFlag) > { > - AcpiDmClearExternalFileList(); > + CmCleanupAndExit (); > } > > + > return (ReturnStatus); > } > > @@ -372,9 +434,6 @@ static void > AslInitialize ( > void) > { > - UINT32 i; > - > - > AcpiGbl_DmOpt_Verbose = FALSE; > > /* Default integer width is 32 bits */ > @@ -382,16 +441,4 @@ AslInitialize ( > AcpiGbl_IntegerBitWidth = 32; > AcpiGbl_IntegerNybbleWidth = 8; > AcpiGbl_IntegerByteWidth = 4; > - > - for (i = 0; i < ASL_NUM_FILES; i++) > - { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > - > - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > - > - AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; > - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; > } > diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c > index 0f31c655..d7e2eb43 100644 > --- a/src/acpica/source/compiler/aslmessages.c > +++ b/src/acpica/source/compiler/aslmessages.c > @@ -353,8 +353,8 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)", > /* ASL_MSG_FOUND_HERE */ "Original name creation/declaration below: ", > /* ASL_MSG_ILLEGAL_RECURSION */ "Illegal recursive call to method that creates named objects", > -/* ASL_MSG_PLACE_HOLDER_00 */ "", /* TODO: fill in this slot with a new error message */ > -/* ASL_MSG_PLACE_HOLDER_01 */ "", /* TODO: fill in this slot with a new error message */ > +/* ASL_MSG_DUPLICATE_INPUT_FILE */ "Duplicate input files detected:", > +/* ASL_MSG_WARNING_AS_ERROR */ "Warnings detected during compilation", > /* ASL_MSG_OEM_TABLE_ID */ "Invalid OEM Table ID", > /* ASL_MSG_OEM_ID */ "Invalid OEM ID", > /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", > @@ -363,7 +363,8 @@ const char *AslCompilerMsgs [] = > /* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", > /* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist", > /* ASL_MSG_REGION_LENGTH */ "Operation Region declared with zero length", > -/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed" > +/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed", > +/* ASL_MSG_UNDEFINED_EXTERNAL */ "Named object was declared external but the actual definition does not exist" > }; > > /* Table compiler */ > diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h > index 817e192e..a7cd1f31 100644 > --- a/src/acpica/source/compiler/aslmessages.h > +++ b/src/acpica/source/compiler/aslmessages.h > @@ -355,8 +355,8 @@ typedef enum > ASL_MSG_NULL_RESOURCE_TEMPLATE, > ASL_MSG_FOUND_HERE, > ASL_MSG_ILLEGAL_RECURSION, > - ASL_MSG_PLACE_HOLDER_00, > - ASL_MSG_PLACE_HOLDER_01, > + ASL_MSG_DUPLICATE_INPUT_FILE, > + ASL_MSG_WARNING_AS_ERROR, > ASL_MSG_OEM_TABLE_ID, > ASL_MSG_OEM_ID, > ASL_MSG_UNLOAD, > @@ -366,6 +366,7 @@ typedef enum > ASL_MSG_NAMEPATH_NOT_EXIST, > ASL_MSG_REGION_LENGTH, > ASL_MSG_TEMPORARY_OBJECT, > + ASL_MSG_UNDEFINED_EXTERNAL, > > /* These messages are used by the Data Table compiler only */ > > diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c > index 67e16fd5..4f4b636d 100644 > --- a/src/acpica/source/compiler/asloperands.c > +++ b/src/acpica/source/compiler/asloperands.c > @@ -1045,6 +1045,7 @@ OpnDoDefinitionBlock ( > ACPI_SIZE Length; > UINT32 i; > char *Filename; > + ACPI_STATUS Status; > > > /* > @@ -1062,6 +1063,12 @@ OpnDoDefinitionBlock ( > *Child->Asl.Value.Buffer && > (AslGbl_UseDefaultAmlFilename)) > { > + /* > + * The walk may traverse multiple definition blocks. Switch files > + * to ensure that the correct files are manipulated. > + */ > + FlSwitchFileSet (Op->Asl.Filename); > + > /* > * We will use the AML filename that is embedded in the source file > * for the output filename. > @@ -1076,6 +1083,22 @@ OpnDoDefinitionBlock ( > > AslGbl_OutputFilenamePrefix = Filename; > UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > + > + /* > + * Use the definition block file parameter instead of the input > + * filename. Since all files were opened previously, remove the > + * existing file and open a new file with the name of this > + * definiton block parameter. Since AML code generation has yet > + * to happen, the previous file can be removed without any impacts. > + */ > + FlCloseFile (ASL_FILE_AML_OUTPUT); > + FlDeleteFile (ASL_FILE_AML_OUTPUT); > + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > + if (ACPI_FAILURE (Status)) > + { > + AslError (ASL_ERROR, ASL_MSG_OUTPUT_FILE_OPEN, NULL, NULL); > + return; > + } > } > > Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > @@ -1086,6 +1109,7 @@ OpnDoDefinitionBlock ( > Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > if (Child->Asl.Value.String) > { > + AslGbl_FilesList->TableSignature = Child->Asl.Value.String; > AslGbl_TableSignature = Child->Asl.Value.String; > if (strlen (AslGbl_TableSignature) != ACPI_NAMESEG_SIZE) > { > @@ -1138,6 +1162,7 @@ OpnDoDefinitionBlock ( > > AslGbl_TableId = UtLocalCacheCalloc (Length + 1); > strcpy (AslGbl_TableId, Child->Asl.Value.String); > + AslGbl_FilesList->TableId = AslGbl_TableId; > > /* > * Convert anything non-alphanumeric to an underscore. This > diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c > index dc0b9079..dc00e1d2 100644 > --- a/src/acpica/source/compiler/asloptions.c > +++ b/src/acpica/source/compiler/asloptions.c > @@ -896,7 +896,6 @@ AslDoOptions ( > */ > AslGbl_VerboseErrors = FALSE; > AslGbl_DoSignon = FALSE; > - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > break; > > case 'o': > diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c > index c0f14c80..aee5ad60 100644 > --- a/src/acpica/source/compiler/aslstartup.c > +++ b/src/acpica/source/compiler/aslstartup.c > @@ -165,10 +165,6 @@ static UINT8 > AslDetectSourceFileType ( > ASL_FILE_INFO *Info); > > -static ACPI_STATUS > -AslDoDisassembly ( > - void); > - > > /* Globals */ > > @@ -227,12 +223,6 @@ AslInitializeGlobals ( > AslGbl_ExceptionCount[i] = 0; > } > > - for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++) > - { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > - > if (AcpiGbl_CaptureComments) > { > AslGbl_CommentState.SpacesBefore = 0; > @@ -343,25 +333,19 @@ Cleanup: > * RETURN: Status > * > * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build > - * namespace. > + * namespace. This function assumes that the ACPI subsystem has > + * been initialized. The caller of the initialization will also > + * terminate the ACPI subsystem. > * > ******************************************************************************/ > > -static ACPI_STATUS > +ACPI_STATUS > AslDoDisassembly ( > void) > { > ACPI_STATUS Status; > > > - /* ACPICA subsystem initialization */ > - > - Status = AdInitialize (); > - if (ACPI_FAILURE (Status)) > - { > - return (Status); > - } > - > Status = AcpiAllocateRootTable (4); > if (ACPI_FAILURE (Status)) > { > @@ -370,11 +354,6 @@ AslDoDisassembly ( > return (Status); > } > > - /* Handle additional output files for disassembler */ > - > - AslGbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; > - Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); > - > /* This is where the disassembly happens */ > > AcpiGbl_DmOpt_Disasm = TRUE; > @@ -390,10 +369,9 @@ AslDoDisassembly ( > > AcpiDmUnresolvedWarning (0); > > - /* Shutdown compiler and ACPICA subsystem */ > + /* Clear Error log */ > > AeClearErrorLog (); > - (void) AcpiTerminate (); > > /* > * AslGbl_Files[ASL_FILE_INPUT].Filename was replaced with the > @@ -406,11 +384,6 @@ AslDoDisassembly ( > return (AE_CTRL_CONTINUE); > } > > - /* No need to free the filename string */ > - > - AslGbl_Files[ASL_FILE_INPUT].Filename = NULL; > - > - UtDeleteLocalCaches (); > return (AE_OK); > } > > @@ -432,6 +405,8 @@ AslDoOneFile ( > char *Filename) > { > ACPI_STATUS Status; > + UINT8 Event; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > /* Re-initialize "some" compiler/preprocessor globals */ > @@ -450,6 +425,18 @@ AslDoOneFile ( > return (Status); > } > > + /* > + * There was an input file detected at this point. Each input ASL file is > + * associated with one global file node consisting of the input file and > + * all output files associated with it. This is useful when compiling > + * multiple files in one command. > + */ > + Status = FlInitOneFile(Filename); > + if (ACPI_FAILURE (Status)) > + { > + return (AE_ERROR); > + } > + > /* Take a copy of the input filename, convert any backslashes */ > > AslGbl_Files[ASL_FILE_INPUT].Filename = > @@ -458,18 +445,6 @@ AslDoOneFile ( > strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename); > UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); > > - /* > - * AML Disassembly (Optional) > - */ > - if (AcpiGbl_DisasmFlag) > - { > - Status = AslDoDisassembly (); > - if (Status != AE_CTRL_CONTINUE) > - { > - return (Status); > - } > - } > - > /* > * Open the input file. Here, this should be an ASCII source file, > * either an ASL file or a Data Table file > @@ -481,7 +456,13 @@ AslDoOneFile ( > return (AE_ERROR); > } > > - AslGbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > + FileNode = FlGetCurrentFileNode(); > + if (!FileNode) > + { > + return (AE_ERROR); > + } > + > + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); > > /* Determine input file type */ > > @@ -500,6 +481,22 @@ AslDoOneFile ( > AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > } > > + /* > + * Open the output file. Note: by default, the name of this file comes from > + * the table descriptor within the input file. > + */ > + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_ASL) > + { > + Event = UtBeginEvent ("Open AML output file"); > + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > + UtEndEvent (Event); > + if (ACPI_FAILURE (Status)) > + { > + AePrintErrorLog (ASL_FILE_STDERR); > + return (AE_ERROR); > + } > + } > + > /* Open the optional output files (listings, etc.) */ > > Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); > @@ -550,20 +547,7 @@ AslDoOneFile ( > */ > case ASL_INPUT_TYPE_ASCII_ASL: > > - /* ACPICA subsystem initialization */ > - > - Status = AdInitialize (); > - if (ACPI_FAILURE (Status)) > - { > - return (Status); > - } > - > - (void) CmDoCompile (); > - (void) AcpiTerminate (); > - > - /* Check if any errors occurred during compile */ > - > - Status = AslCheckForErrorExit (); > + Status = CmDoCompile (); > if (ACPI_FAILURE (Status)) > { > return (Status); > @@ -574,27 +558,11 @@ AslDoOneFile ( > AeClearErrorLog (); > PrTerminatePreprocessor (); > > - /* ASL-to-ASL+ conversion - Perform immediate disassembly */ > - > - if (AslGbl_DoAslConversion) > - { > - /* > - * New input file is the output AML file from above. > - * New output is from the input ASL file from above. > - */ > - AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; > - CvDbgPrint ("OUTPUTFILENAME: %s\n", AslGbl_OutputFilenamePrefix); > - AslGbl_Files[ASL_FILE_INPUT].Filename = > - AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; > - AcpiGbl_DisasmFlag = TRUE; > - fprintf (stderr, "\n"); > - AslDoDisassembly (); > - > - /* delete the AML file. This AML file should never be utilized by AML interpreters. */ > - > - FlDeleteFile (ASL_FILE_AML_OUTPUT); > - } > - > + /* > + * At this point, we know how many lines are in the input file. Save it > + * to display for post-compilation summary. > + */ > + FileNode->TotalLineCount = AslGbl_CurrentLineNumber; > return (AE_OK); > > /* > @@ -661,6 +629,8 @@ AslCheckForErrorExit ( > (AslGbl_ExceptionCount[ASL_WARNING2] > 0) || > (AslGbl_ExceptionCount[ASL_WARNING3] > 0)) > { > + AslError (ASL_ERROR, ASL_MSG_WARNING_AS_ERROR, NULL, > + "(reporting warnings as errors)"); > return (AE_ERROR); > } > } > diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l > index 5cac84dc..69c1399a 100644 > --- a/src/acpica/source/compiler/aslsupport.l > +++ b/src/acpica/source/compiler/aslsupport.l > @@ -532,14 +532,18 @@ count ( > { > case 2: > > - AslGbl_TotalKeywords++; > - AslGbl_TotalNamedObjects++; > + ++AslGbl_TotalKeywords; > + ++AslGbl_TotalNamedObjects; > + ++AslGbl_FilesList->TotalKeywords; > + ++AslGbl_FilesList->TotalNamedObjects; > break; > > case 3: > > - AslGbl_TotalKeywords++; > - AslGbl_TotalExecutableOpcodes++; > + ++AslGbl_TotalKeywords; > + ++AslGbl_TotalExecutableOpcodes; > + ++AslGbl_FilesList->TotalKeywords; > + ++AslGbl_FilesList->TotalExecutableOpcodes; > break; > > default: > diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c > index 6bb40888..62efc5fa 100644 > --- a/src/acpica/source/compiler/asltree.c > +++ b/src/acpica/source/compiler/asltree.c > @@ -462,6 +462,7 @@ TrLinkOpChildren ( > { > ACPI_PARSE_OBJECT *Child; > ACPI_PARSE_OBJECT *PrevChild; > + ACPI_PARSE_OBJECT *LastSibling; > va_list ap; > UINT32 i; > BOOLEAN FirstChild; > @@ -480,8 +481,18 @@ TrLinkOpChildren ( > { > case PARSEOP_ASL_CODE: > > - AslGbl_ParseTreeRoot = Op; > - Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > + if (!AslGbl_ParseTreeRoot) > + { > + DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n"); > + AslGbl_ParseTreeRoot = Op; > + Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; > + } > + else > + { > + DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n"); > + Op = AslGbl_ParseTreeRoot; > + } > + > DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); > break; > > @@ -560,7 +571,27 @@ TrLinkOpChildren ( > if (FirstChild) > { > FirstChild = FALSE; > - Op->Asl.Child = Child; > + > + /* > + * In the case that multiple definition blocks are being compiled, > + * append the definition block to the end of the child list as the > + * last sibling. This is done to facilitate namespace cross- > + * reference between multiple definition blocks. > + */ > + if (Op->Asl.Child && > + (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)) > + { > + LastSibling = Op->Asl.Child; > + while (LastSibling->Asl.Next) > + { > + LastSibling = LastSibling->Asl.Next; > + } > + LastSibling->Asl.Next = Child; > + } > + else > + { > + Op->Asl.Child = Child; > + } > } > > /* Point all children to parent */ > @@ -825,6 +856,8 @@ TrWalkParseTree ( > BOOLEAN OpPreviouslyVisited; > ACPI_PARSE_OBJECT *StartOp = Op; > ACPI_STATUS Status; > + ACPI_PARSE_OBJECT *Restore = NULL; > + BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY; > > > if (!AslGbl_ParseTreeRoot) > @@ -835,7 +868,13 @@ TrWalkParseTree ( > Level = 0; > OpPreviouslyVisited = FALSE; > > - switch (Visitation) > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Restore = Op->Asl.Next; > + Op->Asl.Next = NULL; > + } > + switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY) > { > case ASL_WALK_VISIT_DOWNWARD: > > @@ -861,7 +900,7 @@ TrWalkParseTree ( > { > /* Exit immediately on any error */ > > - return (Status); > + goto ErrorExit; > } > } > > @@ -907,7 +946,7 @@ TrWalkParseTree ( > Status = AscendingCallback (Op, Level, Context); > if (ACPI_FAILURE (Status)) > { > - return (Status); > + goto ErrorExit; > } > } > else > @@ -956,7 +995,7 @@ TrWalkParseTree ( > Status = AscendingCallback (Op, Level, Context); > if (ACPI_FAILURE (Status)) > { > - return (Status); > + goto ErrorExit; > } > } > else > @@ -979,7 +1018,7 @@ TrWalkParseTree ( > { > /* Exit immediately on any error */ > > - return (Status); > + goto ErrorExit; > } > } > > @@ -1018,5 +1057,20 @@ TrWalkParseTree ( > > /* If we get here, the walk completed with no errors */ > > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Op->Asl.Next = Restore; > + } > + > return (AE_OK); > + > +ErrorExit: > + > + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && > + WalkOneDefinitionBlock) > + { > + Op->Asl.Next = Restore; > + } > + return (Status); > } > diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h > index 628b2d37..8a6a0750 100644 > --- a/src/acpica/source/compiler/asltypes.h > +++ b/src/acpica/source/compiler/asltypes.h > @@ -221,10 +221,10 @@ typedef struct asl_analysis_walk_info > > typedef struct asl_mapping_entry > { > - UINT32 Value; > - UINT32 AcpiBtype; /* Object type or return type */ > - UINT16 AmlOpcode; > - UINT8 Flags; > + UINT32 Value; > + UINT32 AcpiBtype; /* Object type or return type */ > + UINT16 AmlOpcode; > + UINT8 Flags; > > } ASL_MAPPING_ENTRY; > > @@ -233,8 +233,8 @@ typedef struct asl_mapping_entry > > typedef struct asl_walk_info > { > - ACPI_PARSE_OBJECT **NodePtr; > - UINT32 *LevelPtr; > + ACPI_PARSE_OBJECT **NodePtr; > + UINT32 *LevelPtr; > > } ASL_WALK_INFO; > > @@ -243,10 +243,8 @@ typedef struct asl_walk_info > > typedef struct asl_file_info > { > - FILE *Handle; > - char *Filename; > - const char *ShortDescription; > - const char *Description; > + FILE *Handle; > + char *Filename; > > } ASL_FILE_INFO; > > @@ -258,6 +256,11 @@ typedef struct asl_file_status > } ASL_FILE_STATUS; > > > +typedef UINT32 ASL_FILE_SWITCH_STATUS; /* File switch status */ > +#define SWITCH_TO_DIFFERENT_FILE 0 > +#define SWITCH_TO_SAME_FILE 1 > +#define FILE_NOT_FOUND 2 > + > /* > * File types. Note: Any changes to this table must also be reflected > * in the Gbl_Files array. > @@ -295,10 +298,17 @@ typedef enum > > } ASL_FILE_TYPES; > > - > #define ASL_MAX_FILE_TYPE 18 > #define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1) > > +typedef struct asl_file_desc > +{ > + const char *ShortDescription; > + const char *Description; > + > +} ASL_FILE_DESC; > + > + > /* Name suffixes used to create filenames for output files */ > > #define FILE_SUFFIX_ASL_CODE "asl" > @@ -325,16 +335,16 @@ typedef enum > > typedef struct asl_cache_info > { > - void *Next; > - char Buffer[1]; > + void *Next; > + char Buffer[1]; > > } ASL_CACHE_INFO; > > > typedef struct asl_include_dir > { > - char *Dir; > - struct asl_include_dir *Next; > + char *Dir; > + struct asl_include_dir *Next; > > } ASL_INCLUDE_DIR; > > @@ -343,6 +353,11 @@ typedef struct asl_include_dir > * An entry in the exception list, one for each error/warning > * Note: SubError nodes would be treated with the same messageId and Level > * as the parent error node. > + * > + * The source filename represents the name of the .src of where the error > + * occurred. This is useful for errors that occur inside of include files. > + * Since include files aren't recorded as a part of the global files list, > + * this provides a way to get the included file. > */ > typedef struct asl_error_msg > { > @@ -355,6 +370,7 @@ typedef struct asl_error_msg > struct asl_error_msg *SubError; > char *Filename; > char *SourceLine; > + char *SourceFilename; > UINT32 FilenameLength; > UINT16 MessageId; > UINT8 Level; > @@ -362,6 +378,7 @@ typedef struct asl_error_msg > } ASL_ERROR_MSG; > > /* An entry in the expected messages array */ > + > typedef struct asl_expected_message > { > UINT32 MessageId; > @@ -479,4 +496,19 @@ typedef struct asl_file_node > > } ASL_FILE_NODE; > > +typedef struct asl_files_node > +{ > + struct asl_file_info Files[ASL_NUM_FILES]; > + struct asl_files_node *Next; > + char *TableSignature; > + char *TableId; > + UINT32 TotalLineCount; > + UINT32 OriginalInputFileSize; > + UINT32 TotalKeywords; > + UINT32 TotalNamedObjects; > + UINT32 TotalExecutableOpcodes; > + BOOLEAN ParserErrorDetected; > + > +} ASL_GLOBAL_FILE_NODE; > + > #endif /* __ASLTYPES_H */ > diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c > index 6b0d5eff..0b78f473 100644 > --- a/src/acpica/source/compiler/aslutils.c > +++ b/src/acpica/source/compiler/aslutils.c > @@ -174,6 +174,10 @@ UtAttachNameseg ( > ACPI_PARSE_OBJECT *Op, > char *Name); > > +static void > +UtDisplayErrorSummary ( > + UINT32 FileId); > + > > /******************************************************************************* > * > @@ -520,21 +524,23 @@ UtSetParseOpName ( > > /******************************************************************************* > * > - * FUNCTION: UtDisplaySummary > + * FUNCTION: UtDisplayOneSummary > * > * PARAMETERS: FileID - ID of outpout file > * > * RETURN: None > * > - * DESCRIPTION: Display compilation statistics > + * DESCRIPTION: Display compilation statistics for one input file > * > ******************************************************************************/ > > void > -UtDisplaySummary ( > - UINT32 FileId) > +UtDisplayOneSummary ( > + UINT32 FileId, > + BOOLEAN DisplayErrorSummary) > { > UINT32 i; > + ASL_GLOBAL_FILE_NODE *FileNode; > > > if (FileId != ASL_FILE_STDOUT) > @@ -565,25 +571,41 @@ UtDisplaySummary ( > } > else > { > - FlPrintFile (FileId, > - "%-14s %s - %u lines, %u bytes, %u keywords\n", > - "ASL Input:", > - AslGbl_Files[ASL_FILE_INPUT].Filename, AslGbl_CurrentLineNumber, > - AslGbl_OriginalInputFileSize, AslGbl_TotalKeywords); > - > - /* AML summary */ > - > - if ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || (AslGbl_IgnoreErrors)) > + FileNode = FlGetCurrentFileNode (); > + if (!FileNode) > { > - if (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > + fprintf (stderr, "Summary could not be generated"); > + return; > + } > + if (FileNode->ParserErrorDetected) > + { > + FlPrintFile (FileId, > + "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n", > + "ASL Input:", AslGbl_Files[ASL_FILE_INPUT].Filename); > + } > + else > + { > + FlPrintFile (FileId, > + "%-14s %s - %7u bytes %6u keywords %6u source lines\n", > + "ASL Input:", > + AslGbl_Files[ASL_FILE_INPUT].Filename, > + FileNode->OriginalInputFileSize, > + FileNode->TotalKeywords, > + FileNode->TotalLineCount); > + > + /* AML summary */ > + > + if (!AslGbl_ParserErrorDetected && > + ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) && > + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) > { > FlPrintFile (FileId, > - "%-14s %s - %u bytes, %u named objects, " > - "%u executable opcodes\n", > + "%-14s %s - %7u bytes %6u opcodes %6u named objects\n", > "AML Output:", > AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, > FlGetFileSize (ASL_FILE_AML_OUTPUT), > - AslGbl_TotalNamedObjects, AslGbl_TotalExecutableOpcodes); > + FileNode->TotalExecutableOpcodes, > + FileNode->TotalNamedObjects); > } > } > } > @@ -612,14 +634,55 @@ UtDisplaySummary ( > } > > FlPrintFile (FileId, "%14s %s - %u bytes\n", > - AslGbl_Files[i].ShortDescription, > + AslGbl_FileDescs[i].ShortDescription, > AslGbl_Files[i].Filename, FlGetFileSize (i)); > } > > - /* Error summary */ > + > + /* > + * Optionally emit an error summary for a file. This is used to enhance the > + * appearance of listing files. > + */ > + if (DisplayErrorSummary) > + { > + UtDisplayErrorSummary (FileId); > + } > +} > + > + > +/******************************************************************************* > + * > + * FUNCTION: UtDisplayErrorSummary > + * > + * PARAMETERS: FileID - ID of outpout file > + * > + * RETURN: None > + * > + * DESCRIPTION: Display compilation statistics for all input files > + * > + ******************************************************************************/ > + > +static void > +UtDisplayErrorSummary ( > + UINT32 FileId) > +{ > + BOOLEAN ErrorDetected; > + > + > + ErrorDetected = AslGbl_ParserErrorDetected || > + ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors); > + > + if (ErrorDetected) > + { > + FlPrintFile (FileId, "\nCompilation failed. "); > + } > + else > + { > + FlPrintFile (FileId, "\nCompilation successful. "); > + } > > FlPrintFile (FileId, > - "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", > + "%u Errors, %u Warnings, %u Remarks", > AslGbl_ExceptionCount[ASL_ERROR], > AslGbl_ExceptionCount[ASL_WARNING] + > AslGbl_ExceptionCount[ASL_WARNING2] + > @@ -628,6 +691,19 @@ UtDisplaySummary ( > > if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) > { > + if (AslGbl_ParserErrorDetected) > + { > + FlPrintFile (FileId, > + "\nNo AML files were generated due to syntax error(s)\n"); > + return; > + } > + else if (ErrorDetected) > + { > + FlPrintFile (FileId, > + "\nNo AML files were generated due to compiler error(s)\n"); > + return; > + } > + > FlPrintFile (FileId, ", %u Optimizations", > AslGbl_ExceptionCount[ASL_OPTIMIZATION]); > > @@ -641,6 +717,46 @@ UtDisplaySummary ( > } > > > +/******************************************************************************* > + * > + * FUNCTION: UtDisplaySummary > + * > + * PARAMETERS: FileID - ID of outpout file > + * > + * RETURN: None > + * > + * DESCRIPTION: Display compilation statistics for all input files > + * > + ******************************************************************************/ > + > +void > +UtDisplaySummary ( > + UINT32 FileId) > +{ > + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; > + > + > + while (Current) > + { > + switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename)) > + { > + case SWITCH_TO_SAME_FILE: > + case SWITCH_TO_DIFFERENT_FILE: > + > + UtDisplayOneSummary (FileId, FALSE); > + Current = Current->Next; > + break; > + > + case FILE_NOT_FOUND: > + default: > + > + Current = NULL; > + break; > + } > + } > + UtDisplayErrorSummary (FileId); > +} > + > /******************************************************************************* > * > * FUNCTION: UtCheckIntegerRange > diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c > index 99f6c4a0..9d6e5c0b 100644 > --- a/src/acpica/source/compiler/aslxref.c > +++ b/src/acpica/source/compiler/aslxref.c > @@ -1185,6 +1185,24 @@ XfNamespaceLocateBegin ( > } > } > > + /* > + * 5) Check for external resolution > + * By this point, everything should be loaded in the namespace. If a > + * namespace lookup results in a namespace node that is an external, it > + * means that this named object was not defined in the input ASL. This > + * causes issues because there are plenty of incidents where developers > + * use the external keyword to suppress compiler errors about undefined > + * objects. Note: this only applies when compiling multiple definition > + * blocks. > + */ > + if (AslGbl_ParseTreeRoot->Asl.Child && AslGbl_ParseTreeRoot->Asl.Child->Asl.Next && > + (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL && > + Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL) && > + (Node->Flags & ANOBJ_IS_EXTERNAL)) > + { > + AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); > + } > + > /* 5) Check for a connection object */ > #if 0 > else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONNECTION) > diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c > index 95fcb2d4..09cb3e6c 100644 > --- a/src/acpica/source/compiler/dtcompile.c > +++ b/src/acpica/source/compiler/dtcompile.c > @@ -240,8 +240,7 @@ DtDoCompile ( > DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, > "Input file does not appear to be an ASL or data table source file"); > > - Status = AE_ERROR; > - goto CleanupAndExit; > + return (AE_ERROR); > } > > Event = UtBeginEvent ("Compile parse tree"); > @@ -259,7 +258,7 @@ DtDoCompile ( > DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, > "Could not compile input file"); > > - goto CleanupAndExit; > + return (Status); > } > > /* Create/open the binary output file */ > @@ -268,7 +267,7 @@ DtDoCompile ( > Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); > if (ACPI_FAILURE (Status)) > { > - goto CleanupAndExit; > + return (Status); > } > > /* Write the binary, then the optional hex file */ > @@ -277,10 +276,6 @@ DtDoCompile ( > HxDoHexOutput (); > DtWriteTableToListing (); > > -CleanupAndExit: > - > - AcpiUtDeleteCaches (); > - CmCleanupAndExit (); > return (Status); > } > > diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c > index 9679e272..1699eb6c 100644 > --- a/src/acpica/source/compiler/fwts_iasl_interface.c > +++ b/src/acpica/source/compiler/fwts_iasl_interface.c > @@ -35,27 +35,17 @@ > */ > static void init_asl_core(void) > { > - int i; > - > AcpiOsInitialize(); > ACPI_DEBUG_INITIALIZE(); > AcpiGbl_ExternalFileList = NULL; > AcpiDbgLevel = 0; > PrInitializePreprocessor(); > - AcpiGbl_DmOpt_Verbose = FALSE; > - AcpiGbl_IntegerBitWidth = 64; > - AcpiGbl_IntegerNybbleWidth = 16; > - AcpiGbl_IntegerByteWidth = 8; > - > - for (i = 0; i < ASL_NUM_FILES; i++) { > - AslGbl_Files[i].Handle = NULL; > - AslGbl_Files[i].Filename = NULL; > - } > > - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; > - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; > - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDOUT"; > + /* From AslInitialize */ > + AcpiGbl_DmOpt_Verbose = FALSE; > + AcpiGbl_IntegerBitWidth = 32; > + AcpiGbl_IntegerNybbleWidth = 8; > + AcpiGbl_IntegerByteWidth = 4; > > AslGbl_LineBufferSize = 1024; > AslGbl_CurrentLineBuffer = NULL; > @@ -99,6 +89,7 @@ int fwts_iasl_disassemble_aml( > AslGbl_UseDefaultAmlFilename = FALSE; > AcpiGbl_CstyleDisassembly = FALSE; > AcpiGbl_DmOpt_Verbose = FALSE; > + AslGbl_ParserErrorDetected = FALSE; > UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > > /* Do we need to include external tables in? */ > @@ -135,6 +126,7 @@ int fwts_iasl_disassemble_aml( > (void)fclose(fpout); > _exit(1); > } > + AdInitialize(); > > /* ...and do the ACPICA disassambly... */ > AslDoOneFile((char *)tables[which]); > @@ -231,14 +223,28 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > (void)close(stderr_fds[0]); > > /* Setup ACPICA compiler globals */ > + AslGbl_WarningLevel = 0; > + AslGbl_NoErrors = FALSE; > AcpiGbl_DisasmFlag = FALSE; > + AslGbl_DisplayRemarks = TRUE; > + AslGbl_DisplayWarnings = TRUE; > + AslGbl_DisplayOptimizations = TRUE; > + /* AslGbl_CompileTimesFlag = TRUE; */ > AslGbl_DoCompile = TRUE; > AslGbl_PreprocessFlag = TRUE; > AslGbl_UseDefaultAmlFilename = FALSE; > AslGbl_OutputFilenamePrefix = (char*)source; > - UtConvertBackslashes (AslGbl_OutputFilenamePrefix); > + UtConvertBackslashes(AslGbl_OutputFilenamePrefix); > > - (void)AslDoOneFile((char *)source); > + AdInitialize(); > + status = AslDoOneFile((char *)source); > + > + AslCheckExpectedExceptions(); > + UtFreeLineBuffers(); > + AslParserCleanup(); > + AcpiDmClearExternalFileList(); > + AcpiTerminate(); > + CmCleanupAndExit(); > > /* > * We need to flush buffered I/O on IASL stdout > @@ -246,7 +252,6 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > */ > (void)fflush(stdout); > (void)fflush(stderr); > - > _exit(0); > break; > default: > @@ -261,6 +266,7 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde > if (fwts_iasl_read_output(stderr_fds[0], stderr_output, &stderr_len, &stderr_eof) < 0) > break; > } > + > (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); > (void)close(stdout_fds[0]); > (void)close(stderr_fds[0]); > diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c > index b5ddfa9f..f3d615ad 100644 > --- a/src/acpica/source/compiler/prutils.c > +++ b/src/acpica/source/compiler/prutils.c > @@ -455,7 +455,6 @@ PrOpenIncludeWithPrefix ( > IncludeFile = fopen (Pathname, OpenMode); > if (!IncludeFile) > { > - fprintf (stderr, "Could not open include file %s\n", Pathname); > return (NULL); > } > > diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c > index f5ea992a..7534f6d7 100644 > --- a/src/acpica/source/components/events/evgpe.c > +++ b/src/acpica/source/components/events/evgpe.c > @@ -240,6 +240,14 @@ AcpiEvEnableGpe ( > ACPI_FUNCTION_TRACE (EvEnableGpe); > > > + /* Clear the GPE (of stale events) */ > + > + Status = AcpiHwClearGpe(GpeEventInfo); > + if (ACPI_FAILURE(Status)) > + { > + return_ACPI_STATUS(Status); > + } > + > /* Enable the requested GPE */ > > Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE); > diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c > index ff178d49..12772308 100644 > --- a/src/acpica/source/components/namespace/nsalloc.c > +++ b/src/acpica/source/components/namespace/nsalloc.c > @@ -232,6 +232,11 @@ AcpiNsDeleteNode ( > ACPI_FUNCTION_NAME (NsDeleteNode); > > > + if (!Node) > + { > + return_VOID; > + } > + > /* Detach an object if there is one */ > > AcpiNsDetachObject (Node); > diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h > index d3e4e7b5..be338bbe 100644 > --- a/src/acpica/source/include/acpixf.h > +++ b/src/acpica/source/include/acpixf.h > @@ -154,7 +154,7 @@ > > /* Current ACPICA subsystem version in YYYYMMDD format */ > > -#define ACPI_CA_VERSION 0x20190329 > +#define ACPI_CA_VERSION 0x20190405 > > #include "acconfig.h" > #include "actypes.h" > Acked-by: Alex Hung <alex.hung@canonical.com>
diff --git a/src/acpi/syntaxcheck/syntaxcheck.c b/src/acpi/syntaxcheck/syntaxcheck.c index 5d1ea112..d1eb0798 100644 --- a/src/acpi/syntaxcheck/syntaxcheck.c +++ b/src/acpi/syntaxcheck/syntaxcheck.c @@ -488,9 +488,9 @@ static int syntaxcheck_single_table( fwts_log_info(fw, "Checking ACPI table %s (#%d)", info->name, n); fwts_log_nl(fw); - if (iasl_stdout) { + if (iasl_stderr) { /* Scan error text from assembly */ - fwts_list_foreach(item, iasl_stdout) { + fwts_list_foreach(item, iasl_stderr) { int num; char ch; char *line = fwts_text_list_text(item); diff --git a/src/acpica/source/common/adisasm.c b/src/acpica/source/common/adisasm.c index 518468b7..c73208f6 100644 --- a/src/acpica/source/common/adisasm.c +++ b/src/acpica/source/common/adisasm.c @@ -579,7 +579,7 @@ AdDisassembleOneTable ( if (AslGbl_MapfileFlag) { fprintf (stderr, "%14s %s - %u bytes\n", - AslGbl_Files[ASL_FILE_MAP_OUTPUT].ShortDescription, + AslGbl_FileDescs[ASL_FILE_MAP_OUTPUT].ShortDescription, AslGbl_Files[ASL_FILE_MAP_OUTPUT].Filename, FlGetFileSize (ASL_FILE_MAP_OUTPUT)); } diff --git a/src/acpica/source/compiler/aslcodegen.c b/src/acpica/source/compiler/aslcodegen.c index 8edcb668..88e34824 100644 --- a/src/acpica/source/compiler/aslcodegen.c +++ b/src/acpica/source/compiler/aslcodegen.c @@ -174,11 +174,11 @@ CgWriteTableHeader ( ACPI_PARSE_OBJECT *Op); static void -CgCloseTable ( - void); +CgWriteNode ( + ACPI_PARSE_OBJECT *Op); static void -CgWriteNode ( +CgUpdateHeader ( ACPI_PARSE_OBJECT *Op); @@ -202,15 +202,12 @@ CgGenerateAmlOutput ( /* Generate the AML output file */ - FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); - AslGbl_SourceLine = 0; - AslGbl_NextError = AslGbl_ErrorLog; - - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, + ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY, CgAmlWriteWalk, NULL, NULL); DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER2); - CgCloseTable (); + CgUpdateHeader (AslGbl_CurrentDB); } @@ -708,38 +705,13 @@ CgUpdateHeader ( ACPI_OFFSET (ACPI_TABLE_HEADER, Checksum)); FlWriteFile (ASL_FILE_AML_OUTPUT, &Checksum, 1); -} - - -/******************************************************************************* - * - * FUNCTION: CgCloseTable - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Complete the ACPI table by calculating the checksum and - * re-writing each table header. This allows support for - * multiple definition blocks in a single source file. - * - ******************************************************************************/ - -static void -CgCloseTable ( - void) -{ - ACPI_PARSE_OBJECT *Op; - - /* Process all definition blocks */ - - Op = AslGbl_ParseTreeRoot->Asl.Child; - while (Op) - { - CgUpdateHeader (Op); - Op = Op->Asl.Next; - } + /* + * Seek to the end of the file. This is done to support multiple file + * compilation. Doing this simplifies other parts of the codebase because + * it eliminates the need to seek for a different starting place. + */ + FlSeekFile (ASL_FILE_AML_OUTPUT, Op->Asl.FinalAmlOffset + Length); } diff --git a/src/acpica/source/compiler/aslcompile.c b/src/acpica/source/compiler/aslcompile.c index c46b28da..845f15bc 100644 --- a/src/acpica/source/compiler/aslcompile.c +++ b/src/acpica/source/compiler/aslcompile.c @@ -178,6 +178,10 @@ static void CmDumpAllEvents ( void); +static void +CmFinishFiles( + BOOLEAN DeleteAmlFile); + /******************************************************************************* * @@ -191,13 +195,13 @@ CmDumpAllEvents ( * ******************************************************************************/ -int +ACPI_STATUS CmDoCompile ( void) { - ACPI_STATUS Status; UINT8 FullCompile; UINT8 Event; + ASL_GLOBAL_FILE_NODE *FileNode; FullCompile = UtBeginEvent ("*** Total Compile time ***"); @@ -221,7 +225,7 @@ CmDoCompile ( { UtEndEvent (Event); CmCleanupAndExit (); - return (0); + return (AE_OK); } } UtEndEvent (Event); @@ -239,6 +243,12 @@ CmDoCompile ( { fprintf (stderr, "Compiler aborting due to parser-detected syntax error(s)\n"); + + /* Flag this error in the FileNode for compilation summary */ + + FileNode = FlGetCurrentFileNode (); + FileNode->ParserErrorDetected = TRUE; + AslGbl_ParserErrorDetected = TRUE; LsDumpParseTree (); goto ErrorExit; } @@ -292,19 +302,35 @@ CmDoCompile ( 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 (AslGbl_OutputFilenamePrefix); - UtEndEvent (Event); - if (ACPI_FAILURE (Status)) - { - AePrintErrorLog (ASL_FILE_STDERR); - return (-1); - } + UtEndEvent (FullCompile); + return (AE_OK); + +ErrorExit: + UtEndEvent (FullCompile); + return (AE_ERROR); +} + + +/******************************************************************************* + * + * FUNCTION: CmDoAslMiddleAndBackEnd + * + * PARAMETERS: None + * + * RETURN: Status of middle-end and back-end + * + * DESCRIPTION: Perform compiler middle-end (type checking and semantic + * analysis) and back-end (code generation) + * + ******************************************************************************/ + +int +CmDoAslMiddleAndBackEnd ( + void) +{ + UINT8 Event; + ACPI_STATUS Status; + /* Interpret and generate all compile-time constants */ @@ -351,7 +377,6 @@ CmDoCompile ( AePrintErrorLog (ASL_FILE_STDOUT); UtDisplaySummary (ASL_FILE_STDOUT); } - UtEndEvent (FullCompile); return (0); } @@ -367,7 +392,7 @@ CmDoCompile ( UtEndEvent (Event); if (ACPI_FAILURE (Status)) { - goto ErrorExit; + return (-1); } /* Namespace cross-reference */ @@ -378,7 +403,7 @@ CmDoCompile ( Status = XfCrossReferenceNamespace (); if (ACPI_FAILURE (Status)) { - goto ErrorExit; + return (-1); } /* Namespace - Check for non-referenced objects */ @@ -486,22 +511,47 @@ CmDoCompile ( Event = UtBeginEvent ("Generate AML code and write output files"); DbgPrint (ASL_DEBUG_OUTPUT, "Writing AML byte code\n\n"); - CgGenerateAmlOutput (); + + AslGbl_CurrentDB = AslGbl_ParseTreeRoot->Asl.Child; + + while (AslGbl_CurrentDB) + { + switch (FlSwitchFileSet(AslGbl_CurrentDB->Asl.Filename)) + { + case SWITCH_TO_DIFFERENT_FILE: + /* + * Reset these parameters when definition blocks belong in + * different files. If they belong in the same file, there is + * no need to reset these parameters + */ + FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0); + AslGbl_SourceLine = 0; + AslGbl_NextError = AslGbl_ErrorLog; + + /* fall-through */ + + case SWITCH_TO_SAME_FILE: + + CgGenerateAmlOutput (); + CmDoOutputFiles (); + AslGbl_CurrentDB = AslGbl_CurrentDB->Asl.Next; + + break; + + default: /* FILE_NOT_FOUND */ + + /* The requested file could not be found. Get out of here */ + + AslGbl_CurrentDB = NULL; + break; + } + } UtEndEvent (Event); Event = UtBeginEvent ("Write optional output files"); - CmDoOutputFiles (); UtEndEvent (Event); - UtEndEvent (FullCompile); - AslCheckExpectedExceptions (); - CmCleanupAndExit (); return (0); - -ErrorExit: - UtEndEvent (FullCompile); - CmCleanupAndExit (); - return (-1); } @@ -808,10 +858,14 @@ void CmCleanupAndExit ( void) { - UINT32 i; BOOLEAN DeleteAmlFile = FALSE; + ASL_GLOBAL_FILE_NODE *CurrentFileNode = AslGbl_FilesList; + /* Check if any errors occurred during compile */ + + (void) AslCheckForErrorExit (); + AePrintErrorLog (ASL_FILE_STDERR); if (AslGbl_DebugFlag) { @@ -865,15 +919,63 @@ CmCleanupAndExit ( * We will delete the AML file if there are errors and the * force AML output option has not been used. */ - if ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && + if (AslGbl_ParserErrorDetected || ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && (!AslGbl_IgnoreErrors) && - AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle)) { DeleteAmlFile = TRUE; } /* Close all open files */ + while (CurrentFileNode) + { + switch (FlSwitchFileSet (CurrentFileNode->Files[ASL_FILE_INPUT].Filename)) + { + case SWITCH_TO_SAME_FILE: + case SWITCH_TO_DIFFERENT_FILE: + + CmFinishFiles (DeleteAmlFile); + CurrentFileNode = CurrentFileNode->Next; + break; + + case FILE_NOT_FOUND: + default: + + CurrentFileNode = NULL; + break; + } + } + + /* Final cleanup after compiling one file */ + + if (!AslGbl_DoAslConversion) + { + UtDeleteLocalCaches (); + } +} + + +/******************************************************************************* + * + * FUNCTION: CmFinishFiles + * + * PARAMETERS: DeleteAmlFile + * + * RETURN: None. + * + * DESCRIPTION: Close all open files, delete AML files depending on the + * function parameter is true. + * + ******************************************************************************/ + +static void +CmFinishFiles( + BOOLEAN DeleteAmlFile) +{ + UINT32 i; + + /* * Take care with the preprocessor file (.pre), it might be the same * as the "input" file, depending on where the compiler has terminated @@ -890,7 +992,15 @@ CmCleanupAndExit ( for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++) { - FlCloseFile (i); + /* + * Some files such as debug output files could be pointing to + * stderr or stdout. Leave these alone. + */ + if (AslGbl_Files[i].Handle != stderr && + AslGbl_Files[i].Handle != stdout) + { + FlCloseFile (i); + } } /* Delete AML file if there are errors */ @@ -923,11 +1033,4 @@ CmCleanupAndExit ( { FlDeleteFile (ASL_FILE_SOURCE_OUTPUT); } - - /* Final cleanup after compiling one file */ - - if (!AslGbl_DoAslConversion) - { - UtDeleteLocalCaches (); - } } diff --git a/src/acpica/source/compiler/aslcompiler.h b/src/acpica/source/compiler/aslcompiler.h index efcee77b..ad0e73f3 100644 --- a/src/acpica/source/compiler/aslcompiler.h +++ b/src/acpica/source/compiler/aslcompiler.h @@ -254,10 +254,14 @@ void AslCompilerFileHeader ( UINT32 FileId); -int +ACPI_STATUS CmDoCompile ( void); +int +CmDoAslMiddleAndBackEnd ( + void); + void CmDoOutputFiles ( void); @@ -266,6 +270,10 @@ void CmCleanupAndExit ( void); +ACPI_STATUS +AslDoDisassembly ( + void); + /* * aslallocate - memory allocation @@ -875,9 +883,10 @@ ExDoExternal ( /* Values for "Visitation" parameter above */ -#define ASL_WALK_VISIT_DOWNWARD 0x01 -#define ASL_WALK_VISIT_UPWARD 0x02 -#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) +#define ASL_WALK_VISIT_DOWNWARD 0x01 +#define ASL_WALK_VISIT_UPWARD 0x02 +#define ASL_WALK_VISIT_DB_SEPARATELY 0x04 +#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD) /* @@ -1034,6 +1043,11 @@ FlSeekFile ( UINT32 FileId, long Offset); +void +FlSeekFileSet ( + UINT32 FileId, + long Offset); + void FlCloseFile ( UINT32 FileId); @@ -1068,6 +1082,34 @@ ACPI_STATUS FlOpenMiscOutputFiles ( char *InputFilename); +ACPI_STATUS +FlInitOneFile ( + char *InputFilename); + +ASL_FILE_SWITCH_STATUS +FlSwitchFileSet ( + char *InputFilename); + +FILE * +FlGetFileHandle ( + UINT32 OutFileId, + UINT32 InFileId, + char *Filename); + +ASL_GLOBAL_FILE_NODE * +FlGetFileNode ( + UINT32 FileId, + char *Filename); + +ASL_GLOBAL_FILE_NODE * +FlGetCurrentFileNode ( + void); + +BOOLEAN +FlInputFileExists ( + char *InputFilename); + + /* * aslhwmap - hardware map summary */ @@ -1083,7 +1125,6 @@ ACPI_STATUS LdLoadNamespace ( ACPI_PARSE_OBJECT *RootOp); - /* * asllookup - namespace lookup functions */ @@ -1091,6 +1132,7 @@ void LkFindUnreferencedObjects ( void); + /* * aslhelp - help screens */ @@ -1118,6 +1160,7 @@ void NsSetupNamespaceListing ( void *Handle); + /* * asloptions - command line processing */ @@ -1126,6 +1169,7 @@ AslCommandLine ( int argc, char **argv); + /* * aslxref - namespace cross reference */ @@ -1220,6 +1264,11 @@ void UtDisplaySummary ( UINT32 FileId); +void +UtDisplayOneSummary ( + UINT32 FileId, + BOOLEAN DisplayErrorSummary); + void UtConvertByteToHex ( UINT8 RawByte, @@ -1271,6 +1320,7 @@ AuConvertUuidToString ( char *UuIdBuffer, char *OutString); + /* * aslresource - Resource template generation utilities */ @@ -1478,6 +1528,7 @@ ASL_RESOURCE_NODE * RsDoPinGroupConfigDescriptor ( ASL_RESOURCE_INFO *Info); + /* * aslrestype2d - DWord address descriptors */ diff --git a/src/acpica/source/compiler/asldefine.h b/src/acpica/source/compiler/asldefine.h index 8089d0b9..cffb0af1 100644 --- a/src/acpica/source/compiler/asldefine.h +++ b/src/acpica/source/compiler/asldefine.h @@ -298,5 +298,4 @@ #define COMMENT_CAPTURE_ON AslGbl_CommentState.CaptureComments = TRUE; #define COMMENT_CAPTURE_OFF AslGbl_CommentState.CaptureComments = FALSE; - #endif /* ASLDEFINE.H */ diff --git a/src/acpica/source/compiler/aslerror.c b/src/acpica/source/compiler/aslerror.c index a2f9fcef..db6d871d 100644 --- a/src/acpica/source/compiler/aslerror.c +++ b/src/acpica/source/compiler/aslerror.c @@ -474,10 +474,12 @@ AePrintErrorSourceLine ( * Use the merged header/source file if present, otherwise * use input file */ - SourceFile = AslGbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle; + SourceFile = FlGetFileHandle (ASL_FILE_SOURCE_OUTPUT, + ASL_FILE_SOURCE_OUTPUT, Enode->SourceFilename); if (!SourceFile) { - SourceFile = AslGbl_Files[ASL_FILE_INPUT].Handle; + SourceFile = FlGetFileHandle (ASL_FILE_INPUT, + ASL_FILE_INPUT, Enode->Filename); } if (SourceFile) @@ -818,6 +820,7 @@ static void AslInitEnode ( ASL_ERROR_MSG *SubError) { ASL_ERROR_MSG *Enode; + ASL_GLOBAL_FILE_NODE *FileNode; *InputEnode = UtLocalCalloc (sizeof (ASL_ERROR_MSG)); @@ -859,6 +862,23 @@ static void AslInitEnode ( { Enode->FilenameLength = 6; } + + FileNode = FlGetCurrentFileNode (); + if (!FileNode) + { + return; + } + + if (!FlInputFileExists (Filename)) + { + /* + * This means that this file is an include file. Record the .src + * file as the error message source because this file is not in + * the global file list. + */ + Enode->SourceFilename = + FileNode->Files[ASL_FILE_SOURCE_OUTPUT].Filename; + } } } @@ -992,7 +1012,7 @@ AslLogNewError ( } AslGbl_ExceptionCount[ModifiedLevel]++; - if (AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) + if (!AslGbl_IgnoreErrors && AslGbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT) { printf ("\nMaximum error count (%u) exceeded\n", ASL_MAX_ERROR_COUNT); diff --git a/src/acpica/source/compiler/aslfileio.c b/src/acpica/source/compiler/aslfileio.c index 3243ab51..3db7b533 100644 --- a/src/acpica/source/compiler/aslfileio.c +++ b/src/acpica/source/compiler/aslfileio.c @@ -177,7 +177,7 @@ FlFileError ( { sprintf (AslGbl_MsgBuffer, "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename, - AslGbl_Files[FileId].Description, strerror (errno)); + AslGbl_FileDescs[FileId].Description, strerror (errno)); AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer); } @@ -500,7 +500,7 @@ FlDeleteFile ( if (remove (Info->Filename)) { printf ("%s (%s file) ", - Info->Filename, Info->Description); + Info->Filename, AslGbl_FileDescs[FileId].Description); perror ("Could not delete"); } diff --git a/src/acpica/source/compiler/aslfiles.c b/src/acpica/source/compiler/aslfiles.c index 0120af02..80a74e81 100644 --- a/src/acpica/source/compiler/aslfiles.c +++ b/src/acpica/source/compiler/aslfiles.c @@ -170,6 +170,257 @@ FlParseInputPathname ( #endif +/******************************************************************************* + * + * FUNCTION: FlInitOneFile + * + * PARAMETERS: InputFilename - The user-specified ASL source file to be + * compiled + * + * RETURN: Status + * + * DESCRIPTION: Initialize global file structure for one input file. This file + * structure contains references to input, output, debugging, and + * other miscellaneous files that are associated for a single + * input ASL file. + * + ******************************************************************************/ + +ACPI_STATUS +FlInitOneFile ( + char *InputFilename) +{ + UINT32 i; + ASL_GLOBAL_FILE_NODE *NewFileNode; + + + if (FlInputFileExists (InputFilename)) + { + AslError (ASL_ERROR, ASL_MSG_DUPLICATE_INPUT_FILE, NULL, InputFilename); + return (AE_ALREADY_EXISTS); + } + + NewFileNode = ACPI_CAST_PTR (ASL_GLOBAL_FILE_NODE, + UtLocalCacheCalloc (sizeof (ASL_GLOBAL_FILE_NODE))); + + if (!NewFileNode) + { + AslError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, NULL, NULL); + return (AE_NO_MEMORY); + } + + NewFileNode->ParserErrorDetected = FALSE; + NewFileNode->Next = AslGbl_FilesList; + + AslGbl_FilesList = NewFileNode; + AslGbl_Files = NewFileNode->Files; + + for (i = 0; i < ASL_NUM_FILES; i++) + { + AslGbl_Files[i].Handle = NULL; + AslGbl_Files[i].Filename = NULL; + } + + AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; + AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; + + if (AslGbl_VerboseErrors) + { + AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; + } + else + { + AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; + } + + AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; + return (AE_OK); +} + + +/******************************************************************************* + * + * FUNCTION: FlInputFileExists + * + * PARAMETERS: Filename - File name to be searched + * + * RETURN: Status + * + * DESCRIPTION: Returns true if the file name already exists. + * + ******************************************************************************/ + +BOOLEAN +FlInputFileExists ( + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + while (Current) + { + if (!strcmp (Filename, Current->Files[ASL_FILE_INPUT].Filename)) + { + return (TRUE); + } + + Current = Current->Next; + } + + return (FALSE); +} + + +/******************************************************************************* + * + * FUNCTION: FlSwitchFileSet + * + * PARAMETERS: Op - Parse node for the LINE asl statement + * + * RETURN: None. + * + * DESCRIPTION: Set the current line number + * + ******************************************************************************/ + +ASL_FILE_SWITCH_STATUS +FlSwitchFileSet ( + char *InputFilename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + char *PrevFilename = Current->Files[ASL_FILE_INPUT].Filename; + + + while (Current) + { + if (!strcmp(Current->Files[ASL_FILE_INPUT].Filename, InputFilename)) + { + AslGbl_Files = Current->Files; + AslGbl_TableSignature = Current->TableSignature; + AslGbl_TableId = Current->TableId; + + if (!strcmp (InputFilename, PrevFilename)) + { + return (SWITCH_TO_SAME_FILE); + } + else + { + return (SWITCH_TO_DIFFERENT_FILE); + } + } + + Current = Current->Next; + } + + return (FILE_NOT_FOUND); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetFileHandle + * + * PARAMETERS: OutFileId - denotes file type of output handle + * InFileId - denotes file type of the input Filename + * Filename + * + * RETURN: File handle + * + * DESCRIPTION: Get the file handle for a particular filename/FileId. This + * function also allows the caller to specify the file Id of the + * desired type. + * + ******************************************************************************/ + +FILE * +FlGetFileHandle ( + UINT32 OutFileId, + UINT32 InFileId, + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + if (!Filename) + { + return (NULL); + } + + while (Current) + { + if (!strcmp (Current->Files[InFileId].Filename, Filename)) + { + return (Current->Files[OutFileId].Handle); + } + + Current = Current->Next; + } + + return (NULL); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetFileNode + * + * PARAMETERS: FileId - File type (ID) of the input Filename + * Filename - File to search for + * + * RETURN: A global file node + * + * DESCRIPTION: Get the file node for a particular filename/FileId. + * + ******************************************************************************/ + +ASL_GLOBAL_FILE_NODE * +FlGetFileNode ( + UINT32 FileId, + char *Filename) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + if (!Filename) + { + return (NULL); + } + + while (Current) + { + if (!strcmp (Current->Files[FileId].Filename, Filename)) + { + return (Current); + } + + Current = Current->Next; + } + + return (NULL); +} + + +/******************************************************************************* + * + * FUNCTION: FlGetCurrentFileNode + * + * PARAMETERS: None + * + * RETURN: Global file node + * + * DESCRIPTION: Get the current input file node + * + ******************************************************************************/ + +ASL_GLOBAL_FILE_NODE * +FlGetCurrentFileNode ( + void) +{ + return (FlGetFileNode ( + ASL_FILE_INPUT,AslGbl_Files[ASL_FILE_INPUT].Filename)); +} + + /******************************************************************************* * * FUNCTION: FlSetLineNumber @@ -426,8 +677,6 @@ FlOpenIncludeWithPrefix ( IncludeFile = fopen (Pathname, "r"); if (!IncludeFile) { - fprintf (stderr, "Could not open include file %s\n", Pathname); - ACPI_FREE (Pathname); return (NULL); } diff --git a/src/acpica/source/compiler/aslglobal.h b/src/acpica/source/compiler/aslglobal.h index bc7358cd..213c5408 100644 --- a/src/acpica/source/compiler/aslglobal.h +++ b/src/acpica/source/compiler/aslglobal.h @@ -172,28 +172,27 @@ UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0}; /* Table below must match ASL_FILE_TYPES in asltypes.h */ - -ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES] = +ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES] = { - {NULL, NULL, "stdout: ", "Standard Output"}, - {NULL, NULL, "stderr: ", "Standard Error"}, - {NULL, NULL, "Table Input: ", "Source Input"}, - {NULL, NULL, "Binary Output:", "AML Output"}, - {NULL, NULL, "Source Output:", "Source Output"}, - {NULL, NULL, "Preprocessor: ", "Preprocessor Output"}, - {NULL, NULL, "Preprocessor: ", "Preprocessor Temp File"}, - {NULL, NULL, "Listing File: ", "Listing Output"}, - {NULL, NULL, "Hex Dump: ", "Hex Table Output"}, - {NULL, NULL, "Namespace: ", "Namespace Output"}, - {NULL, NULL, "Debug File: ", "Debug Output"}, - {NULL, NULL, "ASM Source: ", "Assembly Code Output"}, - {NULL, NULL, "C Source: ", "C Code Output"}, - {NULL, NULL, "ASM Include: ", "Assembly Header Output"}, - {NULL, NULL, "C Include: ", "C Header Output"}, - {NULL, NULL, "Offset Table: ", "C Offset Table Output"}, - {NULL, NULL, "Device Map: ", "Device Map Output"}, - {NULL, NULL, "Cross Ref: ", "Cross-reference Output"}, - {NULL, NULL, "Converter db :", "Converter debug Output"} + {"stdout: ", "Standard Output"}, + {"stderr: ", "Standard Error"}, + {"Table Input: ", "Source Input"}, + {"Binary Output:", "AML Output"}, + {"Source Output:", "Source Output"}, + {"Preprocessor: ", "Preprocessor Output"}, + {"Preprocessor: ", "Preprocessor Temp File"}, + {"Listing File: ", "Listing Output"}, + {"Hex Dump: ", "Hex Table Output"}, + {"Namespace: ", "Namespace Output"}, + {"Debug File: ", "Debug Output"}, + {"ASM Source: ", "Assembly Code Output"}, + {"C Source: ", "C Code Output"}, + {"ASM Include: ", "Assembly Header Output"}, + {"C Include: ", "C Header Output"}, + {"Offset Table: ", "C Offset Table Output"}, + {"Device Map: ", "Device Map Output"}, + {"Cross Ref: ", "Cross-reference Output"}, + {"Converter dbg:", "Converter debug Output"} }; /* Table below must match the defines with the same names in actypes.h */ @@ -225,8 +224,8 @@ const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS] = }; #else +extern ASL_FILE_DESC AslGbl_FileDescs [ASL_NUM_FILES]; extern UINT32 AslGbl_ExceptionCount[ASL_NUM_REPORT_LEVELS]; -extern ASL_FILE_INFO AslGbl_Files [ASL_NUM_FILES]; extern const char *AslGbl_OpFlagNames[ACPI_NUM_OP_FLAGS]; #endif @@ -269,7 +268,6 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentColumn, 0); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineNumber, 1); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_LogicalLineNumber, 1); ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_CurrentLineOffset, 0); -ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_OriginalInputFileSize, 0); ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_SyntaxError, 0); /* Exception reporting */ @@ -300,6 +298,7 @@ ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ListingFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_IgnoreErrors, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_SourceOutputFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParseOnlyFlag, FALSE); +ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_ParserErrorDetected, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_CompileTimesFlag, FALSE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_FoldConstants, TRUE); ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (AslGbl_VerboseErrors, TRUE); @@ -385,6 +384,7 @@ ASL_EXTERN UINT32 ASL_INIT_GLOBAL (AslGbl_SourceLine, 0); ASL_EXTERN UINT8 ASL_INIT_GLOBAL (AslGbl_FileType, 0); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_Signature, NULL); ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ParseTreeRoot, NULL); +ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_CurrentDB, NULL); ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*AslGbl_ExternalsListHead, NULL); ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*AslGbl_ListingNode, NULL); ASL_EXTERN ACPI_PARSE_OBJECT *AslGbl_FirstLevelInsertionNode; @@ -403,6 +403,8 @@ ASL_EXTERN UINT16 ASL_INIT_GLOBAL (AslGbl_PruneType, 0); ASL_EXTERN ASL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_IncludeFileStack, NULL); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableSignature, "NO_SIG"); ASL_EXTERN char ASL_INIT_GLOBAL (*AslGbl_TableId, "NO_ID"); +ASL_EXTERN ASL_FILE_INFO ASL_INIT_GLOBAL (*AslGbl_Files, NULL); +ASL_EXTERN ASL_GLOBAL_FILE_NODE ASL_INIT_GLOBAL (*AslGbl_FilesList, NULL); /* Specific to the -q option */ diff --git a/src/acpica/source/compiler/asllisting.c b/src/acpica/source/compiler/asllisting.c index df3b7587..7bc118bc 100644 --- a/src/acpica/source/compiler/asllisting.c +++ b/src/acpica/source/compiler/asllisting.c @@ -254,6 +254,7 @@ static void LsGenerateListing ( UINT32 FileId) { + UINT32 WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY; /* Start at the beginning of both the source and AML files */ @@ -271,7 +272,7 @@ LsGenerateListing ( LsDoOffsetTableHeader (FileId); - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); LsDoOffsetTableFooter (FileId); return; @@ -279,7 +280,7 @@ LsGenerateListing ( /* Process all parse nodes */ - TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD, + TrWalkParseTree (AslGbl_CurrentDB, WalkMode, LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId)); /* Final processing */ @@ -847,7 +848,7 @@ LsFinishSourceListing ( FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n"); AePrintErrorLog (FileId); FlPrintFile (FileId, "\n"); - UtDisplaySummary (FileId); + UtDisplayOneSummary (FileId, TRUE); FlPrintFile (FileId, "\n"); } } diff --git a/src/acpica/source/compiler/aslload.c b/src/acpica/source/compiler/aslload.c index dfbdf7ce..a055bab0 100644 --- a/src/acpica/source/compiler/aslload.c +++ b/src/acpica/source/compiler/aslload.c @@ -324,6 +324,7 @@ LdLoadFieldElements ( (Node->Flags & ANOBJ_IS_EXTERNAL)) { Node->Type = (UINT8) ACPI_TYPE_LOCAL_REGION_FIELD; + Node->Flags &= ~ANOBJ_IS_EXTERNAL; } else { diff --git a/src/acpica/source/compiler/aslmain.c b/src/acpica/source/compiler/aslmain.c index 26f4a0c4..81f634e6 100644 --- a/src/acpica/source/compiler/aslmain.c +++ b/src/acpica/source/compiler/aslmain.c @@ -255,6 +255,14 @@ main ( } } + /* ACPICA subsystem initialization */ + + Status = AdInitialize (); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + /* Process each pathname/filename in the list, with possible wildcards */ @@ -280,17 +288,71 @@ main ( Index2++; } + /* + * At this point, compilation of a data table or disassembly is complete. + */ + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_DATA || AcpiGbl_DisasmFlag) + { + goto CleanupAndExit; + } + + CmDoAslMiddleAndBackEnd (); + + /* + * At this point, all semantic analysis has been completed. Check + * expected error messages before cleanup or conversion. + */ + AslCheckExpectedExceptions (); + + /* ASL-to-ASL+ conversion - Perform immediate disassembly */ + + if (AslGbl_DoAslConversion) + { + /* re-initialize ACPICA subsystem for disassembler */ + + Status = AdInitialize (); + if (ACPI_FAILURE (Status)) + { + return (Status); + } + + /* + * New input file is the output AML file from above. + * New output is from the input ASL file from above. + */ + AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; + AslGbl_Files[ASL_FILE_INPUT].Filename = + AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; + + CvDbgPrint ("Output filename: %s\n", AslGbl_OutputFilenamePrefix); + fprintf (stderr, "\n"); + + AcpiGbl_DisasmFlag = TRUE; + AslDoDisassembly (); + AcpiGbl_DisasmFlag = FALSE; + + /* delete the AML file. This AML file should never be utilized by AML interpreters. */ + + FlDeleteFile (ASL_FILE_AML_OUTPUT); + } + + CleanupAndExit: UtFreeLineBuffers (); AslParserCleanup (); + AcpiDmClearExternalFileList(); + (void) AcpiTerminate (); + + /* CmCleanupAndExit is intended for the compiler only */ - if (AcpiGbl_ExternalFileList) + if (!AcpiGbl_DisasmFlag) { - AcpiDmClearExternalFileList(); + CmCleanupAndExit (); } + return (ReturnStatus); } @@ -372,9 +434,6 @@ static void AslInitialize ( void) { - UINT32 i; - - AcpiGbl_DmOpt_Verbose = FALSE; /* Default integer width is 32 bits */ @@ -382,16 +441,4 @@ AslInitialize ( AcpiGbl_IntegerBitWidth = 32; AcpiGbl_IntegerNybbleWidth = 8; AcpiGbl_IntegerByteWidth = 4; - - for (i = 0; i < ASL_NUM_FILES; i++) - { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; - - AslGbl_Files[ASL_FILE_STDERR].Handle = stderr; - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; } diff --git a/src/acpica/source/compiler/aslmessages.c b/src/acpica/source/compiler/aslmessages.c index 0f31c655..d7e2eb43 100644 --- a/src/acpica/source/compiler/aslmessages.c +++ b/src/acpica/source/compiler/aslmessages.c @@ -353,8 +353,8 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_NULL_RESOURCE_TEMPLATE */ "Empty Resource Template (END_TAG only)", /* ASL_MSG_FOUND_HERE */ "Original name creation/declaration below: ", /* ASL_MSG_ILLEGAL_RECURSION */ "Illegal recursive call to method that creates named objects", -/* ASL_MSG_PLACE_HOLDER_00 */ "", /* TODO: fill in this slot with a new error message */ -/* ASL_MSG_PLACE_HOLDER_01 */ "", /* TODO: fill in this slot with a new error message */ +/* ASL_MSG_DUPLICATE_INPUT_FILE */ "Duplicate input files detected:", +/* ASL_MSG_WARNING_AS_ERROR */ "Warnings detected during compilation", /* ASL_MSG_OEM_TABLE_ID */ "Invalid OEM Table ID", /* ASL_MSG_OEM_ID */ "Invalid OEM ID", /* ASL_MSG_UNLOAD */ "Unload is not supported by all operating systems", @@ -363,7 +363,8 @@ const char *AslCompilerMsgs [] = /* ASL_MSG_PREFIX_NOT_EXIST */ "One or more prefix Scopes do not exist", /* ASL_MSG_NAMEPATH_NOT_EXIST */ "One or more objects within the Pathname do not exist", /* ASL_MSG_REGION_LENGTH */ "Operation Region declared with zero length", -/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed" +/* ASL_MSG_TEMPORARY_OBJECT */ "Object is created temporarily in another method and cannot be accessed", +/* ASL_MSG_UNDEFINED_EXTERNAL */ "Named object was declared external but the actual definition does not exist" }; /* Table compiler */ diff --git a/src/acpica/source/compiler/aslmessages.h b/src/acpica/source/compiler/aslmessages.h index 817e192e..a7cd1f31 100644 --- a/src/acpica/source/compiler/aslmessages.h +++ b/src/acpica/source/compiler/aslmessages.h @@ -355,8 +355,8 @@ typedef enum ASL_MSG_NULL_RESOURCE_TEMPLATE, ASL_MSG_FOUND_HERE, ASL_MSG_ILLEGAL_RECURSION, - ASL_MSG_PLACE_HOLDER_00, - ASL_MSG_PLACE_HOLDER_01, + ASL_MSG_DUPLICATE_INPUT_FILE, + ASL_MSG_WARNING_AS_ERROR, ASL_MSG_OEM_TABLE_ID, ASL_MSG_OEM_ID, ASL_MSG_UNLOAD, @@ -366,6 +366,7 @@ typedef enum ASL_MSG_NAMEPATH_NOT_EXIST, ASL_MSG_REGION_LENGTH, ASL_MSG_TEMPORARY_OBJECT, + ASL_MSG_UNDEFINED_EXTERNAL, /* These messages are used by the Data Table compiler only */ diff --git a/src/acpica/source/compiler/asloperands.c b/src/acpica/source/compiler/asloperands.c index 67e16fd5..4f4b636d 100644 --- a/src/acpica/source/compiler/asloperands.c +++ b/src/acpica/source/compiler/asloperands.c @@ -1045,6 +1045,7 @@ OpnDoDefinitionBlock ( ACPI_SIZE Length; UINT32 i; char *Filename; + ACPI_STATUS Status; /* @@ -1062,6 +1063,12 @@ OpnDoDefinitionBlock ( *Child->Asl.Value.Buffer && (AslGbl_UseDefaultAmlFilename)) { + /* + * The walk may traverse multiple definition blocks. Switch files + * to ensure that the correct files are manipulated. + */ + FlSwitchFileSet (Op->Asl.Filename); + /* * We will use the AML filename that is embedded in the source file * for the output filename. @@ -1076,6 +1083,22 @@ OpnDoDefinitionBlock ( AslGbl_OutputFilenamePrefix = Filename; UtConvertBackslashes (AslGbl_OutputFilenamePrefix); + + /* + * Use the definition block file parameter instead of the input + * filename. Since all files were opened previously, remove the + * existing file and open a new file with the name of this + * definiton block parameter. Since AML code generation has yet + * to happen, the previous file can be removed without any impacts. + */ + FlCloseFile (ASL_FILE_AML_OUTPUT); + FlDeleteFile (ASL_FILE_AML_OUTPUT); + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); + if (ACPI_FAILURE (Status)) + { + AslError (ASL_ERROR, ASL_MSG_OUTPUT_FILE_OPEN, NULL, NULL); + return; + } } Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; @@ -1086,6 +1109,7 @@ OpnDoDefinitionBlock ( Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; if (Child->Asl.Value.String) { + AslGbl_FilesList->TableSignature = Child->Asl.Value.String; AslGbl_TableSignature = Child->Asl.Value.String; if (strlen (AslGbl_TableSignature) != ACPI_NAMESEG_SIZE) { @@ -1138,6 +1162,7 @@ OpnDoDefinitionBlock ( AslGbl_TableId = UtLocalCacheCalloc (Length + 1); strcpy (AslGbl_TableId, Child->Asl.Value.String); + AslGbl_FilesList->TableId = AslGbl_TableId; /* * Convert anything non-alphanumeric to an underscore. This diff --git a/src/acpica/source/compiler/asloptions.c b/src/acpica/source/compiler/asloptions.c index dc0b9079..dc00e1d2 100644 --- a/src/acpica/source/compiler/asloptions.c +++ b/src/acpica/source/compiler/asloptions.c @@ -896,7 +896,6 @@ AslDoOptions ( */ AslGbl_VerboseErrors = FALSE; AslGbl_DoSignon = FALSE; - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; break; case 'o': diff --git a/src/acpica/source/compiler/aslstartup.c b/src/acpica/source/compiler/aslstartup.c index c0f14c80..aee5ad60 100644 --- a/src/acpica/source/compiler/aslstartup.c +++ b/src/acpica/source/compiler/aslstartup.c @@ -165,10 +165,6 @@ static UINT8 AslDetectSourceFileType ( ASL_FILE_INFO *Info); -static ACPI_STATUS -AslDoDisassembly ( - void); - /* Globals */ @@ -227,12 +223,6 @@ AslInitializeGlobals ( AslGbl_ExceptionCount[i] = 0; } - for (i = ASL_FILE_INPUT; i <= ASL_MAX_FILE_TYPE; i++) - { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - if (AcpiGbl_CaptureComments) { AslGbl_CommentState.SpacesBefore = 0; @@ -343,25 +333,19 @@ Cleanup: * RETURN: Status * * DESCRIPTION: Initiate AML file disassembly. Uses ACPICA subsystem to build - * namespace. + * namespace. This function assumes that the ACPI subsystem has + * been initialized. The caller of the initialization will also + * terminate the ACPI subsystem. * ******************************************************************************/ -static ACPI_STATUS +ACPI_STATUS AslDoDisassembly ( void) { ACPI_STATUS Status; - /* ACPICA subsystem initialization */ - - Status = AdInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - Status = AcpiAllocateRootTable (4); if (ACPI_FAILURE (Status)) { @@ -370,11 +354,6 @@ AslDoDisassembly ( return (Status); } - /* Handle additional output files for disassembler */ - - AslGbl_FileType = ASL_INPUT_TYPE_BINARY_ACPI_TABLE; - Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); - /* This is where the disassembly happens */ AcpiGbl_DmOpt_Disasm = TRUE; @@ -390,10 +369,9 @@ AslDoDisassembly ( AcpiDmUnresolvedWarning (0); - /* Shutdown compiler and ACPICA subsystem */ + /* Clear Error log */ AeClearErrorLog (); - (void) AcpiTerminate (); /* * AslGbl_Files[ASL_FILE_INPUT].Filename was replaced with the @@ -406,11 +384,6 @@ AslDoDisassembly ( return (AE_CTRL_CONTINUE); } - /* No need to free the filename string */ - - AslGbl_Files[ASL_FILE_INPUT].Filename = NULL; - - UtDeleteLocalCaches (); return (AE_OK); } @@ -432,6 +405,8 @@ AslDoOneFile ( char *Filename) { ACPI_STATUS Status; + UINT8 Event; + ASL_GLOBAL_FILE_NODE *FileNode; /* Re-initialize "some" compiler/preprocessor globals */ @@ -450,6 +425,18 @@ AslDoOneFile ( return (Status); } + /* + * There was an input file detected at this point. Each input ASL file is + * associated with one global file node consisting of the input file and + * all output files associated with it. This is useful when compiling + * multiple files in one command. + */ + Status = FlInitOneFile(Filename); + if (ACPI_FAILURE (Status)) + { + return (AE_ERROR); + } + /* Take a copy of the input filename, convert any backslashes */ AslGbl_Files[ASL_FILE_INPUT].Filename = @@ -458,18 +445,6 @@ AslDoOneFile ( strcpy (AslGbl_Files[ASL_FILE_INPUT].Filename, Filename); UtConvertBackslashes (AslGbl_Files[ASL_FILE_INPUT].Filename); - /* - * AML Disassembly (Optional) - */ - if (AcpiGbl_DisasmFlag) - { - Status = AslDoDisassembly (); - if (Status != AE_CTRL_CONTINUE) - { - return (Status); - } - } - /* * Open the input file. Here, this should be an ASCII source file, * either an ASL file or a Data Table file @@ -481,7 +456,13 @@ AslDoOneFile ( return (AE_ERROR); } - AslGbl_OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); + FileNode = FlGetCurrentFileNode(); + if (!FileNode) + { + return (AE_ERROR); + } + + FileNode->OriginalInputFileSize = FlGetFileSize (ASL_FILE_INPUT); /* Determine input file type */ @@ -500,6 +481,22 @@ AslDoOneFile ( AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; } + /* + * Open the output file. Note: by default, the name of this file comes from + * the table descriptor within the input file. + */ + if (AslGbl_FileType == ASL_INPUT_TYPE_ASCII_ASL) + { + Event = UtBeginEvent ("Open AML output file"); + Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); + UtEndEvent (Event); + if (ACPI_FAILURE (Status)) + { + AePrintErrorLog (ASL_FILE_STDERR); + return (AE_ERROR); + } + } + /* Open the optional output files (listings, etc.) */ Status = FlOpenMiscOutputFiles (AslGbl_OutputFilenamePrefix); @@ -550,20 +547,7 @@ AslDoOneFile ( */ case ASL_INPUT_TYPE_ASCII_ASL: - /* ACPICA subsystem initialization */ - - Status = AdInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - (void) CmDoCompile (); - (void) AcpiTerminate (); - - /* Check if any errors occurred during compile */ - - Status = AslCheckForErrorExit (); + Status = CmDoCompile (); if (ACPI_FAILURE (Status)) { return (Status); @@ -574,27 +558,11 @@ AslDoOneFile ( AeClearErrorLog (); PrTerminatePreprocessor (); - /* ASL-to-ASL+ conversion - Perform immediate disassembly */ - - if (AslGbl_DoAslConversion) - { - /* - * New input file is the output AML file from above. - * New output is from the input ASL file from above. - */ - AslGbl_OutputFilenamePrefix = AslGbl_Files[ASL_FILE_INPUT].Filename; - CvDbgPrint ("OUTPUTFILENAME: %s\n", AslGbl_OutputFilenamePrefix); - AslGbl_Files[ASL_FILE_INPUT].Filename = - AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename; - AcpiGbl_DisasmFlag = TRUE; - fprintf (stderr, "\n"); - AslDoDisassembly (); - - /* delete the AML file. This AML file should never be utilized by AML interpreters. */ - - FlDeleteFile (ASL_FILE_AML_OUTPUT); - } - + /* + * At this point, we know how many lines are in the input file. Save it + * to display for post-compilation summary. + */ + FileNode->TotalLineCount = AslGbl_CurrentLineNumber; return (AE_OK); /* @@ -661,6 +629,8 @@ AslCheckForErrorExit ( (AslGbl_ExceptionCount[ASL_WARNING2] > 0) || (AslGbl_ExceptionCount[ASL_WARNING3] > 0)) { + AslError (ASL_ERROR, ASL_MSG_WARNING_AS_ERROR, NULL, + "(reporting warnings as errors)"); return (AE_ERROR); } } diff --git a/src/acpica/source/compiler/aslsupport.l b/src/acpica/source/compiler/aslsupport.l index 5cac84dc..69c1399a 100644 --- a/src/acpica/source/compiler/aslsupport.l +++ b/src/acpica/source/compiler/aslsupport.l @@ -532,14 +532,18 @@ count ( { case 2: - AslGbl_TotalKeywords++; - AslGbl_TotalNamedObjects++; + ++AslGbl_TotalKeywords; + ++AslGbl_TotalNamedObjects; + ++AslGbl_FilesList->TotalKeywords; + ++AslGbl_FilesList->TotalNamedObjects; break; case 3: - AslGbl_TotalKeywords++; - AslGbl_TotalExecutableOpcodes++; + ++AslGbl_TotalKeywords; + ++AslGbl_TotalExecutableOpcodes; + ++AslGbl_FilesList->TotalKeywords; + ++AslGbl_FilesList->TotalExecutableOpcodes; break; default: diff --git a/src/acpica/source/compiler/asltree.c b/src/acpica/source/compiler/asltree.c index 6bb40888..62efc5fa 100644 --- a/src/acpica/source/compiler/asltree.c +++ b/src/acpica/source/compiler/asltree.c @@ -462,6 +462,7 @@ TrLinkOpChildren ( { ACPI_PARSE_OBJECT *Child; ACPI_PARSE_OBJECT *PrevChild; + ACPI_PARSE_OBJECT *LastSibling; va_list ap; UINT32 i; BOOLEAN FirstChild; @@ -480,8 +481,18 @@ TrLinkOpChildren ( { case PARSEOP_ASL_CODE: - AslGbl_ParseTreeRoot = Op; - Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + if (!AslGbl_ParseTreeRoot) + { + DbgPrint (ASL_PARSE_OUTPUT, "Creating first Definition Block\n"); + AslGbl_ParseTreeRoot = Op; + Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG; + } + else + { + DbgPrint (ASL_PARSE_OUTPUT, "Creating subsequent Definition Block\n"); + Op = AslGbl_ParseTreeRoot; + } + DbgPrint (ASL_PARSE_OUTPUT, "ASLCODE (Tree Completed)->"); break; @@ -560,7 +571,27 @@ TrLinkOpChildren ( if (FirstChild) { FirstChild = FALSE; - Op->Asl.Child = Child; + + /* + * In the case that multiple definition blocks are being compiled, + * append the definition block to the end of the child list as the + * last sibling. This is done to facilitate namespace cross- + * reference between multiple definition blocks. + */ + if (Op->Asl.Child && + (Op->Asl.Child->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK)) + { + LastSibling = Op->Asl.Child; + while (LastSibling->Asl.Next) + { + LastSibling = LastSibling->Asl.Next; + } + LastSibling->Asl.Next = Child; + } + else + { + Op->Asl.Child = Child; + } } /* Point all children to parent */ @@ -825,6 +856,8 @@ TrWalkParseTree ( BOOLEAN OpPreviouslyVisited; ACPI_PARSE_OBJECT *StartOp = Op; ACPI_STATUS Status; + ACPI_PARSE_OBJECT *Restore = NULL; + BOOLEAN WalkOneDefinitionBlock = Visitation & ASL_WALK_VISIT_DB_SEPARATELY; if (!AslGbl_ParseTreeRoot) @@ -835,7 +868,13 @@ TrWalkParseTree ( Level = 0; OpPreviouslyVisited = FALSE; - switch (Visitation) + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Restore = Op->Asl.Next; + Op->Asl.Next = NULL; + } + switch (Visitation & ~ASL_WALK_VISIT_DB_SEPARATELY) { case ASL_WALK_VISIT_DOWNWARD: @@ -861,7 +900,7 @@ TrWalkParseTree ( { /* Exit immediately on any error */ - return (Status); + goto ErrorExit; } } @@ -907,7 +946,7 @@ TrWalkParseTree ( Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) { - return (Status); + goto ErrorExit; } } else @@ -956,7 +995,7 @@ TrWalkParseTree ( Status = AscendingCallback (Op, Level, Context); if (ACPI_FAILURE (Status)) { - return (Status); + goto ErrorExit; } } else @@ -979,7 +1018,7 @@ TrWalkParseTree ( { /* Exit immediately on any error */ - return (Status); + goto ErrorExit; } } @@ -1018,5 +1057,20 @@ TrWalkParseTree ( /* If we get here, the walk completed with no errors */ + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Op->Asl.Next = Restore; + } + return (AE_OK); + +ErrorExit: + + if (Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK && + WalkOneDefinitionBlock) + { + Op->Asl.Next = Restore; + } + return (Status); } diff --git a/src/acpica/source/compiler/asltypes.h b/src/acpica/source/compiler/asltypes.h index 628b2d37..8a6a0750 100644 --- a/src/acpica/source/compiler/asltypes.h +++ b/src/acpica/source/compiler/asltypes.h @@ -221,10 +221,10 @@ typedef struct asl_analysis_walk_info typedef struct asl_mapping_entry { - UINT32 Value; - UINT32 AcpiBtype; /* Object type or return type */ - UINT16 AmlOpcode; - UINT8 Flags; + UINT32 Value; + UINT32 AcpiBtype; /* Object type or return type */ + UINT16 AmlOpcode; + UINT8 Flags; } ASL_MAPPING_ENTRY; @@ -233,8 +233,8 @@ typedef struct asl_mapping_entry typedef struct asl_walk_info { - ACPI_PARSE_OBJECT **NodePtr; - UINT32 *LevelPtr; + ACPI_PARSE_OBJECT **NodePtr; + UINT32 *LevelPtr; } ASL_WALK_INFO; @@ -243,10 +243,8 @@ typedef struct asl_walk_info typedef struct asl_file_info { - FILE *Handle; - char *Filename; - const char *ShortDescription; - const char *Description; + FILE *Handle; + char *Filename; } ASL_FILE_INFO; @@ -258,6 +256,11 @@ typedef struct asl_file_status } ASL_FILE_STATUS; +typedef UINT32 ASL_FILE_SWITCH_STATUS; /* File switch status */ +#define SWITCH_TO_DIFFERENT_FILE 0 +#define SWITCH_TO_SAME_FILE 1 +#define FILE_NOT_FOUND 2 + /* * File types. Note: Any changes to this table must also be reflected * in the Gbl_Files array. @@ -295,10 +298,17 @@ typedef enum } ASL_FILE_TYPES; - #define ASL_MAX_FILE_TYPE 18 #define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1) +typedef struct asl_file_desc +{ + const char *ShortDescription; + const char *Description; + +} ASL_FILE_DESC; + + /* Name suffixes used to create filenames for output files */ #define FILE_SUFFIX_ASL_CODE "asl" @@ -325,16 +335,16 @@ typedef enum typedef struct asl_cache_info { - void *Next; - char Buffer[1]; + void *Next; + char Buffer[1]; } ASL_CACHE_INFO; typedef struct asl_include_dir { - char *Dir; - struct asl_include_dir *Next; + char *Dir; + struct asl_include_dir *Next; } ASL_INCLUDE_DIR; @@ -343,6 +353,11 @@ typedef struct asl_include_dir * An entry in the exception list, one for each error/warning * Note: SubError nodes would be treated with the same messageId and Level * as the parent error node. + * + * The source filename represents the name of the .src of where the error + * occurred. This is useful for errors that occur inside of include files. + * Since include files aren't recorded as a part of the global files list, + * this provides a way to get the included file. */ typedef struct asl_error_msg { @@ -355,6 +370,7 @@ typedef struct asl_error_msg struct asl_error_msg *SubError; char *Filename; char *SourceLine; + char *SourceFilename; UINT32 FilenameLength; UINT16 MessageId; UINT8 Level; @@ -362,6 +378,7 @@ typedef struct asl_error_msg } ASL_ERROR_MSG; /* An entry in the expected messages array */ + typedef struct asl_expected_message { UINT32 MessageId; @@ -479,4 +496,19 @@ typedef struct asl_file_node } ASL_FILE_NODE; +typedef struct asl_files_node +{ + struct asl_file_info Files[ASL_NUM_FILES]; + struct asl_files_node *Next; + char *TableSignature; + char *TableId; + UINT32 TotalLineCount; + UINT32 OriginalInputFileSize; + UINT32 TotalKeywords; + UINT32 TotalNamedObjects; + UINT32 TotalExecutableOpcodes; + BOOLEAN ParserErrorDetected; + +} ASL_GLOBAL_FILE_NODE; + #endif /* __ASLTYPES_H */ diff --git a/src/acpica/source/compiler/aslutils.c b/src/acpica/source/compiler/aslutils.c index 6b0d5eff..0b78f473 100644 --- a/src/acpica/source/compiler/aslutils.c +++ b/src/acpica/source/compiler/aslutils.c @@ -174,6 +174,10 @@ UtAttachNameseg ( ACPI_PARSE_OBJECT *Op, char *Name); +static void +UtDisplayErrorSummary ( + UINT32 FileId); + /******************************************************************************* * @@ -520,21 +524,23 @@ UtSetParseOpName ( /******************************************************************************* * - * FUNCTION: UtDisplaySummary + * FUNCTION: UtDisplayOneSummary * * PARAMETERS: FileID - ID of outpout file * * RETURN: None * - * DESCRIPTION: Display compilation statistics + * DESCRIPTION: Display compilation statistics for one input file * ******************************************************************************/ void -UtDisplaySummary ( - UINT32 FileId) +UtDisplayOneSummary ( + UINT32 FileId, + BOOLEAN DisplayErrorSummary) { UINT32 i; + ASL_GLOBAL_FILE_NODE *FileNode; if (FileId != ASL_FILE_STDOUT) @@ -565,25 +571,41 @@ UtDisplaySummary ( } else { - FlPrintFile (FileId, - "%-14s %s - %u lines, %u bytes, %u keywords\n", - "ASL Input:", - AslGbl_Files[ASL_FILE_INPUT].Filename, AslGbl_CurrentLineNumber, - AslGbl_OriginalInputFileSize, AslGbl_TotalKeywords); - - /* AML summary */ - - if ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || (AslGbl_IgnoreErrors)) + FileNode = FlGetCurrentFileNode (); + if (!FileNode) { - if (AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) + fprintf (stderr, "Summary could not be generated"); + return; + } + if (FileNode->ParserErrorDetected) + { + FlPrintFile (FileId, + "%-14s %s - Compilation aborted due to parser-detected syntax error(s)\n", + "ASL Input:", AslGbl_Files[ASL_FILE_INPUT].Filename); + } + else + { + FlPrintFile (FileId, + "%-14s %s - %7u bytes %6u keywords %6u source lines\n", + "ASL Input:", + AslGbl_Files[ASL_FILE_INPUT].Filename, + FileNode->OriginalInputFileSize, + FileNode->TotalKeywords, + FileNode->TotalLineCount); + + /* AML summary */ + + if (!AslGbl_ParserErrorDetected && + ((AslGbl_ExceptionCount[ASL_ERROR] == 0) || AslGbl_IgnoreErrors) && + AslGbl_Files[ASL_FILE_AML_OUTPUT].Handle) { FlPrintFile (FileId, - "%-14s %s - %u bytes, %u named objects, " - "%u executable opcodes\n", + "%-14s %s - %7u bytes %6u opcodes %6u named objects\n", "AML Output:", AslGbl_Files[ASL_FILE_AML_OUTPUT].Filename, FlGetFileSize (ASL_FILE_AML_OUTPUT), - AslGbl_TotalNamedObjects, AslGbl_TotalExecutableOpcodes); + FileNode->TotalExecutableOpcodes, + FileNode->TotalNamedObjects); } } } @@ -612,14 +634,55 @@ UtDisplaySummary ( } FlPrintFile (FileId, "%14s %s - %u bytes\n", - AslGbl_Files[i].ShortDescription, + AslGbl_FileDescs[i].ShortDescription, AslGbl_Files[i].Filename, FlGetFileSize (i)); } - /* Error summary */ + + /* + * Optionally emit an error summary for a file. This is used to enhance the + * appearance of listing files. + */ + if (DisplayErrorSummary) + { + UtDisplayErrorSummary (FileId); + } +} + + +/******************************************************************************* + * + * FUNCTION: UtDisplayErrorSummary + * + * PARAMETERS: FileID - ID of outpout file + * + * RETURN: None + * + * DESCRIPTION: Display compilation statistics for all input files + * + ******************************************************************************/ + +static void +UtDisplayErrorSummary ( + UINT32 FileId) +{ + BOOLEAN ErrorDetected; + + + ErrorDetected = AslGbl_ParserErrorDetected || + ((AslGbl_ExceptionCount[ASL_ERROR] > 0) && !AslGbl_IgnoreErrors); + + if (ErrorDetected) + { + FlPrintFile (FileId, "\nCompilation failed. "); + } + else + { + FlPrintFile (FileId, "\nCompilation successful. "); + } FlPrintFile (FileId, - "\nCompilation complete. %u Errors, %u Warnings, %u Remarks", + "%u Errors, %u Warnings, %u Remarks", AslGbl_ExceptionCount[ASL_ERROR], AslGbl_ExceptionCount[ASL_WARNING] + AslGbl_ExceptionCount[ASL_WARNING2] + @@ -628,6 +691,19 @@ UtDisplaySummary ( if (AslGbl_FileType != ASL_INPUT_TYPE_ASCII_DATA) { + if (AslGbl_ParserErrorDetected) + { + FlPrintFile (FileId, + "\nNo AML files were generated due to syntax error(s)\n"); + return; + } + else if (ErrorDetected) + { + FlPrintFile (FileId, + "\nNo AML files were generated due to compiler error(s)\n"); + return; + } + FlPrintFile (FileId, ", %u Optimizations", AslGbl_ExceptionCount[ASL_OPTIMIZATION]); @@ -641,6 +717,46 @@ UtDisplaySummary ( } +/******************************************************************************* + * + * FUNCTION: UtDisplaySummary + * + * PARAMETERS: FileID - ID of outpout file + * + * RETURN: None + * + * DESCRIPTION: Display compilation statistics for all input files + * + ******************************************************************************/ + +void +UtDisplaySummary ( + UINT32 FileId) +{ + ASL_GLOBAL_FILE_NODE *Current = AslGbl_FilesList; + + + while (Current) + { + switch (FlSwitchFileSet(Current->Files[ASL_FILE_INPUT].Filename)) + { + case SWITCH_TO_SAME_FILE: + case SWITCH_TO_DIFFERENT_FILE: + + UtDisplayOneSummary (FileId, FALSE); + Current = Current->Next; + break; + + case FILE_NOT_FOUND: + default: + + Current = NULL; + break; + } + } + UtDisplayErrorSummary (FileId); +} + /******************************************************************************* * * FUNCTION: UtCheckIntegerRange diff --git a/src/acpica/source/compiler/aslxref.c b/src/acpica/source/compiler/aslxref.c index 99f6c4a0..9d6e5c0b 100644 --- a/src/acpica/source/compiler/aslxref.c +++ b/src/acpica/source/compiler/aslxref.c @@ -1185,6 +1185,24 @@ XfNamespaceLocateBegin ( } } + /* + * 5) Check for external resolution + * By this point, everything should be loaded in the namespace. If a + * namespace lookup results in a namespace node that is an external, it + * means that this named object was not defined in the input ASL. This + * causes issues because there are plenty of incidents where developers + * use the external keyword to suppress compiler errors about undefined + * objects. Note: this only applies when compiling multiple definition + * blocks. + */ + if (AslGbl_ParseTreeRoot->Asl.Child && AslGbl_ParseTreeRoot->Asl.Child->Asl.Next && + (Op->Asl.ParseOpcode != PARSEOP_EXTERNAL && + Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_EXTERNAL) && + (Node->Flags & ANOBJ_IS_EXTERNAL)) + { + AslError (ASL_ERROR, ASL_MSG_UNDEFINED_EXTERNAL, Op, NULL); + } + /* 5) Check for a connection object */ #if 0 else if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONNECTION) diff --git a/src/acpica/source/compiler/dtcompile.c b/src/acpica/source/compiler/dtcompile.c index 95fcb2d4..09cb3e6c 100644 --- a/src/acpica/source/compiler/dtcompile.c +++ b/src/acpica/source/compiler/dtcompile.c @@ -240,8 +240,7 @@ DtDoCompile ( DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Input file does not appear to be an ASL or data table source file"); - Status = AE_ERROR; - goto CleanupAndExit; + return (AE_ERROR); } Event = UtBeginEvent ("Compile parse tree"); @@ -259,7 +258,7 @@ DtDoCompile ( DtError (ASL_ERROR, ASL_MSG_SYNTAX, NULL, "Could not compile input file"); - goto CleanupAndExit; + return (Status); } /* Create/open the binary output file */ @@ -268,7 +267,7 @@ DtDoCompile ( Status = FlOpenAmlOutputFile (AslGbl_OutputFilenamePrefix); if (ACPI_FAILURE (Status)) { - goto CleanupAndExit; + return (Status); } /* Write the binary, then the optional hex file */ @@ -277,10 +276,6 @@ DtDoCompile ( HxDoHexOutput (); DtWriteTableToListing (); -CleanupAndExit: - - AcpiUtDeleteCaches (); - CmCleanupAndExit (); return (Status); } diff --git a/src/acpica/source/compiler/fwts_iasl_interface.c b/src/acpica/source/compiler/fwts_iasl_interface.c index 9679e272..1699eb6c 100644 --- a/src/acpica/source/compiler/fwts_iasl_interface.c +++ b/src/acpica/source/compiler/fwts_iasl_interface.c @@ -35,27 +35,17 @@ */ static void init_asl_core(void) { - int i; - AcpiOsInitialize(); ACPI_DEBUG_INITIALIZE(); AcpiGbl_ExternalFileList = NULL; AcpiDbgLevel = 0; PrInitializePreprocessor(); - AcpiGbl_DmOpt_Verbose = FALSE; - AcpiGbl_IntegerBitWidth = 64; - AcpiGbl_IntegerNybbleWidth = 16; - AcpiGbl_IntegerByteWidth = 8; - - for (i = 0; i < ASL_NUM_FILES; i++) { - AslGbl_Files[i].Handle = NULL; - AslGbl_Files[i].Filename = NULL; - } - AslGbl_Files[ASL_FILE_STDOUT].Handle = stdout; - AslGbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; - AslGbl_Files[ASL_FILE_STDERR].Handle = stdout; - AslGbl_Files[ASL_FILE_STDERR].Filename = "STDOUT"; + /* From AslInitialize */ + AcpiGbl_DmOpt_Verbose = FALSE; + AcpiGbl_IntegerBitWidth = 32; + AcpiGbl_IntegerNybbleWidth = 8; + AcpiGbl_IntegerByteWidth = 4; AslGbl_LineBufferSize = 1024; AslGbl_CurrentLineBuffer = NULL; @@ -99,6 +89,7 @@ int fwts_iasl_disassemble_aml( AslGbl_UseDefaultAmlFilename = FALSE; AcpiGbl_CstyleDisassembly = FALSE; AcpiGbl_DmOpt_Verbose = FALSE; + AslGbl_ParserErrorDetected = FALSE; UtConvertBackslashes (AslGbl_OutputFilenamePrefix); /* Do we need to include external tables in? */ @@ -135,6 +126,7 @@ int fwts_iasl_disassemble_aml( (void)fclose(fpout); _exit(1); } + AdInitialize(); /* ...and do the ACPICA disassambly... */ AslDoOneFile((char *)tables[which]); @@ -231,14 +223,28 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde (void)close(stderr_fds[0]); /* Setup ACPICA compiler globals */ + AslGbl_WarningLevel = 0; + AslGbl_NoErrors = FALSE; AcpiGbl_DisasmFlag = FALSE; + AslGbl_DisplayRemarks = TRUE; + AslGbl_DisplayWarnings = TRUE; + AslGbl_DisplayOptimizations = TRUE; + /* AslGbl_CompileTimesFlag = TRUE; */ AslGbl_DoCompile = TRUE; AslGbl_PreprocessFlag = TRUE; AslGbl_UseDefaultAmlFilename = FALSE; AslGbl_OutputFilenamePrefix = (char*)source; - UtConvertBackslashes (AslGbl_OutputFilenamePrefix); + UtConvertBackslashes(AslGbl_OutputFilenamePrefix); - (void)AslDoOneFile((char *)source); + AdInitialize(); + status = AslDoOneFile((char *)source); + + AslCheckExpectedExceptions(); + UtFreeLineBuffers(); + AslParserCleanup(); + AcpiDmClearExternalFileList(); + AcpiTerminate(); + CmCleanupAndExit(); /* * We need to flush buffered I/O on IASL stdout @@ -246,7 +252,6 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde */ (void)fflush(stdout); (void)fflush(stderr); - _exit(0); break; default: @@ -261,6 +266,7 @@ int fwts_iasl_assemble_aml(const char *source, char **stdout_output, char **stde if (fwts_iasl_read_output(stderr_fds[0], stderr_output, &stderr_len, &stderr_eof) < 0) break; } + (void)waitpid(pid, &status, WUNTRACED | WCONTINUED); (void)close(stdout_fds[0]); (void)close(stderr_fds[0]); diff --git a/src/acpica/source/compiler/prutils.c b/src/acpica/source/compiler/prutils.c index b5ddfa9f..f3d615ad 100644 --- a/src/acpica/source/compiler/prutils.c +++ b/src/acpica/source/compiler/prutils.c @@ -455,7 +455,6 @@ PrOpenIncludeWithPrefix ( IncludeFile = fopen (Pathname, OpenMode); if (!IncludeFile) { - fprintf (stderr, "Could not open include file %s\n", Pathname); return (NULL); } diff --git a/src/acpica/source/components/events/evgpe.c b/src/acpica/source/components/events/evgpe.c index f5ea992a..7534f6d7 100644 --- a/src/acpica/source/components/events/evgpe.c +++ b/src/acpica/source/components/events/evgpe.c @@ -240,6 +240,14 @@ AcpiEvEnableGpe ( ACPI_FUNCTION_TRACE (EvEnableGpe); + /* Clear the GPE (of stale events) */ + + Status = AcpiHwClearGpe(GpeEventInfo); + if (ACPI_FAILURE(Status)) + { + return_ACPI_STATUS(Status); + } + /* Enable the requested GPE */ Status = AcpiHwLowSetGpe (GpeEventInfo, ACPI_GPE_ENABLE); diff --git a/src/acpica/source/components/namespace/nsalloc.c b/src/acpica/source/components/namespace/nsalloc.c index ff178d49..12772308 100644 --- a/src/acpica/source/components/namespace/nsalloc.c +++ b/src/acpica/source/components/namespace/nsalloc.c @@ -232,6 +232,11 @@ AcpiNsDeleteNode ( ACPI_FUNCTION_NAME (NsDeleteNode); + if (!Node) + { + return_VOID; + } + /* Detach an object if there is one */ AcpiNsDetachObject (Node); diff --git a/src/acpica/source/include/acpixf.h b/src/acpica/source/include/acpixf.h index d3e4e7b5..be338bbe 100644 --- a/src/acpica/source/include/acpixf.h +++ b/src/acpica/source/include/acpixf.h @@ -154,7 +154,7 @@ /* Current ACPICA subsystem version in YYYYMMDD format */ -#define ACPI_CA_VERSION 0x20190329 +#define ACPI_CA_VERSION 0x20190405 #include "acconfig.h" #include "actypes.h"