aslmain.c revision 220663
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"
99209746Sjkim#define ASL_SUPPORTED_OPTIONS   "@:2b:c:d^e:fgh^i^I:l^no:p:r:s:t:T: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
119197104Sjkim    printf ("Global:\n");
120197104Sjkim    printf ("  -@<file>       Specify command file\n");
121197104Sjkim    printf ("  -I<dir>        Specify additional include directory\n");
122197104Sjkim
123197104Sjkim    printf ("\nGeneral Output:\n");
124197104Sjkim    printf ("  -p<prefix>     Specify path/filename prefix for all output files\n");
125193529Sjkim    printf ("  -va            Disable all errors and warnings (summary only)\n");
126118611Snjl    printf ("  -vi            Less verbose errors and warnings for use with IDEs\n");
127118611Snjl    printf ("  -vo            Enable optimization comments\n");
128118611Snjl    printf ("  -vr            Disable remarks\n");
129118611Snjl    printf ("  -vs            Disable signon\n");
130167802Sjkim    printf ("  -w<1|2|3>      Set warning reporting level\n");
131118611Snjl
132138287Smarks    printf ("\nAML Output Files:\n");
133118611Snjl    printf ("  -s<a|c>        Create AML in assembler or C source file (*.asm or *.c)\n");
134118611Snjl    printf ("  -i<a|c>        Create assembler or C include file (*.inc or *.h)\n");
135207344Sjkim    printf ("  -t<a|c|s>      Create AML in assembler, C, or ASL hex table (*.hex)\n");
136118611Snjl
137138287Smarks    printf ("\nAML Code Generation:\n");
138118611Snjl    printf ("  -oa            Disable all optimizations (compatibility mode)\n");
139118611Snjl    printf ("  -of            Disable constant folding\n");
140118611Snjl    printf ("  -oi            Disable integer optimization to Zero/One/Ones\n");
141118611Snjl    printf ("  -on            Disable named reference string optimization\n");
142207344Sjkim    printf ("  -cr            Disable Resource Descriptor error checking\n");
143138287Smarks    printf ("  -r<Revision>   Override table header Revision (1-255)\n");
144118611Snjl
145212761Sjkim    printf ("\nASL Listing Files:\n");
146118611Snjl    printf ("  -l             Create mixed listing file (ASL source and AML) (*.lst)\n");
147118611Snjl    printf ("  -ln            Create namespace file (*.nsp)\n");
148118611Snjl    printf ("  -ls            Create combined source file (expanded includes) (*.src)\n");
149118611Snjl
150209746Sjkim    printf ("\nACPI Data Tables:\n");
151220663Sjkim    printf ("  -T <Sig>|ALL|* Create table template file(s) for <Sig>\n");
152209746Sjkim    printf ("  -vt            Create verbose templates (full disassembly)\n");
153209746Sjkim
154118611Snjl    printf ("\nAML Disassembler:\n");
155167802Sjkim    printf ("  -d  [file]     Disassemble or decode binary ACPI table to file (*.dsl)\n");
156210976Sjkim    printf ("  -da [f1,f2]    Disassemble multiple tables from single namespace\n");
157118611Snjl    printf ("  -dc [file]     Disassemble AML and immediately compile it\n");
158118611Snjl    printf ("                 (Obtain DSDT from current system if no input file)\n");
159193529Sjkim    printf ("  -e  [f1,f2]    Include ACPI table(s) for external symbol resolution\n");
160151937Sjkim    printf ("  -2             Emit ACPI 2.0 compatible ASL code\n");
161118611Snjl    printf ("  -g             Get ACPI tables and write to files (*.dat)\n");
162118611Snjl
163118611Snjl    printf ("\nHelp:\n");
164118611Snjl    printf ("  -h             Additional help and compiler debug options\n");
165118611Snjl    printf ("  -hc            Display operators allowed in constant expressions\n");
166118611Snjl    printf ("  -hr            Display ACPI reserved method names\n");
167209746Sjkim    printf ("  -ht            Display currently supported ACPI table names\n");
168118611Snjl}
169118611Snjl
170118611Snjl
171118611Snjl/*******************************************************************************
172118611Snjl *
173151937Sjkim * FUNCTION:    HelpMessage
174118611Snjl *
175118611Snjl * PARAMETERS:  None
176118611Snjl *
177118611Snjl * RETURN:      None
178118611Snjl *
179118611Snjl * DESCRIPTION: Display help message
180118611Snjl *
181118611Snjl ******************************************************************************/
182118611Snjl
183151937Sjkimstatic void
184118611SnjlHelpMessage (
185118611Snjl    void)
186118611Snjl{
187118611Snjl
188118611Snjl    printf ("AML output filename generation:\n");
189118611Snjl    printf ("  Output filenames are generated by appending an extension to a common\n");
190118611Snjl    printf ("  filename prefix.  The filename prefix is obtained via one of the\n");
191118611Snjl    printf ("  following methods (in priority order):\n");
192118611Snjl    printf ("    1) The -p option specifies the prefix\n");
193118611Snjl    printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
194118611Snjl    printf ("    3) The prefix of the input filename\n");
195118611Snjl    printf ("\n");
196118611Snjl
197118611Snjl    Options ();
198118611Snjl
199167802Sjkim    printf ("\nCompiler/Disassembler Debug Options:\n");
200118611Snjl    printf ("  -b<p|t|b>      Create compiler debug/trace file (*.txt)\n");
201118611Snjl    printf ("                   Types: Parse/Tree/Both\n");
202118611Snjl    printf ("  -f             Ignore errors, force creation of AML output file(s)\n");
203207344Sjkim    printf ("  -n             Parse only, no output generation\n");
204118611Snjl    printf ("  -ot            Display compile times\n");
205118611Snjl    printf ("  -x<level>      Set debug level for trace output\n");
206209746Sjkim    printf ("  -z             Do not insert new compiler ID for DataTables\n");
207118611Snjl}
208118611Snjl
209118611Snjl
210118611Snjl/*******************************************************************************
211118611Snjl *
212118611Snjl * FUNCTION:    Usage
213118611Snjl *
214118611Snjl * PARAMETERS:  None
215118611Snjl *
216118611Snjl * RETURN:      None
217118611Snjl *
218118611Snjl * DESCRIPTION: Display usage and option message
219118611Snjl *
220118611Snjl ******************************************************************************/
221118611Snjl
222151937Sjkimstatic void
223118611SnjlUsage (
224118611Snjl    void)
225118611Snjl{
226118611Snjl
227213806Sjkim    printf ("%s\n", ASL_COMPLIANCE);
228213806Sjkim    printf ("Usage:    %s [Options] [Files]\n\n", ASL_INVOCATION_NAME);
229118611Snjl    Options ();
230118611Snjl}
231118611Snjl
232118611Snjl
233118611Snjl/*******************************************************************************
234118611Snjl *
235118611Snjl * FUNCTION:    AslInitialize
236118611Snjl *
237118611Snjl * PARAMETERS:  None
238118611Snjl *
239118611Snjl * RETURN:      None
240118611Snjl *
241118611Snjl * DESCRIPTION: Initialize compiler globals
242118611Snjl *
243118611Snjl ******************************************************************************/
244118611Snjl
245151937Sjkimstatic void
246151937SjkimAslInitialize (
247151937Sjkim    void)
248118611Snjl{
249118611Snjl    UINT32                  i;
250118611Snjl
251118611Snjl
252118611Snjl#ifdef _DEBUG
253118611Snjl    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
254118611Snjl#endif
255118611Snjl
256118611Snjl    AcpiDbgLevel = 0;
257118611Snjl
258118611Snjl    for (i = 0; i < ASL_NUM_FILES; i++)
259118611Snjl    {
260118611Snjl        Gbl_Files[i].Handle = NULL;
261118611Snjl        Gbl_Files[i].Filename = NULL;
262118611Snjl    }
263118611Snjl
264118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
265118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
266118611Snjl
267118611Snjl    Gbl_Files[ASL_FILE_STDERR].Handle   = stderr;
268118611Snjl    Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
269118611Snjl}
270118611Snjl
271118611Snjl
272118611Snjl/*******************************************************************************
273118611Snjl *
274197104Sjkim * FUNCTION:    AslMergeOptionTokens
275118611Snjl *
276197104Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
277197104Sjkim *              OutBuffer           - Merged output buffer
278118611Snjl *
279118611Snjl * RETURN:      None
280118611Snjl *
281197104Sjkim * DESCRIPTION: Remove all whitespace from an option string.
282118611Snjl *
283118611Snjl ******************************************************************************/
284118611Snjl
285197104Sjkimstatic void
286197104SjkimAslMergeOptionTokens (
287197104Sjkim    char                    *InBuffer,
288197104Sjkim    char                    *OutBuffer)
289197104Sjkim{
290197104Sjkim    char                    *Token;
291197104Sjkim
292197104Sjkim
293197104Sjkim    *OutBuffer = 0;
294197104Sjkim
295197104Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
296197104Sjkim    while (Token)
297197104Sjkim    {
298197104Sjkim        strcat (OutBuffer, Token);
299197104Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
300197104Sjkim    }
301197104Sjkim}
302197104Sjkim
303197104Sjkim
304197104Sjkim/*******************************************************************************
305197104Sjkim *
306197104Sjkim * FUNCTION:    AslDoResponseFile
307197104Sjkim *
308197104Sjkim * PARAMETERS:  Filename        - Name of the response file
309197104Sjkim *
310197104Sjkim * RETURN:      Status
311197104Sjkim *
312197104Sjkim * DESCRIPTION: Open a response file and process all options within.
313197104Sjkim *
314197104Sjkim ******************************************************************************/
315197104Sjkim
316193529Sjkimstatic int
317197104SjkimAslDoResponseFile (
318197104Sjkim    char                    *Filename)
319118611Snjl{
320197104Sjkim    char                    *argv = StringBuffer2;
321197104Sjkim    FILE                    *ResponseFile;
322197104Sjkim    int                     OptStatus = 0;
323197104Sjkim    int                     Opterr;
324197104Sjkim    int                     Optind;
325118611Snjl
326118611Snjl
327197104Sjkim    ResponseFile = fopen (Filename, "r");
328197104Sjkim    if (!ResponseFile)
329197104Sjkim    {
330197104Sjkim        printf ("Could not open command file %s, %s\n",
331197104Sjkim            Filename, strerror (errno));
332197104Sjkim        return -1;
333197104Sjkim    }
334118611Snjl
335197104Sjkim    /* Must save the current GetOpt globals */
336197104Sjkim
337197104Sjkim    Opterr = AcpiGbl_Opterr;
338197104Sjkim    Optind = AcpiGbl_Optind;
339197104Sjkim
340197104Sjkim    /*
341197104Sjkim     * Process all lines in the response file. There must be one complete
342197104Sjkim     * option per line
343197104Sjkim     */
344197104Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
345118611Snjl    {
346197104Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
347197104Sjkim
348197104Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
349197104Sjkim
350197104Sjkim        /* Process the option */
351197104Sjkim
352197104Sjkim        AcpiGbl_Opterr = 0;
353197104Sjkim        AcpiGbl_Optind = 0;
354197104Sjkim
355197104Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
356197104Sjkim        if (OptStatus)
357197104Sjkim        {
358197104Sjkim            printf ("Invalid option in command file %s: %s\n",
359197104Sjkim                Filename, StringBuffer);
360197104Sjkim            break;
361197104Sjkim        }
362118611Snjl    }
363118611Snjl
364197104Sjkim    /* Restore the GetOpt globals */
365197104Sjkim
366197104Sjkim    AcpiGbl_Opterr = Opterr;
367197104Sjkim    AcpiGbl_Optind = Optind;
368197104Sjkim
369197104Sjkim    fclose (ResponseFile);
370197104Sjkim    return (OptStatus);
371197104Sjkim}
372197104Sjkim
373197104Sjkim
374197104Sjkim/*******************************************************************************
375197104Sjkim *
376197104Sjkim * FUNCTION:    AslDoOptions
377197104Sjkim *
378197104Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
379197104Sjkim *              IsResponseFile      - TRUE if executing a response file.
380197104Sjkim *
381197104Sjkim * RETURN:      Status
382197104Sjkim *
383197104Sjkim * DESCRIPTION: Command line option processing
384197104Sjkim *
385197104Sjkim ******************************************************************************/
386197104Sjkim
387197104Sjkimstatic int
388197104SjkimAslDoOptions (
389197104Sjkim    int                     argc,
390197104Sjkim    char                    **argv,
391197104Sjkim    BOOLEAN                 IsResponseFile)
392197104Sjkim{
393197104Sjkim    int                     j;
394212761Sjkim    ACPI_STATUS             Status;
395197104Sjkim
396197104Sjkim
397118611Snjl    /* Get the command line options */
398118611Snjl
399197104Sjkim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
400118611Snjl    {
401197104Sjkim    case '@':   /* Begin a response file */
402197104Sjkim
403197104Sjkim        if (IsResponseFile)
404197104Sjkim        {
405197104Sjkim            printf ("Nested command files are not supported\n");
406197104Sjkim            return -1;
407197104Sjkim        }
408197104Sjkim
409197104Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
410197104Sjkim        {
411197104Sjkim            return -1;
412197104Sjkim        }
413197104Sjkim        break;
414197104Sjkim
415197104Sjkim
416151937Sjkim    case '2':
417197104Sjkim
418151937Sjkim        Gbl_Acpi2 = TRUE;
419151937Sjkim        break;
420151937Sjkim
421151937Sjkim
422118611Snjl    case 'b':
423118611Snjl
424118611Snjl        switch (AcpiGbl_Optarg[0])
425118611Snjl        {
426118611Snjl        case 'b':
427118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
428220663Sjkim            DtParserdebug = 1;
429118611Snjl            break;
430118611Snjl
431118611Snjl        case 'p':
432118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
433220663Sjkim            DtParserdebug = 1;
434118611Snjl            break;
435118611Snjl
436118611Snjl        case 't':
437118611Snjl            break;
438118611Snjl
439118611Snjl        default:
440118611Snjl            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
441197104Sjkim            return (-1);
442118611Snjl        }
443118611Snjl
444118611Snjl        /* Produce debug output file */
445118611Snjl
446118611Snjl        Gbl_DebugFlag = TRUE;
447118611Snjl        break;
448118611Snjl
449118611Snjl
450118611Snjl    case 'c':
451207344Sjkim        switch (AcpiGbl_Optarg[0])
452207344Sjkim        {
453207344Sjkim        case 'r':
454207344Sjkim            Gbl_NoResourceChecking = TRUE;
455207344Sjkim            break;
456118611Snjl
457207344Sjkim        default:
458207344Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
459207344Sjkim            return (-1);
460207344Sjkim        }
461118611Snjl        break;
462118611Snjl
463118611Snjl
464118611Snjl    case 'd':
465118611Snjl        switch (AcpiGbl_Optarg[0])
466118611Snjl        {
467118611Snjl        case '^':
468193529Sjkim            Gbl_DoCompile = FALSE;
469118611Snjl            break;
470118611Snjl
471210976Sjkim        case 'a':
472210976Sjkim            Gbl_DoCompile = FALSE;
473210976Sjkim            Gbl_DisassembleAll = TRUE;
474210976Sjkim            break;
475210976Sjkim
476118611Snjl        case 'c':
477118611Snjl            break;
478118611Snjl
479118611Snjl        default:
480118611Snjl            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
481197104Sjkim            return (-1);
482118611Snjl        }
483118611Snjl
484118611Snjl        Gbl_DisasmFlag = TRUE;
485118611Snjl        break;
486118611Snjl
487118611Snjl
488118611Snjl    case 'e':
489212761Sjkim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
490212761Sjkim        if (ACPI_FAILURE (Status))
491212761Sjkim        {
492212761Sjkim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
493212761Sjkim            return (-1);
494212761Sjkim        }
495118611Snjl        break;
496118611Snjl
497118611Snjl
498118611Snjl    case 'f':
499118611Snjl
500118611Snjl        /* Ignore errors and force creation of aml file */
501118611Snjl
502118611Snjl        Gbl_IgnoreErrors = TRUE;
503118611Snjl        break;
504118611Snjl
505118611Snjl
506118611Snjl    case 'g':
507118611Snjl
508118611Snjl        /* Get all ACPI tables */
509118611Snjl
510118611Snjl        Gbl_GetAllTables = TRUE;
511193529Sjkim        Gbl_DoCompile = FALSE;
512118611Snjl        break;
513118611Snjl
514118611Snjl
515118611Snjl    case 'h':
516118611Snjl
517118611Snjl        switch (AcpiGbl_Optarg[0])
518118611Snjl        {
519118611Snjl        case '^':
520118611Snjl            HelpMessage ();
521118611Snjl            exit (0);
522118611Snjl
523118611Snjl        case 'c':
524118611Snjl            UtDisplayConstantOpcodes ();
525118611Snjl            exit (0);
526118611Snjl
527118611Snjl        case 'r':
528118611Snjl            /* reserved names */
529118611Snjl
530204773Sjkim            ApDisplayReservedNames ();
531118611Snjl            exit (0);
532118611Snjl
533209746Sjkim        case 't':
534209746Sjkim            UtDisplaySupportedTables ();
535209746Sjkim            exit (0);
536209746Sjkim
537118611Snjl        default:
538118611Snjl            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
539197104Sjkim            return (-1);
540118611Snjl        }
541118611Snjl
542118611Snjl
543197104Sjkim    case 'I': /* Add an include file search directory */
544197104Sjkim
545197104Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
546197104Sjkim        break;
547197104Sjkim
548197104Sjkim
549118611Snjl    case 'i':
550118611Snjl
551118611Snjl        switch (AcpiGbl_Optarg[0])
552118611Snjl        {
553118611Snjl        case 'a':
554118611Snjl
555118611Snjl            /* Produce assembly code include file */
556118611Snjl
557118611Snjl            Gbl_AsmIncludeOutputFlag = TRUE;
558118611Snjl            break;
559118611Snjl
560118611Snjl        case 'c':
561118611Snjl
562118611Snjl            /* Produce C include file */
563118611Snjl
564118611Snjl            Gbl_C_IncludeOutputFlag = TRUE;
565118611Snjl            break;
566118611Snjl
567118611Snjl        default:
568118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
569197104Sjkim            return (-1);
570118611Snjl        }
571118611Snjl        break;
572118611Snjl
573118611Snjl
574118611Snjl    case 'l':
575118611Snjl
576118611Snjl        switch (AcpiGbl_Optarg[0])
577118611Snjl        {
578118611Snjl        case '^':
579118611Snjl            /* Produce listing file (Mixed source/aml) */
580118611Snjl
581118611Snjl            Gbl_ListingFlag = TRUE;
582118611Snjl            break;
583118611Snjl
584118611Snjl        case 'n':
585118611Snjl            /* Produce namespace file */
586118611Snjl
587118611Snjl            Gbl_NsOutputFlag = TRUE;
588118611Snjl            break;
589118611Snjl
590118611Snjl        case 's':
591118611Snjl            /* Produce combined source file */
592118611Snjl
593118611Snjl            Gbl_SourceOutputFlag = TRUE;
594118611Snjl            break;
595118611Snjl
596118611Snjl        default:
597118611Snjl            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
598197104Sjkim            return (-1);
599118611Snjl        }
600118611Snjl        break;
601118611Snjl
602118611Snjl
603118611Snjl    case 'o':
604118611Snjl
605118611Snjl        switch (AcpiGbl_Optarg[0])
606118611Snjl        {
607118611Snjl        case 'a':
608118611Snjl
609118611Snjl            /* Disable all optimizations */
610118611Snjl
611118611Snjl            Gbl_FoldConstants = FALSE;
612118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
613118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
614118611Snjl            break;
615118611Snjl
616118611Snjl        case 'f':
617118611Snjl
618118611Snjl            /* Disable folding on "normal" expressions */
619118611Snjl
620118611Snjl            Gbl_FoldConstants = FALSE;
621118611Snjl            break;
622118611Snjl
623118611Snjl        case 'i':
624118611Snjl
625118611Snjl            /* Disable integer optimization to constants */
626118611Snjl
627118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
628118611Snjl            break;
629118611Snjl
630118611Snjl        case 'n':
631118611Snjl
632118611Snjl            /* Disable named reference optimization */
633118611Snjl
634118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
635118611Snjl            break;
636118611Snjl
637118611Snjl        case 't':
638118611Snjl
639118611Snjl            /* Display compile time(s) */
640118611Snjl
641118611Snjl            Gbl_CompileTimesFlag = TRUE;
642118611Snjl            break;
643118611Snjl
644118611Snjl        default:
645118611Snjl            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
646197104Sjkim            return (-1);
647118611Snjl        }
648118611Snjl        break;
649118611Snjl
650118611Snjl
651207344Sjkim    case 'n':
652207344Sjkim
653207344Sjkim        /* Parse only */
654207344Sjkim
655207344Sjkim        Gbl_ParseOnlyFlag = TRUE;
656207344Sjkim        break;
657207344Sjkim
658207344Sjkim
659118611Snjl    case 'p':
660118611Snjl
661118611Snjl        /* Override default AML output filename */
662118611Snjl
663118611Snjl        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
664118611Snjl        Gbl_UseDefaultAmlFilename = FALSE;
665118611Snjl        break;
666118611Snjl
667118611Snjl
668118611Snjl    case 'r':
669138287Smarks        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
670118611Snjl        break;
671118611Snjl
672118611Snjl
673118611Snjl    case 's':
674118611Snjl
675118611Snjl        switch (AcpiGbl_Optarg[0])
676118611Snjl        {
677118611Snjl        case 'a':
678118611Snjl
679118611Snjl            /* Produce assembly code output file */
680118611Snjl
681118611Snjl            Gbl_AsmOutputFlag = TRUE;
682118611Snjl            break;
683118611Snjl
684118611Snjl        case 'c':
685118611Snjl
686118611Snjl            /* Produce C hex output file */
687118611Snjl
688118611Snjl            Gbl_C_OutputFlag = TRUE;
689118611Snjl            break;
690118611Snjl
691118611Snjl        default:
692118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
693197104Sjkim            return (-1);
694118611Snjl        }
695118611Snjl        break;
696118611Snjl
697118611Snjl
698118611Snjl    case 't':
699118611Snjl
700118611Snjl        /* Produce hex table output file */
701118611Snjl
702118611Snjl        switch (AcpiGbl_Optarg[0])
703118611Snjl        {
704118611Snjl        case 'a':
705118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
706118611Snjl            break;
707118611Snjl
708118611Snjl        case 'c':
709118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_C;
710118611Snjl            break;
711118611Snjl
712207344Sjkim        case 's':
713207344Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
714207344Sjkim            break;
715207344Sjkim
716118611Snjl        default:
717118611Snjl            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
718197104Sjkim            return (-1);
719118611Snjl        }
720118611Snjl        break;
721118611Snjl
722118611Snjl
723209746Sjkim    case 'T':
724209746Sjkim        Gbl_DoTemplates = TRUE;
725209746Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
726209746Sjkim        break;
727209746Sjkim
728209746Sjkim
729118611Snjl    case 'v':
730118611Snjl
731118611Snjl        switch (AcpiGbl_Optarg[0])
732118611Snjl        {
733193529Sjkim        case 'a':
734193529Sjkim            /* Disable All error/warning messages */
735193529Sjkim
736193529Sjkim            Gbl_NoErrors = TRUE;
737193529Sjkim            break;
738193529Sjkim
739118611Snjl        case 'i':
740118611Snjl            /* Less verbose error messages */
741118611Snjl
742118611Snjl            Gbl_VerboseErrors = FALSE;
743118611Snjl            break;
744118611Snjl
745118611Snjl        case 'o':
746118611Snjl            Gbl_DisplayOptimizations = TRUE;
747118611Snjl            break;
748118611Snjl
749118611Snjl        case 'r':
750118611Snjl            Gbl_DisplayRemarks = FALSE;
751118611Snjl            break;
752118611Snjl
753118611Snjl        case 's':
754193529Sjkim            Gbl_DoSignon = FALSE;
755118611Snjl            break;
756118611Snjl
757209746Sjkim        case 't':
758209746Sjkim            Gbl_VerboseTemplates = TRUE;
759209746Sjkim            break;
760209746Sjkim
761118611Snjl        default:
762118611Snjl            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
763197104Sjkim            return (-1);
764118611Snjl        }
765118611Snjl        break;
766118611Snjl
767118611Snjl
768167802Sjkim    case 'w': /* Set warning levels */
769167802Sjkim
770167802Sjkim        switch (AcpiGbl_Optarg[0])
771167802Sjkim        {
772167802Sjkim        case '1':
773167802Sjkim            Gbl_WarningLevel = ASL_WARNING;
774167802Sjkim            break;
775167802Sjkim
776167802Sjkim        case '2':
777167802Sjkim            Gbl_WarningLevel = ASL_WARNING2;
778167802Sjkim            break;
779167802Sjkim
780167802Sjkim        case '3':
781167802Sjkim            Gbl_WarningLevel = ASL_WARNING3;
782167802Sjkim            break;
783167802Sjkim
784167802Sjkim        default:
785167802Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
786197104Sjkim            return (-1);
787167802Sjkim        }
788167802Sjkim        break;
789167802Sjkim
790167802Sjkim
791118611Snjl    case 'x':
792118611Snjl
793118611Snjl        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
794118611Snjl        break;
795118611Snjl
796118611Snjl
797209746Sjkim    case 'z':
798209746Sjkim
799209746Sjkim        Gbl_UseOriginalCompilerId = TRUE;
800209746Sjkim        break;
801209746Sjkim
802209746Sjkim
803118611Snjl    default:
804118611Snjl
805197104Sjkim        return (-1);
806118611Snjl    }
807118611Snjl
808197104Sjkim    return (0);
809197104Sjkim}
810197104Sjkim
811197104Sjkim
812197104Sjkim/*******************************************************************************
813197104Sjkim *
814197104Sjkim * FUNCTION:    AslCommandLine
815197104Sjkim *
816197104Sjkim * PARAMETERS:  argc/argv
817197104Sjkim *
818197104Sjkim * RETURN:      Last argv index
819197104Sjkim *
820197104Sjkim * DESCRIPTION: Command line processing
821197104Sjkim *
822197104Sjkim ******************************************************************************/
823197104Sjkim
824197104Sjkimstatic int
825197104SjkimAslCommandLine (
826197104Sjkim    int                     argc,
827197104Sjkim    char                    **argv)
828197104Sjkim{
829197104Sjkim    int                     BadCommandLine = 0;
830212761Sjkim    ACPI_STATUS             Status;
831197104Sjkim
832197104Sjkim
833197104Sjkim    /* Minimum command line contains at least the command and an input file */
834197104Sjkim
835197104Sjkim    if (argc < 2)
836197104Sjkim    {
837213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
838197104Sjkim        Usage ();
839197104Sjkim        exit (1);
840197104Sjkim    }
841197104Sjkim
842197104Sjkim    /* Process all command line options */
843197104Sjkim
844197104Sjkim    BadCommandLine = AslDoOptions (argc, argv, FALSE);
845197104Sjkim
846209746Sjkim    if (Gbl_DoTemplates)
847209746Sjkim    {
848212761Sjkim        Status = DtCreateTemplates (Gbl_TemplateSignature);
849212761Sjkim        if (ACPI_FAILURE (Status))
850212761Sjkim        {
851212761Sjkim            exit (-1);
852212761Sjkim        }
853209746Sjkim        exit (1);
854209746Sjkim    }
855209746Sjkim
856118611Snjl    /* Next parameter must be the input filename */
857118611Snjl
858193529Sjkim    if (!argv[AcpiGbl_Optind] &&
859151937Sjkim        !Gbl_DisasmFlag &&
860151937Sjkim        !Gbl_GetAllTables)
861118611Snjl    {
862118611Snjl        printf ("Missing input filename\n");
863118611Snjl        BadCommandLine = TRUE;
864118611Snjl    }
865118611Snjl
866193529Sjkim    if (Gbl_DoSignon)
867118611Snjl    {
868213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
869118611Snjl    }
870118611Snjl
871118611Snjl    /* Abort if anything went wrong on the command line */
872118611Snjl
873118611Snjl    if (BadCommandLine)
874118611Snjl    {
875118611Snjl        printf ("\n");
876118611Snjl        Usage ();
877118611Snjl        exit (1);
878118611Snjl    }
879118611Snjl
880193529Sjkim    return (AcpiGbl_Optind);
881118611Snjl}
882118611Snjl
883118611Snjl
884118611Snjl/*******************************************************************************
885118611Snjl *
886118611Snjl * FUNCTION:    main
887118611Snjl *
888118611Snjl * PARAMETERS:  Standard argc/argv
889118611Snjl *
890118611Snjl * RETURN:      Program termination code
891118611Snjl *
892193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
893193529Sjkim *              options and begin the compile for each file on the command line
894118611Snjl *
895118611Snjl ******************************************************************************/
896118611Snjl
897118611Snjlint ACPI_SYSTEM_XFACE
898118611Snjlmain (
899118611Snjl    int                     argc,
900118611Snjl    char                    **argv)
901118611Snjl{
902118611Snjl    ACPI_STATUS             Status;
903210976Sjkim    int                     Index1;
904210976Sjkim    int                     Index2;
905118611Snjl
906118611Snjl
907210976Sjkim    AcpiGbl_ExternalFileList = NULL;
908210976Sjkim
909151937Sjkim#ifdef _DEBUG
910151937Sjkim    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
911151937Sjkim                    _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
912151937Sjkim#endif
913151937Sjkim
914118611Snjl    /* Init and command line */
915118611Snjl
916118611Snjl    AslInitialize ();
917210976Sjkim    Index1 = Index2 = AslCommandLine (argc, argv);
918118611Snjl
919193529Sjkim    /* Options that have no additional parameters or pathnames */
920118611Snjl
921193529Sjkim    if (Gbl_GetAllTables)
922118611Snjl    {
923193529Sjkim        Status = AslDoOneFile (NULL);
924118611Snjl        if (ACPI_FAILURE (Status))
925118611Snjl        {
926193529Sjkim            return (-1);
927118611Snjl        }
928193529Sjkim        return (0);
929193529Sjkim    }
930118611Snjl
931210976Sjkim    if (Gbl_DisassembleAll)
932210976Sjkim    {
933210976Sjkim        while (argv[Index1])
934210976Sjkim        {
935210976Sjkim            Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
936210976Sjkim            if (ACPI_FAILURE (Status))
937210976Sjkim            {
938210976Sjkim                return (-1);
939210976Sjkim            }
940210976Sjkim
941210976Sjkim            Index1++;
942210976Sjkim        }
943210976Sjkim    }
944210976Sjkim
945193529Sjkim    /* Process each pathname/filename in the list, with possible wildcards */
946118611Snjl
947210976Sjkim    while (argv[Index2])
948118611Snjl    {
949210976Sjkim        Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
950151937Sjkim        if (ACPI_FAILURE (Status))
951151937Sjkim        {
952193529Sjkim            return (-1);
953151937Sjkim        }
954118611Snjl
955210976Sjkim        Index2++;
956118611Snjl    }
957118611Snjl
958210976Sjkim    if (AcpiGbl_ExternalFileList)
959210976Sjkim    {
960210976Sjkim        AcpiDmClearExternalFileList();
961210976Sjkim    }
962210976Sjkim
963118611Snjl    return (0);
964118611Snjl}
965118611Snjl
966118611Snjl
967