Mercurial > hg > truffle
diff src/share/vm/c1x/c1x_Compiler.cpp @ 1428:695451afc619
refactoring classes into separate files
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Thu, 19 Aug 2010 14:34:52 -0700 |
parents | 98fffb304868 |
children | abc670a709dc |
line wrap: on
line diff
--- a/src/share/vm/c1x/c1x_Compiler.cpp Wed Aug 18 16:47:06 2010 -0700 +++ b/src/share/vm/c1x/c1x_Compiler.cpp Thu Aug 19 14:34:52 2010 -0700 @@ -40,7 +40,7 @@ check_pending_exception("Could not register natives"); - compute_offsets(); + c1x_compute_offsets(); } // Compilation entry point for methods @@ -48,18 +48,17 @@ initialize(); VM_ENTRY_MARK; - ResourceMark rm; HandleMark hm; - C1XObjects::initializeObjects(); + VmIds::initializeObjects(); CompilerThread::current()->set_compiling(true); methodOop method = (methodOop)target->get_oop(); - VMExits::compileMethod(C1XObjects::add<methodOop>(method), C1XObjects::toString<Handle>(method->name(), THREAD), entry_bci); + VMExits::compileMethod(VmIds::add<methodOop>(method), VmIds::toString<Handle>(method->name(), THREAD), entry_bci); CompilerThread::current()->set_compiling(false); - C1XObjects::cleanupLocalObjects(); + VmIds::cleanupLocalObjects(); } // Print compilation timers and statistics @@ -73,124 +72,20 @@ return VMExits::createRiTypePrimitive((int)type->basic_type(), THREAD); } klassOop klass = (klassOop)type->get_oop(); - return VMExits::createRiType(C1XObjects::add<klassOop>(klass), C1XObjects::toString<Handle>(klass->klass_part()->name(), THREAD), THREAD); + return VMExits::createRiType(VmIds::add<klassOop>(klass), VmIds::toString<Handle>(klass->klass_part()->name(), THREAD), THREAD); } else { symbolOop name = ((ciKlass *)type)->name()->get_symbolOop(); - return VMExits::createRiTypeUnresolved(C1XObjects::toString<Handle>(name, THREAD), C1XObjects::add<klassOop>(accessor), THREAD); + return VMExits::createRiTypeUnresolved(VmIds::toString<Handle>(name, THREAD), VmIds::add<klassOop>(accessor), THREAD); } } oop C1XCompiler::get_RiField(ciField *field, TRAPS) { oop field_holder = get_RiType(field->holder(), NULL, CHECK_0); oop field_type = get_RiType(field->type(), NULL, CHECK_0); - Handle field_name = C1XObjects::toString<Handle>(field->name()->get_symbolOop(), CHECK_0); + Handle field_name = VmIds::toString<Handle>(field->name()->get_symbolOop(), CHECK_0); int offset = field->offset(); // TODO: implement caching return VMExits::createRiField(field_holder, field_name, field_type, offset, THREAD); } -// C1XObjects implementation - -GrowableArray<address>* C1XObjects::_stubs = NULL; -GrowableArray<jobject>* C1XObjects::_localHandles = NULL; - -void C1XObjects::initializeObjects() { - if (_stubs == NULL) { - assert(_localHandles == NULL, "inconsistent state"); - _stubs = new(ResourceObj::C_HEAP) GrowableArray<address>(64, true); - _localHandles = new(ResourceObj::C_HEAP) GrowableArray<jobject>(64, true); - } - assert(_localHandles->length() == 0, "invalid state"); -} - -void C1XObjects::cleanupLocalObjects() { - for (int i=0; i<_localHandles->length(); i++) { - JNIHandles::destroy_global(_localHandles->at(i)); - } - _localHandles->clear(); -} - -jlong C1XObjects::addStub(address stub) { - assert(!_stubs->contains(stub), "duplicate stub"); - return _stubs->append(stub) | STUB; -} - -jlong C1XObjects::add(Handle obj, CompilerObjectType type) { - assert(!obj.is_null(), "cannot add NULL handle"); - int idx = -1; - for (int i=0; i<_localHandles->length(); i++) - if (JNIHandles::resolve_non_null(_localHandles->at(i)) == obj()) { - idx = i; - break; - } - if (idx = -1) { - if (JavaThread::current()->thread_state() == _thread_in_vm) { - idx = _localHandles->append(JNIHandles::make_global(obj)); - } else { - VM_ENTRY_MARK; - idx = _localHandles->append(JNIHandles::make_global(obj)); - } - } - return idx | type; -} - -address C1XObjects::getStub(jlong id) { - assert((id & TYPE_MASK) == STUB, "wrong id type, STUB expected"); - assert((id & ~TYPE_MASK) >= 0 && (id & ~TYPE_MASK) < _stubs->length(), "STUB index out of bounds"); - return _stubs->at(id & ~TYPE_MASK); -} - -oop C1XObjects::getObject(jlong id) { - assert((id & TYPE_MASK) != STUB, "wrong id type"); - assert((id & ~TYPE_MASK) >= 0 && (id & ~TYPE_MASK) < _localHandles->length(), "index out of bounds"); - return JNIHandles::resolve_non_null(_localHandles->at(id & ~TYPE_MASK)); -} - - -static void compute_offset(int &dest_offset, klassOop klass_oop, const char* name, const char* signature, bool static_field) { - symbolOop name_symbol = SymbolTable::probe(name, strlen(name)); - symbolOop signature_symbol = SymbolTable::probe(signature, strlen(signature)); - assert(name_symbol != NULL, "symbol not found - class layout changed?"); - assert(signature_symbol != NULL, "symbol not found - class layout changed?"); - - instanceKlass* ik = instanceKlass::cast(klass_oop); - fieldDescriptor fd; - if (!ik->find_field(name_symbol, signature_symbol, &fd)) { - ResourceMark rm; - tty->print_cr("Invalid layout of %s at %s", ik->external_name(), name_symbol->as_C_string()); - fatal("Invalid layout of preloaded class"); - } - assert(fd.is_static() == static_field, "static/instance mismatch"); - dest_offset = fd.offset(); -} - -// create the compute_class -#define START_CLASS(name) { klassOop k = SystemDictionary::name##_klass(); - -#define END_CLASS } - -#define FIELD(klass, name, signature, static_field) compute_offset(klass::_##name##_offset, k, #name, signature, static_field); -#define CHAR_FIELD(klass, name) FIELD(klass, name, "C", false) -#define INT_FIELD(klass, name) FIELD(klass, name, "I", false) -#define LONG_FIELD(klass, name) FIELD(klass, name, "J", false) -#define OOP_FIELD(klass, name, signature) FIELD(klass, name, signature, false) -#define STATIC_OOP_FIELD(klass, name, signature) FIELD(klass, name, signature, true) - - -void C1XCompiler::compute_offsets() { - COMPILER_CLASSES_DO(START_CLASS, END_CLASS, CHAR_FIELD, INT_FIELD, LONG_FIELD, OOP_FIELD, STATIC_OOP_FIELD) -} - -#define EMPTY0 -#define EMPTY1(x) -#define EMPTY2(x,y) -#define FIELD2(klass, name) int klass::_##name##_offset = 0; -#define FIELD3(klass, name, sig) FIELD2(klass, name) - -COMPILER_CLASSES_DO(EMPTY1, EMPTY0, FIELD2, FIELD2, FIELD2, FIELD3, FIELD3) - - - - -