changeset 1729:f7efa3c95c17

2009-03-06 Gary Benson <gbenson@redhat.com> * ports/hotspot/src/share/vm/shark/sharkBuilder.hpp (SharkBuilder::SharkBuilder): New argument. (SharkBuilder::_compiler): New field. (SharkBuilder::_module): Removed field. (SharkBuilder::_module_provider): Likewise. (SharkBuilder::_execution_engine): Likewise. (SharkBuilder::module): Rewritten. (SharkBuilder::execution_engine): Likewise. (SharkBuilder::MyJITMemoryManager): Moved to sharkMemoryManager.hpp. (SharkBuilder::sharkEntry): Likewise. * ports/hotspot/src/share/vm/shark/sharkBuilder.cpp (SharkBuilder::SharkBuilder): New argument. (SharkBuilder::MyJITMemoryManager::endFunctionBody) Moved to sharkMemoryManager.cpp. (SharkBuilder::sharkEntry): Likewise. * ports/hotspot/src/share/vm/shark/sharkCompiler.hpp (SharkCompiler::_module): New field. (SharkCompiler::_execution_engine): Likewise. (SharkCompiler::module): New method. (SharkCompiler::execution_engine): Likewise. (SharkCompiler::compile): Likewise. * ports/hotspot/src/share/vm/shark/sharkCompiler.hpp (SharkCompiler::SharkCompiler): Initialize new fields. (SharkCompiler::compile): New method. * ports/hotspot/src/share/vm/shark/sharkEntry.hpp (SharkEntry::_code_start): Removed field. (SharkEntry::code_start): Rewritten. (SharkEntry::set_bounds): Replaced with... (SharkEntry::set_code_limit): New method. (SharkEntry::llvm_function_offset): Removed method. * ports/hotspot/src/share/vm/shark/sharkFunction.hpp (SharkFunction::SharkFunction): Changed arguments. (SharkFunction::_builder): Removed field. (SharkFunction::_compiler): New field. (SharkFunction::compiler): New method. (SharkFunction::builder): Rewritten. * ports/hotspot/src/share/vm/shark/sharkFunction.hpp (SharkFunction::initialize): Updated for new interfaces. * ports/hotspot/src/share/vm/shark/sharkMemoryManager.hpp: New file. * ports/hotspot/src/share/vm/shark/sharkMemoryManager.cpp: Likewise. * ports/hotspot/src/share/vm/includeDB_shark: Updated. (transplanted from 8228a1d1008b4094350ae4a34e23b555eb5832e8)
author Gary Benson <gbenson@redhat.com>
date Fri, 06 Mar 2009 09:47:04 -0500
parents 88cbabc76b89
children 146e5d33e990
files ChangeLog ports/hotspot/src/share/vm/includeDB_shark ports/hotspot/src/share/vm/shark/sharkBuilder.cpp ports/hotspot/src/share/vm/shark/sharkBuilder.hpp ports/hotspot/src/share/vm/shark/sharkCompiler.cpp ports/hotspot/src/share/vm/shark/sharkCompiler.hpp ports/hotspot/src/share/vm/shark/sharkEntry.hpp ports/hotspot/src/share/vm/shark/sharkFunction.cpp ports/hotspot/src/share/vm/shark/sharkFunction.hpp ports/hotspot/src/share/vm/shark/sharkMemoryManager.cpp ports/hotspot/src/share/vm/shark/sharkMemoryManager.hpp ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
diffstat 12 files changed, 379 insertions(+), 194 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Mar 06 11:33:48 2009 +0100
+++ b/ChangeLog	Fri Mar 06 09:47:04 2009 -0500
@@ -1,3 +1,52 @@
+2009-03-06  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/share/vm/shark/sharkBuilder.hpp
+	(SharkBuilder::SharkBuilder): New argument.
+	(SharkBuilder::_compiler): New field.
+	(SharkBuilder::_module): Removed field.
+	(SharkBuilder::_module_provider): Likewise.
+	(SharkBuilder::_execution_engine): Likewise.
+	(SharkBuilder::module): Rewritten.
+	(SharkBuilder::execution_engine): Likewise.
+	(SharkBuilder::MyJITMemoryManager): Moved to sharkMemoryManager.hpp.
+	(SharkBuilder::sharkEntry): Likewise.
+	* ports/hotspot/src/share/vm/shark/sharkBuilder.cpp
+	(SharkBuilder::SharkBuilder): New argument.
+	(SharkBuilder::MyJITMemoryManager::endFunctionBody) Moved to
+	sharkMemoryManager.cpp.
+	(SharkBuilder::sharkEntry): Likewise.
+
+	* ports/hotspot/src/share/vm/shark/sharkCompiler.hpp
+	(SharkCompiler::_module): New field.
+	(SharkCompiler::_execution_engine): Likewise.
+	(SharkCompiler::module): New method.
+	(SharkCompiler::execution_engine): Likewise.
+	(SharkCompiler::compile): Likewise.
+	* ports/hotspot/src/share/vm/shark/sharkCompiler.hpp
+	(SharkCompiler::SharkCompiler): Initialize new fields.
+	(SharkCompiler::compile): New method.
+
+	* ports/hotspot/src/share/vm/shark/sharkEntry.hpp
+	(SharkEntry::_code_start): Removed field.
+	(SharkEntry::code_start): Rewritten.
+	(SharkEntry::set_bounds): Replaced with...
+	(SharkEntry::set_code_limit): New method.
+	(SharkEntry::llvm_function_offset): Removed method.
+
+	* ports/hotspot/src/share/vm/shark/sharkFunction.hpp
+	(SharkFunction::SharkFunction): Changed arguments.
+	(SharkFunction::_builder): Removed field.
+	(SharkFunction::_compiler): New field.
+	(SharkFunction::compiler): New method.
+	(SharkFunction::builder): Rewritten.
+	* ports/hotspot/src/share/vm/shark/sharkFunction.hpp
+	(SharkFunction::initialize): Updated for new interfaces.
+
+	* ports/hotspot/src/share/vm/shark/sharkMemoryManager.hpp: New file.
+	* ports/hotspot/src/share/vm/shark/sharkMemoryManager.cpp: Likewise.
+
+	* ports/hotspot/src/share/vm/includeDB_shark: Updated.
+
 2009-03-06  Matthias Klose  <doko@ubuntu.com>
 
 	* Makefile.am (check-*): Pass $(ICEDTEA_JTREG_OPTIONS), unset
