diff mbox series

[1/3] ACPICA: Update to version 20190405

Message ID 20190408145153.5485-1-colin.king@canonical.com
State Accepted
Headers show
Series [1/3] ACPICA: Update to version 20190405 | expand

Commit Message

Colin Ian King April 8, 2019, 2:51 p.m. UTC
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(-)

Comments

Ivan Hu April 19, 2019, 2:58 a.m. UTC | #1
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>
Alex Hung April 19, 2019, 6:31 a.m. UTC | #2
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 mbox series

Patch

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"