aslmain.c revision 241973
1118611Snjl/******************************************************************************
2118611Snjl *
3118611Snjl * Module Name: aslmain - compiler main and utilities
4118611Snjl *
5118611Snjl *****************************************************************************/
6118611Snjl
7217365Sjkim/*
8229989Sjkim * Copyright (C) 2000 - 2012, Intel Corp.
9118611Snjl * All rights reserved.
10118611Snjl *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25118611Snjl *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29118611Snjl *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43118611Snjl
44118611Snjl
45118611Snjl#define _DECLARE_GLOBALS
46118611Snjl
47151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
48193529Sjkim#include <contrib/dev/acpica/include/acapps.h>
49210976Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
50240716Sjkim#include <signal.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
66237412SjkimFilenameHelp (
67151937Sjkim    void);
68151937Sjkim
69151937Sjkimstatic void
70151937SjkimUsage (
71151937Sjkim    void);
72151937Sjkim
73240716Sjkimstatic void ACPI_SYSTEM_XFACE
74240716SjkimAslSignalHandler (
75240716Sjkim    int                     Sig);
76240716Sjkim
77151937Sjkimstatic void
78151937SjkimAslInitialize (
79151937Sjkim    void);
80151937Sjkim
81193529Sjkimstatic int
82151937SjkimAslCommandLine (
83151937Sjkim    int                     argc,
84151937Sjkim    char                    **argv);
85151937Sjkim
86197104Sjkimstatic int
87197104SjkimAslDoOptions (
88197104Sjkim    int                     argc,
89197104Sjkim    char                    **argv,
90197104Sjkim    BOOLEAN                 IsResponseFile);
91151937Sjkim
92197104Sjkimstatic void
93197104SjkimAslMergeOptionTokens (
94197104Sjkim    char                    *InBuffer,
95197104Sjkim    char                    *OutBuffer);
96197104Sjkim
97197104Sjkimstatic int
98197104SjkimAslDoResponseFile (
99197104Sjkim    char                    *Filename);
100197104Sjkim
101197104Sjkim
102197104Sjkim#define ASL_TOKEN_SEPARATORS    " \t\n"
103240716Sjkim#define ASL_SUPPORTED_OPTIONS   "@:2b|c|d^D:e:fgh^i|I:l^m:no|p:P^r:s|t|T:G^v^w|x:z"
104197104Sjkim
105197104Sjkim
106118611Snjl/*******************************************************************************
107118611Snjl *
108118611Snjl * FUNCTION:    Options
109118611Snjl *
110118611Snjl * PARAMETERS:  None
111118611Snjl *
112118611Snjl * RETURN:      None
113118611Snjl *
114118611Snjl * DESCRIPTION: Display option help message
115118611Snjl *
116118611Snjl ******************************************************************************/
117118611Snjl
118151937Sjkimstatic void
119118611SnjlOptions (
120118611Snjl    void)
121118611Snjl{
122118611Snjl
123228110Sjkim    printf ("\nGlobal:\n");
124228110Sjkim    ACPI_OPTION ("-@ <file>",       "Specify command file");
125228110Sjkim    ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
126241973Sjkim    ACPI_OPTION ("-T <sig>|ALL|*",  "Create table template file for ACPI <Sig>");
127238381Sjkim    ACPI_OPTION ("-v",              "Display compiler version");
128197104Sjkim
129233250Sjkim    printf ("\nPreprocessor:\n");
130233250Sjkim    ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
131233250Sjkim    ACPI_OPTION ("-li",             "Create preprocessed output file (*.i)");
132233250Sjkim    ACPI_OPTION ("-P",              "Preprocess only and create preprocessor output file (*.i)");
133234623Sjkim    ACPI_OPTION ("-Pn",             "Disable preprocessor");
134233250Sjkim
135197104Sjkim    printf ("\nGeneral Output:\n");
136228110Sjkim    ACPI_OPTION ("-p <prefix>",     "Specify path/filename prefix for all output files");
137228110Sjkim    ACPI_OPTION ("-va",             "Disable all errors and warnings (summary only)");
138228110Sjkim    ACPI_OPTION ("-vi",             "Less verbose errors and warnings for use with IDEs");
139228110Sjkim    ACPI_OPTION ("-vo",             "Enable optimization comments");
140228110Sjkim    ACPI_OPTION ("-vr",             "Disable remarks");
141228110Sjkim    ACPI_OPTION ("-vs",             "Disable signon");
142233250Sjkim    ACPI_OPTION ("-w1 -w2 -w3",     "Set warning reporting level");
143234623Sjkim    ACPI_OPTION ("-we",             "Report warnings as errors");
144118611Snjl
145241973Sjkim    printf ("\nAML and Data Output Files:\n");
146241973Sjkim    ACPI_OPTION ("-sa -sc",         "Create assembler or C source file (*.asm or *.c)");
147233250Sjkim    ACPI_OPTION ("-ia -ic",         "Create assembler or C include file (*.inc or *.h)");
148241973Sjkim    ACPI_OPTION ("-ta -tc -ts",     "Create assembler, C, or ASL hex table (*.hex)");
149118611Snjl
150138287Smarks    printf ("\nAML Code Generation:\n");
151228110Sjkim    ACPI_OPTION ("-oa",             "Disable all optimizations (compatibility mode)");
152228110Sjkim    ACPI_OPTION ("-of",             "Disable constant folding");
153228110Sjkim    ACPI_OPTION ("-oi",             "Disable integer optimization to Zero/One/Ones");
154228110Sjkim    ACPI_OPTION ("-on",             "Disable named reference string optimization");
155228110Sjkim    ACPI_OPTION ("-cr",             "Disable Resource Descriptor error checking");
156228110Sjkim    ACPI_OPTION ("-r <revision>",   "Override table header Revision (1-255)");
157118611Snjl
158212761Sjkim    printf ("\nASL Listing Files:\n");
159228110Sjkim    ACPI_OPTION ("-l",              "Create mixed listing file (ASL source and AML) (*.lst)");
160228110Sjkim    ACPI_OPTION ("-ln",             "Create namespace file (*.nsp)");
161228110Sjkim    ACPI_OPTION ("-ls",             "Create combined source file (expanded includes) (*.src)");
162118611Snjl
163209746Sjkim    printf ("\nACPI Data Tables:\n");
164228110Sjkim    ACPI_OPTION ("-G",              "Compile custom table containing generic operators");
165228110Sjkim    ACPI_OPTION ("-vt",             "Create verbose templates (full disassembly)");
166209746Sjkim
167118611Snjl    printf ("\nAML Disassembler:\n");
168228110Sjkim    ACPI_OPTION ("-d  [file]",      "Disassemble or decode binary ACPI table to file (*.dsl)");
169228110Sjkim    ACPI_OPTION ("-da [f1,f2]",     "Disassemble multiple tables from single namespace");
170240716Sjkim    ACPI_OPTION ("-db",             "Do not translate Buffers to Resource Templates");
171228110Sjkim    ACPI_OPTION ("-dc [file]",      "Disassemble AML and immediately compile it");
172228110Sjkim    ACPI_OPTION ("",                "(Obtain DSDT from current system if no input file)");
173228110Sjkim    ACPI_OPTION ("-e  [f1,f2]",     "Include ACPI table(s) for external symbol resolution");
174228110Sjkim    ACPI_OPTION ("-2",              "Emit ACPI 2.0 compatible ASL code");
175228110Sjkim    ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
176241973Sjkim    ACPI_OPTION ("-vt",             "Dump binary table data in hex format within output file");
177118611Snjl
178118611Snjl    printf ("\nHelp:\n");
179237412Sjkim    ACPI_OPTION ("-h",              "This message");
180228110Sjkim    ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
181237412Sjkim    ACPI_OPTION ("-hf",             "Display help for output filename generation");
182228110Sjkim    ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
183228110Sjkim    ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
184237412Sjkim
185237412Sjkim    printf ("\nDebug Options:\n");
186237412Sjkim    ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
187237412Sjkim    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
188237412Sjkim    ACPI_OPTION ("-n",              "Parse only, no output generation");
189237412Sjkim    ACPI_OPTION ("-ot",             "Display compile times and statistics");
190237412Sjkim    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
191237412Sjkim    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
192118611Snjl}
193118611Snjl
194118611Snjl
195118611Snjl/*******************************************************************************
196118611Snjl *
197237412Sjkim * FUNCTION:    FilenameHelp
198118611Snjl *
199118611Snjl * PARAMETERS:  None
200118611Snjl *
201118611Snjl * RETURN:      None
202118611Snjl *
203237412Sjkim * DESCRIPTION: Display help message for output filename generation
204118611Snjl *
205118611Snjl ******************************************************************************/
206118611Snjl
207151937Sjkimstatic void
208237412SjkimFilenameHelp (
209118611Snjl    void)
210118611Snjl{
211118611Snjl
212228110Sjkim    printf ("\nAML output filename generation:\n");
213118611Snjl    printf ("  Output filenames are generated by appending an extension to a common\n");
214241973Sjkim    printf ("  filename prefix. The filename prefix is obtained via one of the\n");
215118611Snjl    printf ("  following methods (in priority order):\n");
216118611Snjl    printf ("    1) The -p option specifies the prefix\n");
217118611Snjl    printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
218118611Snjl    printf ("    3) The prefix of the input filename\n");
219118611Snjl    printf ("\n");
220118611Snjl}
221118611Snjl
222118611Snjl
223118611Snjl/*******************************************************************************
224118611Snjl *
225118611Snjl * FUNCTION:    Usage
226118611Snjl *
227118611Snjl * PARAMETERS:  None
228118611Snjl *
229118611Snjl * RETURN:      None
230118611Snjl *
231118611Snjl * DESCRIPTION: Display usage and option message
232118611Snjl *
233118611Snjl ******************************************************************************/
234118611Snjl
235151937Sjkimstatic void
236118611SnjlUsage (
237118611Snjl    void)
238118611Snjl{
239118611Snjl
240228110Sjkim    printf ("%s\n\n", ASL_COMPLIANCE);
241228110Sjkim    ACPI_USAGE_HEADER ("iasl [Options] [Files]");
242118611Snjl    Options ();
243118611Snjl}
244118611Snjl
245118611Snjl
246240716Sjkim/******************************************************************************
247240716Sjkim *
248240716Sjkim * FUNCTION:    AslSignalHandler
249240716Sjkim *
250240716Sjkim * PARAMETERS:  Sig                 - Signal that invoked this handler
251240716Sjkim *
252240716Sjkim * RETURN:      None
253240716Sjkim *
254240716Sjkim * DESCRIPTION: Control-C handler. Delete any intermediate files and any
255240716Sjkim *              output files that may be left in an indeterminate state.
256240716Sjkim *
257240716Sjkim *****************************************************************************/
258240716Sjkim
259240716Sjkimstatic void ACPI_SYSTEM_XFACE
260240716SjkimAslSignalHandler (
261240716Sjkim    int                     Sig)
262240716Sjkim{
263240716Sjkim    UINT32                  i;
264240716Sjkim
265240716Sjkim
266240716Sjkim    signal (Sig, SIG_IGN);
267240716Sjkim    printf ("Aborting\n\n");
268240716Sjkim
269240716Sjkim    /* Close all open files */
270240716Sjkim
271240716Sjkim    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
272240716Sjkim
273240716Sjkim    for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
274240716Sjkim    {
275240716Sjkim        FlCloseFile (i);
276240716Sjkim    }
277240716Sjkim
278240716Sjkim    /* Delete any output files */
279240716Sjkim
280240716Sjkim    for (i = ASL_FILE_AML_OUTPUT; i < ASL_MAX_FILE_TYPE; i++)
281240716Sjkim    {
282240716Sjkim        FlDeleteFile (i);
283240716Sjkim    }
284240716Sjkim
285240716Sjkim    exit (0);
286240716Sjkim}
287240716Sjkim
288240716Sjkim
289118611Snjl/*******************************************************************************
290118611Snjl *
291118611Snjl * FUNCTION:    AslInitialize
292118611Snjl *
293118611Snjl * PARAMETERS:  None
294118611Snjl *
295118611Snjl * RETURN:      None
296118611Snjl *
297118611Snjl * DESCRIPTION: Initialize compiler globals
298118611Snjl *
299118611Snjl ******************************************************************************/
300118611Snjl
301151937Sjkimstatic void
302151937SjkimAslInitialize (
303151937Sjkim    void)
304118611Snjl{
305118611Snjl    UINT32                  i;
306118611Snjl
307118611Snjl
308118611Snjl#ifdef _DEBUG
309118611Snjl    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
310118611Snjl#endif
311118611Snjl
312118611Snjl
313118611Snjl    for (i = 0; i < ASL_NUM_FILES; i++)
314118611Snjl    {
315118611Snjl        Gbl_Files[i].Handle = NULL;
316118611Snjl        Gbl_Files[i].Filename = NULL;
317118611Snjl    }
318118611Snjl
319118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
320118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
321118611Snjl
322118611Snjl    Gbl_Files[ASL_FILE_STDERR].Handle   = stderr;
323118611Snjl    Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
324240716Sjkim
325240716Sjkim    /* Allocate the line buffer(s) */
326240716Sjkim
327240716Sjkim    Gbl_LineBufferSize /= 2;
328240716Sjkim    UtExpandLineBuffers ();
329118611Snjl}
330118611Snjl
331118611Snjl
332118611Snjl/*******************************************************************************
333118611Snjl *
334197104Sjkim * FUNCTION:    AslMergeOptionTokens
335118611Snjl *
336197104Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
337197104Sjkim *              OutBuffer           - Merged output buffer
338118611Snjl *
339118611Snjl * RETURN:      None
340118611Snjl *
341197104Sjkim * DESCRIPTION: Remove all whitespace from an option string.
342118611Snjl *
343118611Snjl ******************************************************************************/
344118611Snjl
345197104Sjkimstatic void
346197104SjkimAslMergeOptionTokens (
347197104Sjkim    char                    *InBuffer,
348197104Sjkim    char                    *OutBuffer)
349197104Sjkim{
350197104Sjkim    char                    *Token;
351197104Sjkim
352197104Sjkim
353197104Sjkim    *OutBuffer = 0;
354197104Sjkim
355197104Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
356197104Sjkim    while (Token)
357197104Sjkim    {
358197104Sjkim        strcat (OutBuffer, Token);
359197104Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
360197104Sjkim    }
361197104Sjkim}
362197104Sjkim
363197104Sjkim
364197104Sjkim/*******************************************************************************
365197104Sjkim *
366197104Sjkim * FUNCTION:    AslDoResponseFile
367197104Sjkim *
368197104Sjkim * PARAMETERS:  Filename        - Name of the response file
369197104Sjkim *
370197104Sjkim * RETURN:      Status
371197104Sjkim *
372197104Sjkim * DESCRIPTION: Open a response file and process all options within.
373197104Sjkim *
374197104Sjkim ******************************************************************************/
375197104Sjkim
376193529Sjkimstatic int
377197104SjkimAslDoResponseFile (
378197104Sjkim    char                    *Filename)
379118611Snjl{
380197104Sjkim    char                    *argv = StringBuffer2;
381197104Sjkim    FILE                    *ResponseFile;
382197104Sjkim    int                     OptStatus = 0;
383197104Sjkim    int                     Opterr;
384197104Sjkim    int                     Optind;
385118611Snjl
386118611Snjl
387197104Sjkim    ResponseFile = fopen (Filename, "r");
388197104Sjkim    if (!ResponseFile)
389197104Sjkim    {
390197104Sjkim        printf ("Could not open command file %s, %s\n",
391197104Sjkim            Filename, strerror (errno));
392241973Sjkim        return (-1);
393197104Sjkim    }
394118611Snjl
395197104Sjkim    /* Must save the current GetOpt globals */
396197104Sjkim
397197104Sjkim    Opterr = AcpiGbl_Opterr;
398197104Sjkim    Optind = AcpiGbl_Optind;
399197104Sjkim
400197104Sjkim    /*
401197104Sjkim     * Process all lines in the response file. There must be one complete
402197104Sjkim     * option per line
403197104Sjkim     */
404197104Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
405118611Snjl    {
406197104Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
407197104Sjkim
408197104Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
409197104Sjkim
410197104Sjkim        /* Process the option */
411197104Sjkim
412197104Sjkim        AcpiGbl_Opterr = 0;
413197104Sjkim        AcpiGbl_Optind = 0;
414197104Sjkim
415197104Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
416197104Sjkim        if (OptStatus)
417197104Sjkim        {
418197104Sjkim            printf ("Invalid option in command file %s: %s\n",
419197104Sjkim                Filename, StringBuffer);
420197104Sjkim            break;
421197104Sjkim        }
422118611Snjl    }
423118611Snjl
424197104Sjkim    /* Restore the GetOpt globals */
425197104Sjkim
426197104Sjkim    AcpiGbl_Opterr = Opterr;
427197104Sjkim    AcpiGbl_Optind = Optind;
428197104Sjkim
429197104Sjkim    fclose (ResponseFile);
430197104Sjkim    return (OptStatus);
431197104Sjkim}
432197104Sjkim
433197104Sjkim
434197104Sjkim/*******************************************************************************
435197104Sjkim *
436197104Sjkim * FUNCTION:    AslDoOptions
437197104Sjkim *
438197104Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
439197104Sjkim *              IsResponseFile      - TRUE if executing a response file.
440197104Sjkim *
441197104Sjkim * RETURN:      Status
442197104Sjkim *
443197104Sjkim * DESCRIPTION: Command line option processing
444197104Sjkim *
445197104Sjkim ******************************************************************************/
446197104Sjkim
447197104Sjkimstatic int
448197104SjkimAslDoOptions (
449197104Sjkim    int                     argc,
450197104Sjkim    char                    **argv,
451197104Sjkim    BOOLEAN                 IsResponseFile)
452197104Sjkim{
453197104Sjkim    int                     j;
454212761Sjkim    ACPI_STATUS             Status;
455197104Sjkim
456197104Sjkim
457118611Snjl    /* Get the command line options */
458118611Snjl
459197104Sjkim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
460118611Snjl    {
461197104Sjkim    case '@':   /* Begin a response file */
462197104Sjkim
463197104Sjkim        if (IsResponseFile)
464197104Sjkim        {
465197104Sjkim            printf ("Nested command files are not supported\n");
466233250Sjkim            return (-1);
467197104Sjkim        }
468197104Sjkim
469197104Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
470197104Sjkim        {
471233250Sjkim            return (-1);
472197104Sjkim        }
473197104Sjkim        break;
474197104Sjkim
475197104Sjkim
476233250Sjkim    case '2':   /* ACPI 2.0 compatibility mode */
477151937Sjkim        Gbl_Acpi2 = TRUE;
478151937Sjkim        break;
479151937Sjkim
480151937Sjkim
481233250Sjkim    case 'b':   /* Debug output options */
482118611Snjl        switch (AcpiGbl_Optarg[0])
483118611Snjl        {
484237412Sjkim        case 'f':
485118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
486220663Sjkim            DtParserdebug = 1;
487233250Sjkim            PrParserdebug = 1;
488118611Snjl            break;
489118611Snjl
490118611Snjl        case 't':
491118611Snjl            break;
492118611Snjl
493118611Snjl        default:
494118611Snjl            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
495197104Sjkim            return (-1);
496118611Snjl        }
497118611Snjl
498118611Snjl        /* Produce debug output file */
499118611Snjl
500118611Snjl        Gbl_DebugFlag = TRUE;
501118611Snjl        break;
502118611Snjl
503118611Snjl
504118611Snjl    case 'c':
505207344Sjkim        switch (AcpiGbl_Optarg[0])
506207344Sjkim        {
507207344Sjkim        case 'r':
508207344Sjkim            Gbl_NoResourceChecking = TRUE;
509207344Sjkim            break;
510118611Snjl
511207344Sjkim        default:
512207344Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
513207344Sjkim            return (-1);
514207344Sjkim        }
515118611Snjl        break;
516118611Snjl
517118611Snjl
518233250Sjkim    case 'd':   /* Disassembler */
519118611Snjl        switch (AcpiGbl_Optarg[0])
520118611Snjl        {
521118611Snjl        case '^':
522193529Sjkim            Gbl_DoCompile = FALSE;
523118611Snjl            break;
524118611Snjl
525210976Sjkim        case 'a':
526210976Sjkim            Gbl_DoCompile = FALSE;
527210976Sjkim            Gbl_DisassembleAll = TRUE;
528210976Sjkim            break;
529210976Sjkim
530240716Sjkim        case 'b':   /* Do not convert buffers to resource descriptors */
531240716Sjkim            AcpiGbl_NoResourceDisassembly = TRUE;
532240716Sjkim            break;
533240716Sjkim
534118611Snjl        case 'c':
535118611Snjl            break;
536118611Snjl
537118611Snjl        default:
538118611Snjl            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
539197104Sjkim            return (-1);
540118611Snjl        }
541118611Snjl
542118611Snjl        Gbl_DisasmFlag = TRUE;
543118611Snjl        break;
544118611Snjl
545118611Snjl
546233250Sjkim    case 'D':   /* Define a symbol */
547233250Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
548233250Sjkim        break;
549233250Sjkim
550233250Sjkim
551233250Sjkim    case 'e':   /* External files for disassembler */
552212761Sjkim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
553212761Sjkim        if (ACPI_FAILURE (Status))
554212761Sjkim        {
555212761Sjkim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
556212761Sjkim            return (-1);
557212761Sjkim        }
558118611Snjl        break;
559118611Snjl
560118611Snjl
561233250Sjkim    case 'f':   /* Ignore errors and force creation of aml file */
562233250Sjkim        Gbl_IgnoreErrors = TRUE;
563233250Sjkim        break;
564118611Snjl
565118611Snjl
566233250Sjkim    case 'G':
567233250Sjkim        Gbl_CompileGeneric = TRUE;
568118611Snjl        break;
569118611Snjl
570118611Snjl
571233250Sjkim    case 'g':   /* Get all ACPI tables */
572118611Snjl
573118611Snjl        Gbl_GetAllTables = TRUE;
574193529Sjkim        Gbl_DoCompile = FALSE;
575118611Snjl        break;
576118611Snjl
577118611Snjl
578118611Snjl    case 'h':
579118611Snjl        switch (AcpiGbl_Optarg[0])
580118611Snjl        {
581118611Snjl        case '^':
582237412Sjkim            Usage ();
583118611Snjl            exit (0);
584118611Snjl
585118611Snjl        case 'c':
586118611Snjl            UtDisplayConstantOpcodes ();
587118611Snjl            exit (0);
588118611Snjl
589237412Sjkim        case 'f':
590237412Sjkim            FilenameHelp ();
591237412Sjkim            exit (0);
592237412Sjkim
593118611Snjl        case 'r':
594118611Snjl            /* reserved names */
595118611Snjl
596204773Sjkim            ApDisplayReservedNames ();
597118611Snjl            exit (0);
598118611Snjl
599209746Sjkim        case 't':
600209746Sjkim            UtDisplaySupportedTables ();
601209746Sjkim            exit (0);
602209746Sjkim
603118611Snjl        default:
604118611Snjl            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
605197104Sjkim            return (-1);
606118611Snjl        }
607118611Snjl
608118611Snjl
609233250Sjkim    case 'I':   /* Add an include file search directory */
610197104Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
611197104Sjkim        break;
612197104Sjkim
613197104Sjkim
614233250Sjkim    case 'i':   /* Output AML as an include file */
615118611Snjl        switch (AcpiGbl_Optarg[0])
616118611Snjl        {
617118611Snjl        case 'a':
618118611Snjl
619118611Snjl            /* Produce assembly code include file */
620118611Snjl
621118611Snjl            Gbl_AsmIncludeOutputFlag = TRUE;
622118611Snjl            break;
623118611Snjl
624118611Snjl        case 'c':
625118611Snjl
626118611Snjl            /* Produce C include file */
627118611Snjl
628118611Snjl            Gbl_C_IncludeOutputFlag = TRUE;
629118611Snjl            break;
630118611Snjl
631118611Snjl        default:
632233250Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
633197104Sjkim            return (-1);
634118611Snjl        }
635118611Snjl        break;
636118611Snjl
637118611Snjl
638233250Sjkim    case 'l':   /* Listing files */
639118611Snjl        switch (AcpiGbl_Optarg[0])
640118611Snjl        {
641118611Snjl        case '^':
642118611Snjl            /* Produce listing file (Mixed source/aml) */
643118611Snjl
644118611Snjl            Gbl_ListingFlag = TRUE;
645118611Snjl            break;
646118611Snjl
647233250Sjkim        case 'i':
648233250Sjkim            /* Produce preprocessor output file */
649233250Sjkim
650233250Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
651233250Sjkim            break;
652233250Sjkim
653118611Snjl        case 'n':
654118611Snjl            /* Produce namespace file */
655118611Snjl
656118611Snjl            Gbl_NsOutputFlag = TRUE;
657118611Snjl            break;
658118611Snjl
659118611Snjl        case 's':
660118611Snjl            /* Produce combined source file */
661118611Snjl
662118611Snjl            Gbl_SourceOutputFlag = TRUE;
663118611Snjl            break;
664118611Snjl
665118611Snjl        default:
666118611Snjl            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
667197104Sjkim            return (-1);
668118611Snjl        }
669118611Snjl        break;
670118611Snjl
671118611Snjl
672240716Sjkim    case 'm':   /* Set line buffer size */
673240716Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
674240716Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
675240716Sjkim        {
676240716Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
677240716Sjkim        }
678240716Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
679228110Sjkim        break;
680228110Sjkim
681228110Sjkim
682233250Sjkim    case 'n':   /* Parse only */
683228110Sjkim        Gbl_ParseOnlyFlag = TRUE;
684228110Sjkim        break;
685228110Sjkim
686228110Sjkim
687233250Sjkim    case 'o':   /* Control compiler AML optimizations */
688118611Snjl        switch (AcpiGbl_Optarg[0])
689118611Snjl        {
690118611Snjl        case 'a':
691118611Snjl
692118611Snjl            /* Disable all optimizations */
693118611Snjl
694118611Snjl            Gbl_FoldConstants = FALSE;
695118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
696118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
697118611Snjl            break;
698118611Snjl
699118611Snjl        case 'f':
700118611Snjl
701118611Snjl            /* Disable folding on "normal" expressions */
702118611Snjl
703118611Snjl            Gbl_FoldConstants = FALSE;
704118611Snjl            break;
705118611Snjl
706118611Snjl        case 'i':
707118611Snjl
708118611Snjl            /* Disable integer optimization to constants */
709118611Snjl
710118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
711118611Snjl            break;
712118611Snjl
713118611Snjl        case 'n':
714118611Snjl
715118611Snjl            /* Disable named reference optimization */
716118611Snjl
717118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
718118611Snjl            break;
719118611Snjl
720118611Snjl        case 't':
721118611Snjl
722118611Snjl            /* Display compile time(s) */
723118611Snjl
724118611Snjl            Gbl_CompileTimesFlag = TRUE;
725118611Snjl            break;
726118611Snjl
727118611Snjl        default:
728118611Snjl            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
729197104Sjkim            return (-1);
730118611Snjl        }
731118611Snjl        break;
732118611Snjl
733118611Snjl
734234623Sjkim    case 'P':   /* Preprocessor options */
735234623Sjkim        switch (AcpiGbl_Optarg[0])
736234623Sjkim        {
737234623Sjkim        case '^':   /* Proprocess only, emit (.i) file */
738234623Sjkim            Gbl_PreprocessOnly = TRUE;
739234623Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
740234623Sjkim            break;
741234623Sjkim
742234623Sjkim        case 'n':   /* Disable preprocessor */
743234623Sjkim            Gbl_PreprocessFlag = FALSE;
744234623Sjkim            break;
745234623Sjkim
746234623Sjkim        default:
747234623Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
748234623Sjkim            return (-1);
749234623Sjkim        }
750233250Sjkim        break;
751118611Snjl
752118611Snjl
753233250Sjkim    case 'p':   /* Override default AML output filename */
754118611Snjl        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
755118611Snjl        Gbl_UseDefaultAmlFilename = FALSE;
756118611Snjl        break;
757118611Snjl
758118611Snjl
759233250Sjkim    case 'r':   /* Override revision found in table header */
760138287Smarks        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
761118611Snjl        break;
762118611Snjl
763118611Snjl
764233250Sjkim    case 's':   /* Create AML in a source code file */
765118611Snjl        switch (AcpiGbl_Optarg[0])
766118611Snjl        {
767118611Snjl        case 'a':
768118611Snjl
769118611Snjl            /* Produce assembly code output file */
770118611Snjl
771118611Snjl            Gbl_AsmOutputFlag = TRUE;
772118611Snjl            break;
773118611Snjl
774118611Snjl        case 'c':
775118611Snjl
776118611Snjl            /* Produce C hex output file */
777118611Snjl
778118611Snjl            Gbl_C_OutputFlag = TRUE;
779118611Snjl            break;
780118611Snjl
781118611Snjl        default:
782118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
783197104Sjkim            return (-1);
784118611Snjl        }
785118611Snjl        break;
786118611Snjl
787118611Snjl
788233250Sjkim    case 't':   /* Produce hex table output file */
789118611Snjl        switch (AcpiGbl_Optarg[0])
790118611Snjl        {
791118611Snjl        case 'a':
792118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
793118611Snjl            break;
794118611Snjl
795118611Snjl        case 'c':
796118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_C;
797118611Snjl            break;
798118611Snjl
799207344Sjkim        case 's':
800207344Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
801207344Sjkim            break;
802207344Sjkim
803118611Snjl        default:
804118611Snjl            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
805197104Sjkim            return (-1);
806118611Snjl        }
807118611Snjl        break;
808118611Snjl
809118611Snjl
810233250Sjkim    case 'T':   /* Create a ACPI table template file */
811209746Sjkim        Gbl_DoTemplates = TRUE;
812209746Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
813209746Sjkim        break;
814209746Sjkim
815209746Sjkim
816238381Sjkim    case 'v':   /* Version and verbosity settings */
817118611Snjl        switch (AcpiGbl_Optarg[0])
818118611Snjl        {
819238381Sjkim        case '^':
820238381Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
821238381Sjkim            exit (0);
822238381Sjkim
823193529Sjkim        case 'a':
824193529Sjkim            /* Disable All error/warning messages */
825193529Sjkim
826193529Sjkim            Gbl_NoErrors = TRUE;
827193529Sjkim            break;
828193529Sjkim
829118611Snjl        case 'i':
830235945Sjkim            /*
831235945Sjkim             * Support for integrated development environment(s).
832235945Sjkim             *
833235945Sjkim             * 1) No compiler signon
834235945Sjkim             * 2) Send stderr messages to stdout
835235945Sjkim             * 3) Less verbose error messages (single line only for each)
836235945Sjkim             * 4) Error/warning messages are formatted appropriately to
837235945Sjkim             *    be recognized by MS Visual Studio
838235945Sjkim             */
839118611Snjl            Gbl_VerboseErrors = FALSE;
840235945Sjkim            Gbl_DoSignon = FALSE;
841235945Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
842118611Snjl            break;
843118611Snjl
844118611Snjl        case 'o':
845118611Snjl            Gbl_DisplayOptimizations = TRUE;
846118611Snjl            break;
847118611Snjl
848118611Snjl        case 'r':
849118611Snjl            Gbl_DisplayRemarks = FALSE;
850118611Snjl            break;
851118611Snjl
852118611Snjl        case 's':
853193529Sjkim            Gbl_DoSignon = FALSE;
854118611Snjl            break;
855118611Snjl
856209746Sjkim        case 't':
857209746Sjkim            Gbl_VerboseTemplates = TRUE;
858209746Sjkim            break;
859209746Sjkim
860118611Snjl        default:
861118611Snjl            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
862197104Sjkim            return (-1);
863118611Snjl        }
864118611Snjl        break;
865118611Snjl
866118611Snjl
867167802Sjkim    case 'w': /* Set warning levels */
868167802Sjkim        switch (AcpiGbl_Optarg[0])
869167802Sjkim        {
870167802Sjkim        case '1':
871167802Sjkim            Gbl_WarningLevel = ASL_WARNING;
872167802Sjkim            break;
873167802Sjkim
874167802Sjkim        case '2':
875167802Sjkim            Gbl_WarningLevel = ASL_WARNING2;
876167802Sjkim            break;
877167802Sjkim
878167802Sjkim        case '3':
879167802Sjkim            Gbl_WarningLevel = ASL_WARNING3;
880167802Sjkim            break;
881167802Sjkim
882234623Sjkim        case 'e':
883234623Sjkim            Gbl_WarningsAsErrors = TRUE;
884234623Sjkim            break;
885234623Sjkim
886167802Sjkim        default:
887167802Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
888197104Sjkim            return (-1);
889167802Sjkim        }
890167802Sjkim        break;
891167802Sjkim
892167802Sjkim
893233250Sjkim    case 'x':   /* Set debug print output level */
894118611Snjl        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
895118611Snjl        break;
896118611Snjl
897118611Snjl
898209746Sjkim    case 'z':
899209746Sjkim        Gbl_UseOriginalCompilerId = TRUE;
900209746Sjkim        break;
901209746Sjkim
902209746Sjkim
903118611Snjl    default:
904197104Sjkim        return (-1);
905118611Snjl    }
906118611Snjl
907197104Sjkim    return (0);
908197104Sjkim}
909197104Sjkim
910197104Sjkim
911197104Sjkim/*******************************************************************************
912197104Sjkim *
913197104Sjkim * FUNCTION:    AslCommandLine
914197104Sjkim *
915197104Sjkim * PARAMETERS:  argc/argv
916197104Sjkim *
917197104Sjkim * RETURN:      Last argv index
918197104Sjkim *
919197104Sjkim * DESCRIPTION: Command line processing
920197104Sjkim *
921197104Sjkim ******************************************************************************/
922197104Sjkim
923197104Sjkimstatic int
924197104SjkimAslCommandLine (
925197104Sjkim    int                     argc,
926197104Sjkim    char                    **argv)
927197104Sjkim{
928197104Sjkim    int                     BadCommandLine = 0;
929212761Sjkim    ACPI_STATUS             Status;
930197104Sjkim
931197104Sjkim
932197104Sjkim    /* Minimum command line contains at least the command and an input file */
933197104Sjkim
934197104Sjkim    if (argc < 2)
935197104Sjkim    {
936213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
937197104Sjkim        Usage ();
938197104Sjkim        exit (1);
939197104Sjkim    }
940197104Sjkim
941197104Sjkim    /* Process all command line options */
942197104Sjkim
943197104Sjkim    BadCommandLine = AslDoOptions (argc, argv, FALSE);
944197104Sjkim
945209746Sjkim    if (Gbl_DoTemplates)
946209746Sjkim    {
947212761Sjkim        Status = DtCreateTemplates (Gbl_TemplateSignature);
948212761Sjkim        if (ACPI_FAILURE (Status))
949212761Sjkim        {
950212761Sjkim            exit (-1);
951212761Sjkim        }
952209746Sjkim        exit (1);
953209746Sjkim    }
954209746Sjkim
955118611Snjl    /* Next parameter must be the input filename */
956118611Snjl
957193529Sjkim    if (!argv[AcpiGbl_Optind] &&
958151937Sjkim        !Gbl_DisasmFlag &&
959151937Sjkim        !Gbl_GetAllTables)
960118611Snjl    {
961118611Snjl        printf ("Missing input filename\n");
962118611Snjl        BadCommandLine = TRUE;
963118611Snjl    }
964118611Snjl
965193529Sjkim    if (Gbl_DoSignon)
966118611Snjl    {
967213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
968229989Sjkim        if (Gbl_IgnoreErrors)
969229989Sjkim        {
970229989Sjkim            printf ("Ignoring all errors, forcing AML file generation\n\n");
971229989Sjkim        }
972118611Snjl    }
973118611Snjl
974118611Snjl    /* Abort if anything went wrong on the command line */
975118611Snjl
976118611Snjl    if (BadCommandLine)
977118611Snjl    {
978118611Snjl        printf ("\n");
979118611Snjl        Usage ();
980118611Snjl        exit (1);
981118611Snjl    }
982118611Snjl
983193529Sjkim    return (AcpiGbl_Optind);
984118611Snjl}
985118611Snjl
986118611Snjl
987118611Snjl/*******************************************************************************
988118611Snjl *
989118611Snjl * FUNCTION:    main
990118611Snjl *
991118611Snjl * PARAMETERS:  Standard argc/argv
992118611Snjl *
993118611Snjl * RETURN:      Program termination code
994118611Snjl *
995193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
996193529Sjkim *              options and begin the compile for each file on the command line
997118611Snjl *
998118611Snjl ******************************************************************************/
999118611Snjl
1000118611Snjlint ACPI_SYSTEM_XFACE
1001118611Snjlmain (
1002118611Snjl    int                     argc,
1003118611Snjl    char                    **argv)
1004118611Snjl{
1005118611Snjl    ACPI_STATUS             Status;
1006210976Sjkim    int                     Index1;
1007210976Sjkim    int                     Index2;
1008118611Snjl
1009118611Snjl
1010240716Sjkim    signal (SIGINT, AslSignalHandler);
1011240716Sjkim
1012210976Sjkim    AcpiGbl_ExternalFileList = NULL;
1013240716Sjkim    AcpiDbgLevel = 0;
1014210976Sjkim
1015151937Sjkim#ifdef _DEBUG
1016151937Sjkim    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
1017151937Sjkim                    _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
1018151937Sjkim#endif
1019151937Sjkim
1020118611Snjl    /* Init and command line */
1021118611Snjl
1022240716Sjkim    Index1 = Index2 = AslCommandLine (argc, argv);
1023240716Sjkim
1024118611Snjl    AslInitialize ();
1025233250Sjkim    PrInitializePreprocessor ();
1026118611Snjl
1027193529Sjkim    /* Options that have no additional parameters or pathnames */
1028118611Snjl
1029193529Sjkim    if (Gbl_GetAllTables)
1030118611Snjl    {
1031193529Sjkim        Status = AslDoOneFile (NULL);
1032118611Snjl        if (ACPI_FAILURE (Status))
1033118611Snjl        {
1034193529Sjkim            return (-1);
1035118611Snjl        }
1036193529Sjkim        return (0);
1037193529Sjkim    }
1038118611Snjl
1039210976Sjkim    if (Gbl_DisassembleAll)
1040210976Sjkim    {
1041210976Sjkim        while (argv[Index1])
1042210976Sjkim        {
1043210976Sjkim            Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
1044210976Sjkim            if (ACPI_FAILURE (Status))
1045210976Sjkim            {
1046210976Sjkim                return (-1);
1047210976Sjkim            }
1048210976Sjkim
1049210976Sjkim            Index1++;
1050210976Sjkim        }
1051210976Sjkim    }
1052210976Sjkim
1053193529Sjkim    /* Process each pathname/filename in the list, with possible wildcards */
1054118611Snjl
1055210976Sjkim    while (argv[Index2])
1056118611Snjl    {
1057210976Sjkim        Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
1058151937Sjkim        if (ACPI_FAILURE (Status))
1059151937Sjkim        {
1060193529Sjkim            return (-1);
1061151937Sjkim        }
1062118611Snjl
1063210976Sjkim        Index2++;
1064118611Snjl    }
1065118611Snjl
1066210976Sjkim    if (AcpiGbl_ExternalFileList)
1067210976Sjkim    {
1068210976Sjkim        AcpiDmClearExternalFileList();
1069210976Sjkim    }
1070210976Sjkim
1071118611Snjl    return (0);
1072118611Snjl}
1073