aslmain.c revision 228110
1118611Snjl 2118611Snjl/****************************************************************************** 3118611Snjl * 4118611Snjl * Module Name: aslmain - compiler main and utilities 5118611Snjl * 6118611Snjl *****************************************************************************/ 7118611Snjl 8217365Sjkim/* 9217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp. 10118611Snjl * All rights reserved. 11118611Snjl * 12217365Sjkim * Redistribution and use in source and binary forms, with or without 13217365Sjkim * modification, are permitted provided that the following conditions 14217365Sjkim * are met: 15217365Sjkim * 1. Redistributions of source code must retain the above copyright 16217365Sjkim * notice, this list of conditions, and the following disclaimer, 17217365Sjkim * without modification. 18217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19217365Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 20217365Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 21217365Sjkim * including a substantially similar Disclaimer requirement for further 22217365Sjkim * binary redistribution. 23217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 24217365Sjkim * of any contributors may be used to endorse or promote products derived 25217365Sjkim * from this software without specific prior written permission. 26118611Snjl * 27217365Sjkim * Alternatively, this software may be distributed under the terms of the 28217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 29217365Sjkim * Software Foundation. 30118611Snjl * 31217365Sjkim * NO WARRANTY 32217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42217365Sjkim * POSSIBILITY OF SUCH DAMAGES. 43217365Sjkim */ 44118611Snjl 45118611Snjl 46118611Snjl#define _DECLARE_GLOBALS 47118611Snjl 48151937Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 49193529Sjkim#include <contrib/dev/acpica/include/acapps.h> 50210976Sjkim#include <contrib/dev/acpica/include/acdisasm.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 66151937SjkimHelpMessage ( 67151937Sjkim void); 68151937Sjkim 69151937Sjkimstatic void 70151937SjkimUsage ( 71151937Sjkim void); 72151937Sjkim 73151937Sjkimstatic void 74151937SjkimAslInitialize ( 75151937Sjkim void); 76151937Sjkim 77193529Sjkimstatic int 78151937SjkimAslCommandLine ( 79151937Sjkim int argc, 80151937Sjkim char **argv); 81151937Sjkim 82197104Sjkimstatic int 83197104SjkimAslDoOptions ( 84197104Sjkim int argc, 85197104Sjkim char **argv, 86197104Sjkim BOOLEAN IsResponseFile); 87151937Sjkim 88197104Sjkimstatic void 89197104SjkimAslMergeOptionTokens ( 90197104Sjkim char *InBuffer, 91197104Sjkim char *OutBuffer); 92197104Sjkim 93197104Sjkimstatic int 94197104SjkimAslDoResponseFile ( 95197104Sjkim char *Filename); 96197104Sjkim 97197104Sjkim 98197104Sjkim#define ASL_TOKEN_SEPARATORS " \t\n" 99228110Sjkim#define ASL_SUPPORTED_OPTIONS "@:2b:c:d^e:fgh^i^I:l^mno:p:r:s:t:T:G^v:w:x:z" 100197104Sjkim 101197104Sjkim 102118611Snjl/******************************************************************************* 103118611Snjl * 104118611Snjl * FUNCTION: Options 105118611Snjl * 106118611Snjl * PARAMETERS: None 107118611Snjl * 108118611Snjl * RETURN: None 109118611Snjl * 110118611Snjl * DESCRIPTION: Display option help message 111118611Snjl * 112118611Snjl ******************************************************************************/ 113118611Snjl 114151937Sjkimstatic void 115118611SnjlOptions ( 116118611Snjl void) 117118611Snjl{ 118118611Snjl 119228110Sjkim printf ("\nGlobal:\n"); 120228110Sjkim ACPI_OPTION ("-@ <file>", "Specify command file"); 121228110Sjkim ACPI_OPTION ("-I <dir>", "Specify additional include directory"); 122197104Sjkim 123197104Sjkim printf ("\nGeneral Output:\n"); 124228110Sjkim ACPI_OPTION ("-p <prefix>", "Specify path/filename prefix for all output files"); 125228110Sjkim ACPI_OPTION ("-va", "Disable all errors and warnings (summary only)"); 126228110Sjkim ACPI_OPTION ("-vi", "Less verbose errors and warnings for use with IDEs"); 127228110Sjkim ACPI_OPTION ("-vo", "Enable optimization comments"); 128228110Sjkim ACPI_OPTION ("-vr", "Disable remarks"); 129228110Sjkim ACPI_OPTION ("-vs", "Disable signon"); 130228110Sjkim ACPI_OPTION ("-w <1|2|3>", "Set warning reporting level"); 131118611Snjl 132138287Smarks printf ("\nAML Output Files:\n"); 133228110Sjkim ACPI_OPTION ("-s <a|c>", "Create AML in assembler or C source file (*.asm or *.c)"); 134228110Sjkim ACPI_OPTION ("-i <a|c>", "Create assembler or C include file (*.inc or *.h)"); 135228110Sjkim ACPI_OPTION ("-t <a|c|s>", "Create AML in assembler, C, or ASL hex table (*.hex)"); 136118611Snjl 137138287Smarks printf ("\nAML Code Generation:\n"); 138228110Sjkim ACPI_OPTION ("-oa", "Disable all optimizations (compatibility mode)"); 139228110Sjkim ACPI_OPTION ("-of", "Disable constant folding"); 140228110Sjkim ACPI_OPTION ("-oi", "Disable integer optimization to Zero/One/Ones"); 141228110Sjkim ACPI_OPTION ("-on", "Disable named reference string optimization"); 142228110Sjkim ACPI_OPTION ("-cr", "Disable Resource Descriptor error checking"); 143228110Sjkim ACPI_OPTION ("-r <revision>", "Override table header Revision (1-255)"); 144118611Snjl 145212761Sjkim printf ("\nASL Listing Files:\n"); 146228110Sjkim ACPI_OPTION ("-l", "Create mixed listing file (ASL source and AML) (*.lst)"); 147228110Sjkim ACPI_OPTION ("-ln", "Create namespace file (*.nsp)"); 148228110Sjkim ACPI_OPTION ("-ls", "Create combined source file (expanded includes) (*.src)"); 149118611Snjl 150209746Sjkim printf ("\nACPI Data Tables:\n"); 151228110Sjkim ACPI_OPTION ("-G", "Compile custom table containing generic operators"); 152228110Sjkim ACPI_OPTION ("-T <sig>|ALL|*", "Create table template file(s) for <Sig>"); 153228110Sjkim ACPI_OPTION ("-vt", "Create verbose templates (full disassembly)"); 154209746Sjkim 155118611Snjl printf ("\nAML Disassembler:\n"); 156228110Sjkim ACPI_OPTION ("-d [file]", "Disassemble or decode binary ACPI table to file (*.dsl)"); 157228110Sjkim ACPI_OPTION ("-da [f1,f2]", "Disassemble multiple tables from single namespace"); 158228110Sjkim ACPI_OPTION ("-dc [file]", "Disassemble AML and immediately compile it"); 159228110Sjkim ACPI_OPTION ("", "(Obtain DSDT from current system if no input file)"); 160228110Sjkim ACPI_OPTION ("-e [f1,f2]", "Include ACPI table(s) for external symbol resolution"); 161228110Sjkim ACPI_OPTION ("-m", "Do not translate Buffers to Resource Templates"); 162228110Sjkim ACPI_OPTION ("-2", "Emit ACPI 2.0 compatible ASL code"); 163228110Sjkim ACPI_OPTION ("-g", "Get ACPI tables and write to files (*.dat)"); 164118611Snjl 165118611Snjl printf ("\nHelp:\n"); 166228110Sjkim ACPI_OPTION ("-h", "Additional help and compiler debug options"); 167228110Sjkim ACPI_OPTION ("-hc", "Display operators allowed in constant expressions"); 168228110Sjkim ACPI_OPTION ("-hr", "Display ACPI reserved method names"); 169228110Sjkim ACPI_OPTION ("-ht", "Display currently supported ACPI table names"); 170118611Snjl} 171118611Snjl 172118611Snjl 173118611Snjl/******************************************************************************* 174118611Snjl * 175151937Sjkim * FUNCTION: HelpMessage 176118611Snjl * 177118611Snjl * PARAMETERS: None 178118611Snjl * 179118611Snjl * RETURN: None 180118611Snjl * 181118611Snjl * DESCRIPTION: Display help message 182118611Snjl * 183118611Snjl ******************************************************************************/ 184118611Snjl 185151937Sjkimstatic void 186118611SnjlHelpMessage ( 187118611Snjl void) 188118611Snjl{ 189118611Snjl 190228110Sjkim printf ("\nAML output filename generation:\n"); 191118611Snjl printf (" Output filenames are generated by appending an extension to a common\n"); 192118611Snjl printf (" filename prefix. The filename prefix is obtained via one of the\n"); 193118611Snjl printf (" following methods (in priority order):\n"); 194118611Snjl printf (" 1) The -p option specifies the prefix\n"); 195118611Snjl printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n"); 196118611Snjl printf (" 3) The prefix of the input filename\n"); 197118611Snjl printf ("\n"); 198118611Snjl 199118611Snjl Options (); 200118611Snjl 201167802Sjkim printf ("\nCompiler/Disassembler Debug Options:\n"); 202228110Sjkim ACPI_OPTION ("-b<p|t|b>", "Create compiler debug/trace file (*.txt)"); 203228110Sjkim ACPI_OPTION ("", "Types: Parse/Tree/Both"); 204228110Sjkim ACPI_OPTION ("-f", "Ignore errors, force creation of AML output file(s)"); 205228110Sjkim ACPI_OPTION ("-n", "Parse only, no output generation"); 206228110Sjkim ACPI_OPTION ("-ot", "Display compile times"); 207228110Sjkim ACPI_OPTION ("-x<level>", "Set debug level for trace output"); 208228110Sjkim ACPI_OPTION ("-z", "Do not insert new compiler ID for DataTables"); 209118611Snjl} 210118611Snjl 211118611Snjl 212118611Snjl/******************************************************************************* 213118611Snjl * 214118611Snjl * FUNCTION: Usage 215118611Snjl * 216118611Snjl * PARAMETERS: None 217118611Snjl * 218118611Snjl * RETURN: None 219118611Snjl * 220118611Snjl * DESCRIPTION: Display usage and option message 221118611Snjl * 222118611Snjl ******************************************************************************/ 223118611Snjl 224151937Sjkimstatic void 225118611SnjlUsage ( 226118611Snjl void) 227118611Snjl{ 228118611Snjl 229228110Sjkim printf ("%s\n\n", ASL_COMPLIANCE); 230228110Sjkim ACPI_USAGE_HEADER ("iasl [Options] [Files]"); 231118611Snjl Options (); 232118611Snjl} 233118611Snjl 234118611Snjl 235118611Snjl/******************************************************************************* 236118611Snjl * 237118611Snjl * FUNCTION: AslInitialize 238118611Snjl * 239118611Snjl * PARAMETERS: None 240118611Snjl * 241118611Snjl * RETURN: None 242118611Snjl * 243118611Snjl * DESCRIPTION: Initialize compiler globals 244118611Snjl * 245118611Snjl ******************************************************************************/ 246118611Snjl 247151937Sjkimstatic void 248151937SjkimAslInitialize ( 249151937Sjkim void) 250118611Snjl{ 251118611Snjl UINT32 i; 252118611Snjl 253118611Snjl 254118611Snjl#ifdef _DEBUG 255118611Snjl _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0)); 256118611Snjl#endif 257118611Snjl 258118611Snjl AcpiDbgLevel = 0; 259118611Snjl 260118611Snjl for (i = 0; i < ASL_NUM_FILES; i++) 261118611Snjl { 262118611Snjl Gbl_Files[i].Handle = NULL; 263118611Snjl Gbl_Files[i].Filename = NULL; 264118611Snjl } 265118611Snjl 266118611Snjl Gbl_Files[ASL_FILE_STDOUT].Handle = stdout; 267118611Snjl Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; 268118611Snjl 269118611Snjl Gbl_Files[ASL_FILE_STDERR].Handle = stderr; 270118611Snjl Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; 271118611Snjl} 272118611Snjl 273118611Snjl 274118611Snjl/******************************************************************************* 275118611Snjl * 276197104Sjkim * FUNCTION: AslMergeOptionTokens 277118611Snjl * 278197104Sjkim * PARAMETERS: InBuffer - Input containing an option string 279197104Sjkim * OutBuffer - Merged output buffer 280118611Snjl * 281118611Snjl * RETURN: None 282118611Snjl * 283197104Sjkim * DESCRIPTION: Remove all whitespace from an option string. 284118611Snjl * 285118611Snjl ******************************************************************************/ 286118611Snjl 287197104Sjkimstatic void 288197104SjkimAslMergeOptionTokens ( 289197104Sjkim char *InBuffer, 290197104Sjkim char *OutBuffer) 291197104Sjkim{ 292197104Sjkim char *Token; 293197104Sjkim 294197104Sjkim 295197104Sjkim *OutBuffer = 0; 296197104Sjkim 297197104Sjkim Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS); 298197104Sjkim while (Token) 299197104Sjkim { 300197104Sjkim strcat (OutBuffer, Token); 301197104Sjkim Token = strtok (NULL, ASL_TOKEN_SEPARATORS); 302197104Sjkim } 303197104Sjkim} 304197104Sjkim 305197104Sjkim 306197104Sjkim/******************************************************************************* 307197104Sjkim * 308197104Sjkim * FUNCTION: AslDoResponseFile 309197104Sjkim * 310197104Sjkim * PARAMETERS: Filename - Name of the response file 311197104Sjkim * 312197104Sjkim * RETURN: Status 313197104Sjkim * 314197104Sjkim * DESCRIPTION: Open a response file and process all options within. 315197104Sjkim * 316197104Sjkim ******************************************************************************/ 317197104Sjkim 318193529Sjkimstatic int 319197104SjkimAslDoResponseFile ( 320197104Sjkim char *Filename) 321118611Snjl{ 322197104Sjkim char *argv = StringBuffer2; 323197104Sjkim FILE *ResponseFile; 324197104Sjkim int OptStatus = 0; 325197104Sjkim int Opterr; 326197104Sjkim int Optind; 327118611Snjl 328118611Snjl 329197104Sjkim ResponseFile = fopen (Filename, "r"); 330197104Sjkim if (!ResponseFile) 331197104Sjkim { 332197104Sjkim printf ("Could not open command file %s, %s\n", 333197104Sjkim Filename, strerror (errno)); 334197104Sjkim return -1; 335197104Sjkim } 336118611Snjl 337197104Sjkim /* Must save the current GetOpt globals */ 338197104Sjkim 339197104Sjkim Opterr = AcpiGbl_Opterr; 340197104Sjkim Optind = AcpiGbl_Optind; 341197104Sjkim 342197104Sjkim /* 343197104Sjkim * Process all lines in the response file. There must be one complete 344197104Sjkim * option per line 345197104Sjkim */ 346197104Sjkim while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile)) 347118611Snjl { 348197104Sjkim /* Compress all tokens, allowing us to use a single argv entry */ 349197104Sjkim 350197104Sjkim AslMergeOptionTokens (StringBuffer, StringBuffer2); 351197104Sjkim 352197104Sjkim /* Process the option */ 353197104Sjkim 354197104Sjkim AcpiGbl_Opterr = 0; 355197104Sjkim AcpiGbl_Optind = 0; 356197104Sjkim 357197104Sjkim OptStatus = AslDoOptions (1, &argv, TRUE); 358197104Sjkim if (OptStatus) 359197104Sjkim { 360197104Sjkim printf ("Invalid option in command file %s: %s\n", 361197104Sjkim Filename, StringBuffer); 362197104Sjkim break; 363197104Sjkim } 364118611Snjl } 365118611Snjl 366197104Sjkim /* Restore the GetOpt globals */ 367197104Sjkim 368197104Sjkim AcpiGbl_Opterr = Opterr; 369197104Sjkim AcpiGbl_Optind = Optind; 370197104Sjkim 371197104Sjkim fclose (ResponseFile); 372197104Sjkim return (OptStatus); 373197104Sjkim} 374197104Sjkim 375197104Sjkim 376197104Sjkim/******************************************************************************* 377197104Sjkim * 378197104Sjkim * FUNCTION: AslDoOptions 379197104Sjkim * 380197104Sjkim * PARAMETERS: argc/argv - Standard argc/argv 381197104Sjkim * IsResponseFile - TRUE if executing a response file. 382197104Sjkim * 383197104Sjkim * RETURN: Status 384197104Sjkim * 385197104Sjkim * DESCRIPTION: Command line option processing 386197104Sjkim * 387197104Sjkim ******************************************************************************/ 388197104Sjkim 389197104Sjkimstatic int 390197104SjkimAslDoOptions ( 391197104Sjkim int argc, 392197104Sjkim char **argv, 393197104Sjkim BOOLEAN IsResponseFile) 394197104Sjkim{ 395197104Sjkim int j; 396212761Sjkim ACPI_STATUS Status; 397197104Sjkim 398197104Sjkim 399118611Snjl /* Get the command line options */ 400118611Snjl 401197104Sjkim while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j) 402118611Snjl { 403197104Sjkim case '@': /* Begin a response file */ 404197104Sjkim 405197104Sjkim if (IsResponseFile) 406197104Sjkim { 407197104Sjkim printf ("Nested command files are not supported\n"); 408197104Sjkim return -1; 409197104Sjkim } 410197104Sjkim 411197104Sjkim if (AslDoResponseFile (AcpiGbl_Optarg)) 412197104Sjkim { 413197104Sjkim return -1; 414197104Sjkim } 415197104Sjkim break; 416197104Sjkim 417197104Sjkim 418151937Sjkim case '2': 419197104Sjkim 420151937Sjkim Gbl_Acpi2 = TRUE; 421151937Sjkim break; 422151937Sjkim 423151937Sjkim 424118611Snjl case 'b': 425118611Snjl 426118611Snjl switch (AcpiGbl_Optarg[0]) 427118611Snjl { 428118611Snjl case 'b': 429118611Snjl AslCompilerdebug = 1; /* same as yydebug */ 430220663Sjkim DtParserdebug = 1; 431118611Snjl break; 432118611Snjl 433118611Snjl case 'p': 434118611Snjl AslCompilerdebug = 1; /* same as yydebug */ 435220663Sjkim DtParserdebug = 1; 436118611Snjl break; 437118611Snjl 438118611Snjl case 't': 439118611Snjl break; 440118611Snjl 441118611Snjl default: 442118611Snjl printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); 443197104Sjkim return (-1); 444118611Snjl } 445118611Snjl 446118611Snjl /* Produce debug output file */ 447118611Snjl 448118611Snjl Gbl_DebugFlag = TRUE; 449118611Snjl break; 450118611Snjl 451118611Snjl 452118611Snjl case 'c': 453207344Sjkim switch (AcpiGbl_Optarg[0]) 454207344Sjkim { 455207344Sjkim case 'r': 456207344Sjkim Gbl_NoResourceChecking = TRUE; 457207344Sjkim break; 458118611Snjl 459207344Sjkim default: 460207344Sjkim printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 461207344Sjkim return (-1); 462207344Sjkim } 463118611Snjl break; 464118611Snjl 465118611Snjl 466118611Snjl case 'd': 467118611Snjl switch (AcpiGbl_Optarg[0]) 468118611Snjl { 469118611Snjl case '^': 470193529Sjkim Gbl_DoCompile = FALSE; 471118611Snjl break; 472118611Snjl 473210976Sjkim case 'a': 474210976Sjkim Gbl_DoCompile = FALSE; 475210976Sjkim Gbl_DisassembleAll = TRUE; 476210976Sjkim break; 477210976Sjkim 478118611Snjl case 'c': 479118611Snjl break; 480118611Snjl 481118611Snjl default: 482118611Snjl printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); 483197104Sjkim return (-1); 484118611Snjl } 485118611Snjl 486118611Snjl Gbl_DisasmFlag = TRUE; 487118611Snjl break; 488118611Snjl 489118611Snjl 490118611Snjl case 'e': 491212761Sjkim Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg); 492212761Sjkim if (ACPI_FAILURE (Status)) 493212761Sjkim { 494212761Sjkim printf ("Could not add %s to external list\n", AcpiGbl_Optarg); 495212761Sjkim return (-1); 496212761Sjkim } 497118611Snjl break; 498118611Snjl 499118611Snjl 500118611Snjl case 'f': 501118611Snjl 502118611Snjl /* Ignore errors and force creation of aml file */ 503118611Snjl 504118611Snjl Gbl_IgnoreErrors = TRUE; 505118611Snjl break; 506118611Snjl 507118611Snjl 508118611Snjl case 'g': 509118611Snjl 510118611Snjl /* Get all ACPI tables */ 511118611Snjl 512118611Snjl Gbl_GetAllTables = TRUE; 513193529Sjkim Gbl_DoCompile = FALSE; 514118611Snjl break; 515118611Snjl 516118611Snjl 517118611Snjl case 'h': 518118611Snjl 519118611Snjl switch (AcpiGbl_Optarg[0]) 520118611Snjl { 521118611Snjl case '^': 522118611Snjl HelpMessage (); 523118611Snjl exit (0); 524118611Snjl 525118611Snjl case 'c': 526118611Snjl UtDisplayConstantOpcodes (); 527118611Snjl exit (0); 528118611Snjl 529118611Snjl case 'r': 530118611Snjl /* reserved names */ 531118611Snjl 532204773Sjkim ApDisplayReservedNames (); 533118611Snjl exit (0); 534118611Snjl 535209746Sjkim case 't': 536209746Sjkim UtDisplaySupportedTables (); 537209746Sjkim exit (0); 538209746Sjkim 539118611Snjl default: 540118611Snjl printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); 541197104Sjkim return (-1); 542118611Snjl } 543118611Snjl 544118611Snjl 545197104Sjkim case 'I': /* Add an include file search directory */ 546197104Sjkim 547197104Sjkim FlAddIncludeDirectory (AcpiGbl_Optarg); 548197104Sjkim break; 549197104Sjkim 550197104Sjkim 551118611Snjl case 'i': 552118611Snjl 553118611Snjl switch (AcpiGbl_Optarg[0]) 554118611Snjl { 555118611Snjl case 'a': 556118611Snjl 557118611Snjl /* Produce assembly code include file */ 558118611Snjl 559118611Snjl Gbl_AsmIncludeOutputFlag = TRUE; 560118611Snjl break; 561118611Snjl 562118611Snjl case 'c': 563118611Snjl 564118611Snjl /* Produce C include file */ 565118611Snjl 566118611Snjl Gbl_C_IncludeOutputFlag = TRUE; 567118611Snjl break; 568118611Snjl 569118611Snjl default: 570118611Snjl printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); 571197104Sjkim return (-1); 572118611Snjl } 573118611Snjl break; 574118611Snjl 575118611Snjl 576118611Snjl case 'l': 577118611Snjl 578118611Snjl switch (AcpiGbl_Optarg[0]) 579118611Snjl { 580118611Snjl case '^': 581118611Snjl /* Produce listing file (Mixed source/aml) */ 582118611Snjl 583118611Snjl Gbl_ListingFlag = TRUE; 584118611Snjl break; 585118611Snjl 586118611Snjl case 'n': 587118611Snjl /* Produce namespace file */ 588118611Snjl 589118611Snjl Gbl_NsOutputFlag = TRUE; 590118611Snjl break; 591118611Snjl 592118611Snjl case 's': 593118611Snjl /* Produce combined source file */ 594118611Snjl 595118611Snjl Gbl_SourceOutputFlag = TRUE; 596118611Snjl break; 597118611Snjl 598118611Snjl default: 599118611Snjl printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); 600197104Sjkim return (-1); 601118611Snjl } 602118611Snjl break; 603118611Snjl 604118611Snjl 605228110Sjkim case 'm': 606228110Sjkim 607228110Sjkim AcpiGbl_NoResourceDisassembly = TRUE; 608228110Sjkim break; 609228110Sjkim 610228110Sjkim 611228110Sjkim case 'n': 612228110Sjkim 613228110Sjkim /* Parse only */ 614228110Sjkim 615228110Sjkim Gbl_ParseOnlyFlag = TRUE; 616228110Sjkim break; 617228110Sjkim 618228110Sjkim 619118611Snjl case 'o': 620118611Snjl 621118611Snjl switch (AcpiGbl_Optarg[0]) 622118611Snjl { 623118611Snjl case 'a': 624118611Snjl 625118611Snjl /* Disable all optimizations */ 626118611Snjl 627118611Snjl Gbl_FoldConstants = FALSE; 628118611Snjl Gbl_IntegerOptimizationFlag = FALSE; 629118611Snjl Gbl_ReferenceOptimizationFlag = FALSE; 630118611Snjl break; 631118611Snjl 632118611Snjl case 'f': 633118611Snjl 634118611Snjl /* Disable folding on "normal" expressions */ 635118611Snjl 636118611Snjl Gbl_FoldConstants = FALSE; 637118611Snjl break; 638118611Snjl 639118611Snjl case 'i': 640118611Snjl 641118611Snjl /* Disable integer optimization to constants */ 642118611Snjl 643118611Snjl Gbl_IntegerOptimizationFlag = FALSE; 644118611Snjl break; 645118611Snjl 646118611Snjl case 'n': 647118611Snjl 648118611Snjl /* Disable named reference optimization */ 649118611Snjl 650118611Snjl Gbl_ReferenceOptimizationFlag = FALSE; 651118611Snjl break; 652118611Snjl 653118611Snjl case 't': 654118611Snjl 655118611Snjl /* Display compile time(s) */ 656118611Snjl 657118611Snjl Gbl_CompileTimesFlag = TRUE; 658118611Snjl break; 659118611Snjl 660118611Snjl default: 661118611Snjl printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 662197104Sjkim return (-1); 663118611Snjl } 664118611Snjl break; 665118611Snjl 666118611Snjl 667118611Snjl case 'p': 668118611Snjl 669118611Snjl /* Override default AML output filename */ 670118611Snjl 671118611Snjl Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; 672118611Snjl Gbl_UseDefaultAmlFilename = FALSE; 673118611Snjl break; 674118611Snjl 675118611Snjl 676118611Snjl case 'r': 677138287Smarks Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); 678118611Snjl break; 679118611Snjl 680118611Snjl 681118611Snjl case 's': 682118611Snjl 683118611Snjl switch (AcpiGbl_Optarg[0]) 684118611Snjl { 685118611Snjl case 'a': 686118611Snjl 687118611Snjl /* Produce assembly code output file */ 688118611Snjl 689118611Snjl Gbl_AsmOutputFlag = TRUE; 690118611Snjl break; 691118611Snjl 692118611Snjl case 'c': 693118611Snjl 694118611Snjl /* Produce C hex output file */ 695118611Snjl 696118611Snjl Gbl_C_OutputFlag = TRUE; 697118611Snjl break; 698118611Snjl 699118611Snjl default: 700118611Snjl printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); 701197104Sjkim return (-1); 702118611Snjl } 703118611Snjl break; 704118611Snjl 705118611Snjl 706118611Snjl case 't': 707118611Snjl 708118611Snjl /* Produce hex table output file */ 709118611Snjl 710118611Snjl switch (AcpiGbl_Optarg[0]) 711118611Snjl { 712118611Snjl case 'a': 713118611Snjl Gbl_HexOutputFlag = HEX_OUTPUT_ASM; 714118611Snjl break; 715118611Snjl 716118611Snjl case 'c': 717118611Snjl Gbl_HexOutputFlag = HEX_OUTPUT_C; 718118611Snjl break; 719118611Snjl 720207344Sjkim case 's': 721207344Sjkim Gbl_HexOutputFlag = HEX_OUTPUT_ASL; 722207344Sjkim break; 723207344Sjkim 724118611Snjl default: 725118611Snjl printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); 726197104Sjkim return (-1); 727118611Snjl } 728118611Snjl break; 729118611Snjl 730118611Snjl 731228110Sjkim case 'G': 732228110Sjkim Gbl_CompileGeneric = TRUE; 733228110Sjkim break; 734228110Sjkim 735228110Sjkim 736209746Sjkim case 'T': 737209746Sjkim Gbl_DoTemplates = TRUE; 738209746Sjkim Gbl_TemplateSignature = AcpiGbl_Optarg; 739209746Sjkim break; 740209746Sjkim 741209746Sjkim 742118611Snjl case 'v': 743118611Snjl 744118611Snjl switch (AcpiGbl_Optarg[0]) 745118611Snjl { 746193529Sjkim case 'a': 747193529Sjkim /* Disable All error/warning messages */ 748193529Sjkim 749193529Sjkim Gbl_NoErrors = TRUE; 750193529Sjkim break; 751193529Sjkim 752118611Snjl case 'i': 753118611Snjl /* Less verbose error messages */ 754118611Snjl 755118611Snjl Gbl_VerboseErrors = FALSE; 756118611Snjl break; 757118611Snjl 758118611Snjl case 'o': 759118611Snjl Gbl_DisplayOptimizations = TRUE; 760118611Snjl break; 761118611Snjl 762118611Snjl case 'r': 763118611Snjl Gbl_DisplayRemarks = FALSE; 764118611Snjl break; 765118611Snjl 766118611Snjl case 's': 767193529Sjkim Gbl_DoSignon = FALSE; 768118611Snjl break; 769118611Snjl 770209746Sjkim case 't': 771209746Sjkim Gbl_VerboseTemplates = TRUE; 772209746Sjkim break; 773209746Sjkim 774118611Snjl default: 775118611Snjl printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); 776197104Sjkim return (-1); 777118611Snjl } 778118611Snjl break; 779118611Snjl 780118611Snjl 781167802Sjkim case 'w': /* Set warning levels */ 782167802Sjkim 783167802Sjkim switch (AcpiGbl_Optarg[0]) 784167802Sjkim { 785167802Sjkim case '1': 786167802Sjkim Gbl_WarningLevel = ASL_WARNING; 787167802Sjkim break; 788167802Sjkim 789167802Sjkim case '2': 790167802Sjkim Gbl_WarningLevel = ASL_WARNING2; 791167802Sjkim break; 792167802Sjkim 793167802Sjkim case '3': 794167802Sjkim Gbl_WarningLevel = ASL_WARNING3; 795167802Sjkim break; 796167802Sjkim 797167802Sjkim default: 798167802Sjkim printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); 799197104Sjkim return (-1); 800167802Sjkim } 801167802Sjkim break; 802167802Sjkim 803167802Sjkim 804118611Snjl case 'x': 805118611Snjl 806118611Snjl AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); 807118611Snjl break; 808118611Snjl 809118611Snjl 810209746Sjkim case 'z': 811209746Sjkim 812209746Sjkim Gbl_UseOriginalCompilerId = TRUE; 813209746Sjkim break; 814209746Sjkim 815209746Sjkim 816118611Snjl default: 817118611Snjl 818197104Sjkim return (-1); 819118611Snjl } 820118611Snjl 821197104Sjkim return (0); 822197104Sjkim} 823197104Sjkim 824197104Sjkim 825197104Sjkim/******************************************************************************* 826197104Sjkim * 827197104Sjkim * FUNCTION: AslCommandLine 828197104Sjkim * 829197104Sjkim * PARAMETERS: argc/argv 830197104Sjkim * 831197104Sjkim * RETURN: Last argv index 832197104Sjkim * 833197104Sjkim * DESCRIPTION: Command line processing 834197104Sjkim * 835197104Sjkim ******************************************************************************/ 836197104Sjkim 837197104Sjkimstatic int 838197104SjkimAslCommandLine ( 839197104Sjkim int argc, 840197104Sjkim char **argv) 841197104Sjkim{ 842197104Sjkim int BadCommandLine = 0; 843212761Sjkim ACPI_STATUS Status; 844197104Sjkim 845197104Sjkim 846197104Sjkim /* Minimum command line contains at least the command and an input file */ 847197104Sjkim 848197104Sjkim if (argc < 2) 849197104Sjkim { 850213806Sjkim printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 851197104Sjkim Usage (); 852197104Sjkim exit (1); 853197104Sjkim } 854197104Sjkim 855197104Sjkim /* Process all command line options */ 856197104Sjkim 857197104Sjkim BadCommandLine = AslDoOptions (argc, argv, FALSE); 858197104Sjkim 859209746Sjkim if (Gbl_DoTemplates) 860209746Sjkim { 861212761Sjkim Status = DtCreateTemplates (Gbl_TemplateSignature); 862212761Sjkim if (ACPI_FAILURE (Status)) 863212761Sjkim { 864212761Sjkim exit (-1); 865212761Sjkim } 866209746Sjkim exit (1); 867209746Sjkim } 868209746Sjkim 869118611Snjl /* Next parameter must be the input filename */ 870118611Snjl 871193529Sjkim if (!argv[AcpiGbl_Optind] && 872151937Sjkim !Gbl_DisasmFlag && 873151937Sjkim !Gbl_GetAllTables) 874118611Snjl { 875118611Snjl printf ("Missing input filename\n"); 876118611Snjl BadCommandLine = TRUE; 877118611Snjl } 878118611Snjl 879193529Sjkim if (Gbl_DoSignon) 880118611Snjl { 881213806Sjkim printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 882118611Snjl } 883118611Snjl 884118611Snjl /* Abort if anything went wrong on the command line */ 885118611Snjl 886118611Snjl if (BadCommandLine) 887118611Snjl { 888118611Snjl printf ("\n"); 889118611Snjl Usage (); 890118611Snjl exit (1); 891118611Snjl } 892118611Snjl 893193529Sjkim return (AcpiGbl_Optind); 894118611Snjl} 895118611Snjl 896118611Snjl 897118611Snjl/******************************************************************************* 898118611Snjl * 899118611Snjl * FUNCTION: main 900118611Snjl * 901118611Snjl * PARAMETERS: Standard argc/argv 902118611Snjl * 903118611Snjl * RETURN: Program termination code 904118611Snjl * 905193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line 906193529Sjkim * options and begin the compile for each file on the command line 907118611Snjl * 908118611Snjl ******************************************************************************/ 909118611Snjl 910118611Snjlint ACPI_SYSTEM_XFACE 911118611Snjlmain ( 912118611Snjl int argc, 913118611Snjl char **argv) 914118611Snjl{ 915118611Snjl ACPI_STATUS Status; 916210976Sjkim int Index1; 917210976Sjkim int Index2; 918118611Snjl 919118611Snjl 920210976Sjkim AcpiGbl_ExternalFileList = NULL; 921210976Sjkim 922151937Sjkim#ifdef _DEBUG 923151937Sjkim _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | 924151937Sjkim _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); 925151937Sjkim#endif 926151937Sjkim 927118611Snjl /* Init and command line */ 928118611Snjl 929118611Snjl AslInitialize (); 930210976Sjkim Index1 = Index2 = AslCommandLine (argc, argv); 931118611Snjl 932193529Sjkim /* Options that have no additional parameters or pathnames */ 933118611Snjl 934193529Sjkim if (Gbl_GetAllTables) 935118611Snjl { 936193529Sjkim Status = AslDoOneFile (NULL); 937118611Snjl if (ACPI_FAILURE (Status)) 938118611Snjl { 939193529Sjkim return (-1); 940118611Snjl } 941193529Sjkim return (0); 942193529Sjkim } 943118611Snjl 944210976Sjkim if (Gbl_DisassembleAll) 945210976Sjkim { 946210976Sjkim while (argv[Index1]) 947210976Sjkim { 948210976Sjkim Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList); 949210976Sjkim if (ACPI_FAILURE (Status)) 950210976Sjkim { 951210976Sjkim return (-1); 952210976Sjkim } 953210976Sjkim 954210976Sjkim Index1++; 955210976Sjkim } 956210976Sjkim } 957210976Sjkim 958193529Sjkim /* Process each pathname/filename in the list, with possible wildcards */ 959118611Snjl 960210976Sjkim while (argv[Index2]) 961118611Snjl { 962210976Sjkim Status = AslDoOnePathname (argv[Index2], AslDoOneFile); 963151937Sjkim if (ACPI_FAILURE (Status)) 964151937Sjkim { 965193529Sjkim return (-1); 966151937Sjkim } 967118611Snjl 968210976Sjkim Index2++; 969118611Snjl } 970118611Snjl 971210976Sjkim if (AcpiGbl_ExternalFileList) 972210976Sjkim { 973210976Sjkim AcpiDmClearExternalFileList(); 974210976Sjkim } 975210976Sjkim 976118611Snjl return (0); 977118611Snjl} 978118611Snjl 979118611Snjl 980