xref: /freebsd/sys/contrib/dev/acpica/compiler/asllisting.c (revision 911f0260390e18cf85f3dbf2c719b593efdc1e3c)
1 /******************************************************************************
2  *
3  * Module Name: asllisting - Listing file generation
4  *
5  *****************************************************************************/
6 
7 /******************************************************************************
8  *
9  * 1. Copyright Notice
10  *
11  * Some or all of this work - Copyright (c) 1999 - 2022, Intel Corp.
12  * All rights reserved.
13  *
14  * 2. License
15  *
16  * 2.1. This is your license from Intel Corp. under its intellectual property
17  * rights. You may have additional license terms from the party that provided
18  * you this software, covering your right to use that party's intellectual
19  * property rights.
20  *
21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22  * copy of the source code appearing in this file ("Covered Code") an
23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24  * base code distributed originally by Intel ("Original Intel Code") to copy,
25  * make derivatives, distribute, use and display any portion of the Covered
26  * Code in any form, with the right to sublicense such rights; and
27  *
28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29  * license (with the right to sublicense), under only those claims of Intel
30  * patents that are infringed by the Original Intel Code, to make, use, sell,
31  * offer to sell, and import the Covered Code and derivative works thereof
32  * solely to the minimum extent necessary to exercise the above copyright
33  * license, and in no event shall the patent license extend to any additions
34  * to or modifications of the Original Intel Code. No other license or right
35  * is granted directly or by implication, estoppel or otherwise;
36  *
37  * The above copyright and patent license is granted only if the following
38  * conditions are met:
39  *
40  * 3. Conditions
41  *
42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43  * Redistribution of source code of any substantial portion of the Covered
44  * Code or modification with rights to further distribute source must include
45  * the above Copyright Notice, the above License, this list of Conditions,
46  * and the following Disclaimer and Export Compliance provision. In addition,
47  * Licensee must cause all Covered Code to which Licensee contributes to
48  * contain a file documenting the changes Licensee made to create that Covered
49  * Code and the date of any change. Licensee must include in that file the
50  * documentation of any changes made by any predecessor Licensee. Licensee
51  * must include a prominent statement that the modification is derived,
52  * directly or indirectly, from Original Intel Code.
53  *
54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55  * Redistribution of source code of any substantial portion of the Covered
56  * Code or modification without rights to further distribute source must
57  * include the following Disclaimer and Export Compliance provision in the
58  * documentation and/or other materials provided with distribution. In
59  * addition, Licensee may not authorize further sublicense of source of any
60  * portion of the Covered Code, and must include terms to the effect that the
61  * license from Licensee to its licensee is limited to the intellectual
62  * property embodied in the software Licensee provides to its licensee, and
63  * not to intellectual property embodied in modifications its licensee may
64  * make.
65  *
66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67  * substantial portion of the Covered Code or modification must reproduce the
68  * above Copyright Notice, and the following Disclaimer and Export Compliance
69  * provision in the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3.4. Intel retains all right, title, and interest in and to the Original
73  * Intel Code.
74  *
75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76  * Intel shall be used in advertising or otherwise to promote the sale, use or
77  * other dealings in products derived from or relating to the Covered Code
78  * without prior written authorization from Intel.
79  *
80  * 4. Disclaimer and Export Compliance
81  *
82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88  * PARTICULAR PURPOSE.
89  *
90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97  * LIMITED REMEDY.
98  *
99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100  * software or system incorporating such software without first obtaining any
101  * required license or other approval from the U. S. Department of Commerce or
102  * any other agency or department of the United States Government. In the
103  * event Licensee exports any such software from the United States or
104  * re-exports any such software from a foreign destination, Licensee shall
105  * ensure that the distribution and export/re-export of the software is in
106  * compliance with all laws, regulations, orders, or other restrictions of the
107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108  * any of its subsidiaries will export/re-export any technical data, process,
109  * software, or service, directly or indirectly, to any country for which the
110  * United States government or any agency thereof requires an export license,
111  * other governmental approval, or letter of assurance, without first obtaining
112  * such license, approval or letter.
113  *
114  *****************************************************************************
115  *
116  * Alternatively, you may choose to be licensed under the terms of the
117  * following license:
118  *
119  * Redistribution and use in source and binary forms, with or without
120  * modification, are permitted provided that the following conditions
121  * are met:
122  * 1. Redistributions of source code must retain the above copyright
123  *    notice, this list of conditions, and the following disclaimer,
124  *    without modification.
125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126  *    substantially similar to the "NO WARRANTY" disclaimer below
127  *    ("Disclaimer") and any redistribution must be conditioned upon
128  *    including a substantially similar Disclaimer requirement for further
129  *    binary redistribution.
130  * 3. Neither the names of the above-listed copyright holders nor the names
131  *    of any contributors may be used to endorse or promote products derived
132  *    from this software without specific prior written permission.
133  *
134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145  *
146  * Alternatively, you may choose to be licensed under the terms of the
147  * GNU General Public License ("GPL") version 2 as published by the Free
148  * Software Foundation.
149  *
150  *****************************************************************************/
151 
152 #include <contrib/dev/acpica/compiler/aslcompiler.h>
153 #include "aslcompiler.y.h"
154 #include <contrib/dev/acpica/include/amlcode.h>
155 #include <contrib/dev/acpica/include/acparser.h>
156 #include <contrib/dev/acpica/include/acnamesp.h>
157 
158 
159 #define _COMPONENT          ACPI_COMPILER
160         ACPI_MODULE_NAME    ("asllisting")
161 
162 
163 /* Local prototypes */
164 
165 static void
166 LsGenerateListing (
167     UINT32                  FileId);
168 
169 static ACPI_STATUS
170 LsAmlListingWalk (
171     ACPI_PARSE_OBJECT       *Op,
172     UINT32                  Level,
173     void                    *Context);
174 
175 static ACPI_STATUS
176 LsTreeWriteWalk (
177     ACPI_PARSE_OBJECT       *Op,
178     UINT32                  Level,
179     void                    *Context);
180 
181 static void
182 LsWriteNodeToListing (
183     ACPI_PARSE_OBJECT       *Op,
184     UINT32                  FileId);
185 
186 static void
187 LsFinishSourceListing (
188     UINT32                  FileId);
189 
190 
191 /*******************************************************************************
192  *
193  * FUNCTION:    LsDoListings
194  *
195  * PARAMETERS:  None. Examines the various output file global flags.
196  *
197  * RETURN:      None
198  *
199  * DESCRIPTION: Generate all requested listing files.
200  *
201  ******************************************************************************/
202 
203 void
204 LsDoListings (
205     void)
206 {
207 
208     if (AslGbl_C_OutputFlag)
209     {
210         LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT);
211     }
212 
213     if (AslGbl_ListingFlag)
214     {
215         LsGenerateListing (ASL_FILE_LISTING_OUTPUT);
216     }
217 
218     if (AslGbl_AsmOutputFlag)
219     {
220         LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT);
221     }
222 
223     if (AslGbl_C_IncludeOutputFlag)
224     {
225         LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT);
226     }
227 
228     if (AslGbl_AsmIncludeOutputFlag)
229     {
230         LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT);
231     }
232 
233     if (AslGbl_C_OffsetTableFlag)
234     {
235         LsGenerateListing (ASL_FILE_C_OFFSET_OUTPUT);
236     }
237 }
238 
239 
240 /*******************************************************************************
241  *
242  * FUNCTION:    LsGenerateListing
243  *
244  * PARAMETERS:  FileId      - ID of listing file
245  *
246  * RETURN:      None
247  *
248  * DESCRIPTION: Generate a listing file. This can be one of the several types
249  *              of "listings" supported.
250  *
251  ******************************************************************************/
252 
253 static void
254 LsGenerateListing (
255     UINT32                  FileId)
256 {
257     UINT32                  WalkMode = ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_DB_SEPARATELY;
258 
259     /* Start at the beginning of both the source and AML files */
260 
261     FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
262     FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
263     AslGbl_SourceLine = 0;
264     AslGbl_CurrentHexColumn = 0;
265     LsPushNode (AslGbl_Files[ASL_FILE_INPUT].Filename);
266 
267     if (FileId == ASL_FILE_C_OFFSET_OUTPUT)
268     {
269         AslGbl_CurrentAmlOffset = 0;
270 
271         /* Offset table file has a special header and footer */
272 
273         LsDoOffsetTableHeader (FileId);
274 
275         TrWalkParseTree (AslGbl_CurrentDB, WalkMode,
276             LsAmlOffsetWalk, NULL, (void *) ACPI_TO_POINTER (FileId));
277         LsDoOffsetTableFooter (FileId);
278         return;
279     }
280 
281     /* Process all parse nodes */
282 
283     TrWalkParseTree (AslGbl_CurrentDB, WalkMode,
284         LsAmlListingWalk, NULL, (void *) ACPI_TO_POINTER (FileId));
285 
286     /* Final processing */
287 
288     LsFinishSourceListing (FileId);
289 }
290 
291 
292 /*******************************************************************************
293  *
294  * FUNCTION:    LsAmlListingWalk
295  *
296  * PARAMETERS:  ASL_WALK_CALLBACK
297  *
298  * RETURN:      Status
299  *
300  * DESCRIPTION: Process one node during a listing file generation.
301  *
302  ******************************************************************************/
303 
304 static ACPI_STATUS
305 LsAmlListingWalk (
306     ACPI_PARSE_OBJECT       *Op,
307     UINT32                  Level,
308     void                    *Context)
309 {
310     UINT8                   FileByte;
311     UINT32                  i;
312     UINT32                  FileId = (UINT32) ACPI_TO_INTEGER (Context);
313 
314 
315     LsWriteNodeToListing (Op, FileId);
316 
317     if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DATA)
318     {
319         /* Buffer is a resource template, don't dump the data all at once */
320 
321         return (AE_OK);
322     }
323 
324     if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
325         (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
326     {
327         return (AE_OK);
328     }
329 
330     /* Write the hex bytes to the listing file(s) (if requested) */
331 
332     for (i = 0; i < Op->Asl.FinalAmlLength; i++)
333     {
334         if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1)))
335         {
336             FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
337             AslAbort ();
338         }
339 
340         LsWriteListingHexBytes (&FileByte, 1, FileId);
341     }
342 
343     return (AE_OK);
344 }
345 
346 
347 /*******************************************************************************
348  *
349  * FUNCTION:    LsDumpParseTree, LsTreeWriteWalk
350  *
351  * PARAMETERS:  None
352  *
353  * RETURN:      None
354  *
355  * DESCRIPTION: Dump entire parse tree, for compiler debug only
356  *
357  ******************************************************************************/
358 
359 void
360 LsDumpParseTree (
361     void)
362 {
363 
364     if (!AslGbl_DebugFlag)
365     {
366         return;
367     }
368 
369     DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n");
370     DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1);
371 
372     TrWalkParseTree (AslGbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
373         LsTreeWriteWalk, NULL, NULL);
374 
375     DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_HEADER1);
376 }
377 
378 
379 static ACPI_STATUS
380 LsTreeWriteWalk (
381     ACPI_PARSE_OBJECT       *Op,
382     UINT32                  Level,
383     void                    *Context)
384 {
385 
386     /* Dump ParseOp name and possible value */
387 
388     switch (Op->Asl.ParseOpcode)
389     {
390         case PARSEOP_NAMESEG:
391         case PARSEOP_NAMESTRING:
392         case PARSEOP_METHODCALL:
393         case PARSEOP_STRING_LITERAL:
394 
395         UtDumpStringOp (Op, Level);
396         break;
397 
398     case PARSEOP_BYTECONST:
399 
400         UtDumpIntegerOp (Op, Level, 2);
401         break;
402 
403     case PARSEOP_WORDCONST:
404     case PARSEOP_PACKAGE_LENGTH:
405 
406         UtDumpIntegerOp (Op, Level, 4);
407         break;
408 
409     case PARSEOP_DWORDCONST:
410     case PARSEOP_EISAID:
411 
412         UtDumpIntegerOp (Op, Level, 8);
413         break;
414 
415     case PARSEOP_QWORDCONST:
416     case PARSEOP_INTEGER:
417     case PARSEOP_ONE:
418     case PARSEOP_ZERO:
419     case PARSEOP_ONES:
420 
421         UtDumpIntegerOp (Op, Level, 16);
422         break;
423 
424     case PARSEOP_INCLUDE:
425 
426         DbgPrint (ASL_TREE_OUTPUT,
427             "Open: %s\n", Op->Asl.Value.String);
428         return (AE_OK);
429 
430     case PARSEOP_INCLUDE_END:
431 
432         DbgPrint (ASL_TREE_OUTPUT,
433             "Close: %s\n", Op->Asl.Filename);
434         return (AE_OK);
435 
436     default:
437 
438         UtDumpBasicOp (Op, Level);
439         break;
440     }
441 
442     /* Dump the remaining data */
443 
444     DbgPrint (ASL_TREE_OUTPUT, ASL_PARSE_TREE_DEBUG1,
445         Op->Asl.ParseOpcode, Op->Asl.CompileFlags,
446         Op->Asl.LineNumber, Op->Asl.EndLine,
447         Op->Asl.LogicalLineNumber, Op->Asl.EndLogicalLine);
448 
449     TrPrintOpFlags (Op->Asl.CompileFlags, ASL_TREE_OUTPUT);
450     DbgPrint (ASL_TREE_OUTPUT, "\n");
451     return (AE_OK);
452 }
453 
454 
455 /*******************************************************************************
456  *
457  * FUNCTION:    LsWriteNodeToListing
458  *
459  * PARAMETERS:  Op              - Parse node to write to the listing file.
460  *              FileId          - ID of current listing file
461  *
462  * RETURN:      None.
463  *
464  * DESCRIPTION: Write "a node" to the listing file. This means to
465  *              1) Write out all of the source text associated with the node
466  *              2) Write out all of the AML bytes associated with the node
467  *              3) Write any compiler exceptions associated with the node
468  *
469  ******************************************************************************/
470 
471 static void
472 LsWriteNodeToListing (
473     ACPI_PARSE_OBJECT       *Op,
474     UINT32                  FileId)
475 {
476     const ACPI_OPCODE_INFO  *OpInfo;
477     UINT32                  OpClass;
478     char                    *Pathname;
479     UINT32                  Length;
480     UINT32                  i;
481 
482 
483     OpInfo  = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
484     OpClass = OpInfo->Class;
485 
486     /* TBD: clean this up with a single flag that says:
487      * I start a named output block
488      */
489     if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
490     {
491         switch (Op->Asl.ParseOpcode)
492         {
493         case PARSEOP_DEFINITION_BLOCK:
494         case PARSEOP_METHODCALL:
495         case PARSEOP_INCLUDE:
496         case PARSEOP_INCLUDE_END:
497         case PARSEOP_DEFAULT_ARG:
498 
499             break;
500 
501         default:
502 
503             switch (OpClass)
504             {
505             case AML_CLASS_NAMED_OBJECT:
506 
507                 switch (Op->Asl.AmlOpcode)
508                 {
509                 case AML_SCOPE_OP:
510                 case AML_ALIAS_OP:
511 
512                     break;
513 
514                 default:
515 
516                     if (Op->Asl.ExternalName)
517                     {
518                         LsFlushListingBuffer (FileId);
519                         FlPrintFile (FileId, "    };\n");
520                     }
521                     break;
522                 }
523                 break;
524 
525             default:
526 
527                 /* Don't care about other objects */
528 
529                 break;
530             }
531             break;
532         }
533     }
534 
535     /* These cases do not have a corresponding AML opcode */
536 
537     switch (Op->Asl.ParseOpcode)
538     {
539     case PARSEOP_DEFINITION_BLOCK:
540 
541         /* Always start a definition block at AML offset zero */
542 
543         AslGbl_CurrentAmlOffset = 0;
544         LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId);
545 
546         /* Use the table Signature and TableId to build a unique name */
547 
548         switch (FileId)
549         {
550         case ASL_FILE_ASM_SOURCE_OUTPUT:
551 
552             FlPrintFile (FileId,
553                 "%s_%s_Header \\\n",
554                 AslGbl_TableSignature, AslGbl_TableId);
555             break;
556 
557         case ASL_FILE_C_SOURCE_OUTPUT:
558 
559             FlPrintFile (FileId,
560                 "    unsigned char    %s_%s_Header [] =\n    {\n",
561                 AslGbl_TableSignature, AslGbl_TableId);
562             break;
563 
564         case ASL_FILE_ASM_INCLUDE_OUTPUT:
565 
566             FlPrintFile (FileId,
567                 "extrn %s_%s_Header : byte\n",
568                 AslGbl_TableSignature, AslGbl_TableId);
569             break;
570 
571         case ASL_FILE_C_INCLUDE_OUTPUT:
572 
573             FlPrintFile (FileId,
574                 "extern unsigned char    %s_%s_Header [];\n",
575                 AslGbl_TableSignature, AslGbl_TableId);
576             break;
577 
578         default:
579             break;
580         }
581 
582         return;
583 
584 
585     case PARSEOP_METHODCALL:
586 
587         LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
588             FileId);
589         return;
590 
591 
592     case PARSEOP_INCLUDE:
593 
594         /* Flush everything up to and including the include source line */
595 
596         LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
597             FileId);
598 
599         /* Create a new listing node and push it */
600 
601         LsPushNode (Op->Asl.Value.String);
602         return;
603 
604 
605     case PARSEOP_INCLUDE_END:
606 
607         /* Flush out the rest of the include file */
608 
609         LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
610             FileId);
611 
612         /* Pop off this listing node and go back to the parent file */
613 
614         (void) LsPopNode ();
615         return;
616 
617 
618     case PARSEOP_DEFAULT_ARG:
619 
620         if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
621         {
622             LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine,
623                 FileId);
624         }
625         return;
626 
627 
628     default:
629 
630         /* All other opcodes have an AML opcode */
631 
632         break;
633     }
634 
635     /*
636      * Otherwise, we look at the AML opcode because we can
637      * switch on the opcode type, getting an entire class
638      * at once
639      */
640     switch (OpClass)
641     {
642     case AML_CLASS_ARGUMENT:       /* argument type only */
643     case AML_CLASS_INTERNAL:
644 
645         break;
646 
647     case AML_CLASS_NAMED_OBJECT:
648 
649         switch (Op->Asl.AmlOpcode)
650         {
651         case AML_FIELD_OP:
652         case AML_INDEX_FIELD_OP:
653         case AML_BANK_FIELD_OP:
654             /*
655              * For fields, we want to dump all the AML after the
656              * entire definition
657              */
658             LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
659                 FileId);
660             break;
661 
662         case AML_NAME_OP:
663 
664             if (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC)
665             {
666                 LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
667                     FileId);
668             }
669             else
670             {
671                 /*
672                  * For fields, we want to dump all the AML after the
673                  * entire definition
674                  */
675                 LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
676                     FileId);
677             }
678             break;
679 
680         default:
681 
682             LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
683                 FileId);
684             break;
685         }
686 
687         switch (Op->Asl.AmlOpcode)
688         {
689         case AML_SCOPE_OP:
690         case AML_ALIAS_OP:
691 
692             /* These opcodes do not declare a new object, ignore them */
693 
694             break;
695 
696         default:
697 
698             /* All other named object opcodes come here */
699 
700             switch (FileId)
701             {
702             case ASL_FILE_ASM_SOURCE_OUTPUT:
703             case ASL_FILE_C_SOURCE_OUTPUT:
704             case ASL_FILE_ASM_INCLUDE_OUTPUT:
705             case ASL_FILE_C_INCLUDE_OUTPUT:
706                 /*
707                  * For named objects, we will create a valid symbol so that the
708                  * AML code can be referenced from C or ASM
709                  */
710                 if (Op->Asl.ExternalName)
711                 {
712                     /* Get the full pathname associated with this node */
713 
714                     Pathname = AcpiNsGetExternalPathname (Op->Asl.Node);
715                     Length = strlen (Pathname);
716                     if (Length >= 4)
717                     {
718                         /* Convert all dots in the path to underscores */
719 
720                         for (i = 0; i < Length; i++)
721                         {
722                             if (Pathname[i] == '.')
723                             {
724                                 Pathname[i] = '_';
725                             }
726                         }
727 
728                         /* Create the appropriate symbol in the output file */
729 
730                         switch (FileId)
731                         {
732                         case ASL_FILE_ASM_SOURCE_OUTPUT:
733 
734                             FlPrintFile (FileId,
735                                 "%s_%s_%s  \\\n",
736                                 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]);
737                             break;
738 
739                         case ASL_FILE_C_SOURCE_OUTPUT:
740 
741                             FlPrintFile (FileId,
742                                 "    unsigned char    %s_%s_%s [] =\n    {\n",
743                                 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]);
744                             break;
745 
746                         case ASL_FILE_ASM_INCLUDE_OUTPUT:
747 
748                             FlPrintFile (FileId,
749                                 "extrn %s_%s_%s : byte\n",
750                                 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]);
751                             break;
752 
753                         case ASL_FILE_C_INCLUDE_OUTPUT:
754 
755                             FlPrintFile (FileId,
756                                 "extern unsigned char    %s_%s_%s [];\n",
757                                 AslGbl_TableSignature, AslGbl_TableId, &Pathname[1]);
758                             break;
759 
760                         default:
761                             break;
762                         }
763                     }
764 
765                     ACPI_FREE (Pathname);
766                 }
767                 break;
768 
769             default:
770 
771                 /* Nothing to do for listing file */
772 
773                 break;
774             }
775         }
776         break;
777 
778     case AML_CLASS_EXECUTE:
779     case AML_CLASS_CREATE:
780     default:
781 
782         if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) &&
783             (Op->Asl.CompileFlags & OP_IS_RESOURCE_DESC))
784         {
785             return;
786         }
787 
788         LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
789             FileId);
790         break;
791 
792     case AML_CLASS_UNKNOWN:
793 
794         break;
795     }
796 }
797 
798 
799 /*******************************************************************************
800  *
801  * FUNCTION:    LsFinishSourceListing
802  *
803  * PARAMETERS:  FileId          - ID of current listing file.
804  *
805  * RETURN:      None
806  *
807  * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML
808  *              listing buffer, and flush out any remaining lines in the
809  *              source input file.
810  *
811  ******************************************************************************/
812 
813 static void
814 LsFinishSourceListing (
815     UINT32                  FileId)
816 {
817 
818     if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
819         (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
820     {
821         return;
822     }
823 
824     LsFlushListingBuffer (FileId);
825     AslGbl_CurrentAmlOffset = 0;
826 
827     /* Flush any remaining text in the source file */
828 
829     if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
830     {
831         FlPrintFile (FileId, "    /*\n");
832     }
833 
834     while (LsWriteOneSourceLine (FileId))
835     { ; }
836 
837     if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
838     {
839         FlPrintFile (FileId, "\n     */\n    };\n");
840     }
841 
842     FlPrintFile (FileId, "\n");
843 
844     if (FileId == ASL_FILE_LISTING_OUTPUT)
845     {
846         /* Print a summary of the compile exceptions */
847 
848         FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n");
849         AePrintErrorLog (FileId);
850         FlPrintFile (FileId, "\n");
851         UtDisplayOneSummary (FileId, TRUE);
852         FlPrintFile (FileId, "\n");
853     }
854 }
855