aslcompile.c revision 1.1.1.6 1 /******************************************************************************
2 *
3 * Module Name: aslcompile - top level compile module
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2015, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44 #include "aslcompiler.h"
45 #include "dtcompiler.h"
46 #include "acnamesp.h"
47
48 #include <stdio.h>
49 #include <time.h>
50 #include <acapps.h>
51
52 #define _COMPONENT ACPI_COMPILER
53 ACPI_MODULE_NAME ("aslcompile")
54
55 /*
56 * Main parser entry
57 * External is here in case the parser emits the same external in the
58 * generated header. (Newer versions of Bison)
59 */
60 int
61 AslCompilerparse(
62 void);
63
64 /* Local prototypes */
65
66 static void
67 CmFlushSourceCode (
68 void);
69
70 static void
71 CmDumpAllEvents (
72 void);
73
74
75 /*******************************************************************************
76 *
77 * FUNCTION: CmDoCompile
78 *
79 * PARAMETERS: None
80 *
81 * RETURN: Status (0 = OK)
82 *
83 * DESCRIPTION: This procedure performs the entire compile
84 *
85 ******************************************************************************/
86
87 int
88 CmDoCompile (
89 void)
90 {
91 ACPI_STATUS Status;
92 UINT8 FullCompile;
93 UINT8 Event;
94
95
96 FullCompile = UtBeginEvent ("*** Total Compile time ***");
97 Event = UtBeginEvent ("Open input and output files");
98 UtEndEvent (Event);
99
100 Event = UtBeginEvent ("Preprocess input file");
101 if (Gbl_PreprocessFlag)
102 {
103 /* Enter compiler name as a #define */
104
105 PrAddDefine (ASL_DEFINE, "", FALSE);
106
107 /* Preprocessor */
108
109 PrDoPreprocess ();
110 Gbl_CurrentLineNumber = 1;
111 Gbl_LogicalLineNumber = 1;
112
113 if (Gbl_PreprocessOnly)
114 {
115 UtEndEvent (Event);
116 CmCleanupAndExit ();
117 return (0);
118 }
119 }
120 UtEndEvent (Event);
121
122
123 /* Build the parse tree */
124
125 Event = UtBeginEvent ("Parse source code and build parse tree");
126 AslCompilerparse();
127 UtEndEvent (Event);
128
129 /* Check for parser-detected syntax errors */
130
131 if (Gbl_SyntaxError)
132 {
133 fprintf (stderr, "Compiler aborting due to parser-detected syntax error(s)\n");
134 LsDumpParseTree ();
135 goto ErrorExit;
136 }
137
138 /* Did the parse tree get successfully constructed? */
139
140 if (!RootNode)
141 {
142 /*
143 * If there are no errors, then we have some sort of
144 * internal problem.
145 */
146 AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL,
147 NULL, "- Could not resolve parse tree root node");
148
149 goto ErrorExit;
150 }
151
152 /* Flush out any remaining source after parse tree is complete */
153
154 Event = UtBeginEvent ("Flush source input");
155 CmFlushSourceCode ();
156
157 /* Prune the parse tree if requested (debug purposes only) */
158
159 if (Gbl_PruneParseTree)
160 {
161 AslPruneParseTree (Gbl_PruneDepth, Gbl_PruneType);
162 }
163
164 /* Optional parse tree dump, compiler debug output only */
165
166 LsDumpParseTree ();
167
168 OpcGetIntegerWidth (RootNode);
169 UtEndEvent (Event);
170
171 /* Pre-process parse tree for any operator transforms */
172
173 Event = UtBeginEvent ("Parse tree transforms");
174 DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
175 TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
176 TrAmlTransformWalk, NULL, NULL);
177 UtEndEvent (Event);
178
179 /* Generate AML opcodes corresponding to the parse tokens */
180
181 Event = UtBeginEvent ("Generate AML opcodes");
182 DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating AML opcodes\n\n");
183 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
184 OpcAmlOpcodeWalk, NULL);
185 UtEndEvent (Event);
186
187 /*
188 * Now that the input is parsed, we can open the AML output file.
189 * Note: by default, the name of this file comes from the table descriptor
190 * within the input file.
191 */
192 Event = UtBeginEvent ("Open AML output file");
193 Status = FlOpenAmlOutputFile (Gbl_OutputFilenamePrefix);
194 UtEndEvent (Event);
195 if (ACPI_FAILURE (Status))
196 {
197 AePrintErrorLog (ASL_FILE_STDERR);
198 return (-1);
199 }
200
201 /* Interpret and generate all compile-time constants */
202
203 Event = UtBeginEvent ("Constant folding via AML interpreter");
204 DbgPrint (ASL_DEBUG_OUTPUT,
205 "\nInterpreting compile-time constant expressions\n\n");
206
207 if (Gbl_FoldConstants)
208 {
209 TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
210 OpcAmlConstantWalk, NULL, NULL);
211 }
212 else
213 {
214 DbgPrint (ASL_PARSE_OUTPUT, " Optional folding disabled\n");
215 }
216 UtEndEvent (Event);
217
218 /* Update AML opcodes if necessary, after constant folding */
219
220 Event = UtBeginEvent ("Updating AML opcodes after constant folding");
221 DbgPrint (ASL_DEBUG_OUTPUT,
222 "\nUpdating AML opcodes after constant folding\n\n");
223 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD,
224 NULL, OpcAmlOpcodeUpdateWalk, NULL);
225 UtEndEvent (Event);
226
227 /* Calculate all AML package lengths */
228
229 Event = UtBeginEvent ("Generate AML package lengths");
230 DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");
231 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
232 LnPackageLengthWalk, NULL);
233 UtEndEvent (Event);
234
235 if (Gbl_ParseOnlyFlag)
236 {
237 AePrintErrorLog (ASL_FILE_STDERR);
238 UtDisplaySummary (ASL_FILE_STDERR);
239 if (Gbl_DebugFlag)
240 {
241 /* Print error summary to the stdout also */
242
243 AePrintErrorLog (ASL_FILE_STDOUT);
244 UtDisplaySummary (ASL_FILE_STDOUT);
245 }
246 UtEndEvent (FullCompile);
247 return (0);
248 }
249
250 /*
251 * Create an internal namespace and use it as a symbol table
252 */
253
254 /* Namespace loading */
255
256 Event = UtBeginEvent ("Create ACPI Namespace");
257 Status = LdLoadNamespace (RootNode);
258 UtEndEvent (Event);
259 if (ACPI_FAILURE (Status))
260 {
261 goto ErrorExit;
262 }
263
264 /* Namespace cross-reference */
265
266 AslGbl_NamespaceEvent = UtBeginEvent ("Cross reference parse tree and Namespace");
267 Status = XfCrossReferenceNamespace ();
268 if (ACPI_FAILURE (Status))
269 {
270 goto ErrorExit;
271 }
272
273 /* Namespace - Check for non-referenced objects */
274
275 LkFindUnreferencedObjects ();
276 UtEndEvent (AslGbl_NamespaceEvent);
277
278 /*
279 * Semantic analysis. This can happen only after the
280 * namespace has been loaded and cross-referenced.
281 *
282 * part one - check control methods
283 */
284 Event = UtBeginEvent ("Analyze control method return types");
285 AnalysisWalkInfo.MethodStack = NULL;
286
287 DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method analysis\n\n");
288 TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,
289 MtMethodAnalysisWalkBegin,
290 MtMethodAnalysisWalkEnd, &AnalysisWalkInfo);
291 UtEndEvent (Event);
292
293 /* Semantic error checking part two - typing of method returns */
294
295 Event = UtBeginEvent ("Determine object types returned by methods");
296 DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method typing\n\n");
297 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD,
298 NULL, AnMethodTypingWalkEnd, NULL);
299 UtEndEvent (Event);
300
301 /* Semantic error checking part three - operand type checking */
302
303 Event = UtBeginEvent ("Analyze AML operand types");
304 DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Operand type checking\n\n");
305 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD,
306 NULL, AnOperandTypecheckWalkEnd, &AnalysisWalkInfo);
307 UtEndEvent (Event);
308
309 /* Semantic error checking part four - other miscellaneous checks */
310
311 Event = UtBeginEvent ("Miscellaneous analysis");
312 DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - miscellaneous\n\n");
313 TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
314 AnOtherSemanticAnalysisWalkBegin,
315 NULL, &AnalysisWalkInfo);
316 UtEndEvent (Event);
317
318 /* Calculate all AML package lengths */
319
320 Event = UtBeginEvent ("Finish AML package length generation");
321 DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");
322 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
323 LnInitLengthsWalk, NULL);
324 TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
325 LnPackageLengthWalk, NULL);
326 UtEndEvent (Event);
327
328 /* Code generation - emit the AML */
329
330 Event = UtBeginEvent ("Generate AML code and write output files");
331 CgGenerateAmlOutput ();
332 UtEndEvent (Event);
333
334 Event = UtBeginEvent ("Write optional output files");
335 CmDoOutputFiles ();
336 UtEndEvent (Event);
337
338 UtEndEvent (FullCompile);
339 CmCleanupAndExit ();
340 return (0);
341
342 ErrorExit:
343 UtEndEvent (FullCompile);
344 CmCleanupAndExit ();
345 return (-1);
346 }
347
348
349 /*******************************************************************************
350 *
351 * FUNCTION: AslCompilerSignon
352 *
353 * PARAMETERS: FileId - ID of the output file
354 *
355 * RETURN: None
356 *
357 * DESCRIPTION: Display compiler signon
358 *
359 ******************************************************************************/
360
361 void
362 AslCompilerSignon (
363 UINT32 FileId)
364 {
365 char *Prefix = "";
366 char *UtilityName;
367
368
369 /* Set line prefix depending on the destination file type */
370
371 switch (FileId)
372 {
373 case ASL_FILE_ASM_SOURCE_OUTPUT:
374 case ASL_FILE_ASM_INCLUDE_OUTPUT:
375
376 Prefix = "; ";
377 break;
378
379 case ASL_FILE_HEX_OUTPUT:
380
381 if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
382 {
383 Prefix = "; ";
384 }
385 else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) ||
386 (Gbl_HexOutputFlag == HEX_OUTPUT_ASL))
387 {
388 FlPrintFile (ASL_FILE_HEX_OUTPUT, "/*\n");
389 Prefix = " * ";
390 }
391 break;
392
393 case ASL_FILE_C_SOURCE_OUTPUT:
394 case ASL_FILE_C_OFFSET_OUTPUT:
395 case ASL_FILE_C_INCLUDE_OUTPUT:
396
397 Prefix = " * ";
398 break;
399
400 default:
401
402 /* No other output types supported */
403
404 break;
405 }
406
407 /* Running compiler or disassembler? */
408
409 if (Gbl_DisasmFlag)
410 {
411 UtilityName = AML_DISASSEMBLER_NAME;
412 }
413 else
414 {
415 UtilityName = ASL_COMPILER_NAME;
416 }
417
418 /* Compiler signon with copyright */
419
420 FlPrintFile (FileId, "%s\n", Prefix);
421 FlPrintFile (FileId, ACPI_COMMON_HEADER (UtilityName, Prefix));
422 }
423
424
425 /*******************************************************************************
426 *
427 * FUNCTION: AslCompilerFileHeader
428 *
429 * PARAMETERS: FileId - ID of the output file
430 *
431 * RETURN: None
432 *
433 * DESCRIPTION: Header used at the beginning of output files
434 *
435 ******************************************************************************/
436
437 void
438 AslCompilerFileHeader (
439 UINT32 FileId)
440 {
441 struct tm *NewTime;
442 time_t Aclock;
443 char *Prefix = "";
444
445
446 /* Set line prefix depending on the destination file type */
447
448 switch (FileId)
449 {
450 case ASL_FILE_ASM_SOURCE_OUTPUT:
451 case ASL_FILE_ASM_INCLUDE_OUTPUT:
452
453 Prefix = "; ";
454 break;
455
456 case ASL_FILE_HEX_OUTPUT:
457
458 if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
459 {
460 Prefix = "; ";
461 }
462 else if ((Gbl_HexOutputFlag == HEX_OUTPUT_C) ||
463 (Gbl_HexOutputFlag == HEX_OUTPUT_ASL))
464 {
465 Prefix = " * ";
466 }
467 break;
468
469 case ASL_FILE_C_SOURCE_OUTPUT:
470 case ASL_FILE_C_OFFSET_OUTPUT:
471 case ASL_FILE_C_INCLUDE_OUTPUT:
472
473 Prefix = " * ";
474 break;
475
476 default:
477
478 /* No other output types supported */
479
480 break;
481 }
482
483 /* Compilation header with timestamp */
484
485 (void) time (&Aclock);
486 NewTime = localtime (&Aclock);
487
488 FlPrintFile (FileId,
489 "%sCompilation of \"%s\" - %s%s\n",
490 Prefix, Gbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
491 Prefix);
492
493 switch (FileId)
494 {
495 case ASL_FILE_C_SOURCE_OUTPUT:
496 case ASL_FILE_C_OFFSET_OUTPUT:
497 case ASL_FILE_C_INCLUDE_OUTPUT:
498
499 FlPrintFile (FileId, " */\n");
500 break;
501
502 default:
503
504 /* Nothing to do for other output types */
505
506 break;
507 }
508 }
509
510
511 /*******************************************************************************
512 *
513 * FUNCTION: CmFlushSourceCode
514 *
515 * PARAMETERS: None
516 *
517 * RETURN: None
518 *
519 * DESCRIPTION: Read in any remaining source code after the parse tree
520 * has been constructed.
521 *
522 ******************************************************************************/
523
524 static void
525 CmFlushSourceCode (
526 void)
527 {
528 char Buffer;
529
530
531 while (FlReadFile (ASL_FILE_INPUT, &Buffer, 1) != AE_ERROR)
532 {
533 AslInsertLineBuffer ((int) Buffer);
534 }
535
536 AslResetCurrentLineBuffer ();
537 }
538
539
540 /*******************************************************************************
541 *
542 * FUNCTION: CmDoOutputFiles
543 *
544 * PARAMETERS: None
545 *
546 * RETURN: None.
547 *
548 * DESCRIPTION: Create all "listing" type files
549 *
550 ******************************************************************************/
551
552 void
553 CmDoOutputFiles (
554 void)
555 {
556
557 /* Create listings and hex files */
558
559 LsDoListings ();
560 HxDoHexOutput ();
561
562 /* Dump the namespace to the .nsp file if requested */
563
564 (void) NsDisplayNamespace ();
565
566 /* Dump the device mapping file */
567
568 MpEmitMappingInfo ();
569 }
570
571
572 /*******************************************************************************
573 *
574 * FUNCTION: CmDumpAllEvents
575 *
576 * PARAMETERS: None
577 *
578 * RETURN: None.
579 *
580 * DESCRIPTION: Dump all compiler events
581 *
582 ******************************************************************************/
583
584 static void
585 CmDumpAllEvents (
586 void)
587 {
588 ASL_EVENT_INFO *Event;
589 UINT32 Delta;
590 UINT32 USec;
591 UINT32 MSec;
592 UINT32 i;
593
594
595 Event = AslGbl_Events;
596
597 DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
598 if (Gbl_CompileTimesFlag)
599 {
600 printf ("\nElapsed time for major events\n\n");
601 }
602
603 for (i = 0; i < AslGbl_NextEvent; i++)
604 {
605 if (Event->Valid)
606 {
607 /* Delta will be in 100-nanosecond units */
608
609 Delta = (UINT32) (Event->EndTime - Event->StartTime);
610
611 USec = Delta / ACPI_100NSEC_PER_USEC;
612 MSec = Delta / ACPI_100NSEC_PER_MSEC;
613
614 /* Round milliseconds up */
615
616 if ((USec - (MSec * ACPI_USEC_PER_MSEC)) >= 500)
617 {
618 MSec++;
619 }
620
621 DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
622 USec, MSec, Event->EventName);
623
624 if (Gbl_CompileTimesFlag)
625 {
626 printf ("%8u usec %8u msec - %s\n",
627 USec, MSec, Event->EventName);
628 }
629 }
630
631 Event++;
632 }
633 }
634
635
636 /*******************************************************************************
637 *
638 * FUNCTION: CmCleanupAndExit
639 *
640 * PARAMETERS: None
641 *
642 * RETURN: None.
643 *
644 * DESCRIPTION: Close all open files and exit the compiler
645 *
646 ******************************************************************************/
647
648 void
649 CmCleanupAndExit (
650 void)
651 {
652 UINT32 i;
653 BOOLEAN DeleteAmlFile = FALSE;
654
655
656 AePrintErrorLog (ASL_FILE_STDERR);
657 if (Gbl_DebugFlag)
658 {
659 /* Print error summary to stdout also */
660
661 AePrintErrorLog (ASL_FILE_STDOUT);
662 }
663
664 /* Emit compile times if enabled */
665
666 CmDumpAllEvents ();
667
668 if (Gbl_CompileTimesFlag)
669 {
670 printf ("\nMiscellaneous compile statistics\n\n");
671 printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
672 printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
673 printf ("%11u : %s\n", TotalNamedObjects, "Named objects");
674 printf ("%11u : %s\n", TotalMethods, "Control methods");
675 printf ("%11u : %s\n", TotalAllocations, "Memory Allocations");
676 printf ("%11u : %s\n", TotalAllocated, "Total allocated memory");
677 printf ("%11u : %s\n", TotalFolds, "Constant subtrees folded");
678 printf ("\n");
679 }
680
681 if (Gbl_NsLookupCount)
682 {
683 DbgPrint (ASL_DEBUG_OUTPUT,
684 "\n\nMiscellaneous compile statistics\n\n");
685
686 DbgPrint (ASL_DEBUG_OUTPUT,
687 "%32s : %u\n", "Total Namespace searches",
688 Gbl_NsLookupCount);
689
690 DbgPrint (ASL_DEBUG_OUTPUT,
691 "%32s : %u usec\n", "Time per search", ((UINT32)
692 (AslGbl_Events[AslGbl_NamespaceEvent].EndTime -
693 AslGbl_Events[AslGbl_NamespaceEvent].StartTime) / 10) /
694 Gbl_NsLookupCount);
695 }
696
697 if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
698 {
699 printf ("\nMaximum error count (%u) exceeded\n",
700 ASL_MAX_ERROR_COUNT);
701 }
702
703 UtDisplaySummary (ASL_FILE_STDOUT);
704
705 /*
706 * We will delete the AML file if there are errors and the
707 * force AML output option has not been used.
708 */
709 if ((Gbl_ExceptionCount[ASL_ERROR] > 0) &&
710 (!Gbl_IgnoreErrors) &&
711 Gbl_Files[ASL_FILE_AML_OUTPUT].Handle)
712 {
713 DeleteAmlFile = TRUE;
714 }
715
716 /* Close all open files */
717
718 /*
719 * Take care with the preprocessor file (.pre), it might be the same
720 * as the "input" file, depending on where the compiler has terminated
721 * or aborted. Prevent attempt to close the same file twice in
722 * loop below.
723 */
724 if (Gbl_Files[ASL_FILE_PREPROCESSOR].Handle ==
725 Gbl_Files[ASL_FILE_INPUT].Handle)
726 {
727 Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL;
728 }
729
730 /* Close the standard I/O files */
731
732 for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
733 {
734 FlCloseFile (i);
735 }
736
737 /* Delete AML file if there are errors */
738
739 if (DeleteAmlFile)
740 {
741 FlDeleteFile (ASL_FILE_AML_OUTPUT);
742 }
743
744 /* Delete the preprocessor temp file unless full debug was specified */
745
746 if (Gbl_PreprocessFlag && !Gbl_KeepPreprocessorTempFile)
747 {
748 FlDeleteFile (ASL_FILE_PREPROCESSOR);
749 }
750
751 /*
752 * Delete intermediate ("combined") source file (if -ls flag not set)
753 * This file is created during normal ASL/AML compiles. It is not
754 * created by the data table compiler.
755 *
756 * If the -ls flag is set, then the .SRC file should not be deleted.
757 * In this case, Gbl_SourceOutputFlag is set to TRUE.
758 *
759 * Note: Handles are cleared by FlCloseFile above, so we look at the
760 * filename instead, to determine if the .SRC file was actually
761 * created.
762 */
763 if (!Gbl_SourceOutputFlag)
764 {
765 FlDeleteFile (ASL_FILE_SOURCE_OUTPUT);
766 }
767
768 /* Final cleanup after compiling one file */
769
770 CmDeleteCaches ();
771 }
772
773
774 /*******************************************************************************
775 *
776 * FUNCTION: CmDeleteCaches
777 *
778 * PARAMETERS: None
779 *
780 * RETURN: None
781 *
782 * DESCRIPTION: Delete all local cache buffer blocks
783 *
784 ******************************************************************************/
785
786 void
787 CmDeleteCaches (
788 void)
789 {
790 UINT32 BufferCount;
791 ASL_CACHE_INFO *Next;
792
793
794 /* Parse Op cache */
795
796 BufferCount = 0;
797 while (Gbl_ParseOpCacheList)
798 {
799 Next = Gbl_ParseOpCacheList->Next;
800 ACPI_FREE (Gbl_ParseOpCacheList);
801 Gbl_ParseOpCacheList = Next;
802 BufferCount++;
803 }
804
805 DbgPrint (ASL_DEBUG_OUTPUT,
806 "%u ParseOps, Buffer size: %u ops (%u bytes), %u Buffers\n",
807 Gbl_ParseOpCount, ASL_PARSEOP_CACHE_SIZE,
808 (sizeof (ACPI_PARSE_OBJECT) * ASL_PARSEOP_CACHE_SIZE), BufferCount);
809
810 Gbl_ParseOpCount = 0;
811 Gbl_ParseOpCacheNext = NULL;
812 Gbl_ParseOpCacheLast = NULL;
813 RootNode = NULL;
814
815 /* Generic string cache */
816
817 BufferCount = 0;
818 while (Gbl_StringCacheList)
819 {
820 Next = Gbl_StringCacheList->Next;
821 ACPI_FREE (Gbl_StringCacheList);
822 Gbl_StringCacheList = Next;
823 BufferCount++;
824 }
825
826 DbgPrint (ASL_DEBUG_OUTPUT,
827 "%u Strings (%u bytes), Buffer size: %u bytes, %u Buffers\n",
828 Gbl_StringCount, Gbl_StringSize, ASL_STRING_CACHE_SIZE, BufferCount);
829
830 Gbl_StringSize = 0;
831 Gbl_StringCount = 0;
832 Gbl_StringCacheNext = NULL;
833 Gbl_StringCacheLast = NULL;
834 }
835