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