aslmain.c revision 238381
1214501Srpaulo 2214501Srpaulo/****************************************************************************** 3214501Srpaulo * 4214501Srpaulo * Module Name: aslmain - compiler main and utilities 5214501Srpaulo * 6214501Srpaulo *****************************************************************************/ 7214501Srpaulo 8214501Srpaulo/* 9214501Srpaulo * Copyright (C) 2000 - 2012, Intel Corp. 10214501Srpaulo * All rights reserved. 11214501Srpaulo * 12214501Srpaulo * Redistribution and use in source and binary forms, with or without 13214501Srpaulo * modification, are permitted provided that the following conditions 14214501Srpaulo * are met: 15214501Srpaulo * 1. Redistributions of source code must retain the above copyright 16214501Srpaulo * notice, this list of conditions, and the following disclaimer, 17214501Srpaulo * without modification. 18214501Srpaulo * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19214501Srpaulo * substantially similar to the "NO WARRANTY" disclaimer below 20214501Srpaulo * ("Disclaimer") and any redistribution must be conditioned upon 21214501Srpaulo * including a substantially similar Disclaimer requirement for further 22214501Srpaulo * binary redistribution. 23214501Srpaulo * 3. Neither the names of the above-listed copyright holders nor the names 24214501Srpaulo * of any contributors may be used to endorse or promote products derived 25214501Srpaulo * from this software without specific prior written permission. 26214501Srpaulo * 27214501Srpaulo * Alternatively, this software may be distributed under the terms of the 28214501Srpaulo * GNU General Public License ("GPL") version 2 as published by the Free 29214501Srpaulo * Software Foundation. 30214501Srpaulo * 31214501Srpaulo * NO WARRANTY 32214501Srpaulo * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33214501Srpaulo * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34214501Srpaulo * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35214501Srpaulo * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36214501Srpaulo * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37214501Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38214501Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39214501Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40214501Srpaulo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41214501Srpaulo * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42214501Srpaulo * POSSIBILITY OF SUCH DAMAGES. 43214501Srpaulo */ 44214501Srpaulo 45214501Srpaulo 46214501Srpaulo#define _DECLARE_GLOBALS 47214501Srpaulo 48214501Srpaulo#include <contrib/dev/acpica/compiler/aslcompiler.h> 49214501Srpaulo#include <contrib/dev/acpica/include/acapps.h> 50214501Srpaulo#include <contrib/dev/acpica/include/acdisasm.h> 51214501Srpaulo 52214501Srpaulo#ifdef _DEBUG 53214501Srpaulo#include <crtdbg.h> 54214501Srpaulo#endif 55214501Srpaulo 56214501Srpaulo#define _COMPONENT ACPI_COMPILER 57214501Srpaulo ACPI_MODULE_NAME ("aslmain") 58214501Srpaulo 59214501Srpaulo/* Local prototypes */ 60214501Srpaulo 61214501Srpaulostatic void 62214501SrpauloOptions ( 63214501Srpaulo void); 64214501Srpaulo 65214501Srpaulostatic void 66214501SrpauloFilenameHelp ( 67214501Srpaulo void); 68214501Srpaulo 69214501Srpaulostatic void 70214501SrpauloUsage ( 71214501Srpaulo void); 72214501Srpaulo 73214501Srpaulostatic void 74214501SrpauloAslInitialize ( 75214501Srpaulo void); 76214501Srpaulo 77214501Srpaulostatic int 78214501SrpauloAslCommandLine ( 79214501Srpaulo int argc, 80214501Srpaulo char **argv); 81214501Srpaulo 82214501Srpaulostatic int 83214501SrpauloAslDoOptions ( 84214501Srpaulo int argc, 85214501Srpaulo char **argv, 86214501Srpaulo BOOLEAN IsResponseFile); 87214501Srpaulo 88214501Srpaulostatic void 89214501SrpauloAslMergeOptionTokens ( 90214501Srpaulo char *InBuffer, 91214501Srpaulo char *OutBuffer); 92214501Srpaulo 93214501Srpaulostatic int 94214501SrpauloAslDoResponseFile ( 95214501Srpaulo char *Filename); 96214501Srpaulo 97214501Srpaulo 98214501Srpaulo#define ASL_TOKEN_SEPARATORS " \t\n" 99214501Srpaulo#define ASL_SUPPORTED_OPTIONS "@:2b|c|d^D:e:fgh^i|I:l^mno|p:P^r:s|t|T:G^v^w|x:z" 100214501Srpaulo 101214501Srpaulo 102214501Srpaulo/******************************************************************************* 103214501Srpaulo * 104214501Srpaulo * FUNCTION: Options 105214501Srpaulo * 106214501Srpaulo * PARAMETERS: None 107214501Srpaulo * 108214501Srpaulo * RETURN: None 109214501Srpaulo * 110214501Srpaulo * DESCRIPTION: Display option help message 111214501Srpaulo * 112214501Srpaulo ******************************************************************************/ 113214501Srpaulo 114214501Srpaulostatic void 115214501SrpauloOptions ( 116214501Srpaulo void) 117214501Srpaulo{ 118214501Srpaulo 119214501Srpaulo printf ("\nGlobal:\n"); 120214501Srpaulo ACPI_OPTION ("-@ <file>", "Specify command file"); 121214501Srpaulo ACPI_OPTION ("-I <dir>", "Specify additional include directory"); 122214501Srpaulo ACPI_OPTION ("-v", "Display compiler version"); 123214501Srpaulo 124214501Srpaulo printf ("\nPreprocessor:\n"); 125214501Srpaulo ACPI_OPTION ("-D <symbol>", "Define symbol for preprocessor use"); 126214501Srpaulo ACPI_OPTION ("-li", "Create preprocessed output file (*.i)"); 127214501Srpaulo ACPI_OPTION ("-P", "Preprocess only and create preprocessor output file (*.i)"); 128214501Srpaulo ACPI_OPTION ("-Pn", "Disable preprocessor"); 129214501Srpaulo 130214501Srpaulo printf ("\nGeneral Output:\n"); 131214501Srpaulo ACPI_OPTION ("-p <prefix>", "Specify path/filename prefix for all output files"); 132214501Srpaulo ACPI_OPTION ("-va", "Disable all errors and warnings (summary only)"); 133214501Srpaulo ACPI_OPTION ("-vi", "Less verbose errors and warnings for use with IDEs"); 134214501Srpaulo ACPI_OPTION ("-vo", "Enable optimization comments"); 135214501Srpaulo ACPI_OPTION ("-vr", "Disable remarks"); 136214501Srpaulo ACPI_OPTION ("-vs", "Disable signon"); 137214501Srpaulo ACPI_OPTION ("-w1 -w2 -w3", "Set warning reporting level"); 138214501Srpaulo ACPI_OPTION ("-we", "Report warnings as errors"); 139214501Srpaulo 140214501Srpaulo printf ("\nAML Output Files:\n"); 141214501Srpaulo ACPI_OPTION ("-sa -sc", "Create AML in assembler or C source file (*.asm or *.c)"); 142214501Srpaulo ACPI_OPTION ("-ia -ic", "Create assembler or C include file (*.inc or *.h)"); 143214501Srpaulo ACPI_OPTION ("-ta -tc -ts", "Create AML in assembler, C, or ASL hex table (*.hex)"); 144214501Srpaulo 145214501Srpaulo printf ("\nAML Code Generation:\n"); 146214501Srpaulo ACPI_OPTION ("-oa", "Disable all optimizations (compatibility mode)"); 147214501Srpaulo ACPI_OPTION ("-of", "Disable constant folding"); 148214501Srpaulo ACPI_OPTION ("-oi", "Disable integer optimization to Zero/One/Ones"); 149214501Srpaulo ACPI_OPTION ("-on", "Disable named reference string optimization"); 150214501Srpaulo ACPI_OPTION ("-cr", "Disable Resource Descriptor error checking"); 151214501Srpaulo ACPI_OPTION ("-r <revision>", "Override table header Revision (1-255)"); 152214501Srpaulo 153214501Srpaulo printf ("\nASL Listing Files:\n"); 154214501Srpaulo ACPI_OPTION ("-l", "Create mixed listing file (ASL source and AML) (*.lst)"); 155214501Srpaulo ACPI_OPTION ("-ln", "Create namespace file (*.nsp)"); 156214501Srpaulo ACPI_OPTION ("-ls", "Create combined source file (expanded includes) (*.src)"); 157214501Srpaulo 158214501Srpaulo printf ("\nACPI Data Tables:\n"); 159214501Srpaulo ACPI_OPTION ("-G", "Compile custom table containing generic operators"); 160214501Srpaulo ACPI_OPTION ("-T <sig>|ALL|*", "Create table template file(s) for <Sig>"); 161214501Srpaulo ACPI_OPTION ("-vt", "Create verbose templates (full disassembly)"); 162214501Srpaulo 163214501Srpaulo printf ("\nAML Disassembler:\n"); 164214501Srpaulo ACPI_OPTION ("-d [file]", "Disassemble or decode binary ACPI table to file (*.dsl)"); 165214501Srpaulo ACPI_OPTION ("-da [f1,f2]", "Disassemble multiple tables from single namespace"); 166214501Srpaulo ACPI_OPTION ("-dc [file]", "Disassemble AML and immediately compile it"); 167214501Srpaulo ACPI_OPTION ("", "(Obtain DSDT from current system if no input file)"); 168214501Srpaulo ACPI_OPTION ("-e [f1,f2]", "Include ACPI table(s) for external symbol resolution"); 169214501Srpaulo ACPI_OPTION ("-m", "Do not translate Buffers to Resource Templates"); 170214501Srpaulo ACPI_OPTION ("-2", "Emit ACPI 2.0 compatible ASL code"); 171214501Srpaulo ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)"); 172214501Srpaulo 173214501Srpaulo printf ("\nHelp:\n"); 174214501Srpaulo ACPI_OPTION ("-h", "This message"); 175214501Srpaulo ACPI_OPTION ("-hc", "Display operators allowed in constant expressions"); 176214501Srpaulo ACPI_OPTION ("-hf", "Display help for output filename generation"); 177214501Srpaulo ACPI_OPTION ("-hr", "Display ACPI reserved method names"); 178214501Srpaulo ACPI_OPTION ("-ht", "Display currently supported ACPI table names"); 179214501Srpaulo 180214501Srpaulo printf ("\nDebug Options:\n"); 181214501Srpaulo ACPI_OPTION ("-bf -bt", "Create debug file (full or parse tree only) (*.txt)"); 182214501Srpaulo ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)"); 183214501Srpaulo ACPI_OPTION ("-n", "Parse only, no output generation"); 184214501Srpaulo ACPI_OPTION ("-ot", "Display compile times and statistics"); 185214501Srpaulo ACPI_OPTION ("-x <level>", "Set debug level for trace output"); 186214501Srpaulo ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables"); 187214501Srpaulo} 188214501Srpaulo 189214501Srpaulo 190214501Srpaulo/******************************************************************************* 191214501Srpaulo * 192214501Srpaulo * FUNCTION: FilenameHelp 193214501Srpaulo * 194214501Srpaulo * PARAMETERS: None 195214501Srpaulo * 196214501Srpaulo * RETURN: None 197214501Srpaulo * 198214501Srpaulo * DESCRIPTION: Display help message for output filename generation 199214501Srpaulo * 200214501Srpaulo ******************************************************************************/ 201214501Srpaulo 202214501Srpaulostatic void 203214501SrpauloFilenameHelp ( 204214501Srpaulo void) 205214501Srpaulo{ 206214501Srpaulo 207214501Srpaulo printf ("\nAML output filename generation:\n"); 208214501Srpaulo printf (" Output filenames are generated by appending an extension to a common\n"); 209214501Srpaulo printf (" filename prefix. The filename prefix is obtained via one of the\n"); 210214501Srpaulo printf (" following methods (in priority order):\n"); 211214501Srpaulo printf (" 1) The -p option specifies the prefix\n"); 212214501Srpaulo printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n"); 213214501Srpaulo printf (" 3) The prefix of the input filename\n"); 214214501Srpaulo printf ("\n"); 215214501Srpaulo} 216214501Srpaulo 217214501Srpaulo 218214501Srpaulo/******************************************************************************* 219214501Srpaulo * 220214501Srpaulo * FUNCTION: Usage 221214501Srpaulo * 222214501Srpaulo * PARAMETERS: None 223214501Srpaulo * 224214501Srpaulo * RETURN: None 225214501Srpaulo * 226214501Srpaulo * DESCRIPTION: Display usage and option message 227214501Srpaulo * 228214501Srpaulo ******************************************************************************/ 229214501Srpaulo 230214501Srpaulostatic void 231214501SrpauloUsage ( 232214501Srpaulo void) 233214501Srpaulo{ 234214501Srpaulo 235214501Srpaulo printf ("%s\n\n", ASL_COMPLIANCE); 236214501Srpaulo ACPI_USAGE_HEADER ("iasl [Options] [Files]"); 237214501Srpaulo Options (); 238214501Srpaulo} 239214501Srpaulo 240214501Srpaulo 241214501Srpaulo/******************************************************************************* 242214501Srpaulo * 243214501Srpaulo * FUNCTION: AslInitialize 244214501Srpaulo * 245214501Srpaulo * PARAMETERS: None 246214501Srpaulo * 247214501Srpaulo * RETURN: None 248214501Srpaulo * 249214501Srpaulo * DESCRIPTION: Initialize compiler globals 250214501Srpaulo * 251214501Srpaulo ******************************************************************************/ 252214501Srpaulo 253214501Srpaulostatic void 254214501SrpauloAslInitialize ( 255214501Srpaulo void) 256214501Srpaulo{ 257214501Srpaulo UINT32 i; 258214501Srpaulo 259214501Srpaulo 260214501Srpaulo#ifdef _DEBUG 261214501Srpaulo _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0)); 262214501Srpaulo#endif 263214501Srpaulo 264214501Srpaulo AcpiDbgLevel = 0; 265214501Srpaulo 266214501Srpaulo for (i = 0; i < ASL_NUM_FILES; i++) 267214501Srpaulo { 268214501Srpaulo Gbl_Files[i].Handle = NULL; 269214501Srpaulo Gbl_Files[i].Filename = NULL; 270214501Srpaulo } 271214501Srpaulo 272214501Srpaulo Gbl_Files[ASL_FILE_STDOUT].Handle = stdout; 273214501Srpaulo Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; 274214501Srpaulo 275214501Srpaulo Gbl_Files[ASL_FILE_STDERR].Handle = stderr; 276214501Srpaulo Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; 277214501Srpaulo} 278214501Srpaulo 279214501Srpaulo 280214501Srpaulo/******************************************************************************* 281214501Srpaulo * 282214501Srpaulo * FUNCTION: AslMergeOptionTokens 283214501Srpaulo * 284214501Srpaulo * PARAMETERS: InBuffer - Input containing an option string 285214501Srpaulo * OutBuffer - Merged output buffer 286214501Srpaulo * 287214501Srpaulo * RETURN: None 288214501Srpaulo * 289214501Srpaulo * DESCRIPTION: Remove all whitespace from an option string. 290214501Srpaulo * 291214501Srpaulo ******************************************************************************/ 292214501Srpaulo 293214501Srpaulostatic void 294214501SrpauloAslMergeOptionTokens ( 295214501Srpaulo char *InBuffer, 296214501Srpaulo char *OutBuffer) 297214501Srpaulo{ 298214501Srpaulo char *Token; 299214501Srpaulo 300214501Srpaulo 301214501Srpaulo *OutBuffer = 0; 302214501Srpaulo 303214501Srpaulo Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS); 304214501Srpaulo while (Token) 305214501Srpaulo { 306214501Srpaulo strcat (OutBuffer, Token); 307214501Srpaulo Token = strtok (NULL, ASL_TOKEN_SEPARATORS); 308214501Srpaulo } 309214501Srpaulo} 310214501Srpaulo 311214501Srpaulo 312214501Srpaulo/******************************************************************************* 313214501Srpaulo * 314214501Srpaulo * FUNCTION: AslDoResponseFile 315214501Srpaulo * 316214501Srpaulo * PARAMETERS: Filename - Name of the response file 317214501Srpaulo * 318214501Srpaulo * RETURN: Status 319214501Srpaulo * 320214501Srpaulo * DESCRIPTION: Open a response file and process all options within. 321214501Srpaulo * 322214501Srpaulo ******************************************************************************/ 323214501Srpaulo 324214501Srpaulostatic int 325214501SrpauloAslDoResponseFile ( 326214501Srpaulo char *Filename) 327214501Srpaulo{ 328214501Srpaulo char *argv = StringBuffer2; 329214501Srpaulo FILE *ResponseFile; 330214501Srpaulo int OptStatus = 0; 331214501Srpaulo int Opterr; 332214501Srpaulo int Optind; 333214501Srpaulo 334214501Srpaulo 335214501Srpaulo ResponseFile = fopen (Filename, "r"); 336214501Srpaulo if (!ResponseFile) 337214501Srpaulo { 338214501Srpaulo printf ("Could not open command file %s, %s\n", 339214501Srpaulo Filename, strerror (errno)); 340214501Srpaulo return -1; 341214501Srpaulo } 342214501Srpaulo 343214501Srpaulo /* Must save the current GetOpt globals */ 344214501Srpaulo 345214501Srpaulo Opterr = AcpiGbl_Opterr; 346214501Srpaulo Optind = AcpiGbl_Optind; 347214501Srpaulo 348214501Srpaulo /* 349214501Srpaulo * Process all lines in the response file. There must be one complete 350214501Srpaulo * option per line 351214501Srpaulo */ 352214501Srpaulo while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile)) 353214501Srpaulo { 354214501Srpaulo /* Compress all tokens, allowing us to use a single argv entry */ 355214501Srpaulo 356214501Srpaulo AslMergeOptionTokens (StringBuffer, StringBuffer2); 357214501Srpaulo 358214501Srpaulo /* Process the option */ 359214501Srpaulo 360214501Srpaulo AcpiGbl_Opterr = 0; 361214501Srpaulo AcpiGbl_Optind = 0; 362214501Srpaulo 363214501Srpaulo OptStatus = AslDoOptions (1, &argv, TRUE); 364214501Srpaulo if (OptStatus) 365214501Srpaulo { 366214501Srpaulo printf ("Invalid option in command file %s: %s\n", 367214501Srpaulo Filename, StringBuffer); 368214501Srpaulo break; 369214501Srpaulo } 370214501Srpaulo } 371214501Srpaulo 372214501Srpaulo /* Restore the GetOpt globals */ 373214501Srpaulo 374214501Srpaulo AcpiGbl_Opterr = Opterr; 375214501Srpaulo AcpiGbl_Optind = Optind; 376214501Srpaulo 377214501Srpaulo fclose (ResponseFile); 378214501Srpaulo return (OptStatus); 379214501Srpaulo} 380214501Srpaulo 381214501Srpaulo 382214501Srpaulo/******************************************************************************* 383214501Srpaulo * 384214501Srpaulo * FUNCTION: AslDoOptions 385214501Srpaulo * 386214501Srpaulo * PARAMETERS: argc/argv - Standard argc/argv 387214501Srpaulo * IsResponseFile - TRUE if executing a response file. 388214501Srpaulo * 389214501Srpaulo * RETURN: Status 390214501Srpaulo * 391214501Srpaulo * DESCRIPTION: Command line option processing 392214501Srpaulo * 393214501Srpaulo ******************************************************************************/ 394214501Srpaulo 395214501Srpaulostatic int 396214501SrpauloAslDoOptions ( 397214501Srpaulo int argc, 398214501Srpaulo char **argv, 399214501Srpaulo BOOLEAN IsResponseFile) 400214501Srpaulo{ 401214501Srpaulo int j; 402214501Srpaulo ACPI_STATUS Status; 403214501Srpaulo 404214501Srpaulo 405214501Srpaulo /* Get the command line options */ 406214501Srpaulo 407214501Srpaulo while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j) 408214501Srpaulo { 409214501Srpaulo case '@': /* Begin a response file */ 410214501Srpaulo 411214501Srpaulo if (IsResponseFile) 412214501Srpaulo { 413214501Srpaulo printf ("Nested command files are not supported\n"); 414214501Srpaulo return (-1); 415214501Srpaulo } 416214501Srpaulo 417214501Srpaulo if (AslDoResponseFile (AcpiGbl_Optarg)) 418214501Srpaulo { 419214501Srpaulo return (-1); 420214501Srpaulo } 421214501Srpaulo break; 422214501Srpaulo 423214501Srpaulo 424214501Srpaulo case '2': /* ACPI 2.0 compatibility mode */ 425214501Srpaulo Gbl_Acpi2 = TRUE; 426214501Srpaulo break; 427214501Srpaulo 428214501Srpaulo 429214501Srpaulo case 'b': /* Debug output options */ 430214501Srpaulo switch (AcpiGbl_Optarg[0]) 431214501Srpaulo { 432214501Srpaulo case 'f': 433214501Srpaulo AslCompilerdebug = 1; /* same as yydebug */ 434214501Srpaulo DtParserdebug = 1; 435214501Srpaulo PrParserdebug = 1; 436214501Srpaulo break; 437214501Srpaulo 438214501Srpaulo case 't': 439214501Srpaulo break; 440214501Srpaulo 441214501Srpaulo default: 442214501Srpaulo printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); 443214501Srpaulo return (-1); 444214501Srpaulo } 445214501Srpaulo 446214501Srpaulo /* Produce debug output file */ 447214501Srpaulo 448214501Srpaulo Gbl_DebugFlag = TRUE; 449214501Srpaulo break; 450214501Srpaulo 451214501Srpaulo 452214501Srpaulo case 'c': 453214501Srpaulo switch (AcpiGbl_Optarg[0]) 454214501Srpaulo { 455214501Srpaulo case 'r': 456214501Srpaulo Gbl_NoResourceChecking = TRUE; 457214501Srpaulo break; 458214501Srpaulo 459214501Srpaulo default: 460214501Srpaulo printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 461214501Srpaulo return (-1); 462214501Srpaulo } 463214501Srpaulo break; 464214501Srpaulo 465214501Srpaulo 466214501Srpaulo case 'd': /* Disassembler */ 467214501Srpaulo switch (AcpiGbl_Optarg[0]) 468214501Srpaulo { 469214501Srpaulo case '^': 470214501Srpaulo Gbl_DoCompile = FALSE; 471214501Srpaulo break; 472214501Srpaulo 473214501Srpaulo case 'a': 474214501Srpaulo Gbl_DoCompile = FALSE; 475214501Srpaulo Gbl_DisassembleAll = TRUE; 476214501Srpaulo break; 477214501Srpaulo 478214501Srpaulo case 'c': 479214501Srpaulo break; 480214501Srpaulo 481214501Srpaulo default: 482214501Srpaulo printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); 483214501Srpaulo return (-1); 484214501Srpaulo } 485214501Srpaulo 486214501Srpaulo Gbl_DisasmFlag = TRUE; 487214501Srpaulo break; 488214501Srpaulo 489214501Srpaulo 490214501Srpaulo case 'D': /* Define a symbol */ 491214501Srpaulo PrAddDefine (AcpiGbl_Optarg, NULL, TRUE); 492214501Srpaulo break; 493214501Srpaulo 494214501Srpaulo 495214501Srpaulo case 'e': /* External files for disassembler */ 496214501Srpaulo Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg); 497214501Srpaulo if (ACPI_FAILURE (Status)) 498214501Srpaulo { 499214501Srpaulo printf ("Could not add %s to external list\n", AcpiGbl_Optarg); 500214501Srpaulo return (-1); 501214501Srpaulo } 502214501Srpaulo break; 503214501Srpaulo 504214501Srpaulo 505214501Srpaulo case 'f': /* Ignore errors and force creation of aml file */ 506214501Srpaulo Gbl_IgnoreErrors = TRUE; 507214501Srpaulo break; 508214501Srpaulo 509214501Srpaulo 510214501Srpaulo case 'G': 511214501Srpaulo Gbl_CompileGeneric = TRUE; 512214501Srpaulo break; 513214501Srpaulo 514214501Srpaulo 515214501Srpaulo case 'g': /* Get all ACPI tables */ 516214501Srpaulo 517214501Srpaulo Gbl_GetAllTables = TRUE; 518214501Srpaulo Gbl_DoCompile = FALSE; 519214501Srpaulo break; 520214501Srpaulo 521214501Srpaulo 522214501Srpaulo case 'h': 523214501Srpaulo switch (AcpiGbl_Optarg[0]) 524214501Srpaulo { 525214501Srpaulo case '^': 526214501Srpaulo Usage (); 527214501Srpaulo exit (0); 528214501Srpaulo 529214501Srpaulo case 'c': 530214501Srpaulo UtDisplayConstantOpcodes (); 531214501Srpaulo exit (0); 532214501Srpaulo 533214501Srpaulo case 'f': 534214501Srpaulo FilenameHelp (); 535214501Srpaulo exit (0); 536214501Srpaulo 537214501Srpaulo case 'r': 538214501Srpaulo /* reserved names */ 539214501Srpaulo 540214501Srpaulo ApDisplayReservedNames (); 541214501Srpaulo exit (0); 542214501Srpaulo 543214501Srpaulo case 't': 544214501Srpaulo UtDisplaySupportedTables (); 545214501Srpaulo exit (0); 546214501Srpaulo 547214501Srpaulo default: 548214501Srpaulo printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); 549214501Srpaulo return (-1); 550214501Srpaulo } 551214501Srpaulo 552214501Srpaulo 553214501Srpaulo case 'I': /* Add an include file search directory */ 554214501Srpaulo FlAddIncludeDirectory (AcpiGbl_Optarg); 555214501Srpaulo break; 556214501Srpaulo 557214501Srpaulo 558214501Srpaulo case 'i': /* Output AML as an include file */ 559214501Srpaulo switch (AcpiGbl_Optarg[0]) 560214501Srpaulo { 561214501Srpaulo case 'a': 562214501Srpaulo 563214501Srpaulo /* Produce assembly code include file */ 564214501Srpaulo 565214501Srpaulo Gbl_AsmIncludeOutputFlag = TRUE; 566214501Srpaulo break; 567214501Srpaulo 568214501Srpaulo case 'c': 569214501Srpaulo 570214501Srpaulo /* Produce C include file */ 571214501Srpaulo 572214501Srpaulo Gbl_C_IncludeOutputFlag = TRUE; 573214501Srpaulo break; 574214501Srpaulo 575214501Srpaulo default: 576214501Srpaulo printf ("Unknown option: -i%s\n", AcpiGbl_Optarg); 577214501Srpaulo return (-1); 578214501Srpaulo } 579214501Srpaulo break; 580214501Srpaulo 581214501Srpaulo 582214501Srpaulo case 'l': /* Listing files */ 583214501Srpaulo switch (AcpiGbl_Optarg[0]) 584214501Srpaulo { 585214501Srpaulo case '^': 586214501Srpaulo /* Produce listing file (Mixed source/aml) */ 587214501Srpaulo 588214501Srpaulo Gbl_ListingFlag = TRUE; 589214501Srpaulo break; 590214501Srpaulo 591214501Srpaulo case 'i': 592214501Srpaulo /* Produce preprocessor output file */ 593214501Srpaulo 594214501Srpaulo Gbl_PreprocessorOutputFlag = TRUE; 595214501Srpaulo break; 596214501Srpaulo 597214501Srpaulo case 'n': 598214501Srpaulo /* Produce namespace file */ 599214501Srpaulo 600214501Srpaulo Gbl_NsOutputFlag = TRUE; 601214501Srpaulo break; 602214501Srpaulo 603214501Srpaulo case 's': 604214501Srpaulo /* Produce combined source file */ 605214501Srpaulo 606214501Srpaulo Gbl_SourceOutputFlag = TRUE; 607214501Srpaulo break; 608214501Srpaulo 609214501Srpaulo default: 610214501Srpaulo printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); 611214501Srpaulo return (-1); 612214501Srpaulo } 613214501Srpaulo break; 614214501Srpaulo 615214501Srpaulo 616214501Srpaulo case 'm': /* Do not convert buffers to resource descriptors */ 617214501Srpaulo AcpiGbl_NoResourceDisassembly = TRUE; 618214501Srpaulo break; 619214501Srpaulo 620214501Srpaulo 621214501Srpaulo case 'n': /* Parse only */ 622214501Srpaulo Gbl_ParseOnlyFlag = TRUE; 623214501Srpaulo break; 624214501Srpaulo 625214501Srpaulo 626214501Srpaulo case 'o': /* Control compiler AML optimizations */ 627214501Srpaulo switch (AcpiGbl_Optarg[0]) 628214501Srpaulo { 629214501Srpaulo case 'a': 630214501Srpaulo 631214501Srpaulo /* Disable all optimizations */ 632214501Srpaulo 633214501Srpaulo Gbl_FoldConstants = FALSE; 634214501Srpaulo Gbl_IntegerOptimizationFlag = FALSE; 635214501Srpaulo Gbl_ReferenceOptimizationFlag = FALSE; 636214501Srpaulo break; 637214501Srpaulo 638214501Srpaulo case 'f': 639214501Srpaulo 640214501Srpaulo /* Disable folding on "normal" expressions */ 641214501Srpaulo 642214501Srpaulo Gbl_FoldConstants = FALSE; 643214501Srpaulo break; 644214501Srpaulo 645214501Srpaulo case 'i': 646214501Srpaulo 647214501Srpaulo /* Disable integer optimization to constants */ 648214501Srpaulo 649214501Srpaulo Gbl_IntegerOptimizationFlag = FALSE; 650214501Srpaulo break; 651214501Srpaulo 652214501Srpaulo case 'n': 653214501Srpaulo 654214501Srpaulo /* Disable named reference optimization */ 655214501Srpaulo 656214501Srpaulo Gbl_ReferenceOptimizationFlag = FALSE; 657214501Srpaulo break; 658214501Srpaulo 659214501Srpaulo case 't': 660214501Srpaulo 661214501Srpaulo /* Display compile time(s) */ 662214501Srpaulo 663214501Srpaulo Gbl_CompileTimesFlag = TRUE; 664214501Srpaulo break; 665214501Srpaulo 666214501Srpaulo default: 667214501Srpaulo printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 668214501Srpaulo return (-1); 669214501Srpaulo } 670214501Srpaulo break; 671214501Srpaulo 672214501Srpaulo 673214501Srpaulo case 'P': /* Preprocessor options */ 674214501Srpaulo switch (AcpiGbl_Optarg[0]) 675214501Srpaulo { 676214501Srpaulo case '^': /* Proprocess only, emit (.i) file */ 677214501Srpaulo Gbl_PreprocessOnly = TRUE; 678214501Srpaulo Gbl_PreprocessorOutputFlag = TRUE; 679214501Srpaulo break; 680214501Srpaulo 681214501Srpaulo case 'n': /* Disable preprocessor */ 682214501Srpaulo Gbl_PreprocessFlag = FALSE; 683214501Srpaulo break; 684214501Srpaulo 685214501Srpaulo default: 686214501Srpaulo printf ("Unknown option: -P%s\n", AcpiGbl_Optarg); 687214501Srpaulo return (-1); 688214501Srpaulo } 689214501Srpaulo break; 690214501Srpaulo 691214501Srpaulo 692214501Srpaulo case 'p': /* Override default AML output filename */ 693214501Srpaulo Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; 694214501Srpaulo Gbl_UseDefaultAmlFilename = FALSE; 695214501Srpaulo break; 696214501Srpaulo 697214501Srpaulo 698214501Srpaulo case 'r': /* Override revision found in table header */ 699214501Srpaulo Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); 700214501Srpaulo break; 701214501Srpaulo 702214501Srpaulo 703214501Srpaulo case 's': /* Create AML in a source code file */ 704214501Srpaulo switch (AcpiGbl_Optarg[0]) 705214501Srpaulo { 706214501Srpaulo case 'a': 707214501Srpaulo 708214501Srpaulo /* Produce assembly code output file */ 709214501Srpaulo 710214501Srpaulo Gbl_AsmOutputFlag = TRUE; 711214501Srpaulo break; 712214501Srpaulo 713214501Srpaulo case 'c': 714214501Srpaulo 715214501Srpaulo /* Produce C hex output file */ 716214501Srpaulo 717214501Srpaulo Gbl_C_OutputFlag = TRUE; 718214501Srpaulo break; 719214501Srpaulo 720214501Srpaulo default: 721214501Srpaulo printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); 722214501Srpaulo return (-1); 723214501Srpaulo } 724214501Srpaulo break; 725214501Srpaulo 726214501Srpaulo 727214501Srpaulo case 't': /* Produce hex table output file */ 728214501Srpaulo switch (AcpiGbl_Optarg[0]) 729214501Srpaulo { 730214501Srpaulo case 'a': 731214501Srpaulo Gbl_HexOutputFlag = HEX_OUTPUT_ASM; 732214501Srpaulo break; 733214501Srpaulo 734214501Srpaulo case 'c': 735214501Srpaulo Gbl_HexOutputFlag = HEX_OUTPUT_C; 736214501Srpaulo break; 737214501Srpaulo 738214501Srpaulo case 's': 739214501Srpaulo Gbl_HexOutputFlag = HEX_OUTPUT_ASL; 740214501Srpaulo break; 741214501Srpaulo 742214501Srpaulo default: 743214501Srpaulo printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); 744214501Srpaulo return (-1); 745214501Srpaulo } 746214501Srpaulo break; 747214501Srpaulo 748214501Srpaulo 749214501Srpaulo case 'T': /* Create a ACPI table template file */ 750214501Srpaulo Gbl_DoTemplates = TRUE; 751214501Srpaulo Gbl_TemplateSignature = AcpiGbl_Optarg; 752214501Srpaulo break; 753214501Srpaulo 754214501Srpaulo 755214501Srpaulo case 'v': /* Version and verbosity settings */ 756214501Srpaulo switch (AcpiGbl_Optarg[0]) 757214501Srpaulo { 758214501Srpaulo case '^': 759214501Srpaulo printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 760214501Srpaulo exit (0); 761214501Srpaulo 762214501Srpaulo case 'a': 763214501Srpaulo /* Disable All error/warning messages */ 764214501Srpaulo 765214501Srpaulo Gbl_NoErrors = TRUE; 766214501Srpaulo break; 767214501Srpaulo 768214501Srpaulo case 'i': 769214501Srpaulo /* 770214501Srpaulo * Support for integrated development environment(s). 771214501Srpaulo * 772214501Srpaulo * 1) No compiler signon 773214501Srpaulo * 2) Send stderr messages to stdout 774214501Srpaulo * 3) Less verbose error messages (single line only for each) 775214501Srpaulo * 4) Error/warning messages are formatted appropriately to 776214501Srpaulo * be recognized by MS Visual Studio 777214501Srpaulo */ 778214501Srpaulo Gbl_VerboseErrors = FALSE; 779214501Srpaulo Gbl_DoSignon = FALSE; 780214501Srpaulo Gbl_Files[ASL_FILE_STDERR].Handle = stdout; 781214501Srpaulo break; 782214501Srpaulo 783214501Srpaulo case 'o': 784214501Srpaulo Gbl_DisplayOptimizations = TRUE; 785214501Srpaulo break; 786214501Srpaulo 787214501Srpaulo case 'r': 788214501Srpaulo Gbl_DisplayRemarks = FALSE; 789214501Srpaulo break; 790214501Srpaulo 791214501Srpaulo case 's': 792214501Srpaulo Gbl_DoSignon = FALSE; 793214501Srpaulo break; 794214501Srpaulo 795214501Srpaulo case 't': 796214501Srpaulo Gbl_VerboseTemplates = TRUE; 797214501Srpaulo break; 798 799 default: 800 printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); 801 return (-1); 802 } 803 break; 804 805 806 case 'w': /* Set warning levels */ 807 switch (AcpiGbl_Optarg[0]) 808 { 809 case '1': 810 Gbl_WarningLevel = ASL_WARNING; 811 break; 812 813 case '2': 814 Gbl_WarningLevel = ASL_WARNING2; 815 break; 816 817 case '3': 818 Gbl_WarningLevel = ASL_WARNING3; 819 break; 820 821 case 'e': 822 Gbl_WarningsAsErrors = TRUE; 823 break; 824 825 default: 826 printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); 827 return (-1); 828 } 829 break; 830 831 832 case 'x': /* Set debug print output level */ 833 AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); 834 break; 835 836 837 case 'z': 838 Gbl_UseOriginalCompilerId = TRUE; 839 break; 840 841 842 default: 843 return (-1); 844 } 845 846 return (0); 847} 848 849 850/******************************************************************************* 851 * 852 * FUNCTION: AslCommandLine 853 * 854 * PARAMETERS: argc/argv 855 * 856 * RETURN: Last argv index 857 * 858 * DESCRIPTION: Command line processing 859 * 860 ******************************************************************************/ 861 862static int 863AslCommandLine ( 864 int argc, 865 char **argv) 866{ 867 int BadCommandLine = 0; 868 ACPI_STATUS Status; 869 870 871 /* Minimum command line contains at least the command and an input file */ 872 873 if (argc < 2) 874 { 875 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 876 Usage (); 877 exit (1); 878 } 879 880 /* Process all command line options */ 881 882 BadCommandLine = AslDoOptions (argc, argv, FALSE); 883 884 if (Gbl_DoTemplates) 885 { 886 Status = DtCreateTemplates (Gbl_TemplateSignature); 887 if (ACPI_FAILURE (Status)) 888 { 889 exit (-1); 890 } 891 exit (1); 892 } 893 894 /* Next parameter must be the input filename */ 895 896 if (!argv[AcpiGbl_Optind] && 897 !Gbl_DisasmFlag && 898 !Gbl_GetAllTables) 899 { 900 printf ("Missing input filename\n"); 901 BadCommandLine = TRUE; 902 } 903 904 if (Gbl_DoSignon) 905 { 906 printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 907 if (Gbl_IgnoreErrors) 908 { 909 printf ("Ignoring all errors, forcing AML file generation\n\n"); 910 } 911 } 912 913 /* Abort if anything went wrong on the command line */ 914 915 if (BadCommandLine) 916 { 917 printf ("\n"); 918 Usage (); 919 exit (1); 920 } 921 922 return (AcpiGbl_Optind); 923} 924 925 926/******************************************************************************* 927 * 928 * FUNCTION: main 929 * 930 * PARAMETERS: Standard argc/argv 931 * 932 * RETURN: Program termination code 933 * 934 * DESCRIPTION: C main routine for the Asl Compiler. Handle command line 935 * options and begin the compile for each file on the command line 936 * 937 ******************************************************************************/ 938 939int ACPI_SYSTEM_XFACE 940main ( 941 int argc, 942 char **argv) 943{ 944 ACPI_STATUS Status; 945 int Index1; 946 int Index2; 947 948 949 AcpiGbl_ExternalFileList = NULL; 950 951#ifdef _DEBUG 952 _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | 953 _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); 954#endif 955 956 /* Init and command line */ 957 958 AslInitialize (); 959 PrInitializePreprocessor (); 960 Index1 = Index2 = AslCommandLine (argc, argv); 961 962 /* Options that have no additional parameters or pathnames */ 963 964 if (Gbl_GetAllTables) 965 { 966 Status = AslDoOneFile (NULL); 967 if (ACPI_FAILURE (Status)) 968 { 969 return (-1); 970 } 971 return (0); 972 } 973 974 if (Gbl_DisassembleAll) 975 { 976 while (argv[Index1]) 977 { 978 Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList); 979 if (ACPI_FAILURE (Status)) 980 { 981 return (-1); 982 } 983 984 Index1++; 985 } 986 } 987 988 /* Process each pathname/filename in the list, with possible wildcards */ 989 990 while (argv[Index2]) 991 { 992 Status = AslDoOnePathname (argv[Index2], AslDoOneFile); 993 if (ACPI_FAILURE (Status)) 994 { 995 return (-1); 996 } 997 998 Index2++; 999 } 1000 1001 if (AcpiGbl_ExternalFileList) 1002 { 1003 AcpiDmClearExternalFileList(); 1004 } 1005 1006 return (0); 1007} 1008 1009 1010