--- a/ports/hotspot/src/share/vm/includeDB_shark	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/includeDB_shark	Fri Mar 06 09:47:04 2009 -0500
@@ -44,25 +44,6 @@
 sharkBlock.hpp                          sharkState.hpp
 sharkBlock.hpp                          sharkValue.hpp
 
-sharkBlock.cpp                          debug.hpp
-sharkBlock.cpp                          bytecodes.hpp
-sharkBlock.cpp                          llvmHeaders.hpp
-sharkBlock.cpp                          shark_globals.hpp
-sharkBlock.cpp                          sharkBlock.hpp
-sharkBlock.cpp                          sharkBuilder.hpp
-sharkBlock.cpp                          sharkRuntime.hpp
-sharkBlock.cpp                          sharkState.inline.hpp
-sharkBlock.cpp                          sharkValue.inline.hpp
-
-sharkBlock.hpp                          allocation.hpp
-sharkBlock.hpp                          ciMethod.hpp
-sharkBlock.hpp                          ciStreams.hpp
-sharkBlock.hpp                          debug.hpp
-sharkBlock.hpp                          llvmHeaders.hpp
-sharkBlock.hpp                          sharkBuilder.hpp
-sharkBlock.hpp                          sharkState.hpp
-sharkBlock.hpp                          sharkValue.hpp
-
 ciMethod.cpp                            ciTypeFlow.hpp
 ciMethod.cpp                            methodOop.hpp
 
@@ -101,35 +82,24 @@
 shark_globals.hpp                       shark_globals_<arch>.hpp
 shark_globals.hpp                       globals.hpp
 
