asloptions.c revision 1.1.1.2.2.5 1 /******************************************************************************
2 *
3 * Module Name: asloptions - compiler command line processing
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2016, 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 "acapps.h"
46 #include "acdisasm.h"
47
48 #define _COMPONENT ACPI_COMPILER
49 ACPI_MODULE_NAME ("asloption")
50
51
52 /* Local prototypes */
53
54 static int
55 AslDoOptions (
56 int argc,
57 char **argv,
58 BOOLEAN IsResponseFile);
59
60 static void
61 AslMergeOptionTokens (
62 char *InBuffer,
63 char *OutBuffer);
64
65 static int
66 AslDoResponseFile (
67 char *Filename);
68
69
70 #define ASL_TOKEN_SEPARATORS " \t\n"
71 #define ASL_SUPPORTED_OPTIONS "@:a:b|c|d^D:e:f^gh^i|I:l^m:no|p:P^r:s|t|T+G^v^w|x:z"
72
73
74 /*******************************************************************************
75 *
76 * FUNCTION: AslCommandLine
77 *
78 * PARAMETERS: argc/argv
79 *
80 * RETURN: Last argv index
81 *
82 * DESCRIPTION: Command line processing
83 *
84 ******************************************************************************/
85
86 int
87 AslCommandLine (
88 int argc,
89 char **argv)
90 {
91 int BadCommandLine = 0;
92 ACPI_STATUS Status;
93
94
95 /* Minimum command line contains at least the command and an input file */
96
97 if (argc < 2)
98 {
99 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
100 Usage ();
101 exit (1);
102 }
103
104 /* Process all command line options */
105
106 BadCommandLine = AslDoOptions (argc, argv, FALSE);
107
108 if (Gbl_DoTemplates)
109 {
110 Status = DtCreateTemplates (argv);
111 if (ACPI_FAILURE (Status))
112 {
113 exit (-1);
114 }
115 exit (1);
116 }
117
118 /* Next parameter must be the input filename */
119
120 if (!argv[AcpiGbl_Optind] &&
121 !Gbl_DisasmFlag)
122 {
123 printf ("Missing input filename\n");
124 BadCommandLine = TRUE;
125 }
126
127 if (Gbl_DoSignon)
128 {
129 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
130 if (Gbl_IgnoreErrors)
131 {
132 printf ("Ignoring all errors, forcing AML file generation\n\n");
133 }
134 }
135
136 if (BadCommandLine)
137 {
138 printf ("Use -h option for help information\n");
139 exit (1);
140 }
141
142 return (AcpiGbl_Optind);
143 }
144
145
146 /*******************************************************************************
147 *
148 * FUNCTION: AslDoOptions
149 *
150 * PARAMETERS: argc/argv - Standard argc/argv
151 * IsResponseFile - TRUE if executing a response file.
152 *
153 * RETURN: Status
154 *
155 * DESCRIPTION: Command line option processing
156 *
157 ******************************************************************************/
158
159 static int
160 AslDoOptions (
161 int argc,
162 char **argv,
163 BOOLEAN IsResponseFile)
164 {
165 ACPI_STATUS Status;
166 UINT32 j;
167
168
169 /* Get the command line options */
170
171 while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != ACPI_OPT_END) switch (j)
172 {
173 case '@': /* Begin a response file */
174
175 if (IsResponseFile)
176 {
177 printf ("Nested command files are not supported\n");
178 return (-1);
179 }
180
181 if (AslDoResponseFile (AcpiGbl_Optarg))
182 {
183 return (-1);
184 }
185 break;
186
187 case 'a': /* Debug options */
188
189 switch (AcpiGbl_Optarg[0])
190 {
191 case 'r':
192
193 Gbl_EnableReferenceTypechecking = TRUE;
194 break;
195
196 default:
197
198 printf ("Unknown option: -a%s\n", AcpiGbl_Optarg);
199 return (-1);
200 }
201
202 break;
203
204
205 case 'b': /* Debug options */
206
207 switch (AcpiGbl_Optarg[0])
208 {
209 case 'f':
210
211 AslCompilerdebug = 1; /* same as yydebug */
212 DtParserdebug = 1;
213 PrParserdebug = 1;
214 Gbl_DebugFlag = TRUE;
215 Gbl_KeepPreprocessorTempFile = TRUE;
216 break;
217
218 case 'p': /* Prune ASL parse tree */
219
220 /* Get the required argument */
221
222 if (AcpiGetoptArgument (argc, argv))
223 {
224 return (-1);
225 }
226
227 Gbl_PruneParseTree = TRUE;
228 Gbl_PruneDepth = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
229 break;
230
231 case 's':
232
233 Gbl_DebugFlag = TRUE;
234 break;
235
236 case 't':
237
238 /* Get the required argument */
239
240 if (AcpiGetoptArgument (argc, argv))
241 {
242 return (-1);
243 }
244
245 Gbl_PruneType = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
246 break;
247
248 default:
249
250 printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
251 return (-1);
252 }
253
254 break;
255
256 case 'c':
257
258 switch (AcpiGbl_Optarg[0])
259 {
260 case 'r':
261
262 Gbl_NoResourceChecking = TRUE;
263 break;
264
265 default:
266
267 printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
268 return (-1);
269 }
270 break;
271
272 case 'd': /* Disassembler */
273
274 switch (AcpiGbl_Optarg[0])
275 {
276 case '^':
277
278 Gbl_DoCompile = FALSE;
279 break;
280
281 case 'a':
282
283 Gbl_DoCompile = FALSE;
284 Gbl_DisassembleAll = TRUE;
285 break;
286
287 case 'b': /* Do not convert buffers to resource descriptors */
288
289 AcpiGbl_NoResourceDisassembly = TRUE;
290 break;
291
292 case 'c':
293
294 break;
295
296 case 'f':
297
298 AcpiGbl_ForceAmlDisassembly = TRUE;
299 break;
300
301 case 'l': /* Use legacy ASL code (not ASL+) for disassembly */
302
303 Gbl_DoCompile = FALSE;
304 AcpiGbl_CstyleDisassembly = FALSE;
305 break;
306
307 default:
308
309 printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
310 return (-1);
311 }
312
313 Gbl_DisasmFlag = TRUE;
314 break;
315
316 case 'D': /* Define a symbol */
317
318 PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
319 break;
320
321 case 'e': /* External files for disassembler */
322
323 /* Get entire list of external files */
324
325 AcpiGbl_Optind--;
326 argv[AcpiGbl_Optind] = AcpiGbl_Optarg;
327
328 while (argv[AcpiGbl_Optind] &&
329 (argv[AcpiGbl_Optind][0] != '-'))
330 {
331 Status = AcpiDmAddToExternalFileList (argv[AcpiGbl_Optind]);
332 if (ACPI_FAILURE (Status))
333 {
334 printf ("Could not add %s to external list\n",
335 argv[AcpiGbl_Optind]);
336 return (-1);
337 }
338
339 AcpiGbl_Optind++;
340 }
341 break;
342
343 case 'f':
344
345 switch (AcpiGbl_Optarg[0])
346 {
347 case '^': /* Ignore errors and force creation of aml file */
348
349 Gbl_IgnoreErrors = TRUE;
350 break;
351
352 case 'e': /* Disassembler: Get external declaration file */
353
354 if (AcpiGetoptArgument (argc, argv))
355 {
356 return (-1);
357 }
358
359 Gbl_ExternalRefFilename = AcpiGbl_Optarg;
360 break;
361
362 default:
363
364 printf ("Unknown option: -f%s\n", AcpiGbl_Optarg);
365 return (-1);
366 }
367 break;
368
369 case 'G':
370
371 Gbl_CompileGeneric = TRUE;
372 break;
373
374 case 'g': /* Get all ACPI tables */
375
376 printf ("-g option is deprecated, use acpidump utility instead\n");
377 exit (1);
378
379 case 'h':
380
381 switch (AcpiGbl_Optarg[0])
382 {
383 case '^':
384
385 Usage ();
386 exit (0);
387
388 case 'c':
389
390 UtDisplayConstantOpcodes ();
391 exit (0);
392
393 case 'f':
394
395 AslFilenameHelp ();
396 exit (0);
397
398 case 'r':
399
400 /* reserved names */
401
402 ApDisplayReservedNames ();
403 exit (0);
404
405 case 't':
406
407 UtDisplaySupportedTables ();
408 exit (0);
409
410 default:
411
412 printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
413 return (-1);
414 }
415
416 case 'I': /* Add an include file search directory */
417
418 FlAddIncludeDirectory (AcpiGbl_Optarg);
419 break;
420
421 case 'i': /* Output AML as an include file */
422
423 switch (AcpiGbl_Optarg[0])
424 {
425 case 'a':
426
427 /* Produce assembly code include file */
428
429 Gbl_AsmIncludeOutputFlag = TRUE;
430 break;
431
432 case 'c':
433
434 /* Produce C include file */
435
436 Gbl_C_IncludeOutputFlag = TRUE;
437 break;
438
439 case 'n':
440
441 /* Compiler/Disassembler: Ignore the NOOP operator */
442
443 AcpiGbl_IgnoreNoopOperator = TRUE;
444 break;
445
446 default:
447
448 printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
449 return (-1);
450 }
451 break;
452
453 case 'l': /* Listing files */
454
455 switch (AcpiGbl_Optarg[0])
456 {
457 case '^':
458
459 /* Produce listing file (Mixed source/aml) */
460
461 Gbl_ListingFlag = TRUE;
462 AcpiGbl_DmOpt_Listing = TRUE;
463 break;
464
465 case 'i':
466
467 /* Produce preprocessor output file */
468
469 Gbl_PreprocessorOutputFlag = TRUE;
470 break;
471
472 case 'm':
473
474 /* Produce hardware map summary file */
475
476 Gbl_MapfileFlag = TRUE;
477 break;
478
479 case 'n':
480
481 /* Produce namespace file */
482
483 Gbl_NsOutputFlag = TRUE;
484 break;
485
486 case 's':
487
488 /* Produce combined source file */
489
490 Gbl_SourceOutputFlag = TRUE;
491 break;
492
493 case 'x':
494
495 /* Produce cross-reference file */
496
497 Gbl_CrossReferenceOutput = TRUE;
498 break;
499
500 default:
501
502 printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
503 return (-1);
504 }
505 break;
506
507 case 'm': /* Set line buffer size */
508
509 Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
510 if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
511 {
512 Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
513 }
514 printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
515 break;
516
517 case 'n': /* Parse only */
518
519 Gbl_ParseOnlyFlag = TRUE;
520 break;
521
522 case 'o': /* Control compiler AML optimizations */
523
524 switch (AcpiGbl_Optarg[0])
525 {
526 case 'a':
527
528 /* Disable all optimizations */
529
530 Gbl_FoldConstants = FALSE;
531 Gbl_IntegerOptimizationFlag = FALSE;
532 Gbl_ReferenceOptimizationFlag = FALSE;
533 break;
534
535 case 'c':
536
537 /* Display compile time(s) */
538
539 Gbl_CompileTimesFlag = TRUE;
540 break;
541
542 case 'e':
543
544 /* iASL: Disable External opcode generation */
545
546 Gbl_DoExternals = FALSE;
547
548 /* Disassembler: Emit embedded external operators */
549
550 AcpiGbl_DmEmitExternalOpcodes = TRUE;
551 break;
552
553 case 'f':
554
555 /* Disable folding on "normal" expressions */
556
557 Gbl_FoldConstants = FALSE;
558 break;
559
560 case 'i':
561
562 /* Disable integer optimization to constants */
563
564 Gbl_IntegerOptimizationFlag = FALSE;
565 break;
566
567 case 'n':
568
569 /* Disable named reference optimization */
570
571 Gbl_ReferenceOptimizationFlag = FALSE;
572 break;
573
574 case 't':
575
576 /* Disable heavy typechecking */
577
578 Gbl_DoTypechecking = FALSE;
579 break;
580
581 default:
582
583 printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
584 return (-1);
585 }
586 break;
587
588 case 'P': /* Preprocessor options */
589
590 switch (AcpiGbl_Optarg[0])
591 {
592 case '^': /* Proprocess only, emit (.i) file */
593
594 Gbl_PreprocessOnly = TRUE;
595 Gbl_PreprocessorOutputFlag = TRUE;
596 break;
597
598 case 'n': /* Disable preprocessor */
599
600 Gbl_PreprocessFlag = FALSE;
601 break;
602
603 default:
604
605 printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
606 return (-1);
607 }
608 break;
609
610 case 'p': /* Override default AML output filename */
611
612 Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
613 UtConvertBackslashes (Gbl_OutputFilenamePrefix);
614 Gbl_UseDefaultAmlFilename = FALSE;
615 break;
616
617 case 'r': /* Override revision found in table header */
618
619 Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
620 break;
621
622 case 's': /* Create AML in a source code file */
623
624 switch (AcpiGbl_Optarg[0])
625 {
626 case 'a':
627
628 /* Produce assembly code output file */
629
630 Gbl_AsmOutputFlag = TRUE;
631 break;
632
633 case 'c':
634
635 /* Produce C hex output file */
636
637 Gbl_C_OutputFlag = TRUE;
638 break;
639
640 case 'o':
641
642 /* Produce AML offset table in C */
643
644 Gbl_C_OffsetTableFlag = TRUE;
645 break;
646
647 default:
648
649 printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
650 return (-1);
651 }
652 break;
653
654 case 't': /* Produce hex table output file */
655
656 switch (AcpiGbl_Optarg[0])
657 {
658 case 'a':
659
660 Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
661 break;
662
663 case 'c':
664
665 Gbl_HexOutputFlag = HEX_OUTPUT_C;
666 break;
667
668 case 's':
669
670 Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
671 break;
672
673 default:
674
675 printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
676 return (-1);
677 }
678 break;
679
680 case 'T': /* Create a ACPI table template file */
681
682 Gbl_DoTemplates = TRUE;
683 break;
684
685 case 'v': /* Version and verbosity settings */
686
687 switch (AcpiGbl_Optarg[0])
688 {
689 case '^':
690
691 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
692 exit (0);
693
694 case 'a':
695
696 /* Disable all error/warning/remark messages */
697
698 Gbl_NoErrors = TRUE;
699 break;
700
701 case 'e':
702
703 /* Disable all warning/remark messages (errors only) */
704
705 Gbl_DisplayRemarks = FALSE;
706 Gbl_DisplayWarnings = FALSE;
707 break;
708
709 case 'i':
710 /*
711 * Support for integrated development environment(s).
712 *
713 * 1) No compiler signon
714 * 2) Send stderr messages to stdout
715 * 3) Less verbose error messages (single line only for each)
716 * 4) Error/warning messages are formatted appropriately to
717 * be recognized by MS Visual Studio
718 */
719 Gbl_VerboseErrors = FALSE;
720 Gbl_DoSignon = FALSE;
721 Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
722 break;
723
724 case 'o':
725
726 Gbl_DisplayOptimizations = TRUE;
727 break;
728
729 case 'r':
730
731 Gbl_DisplayRemarks = FALSE;
732 break;
733
734 case 's':
735
736 Gbl_DoSignon = FALSE;
737 break;
738
739 case 't':
740
741 Gbl_VerboseTemplates = TRUE;
742 break;
743
744 case 'w':
745
746 /* Get the required argument */
747
748 if (AcpiGetoptArgument (argc, argv))
749 {
750 return (-1);
751 }
752
753 Status = AslDisableException (AcpiGbl_Optarg);
754 if (ACPI_FAILURE (Status))
755 {
756 return (-1);
757 }
758 break;
759
760 default:
761
762 printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
763 return (-1);
764 }
765 break;
766
767 case 'w': /* Set warning levels */
768
769 switch (AcpiGbl_Optarg[0])
770 {
771 case '1':
772
773 Gbl_WarningLevel = ASL_WARNING;
774 break;
775
776 case '2':
777
778 Gbl_WarningLevel = ASL_WARNING2;
779 break;
780
781 case '3':
782
783 Gbl_WarningLevel = ASL_WARNING3;
784 break;
785
786 case 'e':
787
788 Gbl_WarningsAsErrors = TRUE;
789 break;
790
791 default:
792
793 printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
794 return (-1);
795 }
796 break;
797
798 case 'x': /* Set debug print output level */
799
800 AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
801 break;
802
803 case 'z':
804
805 Gbl_UseOriginalCompilerId = TRUE;
806 break;
807
808 default:
809
810 return (-1);
811 }
812
813 return (0);
814 }
815
816
817 /*******************************************************************************
818 *
819 * FUNCTION: AslMergeOptionTokens
820 *
821 * PARAMETERS: InBuffer - Input containing an option string
822 * OutBuffer - Merged output buffer
823 *
824 * RETURN: None
825 *
826 * DESCRIPTION: Remove all whitespace from an option string.
827 *
828 ******************************************************************************/
829
830 static void
831 AslMergeOptionTokens (
832 char *InBuffer,
833 char *OutBuffer)
834 {
835 char *Token;
836
837
838 *OutBuffer = 0;
839
840 Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
841 while (Token)
842 {
843 strcat (OutBuffer, Token);
844 Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
845 }
846 }
847
848
849 /*******************************************************************************
850 *
851 * FUNCTION: AslDoResponseFile
852 *
853 * PARAMETERS: Filename - Name of the response file
854 *
855 * RETURN: Status
856 *
857 * DESCRIPTION: Open a response file and process all options within.
858 *
859 ******************************************************************************/
860
861 static int
862 AslDoResponseFile (
863 char *Filename)
864 {
865 char *argv = StringBuffer2;
866 FILE *ResponseFile;
867 int OptStatus = 0;
868 int Opterr;
869 int Optind;
870
871
872 ResponseFile = fopen (Filename, "r");
873 if (!ResponseFile)
874 {
875 printf ("Could not open command file %s, %s\n",
876 Filename, strerror (errno));
877 return (-1);
878 }
879
880 /* Must save the current GetOpt globals */
881
882 Opterr = AcpiGbl_Opterr;
883 Optind = AcpiGbl_Optind;
884
885 /*
886 * Process all lines in the response file. There must be one complete
887 * option per line
888 */
889 while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
890 {
891 /* Compress all tokens, allowing us to use a single argv entry */
892
893 AslMergeOptionTokens (StringBuffer, StringBuffer2);
894
895 /* Process the option */
896
897 AcpiGbl_Opterr = 0;
898 AcpiGbl_Optind = 0;
899
900 OptStatus = AslDoOptions (1, &argv, TRUE);
901 if (OptStatus)
902 {
903 printf ("Invalid option in command file %s: %s\n",
904 Filename, StringBuffer);
905 break;
906 }
907 }
908
909 /* Restore the GetOpt globals */
910
911 AcpiGbl_Opterr = Opterr;
912 AcpiGbl_Optind = Optind;
913
914 fclose (ResponseFile);
915 return (OptStatus);
916 }
917