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