comparison src/share/vm/adlc/output_c.cpp @ 9078:705ef39fcaa9

8006016: Memory leak at hotspot/src/share/vm/adlc/output_c.cpp Reviewed-by: kvn, roland Contributed-by: niclas.adlertz@oracle.com
author neliasso
date Fri, 05 Apr 2013 11:09:43 +0200
parents d336b3173277
children f15fe46d8c00
comparison
equal deleted inserted replaced
9055:dcdeb150988c 9078:705ef39fcaa9
61 61
62 // Output the register name for each register in the allocation classes 62 // Output the register name for each register in the allocation classes
63 RegDef *reg_def = NULL; 63 RegDef *reg_def = NULL;
64 RegDef *next = NULL; 64 RegDef *next = NULL;
65 registers->reset_RegDefs(); 65 registers->reset_RegDefs();
66 for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) { 66 for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
67 next = registers->iter_RegDefs(); 67 next = registers->iter_RegDefs();
68 const char *comma = (next != NULL) ? "," : " // no trailing comma"; 68 const char *comma = (next != NULL) ? "," : " // no trailing comma";
69 fprintf(fp," \"%s\"%s\n", 69 fprintf(fp," \"%s\"%s\n", reg_def->_regname, comma);
70 reg_def->_regname, comma );
71 } 70 }
72 71
73 // Finish defining enumeration 72 // Finish defining enumeration
74 fprintf(fp,"};\n"); 73 fprintf(fp,"};\n");
75 74
77 fprintf(fp,"// An array of character pointers to machine register names.\n"); 76 fprintf(fp,"// An array of character pointers to machine register names.\n");
78 fprintf(fp,"const VMReg OptoReg::opto2vm[REG_COUNT] = {\n"); 77 fprintf(fp,"const VMReg OptoReg::opto2vm[REG_COUNT] = {\n");
79 reg_def = NULL; 78 reg_def = NULL;
80 next = NULL; 79 next = NULL;
81 registers->reset_RegDefs(); 80 registers->reset_RegDefs();
82 for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) { 81 for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
83 next = registers->iter_RegDefs(); 82 next = registers->iter_RegDefs();
84 const char *comma = (next != NULL) ? "," : " // no trailing comma"; 83 const char *comma = (next != NULL) ? "," : " // no trailing comma";
85 fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma ); 84 fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma);
86 } 85 }
87 // Finish defining array 86 // Finish defining array
88 fprintf(fp,"\t};\n"); 87 fprintf(fp,"\t};\n");
89 fprintf(fp,"\n"); 88 fprintf(fp,"\n");
90 89
102 101
103 // Output the register encoding for each register in the allocation classes 102 // Output the register encoding for each register in the allocation classes
104 RegDef *reg_def = NULL; 103 RegDef *reg_def = NULL;
105 RegDef *next = NULL; 104 RegDef *next = NULL;
106 registers->reset_RegDefs(); 105 registers->reset_RegDefs();
107 for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) { 106 for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
108 next = registers->iter_RegDefs(); 107 next = registers->iter_RegDefs();
109 const char* register_encode = reg_def->register_encode(); 108 const char* register_encode = reg_def->register_encode();
110 const char *comma = (next != NULL) ? "," : " // no trailing comma"; 109 const char *comma = (next != NULL) ? "," : " // no trailing comma";
111 int encval; 110 int encval;
112 if (!ADLParser::is_int_token(register_encode, encval)) { 111 if (!ADLParser::is_int_token(register_encode, encval)) {
113 fprintf(fp," %s%s // %s\n", 112 fprintf(fp," %s%s // %s\n", register_encode, comma, reg_def->_regname);
114 register_encode, comma, reg_def->_regname );
115 } else { 113 } else {
116 // Output known constants in hex char format (backward compatibility). 114 // Output known constants in hex char format (backward compatibility).
117 assert(encval < 256, "Exceeded supported width for register encoding"); 115 assert(encval < 256, "Exceeded supported width for register encoding");
118 fprintf(fp," (unsigned char)'\\x%X'%s // %s\n", 116 fprintf(fp," (unsigned char)'\\x%X'%s // %s\n", encval, comma, reg_def->_regname);
119 encval, comma, reg_def->_regname );
120 } 117 }
121 } 118 }
122 // Finish defining enumeration 119 // Finish defining enumeration
123 fprintf(fp,"};\n"); 120 fprintf(fp,"};\n");
124 121
131 // Output an enumeration of register class names 128 // Output an enumeration of register class names
132 fprintf(fp,"\n"); 129 fprintf(fp,"\n");
133 fprintf(fp,"// Enumeration of register class names\n"); 130 fprintf(fp,"// Enumeration of register class names\n");
134 fprintf(fp, "enum machRegisterClass {\n"); 131 fprintf(fp, "enum machRegisterClass {\n");
135 registers->_rclasses.reset(); 132 registers->_rclasses.reset();
136 for( const char *class_name = NULL; 133 for (const char *class_name = NULL; (class_name = registers->_rclasses.iter()) != NULL;) {
137 (class_name = registers->_rclasses.iter()) != NULL; ) { 134 const char * class_name_to_upper = toUpper(class_name);
138 fprintf(fp," %s,\n", toUpper( class_name )); 135 fprintf(fp," %s,\n", class_name_to_upper);
136 delete[] class_name_to_upper;
139 } 137 }
140 // Finish defining enumeration 138 // Finish defining enumeration
141 fprintf(fp, " _last_Mach_Reg_Class\n"); 139 fprintf(fp, " _last_Mach_Reg_Class\n");
142 fprintf(fp, "};\n"); 140 fprintf(fp, "};\n");
143 } 141 }
146 // Declare an enumeration of user-defined register classes 144 // Declare an enumeration of user-defined register classes
147 // and a list of register masks, one for each class. 145 // and a list of register masks, one for each class.
148 void ArchDesc::declare_register_masks(FILE *fp_hpp) { 146 void ArchDesc::declare_register_masks(FILE *fp_hpp) {
149 const char *rc_name; 147 const char *rc_name;
150 148
151 if( _register ) { 149 if (_register) {
152 // Build enumeration of user-defined register classes. 150 // Build enumeration of user-defined register classes.
153 defineRegClassEnum(fp_hpp, _register); 151 defineRegClassEnum(fp_hpp, _register);
154 152
155 // Generate a list of register masks, one for each class. 153 // Generate a list of register masks, one for each class.
156 fprintf(fp_hpp,"\n"); 154 fprintf(fp_hpp,"\n");
157 fprintf(fp_hpp,"// Register masks, one for each register class.\n"); 155 fprintf(fp_hpp,"// Register masks, one for each register class.\n");
158 _register->_rclasses.reset(); 156 _register->_rclasses.reset();
159 for( rc_name = NULL; 157 for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
160 (rc_name = _register->_rclasses.iter()) != NULL; ) { 158 const char *prefix = "";
161 const char *prefix = ""; 159 RegClass *reg_class = _register->getRegClass(rc_name);
162 RegClass *reg_class = _register->getRegClass(rc_name); 160 assert(reg_class, "Using an undefined register class");
163 assert( reg_class, "Using an undefined register class"); 161
162 const char* rc_name_to_upper = toUpper(rc_name);
164 163
165 if (reg_class->_user_defined == NULL) { 164 if (reg_class->_user_defined == NULL) {
166 fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) ); 165 fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, rc_name_to_upper);
167 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name )); 166 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
168 } else { 167 } else {
169 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined); 168 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, rc_name_to_upper, reg_class->_user_defined);
170 } 169 }
171 170
172 if( reg_class->_stack_or_reg ) { 171 if (reg_class->_stack_or_reg) {
173 assert(reg_class->_user_defined == NULL, "no user defined reg class here"); 172 assert(reg_class->_user_defined == NULL, "no user defined reg class here");
174 fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) ); 173 fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, rc_name_to_upper);
175 fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) ); 174 fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
176 } 175 }
176 delete[] rc_name_to_upper;
177
177 } 178 }
178 } 179 }
179 } 180 }
180 181
181 // Generate an enumeration of user-defined register classes 182 // Generate an enumeration of user-defined register classes
182 // and a list of register masks, one for each class. 183 // and a list of register masks, one for each class.
183 void ArchDesc::build_register_masks(FILE *fp_cpp) { 184 void ArchDesc::build_register_masks(FILE *fp_cpp) {
184 const char *rc_name; 185 const char *rc_name;
185 186
186 if( _register ) { 187 if (_register) {
187 // Generate a list of register masks, one for each class. 188 // Generate a list of register masks, one for each class.
188 fprintf(fp_cpp,"\n"); 189 fprintf(fp_cpp,"\n");
189 fprintf(fp_cpp,"// Register masks, one for each register class.\n"); 190 fprintf(fp_cpp,"// Register masks, one for each register class.\n");
190 _register->_rclasses.reset(); 191 _register->_rclasses.reset();
191 for( rc_name = NULL; 192 for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
192 (rc_name = _register->_rclasses.iter()) != NULL; ) { 193 const char *prefix = "";
193 const char *prefix = ""; 194 RegClass *reg_class = _register->getRegClass(rc_name);
194 RegClass *reg_class = _register->getRegClass(rc_name); 195 assert(reg_class, "Using an undefined register class");
195 assert( reg_class, "Using an undefined register class"); 196
196 197 if (reg_class->_user_defined != NULL) {
197 if (reg_class->_user_defined != NULL) continue; 198 continue;
199 }
198 200
199 int len = RegisterForm::RegMask_Size(); 201 int len = RegisterForm::RegMask_Size();
200 fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) ); 202 const char* rc_name_to_upper = toUpper(rc_name);
201 { int i; 203 fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, rc_name_to_upper);
202 for( i = 0; i < len-1; i++ ) 204
203 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false)); 205 {
204 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false));
205 }
206
207 if( reg_class->_stack_or_reg ) {
208 int i; 206 int i;
209 fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) ); 207 for(i = 0; i < len - 1; i++) {
210 for( i = 0; i < len-1; i++ ) 208 fprintf(fp_cpp," 0x%x,", reg_class->regs_in_word(i, false));
211 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true)); 209 }
212 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true)); 210 fprintf(fp_cpp," 0x%x );\n", reg_class->regs_in_word(i, false));
213 } 211 }
212
213 if (reg_class->_stack_or_reg) {
214 int i;
215 fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, rc_name_to_upper);
216 for(i = 0; i < len - 1; i++) {
217 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i, true));
218 }
219 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i, true));
220 }
221 delete[] rc_name_to_upper;
214 } 222 }
215 } 223 }
216 } 224 }
217 225
218 // Compute an index for an array in the pipeline_reads_NNN arrays 226 // Compute an index for an array in the pipeline_reads_NNN arrays
2674 if (all_same) { 2682 if (all_same) {
2675 // Return the sole RegMask. 2683 // Return the sole RegMask.
2676 if (strcmp(first_reg_class, "stack_slots") == 0) { 2684 if (strcmp(first_reg_class, "stack_slots") == 0) {
2677 fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); 2685 fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n");
2678 } else { 2686 } else {
2679 fprintf(fp," return &%s_mask();\n", toUpper(first_reg_class)); 2687 const char* first_reg_class_to_upper = toUpper(first_reg_class);
2688 fprintf(fp," return &%s_mask();\n", first_reg_class_to_upper);
2689 delete[] first_reg_class_to_upper;
2680 } 2690 }
2681 } else { 2691 } else {
2682 // Build a switch statement to return the desired mask. 2692 // Build a switch statement to return the desired mask.
2683 fprintf(fp," switch (index) {\n"); 2693 fprintf(fp," switch (index) {\n");
2684 2694
2686 const char *reg_class = oper.in_reg_class(index, globals); 2696 const char *reg_class = oper.in_reg_class(index, globals);
2687 assert(reg_class != NULL, "did not find register mask"); 2697 assert(reg_class != NULL, "did not find register mask");
2688 if( !strcmp(reg_class, "stack_slots") ) { 2698 if( !strcmp(reg_class, "stack_slots") ) {
2689 fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index); 2699 fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index);
2690 } else { 2700 } else {
2691 fprintf(fp, " case %d: return &%s_mask();\n", index, toUpper(reg_class)); 2701 const char* reg_class_to_upper = toUpper(reg_class);
2702 fprintf(fp, " case %d: return &%s_mask();\n", index, reg_class_to_upper);
2703 delete[] reg_class_to_upper;
2692 } 2704 }
2693 } 2705 }
2694 fprintf(fp," }\n"); 2706 fprintf(fp," }\n");
2695 fprintf(fp," ShouldNotReachHere();\n"); 2707 fprintf(fp," ShouldNotReachHere();\n");
2696 fprintf(fp," return NULL;\n"); 2708 fprintf(fp," return NULL;\n");