hotspot/src/share/vm/adlc/main.cpp
author kvn
Tue, 09 Oct 2012 16:09:31 -0700
changeset 13971 3c568f3dacca
parent 13728 882756847a04
child 14631 526804361522
permissions -rw-r--r--
8000592: Improve adlc usability Summary: several changes to adlc to improve its usability Reviewed-by: kvn Contributed-by: goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 8921
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2129
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2129
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2129
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
// MAIN.CPP - Entry point for the Architecture Description Language Compiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
#include "adlc.hpp"
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
//------------------------------Prototypes-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
static void  usage(ArchDesc& AD);          // Print usage message and exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
static char *strip_ext(char *fname);       // Strip off name extension
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
static char *base_plus_suffix(const char* base, const char *suffix);// New concatenated string
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
static char *prefix_plus_base_plus_suffix(const char* prefix, const char* base, const char *suffix);// New concatenated string
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
static int get_legal_text(FileBuff &fbuf, char **legal_text); // Get pointer to legal text
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
ArchDesc* globalAD = NULL;      // global reference to Architecture Description object
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
const char* get_basename(const char* filename) {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
  const char *basename = filename;
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
  const char *cp;
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
  for (cp = basename; *cp; cp++) {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
    if (*cp == '/') {
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
      basename = cp+1;
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    43
    }
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    44
  }
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
  return basename;
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
}
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    47
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//------------------------------main-------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
int main(int argc, char *argv[])
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  ArchDesc      AD;             // Architecture Description object
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  globalAD = &AD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  // ResourceMark  mark;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
  ADLParser    *ADL_Parse;      // ADL Parser object to parse AD file
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  // Check for proper arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  if( argc == 1 ) usage(AD);    // No arguments?  Then print usage
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  // Read command line arguments and file names
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  for( int i = 1; i < argc; i++ ) { // For all arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
    register char *s = argv[i]; // Get option/filename
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    if( *s++ == '-' ) {         // It's a flag? (not a filename)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
      if( !*s ) {               // Stand-alone `-' means stdin
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
        //********** INSERT CODE HERE **********
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
      } else while (*s != '\0') { // While have flags on option
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
        switch (*s++) {         // Handle flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
        case 'd':               // Debug flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
          AD._dfa_debug += 1;   // Set Debug Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
        case 'g':               // Debug ad location flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
          AD._adlocation_debug += 1;       // Set Debug ad location Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
        case 'o':               // No Output Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
          AD._no_output ^= 1;   // Toggle no_output flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
        case 'q':               // Quiet Mode Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
          AD._quiet_mode ^= 1;  // Toggle quiet_mode flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
        case 'w':               // Disable Warnings Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
          AD._disable_warnings ^= 1; // Toggle disable_warnings flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
        case 'T':               // Option to make DFA as many subroutine calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
          AD._dfa_small += 1;   // Set Mode Flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
        case 'c': {             // Set C++ Output file name
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
          AD._CPP_file._name = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
          const char *base = strip_ext(strdup(s));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
          AD._CPP_CLONE_file._name    = base_plus_suffix(base,"_clone.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
          AD._CPP_EXPAND_file._name   = base_plus_suffix(base,"_expand.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
          AD._CPP_FORMAT_file._name   = base_plus_suffix(base,"_format.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
          AD._CPP_GEN_file._name      = base_plus_suffix(base,"_gen.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
          AD._CPP_MISC_file._name     = base_plus_suffix(base,"_misc.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
          AD._CPP_PEEPHOLE_file._name = base_plus_suffix(base,"_peephole.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
          AD._CPP_PIPELINE_file._name = base_plus_suffix(base,"_pipeline.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
          s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
        case 'h':               // Set C++ Output file name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
          AD._HPP_file._name = s; s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
        case 'v':               // Set C++ Output file name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
          AD._VM_file._name = s; s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
        case 'a':               // Set C++ Output file name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
          AD._DFA_file._name = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
          AD._bug_file._name = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
          s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
        case '#':               // Special internal debug flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
          AD._adl_debug++;      // Increment internal debug level
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
        case 's':               // Output which instructions are cisc-spillable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
          AD._cisc_spill_debug = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
        case 'D':               // Flag Definition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
          {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
            char* flag = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
            s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
            char* def = strchr(flag, '=');
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
            if (def == NULL)  def = (char*)"1";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
            else              *def++ = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
            AD.set_preproc_def(flag, def);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
        case 'U':               // Flag Un-Definition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
          {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
            char* flag = s;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
            s += strlen(s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
            AD.set_preproc_def(flag, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
        default:                // Unknown option
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
          usage(AD);            // So print usage and exit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
        }                       // End of switch on options...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
      }                         // End of while have options...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    } else {                    // Not an option; must be a filename
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
      AD._ADL_file._name = argv[i]; // Set the input filename
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
      // // Files for storage, based on input file name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
      const char *base = strip_ext(strdup(argv[i]));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
      char       *temp = base_plus_suffix("dfa_",base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
      AD._DFA_file._name = base_plus_suffix(temp,".cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
      delete temp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
      temp = base_plus_suffix("ad_",base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
      AD._CPP_file._name          = base_plus_suffix(temp,".cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
      AD._CPP_CLONE_file._name    = base_plus_suffix(temp,"_clone.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
      AD._CPP_EXPAND_file._name   = base_plus_suffix(temp,"_expand.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
      AD._CPP_FORMAT_file._name   = base_plus_suffix(temp,"_format.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
      AD._CPP_GEN_file._name      = base_plus_suffix(temp,"_gen.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
      AD._CPP_MISC_file._name     = base_plus_suffix(temp,"_misc.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
      AD._CPP_PEEPHOLE_file._name = base_plus_suffix(temp,"_peephole.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
      AD._CPP_PIPELINE_file._name = base_plus_suffix(temp,"_pipeline.cpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
      AD._HPP_file._name = base_plus_suffix(temp,".hpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
      delete temp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
      temp = base_plus_suffix("adGlobals_",base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
      AD._VM_file._name = base_plus_suffix(temp,".hpp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
      delete temp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
      temp = base_plus_suffix("bugs_",base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
      AD._bug_file._name = base_plus_suffix(temp,".out");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
      delete temp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    }                           // End of files vs options...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  }                             // End of while have command line arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // Open files used to store the matcher and its components
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  if (AD.open_files() == 0) return 1; // Open all input/output files
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  // Build the File Buffer, Parse the input, & Generate Code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  FileBuff  ADL_Buf(&AD._ADL_file, AD); // Create a file buffer for input file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  // Get pointer to legal text at the beginning of AD file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  // It will be used in generated ad files.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  char* legal_text;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  int legal_sz = get_legal_text(ADL_Buf, &legal_text);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  ADL_Parse = new ADLParser(ADL_Buf, AD); // Create a parser to parse the buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  ADL_Parse->parse();           // Parse buffer & build description lists
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  if( AD._dfa_debug >= 1 ) {    // For higher debug settings, print dump
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    AD.dump();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  delete ADL_Parse;             // Delete parser
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Verify that the results of the parse are consistent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  AD.verify();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  // Prepare to generate the result files:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  AD.generateMatchLists();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  AD.identify_unique_operands();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  AD.identify_cisc_spill_instructions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  AD.identify_short_branches();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // Make sure every file starts with a copyright:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  AD.addSunCopyright(legal_text, legal_sz, AD._HPP_file._fp);           // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_file._fp);           // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_CLONE_file._fp);     // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_EXPAND_file._fp);    // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_FORMAT_file._fp);    // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_GEN_file._fp);       // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_MISC_file._fp);      // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_PEEPHOLE_file._fp);  // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  AD.addSunCopyright(legal_text, legal_sz, AD._CPP_PIPELINE_file._fp);  // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  AD.addSunCopyright(legal_text, legal_sz, AD._VM_file._fp);            // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  AD.addSunCopyright(legal_text, legal_sz, AD._DFA_file._fp);           // .cpp
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   207
  // Add include guards for all .hpp files
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   208
  AD.addIncludeGuardStart(AD._HPP_file, "GENERATED_ADFILES_AD_HPP");        // .hpp
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   209
  AD.addIncludeGuardStart(AD._VM_file, "GENERATED_ADFILES_ADGLOBALS_HPP");  // .hpp
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   210
  // Add includes
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   211
  AD.addInclude(AD._CPP_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   212
  AD.addInclude(AD._CPP_file, "adfiles", get_basename(AD._VM_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   213
  AD.addInclude(AD._CPP_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   214
  AD.addInclude(AD._CPP_file, "memory/allocation.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   215
  AD.addInclude(AD._CPP_file, "asm/assembler.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   216
  AD.addInclude(AD._CPP_file, "code/vmreg.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   217
  AD.addInclude(AD._CPP_file, "gc_interface/collectedHeap.inline.hpp");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   218
  AD.addInclude(AD._CPP_file, "oops/compiledICHolder.hpp");
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   219
  AD.addInclude(AD._CPP_file, "oops/markOop.hpp");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13104
diff changeset
   220
  AD.addInclude(AD._CPP_file, "oops/method.hpp");
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   221
  AD.addInclude(AD._CPP_file, "oops/oop.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   222
  AD.addInclude(AD._CPP_file, "oops/oop.inline2.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   223
  AD.addInclude(AD._CPP_file, "opto/cfgnode.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   224
  AD.addInclude(AD._CPP_file, "opto/locknode.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   225
  AD.addInclude(AD._CPP_file, "opto/opcodes.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   226
  AD.addInclude(AD._CPP_file, "opto/regalloc.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   227
  AD.addInclude(AD._CPP_file, "opto/regmask.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   228
  AD.addInclude(AD._CPP_file, "opto/runtime.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   229
  AD.addInclude(AD._CPP_file, "runtime/biasedLocking.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   230
  AD.addInclude(AD._CPP_file, "runtime/sharedRuntime.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   231
  AD.addInclude(AD._CPP_file, "runtime/stubRoutines.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   232
  AD.addInclude(AD._CPP_file, "utilities/growableArray.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   233
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   234
  AD.addInclude(AD._CPP_file, "assembler_x86.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   235
  AD.addInclude(AD._CPP_file, "nativeInst_x86.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   236
  AD.addInclude(AD._CPP_file, "vmreg_x86.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   237
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   238
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   239
  AD.addInclude(AD._CPP_file, "assembler_sparc.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   240
  AD.addInclude(AD._CPP_file, "nativeInst_sparc.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   241
  AD.addInclude(AD._CPP_file, "vmreg_sparc.inline.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   242
#endif
8868
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7397
diff changeset
   243
#ifdef TARGET_ARCH_arm
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7397
diff changeset
   244
  AD.addInclude(AD._CPP_file, "assembler_arm.inline.hpp");
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7397
diff changeset
   245
  AD.addInclude(AD._CPP_file, "nativeInst_arm.hpp");
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7397
diff changeset
   246
  AD.addInclude(AD._CPP_file, "vmreg_arm.inline.hpp");
1bae515b806b 7029017: Additional architecture support for c2 compiler
roland
parents: 7397
diff changeset
   247
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   248
  AD.addInclude(AD._HPP_file, "memory/allocation.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   249
  AD.addInclude(AD._HPP_file, "opto/machnode.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   250
  AD.addInclude(AD._HPP_file, "opto/node.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   251
  AD.addInclude(AD._HPP_file, "opto/regalloc.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   252
  AD.addInclude(AD._HPP_file, "opto/subnode.hpp");
13104
657b387034fb 7119644: Increase superword's vector size up to 256 bits
kvn
parents: 8921
diff changeset
   253
  AD.addInclude(AD._HPP_file, "opto/vectornode.hpp");
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   254
  AD.addInclude(AD._CPP_CLONE_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   255
  AD.addInclude(AD._CPP_CLONE_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   256
  AD.addInclude(AD._CPP_EXPAND_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   257
  AD.addInclude(AD._CPP_EXPAND_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   258
  AD.addInclude(AD._CPP_FORMAT_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   259
  AD.addInclude(AD._CPP_FORMAT_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   260
  AD.addInclude(AD._CPP_GEN_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   261
  AD.addInclude(AD._CPP_GEN_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   262
  AD.addInclude(AD._CPP_GEN_file, "opto/cfgnode.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   263
  AD.addInclude(AD._CPP_GEN_file, "opto/locknode.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   264
  AD.addInclude(AD._CPP_MISC_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   265
  AD.addInclude(AD._CPP_MISC_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   266
  AD.addInclude(AD._CPP_PEEPHOLE_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   267
  AD.addInclude(AD._CPP_PEEPHOLE_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   268
  AD.addInclude(AD._CPP_PIPELINE_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   269
  AD.addInclude(AD._CPP_PIPELINE_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   270
  AD.addInclude(AD._DFA_file, "precompiled.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   271
  AD.addInclude(AD._DFA_file, "adfiles", get_basename(AD._HPP_file._name));
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   272
  AD.addInclude(AD._DFA_file, "opto/matcher.hpp");
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   273
  AD.addInclude(AD._DFA_file, "opto/opcodes.hpp");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // Make sure each .cpp file starts with include lines:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // files declaring and defining generators for Mach* Objects (hpp,cpp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // Generate the result files:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // enumerations, class definitions, object generators, and the DFA
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // file containing enumeration of machine operands & instructions (hpp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  AD.addPreHeaderBlocks(AD._HPP_file._fp);        // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  AD.buildMachOperEnum(AD._HPP_file._fp);         // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  AD.buildMachOpcodesEnum(AD._HPP_file._fp);      // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  AD.buildMachRegisterNumbers(AD._VM_file._fp);   // VM file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  AD.buildMachRegisterEncodes(AD._HPP_file._fp);  // .hpp file
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  AD.declareRegSizes(AD._HPP_file._fp);           // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  AD.build_pipeline_enums(AD._HPP_file._fp);      // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // output definition of class "State"
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  AD.defineStateClass(AD._HPP_file._fp);          // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // file declaring the Mach* classes derived from MachOper and MachNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  AD.declareClasses(AD._HPP_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // declare and define maps: in the .hpp and .cpp files respectively
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  AD.addSourceBlocks(AD._CPP_file._fp);           // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  AD.addHeaderBlocks(AD._HPP_file._fp);           // .hpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  AD.buildReduceMaps(AD._HPP_file._fp, AD._CPP_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  AD.buildMustCloneMap(AD._HPP_file._fp, AD._CPP_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  // build CISC_spilling oracle and MachNode::cisc_spill() methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  AD.build_cisc_spill_instructions(AD._HPP_file._fp, AD._CPP_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // define methods for machine dependent State, MachOper, and MachNode classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  AD.defineClasses(AD._CPP_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  AD.buildMachOperGenerator(AD._CPP_GEN_file._fp);// .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  AD.buildMachNodeGenerator(AD._CPP_GEN_file._fp);// .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // define methods for machine dependent instruction matching
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  AD.buildInstructMatchCheck(AD._CPP_file._fp);  // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  // define methods for machine dependent frame management
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  AD.buildFrameMethods(AD._CPP_file._fp);         // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  // do this last:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  AD.addPreprocessorChecks(AD._CPP_file._fp);     // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  AD.addPreprocessorChecks(AD._CPP_CLONE_file._fp);     // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  AD.addPreprocessorChecks(AD._CPP_EXPAND_file._fp);    // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  AD.addPreprocessorChecks(AD._CPP_FORMAT_file._fp);    // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  AD.addPreprocessorChecks(AD._CPP_GEN_file._fp);       // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  AD.addPreprocessorChecks(AD._CPP_MISC_file._fp);      // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  AD.addPreprocessorChecks(AD._CPP_PEEPHOLE_file._fp);  // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  AD.addPreprocessorChecks(AD._CPP_PIPELINE_file._fp);  // .cpp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // define the finite automata that selects lowest cost production
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  AD.buildDFA(AD._DFA_file._fp);
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   318
  // Add include guards for all .hpp files
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   319
  AD.addIncludeGuardEnd(AD._HPP_file, "GENERATED_ADFILES_AD_HPP");        // .hpp
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   320
  AD.addIncludeGuardEnd(AD._VM_file, "GENERATED_ADFILES_ADGLOBALS_HPP");  // .hpp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  AD.close_files(0);               // Close all input/output files
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // Final printout and statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // cout << program;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  if( AD._dfa_debug & 2 ) {    // For higher debug settings, print timing info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    //    Timer t_stop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    //    Timer t_total = t_stop - t_start; // Total running time
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    //    cerr << "\n---Architecture Description Totals---\n";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    //    cerr << ", Total lines: " << TotalLines;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    //    float l = TotalLines;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    //    cerr << "\nTotal Compilation Time: " << t_total << "\n";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    //    float ft = (float)t_total;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    //    if( ft > 0.0 ) fprintf(stderr,"Lines/sec: %#5.2f\n", l/ft);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  return (AD._syntax_errs + AD._semantic_errs + AD._internal_errs); // Bye Bye!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
//------------------------------usage------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
static void usage(ArchDesc& AD)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  printf("Architecture Description Language Compiler\n\n");
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   344
  printf("Usage: adlc [-doqwTs] [-#]* [-D<FLAG>[=<DEF>]] [-U<FLAG>] [-c<CPP_FILE_NAME>] [-h<HPP_FILE_NAME>] [-a<DFA_FILE_NAME>] [-v<GLOBALS_FILE_NAME>] <ADL_FILE_NAME>\n");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  printf(" d  produce DFA debugging info\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  printf(" o  no output produced, syntax and semantic checking only\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  printf(" q  quiet mode, supresses all non-essential messages\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  printf(" w  suppress warning messages\n");
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   349
  printf(" T  make DFA as many subroutine calls\n");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   350
  printf(" s  output which instructions are cisc-spillable\n");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   351
  printf(" D  define preprocessor symbol\n");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   352
  printf(" U  undefine preprocessor symbol\n");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  printf(" c  specify CPP file name (default: %s)\n", AD._CPP_file._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  printf(" h  specify HPP file name (default: %s)\n", AD._HPP_file._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  printf(" a  specify DFA output file name\n");
13971
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   356
  printf(" v  specify adGlobals output file name\n");
3c568f3dacca 8000592: Improve adlc usability
kvn
parents: 13728
diff changeset
   357
  printf(" #  increment ADL debug level\n");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  printf("\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
//------------------------------open_file------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
int ArchDesc::open_file(bool required, ADLFILE & ADF, const char *action)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  if (required &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
      (ADF._fp = fopen(ADF._name, action)) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
    printf("ERROR: Cannot open file for %s: %s\n", action, ADF._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
    close_files(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  return 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
//------------------------------open_files-------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
int ArchDesc::open_files(void)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  if (_ADL_file._name == NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  { printf("ERROR: No ADL input file specified\n"); return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  if (!open_file(true       , _ADL_file, "r"))          { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  if (!open_file(!_no_output, _DFA_file, "w"))          { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  if (!open_file(!_no_output, _HPP_file, "w"))          { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  if (!open_file(!_no_output, _CPP_file, "w"))          { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  if (!open_file(!_no_output, _CPP_CLONE_file, "w"))    { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  if (!open_file(!_no_output, _CPP_EXPAND_file, "w"))   { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  if (!open_file(!_no_output, _CPP_FORMAT_file, "w"))   { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  if (!open_file(!_no_output, _CPP_GEN_file, "w"))      { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  if (!open_file(!_no_output, _CPP_MISC_file, "w"))     { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  if (!open_file(!_no_output, _CPP_PEEPHOLE_file, "w")) { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  if (!open_file(!_no_output, _CPP_PIPELINE_file, "w")) { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  if (!open_file(!_no_output, _VM_file , "w"))          { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  if (!open_file(_dfa_debug != 0, _bug_file, "w"))    { return 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  return 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
//------------------------------close_file------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
void ArchDesc::close_file(int delete_out, ADLFILE& ADF)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  if (ADF._fp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    fclose(ADF._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    if (delete_out) remove(ADF._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
//------------------------------close_files------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
void ArchDesc::close_files(int delete_out)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  if (_ADL_file._fp) fclose(_ADL_file._fp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  close_file(delete_out, _CPP_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  close_file(delete_out, _CPP_CLONE_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  close_file(delete_out, _CPP_EXPAND_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  close_file(delete_out, _CPP_FORMAT_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  close_file(delete_out, _CPP_GEN_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  close_file(delete_out, _CPP_MISC_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  close_file(delete_out, _CPP_PEEPHOLE_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  close_file(delete_out, _CPP_PIPELINE_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  close_file(delete_out, _HPP_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  close_file(delete_out, _DFA_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  close_file(delete_out, _bug_file);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  if (!_quiet_mode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    printf("\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
    if (_no_output || delete_out) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
      if (_ADL_file._name) printf("%s: ", _ADL_file._name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
      printf("No output produced");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
      if (_ADL_file._name) printf("%s --> ", _ADL_file._name);
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1
diff changeset
   430
      printf("%s, %s, %s, %s, %s, %s, %s, %s, %s, %s",
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
             _CPP_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
             _CPP_CLONE_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
             _CPP_EXPAND_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
             _CPP_FORMAT_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
             _CPP_GEN_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
             _CPP_MISC_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
             _CPP_PEEPHOLE_file._name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
             _CPP_PIPELINE_file._name,
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1
diff changeset
   439
             _HPP_file._name,
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1
diff changeset
   440
             _DFA_file._name);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    printf("\n");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
//------------------------------strip_ext--------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
static char *strip_ext(char *fname)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  char *ep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  if (fname) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    ep = fname + strlen(fname) - 1; // start at last character and look for '.'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    while (ep >= fname && *ep != '.') --ep;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    if (*ep == '.')     *ep = '\0'; // truncate string at '.'
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  return fname;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
//------------------------------base_plus_suffix-------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
// New concatenated string
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
static char *base_plus_suffix(const char* base, const char *suffix)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  int len = (int)strlen(base) + (int)strlen(suffix) + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  char* fname = new char[len];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  sprintf(fname,"%s%s",base,suffix);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  return fname;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
//------------------------------get_legal_text---------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
// Get pointer to legal text at the beginning of AD file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
// This code assumes that a legal text starts at the beginning of .ad files,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
// is commented by "//" at each line and ends with empty line.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
int get_legal_text(FileBuff &fbuf, char **legal_text)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
{
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  char* legal_start = fbuf.get_line();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
  assert(legal_start[0] == '/' && legal_start[1] == '/', "Incorrect header of AD file");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  char* legal_end = fbuf.get_line();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  assert(strncmp(legal_end, "// Copyright", 12) == 0, "Incorrect header of AD file");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  while(legal_end[0] == '/' && legal_end[1] == '/') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    legal_end = fbuf.get_line();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  *legal_text = legal_start;
2129
e810a33b5c67 6778669: Patch from Red Hat -- fixes compilation errors
twisti
parents: 1
diff changeset
   485
  return (int) (legal_end - legal_start);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
// VS2005 has its own definition, identical to this one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
#if !defined(_WIN32) || defined(_WIN64) || _MSC_VER < 1400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
void *operator new( size_t size, int, const char *, int ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  return ::operator new( size );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
#endif