annotate src/share/vm/shark/sharkCompiler.cpp @ 5763:a3d71693e0ce

removed bytecode disassembly from CodeCacheRuntime into separate BytecodeDisassembler class removed VM call for doing bytecode disassembly added support for explicitly excluding classes from JaCoCo (put '// JaCoCo Exclude' somewhere in the source file) added node intrinsics to MaterializeNode added snippets for the UnsignedMath classes each file opened by CFGPrinter now includes a unique id in its name to avoid a race of multiple threads writing to the same file the IdealGraphPrinter uses the new BytecodeDisassembler mechanism teh UnsignedMath class is exclude from JaCoCo processing as it is used in snippets
author Doug Simon <doug.simon@oracle.com>
date Wed, 04 Jul 2012 21:57:49 +0200
parents e863062e521d
children 5d0bb7d52783 2cd5e15048e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 1972
diff changeset
3 * Copyright 2008, 2009, 2010, 2011 Red Hat, Inc.
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
5 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
6 * This code is free software; you can redistribute it and/or modify it
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
7 * under the terms of the GNU General Public License version 2 only, as
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
8 * published by the Free Software Foundation.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
9 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
10 * This code is distributed in the hope that it will be useful, but WITHOUT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
13 * version 2 for more details (a copy is included in the LICENSE file that
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
14 * accompanied this code).
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
15 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License version
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
17 * 2 along with this work; if not, write to the Free Software Foundation,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
19 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
21 * or visit www.oracle.com if you need additional information or have any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
22 * questions.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
23 *
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
24 */
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
25
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
26 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
27 #include "ci/ciEnv.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
28 #include "ci/ciMethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
29 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
30 #include "code/dependencies.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
31 #include "code/exceptionHandlerTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
32 #include "code/oopRecorder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
33 #include "compiler/abstractCompiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
34 #include "compiler/oopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
35 #include "shark/llvmHeaders.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
36 #include "shark/sharkBuilder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
37 #include "shark/sharkCodeBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
38 #include "shark/sharkCompiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
39 #include "shark/sharkContext.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
40 #include "shark/sharkEntry.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
41 #include "shark/sharkFunction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
42 #include "shark/sharkMemoryManager.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
43 #include "shark/sharkNativeWrapper.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
44 #include "shark/shark_globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1692
diff changeset
45 #include "utilities/debug.hpp"
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
46
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
47 #include <fnmatch.h>
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
48
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
49 using namespace llvm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
50
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
51 #if SHARK_LLVM_VERSION >= 27
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
52 namespace {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
53 cl::opt<std::string>
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
54 MCPU("mcpu");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
55
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
56 cl::list<std::string>
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
57 MAttrs("mattr",
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
58 cl::CommaSeparated);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
59 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
60 #endif
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
61
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
62 SharkCompiler::SharkCompiler()
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
63 : AbstractCompiler() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
64 // Create the lock to protect the memory manager and execution engine
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
65 _execution_engine_lock = new Monitor(Mutex::leaf, "SharkExecutionEngineLock");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
66 MutexLocker locker(execution_engine_lock());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
67
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
68 // Make LLVM safe for multithreading
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
69 if (!llvm_start_multithreaded())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
70 fatal("llvm_start_multithreaded() failed");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
71
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
72 // Initialize the native target
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
73 InitializeNativeTarget();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
74
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
75 // Create the two contexts which we'll use
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
76 _normal_context = new SharkContext("normal");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
77 _native_context = new SharkContext("native");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
78
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
79 // Create the memory manager
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
80 _memory_manager = new SharkMemoryManager();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
81
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
82 #if SHARK_LLVM_VERSION >= 27
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
83 // Finetune LLVM for the current host CPU.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
84 StringMap<bool> Features;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
85 bool gotCpuFeatures = llvm::sys::getHostCPUFeatures(Features);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
86 std::string cpu("-mcpu=" + llvm::sys::getHostCPUName());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
87
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
88 std::vector<const char*> args;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
89 args.push_back(""); // program name
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
90 args.push_back(cpu.c_str());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
91
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
92 std::string mattr("-mattr=");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
93 if(gotCpuFeatures){
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
94 for(StringMap<bool>::iterator I = Features.begin(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
95 E = Features.end(); I != E; ++I){
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
96 if(I->second){
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
97 std::string attr(I->first());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
98 mattr+="+"+attr+",";
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
99 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
100 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
101 args.push_back(mattr.c_str());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
102 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
103
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
104 args.push_back(0); // terminator
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
105 cl::ParseCommandLineOptions(args.size() - 1, (char **) &args[0]);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
106
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
107 // Create the JIT
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
108 std::string ErrorMsg;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
109
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
110 EngineBuilder builder(_normal_context->module());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
111 builder.setMCPU(MCPU);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
112 builder.setMAttrs(MAttrs);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
113 builder.setJITMemoryManager(memory_manager());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
114 builder.setEngineKind(EngineKind::JIT);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
115 builder.setErrorStr(&ErrorMsg);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
116 _execution_engine = builder.create();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
117
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
118 if (!execution_engine()) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
119 if (!ErrorMsg.empty())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
120 printf("Error while creating Shark JIT: %s\n",ErrorMsg.c_str());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
121 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
122 printf("Unknown error while creating Shark JIT\n");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
123 exit(1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
124 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
125
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
126 execution_engine()->addModule(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
127 _native_context->module());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
128 #else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
129 _execution_engine = ExecutionEngine::createJIT(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
130 _normal_context->module_provider(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
131 NULL, memory_manager(), CodeGenOpt::Default);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
132 execution_engine()->addModuleProvider(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
133 _native_context->module_provider());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
134 #endif
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
135
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
136 // All done
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
137 mark_initialized();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
138 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
139
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
140 void SharkCompiler::initialize() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
141 ShouldNotCallThis();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
142 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
143
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
144 void SharkCompiler::compile_method(ciEnv* env,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
145 ciMethod* target,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
146 int entry_bci) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
147 assert(is_initialized(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
148 ResourceMark rm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
149 const char *name = methodname(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
150 target->holder()->name()->as_utf8(), target->name()->as_utf8());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
151
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
152 // Do the typeflow analysis
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
153 ciTypeFlow *flow;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
154 if (entry_bci == InvocationEntryBci)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
155 flow = target->get_flow_analysis();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
156 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
157 flow = target->get_osr_flow_analysis(entry_bci);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
158 if (flow->failing())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
159 return;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
160 if (SharkPrintTypeflowOf != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
161 if (!fnmatch(SharkPrintTypeflowOf, name, 0))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
162 flow->print_on(tty);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
163 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
164
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
165 // Create the recorders
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
166 Arena arena;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
167 env->set_oop_recorder(new OopRecorder(&arena));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
168 OopMapSet oopmaps;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
169 env->set_debug_info(new DebugInformationRecorder(env->oop_recorder()));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
170 env->debug_info()->set_oopmaps(&oopmaps);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
171 env->set_dependencies(new Dependencies(env));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
172
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
173 // Create the code buffer and builder
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
174 CodeBuffer hscb("Shark", 256 * K, 64 * K);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
175 hscb.initialize_oop_recorder(env->oop_recorder());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
176 MacroAssembler *masm = new MacroAssembler(&hscb);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
177 SharkCodeBuffer cb(masm);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
178 SharkBuilder builder(&cb);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
179
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
180 // Emit the entry point
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
181 SharkEntry *entry = (SharkEntry *) cb.malloc(sizeof(SharkEntry));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
182
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
183 // Build the LLVM IR for the method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
184 Function *function = SharkFunction::build(env, &builder, flow, name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
185
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
186 // Generate native code. It's unpleasant that we have to drop into
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
187 // the VM to do this -- it blocks safepoints -- but I can't see any
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
188 // other way to handle the locking.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
189 {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
190 ThreadInVMfromNative tiv(JavaThread::current());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
191 generate_native_code(entry, function, name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
192 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
193
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
194 // Install the method into the VM
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
195 CodeOffsets offsets;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
196 offsets.set_value(CodeOffsets::Deopt, 0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
197 offsets.set_value(CodeOffsets::Exceptions, 0);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
198 offsets.set_value(CodeOffsets::Verified_Entry,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
199 target->is_static() ? 0 : wordSize);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
200
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
201 ExceptionHandlerTable handler_table;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
202 ImplicitExceptionTable inc_table;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
203
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
204 env->register_method(target,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
205 entry_bci,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
206 &offsets,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
207 0,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
208 &hscb,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
209 0,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
210 &oopmaps,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
211 &handler_table,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
212 &inc_table,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
213 this,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
214 env->comp_level(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
215 false,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
216 false);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
217 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
218
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
219 nmethod* SharkCompiler::generate_native_wrapper(MacroAssembler* masm,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
220 methodHandle target,
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 1972
diff changeset
221 int compile_id,
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
222 BasicType* arg_types,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
223 BasicType return_type) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
224 assert(is_initialized(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
225 ResourceMark rm;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
226 const char *name = methodname(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
227 target->klass_name()->as_utf8(), target->name()->as_utf8());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
228
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
229 // Create the code buffer and builder
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
230 SharkCodeBuffer cb(masm);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
231 SharkBuilder builder(&cb);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
232
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
233 // Emit the entry point
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
234 SharkEntry *entry = (SharkEntry *) cb.malloc(sizeof(SharkEntry));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
235
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
236 // Build the LLVM IR for the method
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
237 SharkNativeWrapper *wrapper = SharkNativeWrapper::build(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
238 &builder, target, name, arg_types, return_type);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
239
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
240 // Generate native code
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
241 generate_native_code(entry, wrapper->function(), name);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
242
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
243 // Return the nmethod for installation in the VM
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
244 return nmethod::new_native_nmethod(target,
2447
e863062e521d 7032458: Zero and Shark fixes
twisti
parents: 1972
diff changeset
245 compile_id,
1692
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
246 masm->code(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
247 0,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
248 0,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
249 wrapper->frame_size(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
250 wrapper->receiver_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
251 wrapper->lock_offset(),
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
252 wrapper->oop_maps());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
253 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
254
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
255 void SharkCompiler::generate_native_code(SharkEntry* entry,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
256 Function* function,
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
257 const char* name) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
258 // Print the LLVM bitcode, if requested
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
259 if (SharkPrintBitcodeOf != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
260 if (!fnmatch(SharkPrintBitcodeOf, name, 0))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
261 function->dump();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
262 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
263
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
264 // Compile to native code
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
265 address code = NULL;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
266 context()->add_function(function);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
267 {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
268 MutexLocker locker(execution_engine_lock());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
269 free_queued_methods();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
270
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
271 if (SharkPrintAsmOf != NULL) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
272 #if SHARK_LLVM_VERSION >= 27
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
273 #ifndef NDEBUG
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
274 if (!fnmatch(SharkPrintAsmOf, name, 0)) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
275 llvm::SetCurrentDebugType(X86_ONLY("x86-emitter") NOT_X86("jit"));
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
276 llvm::DebugFlag = true;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
277 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
278 else {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
279 llvm::SetCurrentDebugType("");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
280 llvm::DebugFlag = false;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
281 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
282 #endif // !NDEBUG
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
283 #else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
284 // NB you need to patch LLVM with http://tinyurl.com/yf3baln for this
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
285 std::vector<const char*> args;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
286 args.push_back(""); // program name
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
287 if (!fnmatch(SharkPrintAsmOf, name, 0))
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
288 args.push_back("-debug-only=x86-emitter");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
289 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
290 args.push_back("-debug-only=none");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
291 args.push_back(0); // terminator
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
292 cl::ParseCommandLineOptions(args.size() - 1, (char **) &args[0]);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
293 #endif // SHARK_LLVM_VERSION
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
294 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
295 memory_manager()->set_entry_for_function(function, entry);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
296 code = (address) execution_engine()->getPointerToFunction(function);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
297 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
298 entry->set_entry_point(code);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
299 entry->set_function(function);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
300 entry->set_context(context());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
301 address code_start = entry->code_start();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
302 address code_limit = entry->code_limit();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
303
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
304 // Register generated code for profiling, etc
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
305 if (JvmtiExport::should_post_dynamic_code_generated())
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
306 JvmtiExport::post_dynamic_code_generated(name, code_start, code_limit);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
307
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
308 // Print debug information, if requested
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
309 if (SharkTraceInstalls) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
310 tty->print_cr(
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
311 " [%p-%p): %s (%d bytes code)",
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
312 code_start, code_limit, name, code_limit - code_start);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
313 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
314 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
315
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
316 void SharkCompiler::free_compiled_method(address code) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
317 // This method may only be called when the VM is at a safepoint.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
318 // All _thread_in_vm threads will be waiting for the safepoint to
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
319 // finish with the exception of the VM thread, so we can consider
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
320 // ourself the owner of the execution engine lock even though we
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
321 // can't actually acquire it at this time.
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
322 assert(Thread::current()->is_VM_thread(), "must be called by VM thread");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
323 assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
324
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
325 SharkEntry *entry = (SharkEntry *) code;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
326 entry->context()->push_to_free_queue(entry->function());
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
327 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
328
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
329 void SharkCompiler::free_queued_methods() {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
330 // The free queue is protected by the execution engine lock
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
331 assert(execution_engine_lock()->owned_by_self(), "should be");
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
332
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
333 while (true) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
334 Function *function = context()->pop_from_free_queue();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
335 if (function == NULL)
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
336 break;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
337
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
338 execution_engine()->freeMachineCodeForFunction(function);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
339 function->eraseFromParent();
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
340 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
341 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
342
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
343 const char* SharkCompiler::methodname(const char* klass, const char* method) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
344 char *buf = NEW_RESOURCE_ARRAY(char, strlen(klass) + 2 + strlen(method) + 1);
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
345
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
346 char *dst = buf;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
347 for (const char *c = klass; *c; c++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
348 if (*c == '/')
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
349 *(dst++) = '.';
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
350 else
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
351 *(dst++) = *c;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
352 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
353 *(dst++) = ':';
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
354 *(dst++) = ':';
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
355 for (const char *c = method; *c; c++) {
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
356 *(dst++) = *c;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
357 }
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
358 *(dst++) = '\0';
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
359 return buf;
d2ede61b7a12 6976186: integrate Shark HotSpot changes
twisti
parents:
diff changeset
360 }