changeset 1686:252bd67d10c6

2009-02-26 Gary Benson <gbenson@redhat.com> PR icedtea/202: * ports/hotspot/src/share/vm/shark/sharkRuntime.hpp (SharkRuntime::_register_finalizer): New variable. (SharkRuntime::register_finalizer): New method. (SharkRuntime::register_finalizer_C): Likewise. * ports/hotspot/src/share/vm/shark/sharkRuntime.cpp (SharkRuntime::_register_finalizer): New variable. (SharkRuntime::initialize): Initialize the above. (SharkRuntime::register_finalizer_C): New method. * ports/hotspot/src/share/vm/shark/sharkBlock.hpp (SharkBlock::call_register_finalizer): New method. (SharkBlock::do_return): Call the above when compiling java.lang.Object.<init>. * ports/hotspot/src/share/vm/shark/sharkBlock.cpp (SharkBlock::call_register_finalizer): New method.
author Gary Benson <gbenson@redhat.com>
date Thu, 26 Feb 2009 10:24:35 -0500
parents 0e0e3cf10018
children 90de0ba94422
files ChangeLog ports/hotspot/src/share/vm/shark/sharkBlock.cpp ports/hotspot/src/share/vm/shark/sharkBlock.hpp ports/hotspot/src/share/vm/shark/sharkRuntime.cpp ports/hotspot/src/share/vm/shark/sharkRuntime.hpp
diffstat 5 files changed, 93 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Feb 26 08:55:00 2009 -0500
+++ b/ChangeLog	Thu Feb 26 10:24:35 2009 -0500
@@ -1,3 +1,21 @@
+2009-02-26  Gary Benson  <gbenson@redhat.com>
+
+	PR icedtea/202:
+	* ports/hotspot/src/share/vm/shark/sharkRuntime.hpp
+	(SharkRuntime::_register_finalizer): New variable.
+	(SharkRuntime::register_finalizer): New method.
+	(SharkRuntime::register_finalizer_C): Likewise.
+	* ports/hotspot/src/share/vm/shark/sharkRuntime.cpp
+	(SharkRuntime::_register_finalizer): New variable.
+	(SharkRuntime::initialize): Initialize the above.
+	(SharkRuntime::register_finalizer_C): New method.
+	* ports/hotspot/src/share/vm/shark/sharkBlock.hpp
+	(SharkBlock::call_register_finalizer): New method.
+	(SharkBlock::do_return): Call the above when compiling
+	java.lang.Object.<init>.
+	* ports/hotspot/src/share/vm/shark/sharkBlock.cpp
+	(SharkBlock::call_register_finalizer): New method.
+
 2009-02-26  Gary Benson  <gbenson@redhat.com>
 
 	* ports/hotspot/src/share/vm/shark/sharkState.cpp: Updated copyright.
--- a/ports/hotspot/src/share/vm/shark/sharkBlock.cpp	Thu Feb 26 08:55:00 2009 -0500
+++ b/ports/hotspot/src/share/vm/shark/sharkBlock.cpp	Thu Feb 26 10:24:35 2009 -0500
@@ -1160,6 +1160,49 @@
   current_state()->merge(orig_state, orig_block, safepointed_block);
 }
 