-sharkTopLevelBlock.cpp                  allocation.hpp
-sharkTopLevelBlock.cpp                  bytecodes.hpp
-sharkTopLevelBlock.cpp                  ciField.hpp
-sharkTopLevelBlock.cpp                  ciStreams.hpp
-sharkTopLevelBlock.cpp                  ciType.hpp
-sharkTopLevelBlock.cpp                  ciTypeFlow.hpp
-sharkTopLevelBlock.cpp                  debug.hpp
-sharkTopLevelBlock.cpp                  llvmHeaders.hpp
-sharkTopLevelBlock.cpp                  shark_globals.hpp
-sharkTopLevelBlock.cpp                  sharkTopLevelBlock.hpp
-sharkTopLevelBlock.cpp                  sharkBuilder.hpp
-sharkTopLevelBlock.cpp                  sharkConstantPool.hpp
-sharkTopLevelBlock.cpp                  sharkInliner.hpp
-sharkTopLevelBlock.cpp                  sharkRuntime.hpp
-sharkTopLevelBlock.cpp                  sharkState.inline.hpp
-sharkTopLevelBlock.cpp                  sharkValue.inline.hpp
+sharkBlock.cpp                          debug.hpp
+sharkBlock.cpp                          bytecodes.hpp
+sharkBlock.cpp                          llvmHeaders.hpp
+sharkBlock.cpp                          shark_globals.hpp
+sharkBlock.cpp                          sharkBlock.hpp
+sharkBlock.cpp                          sharkBuilder.hpp
+sharkBlock.cpp                          sharkRuntime.hpp
+sharkBlock.cpp                          sharkState.inline.hpp
+sharkBlock.cpp                          sharkValue.inline.hpp
 
-sharkTopLevelBlock.hpp                  allocation.hpp
-sharkTopLevelBlock.hpp                  bytecodes.hpp
-sharkTopLevelBlock.hpp                  ciStreams.hpp
-sharkTopLevelBlock.hpp                  ciType.hpp
-sharkTopLevelBlock.hpp                  ciTypeFlow.hpp
-sharkTopLevelBlock.hpp                  llvmHeaders.hpp
-sharkTopLevelBlock.hpp                  sharkBlock.hpp
-sharkTopLevelBlock.hpp                  sharkBuilder.hpp
-sharkTopLevelBlock.hpp                  sharkFunction.hpp
-sharkTopLevelBlock.hpp                  sharkMonitor.hpp
-sharkTopLevelBlock.hpp                  sharkState.inline.hpp
-sharkTopLevelBlock.hpp                  sharkValue.inline.hpp
+sharkBlock.hpp                          allocation.hpp
+sharkBlock.hpp                          ciMethod.hpp
+sharkBlock.hpp                          ciStreams.hpp
+sharkBlock.hpp                          debug.hpp
+sharkBlock.hpp                          llvmHeaders.hpp
+sharkBlock.hpp                          sharkBuilder.hpp
+sharkBlock.hpp                          sharkState.hpp
+sharkBlock.hpp                          sharkValue.hpp
 
 sharkBuilder.cpp                        ciMethod.hpp
 sharkBuilder.cpp                        debug.hpp
@@ -139,6 +109,7 @@
 sharkBuilder.cpp                        resourceArea.hpp
 sharkBuilder.cpp                        llvmHeaders.hpp
 sharkBuilder.cpp                        sharkBuilder.hpp
+sharkBuilder.cpp                        sharkCompiler.hpp
 sharkBuilder.cpp                        sharkRuntime.hpp
 sharkBuilder.cpp                        synchronizer.hpp
 sharkBuilder.cpp                        thread.hpp
@@ -149,6 +120,7 @@
 sharkBuilder.hpp                        debug.hpp
 sharkBuilder.hpp                        llvmHeaders.hpp
 sharkBuilder.hpp                        sizes.hpp
+sharkBuilder.hpp                        sharkCompiler.hpp
 sharkBuilder.hpp                        sharkType.hpp
 sharkBuilder.hpp                        sharkValue.inline.hpp
 sharkBuilder.hpp                        sharkEntry.hpp
@@ -166,6 +138,7 @@
 sharkCacheDecache.hpp                   sharkFunction.hpp
 sharkCacheDecache.hpp                   sharkStateScanner.hpp
 
+sharkCompiler.cpp                       abstractCompiler.hpp
 sharkCompiler.cpp                       ciEnv.hpp
 sharkCompiler.cpp                       ciMethod.hpp
 sharkCompiler.cpp                       codeBuffer.hpp
@@ -177,16 +150,18 @@
 sharkCompiler.cpp                       oopMap.hpp
 sharkCompiler.cpp                       oopRecorder.hpp
 sharkCompiler.cpp                       shark_globals.hpp
