Mercurial > hg > truffle
diff src/share/vm/opto/compile.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | 5af51c882207 |
children | 137868b7aa6f |
line wrap: on
line diff
--- a/src/share/vm/opto/compile.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/opto/compile.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -925,17 +925,6 @@ } } -#ifndef PRODUCT -void print_opto_verbose_signature( const TypeFunc *j_sig, const char *stub_name ) { - if(PrintOpto && Verbose) { - tty->print("%s ", stub_name); j_sig->print_flattened(); tty->cr(); - } -} -#endif - -void Compile::print_codes() { -} - //------------------------------Init------------------------------------------- // Prepare for a single compilation void Compile::Init(int aliaslevel) { @@ -963,7 +952,7 @@ set_recent_alloc(NULL, NULL); // Create Debug Information Recorder to record scopes, oopmaps, etc. - env()->set_oop_recorder(new OopRecorder(comp_arena())); + env()->set_oop_recorder(new OopRecorder(env()->arena())); env()->set_debug_info(new DebugInformationRecorder(env()->oop_recorder())); env()->set_dependencies(new Dependencies(env())); @@ -1182,7 +1171,7 @@ // space to include all of the array body. Only the header, klass // and array length can be accessed un-aliased. if( offset != Type::OffsetBot ) { - if( ta->const_oop() ) { // methodDataOop or methodOop + if( ta->const_oop() ) { // MethodData* or Method* offset = Type::OffsetBot; // Flatten constant access into array body tj = ta = TypeAryPtr::make(ptr,ta->const_oop(),ta->ary(),ta->klass(),false,offset); } else if( offset == arrayOopDesc::length_offset_in_bytes() ) { @@ -3026,12 +3015,13 @@ if (can_be_reused() != other.can_be_reused()) return false; // For floating point values we compare the bit pattern. switch (type()) { - case T_FLOAT: return (_value.i == other._value.i); + case T_FLOAT: return (_v._value.i == other._v._value.i); case T_LONG: - case T_DOUBLE: return (_value.j == other._value.j); + case T_DOUBLE: return (_v._value.j == other._v._value.j); case T_OBJECT: - case T_ADDRESS: return (_value.l == other._value.l); - case T_VOID: return (_value.l == other._value.l); // jump-table entries + case T_METADATA: return (_v._metadata == other._v._metadata); + case T_ADDRESS: return (_v._value.l == other._v._value.l); + case T_VOID: return (_v._value.l == other._v._value.l); // jump-table entries default: ShouldNotReachHere(); } return false; @@ -3042,6 +3032,7 @@ case T_LONG: return sizeof(jlong ); case T_FLOAT: return sizeof(jfloat ); case T_DOUBLE: return sizeof(jdouble); + case T_METADATA: return sizeof(Metadata*); // We use T_VOID as marker for jump-table entries (labels) which // need an internal word relocation. case T_VOID: @@ -3135,6 +3126,12 @@ } break; } + case T_METADATA: { + Metadata* obj = con.get_metadata(); + int metadata_index = _masm.oop_recorder()->find_index(obj); + constant_addr = _masm.address_constant((address) obj, metadata_Relocation::spec(metadata_index)); + break; + } default: ShouldNotReachHere(); } assert(constant_addr, "consts section too small"); @@ -3168,6 +3165,12 @@ return con; } +Compile::Constant Compile::ConstantTable::add(Metadata* metadata) { + Constant con(metadata); + add(con); + return con; +} + Compile::Constant Compile::ConstantTable::add(MachConstantNode* n, MachOper* oper) { jvalue value; BasicType type = oper->type()->basic_type(); @@ -3177,7 +3180,8 @@ case T_DOUBLE: value.d = oper->constantD(); break; case T_OBJECT: case T_ADDRESS: value.l = (jobject) oper->constant(); break; - default: ShouldNotReachHere(); + case T_METADATA: return add((Metadata*)oper->constant()); break; + default: guarantee(false, err_msg_res("unhandled type: %s", type2name(type))); } return add(n, type, value); }