annotate src/share/vm/adlc/main.cpp @ 1721:413ad0331a0c

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