+sharkCompiler.cpp                       sharkBuilder.hpp
 sharkCompiler.cpp                       sharkCompiler.hpp
 sharkCompiler.cpp                       sharkEntry.hpp
 sharkCompiler.cpp                       sharkFunction.hpp
+sharkCompiler.cpp                       sharkMemoryManager.hpp
 sharkCompiler.cpp                       sharkRuntime.hpp
 
 sharkCompiler.hpp                       abstractCompiler.hpp
 sharkCompiler.hpp                       ciEnv.hpp
 sharkCompiler.hpp                       ciMethod.hpp
 sharkCompiler.hpp                       llvmHeaders.hpp
-sharkCompiler.hpp                       sharkBuilder.hpp
+sharkCompiler.hpp                       sharkMemoryManager.hpp
 
 sharkConstantPool.cpp                   allocation.hpp
 sharkConstantPool.cpp                   constantPoolOop.hpp
@@ -243,6 +218,13 @@
 sharkInliner.hpp                        ciMethod.hpp
 sharkInliner.hpp                        sharkState.inline.hpp
 
+sharkMemoryManager.hpp                  llvmHeaders.hpp
+sharkMemoryManager.hpp                  sharkEntry.hpp
+
+sharkMemoryManager.cpp                  llvmHeaders.hpp
+sharkMemoryManager.cpp                  sharkEntry.hpp
+sharkMemoryManager.cpp                  sharkMemoryManager.hpp
+
 sharkMonitor.cpp                        llvmHeaders.hpp
 sharkMonitor.cpp                        sharkMonitor.hpp
 sharkMonitor.cpp                        sharkRuntime.hpp
@@ -296,6 +278,36 @@
 sharkStateScanner.hpp                   llvmHeaders.hpp
 sharkStateScanner.hpp                   sharkFunction.hpp
 
+sharkTopLevelBlock.cpp                  allocation.hpp
+sharkTopLevelBlock.cpp                  bytecodes.hpp
+sharkTopLevelBlock.cpp                  ciField.hpp
+sharkTopLevelBlock.cpp                  ciStreams.hpp
+sharkTopLevelBlock.cpp                  ciType.hpp
+sharkTopLevelBlock.cpp                  ciTypeFlow.hpp
+sharkTopLevelBlock.cpp                  debug.hpp
+sharkTopLevelBlock.cpp                  llvmHeaders.hpp
+sharkTopLevelBlock.cpp                  shark_globals.hpp
+sharkTopLevelBlock.cpp                  sharkTopLevelBlock.hpp
+sharkTopLevelBlock.cpp                  sharkBuilder.hpp
+sharkTopLevelBlock.cpp                  sharkConstantPool.hpp
+sharkTopLevelBlock.cpp                  sharkInliner.hpp
+sharkTopLevelBlock.cpp                  sharkRuntime.hpp
+sharkTopLevelBlock.cpp                  sharkState.inline.hpp
+sharkTopLevelBlock.cpp                  sharkValue.inline.hpp
+
+sharkTopLevelBlock.hpp                  allocation.hpp
+sharkTopLevelBlock.hpp                  bytecodes.hpp
+sharkTopLevelBlock.hpp                  ciStreams.hpp
+sharkTopLevelBlock.hpp                  ciType.hpp
+sharkTopLevelBlock.hpp                  ciTypeFlow.hpp
+sharkTopLevelBlock.hpp                  llvmHeaders.hpp
+sharkTopLevelBlock.hpp                  sharkBlock.hpp
+sharkTopLevelBlock.hpp                  sharkBuilder.hpp
+sharkTopLevelBlock.hpp                  sharkFunction.hpp
+sharkTopLevelBlock.hpp                  sharkMonitor.hpp
+sharkTopLevelBlock.hpp                  sharkState.inline.hpp
+sharkTopLevelBlock.hpp                  sharkValue.inline.hpp
+
 sharkType.cpp                           arrayOop.hpp
 sharkType.cpp                           globalDefinitions.hpp
 sharkType.cpp                           llvmHeaders.hpp
--- a/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBuilder.cpp	Fri Mar 06 09:47:04 2009 -0500
@@ -28,15 +28,10 @@
 
 using namespace llvm;
 
-std::map<const llvm::Function*, SharkEntry*> SharkBuilder::sharkEntry;
-
-SharkBuilder::SharkBuilder()
+SharkBuilder::SharkBuilder(SharkCompiler* compiler)
   : IRBuilder<>(),
