changeset 1541:62259ae1ff0e

More
author Gary Benson <gbenson@redhat.com>
date Thu, 20 May 2010 08:45:55 +0100
parents fc13f4012949
children b94634952902
files src/share/vm/shark/sharkTopLevelBlock.cpp src/share/vm/shark/sharkTopLevelBlock.hpp
diffstat 2 files changed, 22 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/shark/sharkTopLevelBlock.cpp	Thu May 20 08:36:44 2010 +0100
+++ b/src/share/vm/shark/sharkTopLevelBlock.cpp	Thu May 20 08:45:55 2010 +0100
@@ -532,9 +532,11 @@
           successor->add_incoming(current_state());
         }
         else {
-          
-          tty->print_cr("handler_bci = %d", exc_handler(i)->handler_bci());
-          Unimplemented();
+          handler = make_trap(
+            exc_handler(i)->handler_bci(),
+            Deoptimization::make_trap_request(
+              Deoptimization::Reason_unhandled,
+              Deoptimization::Action_reinterpret));
         }
 
         switchinst->addCase(
@@ -637,6 +639,22 @@
   return false;
 }
 
+BasicBlock* SharkTopLevelBlock::make_trap(int trap_bci, int trap_request) {
+  BasicBlock *trap_block = function()->CreateBlock("trap");
+  BasicBlock *orig_block = builder()->GetInsertBlock();
+  builder()->SetInsertPoint(trap_block);
+
+  int orig_bci = bci();
+  iter()->force_bci(trap_bci);
+
+  do_trap(trap_request);
+
+  builder()->SetInsertPoint(orig_block);
+  iter()->force_bci(orig_bci);
+
+  return trap_block;
+}
+
 void SharkTopLevelBlock::do_trap(int trap_request) {
   decache_for_trap();
   builder()->CreateRet(
--- a/src/share/vm/shark/sharkTopLevelBlock.hpp	Thu May 20 08:36:44 2010 +0100
+++ b/src/share/vm/shark/sharkTopLevelBlock.hpp	Thu May 20 08:45:55 2010 +0100
@@ -348,6 +348,7 @@
 
   // Traps
  private:
+  llvm::BasicBlock* make_trap(int trap_bci, int trap_request);
   void do_trap(int trap_request);
 
   // Returns