# HG changeset patch # User Gary Benson # Date 1236350824 18000 # Node ID f7efa3c95c17edff5411f8b1ed5e155d621b8fe4 # Parent 88cbabc76b8935cdf957993c375c0c7c7d305924 2009-03-06 Gary Benson * 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) diff -r 88cbabc76b89 -r f7efa3c95c17 ChangeLog --- 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 + + * 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 * Makefile.am (check-*): Pass $(ICEDTEA_JTREG_OPTIONS), unset diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/includeDB_shark --- 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_.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 diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkBuilder.cpp --- 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 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); -} - diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkBuilder.hpp --- 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 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 diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkCompiler.cpp --- 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 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(); diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkCompiler.hpp --- 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); }; diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkEntry.hpp --- 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; }; diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkFunction.cpp --- 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 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()); } diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkFunction.hpp --- 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(); diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkMemoryManager.cpp --- /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); +} diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkMemoryManager.hpp --- /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 _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); +}; diff -r 88cbabc76b89 -r f7efa3c95c17 ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp --- 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;