8006016: Memory leak at hotspot/src/share/vm/adlc/output_c.cpp

Fri, 05 Apr 2013 11:09:43 +0200

author
neliasso
date
Fri, 05 Apr 2013 11:09:43 +0200
changeset 4906
705ef39fcaa9
parent 4884
dcdeb150988c
child 4907
f67065f02409

8006016: Memory leak at hotspot/src/share/vm/adlc/output_c.cpp
Reviewed-by: kvn, roland
Contributed-by: niclas.adlertz@oracle.com

src/share/vm/adlc/output_c.cpp file | annotate | diff | comparison | revisions
src/share/vm/adlc/output_h.cpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/adlc/output_c.cpp	Thu Apr 04 21:15:43 2013 -0700
     1.2 +++ b/src/share/vm/adlc/output_c.cpp	Fri Apr 05 11:09:43 2013 +0200
     1.3 @@ -63,11 +63,10 @@
     1.4      RegDef *reg_def = NULL;
     1.5      RegDef *next = NULL;
     1.6      registers->reset_RegDefs();
     1.7 -    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
     1.8 +    for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
     1.9        next = registers->iter_RegDefs();
    1.10        const char *comma = (next != NULL) ? "," : " // no trailing comma";
    1.11 -      fprintf(fp,"  \"%s\"%s\n",
    1.12 -                 reg_def->_regname, comma );
    1.13 +      fprintf(fp,"  \"%s\"%s\n", reg_def->_regname, comma);
    1.14      }
    1.15  
    1.16      // Finish defining enumeration
    1.17 @@ -79,10 +78,10 @@
    1.18      reg_def = NULL;
    1.19      next = NULL;
    1.20      registers->reset_RegDefs();
    1.21 -    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
    1.22 +    for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
    1.23        next = registers->iter_RegDefs();
    1.24        const char *comma = (next != NULL) ? "," : " // no trailing comma";
    1.25 -      fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma );
    1.26 +      fprintf(fp,"\t%s%s\n", reg_def->_concrete, comma);
    1.27      }
    1.28      // Finish defining array
    1.29      fprintf(fp,"\t};\n");
    1.30 @@ -104,19 +103,17 @@
    1.31      RegDef *reg_def = NULL;
    1.32      RegDef *next    = NULL;
    1.33      registers->reset_RegDefs();
    1.34 -    for( reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next ) {
    1.35 +    for (reg_def = registers->iter_RegDefs(); reg_def != NULL; reg_def = next) {
    1.36        next = registers->iter_RegDefs();
    1.37        const char* register_encode = reg_def->register_encode();
    1.38        const char *comma = (next != NULL) ? "," : " // no trailing comma";
    1.39        int encval;
    1.40        if (!ADLParser::is_int_token(register_encode, encval)) {
    1.41 -        fprintf(fp,"  %s%s  // %s\n",
    1.42 -                register_encode, comma, reg_def->_regname );
    1.43 +        fprintf(fp,"  %s%s  // %s\n", register_encode, comma, reg_def->_regname);
    1.44        } else {
    1.45          // Output known constants in hex char format (backward compatibility).
    1.46          assert(encval < 256, "Exceeded supported width for register encoding");
    1.47 -        fprintf(fp,"  (unsigned char)'\\x%X'%s  // %s\n",
    1.48 -                encval,          comma, reg_def->_regname );
    1.49 +        fprintf(fp,"  (unsigned char)'\\x%X'%s  // %s\n", encval, comma, reg_def->_regname);
    1.50        }
    1.51      }
    1.52      // Finish defining enumeration
    1.53 @@ -133,9 +130,10 @@
    1.54      fprintf(fp,"// Enumeration of register class names\n");
    1.55      fprintf(fp, "enum machRegisterClass {\n");
    1.56      registers->_rclasses.reset();
    1.57 -    for( const char *class_name = NULL;
    1.58 -         (class_name = registers->_rclasses.iter()) != NULL; ) {
    1.59 -      fprintf(fp,"  %s,\n", toUpper( class_name ));
    1.60 +    for (const char *class_name = NULL; (class_name = registers->_rclasses.iter()) != NULL;) {
    1.61 +      const char * class_name_to_upper = toUpper(class_name);
    1.62 +      fprintf(fp,"  %s,\n", class_name_to_upper);
    1.63 +      delete[] class_name_to_upper;
    1.64      }
    1.65      // Finish defining enumeration
    1.66      fprintf(fp, "  _last_Mach_Reg_Class\n");
    1.67 @@ -148,7 +146,7 @@
    1.68  void ArchDesc::declare_register_masks(FILE *fp_hpp) {
    1.69    const char  *rc_name;
    1.70  
    1.71 -  if( _register ) {
    1.72 +  if (_register) {
    1.73      // Build enumeration of user-defined register classes.
    1.74      defineRegClassEnum(fp_hpp, _register);
    1.75  
    1.76 @@ -156,24 +154,27 @@
    1.77      fprintf(fp_hpp,"\n");
    1.78      fprintf(fp_hpp,"// Register masks, one for each register class.\n");
    1.79      _register->_rclasses.reset();
    1.80 -    for( rc_name = NULL;
    1.81 -         (rc_name = _register->_rclasses.iter()) != NULL; ) {
    1.82 -      const char *prefix    = "";
    1.83 -      RegClass   *reg_class = _register->getRegClass(rc_name);
    1.84 -      assert( reg_class, "Using an undefined register class");
    1.85 +    for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
    1.86 +      const char *prefix = "";
    1.87 +      RegClass *reg_class = _register->getRegClass(rc_name);
    1.88 +      assert(reg_class, "Using an undefined register class");
    1.89 +
    1.90 +      const char* rc_name_to_upper = toUpper(rc_name);
    1.91  
    1.92        if (reg_class->_user_defined == NULL) {
    1.93 -        fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) );
    1.94 -        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ));
    1.95 +        fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix,  rc_name_to_upper);
    1.96 +        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
    1.97        } else {
    1.98 -        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined);
    1.99 +        fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, rc_name_to_upper, reg_class->_user_defined);
   1.100        }
   1.101  
   1.102 -      if( reg_class->_stack_or_reg ) {
   1.103 +      if (reg_class->_stack_or_reg) {
   1.104          assert(reg_class->_user_defined == NULL, "no user defined reg class here");
   1.105 -        fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) );
   1.106 -        fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) );
   1.107 +        fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, rc_name_to_upper);
   1.108 +        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);
   1.109        }
   1.110 +      delete[] rc_name_to_upper;
   1.111 +
   1.112      }
   1.113    }
   1.114  }
   1.115 @@ -183,34 +184,41 @@
   1.116  void ArchDesc::build_register_masks(FILE *fp_cpp) {
   1.117    const char  *rc_name;
   1.118  
   1.119 -  if( _register ) {
   1.120 +  if (_register) {
   1.121      // Generate a list of register masks, one for each class.
   1.122      fprintf(fp_cpp,"\n");
   1.123      fprintf(fp_cpp,"// Register masks, one for each register class.\n");
   1.124      _register->_rclasses.reset();
   1.125 -    for( rc_name = NULL;
   1.126 -         (rc_name = _register->_rclasses.iter()) != NULL; ) {
   1.127 -      const char *prefix    = "";
   1.128 -      RegClass   *reg_class = _register->getRegClass(rc_name);
   1.129 -      assert( reg_class, "Using an undefined register class");
   1.130 -
   1.131 -      if (reg_class->_user_defined != NULL) continue;
   1.132 +    for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
   1.133 +      const char *prefix = "";
   1.134 +      RegClass *reg_class = _register->getRegClass(rc_name);
   1.135 +      assert(reg_class, "Using an undefined register class");
   1.136 +
   1.137 +      if (reg_class->_user_defined != NULL) {
   1.138 +        continue;
   1.139 +      }
   1.140  
   1.141        int len = RegisterForm::RegMask_Size();
   1.142 -      fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) );
   1.143 -      { int i;
   1.144 -        for( i = 0; i < len-1; i++ )
   1.145 -          fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false));
   1.146 -        fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false));
   1.147 +      const char* rc_name_to_upper = toUpper(rc_name);
   1.148 +      fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, rc_name_to_upper);
   1.149 +
   1.150 +      {
   1.151 +        int i;
   1.152 +        for(i = 0; i < len - 1; i++) {
   1.153 +          fprintf(fp_cpp," 0x%x,", reg_class->regs_in_word(i, false));
   1.154 +        }
   1.155 +        fprintf(fp_cpp," 0x%x );\n", reg_class->regs_in_word(i, false));
   1.156        }
   1.157  
   1.158 -      if( reg_class->_stack_or_reg ) {
   1.159 +      if (reg_class->_stack_or_reg) {
   1.160          int i;
   1.161 -        fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) );
   1.162 -        for( i = 0; i < len-1; i++ )
   1.163 -          fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true));
   1.164 -        fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true));
   1.165 +        fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, rc_name_to_upper);
   1.166 +        for(i = 0; i < len - 1; i++) {
   1.167 +          fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i, true));
   1.168 +        }
   1.169 +        fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i, true));
   1.170        }
   1.171 +      delete[] rc_name_to_upper;
   1.172      }
   1.173    }
   1.174  }
   1.175 @@ -2676,7 +2684,9 @@
   1.176        if (strcmp(first_reg_class, "stack_slots") == 0) {
   1.177          fprintf(fp,"  return &(Compile::current()->FIRST_STACK_mask());\n");
   1.178        } else {
   1.179 -        fprintf(fp,"  return &%s_mask();\n", toUpper(first_reg_class));
   1.180 +        const char* first_reg_class_to_upper = toUpper(first_reg_class);
   1.181 +        fprintf(fp,"  return &%s_mask();\n", first_reg_class_to_upper);
   1.182 +        delete[] first_reg_class_to_upper;
   1.183        }
   1.184      } else {
   1.185        // Build a switch statement to return the desired mask.
   1.186 @@ -2688,7 +2698,9 @@
   1.187          if( !strcmp(reg_class, "stack_slots") ) {
   1.188            fprintf(fp, "  case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index);
   1.189          } else {
   1.190 -          fprintf(fp, "  case %d: return &%s_mask();\n", index, toUpper(reg_class));
   1.191 +          const char* reg_class_to_upper = toUpper(reg_class);
   1.192 +          fprintf(fp, "  case %d: return &%s_mask();\n", index, reg_class_to_upper);
   1.193 +          delete[] reg_class_to_upper;
   1.194          }
   1.195        }
   1.196        fprintf(fp,"  }\n");
     2.1 --- a/src/share/vm/adlc/output_h.cpp	Thu Apr 04 21:15:43 2013 -0700
     2.2 +++ b/src/share/vm/adlc/output_h.cpp	Fri Apr 05 11:09:43 2013 +0200
     2.3 @@ -2069,9 +2069,21 @@
     2.4    void closing()     { fprintf(_cpp, "  _LAST_MACH_OPER\n");
     2.5                         OutputMap::closing();
     2.6    }
     2.7 -  void map(OpClassForm &opc)  { fprintf(_cpp, "  %s", _AD.machOperEnum(opc._ident) ); }
     2.8 -  void map(OperandForm &oper) { fprintf(_cpp, "  %s", _AD.machOperEnum(oper._ident) ); }
     2.9 -  void map(char        *name) { fprintf(_cpp, "  %s", _AD.machOperEnum(name)); }
    2.10 +  void map(OpClassForm &opc)  {
    2.11 +    const char* opc_ident_to_upper = _AD.machOperEnum(opc._ident);
    2.12 +    fprintf(_cpp, "  %s", opc_ident_to_upper);
    2.13 +    delete[] opc_ident_to_upper;
    2.14 +  }
    2.15 +  void map(OperandForm &oper) {
    2.16 +    const char* oper_ident_to_upper = _AD.machOperEnum(oper._ident);
    2.17 +    fprintf(_cpp, "  %s", oper_ident_to_upper);
    2.18 +    delete[] oper_ident_to_upper;
    2.19 +  }
    2.20 +  void map(char *name) {
    2.21 +    const char* name_to_upper = _AD.machOperEnum(name);
    2.22 +    fprintf(_cpp, "  %s", name_to_upper);
    2.23 +    delete[] name_to_upper;
    2.24 +  }
    2.25  
    2.26    bool do_instructions()      { return false; }
    2.27    void map(InstructForm &inst){ assert( false, "ShouldNotCallThis()"); }

mercurial