aslmain.c revision 246849
1118611Snjl/******************************************************************************
2118611Snjl *
3118611Snjl * Module Name: aslmain - compiler main and utilities
4118611Snjl *
5118611Snjl *****************************************************************************/
6118611Snjl
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, 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"
103243347Sjkim#define ASL_SUPPORTED_OPTIONS   "@:b|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 *
114246849Sjkim * DESCRIPTION: Display option help message.
115246849Sjkim *              Optional items in square brackets.
116118611Snjl *
117118611Snjl ******************************************************************************/
118118611Snjl
119151937Sjkimstatic void
120118611SnjlOptions (
121118611Snjl    void)
122118611Snjl{
123118611Snjl
124228110Sjkim    printf ("\nGlobal:\n");
125228110Sjkim    ACPI_OPTION ("-@ <file>",       "Specify command file");
126228110Sjkim    ACPI_OPTION ("-I <dir>",        "Specify additional include directory");
127241973Sjkim    ACPI_OPTION ("-T <sig>|ALL|*",  "Create table template file for ACPI <Sig>");
128238381Sjkim    ACPI_OPTION ("-v",              "Display compiler version");
129197104Sjkim
130233250Sjkim    printf ("\nPreprocessor:\n");
131233250Sjkim    ACPI_OPTION ("-D <symbol>",     "Define symbol for preprocessor use");
132233250Sjkim    ACPI_OPTION ("-li",             "Create preprocessed output file (*.i)");
133233250Sjkim    ACPI_OPTION ("-P",              "Preprocess only and create preprocessor output file (*.i)");
134234623Sjkim    ACPI_OPTION ("-Pn",             "Disable preprocessor");
135233250Sjkim
136246849Sjkim    printf ("\nGeneral Processing:\n");
137228110Sjkim    ACPI_OPTION ("-p <prefix>",     "Specify path/filename prefix for all output files");
138228110Sjkim    ACPI_OPTION ("-va",             "Disable all errors and warnings (summary only)");
139228110Sjkim    ACPI_OPTION ("-vi",             "Less verbose errors and warnings for use with IDEs");
140228110Sjkim    ACPI_OPTION ("-vo",             "Enable optimization comments");
141228110Sjkim    ACPI_OPTION ("-vr",             "Disable remarks");
142228110Sjkim    ACPI_OPTION ("-vs",             "Disable signon");
143233250Sjkim    ACPI_OPTION ("-w1 -w2 -w3",     "Set warning reporting level");
144234623Sjkim    ACPI_OPTION ("-we",             "Report warnings as errors");
145118611Snjl
146246849Sjkim    printf ("\nAML Code Generation (*.aml):\n");
147228110Sjkim    ACPI_OPTION ("-oa",             "Disable all optimizations (compatibility mode)");
148228110Sjkim    ACPI_OPTION ("-of",             "Disable constant folding");
149228110Sjkim    ACPI_OPTION ("-oi",             "Disable integer optimization to Zero/One/Ones");
150228110Sjkim    ACPI_OPTION ("-on",             "Disable named reference string optimization");
151228110Sjkim    ACPI_OPTION ("-cr",             "Disable Resource Descriptor error checking");
152245582Sjkim    ACPI_OPTION ("-in",             "Ignore NoOp operators");
153228110Sjkim    ACPI_OPTION ("-r <revision>",   "Override table header Revision (1-255)");
154118611Snjl
155246849Sjkim    printf ("\nOptional Source Code Output Files:\n");
156246849Sjkim    ACPI_OPTION ("-sc -sa",         "Create source file in C or assembler (*.c or *.asm)");
157246849Sjkim    ACPI_OPTION ("-ic -ia",         "Create include file in C or assembler (*.h or *.inc)");
158246849Sjkim    ACPI_OPTION ("-tc -ta -ts",     "Create hex AML table in C, assembler, or ASL (*.hex)");
159246849Sjkim
160246849Sjkim    printf ("\nOptional Listing Files:\n");
161228110Sjkim    ACPI_OPTION ("-l",              "Create mixed listing file (ASL source and AML) (*.lst)");
162228110Sjkim    ACPI_OPTION ("-ln",             "Create namespace file (*.nsp)");
163228110Sjkim    ACPI_OPTION ("-ls",             "Create combined source file (expanded includes) (*.src)");
164118611Snjl
165246849Sjkim    printf ("\nData Table Compiler:\n");
166246849Sjkim    ACPI_OPTION ("-G",              "Compile custom table that contains generic operators");
167246849Sjkim    ACPI_OPTION ("-vt",             "Create verbose template files (full disassembly)");
168209746Sjkim
169118611Snjl    printf ("\nAML Disassembler:\n");
170246849Sjkim    ACPI_OPTION ("-d  <f1,f2>",     "Disassemble or decode binary ACPI tables to file (*.dsl)");
171246849Sjkim    ACPI_OPTION ("",                "  (Optional, file type is automatically detected)");
172246849Sjkim    ACPI_OPTION ("-da <f1,f2>",     "Disassemble multiple tables from single namespace");
173240716Sjkim    ACPI_OPTION ("-db",             "Do not translate Buffers to Resource Templates");
174246849Sjkim    ACPI_OPTION ("-dc <f1,f2>",     "Disassemble AML and immediately compile it");
175246849Sjkim    ACPI_OPTION ("",                "  (Obtain DSDT from current system if no input file)");
176246849Sjkim    ACPI_OPTION ("-e  <f1,f2>",     "Include ACPI table(s) for external symbol resolution");
177228110Sjkim    ACPI_OPTION ("-g",              "Get ACPI tables and write to files (*.dat)");
178245582Sjkim    ACPI_OPTION ("-in",             "Ignore NoOp opcodes");
179241973Sjkim    ACPI_OPTION ("-vt",             "Dump binary table data in hex format within output file");
180118611Snjl
181118611Snjl    printf ("\nHelp:\n");
182237412Sjkim    ACPI_OPTION ("-h",              "This message");
183228110Sjkim    ACPI_OPTION ("-hc",             "Display operators allowed in constant expressions");
184237412Sjkim    ACPI_OPTION ("-hf",             "Display help for output filename generation");
185228110Sjkim    ACPI_OPTION ("-hr",             "Display ACPI reserved method names");
186228110Sjkim    ACPI_OPTION ("-ht",             "Display currently supported ACPI table names");
187237412Sjkim
188237412Sjkim    printf ("\nDebug Options:\n");
189237412Sjkim    ACPI_OPTION ("-bf -bt",         "Create debug file (full or parse tree only) (*.txt)");
190237412Sjkim    ACPI_OPTION ("-f",              "Ignore errors, force creation of AML output file(s)");
191246849Sjkim    ACPI_OPTION ("-m <size>",       "Set internal line buffer size (in Kbytes)");
192237412Sjkim    ACPI_OPTION ("-n",              "Parse only, no output generation");
193237412Sjkim    ACPI_OPTION ("-ot",             "Display compile times and statistics");
194237412Sjkim    ACPI_OPTION ("-x <level>",      "Set debug level for trace output");
195237412Sjkim    ACPI_OPTION ("-z",              "Do not insert new compiler ID for DataTables");
196118611Snjl}
197118611Snjl
198118611Snjl
199118611Snjl/*******************************************************************************
200118611Snjl *
201237412Sjkim * FUNCTION:    FilenameHelp
202118611Snjl *
203118611Snjl * PARAMETERS:  None
204118611Snjl *
205118611Snjl * RETURN:      None
206118611Snjl *
207237412Sjkim * DESCRIPTION: Display help message for output filename generation
208118611Snjl *
209118611Snjl ******************************************************************************/
210118611Snjl
211151937Sjkimstatic void
212237412SjkimFilenameHelp (
213118611Snjl    void)
214118611Snjl{
215118611Snjl
216228110Sjkim    printf ("\nAML output filename generation:\n");
217118611Snjl    printf ("  Output filenames are generated by appending an extension to a common\n");
218241973Sjkim    printf ("  filename prefix. The filename prefix is obtained via one of the\n");
219118611Snjl    printf ("  following methods (in priority order):\n");
220118611Snjl    printf ("    1) The -p option specifies the prefix\n");
221118611Snjl    printf ("    2) The prefix of the AMLFileName in the ASL Definition Block\n");
222118611Snjl    printf ("    3) The prefix of the input filename\n");
223118611Snjl    printf ("\n");
224118611Snjl}
225118611Snjl
226118611Snjl
227118611Snjl/*******************************************************************************
228118611Snjl *
229118611Snjl * FUNCTION:    Usage
230118611Snjl *
231118611Snjl * PARAMETERS:  None
232118611Snjl *
233118611Snjl * RETURN:      None
234118611Snjl *
235118611Snjl * DESCRIPTION: Display usage and option message
236118611Snjl *
237118611Snjl ******************************************************************************/
238118611Snjl
239151937Sjkimstatic void
240118611SnjlUsage (
241118611Snjl    void)
242118611Snjl{
243118611Snjl
244228110Sjkim    printf ("%s\n\n", ASL_COMPLIANCE);
245228110Sjkim    ACPI_USAGE_HEADER ("iasl [Options] [Files]");
246118611Snjl    Options ();
247118611Snjl}
248118611Snjl
249118611Snjl
250240716Sjkim/******************************************************************************
251240716Sjkim *
252240716Sjkim * FUNCTION:    AslSignalHandler
253240716Sjkim *
254240716Sjkim * PARAMETERS:  Sig                 - Signal that invoked this handler
255240716Sjkim *
256240716Sjkim * RETURN:      None
257240716Sjkim *
258240716Sjkim * DESCRIPTION: Control-C handler. Delete any intermediate files and any
259240716Sjkim *              output files that may be left in an indeterminate state.
260240716Sjkim *
261240716Sjkim *****************************************************************************/
262240716Sjkim
263240716Sjkimstatic void ACPI_SYSTEM_XFACE
264240716SjkimAslSignalHandler (
265240716Sjkim    int                     Sig)
266240716Sjkim{
267240716Sjkim    UINT32                  i;
268240716Sjkim
269240716Sjkim
270240716Sjkim    signal (Sig, SIG_IGN);
271240716Sjkim    printf ("Aborting\n\n");
272240716Sjkim
273240716Sjkim    /* Close all open files */
274240716Sjkim
275240716Sjkim    Gbl_Files[ASL_FILE_PREPROCESSOR].Handle = NULL; /* the .i file is same as source file */
276240716Sjkim
277240716Sjkim    for (i = ASL_FILE_INPUT; i < ASL_MAX_FILE_TYPE; i++)
278240716Sjkim    {
279240716Sjkim        FlCloseFile (i);
280240716Sjkim    }
281240716Sjkim
282240716Sjkim    /* Delete any output files */
283240716Sjkim
284240716Sjkim    for (i = ASL_FILE_AML_OUTPUT; i < ASL_MAX_FILE_TYPE; i++)
285240716Sjkim    {
286240716Sjkim        FlDeleteFile (i);
287240716Sjkim    }
288240716Sjkim
289240716Sjkim    exit (0);
290240716Sjkim}
291240716Sjkim
292240716Sjkim
293118611Snjl/*******************************************************************************
294118611Snjl *
295118611Snjl * FUNCTION:    AslInitialize
296118611Snjl *
297118611Snjl * PARAMETERS:  None
298118611Snjl *
299118611Snjl * RETURN:      None
300118611Snjl *
301118611Snjl * DESCRIPTION: Initialize compiler globals
302118611Snjl *
303118611Snjl ******************************************************************************/
304118611Snjl
305151937Sjkimstatic void
306151937SjkimAslInitialize (
307151937Sjkim    void)
308118611Snjl{
309118611Snjl    UINT32                  i;
310118611Snjl
311118611Snjl
312118611Snjl#ifdef _DEBUG
313118611Snjl    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
314118611Snjl#endif
315118611Snjl
316118611Snjl
317118611Snjl    for (i = 0; i < ASL_NUM_FILES; i++)
318118611Snjl    {
319118611Snjl        Gbl_Files[i].Handle = NULL;
320118611Snjl        Gbl_Files[i].Filename = NULL;
321118611Snjl    }
322118611Snjl
323118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Handle   = stdout;
324118611Snjl    Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
325118611Snjl
326118611Snjl    Gbl_Files[ASL_FILE_STDERR].Handle   = stderr;
327118611Snjl    Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
328240716Sjkim
329240716Sjkim    /* Allocate the line buffer(s) */
330240716Sjkim
331240716Sjkim    Gbl_LineBufferSize /= 2;
332240716Sjkim    UtExpandLineBuffers ();
333118611Snjl}
334118611Snjl
335118611Snjl
336118611Snjl/*******************************************************************************
337118611Snjl *
338197104Sjkim * FUNCTION:    AslMergeOptionTokens
339118611Snjl *
340197104Sjkim * PARAMETERS:  InBuffer            - Input containing an option string
341197104Sjkim *              OutBuffer           - Merged output buffer
342118611Snjl *
343118611Snjl * RETURN:      None
344118611Snjl *
345197104Sjkim * DESCRIPTION: Remove all whitespace from an option string.
346118611Snjl *
347118611Snjl ******************************************************************************/
348118611Snjl
349197104Sjkimstatic void
350197104SjkimAslMergeOptionTokens (
351197104Sjkim    char                    *InBuffer,
352197104Sjkim    char                    *OutBuffer)
353197104Sjkim{
354197104Sjkim    char                    *Token;
355197104Sjkim
356197104Sjkim
357197104Sjkim    *OutBuffer = 0;
358197104Sjkim
359197104Sjkim    Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS);
360197104Sjkim    while (Token)
361197104Sjkim    {
362197104Sjkim        strcat (OutBuffer, Token);
363197104Sjkim        Token = strtok (NULL, ASL_TOKEN_SEPARATORS);
364197104Sjkim    }
365197104Sjkim}
366197104Sjkim
367197104Sjkim
368197104Sjkim/*******************************************************************************
369197104Sjkim *
370197104Sjkim * FUNCTION:    AslDoResponseFile
371197104Sjkim *
372197104Sjkim * PARAMETERS:  Filename        - Name of the response file
373197104Sjkim *
374197104Sjkim * RETURN:      Status
375197104Sjkim *
376197104Sjkim * DESCRIPTION: Open a response file and process all options within.
377197104Sjkim *
378197104Sjkim ******************************************************************************/
379197104Sjkim
380193529Sjkimstatic int
381197104SjkimAslDoResponseFile (
382197104Sjkim    char                    *Filename)
383118611Snjl{
384197104Sjkim    char                    *argv = StringBuffer2;
385197104Sjkim    FILE                    *ResponseFile;
386197104Sjkim    int                     OptStatus = 0;
387197104Sjkim    int                     Opterr;
388197104Sjkim    int                     Optind;
389118611Snjl
390118611Snjl
391197104Sjkim    ResponseFile = fopen (Filename, "r");
392197104Sjkim    if (!ResponseFile)
393197104Sjkim    {
394197104Sjkim        printf ("Could not open command file %s, %s\n",
395197104Sjkim            Filename, strerror (errno));
396241973Sjkim        return (-1);
397197104Sjkim    }
398118611Snjl
399197104Sjkim    /* Must save the current GetOpt globals */
400197104Sjkim
401197104Sjkim    Opterr = AcpiGbl_Opterr;
402197104Sjkim    Optind = AcpiGbl_Optind;
403197104Sjkim
404197104Sjkim    /*
405197104Sjkim     * Process all lines in the response file. There must be one complete
406197104Sjkim     * option per line
407197104Sjkim     */
408197104Sjkim    while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile))
409118611Snjl    {
410197104Sjkim        /* Compress all tokens, allowing us to use a single argv entry */
411197104Sjkim
412197104Sjkim        AslMergeOptionTokens (StringBuffer, StringBuffer2);
413197104Sjkim
414197104Sjkim        /* Process the option */
415197104Sjkim
416197104Sjkim        AcpiGbl_Opterr = 0;
417197104Sjkim        AcpiGbl_Optind = 0;
418197104Sjkim
419197104Sjkim        OptStatus = AslDoOptions (1, &argv, TRUE);
420197104Sjkim        if (OptStatus)
421197104Sjkim        {
422197104Sjkim            printf ("Invalid option in command file %s: %s\n",
423197104Sjkim                Filename, StringBuffer);
424197104Sjkim            break;
425197104Sjkim        }
426118611Snjl    }
427118611Snjl
428197104Sjkim    /* Restore the GetOpt globals */
429197104Sjkim
430197104Sjkim    AcpiGbl_Opterr = Opterr;
431197104Sjkim    AcpiGbl_Optind = Optind;
432197104Sjkim
433197104Sjkim    fclose (ResponseFile);
434197104Sjkim    return (OptStatus);
435197104Sjkim}
436197104Sjkim
437197104Sjkim
438197104Sjkim/*******************************************************************************
439197104Sjkim *
440197104Sjkim * FUNCTION:    AslDoOptions
441197104Sjkim *
442197104Sjkim * PARAMETERS:  argc/argv           - Standard argc/argv
443197104Sjkim *              IsResponseFile      - TRUE if executing a response file.
444197104Sjkim *
445197104Sjkim * RETURN:      Status
446197104Sjkim *
447197104Sjkim * DESCRIPTION: Command line option processing
448197104Sjkim *
449197104Sjkim ******************************************************************************/
450197104Sjkim
451197104Sjkimstatic int
452197104SjkimAslDoOptions (
453197104Sjkim    int                     argc,
454197104Sjkim    char                    **argv,
455197104Sjkim    BOOLEAN                 IsResponseFile)
456197104Sjkim{
457197104Sjkim    int                     j;
458212761Sjkim    ACPI_STATUS             Status;
459197104Sjkim
460197104Sjkim
461118611Snjl    /* Get the command line options */
462118611Snjl
463197104Sjkim    while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j)
464118611Snjl    {
465197104Sjkim    case '@':   /* Begin a response file */
466197104Sjkim
467197104Sjkim        if (IsResponseFile)
468197104Sjkim        {
469197104Sjkim            printf ("Nested command files are not supported\n");
470233250Sjkim            return (-1);
471197104Sjkim        }
472197104Sjkim
473197104Sjkim        if (AslDoResponseFile (AcpiGbl_Optarg))
474197104Sjkim        {
475233250Sjkim            return (-1);
476197104Sjkim        }
477197104Sjkim        break;
478197104Sjkim
479197104Sjkim
480233250Sjkim    case 'b':   /* Debug output options */
481118611Snjl        switch (AcpiGbl_Optarg[0])
482118611Snjl        {
483237412Sjkim        case 'f':
484118611Snjl            AslCompilerdebug = 1; /* same as yydebug */
485220663Sjkim            DtParserdebug = 1;
486233250Sjkim            PrParserdebug = 1;
487118611Snjl            break;
488118611Snjl
489118611Snjl        case 't':
490118611Snjl            break;
491118611Snjl
492118611Snjl        default:
493118611Snjl            printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
494197104Sjkim            return (-1);
495118611Snjl        }
496118611Snjl
497118611Snjl        /* Produce debug output file */
498118611Snjl
499118611Snjl        Gbl_DebugFlag = TRUE;
500118611Snjl        break;
501118611Snjl
502118611Snjl
503118611Snjl    case 'c':
504207344Sjkim        switch (AcpiGbl_Optarg[0])
505207344Sjkim        {
506207344Sjkim        case 'r':
507207344Sjkim            Gbl_NoResourceChecking = TRUE;
508207344Sjkim            break;
509118611Snjl
510207344Sjkim        default:
511207344Sjkim            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
512207344Sjkim            return (-1);
513207344Sjkim        }
514118611Snjl        break;
515118611Snjl
516118611Snjl
517233250Sjkim    case 'd':   /* Disassembler */
518118611Snjl        switch (AcpiGbl_Optarg[0])
519118611Snjl        {
520118611Snjl        case '^':
521193529Sjkim            Gbl_DoCompile = FALSE;
522118611Snjl            break;
523118611Snjl
524210976Sjkim        case 'a':
525210976Sjkim            Gbl_DoCompile = FALSE;
526210976Sjkim            Gbl_DisassembleAll = TRUE;
527210976Sjkim            break;
528210976Sjkim
529240716Sjkim        case 'b':   /* Do not convert buffers to resource descriptors */
530240716Sjkim            AcpiGbl_NoResourceDisassembly = TRUE;
531240716Sjkim            break;
532240716Sjkim
533118611Snjl        case 'c':
534118611Snjl            break;
535118611Snjl
536118611Snjl        default:
537118611Snjl            printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
538197104Sjkim            return (-1);
539118611Snjl        }
540118611Snjl
541118611Snjl        Gbl_DisasmFlag = TRUE;
542118611Snjl        break;
543118611Snjl
544118611Snjl
545233250Sjkim    case 'D':   /* Define a symbol */
546233250Sjkim        PrAddDefine (AcpiGbl_Optarg, NULL, TRUE);
547233250Sjkim        break;
548233250Sjkim
549233250Sjkim
550233250Sjkim    case 'e':   /* External files for disassembler */
551212761Sjkim        Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg);
552212761Sjkim        if (ACPI_FAILURE (Status))
553212761Sjkim        {
554212761Sjkim            printf ("Could not add %s to external list\n", AcpiGbl_Optarg);
555212761Sjkim            return (-1);
556212761Sjkim        }
557118611Snjl        break;
558118611Snjl
559118611Snjl
560233250Sjkim    case 'f':   /* Ignore errors and force creation of aml file */
561233250Sjkim        Gbl_IgnoreErrors = TRUE;
562233250Sjkim        break;
563118611Snjl
564118611Snjl
565233250Sjkim    case 'G':
566233250Sjkim        Gbl_CompileGeneric = TRUE;
567118611Snjl        break;
568118611Snjl
569118611Snjl
570233250Sjkim    case 'g':   /* Get all ACPI tables */
571118611Snjl
572118611Snjl        Gbl_GetAllTables = TRUE;
573193529Sjkim        Gbl_DoCompile = FALSE;
574118611Snjl        break;
575118611Snjl
576118611Snjl
577118611Snjl    case 'h':
578118611Snjl        switch (AcpiGbl_Optarg[0])
579118611Snjl        {
580118611Snjl        case '^':
581237412Sjkim            Usage ();
582118611Snjl            exit (0);
583118611Snjl
584118611Snjl        case 'c':
585118611Snjl            UtDisplayConstantOpcodes ();
586118611Snjl            exit (0);
587118611Snjl
588237412Sjkim        case 'f':
589237412Sjkim            FilenameHelp ();
590237412Sjkim            exit (0);
591237412Sjkim
592118611Snjl        case 'r':
593118611Snjl            /* reserved names */
594118611Snjl
595204773Sjkim            ApDisplayReservedNames ();
596118611Snjl            exit (0);
597118611Snjl
598209746Sjkim        case 't':
599209746Sjkim            UtDisplaySupportedTables ();
600209746Sjkim            exit (0);
601209746Sjkim
602118611Snjl        default:
603118611Snjl            printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
604197104Sjkim            return (-1);
605118611Snjl        }
606118611Snjl
607118611Snjl
608233250Sjkim    case 'I':   /* Add an include file search directory */
609197104Sjkim        FlAddIncludeDirectory (AcpiGbl_Optarg);
610197104Sjkim        break;
611197104Sjkim
612197104Sjkim
613233250Sjkim    case 'i':   /* Output AML as an include file */
614118611Snjl        switch (AcpiGbl_Optarg[0])
615118611Snjl        {
616118611Snjl        case 'a':
617118611Snjl
618118611Snjl            /* Produce assembly code include file */
619118611Snjl
620118611Snjl            Gbl_AsmIncludeOutputFlag = TRUE;
621118611Snjl            break;
622118611Snjl
623118611Snjl        case 'c':
624118611Snjl
625118611Snjl            /* Produce C include file */
626118611Snjl
627118611Snjl            Gbl_C_IncludeOutputFlag = TRUE;
628118611Snjl            break;
629118611Snjl
630245582Sjkim        case 'n':
631245582Sjkim
632245582Sjkim            /* Compiler/Disassembler: Ignore the NOOP operator */
633245582Sjkim
634245582Sjkim            AcpiGbl_IgnoreNoopOperator = TRUE;
635245582Sjkim            break;
636245582Sjkim
637118611Snjl        default:
638233250Sjkim            printf ("Unknown option: -i%s\n", AcpiGbl_Optarg);
639197104Sjkim            return (-1);
640118611Snjl        }
641118611Snjl        break;
642118611Snjl
643118611Snjl
644233250Sjkim    case 'l':   /* Listing files */
645118611Snjl        switch (AcpiGbl_Optarg[0])
646118611Snjl        {
647118611Snjl        case '^':
648118611Snjl            /* Produce listing file (Mixed source/aml) */
649118611Snjl
650118611Snjl            Gbl_ListingFlag = TRUE;
651118611Snjl            break;
652118611Snjl
653233250Sjkim        case 'i':
654233250Sjkim            /* Produce preprocessor output file */
655233250Sjkim
656233250Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
657233250Sjkim            break;
658233250Sjkim
659118611Snjl        case 'n':
660118611Snjl            /* Produce namespace file */
661118611Snjl
662118611Snjl            Gbl_NsOutputFlag = TRUE;
663118611Snjl            break;
664118611Snjl
665118611Snjl        case 's':
666118611Snjl            /* Produce combined source file */
667118611Snjl
668118611Snjl            Gbl_SourceOutputFlag = TRUE;
669118611Snjl            break;
670118611Snjl
671118611Snjl        default:
672118611Snjl            printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
673197104Sjkim            return (-1);
674118611Snjl        }
675118611Snjl        break;
676118611Snjl
677118611Snjl
678240716Sjkim    case 'm':   /* Set line buffer size */
679240716Sjkim        Gbl_LineBufferSize = (UINT32) strtoul (AcpiGbl_Optarg, NULL, 0) * 1024;
680240716Sjkim        if (Gbl_LineBufferSize < ASL_DEFAULT_LINE_BUFFER_SIZE)
681240716Sjkim        {
682240716Sjkim            Gbl_LineBufferSize = ASL_DEFAULT_LINE_BUFFER_SIZE;
683240716Sjkim        }
684240716Sjkim        printf ("Line Buffer Size: %u\n", Gbl_LineBufferSize);
685228110Sjkim        break;
686228110Sjkim
687228110Sjkim
688233250Sjkim    case 'n':   /* Parse only */
689228110Sjkim        Gbl_ParseOnlyFlag = TRUE;
690228110Sjkim        break;
691228110Sjkim
692228110Sjkim
693233250Sjkim    case 'o':   /* Control compiler AML optimizations */
694118611Snjl        switch (AcpiGbl_Optarg[0])
695118611Snjl        {
696118611Snjl        case 'a':
697118611Snjl
698118611Snjl            /* Disable all optimizations */
699118611Snjl
700118611Snjl            Gbl_FoldConstants = FALSE;
701118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
702118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
703118611Snjl            break;
704118611Snjl
705118611Snjl        case 'f':
706118611Snjl
707118611Snjl            /* Disable folding on "normal" expressions */
708118611Snjl
709118611Snjl            Gbl_FoldConstants = FALSE;
710118611Snjl            break;
711118611Snjl
712118611Snjl        case 'i':
713118611Snjl
714118611Snjl            /* Disable integer optimization to constants */
715118611Snjl
716118611Snjl            Gbl_IntegerOptimizationFlag = FALSE;
717118611Snjl            break;
718118611Snjl
719118611Snjl        case 'n':
720118611Snjl
721118611Snjl            /* Disable named reference optimization */
722118611Snjl
723118611Snjl            Gbl_ReferenceOptimizationFlag = FALSE;
724118611Snjl            break;
725118611Snjl
726118611Snjl        case 't':
727118611Snjl
728118611Snjl            /* Display compile time(s) */
729118611Snjl
730118611Snjl            Gbl_CompileTimesFlag = TRUE;
731118611Snjl            break;
732118611Snjl
733118611Snjl        default:
734118611Snjl            printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
735197104Sjkim            return (-1);
736118611Snjl        }
737118611Snjl        break;
738118611Snjl
739118611Snjl
740234623Sjkim    case 'P':   /* Preprocessor options */
741234623Sjkim        switch (AcpiGbl_Optarg[0])
742234623Sjkim        {
743234623Sjkim        case '^':   /* Proprocess only, emit (.i) file */
744234623Sjkim            Gbl_PreprocessOnly = TRUE;
745234623Sjkim            Gbl_PreprocessorOutputFlag = TRUE;
746234623Sjkim            break;
747234623Sjkim
748234623Sjkim        case 'n':   /* Disable preprocessor */
749234623Sjkim            Gbl_PreprocessFlag = FALSE;
750234623Sjkim            break;
751234623Sjkim
752234623Sjkim        default:
753234623Sjkim            printf ("Unknown option: -P%s\n", AcpiGbl_Optarg);
754234623Sjkim            return (-1);
755234623Sjkim        }
756233250Sjkim        break;
757118611Snjl
758118611Snjl
759233250Sjkim    case 'p':   /* Override default AML output filename */
760118611Snjl        Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
761118611Snjl        Gbl_UseDefaultAmlFilename = FALSE;
762118611Snjl        break;
763118611Snjl
764118611Snjl
765233250Sjkim    case 'r':   /* Override revision found in table header */
766138287Smarks        Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
767118611Snjl        break;
768118611Snjl
769118611Snjl
770233250Sjkim    case 's':   /* Create AML in a source code file */
771118611Snjl        switch (AcpiGbl_Optarg[0])
772118611Snjl        {
773118611Snjl        case 'a':
774118611Snjl
775118611Snjl            /* Produce assembly code output file */
776118611Snjl
777118611Snjl            Gbl_AsmOutputFlag = TRUE;
778118611Snjl            break;
779118611Snjl
780118611Snjl        case 'c':
781118611Snjl
782118611Snjl            /* Produce C hex output file */
783118611Snjl
784118611Snjl            Gbl_C_OutputFlag = TRUE;
785118611Snjl            break;
786118611Snjl
787118611Snjl        default:
788118611Snjl            printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
789197104Sjkim            return (-1);
790118611Snjl        }
791118611Snjl        break;
792118611Snjl
793118611Snjl
794233250Sjkim    case 't':   /* Produce hex table output file */
795118611Snjl        switch (AcpiGbl_Optarg[0])
796118611Snjl        {
797118611Snjl        case 'a':
798118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
799118611Snjl            break;
800118611Snjl
801118611Snjl        case 'c':
802118611Snjl            Gbl_HexOutputFlag = HEX_OUTPUT_C;
803118611Snjl            break;
804118611Snjl
805207344Sjkim        case 's':
806207344Sjkim            Gbl_HexOutputFlag = HEX_OUTPUT_ASL;
807207344Sjkim            break;
808207344Sjkim
809118611Snjl        default:
810118611Snjl            printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
811197104Sjkim            return (-1);
812118611Snjl        }
813118611Snjl        break;
814118611Snjl
815118611Snjl
816233250Sjkim    case 'T':   /* Create a ACPI table template file */
817209746Sjkim        Gbl_DoTemplates = TRUE;
818209746Sjkim        Gbl_TemplateSignature = AcpiGbl_Optarg;
819209746Sjkim        break;
820209746Sjkim
821209746Sjkim
822238381Sjkim    case 'v':   /* Version and verbosity settings */
823118611Snjl        switch (AcpiGbl_Optarg[0])
824118611Snjl        {
825238381Sjkim        case '^':
826238381Sjkim            printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
827238381Sjkim            exit (0);
828238381Sjkim
829193529Sjkim        case 'a':
830193529Sjkim            /* Disable All error/warning messages */
831193529Sjkim
832193529Sjkim            Gbl_NoErrors = TRUE;
833193529Sjkim            break;
834193529Sjkim
835118611Snjl        case 'i':
836235945Sjkim            /*
837235945Sjkim             * Support for integrated development environment(s).
838235945Sjkim             *
839235945Sjkim             * 1) No compiler signon
840235945Sjkim             * 2) Send stderr messages to stdout
841235945Sjkim             * 3) Less verbose error messages (single line only for each)
842235945Sjkim             * 4) Error/warning messages are formatted appropriately to
843235945Sjkim             *    be recognized by MS Visual Studio
844235945Sjkim             */
845118611Snjl            Gbl_VerboseErrors = FALSE;
846235945Sjkim            Gbl_DoSignon = FALSE;
847235945Sjkim            Gbl_Files[ASL_FILE_STDERR].Handle = stdout;
848118611Snjl            break;
849118611Snjl
850118611Snjl        case 'o':
851118611Snjl            Gbl_DisplayOptimizations = TRUE;
852118611Snjl            break;
853118611Snjl
854118611Snjl        case 'r':
855118611Snjl            Gbl_DisplayRemarks = FALSE;
856118611Snjl            break;
857118611Snjl
858118611Snjl        case 's':
859193529Sjkim            Gbl_DoSignon = FALSE;
860118611Snjl            break;
861118611Snjl
862209746Sjkim        case 't':
863209746Sjkim            Gbl_VerboseTemplates = TRUE;
864209746Sjkim            break;
865209746Sjkim
866118611Snjl        default:
867118611Snjl            printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
868197104Sjkim            return (-1);
869118611Snjl        }
870118611Snjl        break;
871118611Snjl
872118611Snjl
873167802Sjkim    case 'w': /* Set warning levels */
874167802Sjkim        switch (AcpiGbl_Optarg[0])
875167802Sjkim        {
876167802Sjkim        case '1':
877167802Sjkim            Gbl_WarningLevel = ASL_WARNING;
878167802Sjkim            break;
879167802Sjkim
880167802Sjkim        case '2':
881167802Sjkim            Gbl_WarningLevel = ASL_WARNING2;
882167802Sjkim            break;
883167802Sjkim
884167802Sjkim        case '3':
885167802Sjkim            Gbl_WarningLevel = ASL_WARNING3;
886167802Sjkim            break;
887167802Sjkim
888234623Sjkim        case 'e':
889234623Sjkim            Gbl_WarningsAsErrors = TRUE;
890234623Sjkim            break;
891234623Sjkim
892167802Sjkim        default:
893167802Sjkim            printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
894197104Sjkim            return (-1);
895167802Sjkim        }
896167802Sjkim        break;
897167802Sjkim
898167802Sjkim
899233250Sjkim    case 'x':   /* Set debug print output level */
900118611Snjl        AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
901118611Snjl        break;
902118611Snjl
903118611Snjl
904209746Sjkim    case 'z':
905209746Sjkim        Gbl_UseOriginalCompilerId = TRUE;
906209746Sjkim        break;
907209746Sjkim
908209746Sjkim
909118611Snjl    default:
910197104Sjkim        return (-1);
911118611Snjl    }
912118611Snjl
913197104Sjkim    return (0);
914197104Sjkim}
915197104Sjkim
916197104Sjkim
917197104Sjkim/*******************************************************************************
918197104Sjkim *
919197104Sjkim * FUNCTION:    AslCommandLine
920197104Sjkim *
921197104Sjkim * PARAMETERS:  argc/argv
922197104Sjkim *
923197104Sjkim * RETURN:      Last argv index
924197104Sjkim *
925197104Sjkim * DESCRIPTION: Command line processing
926197104Sjkim *
927197104Sjkim ******************************************************************************/
928197104Sjkim
929197104Sjkimstatic int
930197104SjkimAslCommandLine (
931197104Sjkim    int                     argc,
932197104Sjkim    char                    **argv)
933197104Sjkim{
934197104Sjkim    int                     BadCommandLine = 0;
935212761Sjkim    ACPI_STATUS             Status;
936197104Sjkim
937197104Sjkim
938197104Sjkim    /* Minimum command line contains at least the command and an input file */
939197104Sjkim
940197104Sjkim    if (argc < 2)
941197104Sjkim    {
942213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
943197104Sjkim        Usage ();
944197104Sjkim        exit (1);
945197104Sjkim    }
946197104Sjkim
947197104Sjkim    /* Process all command line options */
948197104Sjkim
949197104Sjkim    BadCommandLine = AslDoOptions (argc, argv, FALSE);
950197104Sjkim
951209746Sjkim    if (Gbl_DoTemplates)
952209746Sjkim    {
953212761Sjkim        Status = DtCreateTemplates (Gbl_TemplateSignature);
954212761Sjkim        if (ACPI_FAILURE (Status))
955212761Sjkim        {
956212761Sjkim            exit (-1);
957212761Sjkim        }
958209746Sjkim        exit (1);
959209746Sjkim    }
960209746Sjkim
961118611Snjl    /* Next parameter must be the input filename */
962118611Snjl
963193529Sjkim    if (!argv[AcpiGbl_Optind] &&
964151937Sjkim        !Gbl_DisasmFlag &&
965151937Sjkim        !Gbl_GetAllTables)
966118611Snjl    {
967118611Snjl        printf ("Missing input filename\n");
968118611Snjl        BadCommandLine = TRUE;
969118611Snjl    }
970118611Snjl
971193529Sjkim    if (Gbl_DoSignon)
972118611Snjl    {
973213806Sjkim        printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME));
974229989Sjkim        if (Gbl_IgnoreErrors)
975229989Sjkim        {
976229989Sjkim            printf ("Ignoring all errors, forcing AML file generation\n\n");
977229989Sjkim        }
978118611Snjl    }
979118611Snjl
980118611Snjl    /* Abort if anything went wrong on the command line */
981118611Snjl
982118611Snjl    if (BadCommandLine)
983118611Snjl    {
984118611Snjl        printf ("\n");
985118611Snjl        Usage ();
986118611Snjl        exit (1);
987118611Snjl    }
988118611Snjl
989193529Sjkim    return (AcpiGbl_Optind);
990118611Snjl}
991118611Snjl
992118611Snjl
993118611Snjl/*******************************************************************************
994118611Snjl *
995118611Snjl * FUNCTION:    main
996118611Snjl *
997118611Snjl * PARAMETERS:  Standard argc/argv
998118611Snjl *
999118611Snjl * RETURN:      Program termination code
1000118611Snjl *
1001193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
1002193529Sjkim *              options and begin the compile for each file on the command line
1003118611Snjl *
1004118611Snjl ******************************************************************************/
1005118611Snjl
1006118611Snjlint ACPI_SYSTEM_XFACE
1007118611Snjlmain (
1008118611Snjl    int                     argc,
1009118611Snjl    char                    **argv)
1010118611Snjl{
1011118611Snjl    ACPI_STATUS             Status;
1012210976Sjkim    int                     Index1;
1013210976Sjkim    int                     Index2;
1014118611Snjl
1015118611Snjl
1016240716Sjkim    signal (SIGINT, AslSignalHandler);
1017240716Sjkim
1018210976Sjkim    AcpiGbl_ExternalFileList = NULL;
1019240716Sjkim    AcpiDbgLevel = 0;
1020210976Sjkim
1021151937Sjkim#ifdef _DEBUG
1022151937Sjkim    _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
1023151937Sjkim                    _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
1024151937Sjkim#endif
1025151937Sjkim
1026118611Snjl    /* Init and command line */
1027118611Snjl
1028240716Sjkim    Index1 = Index2 = AslCommandLine (argc, argv);
1029240716Sjkim
1030118611Snjl    AslInitialize ();
1031233250Sjkim    PrInitializePreprocessor ();
1032118611Snjl
1033193529Sjkim    /* Options that have no additional parameters or pathnames */
1034118611Snjl
1035193529Sjkim    if (Gbl_GetAllTables)
1036118611Snjl    {
1037193529Sjkim        Status = AslDoOneFile (NULL);
1038118611Snjl        if (ACPI_FAILURE (Status))
1039118611Snjl        {
1040193529Sjkim            return (-1);
1041118611Snjl        }
1042193529Sjkim        return (0);
1043193529Sjkim    }
1044118611Snjl
1045210976Sjkim    if (Gbl_DisassembleAll)
1046210976Sjkim    {
1047210976Sjkim        while (argv[Index1])
1048210976Sjkim        {
1049210976Sjkim            Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList);
1050210976Sjkim            if (ACPI_FAILURE (Status))
1051210976Sjkim            {
1052210976Sjkim                return (-1);
1053210976Sjkim            }
1054210976Sjkim
1055210976Sjkim            Index1++;
1056210976Sjkim        }
1057210976Sjkim    }
1058210976Sjkim
1059193529Sjkim    /* Process each pathname/filename in the list, with possible wildcards */
1060118611Snjl
1061210976Sjkim    while (argv[Index2])
1062118611Snjl    {
1063210976Sjkim        Status = AslDoOnePathname (argv[Index2], AslDoOneFile);
1064151937Sjkim        if (ACPI_FAILURE (Status))
1065151937Sjkim        {
1066193529Sjkim            return (-1);
1067151937Sjkim        }
1068118611Snjl
1069210976Sjkim        Index2++;
1070118611Snjl    }
1071118611Snjl
1072210976Sjkim    if (AcpiGbl_ExternalFileList)
1073210976Sjkim    {
1074210976Sjkim        AcpiDmClearExternalFileList();
1075210976Sjkim    }
1076210976Sjkim
1077118611Snjl    return (0);
1078118611Snjl}
1079