+void SharkBlock::call_register_finalizer(Value *receiver)
+{
+  BasicBlock *orig_block = builder()->GetInsertBlock();
+  SharkState *orig_state = current_state()->copy();
+
+  BasicBlock *do_call = function()->CreateBlock("has_finalizer");
+  BasicBlock *done    = function()->CreateBlock("done");
+
+  Value *klass = builder()->CreateValueOfStructEntry(
+    receiver,
+    in_ByteSize(oopDesc::klass_offset_in_bytes()),
+    SharkType::jobject_type(),
+    "klass");
+  
+  Value *klass_part = builder()->CreateAddressOfStructEntry(
+    klass,
+    in_ByteSize(klassOopDesc::klass_part_offset_in_bytes()),
+    SharkType::klass_type(),
+    "klass_part");
+
+  Value *access_flags = builder()->CreateValueOfStructEntry(
+    klass_part,
+    in_ByteSize(Klass::access_flags_offset_in_bytes()),
+    SharkType::jint_type(),
+    "access_flags");
+
+  builder()->CreateCondBr(
+    builder()->CreateICmpNE(
+      builder()->CreateAnd(
+        access_flags,
+        LLVMValue::jint_constant(JVM_ACC_HAS_FINALIZER)),
+      LLVMValue::intptr_constant(0)),
+    do_call, done);
+
+  builder()->SetInsertPoint(do_call);
+  call_vm(SharkRuntime::register_finalizer(), receiver);
+  BasicBlock *branch_block = builder()->GetInsertBlock();  
+  builder()->CreateBr(done);
+
+  builder()->SetInsertPoint(done);
+  current_state()->merge(orig_state, orig_block, branch_block);
+}
+
 void SharkBlock::handle_return(BasicType type, Value* exception)
 {
   assert (exception == NULL || type == T_VOID, "exception OR result, please");
--- a/ports/hotspot/src/share/vm/shark/sharkBlock.hpp	Thu Feb 26 08:55:00 2009 -0500
+++ b/ports/hotspot/src/share/vm/shark/sharkBlock.hpp	Thu Feb 26 10:24:35 2009 -0500
@@ -1,6 +1,6 @@
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2008 Red Hat, Inc.
+ * Copyright 2008, 2009 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -403,6 +403,7 @@
 
   // Returns
  private:
+  void call_register_finalizer(llvm::Value* receiver);
   void handle_return(BasicType type, llvm::Value* exception);
   void release_locked_monitors();
 
@@ -468,7 +469,10 @@
  private:
   void do_return(BasicType type)
   {
-    add_safepoint();
+    if (target()->intrinsic_id() == vmIntrinsics::_Object_init)
+      call_register_finalizer(local(0)->jobject_value());
+    else
+      add_safepoint();
     handle_return(type, NULL);
   }
   void do_athrow()
--- a/ports/hotspot/src/share/vm/shark/sharkRuntime.cpp	Thu Feb 26 08:55:00 2009 -0500
+++ b/ports/hotspot/src/share/vm/shark/sharkRuntime.cpp	Thu Feb 26 10:24:35 2009 -0500
@@ -35,6 +35,7 @@
 Constant* SharkRuntime::_newarray;
 Constant* SharkRuntime::_anewarray;
 Constant* SharkRuntime::_multianewarray;
+Constant* SharkRuntime::_register_finalizer;
 Constant* SharkRuntime::_resolve_get_put;
 Constant* SharkRuntime::_resolve_invoke;
 Constant* SharkRuntime::_resolve_klass;
@@ -115,6 +116,14 @@
 
   params.clear();
   params.push_back(SharkType::thread_type());
+  params.push_back(SharkType::oop_type());
+  _register_finalizer = builder->make_function(
+    (intptr_t) register_finalizer_C,
+    FunctionType::get(Type::VoidTy, params, false),
+    "SharkRuntime__register_finalizer");
+
+  params.clear();
+  params.push_back(SharkType::thread_type());
   params.push_back(SharkType::cpCacheEntry_type());
   params.push_back(SharkType::jint_type());
   params.push_back(SharkType::jint_type());
@@ -342,6 +351,15 @@
 }
 JRT_END
 
+JRT_ENTRY(void, SharkRuntime::register_finalizer_C(JavaThread* thread,
+                                                   oop         object))
+{
+  assert(object->is_oop(), "should be");
+  assert(object->klass()->klass_part()->has_finalizer(), "should have");
+  instanceKlass::register_finalizer(instanceOop(object), CHECK);
+}
+JRT_END
+
 JRT_ENTRY(void, SharkRuntime::resolve_get_put_C(JavaThread*             thread,
                                                 ConstantPoolCacheEntry* entry,
                                                 int                     bci,
--- a/ports/hotspot/src/share/vm/shark/sharkRuntime.hpp	Thu Feb 26 08:55:00 2009 -0500
+++ b/ports/hotspot/src/share/vm/shark/sharkRuntime.hpp	Thu Feb 26 10:24:35 2009 -0500
@@ -1,6 +1,6 @@
 /*
  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2008 Red Hat, Inc.
+ * Copyright 2008, 2009 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -36,6 +36,7 @@
   static llvm::Constant* _newarray;
   static llvm::Constant* _anewarray;
   static llvm::Constant* _multianewarray;
+  static llvm::Constant* _register_finalizer;
   static llvm::Constant* _resolve_get_put;
   static llvm::Constant* _resolve_invoke;
   static llvm::Constant* _resolve_klass;
@@ -73,6 +74,10 @@
   {
     return _multianewarray;
   }
+  static llvm::Constant* register_finalizer()
+  {
+    return _register_finalizer;
+  }
   static llvm::Constant* resolve_get_put()
   {
     return _resolve_get_put;
@@ -118,6 +123,8 @@
                                int         ndims,
                                int*        dims);
 
+  static void register_finalizer_C(JavaThread* thread, oop object);
+
   static void resolve_get_put_C(JavaThread*             thread,
                                 ConstantPoolCacheEntry* entry,
                                 int                     bci,