aslmain.c revision 220663
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" 99209746Sjkim#define ASL_SUPPORTED_OPTIONS "@:2b:c:d^e:fgh^i^I:l^no:p:r:s:t:T: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 119197104Sjkim printf ("Global:\n"); 120197104Sjkim printf (" -@<file> Specify command file\n"); 121197104Sjkim printf (" -I<dir> Specify additional include directory\n"); 122197104Sjkim 123197104Sjkim printf ("\nGeneral Output:\n"); 124197104Sjkim printf (" -p<prefix> Specify path/filename prefix for all output files\n"); 125193529Sjkim printf (" -va Disable all errors and warnings (summary only)\n"); 126118611Snjl printf (" -vi Less verbose errors and warnings for use with IDEs\n"); 127118611Snjl printf (" -vo Enable optimization comments\n"); 128118611Snjl printf (" -vr Disable remarks\n"); 129118611Snjl printf (" -vs Disable signon\n"); 130167802Sjkim printf (" -w<1|2|3> Set warning reporting level\n"); 131118611Snjl 132138287Smarks printf ("\nAML Output Files:\n"); 133118611Snjl printf (" -s<a|c> Create AML in assembler or C source file (*.asm or *.c)\n"); 134118611Snjl printf (" -i<a|c> Create assembler or C include file (*.inc or *.h)\n"); 135207344Sjkim printf (" -t<a|c|s> Create AML in assembler, C, or ASL hex table (*.hex)\n"); 136118611Snjl 137138287Smarks printf ("\nAML Code Generation:\n"); 138118611Snjl printf (" -oa Disable all optimizations (compatibility mode)\n"); 139118611Snjl printf (" -of Disable constant folding\n"); 140118611Snjl printf (" -oi Disable integer optimization to Zero/One/Ones\n"); 141118611Snjl printf (" -on Disable named reference string optimization\n"); 142207344Sjkim printf (" -cr Disable Resource Descriptor error checking\n"); 143138287Smarks printf (" -r<Revision> Override table header Revision (1-255)\n"); 144118611Snjl 145212761Sjkim printf ("\nASL Listing Files:\n"); 146118611Snjl printf (" -l Create mixed listing file (ASL source and AML) (*.lst)\n"); 147118611Snjl printf (" -ln Create namespace file (*.nsp)\n"); 148118611Snjl printf (" -ls Create combined source file (expanded includes) (*.src)\n"); 149118611Snjl 150209746Sjkim printf ("\nACPI Data Tables:\n"); 151220663Sjkim printf (" -T <Sig>|ALL|* Create table template file(s) for <Sig>\n"); 152209746Sjkim printf (" -vt Create verbose templates (full disassembly)\n"); 153209746Sjkim 154118611Snjl printf ("\nAML Disassembler:\n"); 155167802Sjkim printf (" -d [file] Disassemble or decode binary ACPI table to file (*.dsl)\n"); 156210976Sjkim printf (" -da [f1,f2] Disassemble multiple tables from single namespace\n"); 157118611Snjl printf (" -dc [file] Disassemble AML and immediately compile it\n"); 158118611Snjl printf (" (Obtain DSDT from current system if no input file)\n"); 159193529Sjkim printf (" -e [f1,f2] Include ACPI table(s) for external symbol resolution\n"); 160151937Sjkim printf (" -2 Emit ACPI 2.0 compatible ASL code\n"); 161118611Snjl printf (" -g Get ACPI tables and write to files (*.dat)\n"); 162118611Snjl 163118611Snjl printf ("\nHelp:\n"); 164118611Snjl printf (" -h Additional help and compiler debug options\n"); 165118611Snjl printf (" -hc Display operators allowed in constant expressions\n"); 166118611Snjl printf (" -hr Display ACPI reserved method names\n"); 167209746Sjkim printf (" -ht Display currently supported ACPI table names\n"); 168118611Snjl} 169118611Snjl 170118611Snjl 171118611Snjl/******************************************************************************* 172118611Snjl * 173151937Sjkim * FUNCTION: HelpMessage 174118611Snjl * 175118611Snjl * PARAMETERS: None 176118611Snjl * 177118611Snjl * RETURN: None 178118611Snjl * 179118611Snjl * DESCRIPTION: Display help message 180118611Snjl * 181118611Snjl ******************************************************************************/ 182118611Snjl 183151937Sjkimstatic void 184118611SnjlHelpMessage ( 185118611Snjl void) 186118611Snjl{ 187118611Snjl 188118611Snjl printf ("AML output filename generation:\n"); 189118611Snjl printf (" Output filenames are generated by appending an extension to a common\n"); 190118611Snjl printf (" filename prefix. The filename prefix is obtained via one of the\n"); 191118611Snjl printf (" following methods (in priority order):\n"); 192118611Snjl printf (" 1) The -p option specifies the prefix\n"); 193118611Snjl printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n"); 194118611Snjl printf (" 3) The prefix of the input filename\n"); 195118611Snjl printf ("\n"); 196118611Snjl 197118611Snjl Options (); 198118611Snjl 199167802Sjkim printf ("\nCompiler/Disassembler Debug Options:\n"); 200118611Snjl printf (" -b<p|t|b> Create compiler debug/trace file (*.txt)\n"); 201118611Snjl printf (" Types: Parse/Tree/Both\n"); 202118611Snjl printf (" -f Ignore errors, force creation of AML output file(s)\n"); 203207344Sjkim printf (" -n Parse only, no output generation\n"); 204118611Snjl printf (" -ot Display compile times\n"); 205118611Snjl printf (" -x<level> Set debug level for trace output\n"); 206209746Sjkim printf (" -z Do not insert new compiler ID for DataTables\n"); 207118611Snjl} 208118611Snjl 209118611Snjl 210118611Snjl/******************************************************************************* 211118611Snjl * 212118611Snjl * FUNCTION: Usage 213118611Snjl * 214118611Snjl * PARAMETERS: None 215118611Snjl * 216118611Snjl * RETURN: None 217118611Snjl * 218118611Snjl * DESCRIPTION: Display usage and option message 219118611Snjl * 220118611Snjl ******************************************************************************/ 221118611Snjl 222151937Sjkimstatic void 223118611SnjlUsage ( 224118611Snjl void) 225118611Snjl{ 226118611Snjl 227213806Sjkim printf ("%s\n", ASL_COMPLIANCE); 228213806Sjkim printf ("Usage: %s [Options] [Files]\n\n", ASL_INVOCATION_NAME); 229118611Snjl Options (); 230118611Snjl} 231118611Snjl 232118611Snjl 233118611Snjl/******************************************************************************* 234118611Snjl * 235118611Snjl * FUNCTION: AslInitialize 236118611Snjl * 237118611Snjl * PARAMETERS: None 238118611Snjl * 239118611Snjl * RETURN: None 240118611Snjl * 241118611Snjl * DESCRIPTION: Initialize compiler globals 242118611Snjl * 243118611Snjl ******************************************************************************/ 244118611Snjl 245151937Sjkimstatic void 246151937SjkimAslInitialize ( 247151937Sjkim void) 248118611Snjl{ 249118611Snjl UINT32 i; 250118611Snjl 251118611Snjl 252118611Snjl#ifdef _DEBUG 253118611Snjl _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0)); 254118611Snjl#endif 255118611Snjl 256118611Snjl AcpiDbgLevel = 0; 257118611Snjl 258118611Snjl for (i = 0; i < ASL_NUM_FILES; i++) 259118611Snjl { 260118611Snjl Gbl_Files[i].Handle = NULL; 261118611Snjl Gbl_Files[i].Filename = NULL; 262118611Snjl } 263118611Snjl 264118611Snjl Gbl_Files[ASL_FILE_STDOUT].Handle = stdout; 265118611Snjl Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT"; 266118611Snjl 267118611Snjl Gbl_Files[ASL_FILE_STDERR].Handle = stderr; 268118611Snjl Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR"; 269118611Snjl} 270118611Snjl 271118611Snjl 272118611Snjl/******************************************************************************* 273118611Snjl * 274197104Sjkim * FUNCTION: AslMergeOptionTokens 275118611Snjl * 276197104Sjkim * PARAMETERS: InBuffer - Input containing an option string 277197104Sjkim * OutBuffer - Merged output buffer 278118611Snjl * 279118611Snjl * RETURN: None 280118611Snjl * 281197104Sjkim * DESCRIPTION: Remove all whitespace from an option string. 282118611Snjl * 283118611Snjl ******************************************************************************/ 284118611Snjl 285197104Sjkimstatic void 286197104SjkimAslMergeOptionTokens ( 287197104Sjkim char *InBuffer, 288197104Sjkim char *OutBuffer) 289197104Sjkim{ 290197104Sjkim char *Token; 291197104Sjkim 292197104Sjkim 293197104Sjkim *OutBuffer = 0; 294197104Sjkim 295197104Sjkim Token = strtok (InBuffer, ASL_TOKEN_SEPARATORS); 296197104Sjkim while (Token) 297197104Sjkim { 298197104Sjkim strcat (OutBuffer, Token); 299197104Sjkim Token = strtok (NULL, ASL_TOKEN_SEPARATORS); 300197104Sjkim } 301197104Sjkim} 302197104Sjkim 303197104Sjkim 304197104Sjkim/******************************************************************************* 305197104Sjkim * 306197104Sjkim * FUNCTION: AslDoResponseFile 307197104Sjkim * 308197104Sjkim * PARAMETERS: Filename - Name of the response file 309197104Sjkim * 310197104Sjkim * RETURN: Status 311197104Sjkim * 312197104Sjkim * DESCRIPTION: Open a response file and process all options within. 313197104Sjkim * 314197104Sjkim ******************************************************************************/ 315197104Sjkim 316193529Sjkimstatic int 317197104SjkimAslDoResponseFile ( 318197104Sjkim char *Filename) 319118611Snjl{ 320197104Sjkim char *argv = StringBuffer2; 321197104Sjkim FILE *ResponseFile; 322197104Sjkim int OptStatus = 0; 323197104Sjkim int Opterr; 324197104Sjkim int Optind; 325118611Snjl 326118611Snjl 327197104Sjkim ResponseFile = fopen (Filename, "r"); 328197104Sjkim if (!ResponseFile) 329197104Sjkim { 330197104Sjkim printf ("Could not open command file %s, %s\n", 331197104Sjkim Filename, strerror (errno)); 332197104Sjkim return -1; 333197104Sjkim } 334118611Snjl 335197104Sjkim /* Must save the current GetOpt globals */ 336197104Sjkim 337197104Sjkim Opterr = AcpiGbl_Opterr; 338197104Sjkim Optind = AcpiGbl_Optind; 339197104Sjkim 340197104Sjkim /* 341197104Sjkim * Process all lines in the response file. There must be one complete 342197104Sjkim * option per line 343197104Sjkim */ 344197104Sjkim while (fgets (StringBuffer, ASL_MSG_BUFFER_SIZE, ResponseFile)) 345118611Snjl { 346197104Sjkim /* Compress all tokens, allowing us to use a single argv entry */ 347197104Sjkim 348197104Sjkim AslMergeOptionTokens (StringBuffer, StringBuffer2); 349197104Sjkim 350197104Sjkim /* Process the option */ 351197104Sjkim 352197104Sjkim AcpiGbl_Opterr = 0; 353197104Sjkim AcpiGbl_Optind = 0; 354197104Sjkim 355197104Sjkim OptStatus = AslDoOptions (1, &argv, TRUE); 356197104Sjkim if (OptStatus) 357197104Sjkim { 358197104Sjkim printf ("Invalid option in command file %s: %s\n", 359197104Sjkim Filename, StringBuffer); 360197104Sjkim break; 361197104Sjkim } 362118611Snjl } 363118611Snjl 364197104Sjkim /* Restore the GetOpt globals */ 365197104Sjkim 366197104Sjkim AcpiGbl_Opterr = Opterr; 367197104Sjkim AcpiGbl_Optind = Optind; 368197104Sjkim 369197104Sjkim fclose (ResponseFile); 370197104Sjkim return (OptStatus); 371197104Sjkim} 372197104Sjkim 373197104Sjkim 374197104Sjkim/******************************************************************************* 375197104Sjkim * 376197104Sjkim * FUNCTION: AslDoOptions 377197104Sjkim * 378197104Sjkim * PARAMETERS: argc/argv - Standard argc/argv 379197104Sjkim * IsResponseFile - TRUE if executing a response file. 380197104Sjkim * 381197104Sjkim * RETURN: Status 382197104Sjkim * 383197104Sjkim * DESCRIPTION: Command line option processing 384197104Sjkim * 385197104Sjkim ******************************************************************************/ 386197104Sjkim 387197104Sjkimstatic int 388197104SjkimAslDoOptions ( 389197104Sjkim int argc, 390197104Sjkim char **argv, 391197104Sjkim BOOLEAN IsResponseFile) 392197104Sjkim{ 393197104Sjkim int j; 394212761Sjkim ACPI_STATUS Status; 395197104Sjkim 396197104Sjkim 397118611Snjl /* Get the command line options */ 398118611Snjl 399197104Sjkim while ((j = AcpiGetopt (argc, argv, ASL_SUPPORTED_OPTIONS)) != EOF) switch (j) 400118611Snjl { 401197104Sjkim case '@': /* Begin a response file */ 402197104Sjkim 403197104Sjkim if (IsResponseFile) 404197104Sjkim { 405197104Sjkim printf ("Nested command files are not supported\n"); 406197104Sjkim return -1; 407197104Sjkim } 408197104Sjkim 409197104Sjkim if (AslDoResponseFile (AcpiGbl_Optarg)) 410197104Sjkim { 411197104Sjkim return -1; 412197104Sjkim } 413197104Sjkim break; 414197104Sjkim 415197104Sjkim 416151937Sjkim case '2': 417197104Sjkim 418151937Sjkim Gbl_Acpi2 = TRUE; 419151937Sjkim break; 420151937Sjkim 421151937Sjkim 422118611Snjl case 'b': 423118611Snjl 424118611Snjl switch (AcpiGbl_Optarg[0]) 425118611Snjl { 426118611Snjl case 'b': 427118611Snjl AslCompilerdebug = 1; /* same as yydebug */ 428220663Sjkim DtParserdebug = 1; 429118611Snjl break; 430118611Snjl 431118611Snjl case 'p': 432118611Snjl AslCompilerdebug = 1; /* same as yydebug */ 433220663Sjkim DtParserdebug = 1; 434118611Snjl break; 435118611Snjl 436118611Snjl case 't': 437118611Snjl break; 438118611Snjl 439118611Snjl default: 440118611Snjl printf ("Unknown option: -b%s\n", AcpiGbl_Optarg); 441197104Sjkim return (-1); 442118611Snjl } 443118611Snjl 444118611Snjl /* Produce debug output file */ 445118611Snjl 446118611Snjl Gbl_DebugFlag = TRUE; 447118611Snjl break; 448118611Snjl 449118611Snjl 450118611Snjl case 'c': 451207344Sjkim switch (AcpiGbl_Optarg[0]) 452207344Sjkim { 453207344Sjkim case 'r': 454207344Sjkim Gbl_NoResourceChecking = TRUE; 455207344Sjkim break; 456118611Snjl 457207344Sjkim default: 458207344Sjkim printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 459207344Sjkim return (-1); 460207344Sjkim } 461118611Snjl break; 462118611Snjl 463118611Snjl 464118611Snjl case 'd': 465118611Snjl switch (AcpiGbl_Optarg[0]) 466118611Snjl { 467118611Snjl case '^': 468193529Sjkim Gbl_DoCompile = FALSE; 469118611Snjl break; 470118611Snjl 471210976Sjkim case 'a': 472210976Sjkim Gbl_DoCompile = FALSE; 473210976Sjkim Gbl_DisassembleAll = TRUE; 474210976Sjkim break; 475210976Sjkim 476118611Snjl case 'c': 477118611Snjl break; 478118611Snjl 479118611Snjl default: 480118611Snjl printf ("Unknown option: -d%s\n", AcpiGbl_Optarg); 481197104Sjkim return (-1); 482118611Snjl } 483118611Snjl 484118611Snjl Gbl_DisasmFlag = TRUE; 485118611Snjl break; 486118611Snjl 487118611Snjl 488118611Snjl case 'e': 489212761Sjkim Status = AcpiDmAddToExternalFileList (AcpiGbl_Optarg); 490212761Sjkim if (ACPI_FAILURE (Status)) 491212761Sjkim { 492212761Sjkim printf ("Could not add %s to external list\n", AcpiGbl_Optarg); 493212761Sjkim return (-1); 494212761Sjkim } 495118611Snjl break; 496118611Snjl 497118611Snjl 498118611Snjl case 'f': 499118611Snjl 500118611Snjl /* Ignore errors and force creation of aml file */ 501118611Snjl 502118611Snjl Gbl_IgnoreErrors = TRUE; 503118611Snjl break; 504118611Snjl 505118611Snjl 506118611Snjl case 'g': 507118611Snjl 508118611Snjl /* Get all ACPI tables */ 509118611Snjl 510118611Snjl Gbl_GetAllTables = TRUE; 511193529Sjkim Gbl_DoCompile = FALSE; 512118611Snjl break; 513118611Snjl 514118611Snjl 515118611Snjl case 'h': 516118611Snjl 517118611Snjl switch (AcpiGbl_Optarg[0]) 518118611Snjl { 519118611Snjl case '^': 520118611Snjl HelpMessage (); 521118611Snjl exit (0); 522118611Snjl 523118611Snjl case 'c': 524118611Snjl UtDisplayConstantOpcodes (); 525118611Snjl exit (0); 526118611Snjl 527118611Snjl case 'r': 528118611Snjl /* reserved names */ 529118611Snjl 530204773Sjkim ApDisplayReservedNames (); 531118611Snjl exit (0); 532118611Snjl 533209746Sjkim case 't': 534209746Sjkim UtDisplaySupportedTables (); 535209746Sjkim exit (0); 536209746Sjkim 537118611Snjl default: 538118611Snjl printf ("Unknown option: -h%s\n", AcpiGbl_Optarg); 539197104Sjkim return (-1); 540118611Snjl } 541118611Snjl 542118611Snjl 543197104Sjkim case 'I': /* Add an include file search directory */ 544197104Sjkim 545197104Sjkim FlAddIncludeDirectory (AcpiGbl_Optarg); 546197104Sjkim break; 547197104Sjkim 548197104Sjkim 549118611Snjl case 'i': 550118611Snjl 551118611Snjl switch (AcpiGbl_Optarg[0]) 552118611Snjl { 553118611Snjl case 'a': 554118611Snjl 555118611Snjl /* Produce assembly code include file */ 556118611Snjl 557118611Snjl Gbl_AsmIncludeOutputFlag = TRUE; 558118611Snjl break; 559118611Snjl 560118611Snjl case 'c': 561118611Snjl 562118611Snjl /* Produce C include file */ 563118611Snjl 564118611Snjl Gbl_C_IncludeOutputFlag = TRUE; 565118611Snjl break; 566118611Snjl 567118611Snjl default: 568118611Snjl printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); 569197104Sjkim return (-1); 570118611Snjl } 571118611Snjl break; 572118611Snjl 573118611Snjl 574118611Snjl case 'l': 575118611Snjl 576118611Snjl switch (AcpiGbl_Optarg[0]) 577118611Snjl { 578118611Snjl case '^': 579118611Snjl /* Produce listing file (Mixed source/aml) */ 580118611Snjl 581118611Snjl Gbl_ListingFlag = TRUE; 582118611Snjl break; 583118611Snjl 584118611Snjl case 'n': 585118611Snjl /* Produce namespace file */ 586118611Snjl 587118611Snjl Gbl_NsOutputFlag = TRUE; 588118611Snjl break; 589118611Snjl 590118611Snjl case 's': 591118611Snjl /* Produce combined source file */ 592118611Snjl 593118611Snjl Gbl_SourceOutputFlag = TRUE; 594118611Snjl break; 595118611Snjl 596118611Snjl default: 597118611Snjl printf ("Unknown option: -l%s\n", AcpiGbl_Optarg); 598197104Sjkim return (-1); 599118611Snjl } 600118611Snjl break; 601118611Snjl 602118611Snjl 603118611Snjl case 'o': 604118611Snjl 605118611Snjl switch (AcpiGbl_Optarg[0]) 606118611Snjl { 607118611Snjl case 'a': 608118611Snjl 609118611Snjl /* Disable all optimizations */ 610118611Snjl 611118611Snjl Gbl_FoldConstants = FALSE; 612118611Snjl Gbl_IntegerOptimizationFlag = FALSE; 613118611Snjl Gbl_ReferenceOptimizationFlag = FALSE; 614118611Snjl break; 615118611Snjl 616118611Snjl case 'f': 617118611Snjl 618118611Snjl /* Disable folding on "normal" expressions */ 619118611Snjl 620118611Snjl Gbl_FoldConstants = FALSE; 621118611Snjl break; 622118611Snjl 623118611Snjl case 'i': 624118611Snjl 625118611Snjl /* Disable integer optimization to constants */ 626118611Snjl 627118611Snjl Gbl_IntegerOptimizationFlag = FALSE; 628118611Snjl break; 629118611Snjl 630118611Snjl case 'n': 631118611Snjl 632118611Snjl /* Disable named reference optimization */ 633118611Snjl 634118611Snjl Gbl_ReferenceOptimizationFlag = FALSE; 635118611Snjl break; 636118611Snjl 637118611Snjl case 't': 638118611Snjl 639118611Snjl /* Display compile time(s) */ 640118611Snjl 641118611Snjl Gbl_CompileTimesFlag = TRUE; 642118611Snjl break; 643118611Snjl 644118611Snjl default: 645118611Snjl printf ("Unknown option: -c%s\n", AcpiGbl_Optarg); 646197104Sjkim return (-1); 647118611Snjl } 648118611Snjl break; 649118611Snjl 650118611Snjl 651207344Sjkim case 'n': 652207344Sjkim 653207344Sjkim /* Parse only */ 654207344Sjkim 655207344Sjkim Gbl_ParseOnlyFlag = TRUE; 656207344Sjkim break; 657207344Sjkim 658207344Sjkim 659118611Snjl case 'p': 660118611Snjl 661118611Snjl /* Override default AML output filename */ 662118611Snjl 663118611Snjl Gbl_OutputFilenamePrefix = AcpiGbl_Optarg; 664118611Snjl Gbl_UseDefaultAmlFilename = FALSE; 665118611Snjl break; 666118611Snjl 667118611Snjl 668118611Snjl case 'r': 669138287Smarks Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0); 670118611Snjl break; 671118611Snjl 672118611Snjl 673118611Snjl case 's': 674118611Snjl 675118611Snjl switch (AcpiGbl_Optarg[0]) 676118611Snjl { 677118611Snjl case 'a': 678118611Snjl 679118611Snjl /* Produce assembly code output file */ 680118611Snjl 681118611Snjl Gbl_AsmOutputFlag = TRUE; 682118611Snjl break; 683118611Snjl 684118611Snjl case 'c': 685118611Snjl 686118611Snjl /* Produce C hex output file */ 687118611Snjl 688118611Snjl Gbl_C_OutputFlag = TRUE; 689118611Snjl break; 690118611Snjl 691118611Snjl default: 692118611Snjl printf ("Unknown option: -s%s\n", AcpiGbl_Optarg); 693197104Sjkim return (-1); 694118611Snjl } 695118611Snjl break; 696118611Snjl 697118611Snjl 698118611Snjl case 't': 699118611Snjl 700118611Snjl /* Produce hex table output file */ 701118611Snjl 702118611Snjl switch (AcpiGbl_Optarg[0]) 703118611Snjl { 704118611Snjl case 'a': 705118611Snjl Gbl_HexOutputFlag = HEX_OUTPUT_ASM; 706118611Snjl break; 707118611Snjl 708118611Snjl case 'c': 709118611Snjl Gbl_HexOutputFlag = HEX_OUTPUT_C; 710118611Snjl break; 711118611Snjl 712207344Sjkim case 's': 713207344Sjkim Gbl_HexOutputFlag = HEX_OUTPUT_ASL; 714207344Sjkim break; 715207344Sjkim 716118611Snjl default: 717118611Snjl printf ("Unknown option: -t%s\n", AcpiGbl_Optarg); 718197104Sjkim return (-1); 719118611Snjl } 720118611Snjl break; 721118611Snjl 722118611Snjl 723209746Sjkim case 'T': 724209746Sjkim Gbl_DoTemplates = TRUE; 725209746Sjkim Gbl_TemplateSignature = AcpiGbl_Optarg; 726209746Sjkim break; 727209746Sjkim 728209746Sjkim 729118611Snjl case 'v': 730118611Snjl 731118611Snjl switch (AcpiGbl_Optarg[0]) 732118611Snjl { 733193529Sjkim case 'a': 734193529Sjkim /* Disable All error/warning messages */ 735193529Sjkim 736193529Sjkim Gbl_NoErrors = TRUE; 737193529Sjkim break; 738193529Sjkim 739118611Snjl case 'i': 740118611Snjl /* Less verbose error messages */ 741118611Snjl 742118611Snjl Gbl_VerboseErrors = FALSE; 743118611Snjl break; 744118611Snjl 745118611Snjl case 'o': 746118611Snjl Gbl_DisplayOptimizations = TRUE; 747118611Snjl break; 748118611Snjl 749118611Snjl case 'r': 750118611Snjl Gbl_DisplayRemarks = FALSE; 751118611Snjl break; 752118611Snjl 753118611Snjl case 's': 754193529Sjkim Gbl_DoSignon = FALSE; 755118611Snjl break; 756118611Snjl 757209746Sjkim case 't': 758209746Sjkim Gbl_VerboseTemplates = TRUE; 759209746Sjkim break; 760209746Sjkim 761118611Snjl default: 762118611Snjl printf ("Unknown option: -v%s\n", AcpiGbl_Optarg); 763197104Sjkim return (-1); 764118611Snjl } 765118611Snjl break; 766118611Snjl 767118611Snjl 768167802Sjkim case 'w': /* Set warning levels */ 769167802Sjkim 770167802Sjkim switch (AcpiGbl_Optarg[0]) 771167802Sjkim { 772167802Sjkim case '1': 773167802Sjkim Gbl_WarningLevel = ASL_WARNING; 774167802Sjkim break; 775167802Sjkim 776167802Sjkim case '2': 777167802Sjkim Gbl_WarningLevel = ASL_WARNING2; 778167802Sjkim break; 779167802Sjkim 780167802Sjkim case '3': 781167802Sjkim Gbl_WarningLevel = ASL_WARNING3; 782167802Sjkim break; 783167802Sjkim 784167802Sjkim default: 785167802Sjkim printf ("Unknown option: -w%s\n", AcpiGbl_Optarg); 786197104Sjkim return (-1); 787167802Sjkim } 788167802Sjkim break; 789167802Sjkim 790167802Sjkim 791118611Snjl case 'x': 792118611Snjl 793118611Snjl AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16); 794118611Snjl break; 795118611Snjl 796118611Snjl 797209746Sjkim case 'z': 798209746Sjkim 799209746Sjkim Gbl_UseOriginalCompilerId = TRUE; 800209746Sjkim break; 801209746Sjkim 802209746Sjkim 803118611Snjl default: 804118611Snjl 805197104Sjkim return (-1); 806118611Snjl } 807118611Snjl 808197104Sjkim return (0); 809197104Sjkim} 810197104Sjkim 811197104Sjkim 812197104Sjkim/******************************************************************************* 813197104Sjkim * 814197104Sjkim * FUNCTION: AslCommandLine 815197104Sjkim * 816197104Sjkim * PARAMETERS: argc/argv 817197104Sjkim * 818197104Sjkim * RETURN: Last argv index 819197104Sjkim * 820197104Sjkim * DESCRIPTION: Command line processing 821197104Sjkim * 822197104Sjkim ******************************************************************************/ 823197104Sjkim 824197104Sjkimstatic int 825197104SjkimAslCommandLine ( 826197104Sjkim int argc, 827197104Sjkim char **argv) 828197104Sjkim{ 829197104Sjkim int BadCommandLine = 0; 830212761Sjkim ACPI_STATUS Status; 831197104Sjkim 832197104Sjkim 833197104Sjkim /* Minimum command line contains at least the command and an input file */ 834197104Sjkim 835197104Sjkim if (argc < 2) 836197104Sjkim { 837213806Sjkim printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 838197104Sjkim Usage (); 839197104Sjkim exit (1); 840197104Sjkim } 841197104Sjkim 842197104Sjkim /* Process all command line options */ 843197104Sjkim 844197104Sjkim BadCommandLine = AslDoOptions (argc, argv, FALSE); 845197104Sjkim 846209746Sjkim if (Gbl_DoTemplates) 847209746Sjkim { 848212761Sjkim Status = DtCreateTemplates (Gbl_TemplateSignature); 849212761Sjkim if (ACPI_FAILURE (Status)) 850212761Sjkim { 851212761Sjkim exit (-1); 852212761Sjkim } 853209746Sjkim exit (1); 854209746Sjkim } 855209746Sjkim 856118611Snjl /* Next parameter must be the input filename */ 857118611Snjl 858193529Sjkim if (!argv[AcpiGbl_Optind] && 859151937Sjkim !Gbl_DisasmFlag && 860151937Sjkim !Gbl_GetAllTables) 861118611Snjl { 862118611Snjl printf ("Missing input filename\n"); 863118611Snjl BadCommandLine = TRUE; 864118611Snjl } 865118611Snjl 866193529Sjkim if (Gbl_DoSignon) 867118611Snjl { 868213806Sjkim printf (ACPI_COMMON_SIGNON (ASL_COMPILER_NAME)); 869118611Snjl } 870118611Snjl 871118611Snjl /* Abort if anything went wrong on the command line */ 872118611Snjl 873118611Snjl if (BadCommandLine) 874118611Snjl { 875118611Snjl printf ("\n"); 876118611Snjl Usage (); 877118611Snjl exit (1); 878118611Snjl } 879118611Snjl 880193529Sjkim return (AcpiGbl_Optind); 881118611Snjl} 882118611Snjl 883118611Snjl 884118611Snjl/******************************************************************************* 885118611Snjl * 886118611Snjl * FUNCTION: main 887118611Snjl * 888118611Snjl * PARAMETERS: Standard argc/argv 889118611Snjl * 890118611Snjl * RETURN: Program termination code 891118611Snjl * 892193529Sjkim * DESCRIPTION: C main routine for the Asl Compiler. Handle command line 893193529Sjkim * options and begin the compile for each file on the command line 894118611Snjl * 895118611Snjl ******************************************************************************/ 896118611Snjl 897118611Snjlint ACPI_SYSTEM_XFACE 898118611Snjlmain ( 899118611Snjl int argc, 900118611Snjl char **argv) 901118611Snjl{ 902118611Snjl ACPI_STATUS Status; 903210976Sjkim int Index1; 904210976Sjkim int Index2; 905118611Snjl 906118611Snjl 907210976Sjkim AcpiGbl_ExternalFileList = NULL; 908210976Sjkim 909151937Sjkim#ifdef _DEBUG 910151937Sjkim _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF | 911151937Sjkim _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)); 912151937Sjkim#endif 913151937Sjkim 914118611Snjl /* Init and command line */ 915118611Snjl 916118611Snjl AslInitialize (); 917210976Sjkim Index1 = Index2 = AslCommandLine (argc, argv); 918118611Snjl 919193529Sjkim /* Options that have no additional parameters or pathnames */ 920118611Snjl 921193529Sjkim if (Gbl_GetAllTables) 922118611Snjl { 923193529Sjkim Status = AslDoOneFile (NULL); 924118611Snjl if (ACPI_FAILURE (Status)) 925118611Snjl { 926193529Sjkim return (-1); 927118611Snjl } 928193529Sjkim return (0); 929193529Sjkim } 930118611Snjl 931210976Sjkim if (Gbl_DisassembleAll) 932210976Sjkim { 933210976Sjkim while (argv[Index1]) 934210976Sjkim { 935210976Sjkim Status = AslDoOnePathname (argv[Index1], AcpiDmAddToExternalFileList); 936210976Sjkim if (ACPI_FAILURE (Status)) 937210976Sjkim { 938210976Sjkim return (-1); 939210976Sjkim } 940210976Sjkim 941210976Sjkim Index1++; 942210976Sjkim } 943210976Sjkim } 944210976Sjkim 945193529Sjkim /* Process each pathname/filename in the list, with possible wildcards */ 946118611Snjl 947210976Sjkim while (argv[Index2]) 948118611Snjl { 949210976Sjkim Status = AslDoOnePathname (argv[Index2], AslDoOneFile); 950151937Sjkim if (ACPI_FAILURE (Status)) 951151937Sjkim { 952193529Sjkim return (-1); 953151937Sjkim } 954118611Snjl 955210976Sjkim Index2++; 956118611Snjl } 957118611Snjl 958210976Sjkim if (AcpiGbl_ExternalFileList) 959210976Sjkim { 960210976Sjkim AcpiDmClearExternalFileList(); 961210976Sjkim } 962210976Sjkim 963118611Snjl return (0); 964118611Snjl} 965118611Snjl 966118611Snjl 967