-      _module("shark"),
-      _module_provider(module()),
-      _execution_engine(ExecutionEngine::createJIT
-			(&_module_provider, NULL, new MyJITMemoryManager(),
-			 /* Fast */ false)) {
+    _compiler(compiler)
+{
   init_external_functions();
 }
 
@@ -177,15 +172,3 @@
     ConstantInt::get(Type::Int1Ty, 0)};
   return CreateCall(llvm_memory_barrier_fn(), args, args + 5);
 }
-
-void SharkBuilder::MyJITMemoryManager::endFunctionBody
-  (const llvm::Function *F, unsigned char *FunctionStart,
-   unsigned char *FunctionEnd)
-{
-  mm->endFunctionBody(F, FunctionStart, FunctionEnd);
-
-  SharkEntry *entry = sharkEntry[F];
-  if (entry)
-    entry->set_bounds((address) FunctionStart, (address) FunctionEnd);
-}
-
--- a/ports/hotspot/src/share/vm/shark/sharkBuilder.hpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkBuilder.hpp	Fri Mar 06 09:47:04 2009 -0500
@@ -25,86 +25,25 @@
 
 class SharkBuilder : public llvm::IRBuilder<> {
  public:
-  SharkBuilder();
-
-  static std::map<const llvm::Function*, SharkEntry*> sharkEntry;
+  SharkBuilder(SharkCompiler* compiler);
 
  private:
-  llvm::Module                 _module;
-  llvm::ExistingModuleProvider _module_provider;
-  llvm::ExecutionEngine*       _execution_engine;
-
-  // MyJITMemoryManager wraps the JIT Memory Manager: this allows us
-  // to run our own memory allocation policies, but the purpose here
-  // is to allow us to intercept JITMemoryManager::endFunctionBody.
-  class MyJITMemoryManager : public llvm::JITMemoryManager {
-
-    llvm::JITMemoryManager *mm;
-
-  public:
-
-    MyJITMemoryManager()
-    {
-      mm = llvm::JITMemoryManager::CreateDefaultMemManager();
-    }
-
-    virtual void AllocateGOT() {
-      mm->AllocateGOT();
-    }
-
-    virtual unsigned char *getGOTBase() const {
-      return mm->getGOTBase();
-    }
-
-    virtual unsigned char *startFunctionBody(const llvm::Function *F,
-					     uintptr_t &ActualSize) {
-      return mm->startFunctionBody(F, ActualSize);
-    }
-
-    virtual unsigned char *allocateStub(const llvm::GlobalValue* F,
-					unsigned StubSize,
-					unsigned Alignment) {
-      return mm->allocateStub(F, StubSize, Alignment);
-    }
-
-    void endFunctionBody(const llvm::Function *F, unsigned char *FunctionStart,
-			 unsigned char *FunctionEnd);
-
-    virtual void deallocateMemForFunction(const llvm::Function *F) {
-      return mm->deallocateMemForFunction(F);
-    }
-
-    virtual unsigned char* startExceptionTable(const llvm::Function* F,
-					       uintptr_t &ActualSize) {
-      return mm->startExceptionTable(F, ActualSize);
-    }
-
-    virtual void endExceptionTable(const llvm::Function *F,
-				   unsigned char *TableStart,
-				   unsigned char *TableEnd,
-				   unsigned char* FrameRegister) {
-      mm->endExceptionTable(F, TableStart, TableEnd, FrameRegister);
-    }
-
-    virtual void setMemoryWritable() {
-      mm->setMemoryWritable();
-    }
-
-    virtual void setMemoryExecutable() {
-      mm->setMemoryExecutable();
-    }
-  };
-
-  MyJITMemoryManager *MemMgr;
+  SharkCompiler* _compiler;
 
  public:
-  llvm::Module* module()
+  SharkCompiler* compiler() const
   {
-    return &_module;
+    return _compiler;
+  }
+
+ private:
+  llvm::Module* module() const
+  {
+    return compiler()->module();
   }
   llvm::ExecutionEngine* execution_engine() const
   {
-    return _execution_engine;
+    return compiler()->execution_engine();
   }
 
   // Function creation
--- a/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp	Fri Mar 06 09:47:04 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
@@ -29,9 +29,21 @@
 using namespace llvm;
 
 SharkCompiler::SharkCompiler()
-  : AbstractCompiler(),
-    _builder()
+  : AbstractCompiler()
 {
+  // Create a module to build our functions into
+  _module = new Module("shark");
+
+  // Create the builder to build our functions
+  _builder = new SharkBuilder(this);
+  
+  // Create the JIT
+  ModuleProvider *module_provider = new ExistingModuleProvider(module());
+  _memory_manager = new SharkMemoryManager();
+  _execution_engine = ExecutionEngine::createJIT(
+    module_provider, NULL, memory_manager(), false);
+
+  // Initialize Shark components that need it
   SharkType::initialize();
   SharkRuntime::initialize(builder());
   mark_initialized();
@@ -97,7 +109,7 @@
 
   // Compile the method into the CodeBuffer
   ciBytecodeStream iter(target);
-  SharkFunction function(builder(), name, flow, &iter, masm);
+  SharkFunction function(this, name, flow, &iter, masm);
 
   // Install the method into the VM
   CodeOffsets offsets;
@@ -127,6 +139,31 @@
   BufferBlob::free(bb);
 }
 
+
+ZeroEntry::method_entry_t SharkCompiler::compile(const char* name,
+                                                 Function*   function)
+{
+  // Dump the generated code, if requested
+#ifndef PRODUCT
+#ifdef X86
+  if (SharkPrintAsmOf != NULL) {
+    std::vector<const char*> args;
+    args.push_back(""); // program name
+    if (!fnmatch(SharkPrintAsmOf, name, 0))
+      args.push_back("-debug-only=x86-emitter");
+    else
+      args.push_back("-debug-only=none");
+    args.push_back(0);  // terminator
+    cl::ParseCommandLineOptions(args.size() - 1, (char **) &args[0]);
+  }
+#endif // X86
+#endif // !PRODUCT
+
+  // Compile to native code
+  return (ZeroEntry::method_entry_t)
+    execution_engine()->getPointerToFunction(function);
+}
+
 const char* SharkCompiler::methodname(const ciMethod* target)
 {
   const char *klassname = target->holder()->name()->as_utf8();
--- a/ports/hotspot/src/share/vm/shark/sharkCompiler.hpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkCompiler.hpp	Fri Mar 06 09:47:04 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
@@ -23,9 +23,9 @@
  *
  */
 
+class SharkBuilder;
+
 class SharkCompiler : public AbstractCompiler {
-  friend class SharkCompilation;
-
  public:
   // Creation
   SharkCompiler();
@@ -47,17 +47,35 @@
   // Compilation entry point for methods
   void compile_method(ciEnv* env, ciMethod* target, int entry_bci);
 
-  // The builder we'll use to compile our functions
+  // LLVM interface
  private:
-  SharkBuilder _builder;
+  llvm::Module*          _module;
+  SharkBuilder*          _builder;
+  SharkMemoryManager*    _memory_manager;
+  llvm::ExecutionEngine* _execution_engine;
 
- protected:
-  SharkBuilder* builder()
+ public:
+  llvm::Module* module() const
+  {
+    return _module;
+  }
+  SharkBuilder* builder() const
   {
-    return &_builder;
+    return _builder;
+  }
+  SharkMemoryManager* memory_manager() const
+  {
+    return _memory_manager;
   }
+  llvm::ExecutionEngine* execution_engine() const
+  {
+    return _execution_engine;
+  }
+
+ public:
+  ZeroEntry::method_entry_t compile(const char* name, llvm::Function* func);
 
   // Helper
  private:
-  static const char *methodname(const ciMethod* target);
+  static const char* methodname(const ciMethod* target);
 };
--- a/ports/hotspot/src/share/vm/shark/sharkEntry.hpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkEntry.hpp	Fri Mar 06 09:47:04 2009 -0500
@@ -24,9 +24,10 @@
  */
 
 class SharkEntry : public ZeroEntry {
+  friend class SharkMemoryManager;
+
  private:
   llvm::Function* _llvm_function;
-  address         _code_start;
   address         _code_limit;
 
  public:
@@ -42,24 +43,18 @@
  public:
   address code_start() const
   {
-    return _code_start;
+    return (address) entry_point();
   }
   address code_limit() const
   {
     return _code_limit;
   }
-  void set_bounds(address code_start, address code_limit)
+ protected:
+  void set_code_limit(address code_limit)
   {
-    _code_start = code_start;
     _code_limit = code_limit;
   }
   
  public:
-  static ByteSize llvm_function_offset()
-  {
-    return byte_offset_of(SharkEntry, _llvm_function);
-  }
-
- public:
   void print_statistics(const char* name) const PRODUCT_RETURN;
 };
--- a/ports/hotspot/src/share/vm/shark/sharkFunction.cpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkFunction.cpp	Fri Mar 06 09:47:04 2009 -0500
@@ -157,11 +157,7 @@
   // Create the function
   _function = builder()->CreateFunction(name());
   entry->set_llvm_function(function());
-#ifndef PRODUCT
-  // FIXME: there should be a mutex when updating sharkEntry in case
-  // there are multiple compilation threads.
-  builder()->sharkEntry[function()] = entry;
-#endif // !PRODUCT
+  compiler()->memory_manager()->set_entry_for_function(function(), entry);
 
   // Create the list of blocks
   set_block_insertion_point(NULL);
@@ -252,31 +248,16 @@
       function()->dump();
   }
 
-  if (SharkPrintAsmOf != NULL) {
-#if defined (__x86_64) || defined (__i386)
-      std::vector<const char*> Args;
-      Args.push_back(""); // program name
-      if (!fnmatch(SharkPrintAsmOf, name(), 0))
-	// Oh, yuck.  The LLVM name for this debugging dump is
-	// target-specific.
-	Args.push_back("-debug-only=" "x86-emitter");
-      else
-	Args.push_back("-debug-only=" "none");
-      Args.push_back(0);  // Null terminator.
-      cl::ParseCommandLineOptions(Args.size()-1, (char**)&Args[0]);
-#endif
-  }
-
   // Compile to native code
-  void *code = builder()->execution_engine()->getPointerToFunction(function());
+  entry->set_entry_point(compiler()->compile(name(), function()));
 
   // Register generated code for profiling, etc
   if (JvmtiExport::should_post_dynamic_code_generated()) {
-    JvmtiExport::post_dynamic_code_generated
-      (name(), entry->code_start(), entry->code_limit());
+    JvmtiExport::post_dynamic_code_generated(
+      name(), entry->code_start(), entry->code_limit());
   }
 
-  entry->set_entry_point((ZeroEntry::method_entry_t) code);
+  // Print statistics, if requested
   if (SharkTraceInstalls)
     entry->print_statistics(name());
 }
