aslmain.c revision 228110
1118611Snjl
2118611Snjl/******************************************************************************
3118611Snjl *
4118611Snjl * Module Name: aslmain - compiler main and utilities
5118611Snjl *
6118611Snjl *****************************************************************************/
7118611Snjl
8217365Sjkim/*
9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
10118611Snjl * All rights reserved.
11118611Snjl *
12217365Sjkim * Redistribution and use in source and binary forms, with or without
13217365Sjkim * modification, are permitted provided that the following conditions
14217365Sjkim * are met:
15217365Sjkim * 1. Redistributions of source code must retain the above copyright
16217365Sjkim *    notice, this list of conditions, and the following disclaimer,
17217365Sjkim *    without modification.
18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
20217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
21217365Sjkim *    including a substantially similar Disclaimer requirement for further
22217365Sjkim *    binary redistribution.
23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
24217365Sjkim *    of any contributors may be used to endorse or promote products derived
25217365Sjkim *    from this software without specific prior written permission.
26118611Snjl *
27217365Sjkim * Alternatively, this software may be distributed under the terms of the
28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
29217365Sjkim * Software Foundation.
30118611Snjl *
31217365Sjkim * NO WARRANTY
32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
43217365Sjkim */
44118611Snjl
45118611Snjl
46118611Snjl#define _DECLARE_GLOBALS
47118611Snjl
48151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
49193529Sjkim#include <contrib/dev/acpica/include/acapps.h>
50210976Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
51118611Snjl
52118611Snjl#ifdef _DEBUG
53118611Snjl#include <crtdbg.h>
54118611Snjl#endif
55118611Snjl
56118611Snjl#define _COMPONENT          ACPI_COMPILER
57118611Snjl        ACPI_MODULE_NAME    ("aslmain")
58118611Snjl
59151937Sjkim/* Local prototypes */
60118611Snjl
61151937Sjkimstatic void
62151937SjkimOptions (
63151937Sjkim    void);
64151937Sjkim
65151937Sjkimstatic void
66151937SjkimHelpMessage (
67151937Sjkim    void);
68151937Sjkim
69151937Sjkimstatic void
70151937SjkimUsage (
71151937Sjkim    void);
72151937Sjkim
73151937Sjkimstatic void
74151937SjkimAslInitialize (
75151937Sjkim    void);
76151937Sjkim
77193529Sjkimstatic int
78151937SjkimAslCommandLine (
79151937Sjkim    int                     argc,
80151937Sjkim    char                    **argv);
81151937Sjkim
82197104Sjkimstatic int
83197104SjkimAslDoOptions (
84197104Sjkim    int                     argc,
85197104Sjkim    char                    **argv,
86197104Sjkim    BOOLEAN                 IsResponseFile);
87151937Sjkim
88197104Sjkimstatic void
89197104SjkimAslMergeOptionTokens (
90197104Sjkim    char                    *InBuffer,
91197104Sjkim    char                    *OutBuffer);
92197104Sjkim
93197104Sjkimstatic int
94197104SjkimAslDoResponseFile (
95197104Sjkim    char                    *Filename);
96197104Sjkim
97197104Sjkim
98197104Sjkim#define ASL_TOKEN_SEPARATORS    " \t\n"
99228110Sjkim#define ASL_SUPPORTED_OPTIONS   "@:2b:c:d^e:fgh^i^I:l^mno:p:r:s:t:T:G^v:w:x:z"
100197104Sjkim
101197104Sjkim
102118611Snjl/*******************************************************************************
103118611Snjl *
104118611Snjl * FUNCTION:    Options
105118611Snjl *
106118611Snjl * PARAMETERS:  None
107118611Snjl *
108118611Snjl * RETURN:      None
109118611Snjl *
110118611Snjl * DESCRIPTION: Display option help message
111118611Snjl *
112118611Snjl ******************************************************************************/
113118611Snjl
114151937Sjkimstatic void
115118611SnjlOptions (
116118611Snjl    void)
117118611Snjl{
118118611Snjl
119228110Sjkim    printf ("\nGlobal:\n");
120228110Sjkim    ACPI_OPTION ("-@ <file>",       "Specify command file");
121228110Sjkim    ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
122197104Sjkim
123197104Sjkim    printf ("\nGeneral Output:\n");
124228110Sjkim    ACPI_OPTION ("-p <prefix>",     "Specify path/filename prefix for all output files");
125228110Sjkim    ACPI_OPTION ("-va",             "Disable all errors and warnings (summary only)");
126228110Sjkim    ACPI_OPTION ("-vi",             "Less verbose errors and warnings for use with IDEs");
127228110Sjkim    ACPI_OPTION ("-vo",             "Enable optimization comments");
128228110Sjkim    ACPI_OPTION ("-vr",             "Disable remarks");
129228110Sjkim    ACPI_OPTION ("-vs",             "Disable signon");
130228110Sjkim    ACPI_OPTION ("-w <1|2|3>",      "Set warning reporting level");
131118611Snjl
132138287Smarks    printf ("\nAML Output Files:\n");
133228110Sjkim    ACPI_OPTION ("-s <a|c>",        "Create AML in assembler or C source file (*.asm or *.c)");
134228110Sjkim    ACPI_OPTION ("-i <a|c>",        "Create assembler or C include file (*.inc or *.h)");
135228110Sjkim    ACPI_OPTION ("-t <a|c|s>",      "Create AML in assembler, C, or ASL hex table (*.hex)");
136118611Snjl
137138287Smarks    printf ("\nAML Code Generation:\n");
138228110Sjkim    ACPI_OPTION ("-oa",             "Disable all optimizations (compatibility mode)");
139228110Sjkim    ACPI_OPTION ("-of",             "Disable constant folding");
140228110Sjkim    ACPI_OPTION ("-oi",             "Disable integer optimization to Zero/One/Ones");
141228110Sjkim    ACPI_OPTION ("-on",             "Disable named reference string optimization");
142228110Sjkim    ACPI_OPTION ("-cr",             "Disable Resource Descriptor error checking");
143228110Sjkim    ACPI_OPTION ("-r <revision>",   "Override table header Revision (1-255)");
144118611Snjl
145212761Sjkim    printf ("\nASL Listing Files:\n");
146228110Sjkim    ACPI_OPTION ("-l",              "Create mixed listing file (ASL source and AML) (*.lst)");
147228110Sjkim    ACPI_OPTION ("-ln",             "Create namespace file (*.nsp)");
148228110Sjkim    ACPI_OPTION ("-ls",             "Create combined source file (expanded includes) (*.src)");
149118611Snjl
150209746Sjkim    printf ("\nACPI Data Tables:\n");
151228110Sjkim    ACPI_OPTION ("-G",              "Compile custom table containing generic operators");
152228110Sjkim    ACPI_OPTION ("-T <sig>|ALL|*",  "Create table template file(s) for <Sig>");
153228110Sjkim    ACPI_OPTION ("-vt",             "Create verbose templates (full disassembly)");
154209746Sjkim
155118611Snjl    printf ("\nAML Disassembler:\n");
156228110Sjkim    ACPI_OPTION ("-d  [file]",      "Disassemble or decode binary ACPI table to file (*.dsl)");
157228110Sjkim    ACPI_OPTION ("-da [f1,f2]",     "Disassemble multiple tables from single namespace");
158228110Sjkim    ACPI_OPTION ("-dc [file]",      "Disassemble AML and immediately compile it");
159228110Sjkim    ACPI_OPTION ("",                "(Obtain DSDT from current system if no input file)");
160228110Sjkim    ACPI_OPTION ("-e  [f1,f2]",     "Include ACPI table(s) for external symbol resolution");
161228110Sjkim    ACPI_OPTION ("-m",              "Do not translate Buffers to Resource Templates");
162228110Sjkim    ACPI_OPTION ("-2",              "Emit ACPI 2.0 compatible ASL code");
163228110Sjkim    ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
164118611Snjl
165118611Snjl    printf ("\nHelp:\n");
166228110Sjkim    ACPI_OPTION ("-h",              "Additional help and compiler debug options");
167228110Sjkim    ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
168228110Sjkim    ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
169228110Sjkim    ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
170118611Snjl}
171118611Snjl
172118611Snjl
173118611Snjl/*******************************************************************************
174118611Snjl *
175151937Sjkim * FUNCTION:    HelpMessage
176118611Snjl *
177118611Snjl * PARAMETERS:  None
178118611Snjl *
179118611Snjl * RETURN:      None
180118611Snjl *
181118611Snjl * DESCRIPTION: Display help message
182118611Snjl *
183118611Snjl ******************************************************************************/
184118611Snjl
185151937Sjkimstatic void
186118611SnjlHelpMessage (
187118611Snjl    void)
188118611Snjl{
189118611Snjl
190228110Sjkim    printf ("\nAML output filename generation:\n");
191118611Snjl    printf ("  Output filenames are generated by appending an extension to a common\n");
192118611Snjl    printf ("  filename prefix.  The filename prefix is obtained via one of the\n");
193118611Snjl    printf ("  following methods (in priority order):\n");
194118611Snjl    printf ("    1) The -p option specifies the prefix\n");
195118611Snjl    printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
196118611Snjl    printf ("    3) The prefix of the input filename\n");
197118611Snjl    printf ("\n");
198118611Snjl
199118611Snjl    Options ();
200118611Snjl
201167802Sjkim    printf ("\nCompiler/Disassembler Debug Options:\n");
202228110Sjkim    ACPI_OPTION ("-b<p|t|b>",       "Create compiler debug/trace file (*.txt)");
203228110Sjkim    ACPI_OPTION ("",                "Types: Parse/Tree/Both");
204228110Sjkim    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
205228110Sjkim    ACPI_OPTION ("-n",              "Parse only, no output generation");
206228110Sjkim    ACPI_OPTION ("-ot",             "Display compile times");
207228110Sjkim    ACPI_OPTION ("-x<level>",       "Set debug level for trace output");
208228110Sjkim    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
209118611Snjl}
210118611Snjl
211118611Snjl
212118611Snjl/*******************************************************************************
213118611Snjl *
214118611Snjl * FUNCTION:    Usage
215118611Snjl *
216118611Snjl * PARAMETERS:  None
217118611Snjl *
218118611Snjl * RETURN:      None
219118611Snjl *
220118611Snjl * DESCRIPTION: Display usage and option message
221118611Snjl *
222118611Snjl ******************************************************************************/
223118611Snjl
224151937Sjkimstatic void
225118611SnjlUsage (
226118611Snjl    void)
227118611Snjl{
228118611Snjl
229228110Sjkim    printf ("%s\n\n", ASL_COMPLIANCE);
230228110Sjkim    ACPI_USAGE_HEADER ("iasl [Options] [Files]");
231118611Snjl    Options ();
232118611Snjl}
233118611Snjl
234118611Snjl
235118611Snjl/*******************************************************************************
236118611Snjl *
237118611Snjl * FUNCTION:    AslInitialize
238118611Snjl *
239118611Snjl * PARAMETERS:  None
240118611Snjl *
241118611Snjl * RETURN:      None
242118611Snjl *
243118611Snjl * DESCRIPTION: Initialize compiler globals
244118611Snjl *
245118611Snjl ******************************************************************************/
246118611Snjl
247151937Sjkimstatic void
248151937SjkimAslInitialize (
249151937Sjkim    void)
250118611Snjl{
251118611Snjl    UINT32                  i;
252118611Snjl
253118611Snjl
254118611Snjl#ifdef _DEBUG
255118611Snjl    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
256118611Snjl#endif
257118611Snjl
258118611Snjl    AcpiDbgLevel = 0;
259118611Snjl
260118611Snjl    for (i = 0; i < ASL_NUM_FILES; i++)
261118611Snjl    {
262118611Snjl        Gbl_Files[i].Handle = NULL;
263118611Snjl        Gbl_Files[i].Filename = NULL;
264118611Snjl    }
265118611Snjl
266118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
267118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
268118611Snjl
269118611Snjl    Gbl_Files[ASL_FILE_STDERR].Handle   = stderr;
270118611Snjl    Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
271118611Snjl}
272118611Snjl
273118611Snjl
274118611Snjl/*******************************************************************************
275118611Snjl *
276197104Sjkim * FUNCTION:    AslMergeOptionTokens
277118611Snjl *
278197104Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
279197104Sjkim *              OutBuffer           - Merged output buffer
280118611Snjl *
281118611Snjl * RETURN:      None
282118611Snjl *
283197104Sjkim * DESCRIPTION: Remove all whitespace from an option string.
284118611Snjl *
285118611Snjl ******************************************************************************/
286118611Snjl
287197104Sjkimstatic void
288197104SjkimAslMergeOptionTokens (
289197104Sjkim    char                    *InBuffer,
290197104Sjkim    char                    *OutBuffer)
291197104Sjkim{
292197104Sjkim    char                    *Token;
293197104Sjkim
294197104Sjkim
295197104Sjkim    *OutBuffer = 0;
296197104Sjkim
297197104Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
298197104Sjkim    while (Token)
299197104Sjkim    {
300197104Sjkim        strcat (OutBuffer, Token);
301197104Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
302197104Sjkim    }
303197104Sjkim}
304197104Sjkim
305197104Sjkim
306197104Sjkim/*******************************************************************************
307197104Sjkim *
308197104Sjkim * FUNCTION:    AslDoResponseFile
309197104Sjkim *
310197104Sjkim * PARAMETERS:  Filename        - Name of the response file
311197104Sjkim *
312197104Sjkim * RETURN:      Status
313197104Sjkim *
314197104Sjkim * DESCRIPTION: Open a response file and process all options within.
315197104Sjkim *
316197104Sjkim ******************************************************************************/
317197104Sjkim
318193529Sjkimstatic int
319197104SjkimAslDoResponseFile (
320197104Sjkim    char                    *Filename)
321118611Snjl{
322197104Sjkim    char                    *argv = StringBuffer2;
323197104Sjkim    FILE                    *ResponseFile;
324197104Sjkim    int                     OptStatus = 0;
325197104Sjkim    int                     Opterr;
326197104Sjkim    int                     Optind;
327118611Snjl
328118611Snjl
329197104Sjkim    ResponseFile = fopen (Filename, "r");
330197104Sjkim    if (!ResponseFile)
331197104Sjkim    {
332197104Sjkim        printf ("Could not open command file %s, %s\n",
333197104Sjkim            Filename, strerror (errno));
334197104Sjkim        return -1;
335197104Sjkim    }
336118611Snjl
337197104Sjkim    /* Must save the current GetOpt globals */
338197104Sjkim
339197104Sjkim    Opterr = AcpiGbl_Opterr;
340197104Sjkim    Optind = AcpiGbl_Optind;
341197104Sjkim
342197104Sjkim    /*
343197104Sjkim     * Process all lines in the response file. There must be one complete
344197104Sjkim     * option per line
345197104Sjkim     */
346197104Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
347118611Snjl    {
348197104Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
349197104Sjkim
350197104Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
351197104Sjkim
352197104Sjkim        /* Process the option */
353197104Sjkim
354197104Sjkim        AcpiGbl_Opterr = 0;
355197104Sjkim        AcpiGbl_Optind = 0;
356197104Sjkim
357197104Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
358197104Sjkim        if (OptStatus)
359197104Sjkim        {
360197104Sjkim            printf ("Invalid option in command file %s: %s\n",
361197104Sjkim                Filename, StringBuffer);
362197104Sjkim            break;
363197104Sjkim        }
364118611Snjl    }
365118611Snjl
366197104Sjkim    /* Restore the GetOpt globals */
367197104Sjkim
368197104Sjkim    AcpiGbl_Opterr = Opterr;
369197104Sjkim    AcpiGbl_Optind = Optind;
370197104Sjkim
371197104Sjkim    fclose (ResponseFile);
372197104Sjkim    return (OptStatus);
373197104Sjkim}
374197104Sjkim
375197104Sjkim
376197104Sjkim/*******************************************************************************
377197104Sjkim *
378197104Sjkim * FUNCTION:    AslDoOptions
379197104Sjkim *
380197104Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
381197104Sjkim *              IsResponseFile      - TRUE if executing a response file.
382197104Sjkim *
383197104Sjkim * RETURN:      Status
384197104Sjkim *
385197104Sjkim * DESCRIPTION: Command line option processing
386197104Sjkim *
387197104Sjkim ******************************************************************************/
388197104Sjkim
389197104Sjkimstatic int
390197104SjkimAslDoOptions (
391197104Sjkim    int                     argc,
392197104Sjkim    char                    **argv,
393197104Sjkim    BOOLEAN                 IsResponseFile)
394197104Sjkim{
395197104Sjkim    int                     j;
396212761Sjkim    ACPI_STATUS             Status;
397197104Sjkim
398197104Sjkim
399118611Snjl    /* Get the command line options */
400118611Snjl
401197104Sjkim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
402118611Snjl    {
403197104Sjkim    case '@':   /* Begin a response file */
404197104Sjkim
405197104Sjkim        if (IsResponseFile)
406197104Sjkim        {
407197104Sjkim            printf ("Nested command files are not supported\n");
408197104Sjkim            return -1;
409197104Sjkim        }
410197104Sjkim
411197104Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
412197104Sjkim        {
413197104Sjkim            return -1;
414197104Sjkim        }
415197104Sjkim        break;
416197104Sjkim
417197104Sjkim
418151937Sjkim    case '2':
419197104Sjkim
420151937Sjkim        Gbl_Acpi2 = TRUE;
421151937Sjkim        break;
422151937Sjkim
423151937Sjkim
424118611Snjl    case 'b':
425118611Snjl
426118611Snjl        switch (AcpiGbl_Optarg[0])
427118611Snjl        {
428118611Snjl        case 'b':
429118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
430220663Sjkim            DtParserdebug = 1;
431118611Snjl            break;
432118611Snjl
433118611Snjl        case 'p':
434118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
435220663Sjkim            DtParserdebug = 1;
436118611Snjl            break;
437118611Snjl
438118611Snjl        case 't':
439118611Snjl            break;
440118611Snjl
441118611Snjl        default:
442118611Snjl            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
443197104Sjkim            return (-1);
444118611Snjl        }
445118611Snjl
446118611Snjl        /* Produce debug output file */
447118611Snjl
448118611Snjl        Gbl_DebugFlag = TRUE;
449118611Snjl        break;
450118611Snjl
451118611Snjl
452118611Snjl    case 'c':
453207344Sjkim        switch (AcpiGbl_Optarg[0])
454207344Sjkim        {
455207344Sjkim        case 'r':
456207344Sjkim            Gbl_NoResourceChecking = TRUE;
457207344Sjkim            break;
458118611Snjl
459207344Sjkim        default:
460207344Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
461207344Sjkim            return (-1);
462207344Sjkim        }
463118611Snjl        break;
464118611Snjl
465118611Snjl
466118611Snjl    case 'd':
467118611Snjl        switch (AcpiGbl_Optarg[0])
468118611Snjl        {
469118611Snjl        case '^':
470193529Sjkim            Gbl_DoCompile = FALSE;
471118611Snjl            break;
472118611Snjl
473210976Sjkim        case 'a':
474210976Sjkim            Gbl_DoCompile = FALSE;
475210976Sjkim            Gbl_DisassembleAll = TRUE;
476210976Sjkim            break;
477210976Sjkim
478118611Snjl        case 'c':
479118611Snjl            break;
480118611Snjl
481118611Snjl        default:
482118611Snjl            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
483197104Sjkim            return (-1);
484118611Snjl        }
485118611Snjl
486118611Snjl        Gbl_DisasmFlag = TRUE;
487118611Snjl        break;
488118611Snjl
489118611Snjl
490118611Snjl    case 'e':
491212761Sjkim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
492212761Sjkim        if (ACPI_FAILURE (Status))
493212761Sjkim        {
494212761Sjkim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
495212761Sjkim            return (-1);
496212761Sjkim        }
497118611Snjl        break;
498118611Snjl
499118611Snjl
500118611Snjl    case 'f':
501118611Snjl
502118611Snjl        /* Ignore errors and force creation of aml file */
503118611Snjl
504118611Snjl        Gbl_IgnoreErrors = TRUE;
505118611Snjl        break;
506118611Snjl
507118611Snjl
508118611Snjl    case 'g':
509118611Snjl
510118611Snjl        /* Get all ACPI tables */
511118611Snjl
512118611Snjl        Gbl_GetAllTables = TRUE;
513193529Sjkim        Gbl_DoCompile = FALSE;
514118611Snjl        break;
515118611Snjl
516118611Snjl
517118611Snjl    case 'h':
518118611Snjl
519118611Snjl        switch (AcpiGbl_Optarg[0])
520118611Snjl        {
521118611Snjl        case '^':
522118611Snjl            HelpMessage ();
523118611Snjl            exit (0);
524118611Snjl
525118611Snjl        case 'c':
526118611Snjl            UtDisplayConstantOpcodes ();
527118611Snjl            exit (0);
528118611Snjl
529118611Snjl        case 'r':
530118611Snjl            /* reserved names */
531118611Snjl
532204773Sjkim            ApDisplayReservedNames ();
533118611Snjl            exit (0);
534118611Snjl
535209746Sjkim        case 't':
536209746Sjkim            UtDisplaySupportedTables ();
537209746Sjkim            exit (0);
538209746Sjkim
539118611Snjl        default:
540118611Snjl            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
541197104Sjkim            return (-1);
542118611Snjl        }
543118611Snjl
544118611Snjl
545197104Sjkim    case 'I': /* Add an include file search directory */
546197104Sjkim
547197104Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
548197104Sjkim        break;
549197104Sjkim
550197104Sjkim
551118611Snjl    case 'i':
552118611Snjl
553118611Snjl        switch (AcpiGbl_Optarg[0])
554118611Snjl        {
555118611Snjl        case 'a':
556118611Snjl
557118611Snjl            /* Produce assembly code include file */
558118611Snjl
559118611Snjl            Gbl_AsmIncludeOutputFlag = TRUE;
560118611Snjl            break;
561118611Snjl
562118611Snjl        case 'c':
563118611Snjl
564118611Snjl            /* Produce C include file */
565118611Snjl
566118611Snjl            Gbl_C_IncludeOutputFlag = TRUE;
567118611Snjl            break;
568118611Snjl
569118611Snjl        default:
570118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
571197104Sjkim            return (-1);
572118611Snjl        }
573118611Snjl        break;
574118611Snjl
575118611Snjl
576118611Snjl    case 'l':
577118611Snjl
578118611Snjl        switch (AcpiGbl_Optarg[0])
579118611Snjl        {
580118611Snjl        case '^':
581118611Snjl            /* Produce listing file (Mixed source/aml) */
582118611Snjl
583118611Snjl            Gbl_ListingFlag = TRUE;
584118611Snjl            break;
585118611Snjl
586118611Snjl        case 'n':
587118611Snjl            /* Produce namespace file */
588118611Snjl
589118611Snjl            Gbl_NsOutputFlag = TRUE;
590118611Snjl            break;
591118611Snjl
592118611Snjl        case 's':
593118611Snjl            /* Produce combined source file */
594118611Snjl
595118611Snjl            Gbl_SourceOutputFlag = TRUE;
596118611Snjl            break;
597118611Snjl
598118611Snjl        default:
599118611Snjl            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
600197104Sjkim            return (-1);
601118611Snjl        }
602118611Snjl        break;
603118611Snjl
604118611Snjl
605228110Sjkim    case 'm':
606228110Sjkim
607228110Sjkim        AcpiGbl_NoResourceDisassembly = TRUE;
608228110Sjkim        break;
609228110Sjkim
610228110Sjkim
611228110Sjkim    case 'n':
612228110Sjkim
613228110Sjkim        /* Parse only */
614228110Sjkim
615228110Sjkim        Gbl_ParseOnlyFlag = TRUE;
616228110Sjkim        break;
617228110Sjkim
618228110Sjkim
619118611Snjl    case 'o':
620118611Snjl
621118611Snjl        switch (AcpiGbl_Optarg[0])
622118611Snjl        {
623118611Snjl        case 'a':
624118611Snjl
625118611Snjl            /* Disable all optimizations */
626118611Snjl
627118611Snjl            Gbl_FoldConstants = FALSE;
628118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
629118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
630118611Snjl            break;
631118611Snjl
632118611Snjl        case 'f':
633118611Snjl
634118611Snjl            /* Disable folding on "normal" expressions */
635118611Snjl
636118611Snjl            Gbl_FoldConstants = FALSE;
637118611Snjl            break;
638118611Snjl
639118611Snjl        case 'i':
640118611Snjl
641118611Snjl            /* Disable integer optimization to constants */
642118611Snjl
643118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
644118611Snjl            break;
645118611Snjl
646118611Snjl        case 'n':
647118611Snjl
648118611Snjl            /* Disable named reference optimization */
649118611Snjl
650118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
651118611Snjl            break;
652118611Snjl
653118611Snjl        case 't':
654118611Snjl
655118611Snjl            /* Display compile time(s) */
656118611Snjl
657118611Snjl            Gbl_CompileTimesFlag = TRUE;
658118611Snjl            break;
659118611Snjl
660118611Snjl        default:
661118611Snjl            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
662197104Sjkim            return (-1);
663118611Snjl        }
664118611Snjl        break;
665118611Snjl
666118611Snjl
667118611Snjl    case 'p':
668118611Snjl
669118611Snjl        /* Override default AML output filename */
670118611Snjl
671118611Snjl        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
672118611Snjl        Gbl_UseDefaultAmlFilename = FALSE;
673118611Snjl        break;
674118611Snjl
675118611Snjl
676118611Snjl    case 'r':
677138287Smarks        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
678118611Snjl        break;
679118611Snjl
680118611Snjl
681118611Snjl    case 's':
682118611Snjl
683118611Snjl        switch (AcpiGbl_Optarg[0])
684118611Snjl        {
685118611Snjl        case 'a':
686118611Snjl
687118611Snjl            /* Produce assembly code output file */
688118611Snjl
689118611Snjl            Gbl_AsmOutputFlag = TRUE;
690118611Snjl            break;
691118611Snjl
692118611Snjl        case 'c':
693118611Snjl
694118611Snjl            /* Produce C hex output file */
695118611Snjl
696118611Snjl            Gbl_C_OutputFlag = TRUE;
697118611Snjl            break;
698118611Snjl
699118611Snjl        default:
700118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
701197104Sjkim            return (-1);
702118611Snjl        }
703118611Snjl        break;
704118611Snjl
705118611Snjl
706118611Snjl    case 't':
707118611Snjl
708118611Snjl        /* Produce hex table output file */
709118611Snjl
710118611Snjl        switch (AcpiGbl_Optarg[0])
711118611Snjl        {
712118611Snjl        case 'a':
713118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
714118611Snjl            break;
715118611Snjl
716118611Snjl        case 'c':
717118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_C;
718118611Snjl            break;
719118611Snjl
720207344Sjkim        case 's':
721207344Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
722207344Sjkim            break;
723207344Sjkim
724118611Snjl        default:
725118611Snjl            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
726197104Sjkim            return (-1);
727118611Snjl        }
728118611Snjl        break;
729118611Snjl
730118611Snjl
731228110Sjkim    case 'G':
732228110Sjkim        Gbl_CompileGeneric = TRUE;
733228110Sjkim        break;
734228110Sjkim
735228110Sjkim
736209746Sjkim    case 'T':
737209746Sjkim        Gbl_DoTemplates = TRUE;
738209746Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
739209746Sjkim        break;
740209746Sjkim
741209746Sjkim
742118611Snjl    case 'v':
743118611Snjl
744118611Snjl        switch (AcpiGbl_Optarg[0])
745118611Snjl        {
746193529Sjkim        case 'a':
747193529Sjkim            /* Disable All error/warning messages */
748193529Sjkim
749193529Sjkim            Gbl_NoErrors = TRUE;
750193529Sjkim            break;
751193529Sjkim
752118611Snjl        case 'i':
753118611Snjl            /* Less verbose error messages */
754118611Snjl
755118611Snjl            Gbl_VerboseErrors = FALSE;
756118611Snjl            break;
757118611Snjl
758118611Snjl        case 'o':
759118611Snjl            Gbl_DisplayOptimizations = TRUE;
760118611Snjl            break;
761118611Snjl
762118611Snjl        case 'r':
763118611Snjl            Gbl_DisplayRemarks = FALSE;
764118611Snjl            break;
765118611Snjl
766118611Snjl        case 's':
767193529Sjkim            Gbl_DoSignon = FALSE;
768118611Snjl            break;
769118611Snjl
770209746Sjkim        case 't':
771209746Sjkim            Gbl_VerboseTemplates = TRUE;
772209746Sjkim            break;
773209746Sjkim
774118611Snjl        default:
775118611Snjl            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
776197104Sjkim            return (-1);
777118611Snjl        }
778118611Snjl        break;
779118611Snjl
780118611Snjl
781167802Sjkim    case 'w': /* Set warning levels */
782167802Sjkim
783167802Sjkim        switch (AcpiGbl_Optarg[0])
784167802Sjkim        {
785167802Sjkim        case '1':
786167802Sjkim            Gbl_WarningLevel = ASL_WARNING;
787167802Sjkim            break;
788167802Sjkim
789167802Sjkim        case '2':
790167802Sjkim            Gbl_WarningLevel = ASL_WARNING2;
791167802Sjkim            break;
792167802Sjkim
793167802Sjkim        case '3':
794167802Sjkim            Gbl_WarningLevel = ASL_WARNING3;
795167802Sjkim            break;
796167802Sjkim
797167802Sjkim        default:
798167802Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
799197104Sjkim            return (-1);
800167802Sjkim        }
801167802Sjkim        break;
802167802Sjkim
803167802Sjkim
804118611Snjl    case 'x':
805118611Snjl
806118611Snjl        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
807118611Snjl        break;
808118611Snjl
809118611Snjl
810209746Sjkim    case 'z':
811209746Sjkim
812209746Sjkim        Gbl_UseOriginalCompilerId = TRUE;
813209746Sjkim        break;
814209746Sjkim
815209746Sjkim
816118611Snjl    default:
817118611Snjl
818197104Sjkim        return (-1);
819118611Snjl    }
820118611Snjl
821197104Sjkim    return (0);
822197104Sjkim}
823197104Sjkim
824197104Sjkim
825197104Sjkim/*******************************************************************************
826197104Sjkim *
827197104Sjkim * FUNCTION:    AslCommandLine
828197104Sjkim *
829197104Sjkim * PARAMETERS:  argc/argv
830197104Sjkim *
831197104Sjkim * RETURN:      Last argv index
832197104Sjkim *
833197104Sjkim * DESCRIPTION: Command line processing
834197104Sjkim *
835197104Sjkim ******************************************************************************/
836197104Sjkim
837197104Sjkimstatic int
838197104SjkimAslCommandLine (
839197104Sjkim    int                     argc,
840197104Sjkim    char                    **argv)
841197104Sjkim{
842197104Sjkim    int                     BadCommandLine = 0;
843212761Sjkim    ACPI_STATUS             Status;
844197104Sjkim
845197104Sjkim
846197104Sjkim    /* Minimum command line contains at least the command and an input file */
847197104Sjkim
848197104Sjkim    if (argc < 2)
849197104Sjkim    {
850213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
851197104Sjkim        Usage ();
852197104Sjkim        exit (1);
853197104Sjkim    }
854197104Sjkim
855197104Sjkim    /* Process all command line options */
856197104Sjkim
857197104Sjkim    BadCommandLine = AslDoOptions (argc, argv, FALSE);
858197104Sjkim
859209746Sjkim    if (Gbl_DoTemplates)
860209746Sjkim    {
861212761Sjkim        Status = DtCreateTemplates (Gbl_TemplateSignature);
862212761Sjkim        if (ACPI_FAILURE (Status))
863212761Sjkim        {
864212761Sjkim            exit (-1);
865212761Sjkim        }
866209746Sjkim        exit (1);
867209746Sjkim    }
868209746Sjkim
869118611Snjl    /* Next parameter must be the input filename */
870118611Snjl
871193529Sjkim    if (!argv[AcpiGbl_Optind] &&
872151937Sjkim        !Gbl_DisasmFlag &&
873151937Sjkim        !Gbl_GetAllTables)
874118611Snjl    {
875118611Snjl        printf ("Missing input filename\n");
876118611Snjl        BadCommandLine = TRUE;
877118611Snjl    }
878118611Snjl
879193529Sjkim    if (Gbl_DoSignon)
880118611Snjl    {
881213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
882118611Snjl    }
883118611Snjl
884118611Snjl    /* Abort if anything went wrong on the command line */
885118611Snjl
886118611Snjl    if (BadCommandLine)
887118611Snjl    {
888118611Snjl        printf ("\n");
889118611Snjl        Usage ();
890118611Snjl        exit (1);
891118611Snjl    }
892118611Snjl
893193529Sjkim    return (AcpiGbl_Optind);
894118611Snjl}
895118611Snjl
896118611Snjl
897118611Snjl/*******************************************************************************
898118611Snjl *
899118611Snjl * FUNCTION:    main
900118611Snjl *
901118611Snjl * PARAMETERS:  Standard argc/argv
902118611Snjl *
903118611Snjl * RETURN:      Program termination code
904118611Snjl *
905193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
906193529Sjkim *              options and begin the compile for each file on the command line
907118611Snjl *
908118611Snjl ******************************************************************************/
909118611Snjl
910118611Snjlint ACPI_SYSTEM_XFACE
911118611Snjlmain (
912118611Snjl    int                     argc,
913118611Snjl    char                    **argv)
914118611Snjl{
915118611Snjl    ACPI_STATUS             Status;
916210976Sjkim    int                     Index1;
917210976Sjkim    int                     Index2;
918118611Snjl
919118611Snjl
920210976Sjkim    AcpiGbl_ExternalFileList = NULL;
921210976Sjkim
922151937Sjkim#ifdef _DEBUG
923151937Sjkim    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
924151937Sjkim                    _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
925151937Sjkim#endif
926151937Sjkim
927118611Snjl    /* Init and command line */
928118611Snjl
929118611Snjl    AslInitialize ();
930210976Sjkim    Index1 = Index2 = AslCommandLine (argc, argv);
931118611Snjl
932193529Sjkim    /* Options that have no additional parameters or pathnames */
933118611Snjl
934193529Sjkim    if (Gbl_GetAllTables)
935118611Snjl    {
936193529Sjkim        Status = AslDoOneFile (NULL);
937118611Snjl        if (ACPI_FAILURE (Status))
938118611Snjl        {
939193529Sjkim            return (-1);
940118611Snjl        }
941193529Sjkim        return (0);
942193529Sjkim    }
943118611Snjl
944210976Sjkim    if (Gbl_DisassembleAll)
945210976Sjkim    {
946210976Sjkim        while (argv[Index1])
947210976Sjkim        {
948210976Sjkim            Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
949210976Sjkim            if (ACPI_FAILURE (Status))
950210976Sjkim            {
951210976Sjkim                return (-1);
952210976Sjkim            }
953210976Sjkim
954210976Sjkim            Index1++;
955210976Sjkim        }
956210976Sjkim    }
957210976Sjkim
958193529Sjkim    /* Process each pathname/filename in the list, with possible wildcards */
959118611Snjl
960210976Sjkim    while (argv[Index2])
961118611Snjl    {
962210976Sjkim        Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
963151937Sjkim        if (ACPI_FAILURE (Status))
964151937Sjkim        {
965193529Sjkim            return (-1);
966151937Sjkim        }
967118611Snjl
968210976Sjkim        Index2++;
969118611Snjl    }
970118611Snjl
971210976Sjkim    if (AcpiGbl_ExternalFileList)
972210976Sjkim    {
973210976Sjkim        AcpiDmClearExternalFileList();
974210976Sjkim    }
975210976Sjkim
976118611Snjl    return (0);
977118611Snjl}
978118611Snjl
979118611Snjl
980