--- a/ports/hotspot/src/share/vm/shark/sharkFunction.hpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkFunction.hpp	Fri Mar 06 09:47:04 2009 -0500
@@ -28,12 +28,12 @@
 
 class SharkFunction : public StackObj {
  public:
-  SharkFunction(SharkBuilder*     builder,
+  SharkFunction(SharkCompiler*    compiler,
                 const char*       name,
                 ciTypeFlow*       flow,
                 ciBytecodeStream* iter,
                 MacroAssembler*   masm)
-    : _builder(builder),
+    : _compiler(compiler),
       _name(name),
       _flow(flow),
       _iter(iter),
@@ -44,7 +44,7 @@
   void initialize();
 
  private:
-  SharkBuilder*        _builder;
+  SharkCompiler*       _compiler;
   const char*          _name;
   ciTypeFlow*          _flow;
   ciBytecodeStream*    _iter;
@@ -56,9 +56,9 @@
   int                  _monitor_count;
 
  public:  
-  SharkBuilder* builder() const
+  SharkCompiler* compiler() const
   {
-    return _builder;
+    return _compiler;
   }
   const char* name() const
   {
@@ -98,6 +98,10 @@
   }
 
  public:
+  SharkBuilder* builder() const
+  {
+    return compiler()->builder();
+  }
   int arg_size() const
   {
     return target()->arg_size();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ports/hotspot/src/share/vm/shark/sharkMemoryManager.cpp	Fri Mar 06 09:47:04 2009 -0500
@@ -0,0 +1,92 @@
+/*
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#include "incls/_precompiled.incl"
+#include "incls/_sharkMemoryManager.cpp.incl"
+
+using namespace llvm;
+
+void SharkMemoryManager::AllocateGOT()
+{
+  mm()->AllocateGOT();
+}
+
+unsigned char* SharkMemoryManager::getGOTBase() const
+{
+  return mm()->getGOTBase();
+}
+
+unsigned char* SharkMemoryManager::allocateStub(const GlobalValue* F,
+                                                unsigned StubSize,
+                                                unsigned Alignment)
+{
+  return mm()->allocateStub(F, StubSize, Alignment);
+}
+
+unsigned char* SharkMemoryManager::startFunctionBody(const Function* F,
+                                                     uintptr_t& ActualSize)
+{
+  return mm()->startFunctionBody(F, ActualSize);
+}
+
+void SharkMemoryManager::endFunctionBody(const Function* F,
+                                         unsigned char* FunctionStart,
+                                         unsigned char* FunctionEnd)
+{
+  mm()->endFunctionBody(F, FunctionStart, FunctionEnd);
+
+  SharkEntry *entry = get_entry_for_function(F);
+  if (entry != NULL)
+    entry->set_code_limit(FunctionEnd);
+}
+
+unsigned char* SharkMemoryManager::startExceptionTable(const Function* F,
+                                                       uintptr_t& ActualSize)
+{
+  return mm()->startExceptionTable(F, ActualSize);
+}
+
+void SharkMemoryManager::endExceptionTable(const Function* F,
+                                           unsigned char* TableStart,
+                                           unsigned char* TableEnd,
+                                           unsigned char* FrameRegister)
+{
+  mm()->endExceptionTable(F, TableStart, TableEnd, FrameRegister);
+}
+
+void SharkMemoryManager::setMemoryWritable()
+{
+  mm()->setMemoryWritable();
+}
+
+void SharkMemoryManager::setMemoryExecutable()
+{
+  mm()->setMemoryExecutable();
+}
+
+void SharkMemoryManager::deallocateMemForFunction(const Function* F)
+{
+  return mm()->deallocateMemForFunction(F);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ports/hotspot/src/share/vm/shark/sharkMemoryManager.hpp	Fri Mar 06 09:47:04 2009 -0500
@@ -0,0 +1,77 @@
+/*
+ * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+// SharkMemoryManager wraps the LLVM JIT Memory Manager.  We could use
+// this to run our own memory allocation policies, but for now all we
+// use it for is figuring out where the resulting native code ended up.
+
+class SharkMemoryManager : public llvm::JITMemoryManager {
+ public:
+  SharkMemoryManager()
+    : _mm(llvm::JITMemoryManager::CreateDefaultMemManager()) {}
+
+ private:
+  llvm::JITMemoryManager* _mm;
+
+ private:
+  llvm::JITMemoryManager* mm() const
+  {
+    return _mm;
+  }
+
+ private:
+  std::map<const llvm::Function*, SharkEntry*> _entry_map;
+
+ public:
+  void set_entry_for_function(const llvm::Function* function, SharkEntry* entry)
+  {
+    _entry_map[function] = entry;
+  }
+  SharkEntry* get_entry_for_function(const llvm::Function* function)
+  {
+    return _entry_map[function];
+  }
+
+ public:
+  void AllocateGOT();
+  unsigned char* getGOTBase() const;
+  unsigned char* allocateStub(const llvm::GlobalValue* F,
+                              unsigned StubSize,
+                              unsigned Alignment);
+  unsigned char* startFunctionBody(const llvm::Function* F,
+                                   uintptr_t& ActualSize);
+  void endFunctionBody(const llvm::Function* F,
+                       unsigned char* FunctionStart,
+                       unsigned char* FunctionEnd);
+  unsigned char* startExceptionTable(const llvm::Function* F,
+                                     uintptr_t& ActualSize);
+  void endExceptionTable(const llvm::Function* F,
+                         unsigned char* TableStart,
+                         unsigned char* TableEnd,
+                         unsigned char* FrameRegister);
+  void setMemoryWritable();
+  void setMemoryExecutable();
+  void deallocateMemForFunction(const llvm::Function* F);
+};
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri Mar 06 11:33:48 2009 +0100
+++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri Mar 06 09:47:04 2009 -0500
@@ -25,8 +25,6 @@
 
 #include "incls/_precompiled.incl"
 #include "incls/_sharkTopLevelBlock.cpp.incl"
-#include "ciArrayKlass.hpp" // XXX fuck you makeDeps
-#include "ciObjArrayKlass.hpp" // XXX likewise
 
 using namespace llvm;