7089790: integrate bsd-port changes
Co-authored-by: Greg Lewis <glewis@eyesbeyond.com> Co-authored-by: Jung-uk Kim <jkim@freebsd.org> Co-authored-by: Christos Zoulas <christos@zoulas.com> Co-authored-by: Landon Fuller <landonf@plausible.coop> Co-authored-by: The FreeBSD Foundation <board@freebsdfoundation.org> Co-authored-by: Michael Franz <mvfranz@gmail.com> Co-authored-by: Roger Hoover <rhoover@apple.com> Co-authored-by: Alexander Strange <astrange@apple.com> Reviewed-by: kvn, twisti, jrose
This commit is contained in:
parent
52f0eccb24
commit
95c56a472b
hotspot
agent
make
src
os/bsd
BsdDebuggerLocal.cMakefileStubDebuggerLocal.celfmacros.hlibproc.hlibproc_impl.clibproc_impl.hmapfileps_core.cps_proc.csalibelf.csalibelf.hsymtab.csymtab.htest.c
share/classes/sun/jvm/hotspot
BsdVtblAccess.javaHotSpotAgent.java
bugspot
debugger/bsd
BsdAddress.javaBsdCDebugger.javaBsdDebugger.javaBsdDebuggerLocal.javaBsdOopHandle.javaBsdThread.javaBsdThreadContextFactory.javaSharedObject.java
amd64
x86
runtime
utilities
make
Makefile
bsd
MakefileREADMEadlc_updaterbuild.sh
cscope.makedefs.makemakefiles
adjust-mflags.shadlc.makeamd64.makearm.makebuild_vm_def.shbuildtree.makecompiler1.makecompiler2.makecore.makecscope.makedebug.makedefs.makedtrace.makefastdebug.makegcc.makehp.makehp1.makei486.makeia64.makejsig.makejvmg.makejvmti.makelauncher.makemapfile-vers-debugmapfile-vers-jsigmapfile-vers-productoptimized.makeppc.makeproduct.makeprofiled.makerules.makesa.makesaproc.makeshark.makesparc.makesparcWorks.makesparcv9.maketiered.maketop.makevm.makezero.makezeroshark.make
platform_amd64platform_amd64.sunccplatform_i486platform_i486.sunccplatform_ia64platform_sparcplatform_sparcv9platform_zero.inlinux/makefiles
sa.filessolaris/makefiles
windows/makefiles
@ -53,6 +53,9 @@ sun.jvm.hotspot.code \
|
||||
sun.jvm.hotspot.compiler \
|
||||
sun.jvm.hotspot.debugger \
|
||||
sun.jvm.hotspot.debugger.amd64 \
|
||||
sun.jvm.hotspot.debugger.bsd \
|
||||
sun.jvm.hotspot.debugger.bsd.amd64 \
|
||||
sun.jvm.hotspot.debugger.bsd.x86 \
|
||||
sun.jvm.hotspot.debugger.cdbg \
|
||||
sun.jvm.hotspot.debugger.cdbg.basic \
|
||||
sun.jvm.hotspot.debugger.cdbg.basic.amd64 \
|
||||
@ -93,6 +96,9 @@ sun.jvm.hotspot.oops \
|
||||
sun.jvm.hotspot.prims \
|
||||
sun.jvm.hotspot.runtime \
|
||||
sun.jvm.hotspot.runtime.amd64 \
|
||||
sun.jvm.hotspot.runtime.bsd \
|
||||
sun.jvm.hotspot.runtime.bsd_amd64 \
|
||||
sun.jvm.hotspot.runtime.bsd_x86 \
|
||||
sun.jvm.hotspot.runtime.ia64 \
|
||||
sun.jvm.hotspot.runtime.linux \
|
||||
sun.jvm.hotspot.runtime.linux_amd64 \
|
||||
@ -143,6 +149,9 @@ sun/jvm/hotspot/code/*.java \
|
||||
sun/jvm/hotspot/compiler/*.java \
|
||||
sun/jvm/hotspot/debugger/*.java \
|
||||
sun/jvm/hotspot/debugger/amd64/*.java \
|
||||
sun/jvm/hotspot/debugger/bsd/*.java \
|
||||
sun/jvm/hotspot/debugger/bsd/amd64/*.java \
|
||||
sun/jvm/hotspot/debugger/bsd/x86/*.java \
|
||||
sun/jvm/hotspot/debugger/cdbg/*.java \
|
||||
sun/jvm/hotspot/debugger/cdbg/basic/*.java \
|
||||
sun/jvm/hotspot/debugger/cdbg/basic/amd64/*.java \
|
||||
@ -176,6 +185,9 @@ sun/jvm/hotspot/opto/*.java \
|
||||
sun/jvm/hotspot/prims/*.java \
|
||||
sun/jvm/hotspot/runtime/*.java \
|
||||
sun/jvm/hotspot/runtime/amd64/*.java \
|
||||
sun/jvm/hotspot/runtime/bsd/*.java \
|
||||
sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
||||
sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
||||
sun/jvm/hotspot/runtime/ia64/*.java \
|
||||
sun/jvm/hotspot/runtime/linux/*.java \
|
||||
sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
||||
|
413
hotspot/agent/src/os/bsd/BsdDebuggerLocal.c
Normal file
413
hotspot/agent/src/os/bsd/BsdDebuggerLocal.c
Normal file
@ -0,0 +1,413 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <jni.h>
|
||||
#include "libproc.h"
|
||||
|
||||
#if defined(x86_64) && !defined(amd64)
|
||||
#define amd64 1
|
||||
#endif
|
||||
|
||||
#ifdef i386
|
||||
#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h"
|
||||
#endif
|
||||
|
||||
#ifdef amd64
|
||||
#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h"
|
||||
#endif
|
||||
|
||||
#if defined(sparc) || defined(sparcv9)
|
||||
#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h"
|
||||
#endif
|
||||
|
||||
static jfieldID p_ps_prochandle_ID = 0;
|
||||
static jfieldID threadList_ID = 0;
|
||||
static jfieldID loadObjectList_ID = 0;
|
||||
|
||||
static jmethodID createClosestSymbol_ID = 0;
|
||||
static jmethodID createLoadObject_ID = 0;
|
||||
static jmethodID getThreadForThreadId_ID = 0;
|
||||
static jmethodID listAdd_ID = 0;
|
||||
|
||||
#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
|
||||
#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
|
||||
#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
|
||||
#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
|
||||
|
||||
static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
|
||||
(*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
|
||||
}
|
||||
|
||||
static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
|
||||
jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
|
||||
return (struct ps_prochandle*)(intptr_t)ptr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: init0
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
|
||||
(JNIEnv *env, jclass cls) {
|
||||
jclass listClass;
|
||||
|
||||
if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
|
||||
THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
|
||||
}
|
||||
|
||||
// fields we use
|
||||
p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
|
||||
CHECK_EXCEPTION;
|
||||
threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;");
|
||||
CHECK_EXCEPTION;
|
||||
loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;");
|
||||
CHECK_EXCEPTION;
|
||||
|
||||
// methods we use
|
||||
createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol",
|
||||
"(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;");
|
||||
CHECK_EXCEPTION;
|
||||
createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject",
|
||||
"(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;");
|
||||
CHECK_EXCEPTION;
|
||||
getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId",
|
||||
"(J)Lsun/jvm/hotspot/debugger/ThreadProxy;");
|
||||
CHECK_EXCEPTION;
|
||||
// java.util.List method we call
|
||||
listClass = (*env)->FindClass(env, "java/util/List");
|
||||
CHECK_EXCEPTION;
|
||||
listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z");
|
||||
CHECK_EXCEPTION;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
|
||||
(JNIEnv *env, jclass cls)
|
||||
{
|
||||
#ifdef _LP64
|
||||
return 8;
|
||||
#else
|
||||
return 4;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
|
||||
int n = 0, i = 0;
|
||||
|
||||
// add threads
|
||||
n = get_num_threads(ph);
|
||||
for (i = 0; i < n; i++) {
|
||||
jobject thread;
|
||||
jobject threadList;
|
||||
lwpid_t lwpid;
|
||||
|
||||
lwpid = get_lwp_id(ph, i);
|
||||
thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID,
|
||||
(jlong)lwpid);
|
||||
CHECK_EXCEPTION;
|
||||
threadList = (*env)->GetObjectField(env, this_obj, threadList_ID);
|
||||
CHECK_EXCEPTION;
|
||||
(*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread);
|
||||
CHECK_EXCEPTION;
|
||||
}
|
||||
|
||||
// add load objects
|
||||
n = get_num_libs(ph);
|
||||
for (i = 0; i < n; i++) {
|
||||
uintptr_t base;
|
||||
const char* name;
|
||||
jobject loadObject;
|
||||
jobject loadObjectList;
|
||||
|
||||
base = get_lib_base(ph, i);
|
||||
name = get_lib_name(ph, i);
|
||||
loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
|
||||
(*env)->NewStringUTF(env, name), (jlong)0, (jlong)base);
|
||||
CHECK_EXCEPTION;
|
||||
loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
|
||||
CHECK_EXCEPTION;
|
||||
(*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
|
||||
CHECK_EXCEPTION;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: attach0
|
||||
* Signature: (I)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
|
||||
(JNIEnv *env, jobject this_obj, jint jpid) {
|
||||
|
||||
struct ps_prochandle* ph;
|
||||
if ( (ph = Pgrab(jpid)) == NULL) {
|
||||
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
|
||||
}
|
||||
(*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
|
||||
fillThreadsAndLoadObjects(env, this_obj, ph);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: attach0
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
|
||||
(JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
|
||||
const char *execName_cstr;
|
||||
const char *coreName_cstr;
|
||||
jboolean isCopy;
|
||||
struct ps_prochandle* ph;
|
||||
|
||||
execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy);
|
||||
CHECK_EXCEPTION;
|
||||
coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy);
|
||||
CHECK_EXCEPTION;
|
||||
|
||||
if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) {
|
||||
(*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
|
||||
(*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
|
||||
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
|
||||
}
|
||||
(*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph);
|
||||
(*env)->ReleaseStringUTFChars(env, execName, execName_cstr);
|
||||
(*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr);
|
||||
fillThreadsAndLoadObjects(env, this_obj, ph);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: detach0
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
|
||||
(JNIEnv *env, jobject this_obj) {
|
||||
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
|
||||
if (ph != NULL) {
|
||||
Prelease(ph);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: lookupByName0
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
|
||||
(JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
|
||||
const char *objectName_cstr, *symbolName_cstr;
|
||||
jlong addr;
|
||||
jboolean isCopy;
|
||||
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
|
||||
|
||||
objectName_cstr = NULL;
|
||||
if (objectName != NULL) {
|
||||
objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy);
|
||||
CHECK_EXCEPTION_(0);
|
||||
}
|
||||
symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy);
|
||||
CHECK_EXCEPTION_(0);
|
||||
|
||||
addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr);
|
||||
|
||||
if (objectName_cstr != NULL) {
|
||||
(*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr);
|
||||
}
|
||||
(*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: lookupByAddress0
|
||||
* Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
|
||||
(JNIEnv *env, jobject this_obj, jlong addr) {
|
||||
uintptr_t offset;
|
||||
const char* sym = NULL;
|
||||
|
||||
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
|
||||
sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
|
||||
if (sym == NULL) return 0;
|
||||
return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
|
||||
(*env)->NewStringUTF(env, sym), (jlong)offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: readBytesFromProcess0
|
||||
* Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
|
||||
*/
|
||||
JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
|
||||
(JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
|
||||
|
||||
jboolean isCopy;
|
||||
jbyteArray array;
|
||||
jbyte *bufPtr;
|
||||
ps_err_e err;
|
||||
|
||||
array = (*env)->NewByteArray(env, numBytes);
|
||||
CHECK_EXCEPTION_(0);
|
||||
bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy);
|
||||
CHECK_EXCEPTION_(0);
|
||||
|
||||
err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes);
|
||||
(*env)->ReleaseByteArrayElements(env, array, bufPtr, 0);
|
||||
return (err == PS_OK)? array : 0;
|
||||
}
|
||||
|
||||
JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
|
||||
(JNIEnv *env, jobject this_obj, jint lwp_id) {
|
||||
|
||||
struct reg gregs;
|
||||
jboolean isCopy;
|
||||
jlongArray array;
|
||||
jlong *regs;
|
||||
|
||||
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
|
||||
if (get_lwp_regs(ph, lwp_id, &gregs) != true) {
|
||||
THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0);
|
||||
}
|
||||
|
||||
#undef NPRGREG
|
||||
#ifdef i386
|
||||
#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG
|
||||
#endif
|
||||
#ifdef ia64
|
||||
#define NPRGREG IA64_REG_COUNT
|
||||
#endif
|
||||
#ifdef amd64
|
||||
#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
|
||||
#endif
|
||||
#if defined(sparc) || defined(sparcv9)
|
||||
#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
|
||||
#endif
|
||||
|
||||
array = (*env)->NewLongArray(env, NPRGREG);
|
||||
CHECK_EXCEPTION_(0);
|
||||
regs = (*env)->GetLongArrayElements(env, array, &isCopy);
|
||||
|
||||
#undef REG_INDEX
|
||||
|
||||
#ifdef i386
|
||||
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg
|
||||
|
||||
regs[REG_INDEX(GS)] = (uintptr_t) gregs.r_gs;
|
||||
regs[REG_INDEX(FS)] = (uintptr_t) gregs.r_fs;
|
||||
regs[REG_INDEX(ES)] = (uintptr_t) gregs.r_es;
|
||||
regs[REG_INDEX(DS)] = (uintptr_t) gregs.r_ds;
|
||||
regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi;
|
||||
regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi;
|
||||
regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp;
|
||||
regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp;
|
||||
regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx;
|
||||
regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx;
|
||||
regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx;
|
||||
regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax;
|
||||
regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip;
|
||||
regs[REG_INDEX(CS)] = (uintptr_t) gregs.r_cs;
|
||||
regs[REG_INDEX(SS)] = (uintptr_t) gregs.r_ss;
|
||||
|
||||
#endif /* i386 */
|
||||
|
||||
#if ia64
|
||||
regs = (*env)->GetLongArrayElements(env, array, &isCopy);
|
||||
int i;
|
||||
for (i = 0; i < NPRGREG; i++ ) {
|
||||
regs[i] = 0xDEADDEAD;
|
||||
}
|
||||
#endif /* ia64 */
|
||||
|
||||
#ifdef amd64
|
||||
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg
|
||||
|
||||
regs[REG_INDEX(R15)] = gregs.r_r15;
|
||||
regs[REG_INDEX(R14)] = gregs.r_r14;
|
||||
regs[REG_INDEX(R13)] = gregs.r_r13;
|
||||
regs[REG_INDEX(R12)] = gregs.r_r12;
|
||||
regs[REG_INDEX(RBP)] = gregs.r_rbp;
|
||||
regs[REG_INDEX(RBX)] = gregs.r_rbx;
|
||||
regs[REG_INDEX(R11)] = gregs.r_r11;
|
||||
regs[REG_INDEX(R10)] = gregs.r_r10;
|
||||
regs[REG_INDEX(R9)] = gregs.r_r9;
|
||||
regs[REG_INDEX(R8)] = gregs.r_r8;
|
||||
regs[REG_INDEX(RAX)] = gregs.r_rax;
|
||||
regs[REG_INDEX(RCX)] = gregs.r_rcx;
|
||||
regs[REG_INDEX(RDX)] = gregs.r_rdx;
|
||||
regs[REG_INDEX(RSI)] = gregs.r_rsi;
|
||||
regs[REG_INDEX(RDI)] = gregs.r_rdi;
|
||||
regs[REG_INDEX(RIP)] = gregs.r_rip;
|
||||
regs[REG_INDEX(CS)] = gregs.r_cs;
|
||||
regs[REG_INDEX(RSP)] = gregs.r_rsp;
|
||||
regs[REG_INDEX(SS)] = gregs.r_ss;
|
||||
// regs[REG_INDEX(FSBASE)] = gregs.fs_base;
|
||||
// regs[REG_INDEX(GSBASE)] = gregs.gs_base;
|
||||
// regs[REG_INDEX(DS)] = gregs.ds;
|
||||
// regs[REG_INDEX(ES)] = gregs.es;
|
||||
// regs[REG_INDEX(FS)] = gregs.fs;
|
||||
// regs[REG_INDEX(GS)] = gregs.gs;
|
||||
|
||||
#endif /* amd64 */
|
||||
|
||||
#if defined(sparc) || defined(sparcv9)
|
||||
|
||||
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg
|
||||
|
||||
#ifdef _LP64
|
||||
regs[REG_INDEX(R_PSR)] = gregs.tstate;
|
||||
regs[REG_INDEX(R_PC)] = gregs.tpc;
|
||||
regs[REG_INDEX(R_nPC)] = gregs.tnpc;
|
||||
regs[REG_INDEX(R_Y)] = gregs.y;
|
||||
#else
|
||||
regs[REG_INDEX(R_PSR)] = gregs.psr;
|
||||
regs[REG_INDEX(R_PC)] = gregs.pc;
|
||||
regs[REG_INDEX(R_nPC)] = gregs.npc;
|
||||
regs[REG_INDEX(R_Y)] = gregs.y;
|
||||
#endif
|
||||
regs[REG_INDEX(R_G0)] = 0 ;
|
||||
regs[REG_INDEX(R_G1)] = gregs.u_regs[0];
|
||||
regs[REG_INDEX(R_G2)] = gregs.u_regs[1];
|
||||
regs[REG_INDEX(R_G3)] = gregs.u_regs[2];
|
||||
regs[REG_INDEX(R_G4)] = gregs.u_regs[3];
|
||||
regs[REG_INDEX(R_G5)] = gregs.u_regs[4];
|
||||
regs[REG_INDEX(R_G6)] = gregs.u_regs[5];
|
||||
regs[REG_INDEX(R_G7)] = gregs.u_regs[6];
|
||||
regs[REG_INDEX(R_O0)] = gregs.u_regs[7];
|
||||
regs[REG_INDEX(R_O1)] = gregs.u_regs[8];
|
||||
regs[REG_INDEX(R_O2)] = gregs.u_regs[ 9];
|
||||
regs[REG_INDEX(R_O3)] = gregs.u_regs[10];
|
||||
regs[REG_INDEX(R_O4)] = gregs.u_regs[11];
|
||||
regs[REG_INDEX(R_O5)] = gregs.u_regs[12];
|
||||
regs[REG_INDEX(R_O6)] = gregs.u_regs[13];
|
||||
regs[REG_INDEX(R_O7)] = gregs.u_regs[14];
|
||||
#endif /* sparc */
|
||||
|
||||
|
||||
(*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT);
|
||||
return array;
|
||||
}
|
78
hotspot/agent/src/os/bsd/Makefile
Normal file
78
hotspot/agent/src/os/bsd/Makefile
Normal file
@ -0,0 +1,78 @@
|
||||
#
|
||||
# Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
ARCH := $(shell if ([ `uname -m` = "ia64" ]) ; then echo ia64 ; elif ([ `uname -m` = "amd64" ]) ; then echo amd64; elif ([ `uname -m` = "sparc64" ]) ; then echo sparc; else echo i386 ; fi )
|
||||
GCC = gcc
|
||||
|
||||
JAVAH = ${JAVA_HOME}/bin/javah
|
||||
|
||||
SOURCES = salibelf.c \
|
||||
symtab.c \
|
||||
libproc_impl.c \
|
||||
ps_proc.c \
|
||||
ps_core.c \
|
||||
hsearch_r.c \
|
||||
BsdDebuggerLocal.c
|
||||
|
||||
INCLUDES = -I${JAVA_HOME}/include -I${JAVA_HOME}/include/$(shell uname -s | tr "[:upper:]" "[:lower:]")
|
||||
|
||||
OBJS = $(SOURCES:.c=.o)
|
||||
|
||||
LIBS = -lutil -lthread_db
|
||||
|
||||
CFLAGS = -c -fPIC -g -Wall -D_ALLBSD_SOURCE -D_GNU_SOURCE -D$(ARCH) $(INCLUDES)
|
||||
|
||||
LIBSA = $(ARCH)/libsaproc.so
|
||||
|
||||
all: $(LIBSA)
|
||||
|
||||
BsdDebuggerLocal.o: BsdDebuggerLocal.c
|
||||
$(JAVAH) -jni -classpath ../../../../../build/bsd-i586/hotspot/outputdir/bsd_i486_compiler2/generated/saclasses \
|
||||
sun.jvm.hotspot.debugger.x86.X86ThreadContext \
|
||||
sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
|
||||
$(GCC) $(CFLAGS) $<
|
||||
|
||||
.c.obj:
|
||||
$(GCC) $(CFLAGS)
|
||||
|
||||
ifndef LDNOMAP
|
||||
LFLAGS_LIBSA = -Xlinker --version-script=mapfile
|
||||
endif
|
||||
|
||||
$(LIBSA): $(OBJS) mapfile
|
||||
if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) ; fi
|
||||
$(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
|
||||
|
||||
test.o: $(LIBSA) test.c
|
||||
$(GCC) -c -o test.o -g -D_GNU_SOURCE -D$(ARCH) $(INCLUDES) test.c
|
||||
|
||||
test: test.o
|
||||
$(GCC) -o test test.o -L$(ARCH) -lsaproc $(LIBS)
|
||||
|
||||
clean:
|
||||
rm -f $(LIBSA)
|
||||
rm -f $(OBJS)
|
||||
rm -f test.o
|
||||
-rmdir $(ARCH)
|
||||
|
120
hotspot/agent/src/os/bsd/StubDebuggerLocal.c
Normal file
120
hotspot/agent/src/os/bsd/StubDebuggerLocal.c
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <jni.h>
|
||||
|
||||
#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; }
|
||||
#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;}
|
||||
#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; }
|
||||
#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;}
|
||||
|
||||
static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
|
||||
(*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: init0
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0
|
||||
(JNIEnv *env, jclass cls) {
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize
|
||||
(JNIEnv *env, jclass cls)
|
||||
{
|
||||
#ifdef _LP64
|
||||
return 8;
|
||||
#else
|
||||
return 4;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: attach0
|
||||
* Signature: (I)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I
|
||||
(JNIEnv *env, jobject this_obj, jint jpid) {
|
||||
|
||||
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process");
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: attach0
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2
|
||||
(JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) {
|
||||
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file");
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: detach0
|
||||
* Signature: ()V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0
|
||||
(JNIEnv *env, jobject this_obj) {
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: lookupByName0
|
||||
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0
|
||||
(JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: lookupByAddress0
|
||||
* Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
|
||||
(JNIEnv *env, jobject this_obj, jlong addr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
|
||||
* Method: readBytesFromProcess0
|
||||
* Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
|
||||
*/
|
||||
JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0
|
||||
(JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0
|
||||
(JNIEnv *env, jobject this_obj, jint lwp_id) {
|
||||
return 0;
|
||||
}
|
58
hotspot/agent/src/os/bsd/elfmacros.h
Normal file
58
hotspot/agent/src/os/bsd/elfmacros.h
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ELFMACROS_H_
|
||||
#define _ELFMACROS_H_
|
||||
|
||||
#define ELF_NHDR Elf_Note
|
||||
|
||||
#if defined(_LP64)
|
||||
#define ELF_EHDR Elf64_Ehdr
|
||||
#define ELF_SHDR Elf64_Shdr
|
||||
#define ELF_PHDR Elf64_Phdr
|
||||
#define ELF_SYM Elf64_Sym
|
||||
#define ELF_DYN Elf64_Dyn
|
||||
#define ELF_ADDR Elf64_Addr
|
||||
|
||||
#ifndef ELF_ST_TYPE
|
||||
#define ELF_ST_TYPE ELF64_ST_TYPE
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define ELF_EHDR Elf32_Ehdr
|
||||
#define ELF_SHDR Elf32_Shdr
|
||||
#define ELF_PHDR Elf32_Phdr
|
||||
#define ELF_SYM Elf32_Sym
|
||||
#define ELF_DYN Elf32_Dyn
|
||||
#define ELF_ADDR Elf32_Addr
|
||||
|
||||
#ifndef ELF_ST_TYPE
|
||||
#define ELF_ST_TYPE ELF32_ST_TYPE
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _ELFMACROS_H_ */
|
127
hotspot/agent/src/os/bsd/libproc.h
Normal file
127
hotspot/agent/src/os/bsd/libproc.h
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LIBPROC_H_
|
||||
#define _LIBPROC_H_
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <machine/reg.h>
|
||||
#include <proc_service.h>
|
||||
|
||||
#if defined(sparc) || defined(sparcv9)
|
||||
/*
|
||||
If _LP64 is defined ptrace.h should be taken from /usr/include/asm-sparc64
|
||||
otherwise it should be from /usr/include/asm-sparc
|
||||
These two files define pt_regs structure differently
|
||||
*/
|
||||
#ifdef _LP64
|
||||
#include "asm-sparc64/ptrace.h"
|
||||
#else
|
||||
#include "asm-sparc/ptrace.h"
|
||||
#endif
|
||||
|
||||
#endif //sparc or sparcv9
|
||||
|
||||
/************************************************************************************
|
||||
|
||||
0. This is very minimal subset of Solaris libproc just enough for current application.
|
||||
Please note that the bulk of the functionality is from proc_service interface. This
|
||||
adds Pgrab__ and some missing stuff. We hide the difference b/w live process and core
|
||||
file by this interface.
|
||||
|
||||
1. pthread_id is unique. We store this in OSThread::_pthread_id in JVM code.
|
||||
|
||||
2. All threads see the same pid when they call getpid().
|
||||
We used to save the result of ::getpid() call in OSThread::_thread_id.
|
||||
Because gettid returns actual pid of thread (lwp id), this is
|
||||
unique again. We therefore use OSThread::_thread_id as unique identifier.
|
||||
|
||||
3. There is a unique LWP id under both thread libraries. libthread_db maps pthread_id
|
||||
to its underlying lwp_id under both the thread libraries. thread_info.lwp_id stores
|
||||
lwp_id of the thread. The lwp id is nothing but the actual pid of clone'd processes. But
|
||||
unfortunately libthread_db does not work very well for core dumps. So, we get pthread_id
|
||||
only for processes. For core dumps, we don't use libthread_db at all (like gdb).
|
||||
|
||||
4. ptrace operates on this LWP id under both the thread libraries. When we say 'pid' for
|
||||
ptrace call, we refer to lwp_id of the thread.
|
||||
|
||||
5. for core file, we parse ELF files and read data from them. For processes we use
|
||||
combination of ptrace and /proc calls.
|
||||
|
||||
*************************************************************************************/
|
||||
|
||||
// This C bool type must be int for compatibility with BSD calls and
|
||||
// it would be a mistake to equivalence it to C++ bool on many platforms
|
||||
|
||||
typedef int bool;
|
||||
#define true 1
|
||||
#define false 0
|
||||
|
||||
struct ps_prochandle;
|
||||
|
||||
// attach to a process
|
||||
struct ps_prochandle* Pgrab(pid_t pid);
|
||||
|
||||
// attach to a core dump
|
||||
struct ps_prochandle* Pgrab_core(const char* execfile, const char* corefile);
|
||||
|
||||
// release a process or core
|
||||
void Prelease(struct ps_prochandle* ph);
|
||||
|
||||
// functions not directly available in Solaris libproc
|
||||
|
||||
// initialize libproc (call this only once per app)
|
||||
// pass true to make library verbose
|
||||
bool init_libproc(bool verbose);
|
||||
|
||||
// get number of threads
|
||||
int get_num_threads(struct ps_prochandle* ph);
|
||||
|
||||
// get lwp_id of n'th thread
|
||||
lwpid_t get_lwp_id(struct ps_prochandle* ph, int index);
|
||||
|
||||
// get regs for a given lwp
|
||||
bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct reg* regs);
|
||||
|
||||
// get number of shared objects
|
||||
int get_num_libs(struct ps_prochandle* ph);
|
||||
|
||||
// get name of n'th lib
|
||||
const char* get_lib_name(struct ps_prochandle* ph, int index);
|
||||
|
||||
// get base of lib
|
||||
uintptr_t get_lib_base(struct ps_prochandle* ph, int index);
|
||||
|
||||
// returns true if given library is found in lib list
|
||||
bool find_lib(struct ps_prochandle* ph, const char *lib_name);
|
||||
|
||||
// symbol lookup
|
||||
uintptr_t lookup_symbol(struct ps_prochandle* ph, const char* object_name,
|
||||
const char* sym_name);
|
||||
|
||||
// address->nearest symbol lookup. return NULL for no symbol
|
||||
const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset);
|
||||
|
||||
#endif //__LIBPROC_H_
|
452
hotspot/agent/src/os/bsd/libproc_impl.c
Normal file
452
hotspot/agent/src/os/bsd/libproc_impl.c
Normal file
@ -0,0 +1,452 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <thread_db.h>
|
||||
#include "libproc_impl.h"
|
||||
|
||||
static const char* alt_root = NULL;
|
||||
static int alt_root_len = -1;
|
||||
|
||||
#define SA_ALTROOT "SA_ALTROOT"
|
||||
|
||||
static void init_alt_root() {
|
||||
if (alt_root_len == -1) {
|
||||
alt_root = getenv(SA_ALTROOT);
|
||||
if (alt_root) {
|
||||
alt_root_len = strlen(alt_root);
|
||||
} else {
|
||||
alt_root_len = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int pathmap_open(const char* name) {
|
||||
int fd;
|
||||
char alt_path[PATH_MAX + 1];
|
||||
|
||||
init_alt_root();
|
||||
fd = open(name, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
return fd;
|
||||
}
|
||||
|
||||
if (alt_root_len > 0) {
|
||||
strcpy(alt_path, alt_root);
|
||||
strcat(alt_path, name);
|
||||
fd = open(alt_path, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
print_debug("path %s substituted for %s\n", alt_path, name);
|
||||
return fd;
|
||||
}
|
||||
|
||||
if (strrchr(name, '/')) {
|
||||
strcpy(alt_path, alt_root);
|
||||
strcat(alt_path, strrchr(name, '/'));
|
||||
fd = open(alt_path, O_RDONLY);
|
||||
if (fd >= 0) {
|
||||
print_debug("path %s substituted for %s\n", alt_path, name);
|
||||
return fd;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static bool _libsaproc_debug;
|
||||
|
||||
void print_debug(const char* format,...) {
|
||||
if (_libsaproc_debug) {
|
||||
va_list alist;
|
||||
|
||||
va_start(alist, format);
|
||||
fputs("libsaproc DEBUG: ", stderr);
|
||||
vfprintf(stderr, format, alist);
|
||||
va_end(alist);
|
||||
}
|
||||
}
|
||||
|
||||
bool is_debug() {
|
||||
return _libsaproc_debug;
|
||||
}
|
||||
|
||||
// initialize libproc
|
||||
bool init_libproc(bool debug) {
|
||||
// init debug mode
|
||||
_libsaproc_debug = debug;
|
||||
|
||||
// initialize the thread_db library
|
||||
if (td_init() != TD_OK) {
|
||||
print_debug("libthread_db's td_init failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void destroy_lib_info(struct ps_prochandle* ph) {
|
||||
lib_info* lib = ph->libs;
|
||||
while (lib) {
|
||||
lib_info *next = lib->next;
|
||||
if (lib->symtab) {
|
||||
destroy_symtab(lib->symtab);
|
||||
}
|
||||
free(lib);
|
||||
lib = next;
|
||||
}
|
||||
}
|
||||
|
||||
static void destroy_thread_info(struct ps_prochandle* ph) {
|
||||
thread_info* thr = ph->threads;
|
||||
while (thr) {
|
||||
thread_info *next = thr->next;
|
||||
free(thr);
|
||||
thr = next;
|
||||
}
|
||||
}
|
||||
|
||||
// ps_prochandle cleanup
|
||||
|
||||
// ps_prochandle cleanup
|
||||
void Prelease(struct ps_prochandle* ph) {
|
||||
// do the "derived class" clean-up first
|
||||
ph->ops->release(ph);
|
||||
destroy_lib_info(ph);
|
||||
destroy_thread_info(ph);
|
||||
free(ph);
|
||||
}
|
||||
|
||||
lib_info* add_lib_info(struct ps_prochandle* ph, const char* libname, uintptr_t base) {
|
||||
return add_lib_info_fd(ph, libname, -1, base);
|
||||
}
|
||||
|
||||
lib_info* add_lib_info_fd(struct ps_prochandle* ph, const char* libname, int fd, uintptr_t base) {
|
||||
lib_info* newlib;
|
||||
|
||||
if ( (newlib = (lib_info*) calloc(1, sizeof(struct lib_info))) == NULL) {
|
||||
print_debug("can't allocate memory for lib_info\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strncpy(newlib->name, libname, sizeof(newlib->name));
|
||||
newlib->base = base;
|
||||
|
||||
if (fd == -1) {
|
||||
if ( (newlib->fd = pathmap_open(newlib->name)) < 0) {
|
||||
print_debug("can't open shared object %s\n", newlib->name);
|
||||
free(newlib);
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
newlib->fd = fd;
|
||||
}
|
||||
|
||||
// check whether we have got an ELF file. /proc/<pid>/map
|
||||
// gives out all file mappings and not just shared objects
|
||||
if (is_elf_file(newlib->fd) == false) {
|
||||
close(newlib->fd);
|
||||
free(newlib);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
newlib->symtab = build_symtab(newlib->fd);
|
||||
if (newlib->symtab == NULL) {
|
||||
print_debug("symbol table build failed for %s\n", newlib->name);
|
||||
}
|
||||
else {
|
||||
print_debug("built symbol table for %s\n", newlib->name);
|
||||
}
|
||||
|
||||
// even if symbol table building fails, we add the lib_info.
|
||||
// This is because we may need to read from the ELF file for core file
|
||||
// address read functionality. lookup_symbol checks for NULL symtab.
|
||||
if (ph->libs) {
|
||||
ph->lib_tail->next = newlib;
|
||||
ph->lib_tail = newlib;
|
||||
} else {
|
||||
ph->libs = ph->lib_tail = newlib;
|
||||
}
|
||||
ph->num_libs++;
|
||||
|
||||
return newlib;
|
||||
}
|
||||
|
||||
// lookup for a specific symbol
|
||||
uintptr_t lookup_symbol(struct ps_prochandle* ph, const char* object_name,
|
||||
const char* sym_name) {
|
||||
// ignore object_name. search in all libraries
|
||||
// FIXME: what should we do with object_name?? The library names are obtained
|
||||
// by parsing /proc/<pid>/maps, which may not be the same as object_name.
|
||||
// What we need is a utility to map object_name to real file name, something
|
||||
// dlopen() does by looking at LD_LIBRARY_PATH and /etc/ld.so.cache. For
|
||||
// now, we just ignore object_name and do a global search for the symbol.
|
||||
|
||||
lib_info* lib = ph->libs;
|
||||
while (lib) {
|
||||
if (lib->symtab) {
|
||||
uintptr_t res = search_symbol(lib->symtab, lib->base, sym_name, NULL);
|
||||
if (res) return res;
|
||||
}
|
||||
lib = lib->next;
|
||||
}
|
||||
|
||||
print_debug("lookup failed for symbol '%s' in obj '%s'\n",
|
||||
sym_name, object_name);
|
||||
return (uintptr_t) NULL;
|
||||
}
|
||||
|
||||
|
||||
const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset) {
|
||||
const char* res = NULL;
|
||||
lib_info* lib = ph->libs;
|
||||
while (lib) {
|
||||
if (lib->symtab && addr >= lib->base) {
|
||||
res = nearest_symbol(lib->symtab, addr - lib->base, poffset);
|
||||
if (res) return res;
|
||||
}
|
||||
lib = lib->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// add a thread to ps_prochandle
|
||||
thread_info* add_thread_info(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
|
||||
thread_info* newthr;
|
||||
if ( (newthr = (thread_info*) calloc(1, sizeof(thread_info))) == NULL) {
|
||||
print_debug("can't allocate memory for thread_info\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// initialize thread info
|
||||
newthr->pthread_id = pthread_id;
|
||||
newthr->lwp_id = lwp_id;
|
||||
|
||||
// add new thread to the list
|
||||
newthr->next = ph->threads;
|
||||
ph->threads = newthr;
|
||||
ph->num_threads++;
|
||||
return newthr;
|
||||
}
|
||||
|
||||
|
||||
// struct used for client data from thread_db callback
|
||||
struct thread_db_client_data {
|
||||
struct ps_prochandle* ph;
|
||||
thread_info_callback callback;
|
||||
};
|
||||
|
||||
// callback function for libthread_db
|
||||
static int thread_db_callback(const td_thrhandle_t *th_p, void *data) {
|
||||
struct thread_db_client_data* ptr = (struct thread_db_client_data*) data;
|
||||
td_thrinfo_t ti;
|
||||
td_err_e err;
|
||||
|
||||
memset(&ti, 0, sizeof(ti));
|
||||
err = td_thr_get_info(th_p, &ti);
|
||||
if (err != TD_OK) {
|
||||
print_debug("libthread_db : td_thr_get_info failed, can't get thread info\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
print_debug("thread_db : pthread %d (lwp %d)\n", ti.ti_tid, ti.ti_lid);
|
||||
|
||||
if (ptr->callback(ptr->ph, (pthread_t)ti.ti_tid, ti.ti_lid) != true)
|
||||
return TD_ERR;
|
||||
|
||||
return TD_OK;
|
||||
}
|
||||
|
||||
// read thread_info using libthread_db
|
||||
bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb) {
|
||||
struct thread_db_client_data mydata;
|
||||
td_thragent_t* thread_agent = NULL;
|
||||
if (td_ta_new(ph, &thread_agent) != TD_OK) {
|
||||
print_debug("can't create libthread_db agent\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
mydata.ph = ph;
|
||||
mydata.callback = cb;
|
||||
|
||||
// we use libthread_db iterator to iterate thru list of threads.
|
||||
if (td_ta_thr_iter(thread_agent, thread_db_callback, &mydata,
|
||||
TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
|
||||
TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS) != TD_OK) {
|
||||
td_ta_delete(thread_agent);
|
||||
return false;
|
||||
}
|
||||
|
||||
// delete thread agent
|
||||
td_ta_delete(thread_agent);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// get number of threads
|
||||
int get_num_threads(struct ps_prochandle* ph) {
|
||||
return ph->num_threads;
|
||||
}
|
||||
|
||||
// get lwp_id of n'th thread
|
||||
lwpid_t get_lwp_id(struct ps_prochandle* ph, int index) {
|
||||
int count = 0;
|
||||
thread_info* thr = ph->threads;
|
||||
while (thr) {
|
||||
if (count == index) {
|
||||
return thr->lwp_id;
|
||||
}
|
||||
count++;
|
||||
thr = thr->next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get regs for a given lwp
|
||||
bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs) {
|
||||
return ph->ops->get_lwp_regs(ph, lwp_id, regs);
|
||||
}
|
||||
|
||||
// get number of shared objects
|
||||
int get_num_libs(struct ps_prochandle* ph) {
|
||||
return ph->num_libs;
|
||||
}
|
||||
|
||||
// get name of n'th solib
|
||||
const char* get_lib_name(struct ps_prochandle* ph, int index) {
|
||||
int count = 0;
|
||||
lib_info* lib = ph->libs;
|
||||
while (lib) {
|
||||
if (count == index) {
|
||||
return lib->name;
|
||||
}
|
||||
count++;
|
||||
lib = lib->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// get base address of a lib
|
||||
uintptr_t get_lib_base(struct ps_prochandle* ph, int index) {
|
||||
int count = 0;
|
||||
lib_info* lib = ph->libs;
|
||||
while (lib) {
|
||||
if (count == index) {
|
||||
return lib->base;
|
||||
}
|
||||
count++;
|
||||
lib = lib->next;
|
||||
}
|
||||
return (uintptr_t)NULL;
|
||||
}
|
||||
|
||||
bool find_lib(struct ps_prochandle* ph, const char *lib_name) {
|
||||
lib_info *p = ph->libs;
|
||||
while (p) {
|
||||
if (strcmp(p->name, lib_name) == 0) {
|
||||
return true;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// proc service functions
|
||||
|
||||
// ps_pglobal_lookup() looks up the symbol sym_name in the symbol table
|
||||
// of the load object object_name in the target process identified by ph.
|
||||
// It returns the symbol's value as an address in the target process in
|
||||
// *sym_addr.
|
||||
|
||||
ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name,
|
||||
const char *sym_name, psaddr_t *sym_addr) {
|
||||
*sym_addr = (psaddr_t) lookup_symbol(ph, object_name, sym_name);
|
||||
return (*sym_addr ? PS_OK : PS_NOSYM);
|
||||
}
|
||||
|
||||
// read "size" bytes info "buf" from address "addr"
|
||||
ps_err_e ps_pread(struct ps_prochandle *ph, psaddr_t addr,
|
||||
void *buf, size_t size) {
|
||||
return ph->ops->p_pread(ph, (uintptr_t) addr, buf, size)? PS_OK: PS_ERR;
|
||||
}
|
||||
|
||||
// write "size" bytes of data to debuggee at address "addr"
|
||||
ps_err_e ps_pwrite(struct ps_prochandle *ph, psaddr_t addr,
|
||||
const void *buf, size_t size) {
|
||||
return ph->ops->p_pwrite(ph, (uintptr_t)addr, buf, size)? PS_OK: PS_ERR;
|
||||
}
|
||||
|
||||
// fill in ptrace_lwpinfo for lid
|
||||
ps_err_e ps_linfo(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
|
||||
return ph->ops->get_lwp_info(ph, lwp_id, linfo)? PS_OK: PS_ERR;
|
||||
}
|
||||
|
||||
// needed for when libthread_db is compiled with TD_DEBUG defined
|
||||
void
|
||||
ps_plog (const char *format, ...)
|
||||
{
|
||||
va_list alist;
|
||||
|
||||
va_start(alist, format);
|
||||
vfprintf(stderr, format, alist);
|
||||
va_end(alist);
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
// Functions below this point are not yet implemented. They are here only
|
||||
// to make the linker happy.
|
||||
|
||||
ps_err_e ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lid, const prfpregset_t *fpregs) {
|
||||
print_debug("ps_lsetfpregs not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
||||
|
||||
ps_err_e ps_lsetregs(struct ps_prochandle *ph, lwpid_t lid, const prgregset_t gregset) {
|
||||
print_debug("ps_lsetregs not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
||||
|
||||
ps_err_e ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lid, prfpregset_t *fpregs) {
|
||||
print_debug("ps_lgetfpregs not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
||||
|
||||
ps_err_e ps_lgetregs(struct ps_prochandle *ph, lwpid_t lid, prgregset_t gregset) {
|
||||
print_debug("ps_lgetfpregs not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
||||
|
||||
ps_err_e ps_lstop(struct ps_prochandle *ph, lwpid_t lid) {
|
||||
print_debug("ps_lstop not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
||||
|
||||
ps_err_e ps_pcontinue(struct ps_prochandle *ph) {
|
||||
print_debug("ps_pcontinue not implemented\n");
|
||||
return PS_OK;
|
||||
}
|
130
hotspot/agent/src/os/bsd/libproc_impl.h
Normal file
130
hotspot/agent/src/os/bsd/libproc_impl.h
Normal file
@ -0,0 +1,130 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LIBPROC_IMPL_H_
|
||||
#define _LIBPROC_IMPL_H_
|
||||
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
#include "libproc.h"
|
||||
#include "symtab.h"
|
||||
|
||||
// data structures in this file mimic those of Solaris 8.0 - libproc's Pcontrol.h
|
||||
|
||||
#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
|
||||
|
||||
// list of shared objects
|
||||
typedef struct lib_info {
|
||||
char name[BUF_SIZE];
|
||||
uintptr_t base;
|
||||
struct symtab* symtab;
|
||||
int fd; // file descriptor for lib
|
||||
struct lib_info* next;
|
||||
} lib_info;
|
||||
|
||||
// list of threads
|
||||
typedef struct thread_info {
|
||||
lwpid_t lwp_id;
|
||||
pthread_t pthread_id; // not used cores, always -1
|
||||
struct reg regs; // not for process, core uses for caching regset
|
||||
struct thread_info* next;
|
||||
} thread_info;
|
||||
|
||||
// list of virtual memory maps
|
||||
typedef struct map_info {
|
||||
int fd; // file descriptor
|
||||
off_t offset; // file offset of this mapping
|
||||
uintptr_t vaddr; // starting virtual address
|
||||
size_t memsz; // size of the mapping
|
||||
struct map_info* next;
|
||||
} map_info;
|
||||
|
||||
// vtable for ps_prochandle
|
||||
typedef struct ps_prochandle_ops {
|
||||
// "derived class" clean-up
|
||||
void (*release)(struct ps_prochandle* ph);
|
||||
// read from debuggee
|
||||
bool (*p_pread)(struct ps_prochandle *ph,
|
||||
uintptr_t addr, char *buf, size_t size);
|
||||
// write into debuggee
|
||||
bool (*p_pwrite)(struct ps_prochandle *ph,
|
||||
uintptr_t addr, const char *buf , size_t size);
|
||||
// get integer regset of a thread
|
||||
bool (*get_lwp_regs)(struct ps_prochandle* ph, lwpid_t lwp_id, struct reg* regs);
|
||||
// get info on thread
|
||||
bool (*get_lwp_info)(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo);
|
||||
} ps_prochandle_ops;
|
||||
|
||||
// the ps_prochandle
|
||||
|
||||
struct core_data {
|
||||
int core_fd; // file descriptor of core file
|
||||
int exec_fd; // file descriptor of exec file
|
||||
int interp_fd; // file descriptor of interpreter (ld-elf.so.1)
|
||||
// part of the class sharing workaround
|
||||
int classes_jsa_fd; // file descriptor of class share archive
|
||||
uintptr_t dynamic_addr; // address of dynamic section of a.out
|
||||
uintptr_t ld_base_addr; // base address of ld.so
|
||||
size_t num_maps; // number of maps.
|
||||
map_info* maps; // maps in a linked list
|
||||
// part of the class sharing workaround
|
||||
map_info* class_share_maps;// class share maps in a linked list
|
||||
map_info** map_array; // sorted (by vaddr) array of map_info pointers
|
||||
};
|
||||
|
||||
struct ps_prochandle {
|
||||
ps_prochandle_ops* ops; // vtable ptr
|
||||
pid_t pid;
|
||||
int num_libs;
|
||||
lib_info* libs; // head of lib list
|
||||
lib_info* lib_tail; // tail of lib list - to append at the end
|
||||
int num_threads;
|
||||
thread_info* threads; // head of thread list
|
||||
struct core_data* core; // data only used for core dumps, NULL for process
|
||||
};
|
||||
|
||||
int pathmap_open(const char* name);
|
||||
|
||||
void print_debug(const char* format,...);
|
||||
bool is_debug();
|
||||
|
||||
typedef bool (*thread_info_callback)(struct ps_prochandle* ph, pthread_t pid, lwpid_t lwpid);
|
||||
|
||||
// reads thread info using libthread_db and calls above callback for each thread
|
||||
bool read_thread_info(struct ps_prochandle* ph, thread_info_callback cb);
|
||||
|
||||
// adds a new shared object to lib list, returns NULL on failure
|
||||
lib_info* add_lib_info(struct ps_prochandle* ph, const char* libname, uintptr_t base);
|
||||
|
||||
// adds a new shared object to lib list, supply open lib file descriptor as well
|
||||
lib_info* add_lib_info_fd(struct ps_prochandle* ph, const char* libname, int fd,
|
||||
uintptr_t base);
|
||||
|
||||
// adds a new thread to threads list, returns NULL on failure
|
||||
thread_info* add_thread_info(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id);
|
||||
|
||||
// a test for ELF signature without using libelf
|
||||
bool is_elf_file(int fd);
|
||||
|
||||
#endif //_LIBPROC_IMPL_H_
|
66
hotspot/agent/src/os/bsd/mapfile
Normal file
66
hotspot/agent/src/os/bsd/mapfile
Normal file
@ -0,0 +1,66 @@
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Define public interface.
|
||||
|
||||
SUNWprivate_1.1 {
|
||||
global:
|
||||
|
||||
# native methods of BsdDebuggerLocal class
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0;
|
||||
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0;
|
||||
|
||||
# proc_service.h functions - to be used by libthread_db
|
||||
ps_getpid;
|
||||
ps_pglobal_lookup;
|
||||
ps_pread;
|
||||
ps_pwrite;
|
||||
ps_lsetfpregs;
|
||||
ps_lsetregs;
|
||||
ps_lgetfpregs;
|
||||
ps_lgetregs;
|
||||
ps_lcontinue;
|
||||
ps_lgetxmmregs;
|
||||
ps_lsetxmmregs;
|
||||
ps_lstop;
|
||||
ps_linfo;
|
||||
|
||||
# used by attach test program
|
||||
init_libproc;
|
||||
Pgrab;
|
||||
Pgrab_core;
|
||||
Prelease;
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
1023
hotspot/agent/src/os/bsd/ps_core.c
Normal file
1023
hotspot/agent/src/os/bsd/ps_core.c
Normal file
File diff suppressed because it is too large
Load Diff
444
hotspot/agent/src/os/bsd/ps_proc.c
Normal file
444
hotspot/agent/src/os/bsd/ps_proc.c
Normal file
@ -0,0 +1,444 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/user.h>
|
||||
#include <elf.h>
|
||||
#include <sys/elf_common.h>
|
||||
#include <sys/link_elf.h>
|
||||
#include <libutil.h>
|
||||
#include "libproc_impl.h"
|
||||
#include "elfmacros.h"
|
||||
|
||||
// This file has the libproc implementation specific to live process
|
||||
// For core files, refer to ps_core.c
|
||||
|
||||
static inline uintptr_t align(uintptr_t ptr, size_t size) {
|
||||
return (ptr & ~(size - 1));
|
||||
}
|
||||
|
||||
// ---------------------------------------------
|
||||
// ptrace functions
|
||||
// ---------------------------------------------
|
||||
|
||||
// read "size" bytes of data from "addr" within the target process.
|
||||
// unlike the standard ptrace() function, process_read_data() can handle
|
||||
// unaligned address - alignment check, if required, should be done
|
||||
// before calling process_read_data.
|
||||
|
||||
static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) {
|
||||
int rslt;
|
||||
size_t i, words;
|
||||
uintptr_t end_addr = addr + size;
|
||||
uintptr_t aligned_addr = align(addr, sizeof(int));
|
||||
|
||||
if (aligned_addr != addr) {
|
||||
char *ptr = (char *)&rslt;
|
||||
errno = 0;
|
||||
rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
|
||||
if (errno) {
|
||||
print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
|
||||
return false;
|
||||
}
|
||||
for (; aligned_addr != addr; aligned_addr++, ptr++);
|
||||
for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr;
|
||||
aligned_addr++)
|
||||
*(buf++) = *(ptr++);
|
||||
}
|
||||
|
||||
words = (end_addr - aligned_addr) / sizeof(int);
|
||||
|
||||
// assert((intptr_t)aligned_addr % sizeof(int) == 0);
|
||||
for (i = 0; i < words; i++) {
|
||||
errno = 0;
|
||||
rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
|
||||
if (errno) {
|
||||
print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
|
||||
return false;
|
||||
}
|
||||
*(int *)buf = rslt;
|
||||
buf += sizeof(int);
|
||||
aligned_addr += sizeof(int);
|
||||
}
|
||||
|
||||
if (aligned_addr != end_addr) {
|
||||
char *ptr = (char *)&rslt;
|
||||
errno = 0;
|
||||
rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0);
|
||||
if (errno) {
|
||||
print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr);
|
||||
return false;
|
||||
}
|
||||
for (; aligned_addr != end_addr; aligned_addr++)
|
||||
*(buf++) = *(ptr++);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// null implementation for write
|
||||
static bool process_write_data(struct ps_prochandle* ph,
|
||||
uintptr_t addr, const char *buf , size_t size) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// "user" should be a pointer to a reg
|
||||
static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) {
|
||||
// we have already attached to all thread 'pid's, just use ptrace call
|
||||
// to get regset now. Note that we don't cache regset upfront for processes.
|
||||
if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) {
|
||||
print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// fill in ptrace_lwpinfo for lid
|
||||
static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) {
|
||||
errno = 0;
|
||||
ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo));
|
||||
|
||||
return (errno == 0)? true: false;
|
||||
}
|
||||
|
||||
// attach to a process/thread specified by "pid"
|
||||
static bool ptrace_attach(pid_t pid) {
|
||||
if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) {
|
||||
print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid);
|
||||
return false;
|
||||
} else {
|
||||
int ret;
|
||||
int status;
|
||||
do {
|
||||
// Wait for debuggee to stop.
|
||||
ret = waitpid(pid, &status, 0);
|
||||
if (ret >= 0) {
|
||||
if (WIFSTOPPED(status)) {
|
||||
// Debuggee stopped.
|
||||
return true;
|
||||
} else {
|
||||
print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
switch (errno) {
|
||||
case EINTR:
|
||||
continue;
|
||||
break;
|
||||
case ECHILD:
|
||||
print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid);
|
||||
break;
|
||||
case EINVAL:
|
||||
print_debug("waitpid() failed. Invalid options argument.\n");
|
||||
break;
|
||||
default:
|
||||
print_debug("waitpid() failed. Unexpected error %d\n",errno);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} while(true);
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------
|
||||
// functions for obtaining library information
|
||||
// -------------------------------------------------------
|
||||
|
||||
// callback for read_thread_info
|
||||
static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) {
|
||||
return add_thread_info(ph, pthread_id, lwp_id) != NULL;
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version < 701000
|
||||
/*
|
||||
* TEXT_START_ADDR from binutils/ld/emulparams/<arch_spec>.sh
|
||||
* Not the most robust but good enough.
|
||||
*/
|
||||
|
||||
#if defined(amd64) || defined(x86_64)
|
||||
#define TEXT_START_ADDR 0x400000
|
||||
#elif defined(i386)
|
||||
#define TEXT_START_ADDR 0x8048000
|
||||
#else
|
||||
#error TEXT_START_ADDR not defined
|
||||
#endif
|
||||
|
||||
#define BUF_SIZE (PATH_MAX + NAME_MAX + 1)
|
||||
|
||||
uintptr_t linkmap_addr(struct ps_prochandle *ph) {
|
||||
uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr;
|
||||
ELF_EHDR ehdr;
|
||||
ELF_PHDR *phdrs, *phdr;
|
||||
ELF_DYN *dyns, *dyn;
|
||||
struct r_debug dmap;
|
||||
unsigned long hdrs_size;
|
||||
unsigned int i;
|
||||
|
||||
/* read ELF_EHDR at TEXT_START_ADDR and validate */
|
||||
|
||||
ehdr_addr = (uintptr_t)TEXT_START_ADDR;
|
||||
|
||||
if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) {
|
||||
print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!IS_ELF(ehdr) ||
|
||||
ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS ||
|
||||
ehdr.e_ident[EI_DATA] != ELF_TARG_DATA ||
|
||||
ehdr.e_ident[EI_VERSION] != EV_CURRENT ||
|
||||
ehdr.e_phentsize != sizeof(ELF_PHDR) ||
|
||||
ehdr.e_version != ELF_TARG_VER ||
|
||||
ehdr.e_machine != ELF_TARG_MACH) {
|
||||
print_debug("not an ELF_EHDR at %p\n", ehdr_addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* allocate space for all ELF_PHDR's and read */
|
||||
|
||||
phdr_addr = ehdr_addr + ehdr.e_phoff;
|
||||
hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR);
|
||||
|
||||
if ((phdrs = malloc(hdrs_size)) == NULL)
|
||||
return (0);
|
||||
|
||||
if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) {
|
||||
print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* find PT_DYNAMIC section */
|
||||
|
||||
for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) {
|
||||
if (phdr->p_type == PT_DYNAMIC)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i >= ehdr.e_phnum) {
|
||||
print_debug("PT_DYNAMIC section not found!\n");
|
||||
free(phdrs);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* allocate space and read in ELF_DYN headers */
|
||||
|
||||
dyn_addr = phdr->p_vaddr;
|
||||
hdrs_size = phdr->p_memsz;
|
||||
free(phdrs);
|
||||
|
||||
if ((dyns = malloc(hdrs_size)) == NULL)
|
||||
return (0);
|
||||
|
||||
if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) {
|
||||
print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr);
|
||||
free(dyns);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* find DT_DEBUG */
|
||||
|
||||
dyn = dyns;
|
||||
while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) {
|
||||
dyn++;
|
||||
}
|
||||
|
||||
if (dyn->d_tag != DT_DEBUG) {
|
||||
print_debug("failed to find DT_DEBUG\n");
|
||||
free(dyns);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* read struct r_debug into dmap */
|
||||
|
||||
dmap_addr = (uintptr_t)dyn->d_un.d_ptr;
|
||||
free(dyns);
|
||||
|
||||
if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) {
|
||||
print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr);
|
||||
return (0);
|
||||
}
|
||||
|
||||
lmap_addr = (uintptr_t)dmap.r_map;
|
||||
|
||||
return (lmap_addr);
|
||||
}
|
||||
#endif // __FreeBSD__ && __FreeBSD_version < 701000
|
||||
|
||||
static bool read_lib_info(struct ps_prochandle* ph) {
|
||||
#if defined(__FreeBSD__) && __FreeBSD_version >= 701000
|
||||
struct kinfo_vmentry *freep, *kve;
|
||||
int i, cnt;
|
||||
|
||||
freep = kinfo_getvmmap(ph->pid, &cnt);
|
||||
if (freep == NULL) {
|
||||
print_debug("can't get vm map for pid\n", ph->pid);
|
||||
return false;
|
||||
}
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
kve = &freep[i];
|
||||
if ((kve->kve_flags & KVME_FLAG_COW) &&
|
||||
kve->kve_path != NULL &&
|
||||
strlen(kve->kve_path) > 0) {
|
||||
|
||||
if (find_lib(ph, kve->kve_path) == false) {
|
||||
lib_info* lib;
|
||||
if ((lib = add_lib_info(ph, kve->kve_path,
|
||||
(uintptr_t) kve->kve_start)) == NULL)
|
||||
continue; // ignore, add_lib_info prints error
|
||||
|
||||
// we don't need to keep the library open, symtab is already
|
||||
// built. Only for core dump we need to keep the fd open.
|
||||
close(lib->fd);
|
||||
lib->fd = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(freep);
|
||||
|
||||
return true;
|
||||
#else
|
||||
char *l_name;
|
||||
struct link_map *lmap;
|
||||
uintptr_t lmap_addr;
|
||||
|
||||
if ((l_name = malloc(BUF_SIZE)) == NULL)
|
||||
return false;
|
||||
|
||||
if ((lmap = malloc(sizeof(*lmap))) == NULL) {
|
||||
free(l_name);
|
||||
return false;
|
||||
}
|
||||
|
||||
lmap_addr = linkmap_addr(ph);
|
||||
|
||||
if (lmap_addr == 0) {
|
||||
free(l_name);
|
||||
free(lmap);
|
||||
return false;
|
||||
}
|
||||
|
||||
do {
|
||||
if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) {
|
||||
print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr);
|
||||
free (l_name);
|
||||
free (lmap);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name,
|
||||
BUF_SIZE) != true) {
|
||||
print_debug("process_read_data failed for lmap->l_name %p\n",
|
||||
lmap->l_name);
|
||||
free (l_name);
|
||||
free (lmap);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (find_lib(ph, l_name) == false) {
|
||||
lib_info* lib;
|
||||
if ((lib = add_lib_info(ph, l_name,
|
||||
(uintptr_t) lmap->l_addr)) == NULL)
|
||||
continue; // ignore, add_lib_info prints error
|
||||
|
||||
// we don't need to keep the library open, symtab is already
|
||||
// built. Only for core dump we need to keep the fd open.
|
||||
close(lib->fd);
|
||||
lib->fd = -1;
|
||||
}
|
||||
lmap_addr = (uintptr_t)lmap->l_next;
|
||||
} while (lmap->l_next != NULL);
|
||||
|
||||
free (l_name);
|
||||
free (lmap);
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
// detach a given pid
|
||||
static bool ptrace_detach(pid_t pid) {
|
||||
if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) {
|
||||
print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid);
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static void process_cleanup(struct ps_prochandle* ph) {
|
||||
ptrace_detach(ph->pid);
|
||||
}
|
||||
|
||||
static ps_prochandle_ops process_ops = {
|
||||
.release= process_cleanup,
|
||||
.p_pread= process_read_data,
|
||||
.p_pwrite= process_write_data,
|
||||
.get_lwp_regs= process_get_lwp_regs,
|
||||
.get_lwp_info= process_get_lwp_info
|
||||
};
|
||||
|
||||
// attach to the process. One and only one exposed stuff
|
||||
struct ps_prochandle* Pgrab(pid_t pid) {
|
||||
struct ps_prochandle* ph = NULL;
|
||||
thread_info* thr = NULL;
|
||||
|
||||
if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) {
|
||||
print_debug("can't allocate memory for ps_prochandle\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ptrace_attach(pid) != true) {
|
||||
free(ph);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// initialize ps_prochandle
|
||||
ph->pid = pid;
|
||||
|
||||
// initialize vtable
|
||||
ph->ops = &process_ops;
|
||||
|
||||
// read library info and symbol tables, must do this before attaching threads,
|
||||
// as the symbols in the pthread library will be used to figure out
|
||||
// the list of threads within the same process.
|
||||
if (read_lib_info(ph) != true) {
|
||||
ptrace_detach(pid);
|
||||
free(ph);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// read thread info
|
||||
read_thread_info(ph, add_new_thread);
|
||||
|
||||
return ph;
|
||||
}
|
126
hotspot/agent/src/os/bsd/salibelf.c
Normal file
126
hotspot/agent/src/os/bsd/salibelf.c
Normal file
@ -0,0 +1,126 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "salibelf.h"
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
extern void print_debug(const char*,...);
|
||||
|
||||
// ELF file parsing helpers. Note that we do *not* use libelf here.
|
||||
int read_elf_header(int fd, ELF_EHDR* ehdr) {
|
||||
if (pread(fd, ehdr, sizeof (ELF_EHDR), 0) != sizeof (ELF_EHDR) ||
|
||||
memcmp(&ehdr->e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 ||
|
||||
ehdr->e_version != EV_CURRENT) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool is_elf_file(int fd) {
|
||||
ELF_EHDR ehdr;
|
||||
return read_elf_header(fd, &ehdr);
|
||||
}
|
||||
|
||||
// read program header table of an ELF file
|
||||
ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr) {
|
||||
ELF_PHDR* phbuf = 0;
|
||||
// allocate memory for program header table
|
||||
size_t nbytes = hdr->e_phnum * hdr->e_phentsize;
|
||||
|
||||
if ((phbuf = (ELF_PHDR*) malloc(nbytes)) == NULL) {
|
||||
print_debug("can't allocate memory for reading program header table\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pread(fd, phbuf, nbytes, hdr->e_phoff) != nbytes) {
|
||||
print_debug("ELF file is truncated! can't read program header table\n");
|
||||
free(phbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return phbuf;
|
||||
}
|
||||
|
||||
// read section header table of an ELF file
|
||||
ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr) {
|
||||
ELF_SHDR* shbuf = 0;
|
||||
// allocate memory for section header table
|
||||
size_t nbytes = hdr->e_shnum * hdr->e_shentsize;
|
||||
|
||||
if ((shbuf = (ELF_SHDR*) malloc(nbytes)) == NULL) {
|
||||
print_debug("can't allocate memory for reading section header table\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (pread(fd, shbuf, nbytes, hdr->e_shoff) != nbytes) {
|
||||
print_debug("ELF file is truncated! can't read section header table\n");
|
||||
free(shbuf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return shbuf;
|
||||
}
|
||||
|
||||
// read a particular section's data
|
||||
void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr) {
|
||||
void *buf = NULL;
|
||||
if (shdr->sh_type == SHT_NOBITS || shdr->sh_size == 0) {
|
||||
return buf;
|
||||
}
|
||||
if ((buf = calloc(shdr->sh_size, 1)) == NULL) {
|
||||
print_debug("can't allocate memory for reading section data\n");
|
||||
return NULL;
|
||||
}
|
||||
if (pread(fd, buf, shdr->sh_size, shdr->sh_offset) != shdr->sh_size) {
|
||||
free(buf);
|
||||
print_debug("section data read failed\n");
|
||||
return NULL;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
uintptr_t find_base_address(int fd, ELF_EHDR* ehdr) {
|
||||
uintptr_t baseaddr = (uintptr_t)-1;
|
||||
int cnt;
|
||||
ELF_PHDR *phbuf, *phdr;
|
||||
|
||||
// read program header table
|
||||
if ((phbuf = read_program_header_table(fd, ehdr)) == NULL) {
|
||||
goto quit;
|
||||
}
|
||||
|
||||
// the base address of a shared object is the lowest vaddr of
|
||||
// its loadable segments (PT_LOAD)
|
||||
for (phdr = phbuf, cnt = 0; cnt < ehdr->e_phnum; cnt++, phdr++) {
|
||||
if (phdr->p_type == PT_LOAD && phdr->p_vaddr < baseaddr) {
|
||||
baseaddr = phdr->p_vaddr;
|
||||
}
|
||||
}
|
||||
|
||||
quit:
|
||||
if (phbuf) free(phbuf);
|
||||
return baseaddr;
|
||||
}
|
52
hotspot/agent/src/os/bsd/salibelf.h
Normal file
52
hotspot/agent/src/os/bsd/salibelf.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SALIBELF_H_
|
||||
#define _SALIBELF_H_
|
||||
|
||||
#include <elf.h>
|
||||
#include "elfmacros.h"
|
||||
#include "libproc_impl.h"
|
||||
|
||||
// read ELF file header.
|
||||
int read_elf_header(int fd, ELF_EHDR* ehdr);
|
||||
|
||||
// is given file descriptor corresponds to an ELF file?
|
||||
bool is_elf_file(int fd);
|
||||
|
||||
// read program header table of an ELF file. caller has to
|
||||
// free the result pointer after use. NULL on failure.
|
||||
ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr);
|
||||
|
||||
// read section header table of an ELF file. caller has to
|
||||
// free the result pointer after use. NULL on failure.
|
||||
ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr);
|
||||
|
||||
// read a particular section's data. caller has to free the
|
||||
// result pointer after use. NULL on failure.
|
||||
void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr);
|
||||
|
||||
// find the base address at which the library wants to load itself
|
||||
uintptr_t find_base_address(int fd, ELF_EHDR* ehdr);
|
||||
#endif /* _SALIBELF_H_ */
|
239
hotspot/agent/src/os/bsd/symtab.c
Normal file
239
hotspot/agent/src/os/bsd/symtab.c
Normal file
@ -0,0 +1,239 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <search.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <db.h>
|
||||
#include <fcntl.h>
|
||||
#include "symtab.h"
|
||||
#include "salibelf.h"
|
||||
|
||||
|
||||
// ----------------------------------------------------
|
||||
// functions for symbol lookups
|
||||
// ----------------------------------------------------
|
||||
|
||||
struct elf_section {
|
||||
ELF_SHDR *c_shdr;
|
||||
void *c_data;
|
||||
};
|
||||
|
||||
struct elf_symbol {
|
||||
char *name;
|
||||
uintptr_t offset;
|
||||
uintptr_t size;
|
||||
};
|
||||
|
||||
typedef struct symtab {
|
||||
char *strs;
|
||||
size_t num_symbols;
|
||||
struct elf_symbol *symbols;
|
||||
DB* hash_table;
|
||||
} symtab_t;
|
||||
|
||||
// read symbol table from given fd.
|
||||
struct symtab* build_symtab(int fd) {
|
||||
ELF_EHDR ehdr;
|
||||
struct symtab* symtab = NULL;
|
||||
|
||||
// Reading of elf header
|
||||
struct elf_section *scn_cache = NULL;
|
||||
int cnt = 0;
|
||||
ELF_SHDR* shbuf = NULL;
|
||||
ELF_SHDR* cursct = NULL;
|
||||
ELF_PHDR* phbuf = NULL;
|
||||
int symtab_found = 0;
|
||||
int dynsym_found = 0;
|
||||
uint32_t symsection = SHT_SYMTAB;
|
||||
|
||||
uintptr_t baseaddr = (uintptr_t)-1;
|
||||
|
||||
lseek(fd, (off_t)0L, SEEK_SET);
|
||||
if (! read_elf_header(fd, &ehdr)) {
|
||||
// not an elf
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// read ELF header
|
||||
if ((shbuf = read_section_header_table(fd, &ehdr)) == NULL) {
|
||||
goto quit;
|
||||
}
|
||||
|
||||
baseaddr = find_base_address(fd, &ehdr);
|
||||
|
||||
scn_cache = calloc(ehdr.e_shnum, sizeof(*scn_cache));
|
||||
if (scn_cache == NULL) {
|
||||
goto quit;
|
||||
}
|
||||
|
||||
for (cursct = shbuf, cnt = 0; cnt < ehdr.e_shnum; cnt++) {
|
||||
scn_cache[cnt].c_shdr = cursct;
|
||||
if (cursct->sh_type == SHT_SYMTAB ||
|
||||
cursct->sh_type == SHT_STRTAB ||
|
||||
cursct->sh_type == SHT_DYNSYM) {
|
||||
if ( (scn_cache[cnt].c_data = read_section_data(fd, &ehdr, cursct)) == NULL) {
|
||||
goto quit;
|
||||
}
|
||||
}
|
||||
|
||||
if (cursct->sh_type == SHT_SYMTAB)
|
||||
symtab_found++;
|
||||
|
||||
if (cursct->sh_type == SHT_DYNSYM)
|
||||
dynsym_found++;
|
||||
|
||||
cursct++;
|
||||
}
|
||||
|
||||
if (!symtab_found && dynsym_found)
|
||||
symsection = SHT_DYNSYM;
|
||||
|
||||
for (cnt = 1; cnt < ehdr.e_shnum; cnt++) {
|
||||
ELF_SHDR *shdr = scn_cache[cnt].c_shdr;
|
||||
|
||||
if (shdr->sh_type == symsection) {
|
||||
ELF_SYM *syms;
|
||||
int j, n, rslt;
|
||||
size_t size;
|
||||
|
||||
// FIXME: there could be multiple data buffers associated with the
|
||||
// same ELF section. Here we can handle only one buffer. See man page
|
||||
// for elf_getdata on Solaris.
|
||||
|
||||
// guarantee(symtab == NULL, "multiple symtab");
|
||||
symtab = calloc(1, sizeof(*symtab));
|
||||
if (symtab == NULL) {
|
||||
goto quit;
|
||||
}
|
||||
// the symbol table
|
||||
syms = (ELF_SYM *)scn_cache[cnt].c_data;
|
||||
|
||||
// number of symbols
|
||||
n = shdr->sh_size / shdr->sh_entsize;
|
||||
|
||||
// create hash table, we use berkeley db to
|
||||
// manipulate the hash table.
|
||||
symtab->hash_table = dbopen(NULL, O_CREAT | O_RDWR, 0600, DB_HASH, NULL);
|
||||
// guarantee(symtab->hash_table, "unexpected failure: dbopen");
|
||||
|
||||
// shdr->sh_link points to the section that contains the actual strings
|
||||
// for symbol names. the st_name field in ELF_SYM is just the
|
||||
// string table index. we make a copy of the string table so the
|
||||
// strings will not be destroyed by elf_end.
|
||||
size = scn_cache[shdr->sh_link].c_shdr->sh_size;
|
||||
symtab->strs = malloc(size);
|
||||
memcpy(symtab->strs, scn_cache[shdr->sh_link].c_data, size);
|
||||
|
||||
// allocate memory for storing symbol offset and size;
|
||||
symtab->num_symbols = n;
|
||||
symtab->symbols = calloc(n , sizeof(*symtab->symbols));
|
||||
|
||||
// copy symbols info our symtab and enter them info the hash table
|
||||
for (j = 0; j < n; j++, syms++) {
|
||||
DBT key, value;
|
||||
char *sym_name = symtab->strs + syms->st_name;
|
||||
|
||||
// skip non-object and non-function symbols
|
||||
int st_type = ELF_ST_TYPE(syms->st_info);
|
||||
if ( st_type != STT_FUNC && st_type != STT_OBJECT)
|
||||
continue;
|
||||
// skip empty strings and undefined symbols
|
||||
if (*sym_name == '\0' || syms->st_shndx == SHN_UNDEF) continue;
|
||||
|
||||
symtab->symbols[j].name = sym_name;
|
||||
symtab->symbols[j].offset = syms->st_value - baseaddr;
|
||||
symtab->symbols[j].size = syms->st_size;
|
||||
|
||||
key.data = sym_name;
|
||||
key.size = strlen(sym_name) + 1;
|
||||
value.data = &(symtab->symbols[j]);
|
||||
value.size = sizeof(void *);
|
||||
(*symtab->hash_table->put)(symtab->hash_table, &key, &value, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
quit:
|
||||
if (shbuf) free(shbuf);
|
||||
if (phbuf) free(phbuf);
|
||||
if (scn_cache) {
|
||||
for (cnt = 0; cnt < ehdr.e_shnum; cnt++) {
|
||||
if (scn_cache[cnt].c_data != NULL) {
|
||||
free(scn_cache[cnt].c_data);
|
||||
}
|
||||
}
|
||||
free(scn_cache);
|
||||
}
|
||||
return symtab;
|
||||
}
|
||||
|
||||
void destroy_symtab(struct symtab* symtab) {
|
||||
if (!symtab) return;
|
||||
if (symtab->strs) free(symtab->strs);
|
||||
if (symtab->symbols) free(symtab->symbols);
|
||||
if (symtab->hash_table) {
|
||||
symtab->hash_table->close(symtab->hash_table);
|
||||
}
|
||||
free(symtab);
|
||||
}
|
||||
|
||||
uintptr_t search_symbol(struct symtab* symtab, uintptr_t base,
|
||||
const char *sym_name, int *sym_size) {
|
||||
DBT key, value;
|
||||
int ret;
|
||||
|
||||
// library does not have symbol table
|
||||
if (!symtab || !symtab->hash_table)
|
||||
return 0;
|
||||
|
||||
key.data = (char*)(uintptr_t)sym_name;
|
||||
key.size = strlen(sym_name) + 1;
|
||||
ret = (*symtab->hash_table->get)(symtab->hash_table, &key, &value, 0);
|
||||
if (ret == 0) {
|
||||
struct elf_symbol *sym = value.data;
|
||||
uintptr_t rslt = (uintptr_t) ((char*)base + sym->offset);
|
||||
if (sym_size) *sym_size = sym->size;
|
||||
return rslt;
|
||||
}
|
||||
|
||||
quit:
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
|
||||
uintptr_t* poffset) {
|
||||
int n = 0;
|
||||
if (!symtab) return NULL;
|
||||
for (; n < symtab->num_symbols; n++) {
|
||||
struct elf_symbol* sym = &(symtab->symbols[n]);
|
||||
if (sym->name != NULL &&
|
||||
offset >= sym->offset && offset < sym->offset + sym->size) {
|
||||
if (poffset) *poffset = (offset - sym->offset);
|
||||
return sym->name;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
50
hotspot/agent/src/os/bsd/symtab.h
Normal file
50
hotspot/agent/src/os/bsd/symtab.h
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SYMTAB_H_
|
||||
#define _SYMTAB_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// interface to manage ELF symbol tables
|
||||
|
||||
struct symtab;
|
||||
|
||||
// build symbol table for a given ELF file descriptor
|
||||
struct symtab* build_symtab(int fd);
|
||||
|
||||
// destroy the symbol table
|
||||
void destroy_symtab(struct symtab* symtab);
|
||||
|
||||
// search for symbol in the given symbol table. Adds offset
|
||||
// to the base uintptr_t supplied. Returns NULL if not found.
|
||||
uintptr_t search_symbol(struct symtab* symtab, uintptr_t base,
|
||||
const char *sym_name, int *sym_size);
|
||||
|
||||
// look for nearest symbol for a given offset (not address - base
|
||||
// subtraction done by caller
|
||||
const char* nearest_symbol(struct symtab* symtab, uintptr_t offset,
|
||||
uintptr_t* poffset);
|
||||
|
||||
#endif /*_SYMTAB_H_*/
|
59
hotspot/agent/src/os/bsd/test.c
Normal file
59
hotspot/agent/src/os/bsd/test.c
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "libproc.h"
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
struct ps_prochandle* ph;
|
||||
|
||||
init_libproc(true);
|
||||
switch (argc) {
|
||||
case 2: {
|
||||
// process
|
||||
ph = Pgrab(atoi(argv[1]));
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
// core
|
||||
ph = Pgrab_core(argv[1], argv[2]);
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
fprintf(stderr, "usage %s <pid> or %s <exec file> <core file>\n", argv[0], argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (ph) {
|
||||
Prelease(ph);
|
||||
return 0;
|
||||
} else {
|
||||
printf("can't connect to debuggee\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.types.*;
|
||||
import sun.jvm.hotspot.types.basic.*;
|
||||
|
||||
public class BsdVtblAccess extends BasicVtblAccess {
|
||||
private String vt;
|
||||
|
||||
public BsdVtblAccess(SymbolLookup symbolLookup,
|
||||
String[] dllNames) {
|
||||
super(symbolLookup, dllNames);
|
||||
|
||||
if (symbolLookup.lookup("libjvm.so", "__vt_10JavaThread") != null ||
|
||||
symbolLookup.lookup("libjvm_g.so", "__vt_10JavaThread") != null) {
|
||||
// old C++ ABI
|
||||
vt = "__vt_";
|
||||
} else {
|
||||
// new C++ ABI
|
||||
vt = "_ZTV";
|
||||
}
|
||||
}
|
||||
|
||||
protected String vtblSymbolForType(Type type) {
|
||||
return vt + type.getName().length() + type;
|
||||
}
|
||||
}
|
@ -28,6 +28,7 @@ import java.io.PrintStream;
|
||||
import java.net.*;
|
||||
import java.rmi.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.proc.*;
|
||||
import sun.jvm.hotspot.debugger.remote.*;
|
||||
import sun.jvm.hotspot.debugger.windbg.*;
|
||||
@ -335,6 +336,8 @@ public class HotSpotAgent {
|
||||
setupDebuggerWin32();
|
||||
} else if (os.equals("linux")) {
|
||||
setupDebuggerLinux();
|
||||
} else if (os.equals("bsd")) {
|
||||
setupDebuggerBsd();
|
||||
} else {
|
||||
// Add support for more operating systems here
|
||||
throw new DebuggerException("Operating system " + os + " not yet supported");
|
||||
@ -390,6 +393,10 @@ public class HotSpotAgent {
|
||||
db = new HotSpotTypeDataBase(machDesc,
|
||||
new LinuxVtblAccess(debugger, jvmLibNames),
|
||||
debugger, jvmLibNames);
|
||||
} else if (os.equals("bsd")) {
|
||||
db = new HotSpotTypeDataBase(machDesc,
|
||||
new BsdVtblAccess(debugger, jvmLibNames),
|
||||
debugger, jvmLibNames);
|
||||
} else {
|
||||
throw new DebuggerException("OS \"" + os + "\" not yet supported (no VtblAccess yet)");
|
||||
}
|
||||
@ -477,6 +484,8 @@ public class HotSpotAgent {
|
||||
setupJVMLibNamesWin32();
|
||||
} else if (os.equals("linux")) {
|
||||
setupJVMLibNamesLinux();
|
||||
} else if (os.equals("bsd")) {
|
||||
setupJVMLibNamesBsd();
|
||||
} else {
|
||||
throw new RuntimeException("Unknown OS type");
|
||||
}
|
||||
@ -554,6 +563,31 @@ public class HotSpotAgent {
|
||||
jvmLibNames = new String[] { "libjvm.so", "libjvm_g.so" };
|
||||
}
|
||||
|
||||
//
|
||||
// BSD
|
||||
//
|
||||
|
||||
private void setupDebuggerBsd() {
|
||||
setupJVMLibNamesBsd();
|
||||
|
||||
if (cpu.equals("x86")) {
|
||||
machDesc = new MachineDescriptionIntelX86();
|
||||
} else if (cpu.equals("amd64")) {
|
||||
machDesc = new MachineDescriptionAMD64();
|
||||
} else {
|
||||
throw new DebuggerException("BSD only supported on x86/amd64");
|
||||
}
|
||||
|
||||
BsdDebuggerLocal dbg = new BsdDebuggerLocal(machDesc, !isServer);
|
||||
debugger = dbg;
|
||||
|
||||
attachDebugger();
|
||||
}
|
||||
|
||||
private void setupJVMLibNamesBsd() {
|
||||
jvmLibNames = new String[] { "libjvm.so", "libjvm_g.so" };
|
||||
}
|
||||
|
||||
/** Convenience routine which should be called by per-platform
|
||||
debugger setup. Should not be called when startupMode is
|
||||
REMOTE_MODE. */
|
||||
|
@ -29,6 +29,7 @@ import java.net.*;
|
||||
import java.rmi.*;
|
||||
import sun.jvm.hotspot.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.proc.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.windbg.*;
|
||||
@ -514,6 +515,8 @@ public class BugSpotAgent {
|
||||
setupDebuggerWin32();
|
||||
} else if (os.equals("linux")) {
|
||||
setupDebuggerLinux();
|
||||
} else if (os.equals("bsd")) {
|
||||
setupDebuggerBsd();
|
||||
} else {
|
||||
// Add support for more operating systems here
|
||||
throw new DebuggerException("Operating system " + os + " not yet supported");
|
||||
@ -565,6 +568,9 @@ public class BugSpotAgent {
|
||||
} else if (os.equals("linux")) {
|
||||
db = new HotSpotTypeDataBase(machDesc, new LinuxVtblAccess(debugger, jvmLibNames),
|
||||
debugger, jvmLibNames);
|
||||
} else if (os.equals("bsd")) {
|
||||
db = new HotSpotTypeDataBase(machDesc, new BsdVtblAccess(debugger, jvmLibNames),
|
||||
debugger, jvmLibNames);
|
||||
} else {
|
||||
throw new DebuggerException("OS \"" + os + "\" not yet supported (no VtblAccess implemented yet)");
|
||||
}
|
||||
@ -666,6 +672,8 @@ public class BugSpotAgent {
|
||||
setupJVMLibNamesWin32();
|
||||
} else if (os.equals("linux")) {
|
||||
setupJVMLibNamesLinux();
|
||||
} else if (os.equals("bsd")) {
|
||||
setupJVMLibNamesBsd();
|
||||
} else {
|
||||
throw new RuntimeException("Unknown OS type");
|
||||
}
|
||||
@ -745,6 +753,34 @@ public class BugSpotAgent {
|
||||
setupJVMLibNamesSolaris();
|
||||
}
|
||||
|
||||
//
|
||||
// BSD
|
||||
//
|
||||
|
||||
private void setupDebuggerBsd() {
|
||||
setupJVMLibNamesBsd();
|
||||
|
||||
if (cpu.equals("x86")) {
|
||||
machDesc = new MachineDescriptionIntelX86();
|
||||
} else if (cpu.equals("amd64")) {
|
||||
machDesc = new MachineDescriptionAMD64();
|
||||
} else {
|
||||
throw new DebuggerException("Bsd only supported on x86/amd64");
|
||||
}
|
||||
|
||||
// Note we do not use a cache for the local debugger in server
|
||||
// mode; it will be taken care of on the client side (once remote
|
||||
// debugging is implemented).
|
||||
|
||||
debugger = new BsdDebuggerLocal(machDesc, !isServer);
|
||||
attachDebugger();
|
||||
}
|
||||
|
||||
private void setupJVMLibNamesBsd() {
|
||||
// same as solaris
|
||||
setupJVMLibNamesSolaris();
|
||||
}
|
||||
|
||||
/** Convenience routine which should be called by per-platform
|
||||
debugger setup. Should not be called when startupMode is
|
||||
REMOTE_MODE. */
|
||||
|
@ -0,0 +1,399 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
|
||||
class BsdAddress implements Address {
|
||||
protected BsdDebugger debugger;
|
||||
protected long addr;
|
||||
|
||||
BsdAddress(BsdDebugger debugger, long addr) {
|
||||
this.debugger = debugger;
|
||||
this.addr = addr;
|
||||
}
|
||||
|
||||
//
|
||||
// Basic Java routines
|
||||
//
|
||||
|
||||
public boolean equals(Object arg) {
|
||||
if (arg == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(arg instanceof BsdAddress)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (addr == ((BsdAddress) arg).addr);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
// FIXME: suggestions on a better hash code?
|
||||
return (int) addr;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return debugger.addressValueToString(addr);
|
||||
}
|
||||
|
||||
//
|
||||
// C/C++-related routines
|
||||
//
|
||||
|
||||
public long getCIntegerAt(long offset, long numBytes, boolean isUnsigned)
|
||||
throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readCInteger(addr + offset, numBytes, isUnsigned);
|
||||
}
|
||||
|
||||
public Address getAddressAt(long offset)
|
||||
throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readAddress(addr + offset);
|
||||
}
|
||||
|
||||
public Address getCompOopAddressAt(long offset)
|
||||
throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readCompOopAddress(addr + offset);
|
||||
}
|
||||
|
||||
//
|
||||
// Java-related routines
|
||||
//
|
||||
|
||||
public boolean getJBooleanAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJBoolean(addr + offset);
|
||||
}
|
||||
|
||||
public byte getJByteAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJByte(addr + offset);
|
||||
}
|
||||
|
||||
public char getJCharAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJChar(addr + offset);
|
||||
}
|
||||
|
||||
public double getJDoubleAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJDouble(addr + offset);
|
||||
}
|
||||
|
||||
public float getJFloatAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJFloat(addr + offset);
|
||||
}
|
||||
|
||||
public int getJIntAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJInt(addr + offset);
|
||||
}
|
||||
|
||||
public long getJLongAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJLong(addr + offset);
|
||||
}
|
||||
|
||||
public short getJShortAt(long offset) throws UnalignedAddressException, UnmappedAddressException {
|
||||
return debugger.readJShort(addr + offset);
|
||||
}
|
||||
|
||||
public OopHandle getOopHandleAt(long offset)
|
||||
throws UnalignedAddressException, UnmappedAddressException, NotInHeapException {
|
||||
return debugger.readOopHandle(addr + offset);
|
||||
}
|
||||
|
||||
public OopHandle getCompOopHandleAt(long offset)
|
||||
throws UnalignedAddressException, UnmappedAddressException, NotInHeapException {
|
||||
return debugger.readCompOopHandle(addr + offset);
|
||||
}
|
||||
|
||||
// Mutators -- not implemented for now (FIXME)
|
||||
public void setCIntegerAt(long offset, long numBytes, long value) {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setAddressAt(long offset, Address value) {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJBooleanAt (long offset, boolean value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJByteAt (long offset, byte value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJCharAt (long offset, char value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJDoubleAt (long offset, double value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJFloatAt (long offset, float value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJIntAt (long offset, int value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJLongAt (long offset, long value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setJShortAt (long offset, short value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
public void setOopHandleAt (long offset, OopHandle value)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
|
||||
//
|
||||
// Arithmetic operations -- necessary evil.
|
||||
//
|
||||
|
||||
public Address addOffsetTo (long offset) throws UnsupportedOperationException {
|
||||
long value = addr + offset;
|
||||
if (value == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAddress(debugger, value);
|
||||
}
|
||||
|
||||
public OopHandle addOffsetToAsOopHandle(long offset) throws UnsupportedOperationException {
|
||||
long value = addr + offset;
|
||||
if (value == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdOopHandle(debugger, value);
|
||||
}
|
||||
|
||||
/** (FIXME: any signed/unsigned issues? Should this work for
|
||||
OopHandles?) */
|
||||
public long minus(Address arg) {
|
||||
if (arg == null) {
|
||||
return addr;
|
||||
}
|
||||
return addr - ((BsdAddress) arg).addr;
|
||||
}
|
||||
|
||||
// Two's complement representation.
|
||||
// All negative numbers are larger than positive numbers.
|
||||
// Numbers with the same sign can be compared normally.
|
||||
// Test harness is below in main().
|
||||
|
||||
public boolean lessThan (Address a) {
|
||||
if (a == null) {
|
||||
return false;
|
||||
}
|
||||
BsdAddress arg = (BsdAddress) a;
|
||||
if ((addr >= 0) && (arg.addr < 0)) {
|
||||
return true;
|
||||
}
|
||||
if ((addr < 0) && (arg.addr >= 0)) {
|
||||
return false;
|
||||
}
|
||||
return (addr < arg.addr);
|
||||
}
|
||||
|
||||
public boolean lessThanOrEqual (Address a) {
|
||||
if (a == null) {
|
||||
return false;
|
||||
}
|
||||
BsdAddress arg = (BsdAddress) a;
|
||||
if ((addr >= 0) && (arg.addr < 0)) {
|
||||
return true;
|
||||
}
|
||||
if ((addr < 0) && (arg.addr >= 0)) {
|
||||
return false;
|
||||
}
|
||||
return (addr <= arg.addr);
|
||||
}
|
||||
|
||||
public boolean greaterThan (Address a) {
|
||||
if (a == null) {
|
||||
return true;
|
||||
}
|
||||
BsdAddress arg = (BsdAddress) a;
|
||||
if ((addr >= 0) && (arg.addr < 0)) {
|
||||
return false;
|
||||
}
|
||||
if ((addr < 0) && (arg.addr >= 0)) {
|
||||
return true;
|
||||
}
|
||||
return (addr > arg.addr);
|
||||
}
|
||||
|
||||
public boolean greaterThanOrEqual(Address a) {
|
||||
if (a == null) {
|
||||
return true;
|
||||
}
|
||||
BsdAddress arg = (BsdAddress) a;
|
||||
if ((addr >= 0) && (arg.addr < 0)) {
|
||||
return false;
|
||||
}
|
||||
if ((addr < 0) && (arg.addr >= 0)) {
|
||||
return true;
|
||||
}
|
||||
return (addr >= arg.addr);
|
||||
}
|
||||
|
||||
public Address andWithMask(long mask) throws UnsupportedOperationException {
|
||||
long value = addr & mask;
|
||||
if (value == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAddress(debugger, value);
|
||||
}
|
||||
|
||||
public Address orWithMask(long mask) throws UnsupportedOperationException {
|
||||
long value = addr | mask;
|
||||
if (value == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAddress(debugger, value);
|
||||
}
|
||||
|
||||
public Address xorWithMask(long mask) throws UnsupportedOperationException {
|
||||
long value = addr ^ mask;
|
||||
if (value == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAddress(debugger, value);
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// Internals only below this point
|
||||
//
|
||||
|
||||
long getValue() {
|
||||
return addr;
|
||||
}
|
||||
|
||||
|
||||
private static void check(boolean arg, String failMessage) {
|
||||
if (!arg) {
|
||||
System.err.println(failMessage + ": FAILED");
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Test harness
|
||||
public static void main(String[] args) {
|
||||
// p/n indicates whether the interior address is really positive
|
||||
// or negative. In unsigned terms, p1 < p2 < n1 < n2.
|
||||
|
||||
BsdAddress p1 = new BsdAddress(null, 0x7FFFFFFFFFFFFFF0L);
|
||||
BsdAddress p2 = (BsdAddress) p1.addOffsetTo(10);
|
||||
BsdAddress n1 = (BsdAddress) p2.addOffsetTo(10);
|
||||
BsdAddress n2 = (BsdAddress) n1.addOffsetTo(10);
|
||||
|
||||
// lessThan positive tests
|
||||
check(p1.lessThan(p2), "lessThan 1");
|
||||
check(p1.lessThan(n1), "lessThan 2");
|
||||
check(p1.lessThan(n2), "lessThan 3");
|
||||
check(p2.lessThan(n1), "lessThan 4");
|
||||
check(p2.lessThan(n2), "lessThan 5");
|
||||
check(n1.lessThan(n2), "lessThan 6");
|
||||
|
||||
// lessThan negative tests
|
||||
check(!p1.lessThan(p1), "lessThan 7");
|
||||
check(!p2.lessThan(p2), "lessThan 8");
|
||||
check(!n1.lessThan(n1), "lessThan 9");
|
||||
check(!n2.lessThan(n2), "lessThan 10");
|
||||
|
||||
check(!p2.lessThan(p1), "lessThan 11");
|
||||
check(!n1.lessThan(p1), "lessThan 12");
|
||||
check(!n2.lessThan(p1), "lessThan 13");
|
||||
check(!n1.lessThan(p2), "lessThan 14");
|
||||
check(!n2.lessThan(p2), "lessThan 15");
|
||||
check(!n2.lessThan(n1), "lessThan 16");
|
||||
|
||||
// lessThanOrEqual positive tests
|
||||
check(p1.lessThanOrEqual(p1), "lessThanOrEqual 1");
|
||||
check(p2.lessThanOrEqual(p2), "lessThanOrEqual 2");
|
||||
check(n1.lessThanOrEqual(n1), "lessThanOrEqual 3");
|
||||
check(n2.lessThanOrEqual(n2), "lessThanOrEqual 4");
|
||||
|
||||
check(p1.lessThanOrEqual(p2), "lessThanOrEqual 5");
|
||||
check(p1.lessThanOrEqual(n1), "lessThanOrEqual 6");
|
||||
check(p1.lessThanOrEqual(n2), "lessThanOrEqual 7");
|
||||
check(p2.lessThanOrEqual(n1), "lessThanOrEqual 8");
|
||||
check(p2.lessThanOrEqual(n2), "lessThanOrEqual 9");
|
||||
check(n1.lessThanOrEqual(n2), "lessThanOrEqual 10");
|
||||
|
||||
// lessThanOrEqual negative tests
|
||||
check(!p2.lessThanOrEqual(p1), "lessThanOrEqual 11");
|
||||
check(!n1.lessThanOrEqual(p1), "lessThanOrEqual 12");
|
||||
check(!n2.lessThanOrEqual(p1), "lessThanOrEqual 13");
|
||||
check(!n1.lessThanOrEqual(p2), "lessThanOrEqual 14");
|
||||
check(!n2.lessThanOrEqual(p2), "lessThanOrEqual 15");
|
||||
check(!n2.lessThanOrEqual(n1), "lessThanOrEqual 16");
|
||||
|
||||
// greaterThan positive tests
|
||||
check(n2.greaterThan(p1), "greaterThan 1");
|
||||
check(n2.greaterThan(p2), "greaterThan 2");
|
||||
check(n2.greaterThan(n1), "greaterThan 3");
|
||||
check(n1.greaterThan(p1), "greaterThan 4");
|
||||
check(n1.greaterThan(p2), "greaterThan 5");
|
||||
check(p2.greaterThan(p1), "greaterThan 6");
|
||||
|
||||
// greaterThan negative tests
|
||||
check(!p1.greaterThan(p1), "greaterThan 7");
|
||||
check(!p2.greaterThan(p2), "greaterThan 8");
|
||||
check(!n1.greaterThan(n1), "greaterThan 9");
|
||||
check(!n2.greaterThan(n2), "greaterThan 10");
|
||||
|
||||
check(!p1.greaterThan(n2), "greaterThan 11");
|
||||
check(!p2.greaterThan(n2), "greaterThan 12");
|
||||
check(!n1.greaterThan(n2), "greaterThan 13");
|
||||
check(!p1.greaterThan(n1), "greaterThan 14");
|
||||
check(!p2.greaterThan(n1), "greaterThan 15");
|
||||
check(!p1.greaterThan(p2), "greaterThan 16");
|
||||
|
||||
// greaterThanOrEqual positive tests
|
||||
check(p1.greaterThanOrEqual(p1), "greaterThanOrEqual 1");
|
||||
check(p2.greaterThanOrEqual(p2), "greaterThanOrEqual 2");
|
||||
check(n1.greaterThanOrEqual(n1), "greaterThanOrEqual 3");
|
||||
check(n2.greaterThanOrEqual(n2), "greaterThanOrEqual 4");
|
||||
|
||||
check(n2.greaterThanOrEqual(p1), "greaterThanOrEqual 5");
|
||||
check(n2.greaterThanOrEqual(p2), "greaterThanOrEqual 6");
|
||||
check(n2.greaterThanOrEqual(n1), "greaterThanOrEqual 7");
|
||||
check(n1.greaterThanOrEqual(p1), "greaterThanOrEqual 8");
|
||||
check(n1.greaterThanOrEqual(p2), "greaterThanOrEqual 9");
|
||||
check(p2.greaterThanOrEqual(p1), "greaterThanOrEqual 10");
|
||||
|
||||
// greaterThanOrEqual negative tests
|
||||
check(!p1.greaterThanOrEqual(n2), "greaterThanOrEqual 11");
|
||||
check(!p2.greaterThanOrEqual(n2), "greaterThanOrEqual 12");
|
||||
check(!n1.greaterThanOrEqual(n2), "greaterThanOrEqual 13");
|
||||
check(!p1.greaterThanOrEqual(n1), "greaterThanOrEqual 14");
|
||||
check(!p2.greaterThanOrEqual(n1), "greaterThanOrEqual 15");
|
||||
check(!p1.greaterThanOrEqual(p2), "greaterThanOrEqual 16");
|
||||
|
||||
System.err.println("BsdAddress: all tests passed successfully.");
|
||||
}
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.x86.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.amd64.*;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
|
||||
class BsdCDebugger implements CDebugger {
|
||||
private BsdDebugger dbg;
|
||||
|
||||
BsdCDebugger(BsdDebugger dbg) {
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
public List getThreadList() throws DebuggerException {
|
||||
return dbg.getThreadList();
|
||||
}
|
||||
|
||||
public List/*<LoadObject>*/ getLoadObjectList() throws DebuggerException {
|
||||
return dbg.getLoadObjectList();
|
||||
}
|
||||
|
||||
public LoadObject loadObjectContainingPC(Address pc) throws DebuggerException {
|
||||
if (pc == null) {
|
||||
return null;
|
||||
}
|
||||
List objs = getLoadObjectList();
|
||||
Object[] arr = objs.toArray();
|
||||
// load objects are sorted by base address, do binary search
|
||||
int mid = -1;
|
||||
int low = 0;
|
||||
int high = arr.length - 1;
|
||||
|
||||
while (low <= high) {
|
||||
mid = (low + high) >> 1;
|
||||
LoadObject midVal = (LoadObject) arr[mid];
|
||||
long cmp = pc.minus(midVal.getBase());
|
||||
if (cmp < 0) {
|
||||
high = mid - 1;
|
||||
} else if (cmp > 0) {
|
||||
long size = midVal.getSize();
|
||||
if (cmp >= size) {
|
||||
low = mid + 1;
|
||||
} else {
|
||||
return (LoadObject) arr[mid];
|
||||
}
|
||||
} else { // match found
|
||||
return (LoadObject) arr[mid];
|
||||
}
|
||||
}
|
||||
// no match found.
|
||||
return null;
|
||||
}
|
||||
|
||||
public CFrame topFrameForThread(ThreadProxy thread) throws DebuggerException {
|
||||
String cpu = dbg.getCPU();
|
||||
if (cpu.equals("x86")) {
|
||||
X86ThreadContext context = (X86ThreadContext) thread.getContext();
|
||||
Address ebp = context.getRegisterAsAddress(X86ThreadContext.EBP);
|
||||
if (ebp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(X86ThreadContext.EIP);
|
||||
if (pc == null) return null;
|
||||
return new BsdX86CFrame(dbg, ebp, pc);
|
||||
} else if (cpu.equals("amd64")) {
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) thread.getContext();
|
||||
Address rbp = context.getRegisterAsAddress(AMD64ThreadContext.RBP);
|
||||
if (rbp == null) return null;
|
||||
Address pc = context.getRegisterAsAddress(AMD64ThreadContext.RIP);
|
||||
if (pc == null) return null;
|
||||
return new BsdAMD64CFrame(dbg, rbp, pc);
|
||||
} else {
|
||||
throw new DebuggerException(cpu + " is not yet supported");
|
||||
}
|
||||
}
|
||||
|
||||
public String getNameOfFile(String fileName) {
|
||||
return new File(fileName).getName();
|
||||
}
|
||||
|
||||
public ProcessControl getProcessControl() throws DebuggerException {
|
||||
// FIXME: after stabs parser
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean canDemangle() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String demangle(String sym) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import java.util.List;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
|
||||
/** An extension of the JVMDebugger interface with a few additions to
|
||||
support 32-bit vs. 64-bit debugging as well as features required
|
||||
by the architecture-specific subpackages. */
|
||||
|
||||
public interface BsdDebugger extends JVMDebugger {
|
||||
public String addressValueToString(long address) throws DebuggerException;
|
||||
public boolean readJBoolean(long address) throws DebuggerException;
|
||||
public byte readJByte(long address) throws DebuggerException;
|
||||
public char readJChar(long address) throws DebuggerException;
|
||||
public double readJDouble(long address) throws DebuggerException;
|
||||
public float readJFloat(long address) throws DebuggerException;
|
||||
public int readJInt(long address) throws DebuggerException;
|
||||
public long readJLong(long address) throws DebuggerException;
|
||||
public short readJShort(long address) throws DebuggerException;
|
||||
public long readCInteger(long address, long numBytes, boolean isUnsigned)
|
||||
throws DebuggerException;
|
||||
public BsdAddress readAddress(long address) throws DebuggerException;
|
||||
public BsdAddress readCompOopAddress(long address) throws DebuggerException;
|
||||
public BsdOopHandle readOopHandle(long address) throws DebuggerException;
|
||||
public BsdOopHandle readCompOopHandle(long address) throws DebuggerException;
|
||||
public long[] getThreadIntegerRegisterSet(int lwp_id) throws DebuggerException;
|
||||
public long getAddressValue(Address addr) throws DebuggerException;
|
||||
public Address newAddress(long value) throws DebuggerException;
|
||||
|
||||
// For BsdCDebugger
|
||||
public List getThreadList();
|
||||
public List getLoadObjectList();
|
||||
public ClosestSymbol lookup(long address);
|
||||
|
||||
// NOTE: this interface implicitly contains the following methods:
|
||||
// From the Debugger interface via JVMDebugger
|
||||
// public void attach(int processID) throws DebuggerException;
|
||||
// public void attach(String executableName, String coreFileName) throws DebuggerException;
|
||||
// public boolean detach();
|
||||
// public Address parseAddress(String addressString) throws NumberFormatException;
|
||||
// public String getOS();
|
||||
// public String getCPU();
|
||||
// From the SymbolLookup interface via Debugger and JVMDebugger
|
||||
// public Address lookup(String objectName, String symbol);
|
||||
// public OopHandle lookupOop(String objectName, String symbol);
|
||||
// From the JVMDebugger interface
|
||||
// public void configureJavaPrimitiveTypeSizes(long jbooleanSize,
|
||||
// long jbyteSize,
|
||||
// long jcharSize,
|
||||
// long jdoubleSize,
|
||||
// long jfloatSize,
|
||||
// long jintSize,
|
||||
// long jlongSize,
|
||||
// long jshortSize);
|
||||
// From the ThreadAccess interface via Debugger and JVMDebugger
|
||||
// public ThreadProxy getThreadForIdentifierAddress(Address addr);
|
||||
}
|
@ -0,0 +1,595 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
import java.lang.reflect.*;
|
||||
|
||||
/** <P> An implementation of the JVMDebugger interface. The basic debug
|
||||
facilities are implemented through ptrace interface in the JNI code
|
||||
(libsaproc.so). Library maps and symbol table management are done in
|
||||
JNI. </P>
|
||||
|
||||
<P> <B>NOTE</B> that since we have the notion of fetching "Java
|
||||
primitive types" from the remote process (which might have
|
||||
different sizes than we expect) we have a bootstrapping
|
||||
problem. We need to know the sizes of these types before we can
|
||||
fetch them. The current implementation solves this problem by
|
||||
requiring that it be configured with these type sizes before they
|
||||
can be fetched. The readJ(Type) routines here will throw a
|
||||
RuntimeException if they are called before the debugger is
|
||||
configured with the Java primitive type sizes. </P> */
|
||||
|
||||
public class BsdDebuggerLocal extends DebuggerBase implements BsdDebugger {
|
||||
private boolean useGCC32ABI;
|
||||
private boolean attached;
|
||||
private long p_ps_prochandle; // native debugger handle
|
||||
private boolean isCore;
|
||||
|
||||
// CDebugger support
|
||||
private BsdCDebugger cdbg;
|
||||
|
||||
// threadList and loadObjectList are filled by attach0 method
|
||||
private List threadList;
|
||||
private List loadObjectList;
|
||||
|
||||
// called by native method lookupByAddress0
|
||||
private ClosestSymbol createClosestSymbol(String name, long offset) {
|
||||
return new ClosestSymbol(name, offset);
|
||||
}
|
||||
|
||||
// called by native method attach0
|
||||
private LoadObject createLoadObject(String fileName, long textsize,
|
||||
long base) {
|
||||
File f = new File(fileName);
|
||||
Address baseAddr = newAddress(base);
|
||||
return new SharedObject(this, fileName, f.length(), baseAddr);
|
||||
}
|
||||
|
||||
// native methods
|
||||
|
||||
private native static void init0()
|
||||
throws DebuggerException;
|
||||
private native void attach0(int pid)
|
||||
throws DebuggerException;
|
||||
private native void attach0(String execName, String coreName)
|
||||
throws DebuggerException;
|
||||
private native void detach0()
|
||||
throws DebuggerException;
|
||||
private native long lookupByName0(String objectName, String symbol)
|
||||
throws DebuggerException;
|
||||
private native ClosestSymbol lookupByAddress0(long address)
|
||||
throws DebuggerException;
|
||||
private native long[] getThreadIntegerRegisterSet0(int lwp_id)
|
||||
throws DebuggerException;
|
||||
private native byte[] readBytesFromProcess0(long address, long numBytes)
|
||||
throws DebuggerException;
|
||||
public native static int getAddressSize() ;
|
||||
|
||||
// Note on Bsd threads are really processes. When target process is
|
||||
// attached by a serviceability agent thread, only that thread can do
|
||||
// ptrace operations on the target. This is because from kernel's point
|
||||
// view, other threads are just separate processes and they are not
|
||||
// attached to the target. When they attempt to make ptrace calls,
|
||||
// an ESRCH error will be returned as kernel believes target is not
|
||||
// being traced by the caller.
|
||||
// To work around the problem, we use a worker thread here to handle
|
||||
// all JNI functions that are making ptrace calls.
|
||||
|
||||
interface WorkerThreadTask {
|
||||
public void doit(BsdDebuggerLocal debugger) throws DebuggerException;
|
||||
}
|
||||
|
||||
class BsdDebuggerLocalWorkerThread extends Thread {
|
||||
BsdDebuggerLocal debugger;
|
||||
WorkerThreadTask task;
|
||||
DebuggerException lastException;
|
||||
|
||||
public BsdDebuggerLocalWorkerThread(BsdDebuggerLocal debugger) {
|
||||
this.debugger = debugger;
|
||||
setDaemon(true);
|
||||
}
|
||||
|
||||
public void run() {
|
||||
synchronized (workerThread) {
|
||||
for (;;) {
|
||||
if (task != null) {
|
||||
lastException = null;
|
||||
try {
|
||||
task.doit(debugger);
|
||||
} catch (DebuggerException exp) {
|
||||
lastException = exp;
|
||||
}
|
||||
task = null;
|
||||
workerThread.notifyAll();
|
||||
}
|
||||
|
||||
try {
|
||||
workerThread.wait();
|
||||
} catch (InterruptedException x) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public WorkerThreadTask execute(WorkerThreadTask task) throws DebuggerException {
|
||||
synchronized (workerThread) {
|
||||
this.task = task;
|
||||
workerThread.notifyAll();
|
||||
while (this.task != null) {
|
||||
try {
|
||||
workerThread.wait();
|
||||
} catch (InterruptedException x) {}
|
||||
}
|
||||
if (lastException != null) {
|
||||
throw new DebuggerException(lastException);
|
||||
} else {
|
||||
return task;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private BsdDebuggerLocalWorkerThread workerThread = null;
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation of Debugger interface
|
||||
//
|
||||
|
||||
/** <P> machDesc may not be null. </P>
|
||||
|
||||
<P> useCache should be set to true if debugging is being done
|
||||
locally, and to false if the debugger is being created for the
|
||||
purpose of supporting remote debugging. </P> */
|
||||
public BsdDebuggerLocal(MachineDescription machDesc,
|
||||
boolean useCache) throws DebuggerException {
|
||||
this.machDesc = machDesc;
|
||||
utils = new DebuggerUtilities(machDesc.getAddressSize(),
|
||||
machDesc.isBigEndian()) {
|
||||
public void checkAlignment(long address, long alignment) {
|
||||
// Need to override default checkAlignment because we need to
|
||||
// relax alignment constraints on Bsd/x86
|
||||
if ( (address % alignment != 0)
|
||||
&&(alignment != 8 || address % 4 != 0)) {
|
||||
throw new UnalignedAddressException(
|
||||
"Trying to read at address: "
|
||||
+ addressValueToString(address)
|
||||
+ " with alignment: " + alignment,
|
||||
address);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (useCache) {
|
||||
// FIXME: re-test necessity of cache on Bsd, where data
|
||||
// fetching is faster
|
||||
// Cache portion of the remote process's address space.
|
||||
// Fetching data over the socket connection to dbx is slow.
|
||||
// Might be faster if we were using a binary protocol to talk to
|
||||
// dbx, but would have to test. For now, this cache works best
|
||||
// if it covers the entire heap of the remote process. FIXME: at
|
||||
// least should make this tunable from the outside, i.e., via
|
||||
// the UI. This is a cache of 4096 4K pages, or 16 MB. The page
|
||||
// size must be adjusted to be the hardware's page size.
|
||||
// (FIXME: should pick this up from the debugger.)
|
||||
if (getCPU().equals("ia64")) {
|
||||
initCache(16384, parseCacheNumPagesProperty(1024));
|
||||
} else {
|
||||
initCache(4096, parseCacheNumPagesProperty(4096));
|
||||
}
|
||||
}
|
||||
|
||||
workerThread = new BsdDebuggerLocalWorkerThread(this);
|
||||
workerThread.start();
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public boolean hasProcessList() throws DebuggerException {
|
||||
return false;
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public List getProcessList() throws DebuggerException {
|
||||
throw new DebuggerException("getProcessList not implemented yet");
|
||||
}
|
||||
|
||||
private void checkAttached() throws DebuggerException {
|
||||
if (attached) {
|
||||
if (isCore) {
|
||||
throw new DebuggerException("attached to a core dump already");
|
||||
} else {
|
||||
throw new DebuggerException("attached to a process already");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void requireAttach() {
|
||||
if (! attached) {
|
||||
throw new RuntimeException("not attached to a process or a core!");
|
||||
}
|
||||
}
|
||||
|
||||
/* called from attach methods */
|
||||
private void findABIVersion() throws DebuggerException {
|
||||
if (lookupByName0("libjvm.so", "__vt_10JavaThread") != 0 ||
|
||||
lookupByName0("libjvm_g.so", "__vt_10JavaThread") != 0) {
|
||||
// old C++ ABI
|
||||
useGCC32ABI = false;
|
||||
} else {
|
||||
// new C++ ABI
|
||||
useGCC32ABI = true;
|
||||
}
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public synchronized void attach(int processID) throws DebuggerException {
|
||||
checkAttached();
|
||||
threadList = new ArrayList();
|
||||
loadObjectList = new ArrayList();
|
||||
class AttachTask implements WorkerThreadTask {
|
||||
int pid;
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
debugger.attach0(pid);
|
||||
debugger.attached = true;
|
||||
debugger.isCore = false;
|
||||
findABIVersion();
|
||||
}
|
||||
}
|
||||
|
||||
AttachTask task = new AttachTask();
|
||||
task.pid = processID;
|
||||
workerThread.execute(task);
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public synchronized void attach(String execName, String coreName) {
|
||||
checkAttached();
|
||||
threadList = new ArrayList();
|
||||
loadObjectList = new ArrayList();
|
||||
attach0(execName, coreName);
|
||||
attached = true;
|
||||
isCore = true;
|
||||
findABIVersion();
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public synchronized boolean detach() {
|
||||
if (!attached) {
|
||||
return false;
|
||||
}
|
||||
|
||||
threadList = null;
|
||||
loadObjectList = null;
|
||||
|
||||
if (isCore) {
|
||||
detach0();
|
||||
attached = false;
|
||||
return true;
|
||||
} else {
|
||||
class DetachTask implements WorkerThreadTask {
|
||||
boolean result = false;
|
||||
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
debugger.detach0();
|
||||
debugger.attached = false;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
|
||||
DetachTask task = new DetachTask();
|
||||
workerThread.execute(task);
|
||||
return task.result;
|
||||
}
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public Address parseAddress(String addressString)
|
||||
throws NumberFormatException {
|
||||
long addr = utils.scanAddress(addressString);
|
||||
if (addr == 0) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAddress(this, addr);
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public String getOS() {
|
||||
return PlatformInfo.getOS();
|
||||
}
|
||||
|
||||
/** From the Debugger interface via JVMDebugger */
|
||||
public String getCPU() {
|
||||
return PlatformInfo.getCPU();
|
||||
}
|
||||
|
||||
public boolean hasConsole() throws DebuggerException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String consoleExecuteCommand(String cmd) throws DebuggerException {
|
||||
throw new DebuggerException("No debugger console available on Bsd");
|
||||
}
|
||||
|
||||
public String getConsolePrompt() throws DebuggerException {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* called from lookup */
|
||||
private long handleGCC32ABI(long addr, String symbol) throws DebuggerException {
|
||||
if (useGCC32ABI && symbol.startsWith("_ZTV")) {
|
||||
return addr + (2 * machDesc.getAddressSize());
|
||||
} else {
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
|
||||
/** From the SymbolLookup interface via Debugger and JVMDebugger */
|
||||
public synchronized Address lookup(String objectName, String symbol) {
|
||||
requireAttach();
|
||||
if (!attached) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (isCore) {
|
||||
long addr = lookupByName0(objectName, symbol);
|
||||
return (addr == 0)? null : new BsdAddress(this, handleGCC32ABI(addr, symbol));
|
||||
} else {
|
||||
class LookupByNameTask implements WorkerThreadTask {
|
||||
String objectName, symbol;
|
||||
Address result;
|
||||
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
long addr = debugger.lookupByName0(objectName, symbol);
|
||||
result = (addr == 0 ? null : new BsdAddress(debugger, handleGCC32ABI(addr, symbol)));
|
||||
}
|
||||
}
|
||||
|
||||
LookupByNameTask task = new LookupByNameTask();
|
||||
task.objectName = objectName;
|
||||
task.symbol = symbol;
|
||||
workerThread.execute(task);
|
||||
return task.result;
|
||||
}
|
||||
}
|
||||
|
||||
/** From the SymbolLookup interface via Debugger and JVMDebugger */
|
||||
public synchronized OopHandle lookupOop(String objectName, String symbol) {
|
||||
Address addr = lookup(objectName, symbol);
|
||||
if (addr == null) {
|
||||
return null;
|
||||
}
|
||||
return addr.addOffsetToAsOopHandle(0);
|
||||
}
|
||||
|
||||
/** From the Debugger interface */
|
||||
public MachineDescription getMachineDescription() {
|
||||
return machDesc;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Implementation of ThreadAccess interface
|
||||
//
|
||||
|
||||
/** From the ThreadAccess interface via Debugger and JVMDebugger */
|
||||
public ThreadProxy getThreadForIdentifierAddress(Address addr) {
|
||||
return new BsdThread(this, addr);
|
||||
}
|
||||
|
||||
/** From the ThreadAccess interface via Debugger and JVMDebugger */
|
||||
public ThreadProxy getThreadForThreadId(long id) {
|
||||
return new BsdThread(this, id);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Internal routines (for implementation of BsdAddress).
|
||||
// These must not be called until the MachineDescription has been set up.
|
||||
//
|
||||
|
||||
/** From the BsdDebugger interface */
|
||||
public String addressValueToString(long address) {
|
||||
return utils.addressValueToString(address);
|
||||
}
|
||||
|
||||
/** From the BsdDebugger interface */
|
||||
public BsdAddress readAddress(long address)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
long value = readAddressValue(address);
|
||||
return (value == 0 ? null : new BsdAddress(this, value));
|
||||
}
|
||||
public BsdAddress readCompOopAddress(long address)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
long value = readCompOopAddressValue(address);
|
||||
return (value == 0 ? null : new BsdAddress(this, value));
|
||||
}
|
||||
|
||||
/** From the BsdDebugger interface */
|
||||
public BsdOopHandle readOopHandle(long address)
|
||||
throws UnmappedAddressException, UnalignedAddressException,
|
||||
NotInHeapException {
|
||||
long value = readAddressValue(address);
|
||||
return (value == 0 ? null : new BsdOopHandle(this, value));
|
||||
}
|
||||
public BsdOopHandle readCompOopHandle(long address)
|
||||
throws UnmappedAddressException, UnalignedAddressException,
|
||||
NotInHeapException {
|
||||
long value = readCompOopAddressValue(address);
|
||||
return (value == 0 ? null : new BsdOopHandle(this, value));
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Thread context access
|
||||
//
|
||||
|
||||
public synchronized long[] getThreadIntegerRegisterSet(int lwp_id)
|
||||
throws DebuggerException {
|
||||
requireAttach();
|
||||
if (isCore) {
|
||||
return getThreadIntegerRegisterSet0(lwp_id);
|
||||
} else {
|
||||
class GetThreadIntegerRegisterSetTask implements WorkerThreadTask {
|
||||
int lwp_id;
|
||||
long[] result;
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
result = debugger.getThreadIntegerRegisterSet0(lwp_id);
|
||||
}
|
||||
}
|
||||
|
||||
GetThreadIntegerRegisterSetTask task = new GetThreadIntegerRegisterSetTask();
|
||||
task.lwp_id = lwp_id;
|
||||
workerThread.execute(task);
|
||||
return task.result;
|
||||
}
|
||||
}
|
||||
|
||||
/** Need to override this to relax alignment checks on x86. */
|
||||
public long readCInteger(long address, long numBytes, boolean isUnsigned)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
// Only slightly relaxed semantics -- this is a hack, but is
|
||||
// necessary on x86 where it seems the compiler is
|
||||
// putting some global 64-bit data on 32-bit boundaries
|
||||
if (numBytes == 8) {
|
||||
utils.checkAlignment(address, 4);
|
||||
} else {
|
||||
utils.checkAlignment(address, numBytes);
|
||||
}
|
||||
byte[] data = readBytes(address, numBytes);
|
||||
return utils.dataToCInteger(data, isUnsigned);
|
||||
}
|
||||
|
||||
// Overridden from DebuggerBase because we need to relax alignment
|
||||
// constraints on x86
|
||||
public long readJLong(long address)
|
||||
throws UnmappedAddressException, UnalignedAddressException {
|
||||
utils.checkAlignment(address, jintSize);
|
||||
byte[] data = readBytes(address, jlongSize);
|
||||
return utils.dataToJLong(data, jlongSize);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Address access. Can not be package private, but should only be
|
||||
// accessed by the architecture-specific subpackages.
|
||||
|
||||
/** From the BsdDebugger interface */
|
||||
public long getAddressValue(Address addr) {
|
||||
if (addr == null) return 0;
|
||||
return ((BsdAddress) addr).getValue();
|
||||
}
|
||||
|
||||
/** From the BsdDebugger interface */
|
||||
public Address newAddress(long value) {
|
||||
if (value == 0) return null;
|
||||
return new BsdAddress(this, value);
|
||||
}
|
||||
|
||||
/** From the BsdCDebugger interface */
|
||||
public List/*<ThreadProxy>*/ getThreadList() {
|
||||
requireAttach();
|
||||
return threadList;
|
||||
}
|
||||
|
||||
/** From the BsdCDebugger interface */
|
||||
public List/*<LoadObject>*/ getLoadObjectList() {
|
||||
requireAttach();
|
||||
return loadObjectList;
|
||||
}
|
||||
|
||||
/** From the BsdCDebugger interface */
|
||||
public synchronized ClosestSymbol lookup(long addr) {
|
||||
requireAttach();
|
||||
if (isCore) {
|
||||
return lookupByAddress0(addr);
|
||||
} else {
|
||||
class LookupByAddressTask implements WorkerThreadTask {
|
||||
long addr;
|
||||
ClosestSymbol result;
|
||||
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
result = debugger.lookupByAddress0(addr);
|
||||
}
|
||||
}
|
||||
|
||||
LookupByAddressTask task = new LookupByAddressTask();
|
||||
task.addr = addr;
|
||||
workerThread.execute(task);
|
||||
return task.result;
|
||||
}
|
||||
}
|
||||
|
||||
public CDebugger getCDebugger() {
|
||||
if (cdbg == null) {
|
||||
String cpu = getCPU();
|
||||
if (cpu.equals("ia64") ) {
|
||||
// IA-64 is not supported because of stack-walking issues
|
||||
return null;
|
||||
}
|
||||
cdbg = new BsdCDebugger(this);
|
||||
}
|
||||
return cdbg;
|
||||
}
|
||||
|
||||
/** This reads bytes from the remote process. */
|
||||
public synchronized ReadResult readBytesFromProcess(long address,
|
||||
long numBytes) throws UnmappedAddressException, DebuggerException {
|
||||
requireAttach();
|
||||
if (isCore) {
|
||||
byte[] res = readBytesFromProcess0(address, numBytes);
|
||||
return (res != null)? new ReadResult(res) : new ReadResult(address);
|
||||
} else {
|
||||
class ReadBytesFromProcessTask implements WorkerThreadTask {
|
||||
long address, numBytes;
|
||||
ReadResult result;
|
||||
public void doit(BsdDebuggerLocal debugger) {
|
||||
byte[] res = debugger.readBytesFromProcess0(address, numBytes);
|
||||
if (res != null)
|
||||
result = new ReadResult(res);
|
||||
else
|
||||
result = new ReadResult(address);
|
||||
}
|
||||
}
|
||||
|
||||
ReadBytesFromProcessTask task = new ReadBytesFromProcessTask();
|
||||
task.address = address;
|
||||
task.numBytes = numBytes;
|
||||
workerThread.execute(task);
|
||||
return task.result;
|
||||
}
|
||||
}
|
||||
|
||||
public void writeBytesToProcess(long address, long numBytes, byte[] data)
|
||||
throws UnmappedAddressException, DebuggerException {
|
||||
// FIXME
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
|
||||
static {
|
||||
System.loadLibrary("saproc");
|
||||
init0();
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
|
||||
class BsdOopHandle extends BsdAddress implements OopHandle {
|
||||
BsdOopHandle(BsdDebugger debugger, long addr) {
|
||||
super(debugger, addr);
|
||||
}
|
||||
|
||||
public boolean equals(Object arg) {
|
||||
if (arg == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(arg instanceof BsdOopHandle)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (addr == ((BsdAddress) arg).addr);
|
||||
}
|
||||
|
||||
public Address addOffsetTo (long offset) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("addOffsetTo not applicable to OopHandles (interior object pointers not allowed)");
|
||||
}
|
||||
|
||||
public Address andWithMask(long mask) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("andWithMask not applicable to OopHandles (i.e., anything but C addresses)");
|
||||
}
|
||||
|
||||
public Address orWithMask(long mask) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("orWithMask not applicable to OopHandles (i.e., anything but C addresses)");
|
||||
}
|
||||
|
||||
public Address xorWithMask(long mask) throws UnsupportedOperationException {
|
||||
throw new UnsupportedOperationException("xorWithMask not applicable to OopHandles (i.e., anything but C addresses)");
|
||||
}
|
||||
}
|
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
|
||||
class BsdThread implements ThreadProxy {
|
||||
private BsdDebugger debugger;
|
||||
private int lwp_id;
|
||||
|
||||
/** The address argument must be the address of the _thread_id in the
|
||||
OSThread. It's value is result ::gettid() call. */
|
||||
BsdThread(BsdDebugger debugger, Address addr) {
|
||||
this.debugger = debugger;
|
||||
// FIXME: size of data fetched here should be configurable.
|
||||
// However, making it so would produce a dependency on the "types"
|
||||
// package from the debugger package, which is not desired.
|
||||
this.lwp_id = (int) addr.getCIntegerAt(0, 4, true);
|
||||
}
|
||||
|
||||
BsdThread(BsdDebugger debugger, long id) {
|
||||
this.debugger = debugger;
|
||||
this.lwp_id = (int) id;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj == null) || !(obj instanceof BsdThread)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return (((BsdThread) obj).lwp_id == lwp_id);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return lwp_id;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return Integer.toString(lwp_id);
|
||||
}
|
||||
|
||||
public ThreadContext getContext() throws IllegalThreadStateException {
|
||||
long[] data = debugger.getThreadIntegerRegisterSet(lwp_id);
|
||||
ThreadContext context = BsdThreadContextFactory.createThreadContext(debugger);
|
||||
for (int i = 0; i < data.length; i++) {
|
||||
context.setRegister(i, data[i]);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
public boolean canSetContext() throws DebuggerException {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setContext(ThreadContext context)
|
||||
throws IllegalThreadStateException, DebuggerException {
|
||||
throw new DebuggerException("Unimplemented");
|
||||
}
|
||||
}
|
42
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java
Normal file
42
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThreadContextFactory.java
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.x86.*;
|
||||
|
||||
class BsdThreadContextFactory {
|
||||
static ThreadContext createThreadContext(BsdDebugger dbg) {
|
||||
String cpu = dbg.getCPU();
|
||||
if (cpu.equals("x86")) {
|
||||
return new BsdX86ThreadContext(dbg);
|
||||
} else if (cpu.equals("amd64")) {
|
||||
return new BsdAMD64ThreadContext(dbg);
|
||||
} else {
|
||||
throw new RuntimeException("cpu " + cpu + " is not yet supported");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.posix.*;
|
||||
|
||||
/** A Object can represent either a .so or an a.out file. */
|
||||
|
||||
class SharedObject extends DSO {
|
||||
SharedObject(BsdDebugger dbg, String filename, long size, Address relocation) {
|
||||
super(filename, size, relocation);
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
protected Address newAddress(long address) {
|
||||
return dbg.newAddress(address);
|
||||
}
|
||||
|
||||
protected long getAddressValue(Address addr) {
|
||||
return dbg.getAddressValue(addr);
|
||||
}
|
||||
|
||||
private BsdDebugger dbg;
|
||||
}
|
75
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java
Normal file
75
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64CFrame.java
Normal file
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd.amd64;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
|
||||
final public class BsdAMD64CFrame extends BasicCFrame {
|
||||
public BsdAMD64CFrame(BsdDebugger dbg, Address rbp, Address rip) {
|
||||
super(dbg.getCDebugger());
|
||||
this.rbp = rbp;
|
||||
this.rip = rip;
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
// override base class impl to avoid ELF parsing
|
||||
public ClosestSymbol closestSymbolToPC() {
|
||||
// try native lookup in debugger.
|
||||
return dbg.lookup(dbg.getAddressValue(pc()));
|
||||
}
|
||||
|
||||
public Address pc() {
|
||||
return rip;
|
||||
}
|
||||
|
||||
public Address localVariableBase() {
|
||||
return rbp;
|
||||
}
|
||||
|
||||
public CFrame sender() {
|
||||
if (rbp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Address nextRBP = rbp.getAddressAt( 0 * ADDRESS_SIZE);
|
||||
if (nextRBP == null) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = rbp.getAddressAt( 1 * ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new BsdAMD64CFrame(dbg, nextRBP, nextPC);
|
||||
}
|
||||
|
||||
// package/class internals only
|
||||
private static final int ADDRESS_SIZE = 8;
|
||||
private Address rip;
|
||||
private Address rbp;
|
||||
private BsdDebugger dbg;
|
||||
}
|
46
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64ThreadContext.java
Normal file
46
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/amd64/BsdAMD64ThreadContext.java
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd.amd64;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
|
||||
public class BsdAMD64ThreadContext extends AMD64ThreadContext {
|
||||
private BsdDebugger debugger;
|
||||
|
||||
public BsdAMD64ThreadContext(BsdDebugger debugger) {
|
||||
super();
|
||||
this.debugger = debugger;
|
||||
}
|
||||
|
||||
public void setRegisterAsAddress(int index, Address value) {
|
||||
setRegister(index, debugger.getAddressValue(value));
|
||||
}
|
||||
|
||||
public Address getRegisterAsAddress(int index) {
|
||||
return debugger.newAddress(getRegister(index));
|
||||
}
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd.x86;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||
|
||||
final public class BsdX86CFrame extends BasicCFrame {
|
||||
// package/class internals only
|
||||
public BsdX86CFrame(BsdDebugger dbg, Address ebp, Address pc) {
|
||||
super(dbg.getCDebugger());
|
||||
this.ebp = ebp;
|
||||
this.pc = pc;
|
||||
this.dbg = dbg;
|
||||
}
|
||||
|
||||
// override base class impl to avoid ELF parsing
|
||||
public ClosestSymbol closestSymbolToPC() {
|
||||
// try native lookup in debugger.
|
||||
return dbg.lookup(dbg.getAddressValue(pc()));
|
||||
}
|
||||
|
||||
public Address pc() {
|
||||
return pc;
|
||||
}
|
||||
|
||||
public Address localVariableBase() {
|
||||
return ebp;
|
||||
}
|
||||
|
||||
public CFrame sender() {
|
||||
if (ebp == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Address nextEBP = ebp.getAddressAt( 0 * ADDRESS_SIZE);
|
||||
if (nextEBP == null) {
|
||||
return null;
|
||||
}
|
||||
Address nextPC = ebp.getAddressAt( 1 * ADDRESS_SIZE);
|
||||
if (nextPC == null) {
|
||||
return null;
|
||||
}
|
||||
return new BsdX86CFrame(dbg, nextEBP, nextPC);
|
||||
}
|
||||
|
||||
private static final int ADDRESS_SIZE = 4;
|
||||
private Address pc;
|
||||
private Address ebp;
|
||||
private BsdDebugger dbg;
|
||||
}
|
46
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java
Normal file
46
hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/x86/BsdX86ThreadContext.java
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.debugger.bsd.x86;
|
||||
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.debugger.bsd.*;
|
||||
|
||||
public class BsdX86ThreadContext extends X86ThreadContext {
|
||||
private BsdDebugger debugger;
|
||||
|
||||
public BsdX86ThreadContext(BsdDebugger debugger) {
|
||||
super();
|
||||
this.debugger = debugger;
|
||||
}
|
||||
|
||||
public void setRegisterAsAddress(int index, Address value) {
|
||||
setRegister(index, debugger.getAddressValue(value));
|
||||
}
|
||||
|
||||
public Address getRegisterAsAddress(int index) {
|
||||
return debugger.newAddress(getRegister(index));
|
||||
}
|
||||
}
|
@ -37,6 +37,8 @@ import sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.runtime.linux_ia64.LinuxIA64JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.runtime.linux_sparc.LinuxSPARCJavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.runtime.bsd_amd64.BsdAMD64JavaThreadPDAccess;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
|
||||
public class Threads {
|
||||
@ -90,7 +92,12 @@ public class Threads {
|
||||
} else if (cpu.equals("sparc")) {
|
||||
access = new LinuxSPARCJavaThreadPDAccess();
|
||||
}
|
||||
|
||||
} else if (os.equals("bsd")) {
|
||||
if (cpu.equals("x86")) {
|
||||
access = new BsdX86JavaThreadPDAccess();
|
||||
} else if (cpu.equals("amd64")) {
|
||||
access = new BsdAMD64JavaThreadPDAccess();
|
||||
}
|
||||
}
|
||||
|
||||
if (access == null) {
|
||||
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.runtime.bsd;
|
||||
|
||||
public class BsdSignals {
|
||||
private static String[] signalNames = {
|
||||
"", /* No signal 0 */
|
||||
"SIGHUP", /* hangup */
|
||||
"SIGINT", /* interrupt */
|
||||
"SIGQUIT", /* quit */
|
||||
"SIGILL", /* illegal instr. (not reset when caught) */
|
||||
"SIGTRAP", /* trace trap (not reset when caught) */
|
||||
"SIGABRT", /* abort() */
|
||||
"SIGEMT", /* EMT instruction */
|
||||
"SIGFPE", /* floating point exception */
|
||||
"SIGKILL", /* kill (cannot be caught or ignored) */
|
||||
"SIGBUS", /* bus error */
|
||||
"SIGSEGV", /* segmentation violation */
|
||||
"SIGSYS", /* non-existent system call invoked */
|
||||
"SIGPIPE", /* write on a pipe with no one to read it */
|
||||
"SIGALRM", /* alarm clock */
|
||||
"SIGTERM", /* software termination signal from kill */
|
||||
"SIGURG", /* urgent condition on IO channel */
|
||||
"SIGSTOP", /* sendable stop signal not from tty */
|
||||
"SIGTSTP", /* stop signal from tty */
|
||||
"SIGCONT", /* continue a stopped process */
|
||||
"SIGCHLD", /* to parent on child stop or exit */
|
||||
"SIGTTIN", /* to readers pgrp upon background tty read */
|
||||
"SIGTTOU", /* like TTIN if (tp->t_local<OSTOP) */
|
||||
"SIGIO", /* input/output possible signal */
|
||||
"SIGXCPU", /* exceeded CPU time limit */
|
||||
"SIGXFSZ", /* exceeded file size limit */
|
||||
"SIGVTALRM", /* virtual time alarm */
|
||||
"SIGPROF", /* profiling time alarm */
|
||||
"SIGWINCH", /* window size changes */
|
||||
"SIGINFO", /* information request */
|
||||
"SIGUSR1", /* user defined signal 1 */
|
||||
"SIGUSR2" /* user defined signal 2 */
|
||||
};
|
||||
|
||||
public static String getSignalName(int sigNum) {
|
||||
if ((sigNum <= 0) || (sigNum >= signalNames.length)) {
|
||||
// Probably best to fail in a non-destructive way
|
||||
return "<Error: Illegal signal number " + sigNum + ">";
|
||||
}
|
||||
return signalNames[sigNum];
|
||||
}
|
||||
}
|
132
hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java
Normal file
132
hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java
Normal file
@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.runtime.bsd_amd64;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.amd64.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.runtime.amd64.*;
|
||||
import sun.jvm.hotspot.runtime.x86.*;
|
||||
import sun.jvm.hotspot.types.*;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
|
||||
public class BsdAMD64JavaThreadPDAccess implements JavaThreadPDAccess {
|
||||
private static AddressField lastJavaFPField;
|
||||
private static AddressField osThreadField;
|
||||
|
||||
// Field from OSThread
|
||||
private static CIntegerField osThreadThreadIDField;
|
||||
|
||||
// This is currently unneeded but is being kept in case we change
|
||||
// the currentFrameGuess algorithm
|
||||
private static final long GUESS_SCAN_RANGE = 128 * 1024;
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver(new Observer() {
|
||||
public void update(Observable o, Object data) {
|
||||
initialize(VM.getVM().getTypeDataBase());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static synchronized void initialize(TypeDataBase db) {
|
||||
Type type = db.lookupType("JavaThread");
|
||||
osThreadField = type.getAddressField("_osthread");
|
||||
|
||||
Type anchorType = db.lookupType("JavaFrameAnchor");
|
||||
lastJavaFPField = anchorType.getAddressField("_last_Java_fp");
|
||||
|
||||
Type osThreadType = db.lookupType("OSThread");
|
||||
osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
|
||||
}
|
||||
|
||||
public Address getLastJavaFP(Address addr) {
|
||||
return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset()));
|
||||
}
|
||||
|
||||
public Address getLastJavaPC(Address addr) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Address getBaseOfStackPointer(Address addr) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Frame getLastFramePD(JavaThread thread, Address addr) {
|
||||
Address fp = thread.getLastJavaFP();
|
||||
if (fp == null) {
|
||||
return null; // no information
|
||||
}
|
||||
return new X86Frame(thread.getLastJavaSP(), fp);
|
||||
}
|
||||
|
||||
public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) {
|
||||
return new X86RegisterMap(thread, updateMap);
|
||||
}
|
||||
|
||||
public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
|
||||
ThreadProxy t = getThreadProxy(addr);
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) t.getContext();
|
||||
AMD64CurrentFrameGuess guesser = new AMD64CurrentFrameGuess(context, thread);
|
||||
if (!guesser.run(GUESS_SCAN_RANGE)) {
|
||||
return null;
|
||||
}
|
||||
if (guesser.getPC() == null) {
|
||||
return new X86Frame(guesser.getSP(), guesser.getFP());
|
||||
} else {
|
||||
return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC());
|
||||
}
|
||||
}
|
||||
|
||||
public void printThreadIDOn(Address addr, PrintStream tty) {
|
||||
tty.print(getThreadProxy(addr));
|
||||
}
|
||||
|
||||
public void printInfoOn(Address threadAddr, PrintStream tty) {
|
||||
tty.print("Thread id: ");
|
||||
printThreadIDOn(threadAddr, tty);
|
||||
// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr));
|
||||
}
|
||||
|
||||
public Address getLastSP(Address addr) {
|
||||
ThreadProxy t = getThreadProxy(addr);
|
||||
AMD64ThreadContext context = (AMD64ThreadContext) t.getContext();
|
||||
return context.getRegisterAsAddress(AMD64ThreadContext.RSP);
|
||||
}
|
||||
|
||||
public ThreadProxy getThreadProxy(Address addr) {
|
||||
// Addr is the address of the JavaThread.
|
||||
// Fetch the OSThread (for now and for simplicity, not making a
|
||||
// separate "OSThread" class in this package)
|
||||
Address osThreadAddr = osThreadField.getValue(addr);
|
||||
// Get the address of the _thread_id from the OSThread
|
||||
Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset());
|
||||
|
||||
JVMDebugger debugger = VM.getVM().getDebugger();
|
||||
return debugger.getThreadForIdentifierAddress(threadIdAddr);
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.runtime.bsd_x86;
|
||||
|
||||
public class BsdSignals {
|
||||
private static String[] signalNames = {
|
||||
"", /* No signal 0 */
|
||||
"SIGHUP", /* hangup */
|
||||
"SIGINT", /* interrupt */
|
||||
"SIGQUIT", /* quit */
|
||||
"SIGILL", /* illegal instr. (not reset when caught) */
|
||||
"SIGTRAP", /* trace trap (not reset when caught) */
|
||||
"SIGABRT", /* abort() */
|
||||
"SIGEMT", /* EMT instruction */
|
||||
"SIGFPE", /* floating point exception */
|
||||
"SIGKILL", /* kill (cannot be caught or ignored) */
|
||||
"SIGBUS", /* bus error */
|
||||
"SIGSEGV", /* segmentation violation */
|
||||
"SIGSYS", /* non-existent system call invoked */
|
||||
"SIGPIPE", /* write on a pipe with no one to read it */
|
||||
"SIGALRM", /* alarm clock */
|
||||
"SIGTERM", /* software termination signal from kill */
|
||||
"SIGURG", /* urgent condition on IO channel */
|
||||
"SIGSTOP", /* sendable stop signal not from tty */
|
||||
"SIGTSTP", /* stop signal from tty */
|
||||
"SIGCONT", /* continue a stopped process */
|
||||
"SIGCHLD", /* to parent on child stop or exit */
|
||||
"SIGTTIN", /* to readers pgrp upon background tty read */
|
||||
"SIGTTOU", /* like TTIN if (tp->t_local<OSTOP) */
|
||||
"SIGIO", /* input/output possible signal */
|
||||
"SIGXCPU", /* exceeded CPU time limit */
|
||||
"SIGXFSZ", /* exceeded file size limit */
|
||||
"SIGVTALRM", /* virtual time alarm */
|
||||
"SIGPROF", /* profiling time alarm */
|
||||
"SIGWINCH", /* window size changes */
|
||||
"SIGINFO", /* information request */
|
||||
"SIGUSR1", /* user defined signal 1 */
|
||||
"SIGUSR2" /* user defined signal 2 */
|
||||
};
|
||||
|
||||
public static String getSignalName(int sigNum) {
|
||||
if ((sigNum <= 0) || (sigNum >= signalNames.length)) {
|
||||
// Probably best to fail in a non-destructive way
|
||||
return "<Error: Illegal signal number " + sigNum + ">";
|
||||
}
|
||||
return signalNames[sigNum];
|
||||
}
|
||||
}
|
131
hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java
Normal file
131
hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_x86/BsdX86JavaThreadPDAccess.java
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.runtime.bsd_x86;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import sun.jvm.hotspot.debugger.*;
|
||||
import sun.jvm.hotspot.debugger.x86.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.runtime.x86.*;
|
||||
import sun.jvm.hotspot.types.*;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
|
||||
public class BsdX86JavaThreadPDAccess implements JavaThreadPDAccess {
|
||||
private static AddressField lastJavaFPField;
|
||||
private static AddressField osThreadField;
|
||||
|
||||
// Field from OSThread
|
||||
private static CIntegerField osThreadThreadIDField;
|
||||
|
||||
// This is currently unneeded but is being kept in case we change
|
||||
// the currentFrameGuess algorithm
|
||||
private static final long GUESS_SCAN_RANGE = 128 * 1024;
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver(new Observer() {
|
||||
public void update(Observable o, Object data) {
|
||||
initialize(VM.getVM().getTypeDataBase());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static synchronized void initialize(TypeDataBase db) {
|
||||
Type type = db.lookupType("JavaThread");
|
||||
osThreadField = type.getAddressField("_osthread");
|
||||
|
||||
Type anchorType = db.lookupType("JavaFrameAnchor");
|
||||
lastJavaFPField = anchorType.getAddressField("_last_Java_fp");
|
||||
|
||||
Type osThreadType = db.lookupType("OSThread");
|
||||
osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
|
||||
}
|
||||
|
||||
public Address getLastJavaFP(Address addr) {
|
||||
return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset()));
|
||||
}
|
||||
|
||||
public Address getLastJavaPC(Address addr) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Address getBaseOfStackPointer(Address addr) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public Frame getLastFramePD(JavaThread thread, Address addr) {
|
||||
Address fp = thread.getLastJavaFP();
|
||||
if (fp == null) {
|
||||
return null; // no information
|
||||
}
|
||||
return new X86Frame(thread.getLastJavaSP(), fp);
|
||||
}
|
||||
|
||||
public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) {
|
||||
return new X86RegisterMap(thread, updateMap);
|
||||
}
|
||||
|
||||
public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
|
||||
ThreadProxy t = getThreadProxy(addr);
|
||||
X86ThreadContext context = (X86ThreadContext) t.getContext();
|
||||
X86CurrentFrameGuess guesser = new X86CurrentFrameGuess(context, thread);
|
||||
if (!guesser.run(GUESS_SCAN_RANGE)) {
|
||||
return null;
|
||||
}
|
||||
if (guesser.getPC() == null) {
|
||||
return new X86Frame(guesser.getSP(), guesser.getFP());
|
||||
} else {
|
||||
return new X86Frame(guesser.getSP(), guesser.getFP(), guesser.getPC());
|
||||
}
|
||||
}
|
||||
|
||||
public void printThreadIDOn(Address addr, PrintStream tty) {
|
||||
tty.print(getThreadProxy(addr));
|
||||
}
|
||||
|
||||
public void printInfoOn(Address threadAddr, PrintStream tty) {
|
||||
tty.print("Thread id: ");
|
||||
printThreadIDOn(threadAddr, tty);
|
||||
// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr));
|
||||
}
|
||||
|
||||
public Address getLastSP(Address addr) {
|
||||
ThreadProxy t = getThreadProxy(addr);
|
||||
X86ThreadContext context = (X86ThreadContext) t.getContext();
|
||||
return context.getRegisterAsAddress(X86ThreadContext.ESP);
|
||||
}
|
||||
|
||||
public ThreadProxy getThreadProxy(Address addr) {
|
||||
// Addr is the address of the JavaThread.
|
||||
// Fetch the OSThread (for now and for simplicity, not making a
|
||||
// separate "OSThread" class in this package)
|
||||
Address osThreadAddr = osThreadField.getValue(addr);
|
||||
// Get the address of the _thread_id from the OSThread
|
||||
Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset());
|
||||
|
||||
JVMDebugger debugger = VM.getVM().getDebugger();
|
||||
return debugger.getThreadForIdentifierAddress(threadIdAddr);
|
||||
}
|
||||
}
|
@ -37,6 +37,14 @@ public class PlatformInfo {
|
||||
return "solaris";
|
||||
} else if (os.equals("Linux")) {
|
||||
return "linux";
|
||||
} else if (os.equals("FreeBSD")) {
|
||||
return "bsd";
|
||||
} else if (os.equals("NetBSD")) {
|
||||
return "bsd";
|
||||
} else if (os.equals("OpenBSD")) {
|
||||
return "bsd";
|
||||
} else if (os.equals("Darwin")) {
|
||||
return "bsd";
|
||||
} else if (os.startsWith("Windows")) {
|
||||
return "win32";
|
||||
} else {
|
||||
|
@ -323,28 +323,28 @@ endif
|
||||
ifneq ($(OSNAME),windows)
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
ifeq ($(SHARK_BUILD), true)
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(SHARK_DIR)/%.so
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_SERVER_DIR)/%.so: $(SHARK_DIR)/%.so
|
||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
else
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(ZERO_DIR)/%.so
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_SERVER_DIR)/%.so: $(ZERO_DIR)/%.so
|
||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
endif
|
||||
else
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(C1_DIR)/%.so
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.so: $(C2_DIR)/%.so
|
||||
$(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_CLIENT_DIR)/%.so: $(C1_DIR)/%.so
|
||||
$(EXPORT_CLIENT_DIR)/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_CLIENT_DIR)/64/%.so: $(C1_DIR)/%.so
|
||||
$(EXPORT_CLIENT_DIR)/64/%.$(LIBRARY_SUFFIX): $(C1_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_SERVER_DIR)/%.so: $(C2_DIR)/%.so
|
||||
$(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
$(EXPORT_SERVER_DIR)/64/%.so: $(C2_DIR)/%.so
|
||||
$(EXPORT_SERVER_DIR)/64/%.$(LIBRARY_SUFFIX): $(C2_DIR)/%.$(LIBRARY_SUFFIX)
|
||||
$(install-file)
|
||||
endif
|
||||
endif
|
||||
|
371
hotspot/make/bsd/Makefile
Normal file
371
hotspot/make/bsd/Makefile
Normal file
@ -0,0 +1,371 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This makefile creates a build tree and lights off a build.
|
||||
# You can go back into the build tree and perform rebuilds or
|
||||
# incremental builds as desired. Be sure to reestablish
|
||||
# environment variable settings for LD_LIBRARY_PATH and JAVA_HOME.
|
||||
|
||||
# The make process now relies on java and javac. These can be
|
||||
# specified either implicitly on the PATH, by setting the
|
||||
# (JDK-inherited) ALT_BOOTDIR environment variable to full path to a
|
||||
# JDK in which bin/java and bin/javac are present and working (e.g.,
|
||||
# /usr/local/java/jdk1.3/solaris), or via the (JDK-inherited)
|
||||
# default BOOTDIR path value. Note that one of ALT_BOOTDIR
|
||||
# or BOOTDIR has to be set. We do *not* search javac, javah, rmic etc.
|
||||
# from the PATH.
|
||||
#
|
||||
# One can set ALT_BOOTDIR or BOOTDIR to point to a jdk that runs on
|
||||
# an architecture that differs from the target architecture, as long
|
||||
# as the bootstrap jdk runs under the same flavor of OS as the target
|
||||
# (i.e., if the target is linux, point to a jdk that runs on a linux
|
||||
# box). In order to use such a bootstrap jdk, set the make variable
|
||||
# REMOTE to the desired remote command mechanism, e.g.,
|
||||
#
|
||||
# make REMOTE="rsh -l me myotherlinuxbox"
|
||||
|
||||
# Along with VM, Serviceability Agent (SA) is built for SA/JDI binding.
|
||||
# JDI binding on SA produces two binaries:
|
||||
# 1. sa-jdi.jar - This is build before building libjvm[_g].so
|
||||
# Please refer to ./makefiles/sa.make
|
||||
# 2. libsa[_g].so - Native library for SA - This is built after
|
||||
# libjsig[_g].so (signal interposition library)
|
||||
# Please refer to ./makefiles/vm.make
|
||||
# If $(GAMMADIR)/agent dir is not present, SA components are not built.
|
||||
|
||||
ifeq ($(GAMMADIR),)
|
||||
include ../../make/defs.make
|
||||
else
|
||||
include $(GAMMADIR)/make/defs.make
|
||||
endif
|
||||
include $(GAMMADIR)/make/$(OSNAME)/makefiles/rules.make
|
||||
|
||||
ifndef CC_INTERP
|
||||
ifndef FORCE_TIERED
|
||||
FORCE_TIERED=1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef LP64
|
||||
ifeq ("$(filter $(LP64_ARCH),$(BUILDARCH))","")
|
||||
_JUNK_ := $(shell echo >&2 \
|
||||
$(OSNAME) $(ARCH) "*** ERROR: this platform does not support 64-bit compilers!")
|
||||
@exit 1
|
||||
endif
|
||||
endif
|
||||
|
||||
# we need to set up LP64 correctly to satisfy sanity checks in adlc
|
||||
ifneq ("$(filter $(LP64_ARCH),$(BUILDARCH))","")
|
||||
MFLAGS += " LP64=1 "
|
||||
endif
|
||||
|
||||
# pass USE_SUNCC further, through MFLAGS
|
||||
ifdef USE_SUNCC
|
||||
MFLAGS += " USE_SUNCC=1 "
|
||||
endif
|
||||
|
||||
# The following renders pathnames in generated Makefiles valid on
|
||||
# machines other than the machine containing the build tree.
|
||||
#
|
||||
# For example, let's say my build tree lives on /files12 on
|
||||
# exact.east.sun.com. This logic will cause GAMMADIR to begin with
|
||||
# /net/exact/files12/...
|
||||
#
|
||||
# We only do this on SunOS variants, for a couple of reasons:
|
||||
# * It is extremely rare that source trees exist on other systems
|
||||
# * It has been claimed that the Linux automounter is flakey, so
|
||||
# changing GAMMADIR in a way that exercises the automounter could
|
||||
# prove to be a source of unreliability in the build process.
|
||||
# Obviously, this Makefile is only relevant on SunOS boxes to begin
|
||||
# with, but the SunOS conditionalization will make it easier to
|
||||
# combine Makefiles in the future (assuming we ever do that).
|
||||
|
||||
ifeq ($(OSNAME),solaris)
|
||||
|
||||
# prepend current directory to relative pathnames.
|
||||
NEW_GAMMADIR := \
|
||||
$(shell echo $(GAMMADIR) | \
|
||||
sed -e "s=^\([^/].*\)=$(shell pwd)/\1=" \
|
||||
)
|
||||
unexport NEW_GAMMADIR
|
||||
|
||||
# If NEW_GAMMADIR doesn't already start with "/net/":
|
||||
ifeq ($(strip $(filter /net/%,$(NEW_GAMMADIR))),)
|
||||
# prepend /net/$(HOST)
|
||||
# remove /net/$(HOST) if name already began with /home/
|
||||
# remove /net/$(HOST) if name already began with /java/
|
||||
# remove /net/$(HOST) if name already began with /lab/
|
||||
NEW_GAMMADIR := \
|
||||
$(shell echo $(NEW_GAMMADIR) | \
|
||||
sed -e "s=^\(.*\)=/net/$(HOST)\1=" \
|
||||
-e "s=^/net/$(HOST)/home/=/home/=" \
|
||||
-e "s=^/net/$(HOST)/java/=/java/=" \
|
||||
-e "s=^/net/$(HOST)/lab/=/lab/=" \
|
||||
)
|
||||
# Don't use the new value for GAMMADIR unless a file with the new
|
||||
# name actually exists.
|
||||
ifneq ($(wildcard $(NEW_GAMMADIR)),)
|
||||
GAMMADIR := $(NEW_GAMMADIR)
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
# BUILDARCH is set to "zero" for Zero builds. VARIANTARCH
|
||||
# is used to give the build directories meaningful names.
|
||||
VARIANTARCH = $(subst i386,i486,$(ZERO_LIBARCH))
|
||||
|
||||
# There is a (semi-) regular correspondence between make targets and actions:
|
||||
#
|
||||
# Target Tree Type Build Dir
|
||||
#
|
||||
# debug compiler2 <os>_<arch>_compiler2/debug
|
||||
# fastdebug compiler2 <os>_<arch>_compiler2/fastdebug
|
||||
# jvmg compiler2 <os>_<arch>_compiler2/jvmg
|
||||
# optimized compiler2 <os>_<arch>_compiler2/optimized
|
||||
# profiled compiler2 <os>_<arch>_compiler2/profiled
|
||||
# product compiler2 <os>_<arch>_compiler2/product
|
||||
#
|
||||
# debug1 compiler1 <os>_<arch>_compiler1/debug
|
||||
# fastdebug1 compiler1 <os>_<arch>_compiler1/fastdebug
|
||||
# jvmg1 compiler1 <os>_<arch>_compiler1/jvmg
|
||||
# optimized1 compiler1 <os>_<arch>_compiler1/optimized
|
||||
# profiled1 compiler1 <os>_<arch>_compiler1/profiled
|
||||
# product1 compiler1 <os>_<arch>_compiler1/product
|
||||
#
|
||||
# debugcore core <os>_<arch>_core/debug
|
||||
# fastdebugcore core <os>_<arch>_core/fastdebug
|
||||
# jvmgcore core <os>_<arch>_core/jvmg
|
||||
# optimizedcore core <os>_<arch>_core/optimized
|
||||
# profiledcore core <os>_<arch>_core/profiled
|
||||
# productcore core <os>_<arch>_core/product
|
||||
#
|
||||
# debugzero zero <os>_<arch>_zero/debug
|
||||
# fastdebugzero zero <os>_<arch>_zero/fastdebug
|
||||
# jvmgzero zero <os>_<arch>_zero/jvmg
|
||||
# optimizedzero zero <os>_<arch>_zero/optimized
|
||||
# profiledzero zero <os>_<arch>_zero/profiled
|
||||
# productzero zero <os>_<arch>_zero/product
|
||||
#
|
||||
# debugshark shark <os>_<arch>_shark/debug
|
||||
# fastdebugshark shark <os>_<arch>_shark/fastdebug
|
||||
# jvmgshark shark <os>_<arch>_shark/jvmg
|
||||
# optimizedshark shark <os>_<arch>_shark/optimized
|
||||
# profiledshark shark <os>_<arch>_shark/profiled
|
||||
# productshark shark <os>_<arch>_shark/product
|
||||
#
|
||||
# What you get with each target:
|
||||
#
|
||||
# debug* - "thin" libjvm_g - debug info linked into the gamma_g launcher
|
||||
# fastdebug* - optimized compile, but with asserts enabled
|
||||
# jvmg* - "fat" libjvm_g - debug info linked into libjvm_g.so
|
||||
# optimized* - optimized compile, no asserts
|
||||
# profiled* - gprof
|
||||
# product* - the shippable thing: optimized compile, no asserts, -DPRODUCT
|
||||
|
||||
# This target list needs to be coordinated with the usage message
|
||||
# in the build.sh script:
|
||||
TARGETS = debug jvmg fastdebug optimized profiled product
|
||||
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
SUBDIR_DOCS = $(OSNAME)_$(VARIANTARCH)_docs
|
||||
else
|
||||
SUBDIR_DOCS = $(OSNAME)_$(BUILDARCH)_docs
|
||||
endif
|
||||
SUBDIRS_C1 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler1/,$(TARGETS))
|
||||
SUBDIRS_C2 = $(addprefix $(OSNAME)_$(BUILDARCH)_compiler2/,$(TARGETS))
|
||||
SUBDIRS_TIERED = $(addprefix $(OSNAME)_$(BUILDARCH)_tiered/,$(TARGETS))
|
||||
SUBDIRS_CORE = $(addprefix $(OSNAME)_$(BUILDARCH)_core/,$(TARGETS))
|
||||
SUBDIRS_ZERO = $(addprefix $(OSNAME)_$(VARIANTARCH)_zero/,$(TARGETS))
|
||||
SUBDIRS_SHARK = $(addprefix $(OSNAME)_$(VARIANTARCH)_shark/,$(TARGETS))
|
||||
|
||||
TARGETS_C2 = $(TARGETS)
|
||||
TARGETS_C1 = $(addsuffix 1,$(TARGETS))
|
||||
TARGETS_TIERED = $(addsuffix tiered,$(TARGETS))
|
||||
TARGETS_CORE = $(addsuffix core,$(TARGETS))
|
||||
TARGETS_ZERO = $(addsuffix zero,$(TARGETS))
|
||||
TARGETS_SHARK = $(addsuffix shark,$(TARGETS))
|
||||
|
||||
BUILDTREE_MAKE = $(GAMMADIR)/make/$(OSNAME)/makefiles/buildtree.make
|
||||
BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OSNAME) SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH)
|
||||
BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HOTSPOT_RELEASE_VERSION) HOTSPOT_BUILD_VERSION=$(HOTSPOT_BUILD_VERSION) JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
|
||||
|
||||
BUILDTREE = $(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_VARS)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
# Could make everything by default, but that would take a while.
|
||||
all:
|
||||
@echo "Try '$(MAKE) <target> ...' where <target> is one or more of"
|
||||
@echo " $(TARGETS_C2)"
|
||||
@echo " $(TARGETS_C1)"
|
||||
@echo " $(TARGETS_CORE)"
|
||||
@echo " $(TARGETS_ZERO)"
|
||||
@echo " $(TARGETS_SHARK)"
|
||||
|
||||
checks: check_os_version check_j2se_version
|
||||
|
||||
# We do not want people accidentally building on old systems (e.g. Linux 2.2.x,
|
||||
# Solaris 2.5.1, 2.6).
|
||||
# Disable this check by setting DISABLE_HOTSPOT_OS_VERSION_CHECK=ok.
|
||||
|
||||
#SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7%
|
||||
DISABLE_HOTSPOT_OS_VERSION_CHECK = ok
|
||||
OS_VERSION := $(shell uname -r)
|
||||
EMPTY_IF_NOT_SUPPORTED = $(filter $(SUPPORTED_OS_VERSION),$(OS_VERSION))
|
||||
|
||||
check_os_version:
|
||||
ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
|
||||
$(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1;
|
||||
endif
|
||||
|
||||
# jvmti.make requires XSLT (J2SE 1.4.x or newer):
|
||||
XSLT_CHECK = $(REMOTE) $(RUN.JAVAP) javax.xml.transform.TransformerFactory
|
||||
# If not found then fail fast.
|
||||
check_j2se_version:
|
||||
$(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \
|
||||
if [ $$? -ne 0 ]; then \
|
||||
$(REMOTE) $(RUN.JAVA) -version; \
|
||||
echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \
|
||||
"to bootstrap this build" 1>&2; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
$(SUBDIRS_TIERED): $(BUILDTREE_MAKE)
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=tiered
|
||||
|
||||
$(SUBDIRS_C2): $(BUILDTREE_MAKE)
|
||||
ifeq ($(FORCE_TIERED),1)
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=tiered FORCE_TIERED=1
|
||||
else
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=compiler2
|
||||
endif
|
||||
|
||||
$(SUBDIRS_C1): $(BUILDTREE_MAKE)
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=compiler1
|
||||
|
||||
$(SUBDIRS_CORE): $(BUILDTREE_MAKE)
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=core
|
||||
|
||||
$(SUBDIRS_ZERO): $(BUILDTREE_MAKE) platform_zero
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=zero VARIANTARCH=$(VARIANTARCH)
|
||||
|
||||
$(SUBDIRS_SHARK): $(BUILDTREE_MAKE) platform_zero
|
||||
$(QUIETLY) $(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/Makefile checks
|
||||
$(BUILDTREE) VARIANT=shark VARIANTARCH=$(VARIANTARCH)
|
||||
|
||||
platform_zero: $(GAMMADIR)/make/$(OSNAME)/platform_zero.in
|
||||
$(SED) 's/@ZERO_ARCHDEF@/$(ZERO_ARCHDEF)/g;s/@ZERO_LIBARCH@/$(ZERO_LIBARCH)/g;' < $< > $@
|
||||
|
||||
# Define INSTALL=y at command line to automatically copy JVM into JAVA_HOME
|
||||
|
||||
$(TARGETS_C2): $(SUBDIRS_C2)
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler2/$@ && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler2/$@ && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler2/$@ && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
$(TARGETS_TIERED): $(SUBDIRS_TIERED)
|
||||
cd $(OSNAME)_$(BUILDARCH)_tiered/$(patsubst %tiered,%,$@) && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(BUILDARCH)_tiered/$(patsubst %tiered,%,$@) && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(BUILDARCH)_tiered/$(patsubst %tiered,%,$@) && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
$(TARGETS_C1): $(SUBDIRS_C1)
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler1/$(patsubst %1,%,$@) && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler1/$(patsubst %1,%,$@) && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(BUILDARCH)_compiler1/$(patsubst %1,%,$@) && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
$(TARGETS_CORE): $(SUBDIRS_CORE)
|
||||
cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(BUILDARCH)_core/$(patsubst %core,%,$@) && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
$(TARGETS_ZERO): $(SUBDIRS_ZERO)
|
||||
cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(VARIANTARCH)_zero/$(patsubst %zero,%,$@) && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
$(TARGETS_SHARK): $(SUBDIRS_SHARK)
|
||||
cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS)
|
||||
cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && ./test_gamma
|
||||
ifdef INSTALL
|
||||
cd $(OSNAME)_$(VARIANTARCH)_shark/$(patsubst %shark,%,$@) && $(MAKE) $(MFLAGS) install
|
||||
endif
|
||||
|
||||
# Just build the tree, and nothing else:
|
||||
tree: $(SUBDIRS_C2)
|
||||
tree1: $(SUBDIRS_C1)
|
||||
treecore: $(SUBDIRS_CORE)
|
||||
treezero: $(SUBDIRS_ZERO)
|
||||
treeshark: $(SUBDIRS_SHARK)
|
||||
|
||||
# Doc target. This is the same for all build options.
|
||||
# Hence create a docs directory beside ...$(ARCH)_[...]
|
||||
docs: checks
|
||||
$(QUIETLY) mkdir -p $(SUBDIR_DOCS)
|
||||
$(MAKE) -f $(GAMMADIR)/make/$(OSNAME)/makefiles/jvmti.make $(MFLAGS) $(BUILDTREE_VARS) JvmtiOutDir=$(SUBDIR_DOCS) jvmtidocs
|
||||
|
||||
# Synonyms for win32-like targets.
|
||||
compiler2: jvmg product
|
||||
|
||||
compiler1: jvmg1 product1
|
||||
|
||||
core: jvmgcore productcore
|
||||
|
||||
zero: jvmgzero productzero
|
||||
|
||||
shark: jvmgshark productshark
|
||||
|
||||
clean_docs:
|
||||
rm -rf $(SUBDIR_DOCS)
|
||||
|
||||
clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark:
|
||||
rm -rf $(OSNAME)_$(BUILDARCH)_$(subst clean_,,$@)
|
||||
|
||||
clean: clean_compiler2 clean_compiler1 clean_core clean_zero clean_shark clean_docs
|
||||
|
||||
include $(GAMMADIR)/make/cscope.make
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
.PHONY: $(TARGETS_C2) $(TARGETS_C1) $(TARGETS_CORE) $(TARGETS_ZERO) $(TARGETS_SHARK)
|
||||
.PHONY: tree tree1 treecore treezero treeshark
|
||||
.PHONY: all compiler1 compiler2 core zero shark
|
||||
.PHONY: clean clean_compiler1 clean_compiler2 clean_core clean_zero clean_shark docs clean_docs
|
||||
.PHONY: checks check_os_version check_j2se_version
|
26
hotspot/make/bsd/README
Normal file
26
hotspot/make/bsd/README
Normal file
@ -0,0 +1,26 @@
|
||||
Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
|
||||
________________________________________________________________________
|
||||
|
||||
Please refer to the comments in the Makefile in this directory
|
||||
for instructions how to build the Solaris versions.
|
||||
|
20
hotspot/make/bsd/adlc_updater
Normal file
20
hotspot/make/bsd/adlc_updater
Normal file
@ -0,0 +1,20 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# This file is used by adlc.make to selectively update generated
|
||||
# adlc files. Because source and target diretories are relative
|
||||
# paths, this file is copied to the target build directory before
|
||||
# use.
|
||||
#
|
||||
# adlc-updater <file> <source-dir> <target-dir>
|
||||
#
|
||||
fix_lines() {
|
||||
# repair bare #line directives in $1 to refer to $2
|
||||
awk < $1 > $1+ '
|
||||
/^#line 999999$/ {print "#line " (NR+1) " \"" F2 "\""; next}
|
||||
{print}
|
||||
' F2=$2
|
||||
mv $1+ $1
|
||||
}
|
||||
fix_lines $2/$1 $3/$1
|
||||
[ -f $3/$1 ] && cmp -s $2/$1 $3/$1 || \
|
||||
( [ -f $3/$1 ] && echo Updating $3/$1 ; touch $2/made-change ; mv $2/$1 $3/$1 )
|
95
hotspot/make/bsd/build.sh
Normal file
95
hotspot/make/bsd/build.sh
Normal file
@ -0,0 +1,95 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Make sure the variable JAVA_HOME is set before running this script.
|
||||
|
||||
set -u
|
||||
|
||||
|
||||
if [ $# != 2 ]; then
|
||||
echo "Usage : $0 Build_Options Location"
|
||||
echo "Build Options : debug or optimized or basicdebug or basic or clean"
|
||||
echo "Location : specify any workspace which has gamma sources"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Just in case:
|
||||
case ${JAVA_HOME} in
|
||||
/*) true;;
|
||||
?*) JAVA_HOME=`( cd $JAVA_HOME; pwd )`;;
|
||||
esac
|
||||
|
||||
case `uname -m` in
|
||||
i386|i486|i586|i686)
|
||||
mach=i386
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported machine: " `uname -m`
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ "${JAVA_HOME}" = "" -o ! -d "${JAVA_HOME}" -o ! -d ${JAVA_HOME}/jre/lib/${mach} ]; then
|
||||
echo "JAVA_HOME needs to be set to a valid JDK path"
|
||||
echo "ksh : export JAVA_HOME=/net/tetrasparc/export/gobi/JDK1.2_fcs_V/bsd"
|
||||
echo "csh : setenv JAVA_HOME /net/tetrasparc/export/gobi/JDK1.2_fcs_V/bsd"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
LD_LIBRARY_PATH=${JAVA_HOME}/jre/lib/`uname -p`:\
|
||||
${JAVA_HOME}/jre/lib/`uname -p`/native_threads:${LD_LIBRARY_PATH-.}
|
||||
|
||||
# This is necessary as long as we are using the old launcher
|
||||
# with the new distribution format:
|
||||
CLASSPATH=${JAVA_HOME}/jre/lib/rt.jar:${CLASSPATH-.}
|
||||
|
||||
|
||||
for gm in gmake gnumake
|
||||
do
|
||||
if [ "${GNUMAKE-}" != "" ]; then break; fi
|
||||
($gm --version >/dev/null) 2>/dev/null && GNUMAKE=$gm
|
||||
done
|
||||
: ${GNUMAKE:?'Cannot locate the gnumake program. Stop.'}
|
||||
|
||||
|
||||
echo "### ENVIRONMENT SETTINGS:"
|
||||
export JAVA_HOME ; echo "JAVA_HOME=$JAVA_HOME"
|
||||
export LD_LIBRARY_PATH ; echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
|
||||
export CLASSPATH ; echo "CLASSPATH=$CLASSPATH"
|
||||
export GNUMAKE ; echo "GNUMAKE=$GNUMAKE"
|
||||
echo "###"
|
||||
|
||||
Build_Options=$1
|
||||
Location=$2
|
||||
|
||||
case ${Location} in
|
||||
/*) true;;
|
||||
?*) Location=`(cd ${Location}; pwd)`;;
|
||||
esac
|
||||
|
||||
echo \
|
||||
${GNUMAKE} -f ${Location}/make/bsd/Makefile $Build_Options GAMMADIR=${Location}
|
||||
${GNUMAKE} -f ${Location}/make/bsd/Makefile $Build_Options GAMMADIR=${Location}
|
87
hotspot/make/bsd/makefiles/adjust-mflags.sh
Normal file
87
hotspot/make/bsd/makefiles/adjust-mflags.sh
Normal file
@ -0,0 +1,87 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This script is used only from top.make.
|
||||
# The macro $(MFLAGS-adjusted) calls this script to
|
||||
# adjust the "-j" arguments to take into account
|
||||
# the HOTSPOT_BUILD_JOBS variable. The default
|
||||
# handling of the "-j" argument by gnumake does
|
||||
# not meet our needs, so we must adjust it ourselves.
|
||||
|
||||
# This argument adjustment applies to two recursive
|
||||
# calls to "$(MAKE) $(MFLAGS-adjusted)" in top.make.
|
||||
# One invokes adlc.make, and the other invokes vm.make.
|
||||
# The adjustment propagates the desired concurrency
|
||||
# level down to the sub-make (of the adlc or vm).
|
||||
# The default behavior of gnumake is to run all
|
||||
# sub-makes without concurrency ("-j1").
|
||||
|
||||
# Also, we use a make variable rather than an explicit
|
||||
# "-j<N>" argument to control this setting, so that
|
||||
# the concurrency setting (which must be tuned separately
|
||||
# for each MP system) can be set via an environment variable.
|
||||
# The recommended setting is 1.5x to 2x the number of available
|
||||
# CPUs on the MP system, which is large enough to keep the CPUs
|
||||
# busy (even though some jobs may be I/O bound) but not too large,
|
||||
# we may presume, to overflow the system's swap space.
|
||||
|
||||
set -eu
|
||||
|
||||
default_build_jobs=4
|
||||
|
||||
case $# in
|
||||
[12]) true;;
|
||||
*) >&2 echo "Usage: $0 ${MFLAGS} ${HOTSPOT_BUILD_JOBS}"; exit 2;;
|
||||
esac
|
||||
|
||||
MFLAGS=$1
|
||||
HOTSPOT_BUILD_JOBS=${2-}
|
||||
|
||||
# Normalize any -jN argument to the form " -j${HBJ}"
|
||||
MFLAGS=`
|
||||
echo "$MFLAGS" \
|
||||
| sed '
|
||||
s/^-/ -/
|
||||
s/ -\([^ ][^ ]*\)j/ -\1 -j/
|
||||
s/ -j[0-9][0-9]*/ -j/
|
||||
s/ -j\([^ ]\)/ -j -\1/
|
||||
s/ -j/ -j'${HOTSPOT_BUILD_JOBS:-${default_build_jobs}}'/
|
||||
' `
|
||||
|
||||
case ${HOTSPOT_BUILD_JOBS} in \
|
||||
|
||||
'') case ${MFLAGS} in
|
||||
*\ -j*)
|
||||
>&2 echo "# Note: -jN is ineffective for setting parallelism in this makefile."
|
||||
>&2 echo "# please set HOTSPOT_BUILD_JOBS=${default_build_jobs} in the command line or environment."
|
||||
esac;;
|
||||
|
||||
?*) case ${MFLAGS} in
|
||||
*\ -j*) true;;
|
||||
*) MFLAGS="-j${HOTSPOT_BUILD_JOBS} ${MFLAGS}";;
|
||||
esac;;
|
||||
esac
|
||||
|
||||
echo "${MFLAGS}"
|
226
hotspot/make/bsd/makefiles/adlc.make
Normal file
226
hotspot/make/bsd/makefiles/adlc.make
Normal file
@ -0,0 +1,226 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This makefile (adlc.make) is included from the adlc.make in the
|
||||
# build directories.
|
||||
# It knows how to compile, link, and run the adlc.
|
||||
|
||||
include $(GAMMADIR)/make/$(Platform_os_family)/makefiles/rules.make
|
||||
|
||||
# #########################################################################
|
||||
|
||||
# OUTDIR must be the same as AD_Dir = $(GENERATED)/adfiles in top.make:
|
||||
GENERATED = ../generated
|
||||
OUTDIR = $(GENERATED)/adfiles
|
||||
|
||||
ARCH = $(Platform_arch)
|
||||
OS = $(Platform_os_family)
|
||||
|
||||
SOURCE.AD = $(OUTDIR)/$(OS)_$(Platform_arch_model).ad
|
||||
|
||||
SOURCES.AD = \
|
||||
$(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(ARCH)/vm/$(Platform_arch_model).ad) \
|
||||
$(call altsrc-replace,$(HS_COMMON_SRC)/os_cpu/$(OS)_$(ARCH)/vm/$(OS)_$(Platform_arch_model).ad)
|
||||
|
||||
EXEC = $(OUTDIR)/adlc
|
||||
|
||||
# set VPATH so make knows where to look for source files
|
||||
Src_Dirs_V += $(GAMMADIR)/src/share/vm/adlc
|
||||
VPATH += $(Src_Dirs_V:%=%:)
|
||||
|
||||
# set INCLUDES for C preprocessor
|
||||
Src_Dirs_I += $(GAMMADIR)/src/share/vm/adlc $(GENERATED)
|
||||
INCLUDES += $(Src_Dirs_I:%=-I%)
|
||||
|
||||
# set flags for adlc compilation
|
||||
CPPFLAGS = $(SYSDEFS) $(INCLUDES)
|
||||
|
||||
# Force assertions on.
|
||||
CPPFLAGS += -DASSERT
|
||||
|
||||
# CFLAGS_WARN holds compiler options to suppress/enable warnings.
|
||||
# Compiler warnings are treated as errors
|
||||
CFLAGS_WARN = -Werror
|
||||
CFLAGS += $(CFLAGS_WARN)
|
||||
|
||||
OBJECTNAMES = \
|
||||
adlparse.o \
|
||||
archDesc.o \
|
||||
arena.o \
|
||||
dfa.o \
|
||||
dict2.o \
|
||||
filebuff.o \
|
||||
forms.o \
|
||||
formsopt.o \
|
||||
formssel.o \
|
||||
main.o \
|
||||
adlc-opcodes.o \
|
||||
output_c.o \
|
||||
output_h.o \
|
||||
|
||||
OBJECTS = $(OBJECTNAMES:%=$(OUTDIR)/%)
|
||||
|
||||
GENERATEDNAMES = \
|
||||
ad_$(Platform_arch_model).cpp \
|
||||
ad_$(Platform_arch_model).hpp \
|
||||
ad_$(Platform_arch_model)_clone.cpp \
|
||||
ad_$(Platform_arch_model)_expand.cpp \
|
||||
ad_$(Platform_arch_model)_format.cpp \
|
||||
ad_$(Platform_arch_model)_gen.cpp \
|
||||
ad_$(Platform_arch_model)_misc.cpp \
|
||||
ad_$(Platform_arch_model)_peephole.cpp \
|
||||
ad_$(Platform_arch_model)_pipeline.cpp \
|
||||
adGlobals_$(Platform_arch_model).hpp \
|
||||
dfa_$(Platform_arch_model).cpp \
|
||||
|
||||
GENERATEDFILES = $(GENERATEDNAMES:%=$(OUTDIR)/%)
|
||||
|
||||
# #########################################################################
|
||||
|
||||
all: $(EXEC)
|
||||
|
||||
$(EXEC) : $(OBJECTS)
|
||||
@echo Making adlc
|
||||
$(QUIETLY) $(HOST.LINK_NOPROF.CC) -o $(EXEC) $(OBJECTS)
|
||||
|
||||
# Random dependencies:
|
||||
$(OBJECTS): opcodes.hpp classes.hpp adlc.hpp adlcVMDeps.hpp adlparse.hpp archDesc.hpp arena.hpp dict2.hpp filebuff.hpp forms.hpp formsopt.hpp formssel.hpp
|
||||
|
||||
# The source files refer to ostream.h, which sparcworks calls iostream.h
|
||||
$(OBJECTS): ostream.h
|
||||
|
||||
ostream.h :
|
||||
@echo >$@ '#include <iostream.h>'
|
||||
|
||||
dump:
|
||||
: OUTDIR=$(OUTDIR)
|
||||
: OBJECTS=$(OBJECTS)
|
||||
: products = $(GENERATEDFILES)
|
||||
|
||||
all: $(GENERATEDFILES)
|
||||
|
||||
$(GENERATEDFILES): refresh_adfiles
|
||||
|
||||
# Get a unique temporary directory name, so multiple makes can run in parallel.
|
||||
# Note that product files are updated via "mv", which is atomic.
|
||||
TEMPDIR := $(OUTDIR)/mktmp$(shell echo $$$$)
|
||||
|
||||
# Debuggable by default
|
||||
CFLAGS += -g
|
||||
|
||||
# Pass -D flags into ADLC.
|
||||
ADLCFLAGS += $(SYSDEFS)
|
||||
|
||||
# Note "+="; it is a hook so flags.make can add more flags, like -g or -DFOO.
|
||||
ADLCFLAGS += -q -T
|
||||
|
||||
# Normally, debugging is done directly on the ad_<arch>*.cpp files.
|
||||
# But -g will put #line directives in those files pointing back to <arch>.ad.
|
||||
# Some builds of gcc 3.2 have a bug that gets tickled by the extra #line directives
|
||||
# so skip it for 3.2 and ealier.
|
||||
ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
|
||||
ADLCFLAGS += -g
|
||||
endif
|
||||
|
||||
ifdef LP64
|
||||
ADLCFLAGS += -D_LP64
|
||||
else
|
||||
ADLCFLAGS += -U_LP64
|
||||
endif
|
||||
|
||||
#
|
||||
# adlc_updater is a simple sh script, under sccs control. It is
|
||||
# used to selectively update generated adlc files. This should
|
||||
# provide a nice compilation speed improvement.
|
||||
#
|
||||
ADLC_UPDATER_DIRECTORY = $(GAMMADIR)/make/$(OS)
|
||||
ADLC_UPDATER = adlc_updater
|
||||
$(ADLC_UPDATER): $(ADLC_UPDATER_DIRECTORY)/$(ADLC_UPDATER)
|
||||
$(QUIETLY) cp $< $@; chmod +x $@
|
||||
|
||||
# This action refreshes all generated adlc files simultaneously.
|
||||
# The way it works is this:
|
||||
# 1) create a scratch directory to work in.
|
||||
# 2) if the current working directory does not have $(ADLC_UPDATER), copy it.
|
||||
# 3) run the compiled adlc executable. This will create new adlc files in the scratch directory.
|
||||
# 4) call $(ADLC_UPDATER) on each generated adlc file. It will selectively update changed or missing files.
|
||||
# 5) If we actually updated any files, echo a notice.
|
||||
#
|
||||
refresh_adfiles: $(EXEC) $(SOURCE.AD) $(ADLC_UPDATER)
|
||||
@rm -rf $(TEMPDIR); mkdir $(TEMPDIR)
|
||||
$(QUIETLY) $(EXEC) $(ADLCFLAGS) $(SOURCE.AD) \
|
||||
-c$(TEMPDIR)/ad_$(Platform_arch_model).cpp -h$(TEMPDIR)/ad_$(Platform_arch_model).hpp -a$(TEMPDIR)/dfa_$(Platform_arch_model).cpp -v$(TEMPDIR)/adGlobals_$(Platform_arch_model).hpp \
|
||||
|| { rm -rf $(TEMPDIR); exit 1; }
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model).cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model).hpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_clone.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_expand.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_format.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_gen.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_misc.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_peephole.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) ad_$(Platform_arch_model)_pipeline.cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) adGlobals_$(Platform_arch_model).hpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) ./$(ADLC_UPDATER) dfa_$(Platform_arch_model).cpp $(TEMPDIR) $(OUTDIR)
|
||||
$(QUIETLY) [ -f $(TEMPDIR)/made-change ] \
|
||||
|| echo "Rescanned $(SOURCE.AD) but encountered no changes."
|
||||
$(QUIETLY) rm -rf $(TEMPDIR)
|
||||
|
||||
|
||||
# #########################################################################
|
||||
|
||||
$(SOURCE.AD): $(SOURCES.AD)
|
||||
$(QUIETLY) $(PROCESS_AD_FILES) $(SOURCES.AD) > $(SOURCE.AD)
|
||||
|
||||
#PROCESS_AD_FILES = cat
|
||||
# Pass through #line directives, in case user enables -g option above:
|
||||
PROCESS_AD_FILES = awk '{ \
|
||||
if (CUR_FN != FILENAME) { CUR_FN=FILENAME; NR_BASE=NR-1; need_lineno=1 } \
|
||||
if (need_lineno && $$0 !~ /\/\//) \
|
||||
{ print "\n\n\#line " (NR-NR_BASE) " \"" FILENAME "\""; need_lineno=0 }; \
|
||||
print }'
|
||||
|
||||
$(OUTDIR)/%.o: %.cpp
|
||||
@echo Compiling $<
|
||||
$(QUIETLY) $(REMOVE_TARGET)
|
||||
$(QUIETLY) $(HOST.COMPILE.CC) -o $@ $< $(COMPILE_DONE)
|
||||
|
||||
# Some object files are given a prefix, to disambiguate
|
||||
# them from objects of the same name built for the VM.
|
||||
$(OUTDIR)/adlc-%.o: %.cpp
|
||||
@echo Compiling $<
|
||||
$(QUIETLY) $(REMOVE_TARGET)
|
||||
$(QUIETLY) $(HOST.COMPILE.CC) -o $@ $< $(COMPILE_DONE)
|
||||
|
||||
# #########################################################################
|
||||
|
||||
clean :
|
||||
rm $(OBJECTS)
|
||||
|
||||
cleanall :
|
||||
rm $(OBJECTS) $(EXEC)
|
||||
|
||||
# #########################################################################
|
||||
|
||||
.PHONY: all dump refresh_adfiles clean cleanall
|
39
hotspot/make/bsd/makefiles/amd64.make
Normal file
39
hotspot/make/bsd/makefiles/amd64.make
Normal file
@ -0,0 +1,39 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT)
|
||||
# The copied fdlibm routines in sharedRuntimeTrans.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrans.o = $(OPT_CFLAGS/NOOPT)
|
||||
# Must also specify if CPU is little endian
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
||||
|
||||
CFLAGS += -D_LP64=1
|
||||
|
||||
# The serviceability agent relies on frame pointer (%rbp) to walk thread stack
|
||||
ifndef USE_SUNCC
|
||||
CFLAGS += -fno-omit-frame-pointer
|
||||
endif
|
||||
|
||||
OPT_CFLAGS/compactingPermGenGen.o = -O1
|
29
hotspot/make/bsd/makefiles/arm.make
Normal file
29
hotspot/make/bsd/makefiles/arm.make
Normal file
@ -0,0 +1,29 @@
|
||||
#
|
||||
# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
Obj_Files += bsd_arm.o
|
||||
|
||||
LIBS += $(EXT_LIBS_PATH)/sflt_glibc.a
|
||||
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
12
hotspot/make/bsd/makefiles/build_vm_def.sh
Normal file
12
hotspot/make/bsd/makefiles/build_vm_def.sh
Normal file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
# If we're cross compiling use that path for nm
|
||||
if [ "$CROSS_COMPILE_ARCH" != "" ]; then
|
||||
NM=$ALT_COMPILER_PATH/nm
|
||||
else
|
||||
NM=nm
|
||||
fi
|
||||
|
||||
$NM --defined-only $* | awk '
|
||||
{ if ($3 ~ /^_ZTV/ || $3 ~ /^gHotSpotVM/) print "\t" $3 ";" }
|
||||
'
|
409
hotspot/make/bsd/makefiles/buildtree.make
Normal file
409
hotspot/make/bsd/makefiles/buildtree.make
Normal file
@ -0,0 +1,409 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Usage:
|
||||
#
|
||||
# $(MAKE) -f buildtree.make SRCARCH=srcarch BUILDARCH=buildarch LIBARCH=libarch
|
||||
# GAMMADIR=dir OS_FAMILY=os VARIANT=variant
|
||||
#
|
||||
# The macros ARCH, GAMMADIR, OS_FAMILY and VARIANT must be defined in the
|
||||
# environment or on the command-line:
|
||||
#
|
||||
# ARCH - sparc, i486, ... HotSpot cpu and os_cpu source directory
|
||||
# BUILDARCH - build directory
|
||||
# LIBARCH - the corresponding directory in JDK/JRE
|
||||
# GAMMADIR - top of workspace
|
||||
# OS_FAMILY - operating system
|
||||
# VARIANT - core, compiler1, compiler2, or tiered
|
||||
# HOTSPOT_RELEASE_VERSION - <major>.<minor>-b<nn> (11.0-b07)
|
||||
# HOTSPOT_BUILD_VERSION - internal, internal-$(USER_RELEASE_SUFFIX) or empty
|
||||
# JRE_RELEASE_VERSION - <major>.<minor>.<micro> (1.7.0)
|
||||
#
|
||||
# Builds the directory trees with makefiles plus some convenience files in
|
||||
# each directory:
|
||||
#
|
||||
# Makefile - for "make foo"
|
||||
# flags.make - with macro settings
|
||||
# vm.make - to support making "$(MAKE) -v vm.make" in makefiles
|
||||
# adlc.make -
|
||||
# jvmti.make - generate JVMTI bindings from the spec (JSR-163)
|
||||
# sa.make - generate SA jar file and natives
|
||||
# env.[ck]sh - environment settings
|
||||
# test_gamma - script to run the Queens program
|
||||
#
|
||||
# The makefiles are split this way so that "make foo" will run faster by not
|
||||
# having to read the dependency files for the vm.
|
||||
|
||||
include $(GAMMADIR)/make/scm.make
|
||||
include $(GAMMADIR)/make/altsrc.make
|
||||
|
||||
|
||||
# 'gmake MAKE_VERBOSE=y' or 'gmake QUIETLY=' gives all the gory details.
|
||||
QUIETLY$(MAKE_VERBOSE) = @
|
||||
|
||||
# For now, until the compiler is less wobbly:
|
||||
TESTFLAGS = -Xbatch -showversion
|
||||
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
PLATFORM_FILE = $(shell dirname $(shell dirname $(shell pwd)))/platform_zero
|
||||
else
|
||||
ifdef USE_SUNCC
|
||||
PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH).suncc
|
||||
else
|
||||
PLATFORM_FILE = $(GAMMADIR)/make/$(OS_FAMILY)/platform_$(BUILDARCH)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Allow overriding of the arch part of the directory but default
|
||||
# to BUILDARCH if nothing is specified
|
||||
ifeq ($(VARIANTARCH),)
|
||||
VARIANTARCH=$(BUILDARCH)
|
||||
endif
|
||||
|
||||
ifdef FORCE_TIERED
|
||||
ifeq ($(VARIANT),tiered)
|
||||
PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_compiler2
|
||||
else
|
||||
PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT)
|
||||
endif
|
||||
else
|
||||
PLATFORM_DIR = $(OS_FAMILY)_$(VARIANTARCH)_$(VARIANT)
|
||||
endif
|
||||
|
||||
#
|
||||
# We do two levels of exclusion in the shared directory.
|
||||
# TOPLEVEL excludes are pruned, they are not recursively searched,
|
||||
# but lower level directories can be named without fear of collision.
|
||||
# ALWAYS excludes are excluded at any level in the directory tree.
|
||||
#
|
||||
|
||||
ALWAYS_EXCLUDE_DIRS = $(SCM_DIRS)
|
||||
|
||||
ifeq ($(VARIANT),tiered)
|
||||
TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name agent
|
||||
else
|
||||
ifeq ($(VARIANT),compiler2)
|
||||
TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name c1 -o -name agent
|
||||
else
|
||||
# compiler1 and core use the same exclude list
|
||||
TOPLEVEL_EXCLUDE_DIRS = $(ALWAYS_EXCLUDE_DIRS) -o -name adlc -o -name opto -o -name libadt -o -name agent
|
||||
endif
|
||||
endif
|
||||
|
||||
# Get things from the platform file.
|
||||
COMPILER = $(shell sed -n 's/^compiler[ ]*=[ ]*//p' $(PLATFORM_FILE))
|
||||
|
||||
SIMPLE_DIRS = \
|
||||
$(PLATFORM_DIR)/generated/dependencies \
|
||||
$(PLATFORM_DIR)/generated/adfiles \
|
||||
$(PLATFORM_DIR)/generated/jvmtifiles
|
||||
|
||||
TARGETS = debug fastdebug jvmg optimized product profiled
|
||||
SUBMAKE_DIRS = $(addprefix $(PLATFORM_DIR)/,$(TARGETS))
|
||||
|
||||
# For dependencies and recursive makes.
|
||||
BUILDTREE_MAKE = $(GAMMADIR)/make/$(OS_FAMILY)/makefiles/buildtree.make
|
||||
|
||||
BUILDTREE_TARGETS = Makefile flags.make flags_vm.make vm.make adlc.make jvmti.make sa.make \
|
||||
env.sh env.csh jdkpath.sh .dbxrc test_gamma
|
||||
|
||||
BUILDTREE_VARS = GAMMADIR=$(GAMMADIR) OS_FAMILY=$(OS_FAMILY) \
|
||||
SRCARCH=$(SRCARCH) BUILDARCH=$(BUILDARCH) LIBARCH=$(LIBARCH) VARIANT=$(VARIANT)
|
||||
|
||||
# Define variables to be set in flags.make.
|
||||
# Default values are set in make/defs.make.
|
||||
ifeq ($(HOTSPOT_BUILD_VERSION),)
|
||||
HS_BUILD_VER=$(HOTSPOT_RELEASE_VERSION)
|
||||
else
|
||||
HS_BUILD_VER=$(HOTSPOT_RELEASE_VERSION)-$(HOTSPOT_BUILD_VERSION)
|
||||
endif
|
||||
# Set BUILD_USER from system-dependent hints: $LOGNAME, $(whoami)
|
||||
ifndef HOTSPOT_BUILD_USER
|
||||
HOTSPOT_BUILD_USER := $(shell echo $$LOGNAME)
|
||||
endif
|
||||
ifndef HOTSPOT_BUILD_USER
|
||||
HOTSPOT_BUILD_USER := $(shell whoami)
|
||||
endif
|
||||
# Define HOTSPOT_VM_DISTRO based on settings in make/openjdk_distro
|
||||
# or make/hotspot_distro.
|
||||
ifndef HOTSPOT_VM_DISTRO
|
||||
ifeq ($(call if-has-altsrc,$(HS_COMMON_SRC)/,true,false),true)
|
||||
include $(GAMMADIR)/make/hotspot_distro
|
||||
else
|
||||
include $(GAMMADIR)/make/openjdk_distro
|
||||
endif
|
||||
endif
|
||||
|
||||
BUILDTREE_VARS += HOTSPOT_RELEASE_VERSION=$(HS_BUILD_VER) HOTSPOT_BUILD_VERSION= JRE_RELEASE_VERSION=$(JRE_RELEASE_VERSION)
|
||||
|
||||
BUILDTREE = \
|
||||
$(MAKE) -f $(BUILDTREE_MAKE) $(BUILDTREE_TARGETS) $(BUILDTREE_VARS)
|
||||
|
||||
BUILDTREE_COMMENT = echo "\# Generated by $(BUILDTREE_MAKE)"
|
||||
|
||||
all: $(SUBMAKE_DIRS)
|
||||
|
||||
# Run make in each subdirectory recursively.
|
||||
$(SUBMAKE_DIRS): $(SIMPLE_DIRS) FORCE
|
||||
$(QUIETLY) [ -d $@ ] || { mkdir -p $@; }
|
||||
$(QUIETLY) cd $@ && $(BUILDTREE) TARGET=$(@F)
|
||||
$(QUIETLY) touch $@
|
||||
|
||||
$(SIMPLE_DIRS):
|
||||
$(QUIETLY) mkdir -p $@
|
||||
|
||||
# Convenience macro which takes a source relative path, applies $(1) to the
|
||||
# absolute path, and then replaces $(GAMMADIR) in the result with a
|
||||
# literal "$(GAMMADIR)/" suitable for inclusion in a Makefile.
|
||||
gamma-path=$(subst $(GAMMADIR),\$$(GAMMADIR),$(call $(1),$(HS_COMMON_SRC)/$(2)))
|
||||
|
||||
flags.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo "Platform_file = $(PLATFORM_FILE)" | sed 's|$(GAMMADIR)|$$(GAMMADIR)|'; \
|
||||
sed -n '/=/s/^ */Platform_/p' < $(PLATFORM_FILE); \
|
||||
echo; \
|
||||
echo "GAMMADIR = $(GAMMADIR)"; \
|
||||
echo "SYSDEFS = \$$(Platform_sysdefs)"; \
|
||||
echo "SRCARCH = $(SRCARCH)"; \
|
||||
echo "BUILDARCH = $(BUILDARCH)"; \
|
||||
echo "LIBARCH = $(LIBARCH)"; \
|
||||
echo "TARGET = $(TARGET)"; \
|
||||
echo "HS_BUILD_VER = $(HS_BUILD_VER)"; \
|
||||
echo "JRE_RELEASE_VER = $(JRE_RELEASE_VERSION)"; \
|
||||
echo "SA_BUILD_VERSION = $(HS_BUILD_VER)"; \
|
||||
echo "HOTSPOT_BUILD_USER = $(HOTSPOT_BUILD_USER)"; \
|
||||
echo "HOTSPOT_VM_DISTRO = $(HOTSPOT_VM_DISTRO)"; \
|
||||
echo; \
|
||||
echo "# Used for platform dispatching"; \
|
||||
echo "TARGET_DEFINES = -DTARGET_OS_FAMILY_\$$(Platform_os_family)"; \
|
||||
echo "TARGET_DEFINES += -DTARGET_ARCH_\$$(Platform_arch)"; \
|
||||
echo "TARGET_DEFINES += -DTARGET_ARCH_MODEL_\$$(Platform_arch_model)"; \
|
||||
echo "TARGET_DEFINES += -DTARGET_OS_ARCH_\$$(Platform_os_arch)"; \
|
||||
echo "TARGET_DEFINES += -DTARGET_OS_ARCH_MODEL_\$$(Platform_os_arch_model)"; \
|
||||
echo "TARGET_DEFINES += -DTARGET_COMPILER_\$$(Platform_compiler)"; \
|
||||
echo "CFLAGS += \$$(TARGET_DEFINES)"; \
|
||||
echo; \
|
||||
echo "Src_Dirs_V = \\"; \
|
||||
sed 's/$$/ \\/;s|$(GAMMADIR)|$$(GAMMADIR)|' ../shared_dirs.lst; \
|
||||
echo "$(call gamma-path,altsrc,cpu/$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,cpu/$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os/$(OS_FAMILY)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os/$(OS_FAMILY)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os/posix/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os/posix/vm)"; \
|
||||
echo; \
|
||||
echo "Src_Dirs_I = \\"; \
|
||||
echo "$(call gamma-path,altsrc,share/vm/prims) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,share/vm/prims) \\"; \
|
||||
echo "$(call gamma-path,altsrc,share/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,share/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,cpu/$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,cpu/$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os_cpu/$(OS_FAMILY)_$(SRCARCH)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os/$(OS_FAMILY)/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os/$(OS_FAMILY)/vm) \\"; \
|
||||
echo "$(call gamma-path,altsrc,os/posix/vm) \\"; \
|
||||
echo "$(call gamma-path,commonsrc,os/posix/vm)"; \
|
||||
[ -n "$(CFLAGS_BROWSE)" ] && \
|
||||
echo && echo "CFLAGS_BROWSE = $(CFLAGS_BROWSE)"; \
|
||||
[ -n "$(HOTSPOT_EXTRA_SYSDEFS)" ] && \
|
||||
echo && \
|
||||
echo "HOTSPOT_EXTRA_SYSDEFS\$$(HOTSPOT_EXTRA_SYSDEFS) = $(HOTSPOT_EXTRA_SYSDEFS)" && \
|
||||
echo "SYSDEFS += \$$(HOTSPOT_EXTRA_SYSDEFS)"; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(VARIANT).make"; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(COMPILER).make"; \
|
||||
) > $@
|
||||
|
||||
flags_vm.make: $(BUILDTREE_MAKE) ../shared_dirs.lst
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
[ "$(TARGET)" = profiled ] && \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/optimized.make"; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(TARGET).make"; \
|
||||
) > $@
|
||||
|
||||
../shared_dirs.lst: $(BUILDTREE_MAKE) $(GAMMADIR)/src/share/vm
|
||||
@echo Creating directory list $@
|
||||
$(QUIETLY) if [ -d $(HS_ALT_SRC)/share/vm ]; then \
|
||||
find $(HS_ALT_SRC)/share/vm/* -prune \
|
||||
-type d \! \( $(TOPLEVEL_EXCLUDE_DIRS) \) -exec find {} \
|
||||
\( $(ALWAYS_EXCLUDE_DIRS) \) -prune -o -type d -print \; > $@; \
|
||||
fi;
|
||||
$(QUIETLY) find $(HS_COMMON_SRC)/share/vm/* -prune \
|
||||
-type d \! \( $(TOPLEVEL_EXCLUDE_DIRS) \) -exec find {} \
|
||||
\( $(ALWAYS_EXCLUDE_DIRS) \) -prune -o -type d -print \; >> $@
|
||||
|
||||
Makefile: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo include flags.make; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/top.make"; \
|
||||
) > $@
|
||||
|
||||
vm.make: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo include flags.make; \
|
||||
echo include flags_vm.make; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \
|
||||
) > $@
|
||||
|
||||
adlc.make: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo include flags.make; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \
|
||||
) > $@
|
||||
|
||||
jvmti.make: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo include flags.make; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \
|
||||
) > $@
|
||||
|
||||
sa.make: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo; \
|
||||
echo include flags.make; \
|
||||
echo; \
|
||||
echo "include \$$(GAMMADIR)/make/$(OS_FAMILY)/makefiles/$(@F)"; \
|
||||
) > $@
|
||||
|
||||
env.sh: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
[ -n "$$JAVA_HOME" ] && { echo ": \$${JAVA_HOME:=$${JAVA_HOME}}"; }; \
|
||||
{ \
|
||||
echo "LD_LIBRARY_PATH=.:$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}\$${JAVA_HOME}/jre/lib/${LIBARCH}/native_threads:\$${JAVA_HOME}/jre/lib/${LIBARCH}:${GCC_LIB}"; \
|
||||
echo "DYLD_LIBRARY_PATH=.:$${DYLD_LIBRARY_PATH:+$$DYLD_LIBRARY_PATH:}\$${JAVA_HOME}/jre/lib/${LIBARCH}/native_threads:\$${JAVA_HOME}/jre/lib/${LIBARCH}:${GCC_LIB}"; \
|
||||
echo "CLASSPATH=$${CLASSPATH:+$$CLASSPATH:}.:\$${JAVA_HOME}/jre/lib/rt.jar:\$${JAVA_HOME}/jre/lib/i18n.jar"; \
|
||||
} | sed s:$${JAVA_HOME:--------}:\$${JAVA_HOME}:g; \
|
||||
echo "HOTSPOT_BUILD_USER=\"$${LOGNAME:-$$USER} in `basename $(GAMMADIR)`\""; \
|
||||
echo "export JAVA_HOME LD_LIBRARY_PATH DYLD_LIBRARY_PATH CLASSPATH HOTSPOT_BUILD_USER"; \
|
||||
) > $@
|
||||
|
||||
env.csh: env.sh
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
[ -n "$$JAVA_HOME" ] && \
|
||||
{ echo "if (! \$$?JAVA_HOME) setenv JAVA_HOME \"$$JAVA_HOME\""; }; \
|
||||
sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=/setenv \1 /p' $?; \
|
||||
) > $@
|
||||
|
||||
jdkpath.sh: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo "JDK=${JAVA_HOME}"; \
|
||||
) > $@
|
||||
|
||||
.dbxrc: $(BUILDTREE_MAKE)
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
echo "echo '# Loading $(PLATFORM_DIR)/$(TARGET)/.dbxrc'"; \
|
||||
echo "if [ -f \"\$${HOTSPOT_DBXWARE}\" ]"; \
|
||||
echo "then"; \
|
||||
echo " source \"\$${HOTSPOT_DBXWARE}\""; \
|
||||
echo "elif [ -f \"\$$HOME/.dbxrc\" ]"; \
|
||||
echo "then"; \
|
||||
echo " source \"\$$HOME/.dbxrc\""; \
|
||||
echo "fi"; \
|
||||
) > $@
|
||||
|
||||
# Skip the test for product builds (which only work when installed in a JDK), to
|
||||
# avoid exiting with an error and causing make to halt.
|
||||
NO_TEST_MSG = \
|
||||
echo "$@: skipping the test--this build must be tested in a JDK."
|
||||
|
||||
NO_JAVA_HOME_MSG = \
|
||||
echo "JAVA_HOME must be set to run this test."
|
||||
|
||||
DATA_MODE = $(DATA_MODE/$(BUILDARCH))
|
||||
JAVA_FLAG = $(JAVA_FLAG/$(DATA_MODE))
|
||||
|
||||
DATA_MODE/i486 = 32
|
||||
DATA_MODE/sparc = 32
|
||||
DATA_MODE/sparcv9 = 64
|
||||
DATA_MODE/amd64 = 64
|
||||
DATA_MODE/ia64 = 64
|
||||
DATA_MODE/zero = $(ARCH_DATA_MODEL)
|
||||
|
||||
JAVA_FLAG/32 = -d32
|
||||
JAVA_FLAG/64 = -d64
|
||||
|
||||
WRONG_DATA_MODE_MSG = \
|
||||
echo "JAVA_HOME must point to $(DATA_MODE)bit JDK."
|
||||
|
||||
CROSS_COMPILING_MSG = \
|
||||
echo "Cross compiling for ARCH $(CROSS_COMPILE_ARCH), skipping gamma run."
|
||||
|
||||
test_gamma: $(BUILDTREE_MAKE) $(GAMMADIR)/make/test/Queens.java
|
||||
@echo Creating $@ ...
|
||||
$(QUIETLY) ( \
|
||||
echo '#!/bin/sh'; \
|
||||
$(BUILDTREE_COMMENT); \
|
||||
echo '. ./env.sh'; \
|
||||
echo "exit 0;"; \
|
||||
echo "if [ \"$(CROSS_COMPILE_ARCH)\" != \"\" ]; then { $(CROSS_COMPILING_MSG); exit 0; }; fi"; \
|
||||
echo "if [ -z \$$JAVA_HOME ]; then { $(NO_JAVA_HOME_MSG); exit 0; }; fi"; \
|
||||
echo "if ! \$${JAVA_HOME}/bin/java $(JAVA_FLAG) -fullversion 2>&1 > /dev/null"; \
|
||||
echo "then"; \
|
||||
echo " $(WRONG_DATA_MODE_MSG); exit 0;"; \
|
||||
echo "fi"; \
|
||||
echo "rm -f Queens.class"; \
|
||||
echo "\$${JAVA_HOME}/bin/javac -d . $(GAMMADIR)/make/test/Queens.java"; \
|
||||
echo '[ -f gamma_g ] && { gamma=gamma_g; }'; \
|
||||
echo './$${gamma:-gamma} $(TESTFLAGS) Queens < /dev/null'; \
|
||||
) > $@
|
||||
$(QUIETLY) chmod +x $@
|
||||
|
||||
FORCE:
|
||||
|
||||
.PHONY: all FORCE
|
31
hotspot/make/bsd/makefiles/compiler1.make
Normal file
31
hotspot/make/bsd/makefiles/compiler1.make
Normal file
@ -0,0 +1,31 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making client version of VM
|
||||
|
||||
TYPE=COMPILER1
|
||||
|
||||
VM_SUBDIR = client
|
||||
|
||||
CFLAGS += -DCOMPILER1
|
31
hotspot/make/bsd/makefiles/compiler2.make
Normal file
31
hotspot/make/bsd/makefiles/compiler2.make
Normal file
@ -0,0 +1,31 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making server version of VM
|
||||
|
||||
TYPE=COMPILER2
|
||||
|
||||
VM_SUBDIR = server
|
||||
|
||||
CFLAGS += -DCOMPILER2
|
33
hotspot/make/bsd/makefiles/core.make
Normal file
33
hotspot/make/bsd/makefiles/core.make
Normal file
@ -0,0 +1,33 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making core version of VM
|
||||
|
||||
# Select which files to use (in top.make)
|
||||
TYPE=CORE
|
||||
|
||||
# There is no "core" directory in JDK. Install core build in server directory.
|
||||
VM_SUBDIR = server
|
||||
|
||||
# Note: macros.hpp defines CORE
|
160
hotspot/make/bsd/makefiles/cscope.make
Normal file
160
hotspot/make/bsd/makefiles/cscope.make
Normal file
@ -0,0 +1,160 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# The cscope.out file is made in the current directory and spans the entire
|
||||
# source tree.
|
||||
#
|
||||
# Things to note:
|
||||
# 1. We use relative names for cscope.
|
||||
# 2. We *don't* remove the old cscope.out file, because cscope is smart
|
||||
# enough to only build what has changed. It can be confused, however,
|
||||
# if files are renamed or removed, so it may be necessary to manually
|
||||
# remove cscope.out if a lot of reorganization has occurred.
|
||||
#
|
||||
|
||||
include $(GAMMADIR)/make/scm.make
|
||||
|
||||
NAWK = awk
|
||||
RM = rm -f
|
||||
HG = hg
|
||||
CS_TOP = ../..
|
||||
|
||||
CSDIRS = $(CS_TOP)/src $(CS_TOP)/build
|
||||
CSINCS = $(CSDIRS:%=-I%)
|
||||
|
||||
CSCOPE = cscope
|
||||
CSCOPE_FLAGS = -b
|
||||
|
||||
# Allow .java files to be added from the environment (CSCLASSES=yes).
|
||||
ifdef CSCLASSES
|
||||
ADDCLASSES= -o -name '*.java'
|
||||
endif
|
||||
|
||||
# Adding CClassHeaders also pushes the file count of a full workspace up about
|
||||
# 200 files (these files also don't exist in a new workspace, and thus will
|
||||
# cause the recreation of the database as they get created, which might seem
|
||||
# a little confusing). Thus allow these files to be added from the environment
|
||||
# (CSHEADERS=yes).
|
||||
ifndef CSHEADERS
|
||||
RMCCHEADERS= -o -name CClassHeaders
|
||||
endif
|
||||
|
||||
# Use CS_GENERATED=x to include auto-generated files in the build directories.
|
||||
ifdef CS_GENERATED
|
||||
CS_ADD_GENERATED = -o -name '*.incl'
|
||||
else
|
||||
CS_PRUNE_GENERATED = -o -name '${OS}_*_core' -o -name '${OS}_*_compiler?'
|
||||
endif
|
||||
|
||||
# OS-specific files for other systems are excluded by default. Use CS_OS=yes
|
||||
# to include platform-specific files for other platforms.
|
||||
ifndef CS_OS
|
||||
CS_OS = linux macos solaris win32 bsd
|
||||
CS_PRUNE_OS = $(patsubst %,-o -name '*%*',$(filter-out ${OS},${CS_OS}))
|
||||
endif
|
||||
|
||||
# Processor-specific files for other processors are excluded by default. Use
|
||||
# CS_CPU=x to include platform-specific files for other platforms.
|
||||
ifndef CS_CPU
|
||||
CS_CPU = i486 sparc amd64 ia64
|
||||
CS_PRUNE_CPU = $(patsubst %,-o -name '*%*',$(filter-out ${SRCARCH},${CS_CPU}))
|
||||
endif
|
||||
|
||||
# What files should we include? A simple rule might be just those files under
|
||||
# SCCS control, however this would miss files we create like the opcodes and
|
||||
# CClassHeaders. The following attempts to find everything that is *useful*.
|
||||
# (.del files are created by sccsrm, demo directories contain many .java files
|
||||
# that probably aren't useful for development, and the pkgarchive may contain
|
||||
# duplicates of files within the source hierarchy).
|
||||
|
||||
# Directories to exclude.
|
||||
CS_PRUNE_STD = $(SCM_DIRS) \
|
||||
-o -name '.del-*' \
|
||||
-o -name '*demo' \
|
||||
-o -name pkgarchive
|
||||
|
||||
CS_PRUNE = $(CS_PRUNE_STD) \
|
||||
$(CS_PRUNE_OS) \
|
||||
$(CS_PRUNE_CPU) \
|
||||
$(CS_PRUNE_GENERATED) \
|
||||
$(RMCCHEADERS)
|
||||
|
||||
# File names to include.
|
||||
CSFILENAMES = -name '*.[ch]pp' \
|
||||
-o -name '*.[Ccshlxy]' \
|
||||
$(CS_ADD_GENERATED) \
|
||||
-o -name '*.il' \
|
||||
-o -name '*.cc' \
|
||||
-o -name '*[Mm]akefile*' \
|
||||
-o -name '*.gmk' \
|
||||
-o -name '*.make' \
|
||||
-o -name '*.ad' \
|
||||
$(ADDCLASSES)
|
||||
|
||||
.PRECIOUS: cscope.out
|
||||
|
||||
cscope cscope.out: cscope.files FORCE
|
||||
$(CSCOPE) $(CSCOPE_FLAGS)
|
||||
|
||||
# The .raw file is reordered here in an attempt to make cscope display the most
|
||||
# relevant files first.
|
||||
cscope.files: .cscope.files.raw
|
||||
echo "$(CSINCS)" > $@
|
||||
-egrep -v "\.java|\/make\/" $< >> $@
|
||||
-fgrep ".java" $< >> $@
|
||||
-fgrep "/make/" $< >> $@
|
||||
|
||||
.cscope.files.raw: .nametable.files
|
||||
-find $(CSDIRS) -type d \( $(CS_PRUNE) \) -prune -o \
|
||||
-type f \( $(CSFILENAMES) \) -print > $@
|
||||
|
||||
cscope.clean: nametable.clean
|
||||
-$(RM) cscope.out cscope.files .cscope.files.raw
|
||||
|
||||
TAGS: cscope.files FORCE
|
||||
egrep -v '^-|^$$' $< | etags --members -
|
||||
|
||||
TAGS.clean: nametable.clean
|
||||
-$(RM) TAGS
|
||||
|
||||
# .nametable.files and .nametable.files.tmp are used to determine if any files
|
||||
# were added to/deleted from/renamed in the workspace. If not, then there's
|
||||
# normally no need to rebuild the cscope database. To force a rebuild of
|
||||
# the cscope database: gmake nametable.clean.
|
||||
.nametable.files: .nametable.files.tmp
|
||||
( cmp -s $@ $< ) || ( cp $< $@ )
|
||||
-$(RM) $<
|
||||
|
||||
# `hg status' is slightly faster than `hg fstatus'. Both are
|
||||
# quite a bit slower on an NFS mounted file system, so this is
|
||||
# really geared towards repos on local file systems.
|
||||
.nametable.files.tmp:
|
||||
-$(HG) fstatus -acmn > $@
|
||||
nametable.clean:
|
||||
-$(RM) .nametable.files .nametable.files.tmp
|
||||
|
||||
FORCE:
|
||||
|
||||
.PHONY: cscope cscope.clean TAGS.clean nametable.clean FORCE
|
44
hotspot/make/bsd/makefiles/debug.make
Normal file
44
hotspot/make/bsd/makefiles/debug.make
Normal file
@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making debug version of VM
|
||||
|
||||
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
||||
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
||||
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||
|
||||
_JUNK_ := $(shell echo -e >&2 ""\
|
||||
"----------------------------------------------------------------------\n" \
|
||||
"WARNING: 'make debug' is deprecated. It will be removed in the future.\n" \
|
||||
"Please use 'make jvmg' to build debug JVM. \n" \
|
||||
"----------------------------------------------------------------------\n")
|
||||
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
170
hotspot/make/bsd/makefiles/defs.make
Normal file
170
hotspot/make/bsd/makefiles/defs.make
Normal file
@ -0,0 +1,170 @@
|
||||
#
|
||||
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# The common definitions for hotspot bsd builds.
|
||||
# Include the top level defs.make under make directory instead of this one.
|
||||
# This file is included into make/defs.make.
|
||||
|
||||
SLASH_JAVA ?= /java
|
||||
|
||||
# Need PLATFORM (os-arch combo names) for jdk and hotspot, plus libarch name
|
||||
ARCH:=$(shell uname -m)
|
||||
PATH_SEP = :
|
||||
ifeq ($(LP64), 1)
|
||||
ARCH_DATA_MODEL ?= 64
|
||||
else
|
||||
ARCH_DATA_MODEL ?= 32
|
||||
endif
|
||||
|
||||
# zero
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||
MAKE_ARGS += LP64=1
|
||||
endif
|
||||
PLATFORM = bsd-zero
|
||||
VM_PLATFORM = bsd_$(subst i386,i486,$(ZERO_LIBARCH))
|
||||
HS_ARCH = zero
|
||||
ARCH = zero
|
||||
endif
|
||||
|
||||
# ia64
|
||||
ifeq ($(ARCH), ia64)
|
||||
ARCH_DATA_MODEL = 64
|
||||
MAKE_ARGS += LP64=1
|
||||
PLATFORM = bsd-ia64
|
||||
VM_PLATFORM = bsd_ia64
|
||||
HS_ARCH = ia64
|
||||
endif
|
||||
|
||||
# sparc
|
||||
ifeq ($(ARCH), sparc64)
|
||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||
ARCH_DATA_MODEL = 64
|
||||
MAKE_ARGS += LP64=1
|
||||
PLATFORM = bsd-sparcv9
|
||||
VM_PLATFORM = bsd_sparcv9
|
||||
else
|
||||
ARCH_DATA_MODEL = 32
|
||||
PLATFORM = bsd-sparc
|
||||
VM_PLATFORM = bsd_sparc
|
||||
endif
|
||||
HS_ARCH = sparc
|
||||
endif
|
||||
|
||||
# amd64
|
||||
ifneq (,$(findstring $(ARCH), amd64 x86_64))
|
||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||
ARCH_DATA_MODEL = 64
|
||||
MAKE_ARGS += LP64=1
|
||||
PLATFORM = bsd-amd64
|
||||
VM_PLATFORM = bsd_amd64
|
||||
HS_ARCH = x86
|
||||
else
|
||||
ARCH_DATA_MODEL = 32
|
||||
PLATFORM = bsd-i586
|
||||
VM_PLATFORM = bsd_i486
|
||||
HS_ARCH = x86
|
||||
# We have to reset ARCH to i386 since SRCARCH relies on it
|
||||
ARCH = i386
|
||||
endif
|
||||
endif
|
||||
|
||||
# i386
|
||||
ifeq ($(ARCH), i386)
|
||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||
ARCH_DATA_MODEL = 64
|
||||
MAKE_ARGS += LP64=1
|
||||
PLATFORM = bsd-amd64
|
||||
VM_PLATFORM = bsd_amd64
|
||||
HS_ARCH = x86
|
||||
# We have to reset ARCH to amd64 since SRCARCH relies on it
|
||||
ARCH = amd64
|
||||
else
|
||||
ARCH_DATA_MODEL = 32
|
||||
PLATFORM = bsd-i586
|
||||
VM_PLATFORM = bsd_i486
|
||||
HS_ARCH = x86
|
||||
endif
|
||||
endif
|
||||
|
||||
# ARM
|
||||
ifeq ($(ARCH), arm)
|
||||
ARCH_DATA_MODEL = 32
|
||||
PLATFORM = bsd-arm
|
||||
VM_PLATFORM = bsd_arm
|
||||
HS_ARCH = arm
|
||||
endif
|
||||
|
||||
# PPC
|
||||
ifeq ($(ARCH), ppc)
|
||||
ARCH_DATA_MODEL = 32
|
||||
PLATFORM = bsd-ppc
|
||||
VM_PLATFORM = bsd_ppc
|
||||
HS_ARCH = ppc
|
||||
endif
|
||||
|
||||
JDK_INCLUDE_SUBDIR=bsd
|
||||
|
||||
# Library suffix
|
||||
OS_VENDOR:=$(shell uname -s)
|
||||
ifeq ($(OS_VENDOR),Darwin)
|
||||
LIBRARY_SUFFIX=dylib
|
||||
else
|
||||
LIBRARY_SUFFIX=so
|
||||
endif
|
||||
|
||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
||||
VM_DEBUG=jvmg
|
||||
|
||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||
|
||||
# client and server subdirectories have symbolic links to ../libjsig.so
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX)
|
||||
EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
|
||||
|
||||
ifndef BUILD_CLIENT_ONLY
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
|
||||
ifneq ($(ZERO_BUILD), true)
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Serviceability Binaries
|
||||
# No SA Support for PPC, IA64, ARM or zero
|
||||
ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
ADD_SA_BINARIES/ppc =
|
||||
ADD_SA_BINARIES/ia64 =
|
||||
ADD_SA_BINARIES/arm =
|
||||
ADD_SA_BINARIES/zero =
|
||||
|
||||
EXPORT_LIST += $(ADD_SA_BINARIES/$(HS_ARCH))
|
27
hotspot/make/bsd/makefiles/dtrace.make
Normal file
27
hotspot/make/bsd/makefiles/dtrace.make
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Bsd does not build jvm_db
|
||||
LIBJVM_DB =
|
||||
|
64
hotspot/make/bsd/makefiles/fastdebug.make
Normal file
64
hotspot/make/bsd/makefiles/fastdebug.make
Normal file
@ -0,0 +1,64 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making debug version of VM
|
||||
|
||||
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
|
||||
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
|
||||
|
||||
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
|
||||
|
||||
ifeq ($(BUILDARCH), ia64)
|
||||
# Bug in GCC, causes hang. -O1 will override the -O3 specified earlier
|
||||
OPT_CFLAGS/callGenerator.o += -O1
|
||||
OPT_CFLAGS/ciTypeFlow.o += -O1
|
||||
OPT_CFLAGS/compile.o += -O1
|
||||
OPT_CFLAGS/concurrentMarkSweepGeneration.o += -O1
|
||||
OPT_CFLAGS/doCall.o += -O1
|
||||
OPT_CFLAGS/generateOopMap.o += -O1
|
||||
OPT_CFLAGS/generateOptoStub.o += -O1
|
||||
OPT_CFLAGS/graphKit.o += -O1
|
||||
OPT_CFLAGS/instanceKlass.o += -O1
|
||||
OPT_CFLAGS/interpreterRT_ia64.o += -O1
|
||||
OPT_CFLAGS/output.o += -O1
|
||||
OPT_CFLAGS/parse1.o += -O1
|
||||
OPT_CFLAGS/runtime.o += -O1
|
||||
OPT_CFLAGS/synchronizer.o += -O1
|
||||
endif
|
||||
|
||||
|
||||
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
|
||||
CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
||||
|
||||
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||
# to inhibit the effect of the previous line on CFLAGS.
|
||||
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||
|
||||
G_SUFFIX = _g
|
||||
VERSION = optimized
|
||||
SYSDEFS += -DASSERT -DFASTDEBUG
|
||||
PICFLAGS = DEFAULT
|
267
hotspot/make/bsd/makefiles/gcc.make
Normal file
267
hotspot/make/bsd/makefiles/gcc.make
Normal file
@ -0,0 +1,267 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
OS_VENDOR = $(shell uname -s)
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# CC, CPP & AS
|
||||
|
||||
# When cross-compiling the ALT_COMPILER_PATH points
|
||||
# to the cross-compilation toolset
|
||||
ifdef CROSS_COMPILE_ARCH
|
||||
CXX = $(ALT_COMPILER_PATH)/g++
|
||||
CPP = $(ALT_COMPILER_PATH)/g++
|
||||
CC = $(ALT_COMPILER_PATH)/gcc
|
||||
HOSTCPP = g++
|
||||
HOSTCC = gcc
|
||||
else
|
||||
CXX ?= g++
|
||||
CPP = $(CXX)
|
||||
CC ?= gcc
|
||||
HOSTCPP = $(CPP)
|
||||
HOSTCC = $(CPP)
|
||||
endif
|
||||
|
||||
AS = $(CC) -c -x assembler-with-cpp
|
||||
|
||||
# -dumpversion in gcc-2.91 shows "egcs-2.91.66". In later version, it only
|
||||
# prints the numbers (e.g. "2.95", "3.2.1")
|
||||
CC_VER_MAJOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f1)
|
||||
CC_VER_MINOR := $(shell $(CC) -dumpversion | sed 's/egcs-//' | cut -d'.' -f2)
|
||||
|
||||
# check for precompiled headers support
|
||||
ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 3 \) \| \( \( $(CC_VER_MAJOR) = 3 \) \& \( $(CC_VER_MINOR) \>= 4 \) \))" "0"
|
||||
# Allow the user to turn off precompiled headers from the command line.
|
||||
ifneq ($(USE_PRECOMPILED_HEADER),0)
|
||||
USE_PRECOMPILED_HEADER=1
|
||||
PRECOMPILED_HEADER_DIR=.
|
||||
PRECOMPILED_HEADER_SRC=$(GAMMADIR)/src/share/vm/precompiled.hpp
|
||||
PRECOMPILED_HEADER=$(PRECOMPILED_HEADER_DIR)/precompiled.hpp.gch
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Compiler flags
|
||||
|
||||
# position-independent code
|
||||
PICFLAG = -fPIC
|
||||
|
||||
VM_PICFLAG/LIBJVM = $(PICFLAG)
|
||||
VM_PICFLAG/AOUT =
|
||||
VM_PICFLAG = $(VM_PICFLAG/$(LINK_INTO))
|
||||
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
CFLAGS += $(LIBFFI_CFLAGS)
|
||||
endif
|
||||
ifeq ($(SHARK_BUILD), true)
|
||||
CFLAGS += $(LLVM_CFLAGS)
|
||||
endif
|
||||
CFLAGS += $(VM_PICFLAG)
|
||||
CFLAGS += -fno-rtti
|
||||
CFLAGS += -fno-exceptions
|
||||
CFLAGS += -pthread
|
||||
CFLAGS += -fcheck-new
|
||||
# version 4 and above support fvisibility=hidden (matches jni_x86.h file)
|
||||
# except 4.1.2 gives pointless warnings that can't be disabled (afaik)
|
||||
ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
|
||||
CFLAGS += -fvisibility=hidden
|
||||
endif
|
||||
|
||||
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
|
||||
ARCHFLAG/i486 = -m32 -march=i586
|
||||
ARCHFLAG/amd64 = -m64
|
||||
ARCHFLAG/ia64 =
|
||||
ARCHFLAG/sparc = -m32 -mcpu=v9
|
||||
ARCHFLAG/sparcv9 = -m64 -mcpu=v9
|
||||
ARCHFLAG/zero = $(ZERO_ARCHFLAG)
|
||||
|
||||
# Darwin-specific build flags
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
# Ineffecient 16-byte stack re-alignment on Darwin/IA32
|
||||
ARCHFLAG/i486 += -mstackrealign
|
||||
endif
|
||||
|
||||
CFLAGS += $(ARCHFLAG)
|
||||
AOUT_FLAGS += $(ARCHFLAG)
|
||||
LFLAGS += $(ARCHFLAG)
|
||||
ASFLAGS += $(ARCHFLAG)
|
||||
|
||||
ifdef E500V2
|
||||
CFLAGS += -DE500V2
|
||||
endif
|
||||
|
||||
# Use C++ Interpreter
|
||||
ifdef CC_INTERP
|
||||
CFLAGS += -DCC_INTERP
|
||||
endif
|
||||
|
||||
# Build for embedded targets
|
||||
ifdef JAVASE_EMBEDDED
|
||||
CFLAGS += -DJAVASE_EMBEDDED
|
||||
endif
|
||||
|
||||
# Keep temporary files (.ii, .s)
|
||||
ifdef NEED_ASM
|
||||
CFLAGS += -save-temps
|
||||
else
|
||||
CFLAGS += -pipe
|
||||
endif
|
||||
|
||||
# Compiler warnings are treated as errors
|
||||
WARNINGS_ARE_ERRORS = -Werror
|
||||
|
||||
# Except for a few acceptable ones
|
||||
# Since GCC 4.3, -Wconversion has changed its meanings to warn these implicit
|
||||
# conversions which might affect the values. To avoid that, we need to turn
|
||||
# it off explicitly.
|
||||
ifneq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 3 \) \))" "0"
|
||||
ACCEPTABLE_WARNINGS = -Wpointer-arith -Wsign-compare
|
||||
else
|
||||
ACCEPTABLE_WARNINGS = -Wpointer-arith -Wconversion -Wsign-compare
|
||||
endif
|
||||
|
||||
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS) $(ACCEPTABLE_WARNINGS)
|
||||
# Special cases
|
||||
CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
|
||||
# XXXDARWIN: for _dyld_bind_fully_image_containing_address
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
CFLAGS_WARN/os_bsd.o = $(CFLAGS_WARN/DEFAULT) -Wno-deprecated-declarations
|
||||
endif
|
||||
|
||||
|
||||
# The flags to use for an Optimized g++ build
|
||||
OPT_CFLAGS += -O3
|
||||
|
||||
# Hotspot uses very unstrict aliasing turn this optimization off
|
||||
OPT_CFLAGS += -fno-strict-aliasing
|
||||
|
||||
# The gcc compiler segv's on ia64 when compiling bytecodeInterpreter.cpp
|
||||
# if we use expensive-optimizations
|
||||
ifeq ($(BUILDARCH), ia64)
|
||||
OPT_CFLAGS += -fno-expensive-optimizations
|
||||
endif
|
||||
|
||||
OPT_CFLAGS/NOOPT=-O0
|
||||
|
||||
# 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
|
||||
ifneq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) = 3 \) \))" "0"
|
||||
OPT_CFLAGS/mulnode.o += -O0
|
||||
endif
|
||||
|
||||
# Flags for generating make dependency flags.
|
||||
ifneq ("${CC_VER_MAJOR}", "2")
|
||||
DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
|
||||
endif
|
||||
|
||||
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
|
||||
ifneq ($(USE_PRECOMPILED_HEADER),1)
|
||||
CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
|
||||
endif
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Linker flags
|
||||
|
||||
# statically link libstdc++.so, work with gcc but ignored by g++
|
||||
STATIC_STDCXX = -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic
|
||||
|
||||
# statically link libgcc and/or libgcc_s, libgcc does not exist before gcc-3.x.
|
||||
ifneq ("${CC_VER_MAJOR}", "2")
|
||||
STATIC_LIBGCC += -static-libgcc
|
||||
endif
|
||||
|
||||
ifeq ($(BUILDARCH), ia64)
|
||||
LFLAGS += -Wl,-relax
|
||||
endif
|
||||
|
||||
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
|
||||
MAPFLAG = -Xlinker --version-script=FILENAME
|
||||
|
||||
#
|
||||
# Shared Library
|
||||
#
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
# Standard linker flags
|
||||
LFLAGS +=
|
||||
|
||||
# Darwin doesn't use ELF and doesn't support version scripts
|
||||
LDNOMAP = true
|
||||
|
||||
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
|
||||
SONAMEFLAG =
|
||||
|
||||
# Build shared library
|
||||
SHARED_FLAG = -dynamiclib $(VM_PICFLAG)
|
||||
|
||||
# Keep symbols even they are not used
|
||||
#AOUT_FLAGS += -Xlinker -export-dynamic
|
||||
else
|
||||
# Enable linker optimization
|
||||
LFLAGS += -Xlinker -O1
|
||||
|
||||
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
|
||||
SONAMEFLAG = -Xlinker -soname=SONAME
|
||||
|
||||
# Build shared library
|
||||
SHARED_FLAG = -shared $(VM_PICFLAG)
|
||||
|
||||
# Keep symbols even they are not used
|
||||
AOUT_FLAGS += -Xlinker -export-dynamic
|
||||
endif
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Debug flags
|
||||
|
||||
# Use the stabs format for debugging information (this is the default
|
||||
# on gcc-2.91). It's good enough, has all the information about line
|
||||
# numbers and local variables, and libjvm_g.so is only about 16M.
|
||||
# Change this back to "-g" if you want the most expressive format.
|
||||
# (warning: that could easily inflate libjvm_g.so to 150M!)
|
||||
# Note: The Itanium gcc compiler crashes when using -gstabs.
|
||||
DEBUG_CFLAGS/ia64 = -g
|
||||
DEBUG_CFLAGS/amd64 = -g
|
||||
DEBUG_CFLAGS/arm = -g
|
||||
DEBUG_CFLAGS/ppc = -g
|
||||
DEBUG_CFLAGS += $(DEBUG_CFLAGS/$(BUILDARCH))
|
||||
ifeq ($(DEBUG_CFLAGS/$(BUILDARCH)),)
|
||||
DEBUG_CFLAGS += -gstabs
|
||||
endif
|
||||
|
||||
# DEBUG_BINARIES overrides everything, use full -g debug information
|
||||
ifeq ($(DEBUG_BINARIES), true)
|
||||
DEBUG_CFLAGS = -g
|
||||
CFLAGS += $(DEBUG_CFLAGS)
|
||||
endif
|
||||
|
||||
# If we are building HEADLESS, pass on to VM
|
||||
# so it can set the java.awt.headless property
|
||||
ifdef HEADLESS
|
||||
CFLAGS += -DHEADLESS
|
||||
endif
|
||||
|
||||
# We are building Embedded for a small device
|
||||
# favor code space over speed
|
||||
ifdef MINIMIZE_RAM_USAGE
|
||||
CFLAGS += -DMINIMIZE_RAM_USAGE
|
||||
endif
|
29
hotspot/make/bsd/makefiles/hp.make
Normal file
29
hotspot/make/bsd/makefiles/hp.make
Normal file
@ -0,0 +1,29 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making premium version of VM
|
||||
|
||||
TYPE=HP
|
||||
|
||||
CFLAGS += -DCOMPILER2
|
29
hotspot/make/bsd/makefiles/hp1.make
Normal file
29
hotspot/make/bsd/makefiles/hp1.make
Normal file
@ -0,0 +1,29 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making premium version of VM
|
||||
|
||||
TYPE=HP1
|
||||
|
||||
CFLAGS += -DCOMPILER1
|
34
hotspot/make/bsd/makefiles/i486.make
Normal file
34
hotspot/make/bsd/makefiles/i486.make
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# TLS helper, assembled from .s file
|
||||
|
||||
# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT)
|
||||
# The copied fdlibm routines in sharedRuntimeTrans.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrans.o = $(OPT_CFLAGS/NOOPT)
|
||||
# Must also specify if CPU is little endian
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
||||
|
||||
OPT_CFLAGS/compactingPermGenGen.o = -O1
|
43
hotspot/make/bsd/makefiles/ia64.make
Normal file
43
hotspot/make/bsd/makefiles/ia64.make
Normal file
@ -0,0 +1,43 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# IA64 only uses c++ based interpreter
|
||||
CFLAGS += -DCC_INTERP -D_LP64=1 -DVM_LITTLE_ENDIAN
|
||||
# Hotspot uses very unstrict aliasing turn this optimization off
|
||||
OPT_CFLAGS += -fno-strict-aliasing
|
||||
ifeq ($(VERSION),debug)
|
||||
ASM_FLAGS= -DDEBUG
|
||||
else
|
||||
ASM_FLAGS=
|
||||
endif
|
||||
# workaround gcc bug in compiling varargs
|
||||
OPT_CFLAGS/jni.o = -O0
|
||||
|
||||
# gcc/ia64 has a bug that internal gcc functions linked with libjvm.so
|
||||
# are made public. Hiding those symbols will cause undefined symbol error
|
||||
# when VM is dropped into older JDK. We probably will need an IA64
|
||||
# mapfile to include those symbols as a workaround. Disable linker mapfile
|
||||
# for now.
|
||||
LDNOMAP=true
|
67
hotspot/make/bsd/makefiles/jsig.make
Normal file
67
hotspot/make/bsd/makefiles/jsig.make
Normal file
@ -0,0 +1,67 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Rules to build signal interposition library, used by vm.make
|
||||
|
||||
# libjsig[_g].so: signal interposition library
|
||||
JSIG = jsig
|
||||
JSIG_G = $(JSIG)$(G_SUFFIX)
|
||||
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
LIBJSIG = lib$(JSIG).dylib
|
||||
LIBJSIG_G = lib$(JSIG_G).dylib
|
||||
else
|
||||
LIBJSIG = lib$(JSIG).so
|
||||
LIBJSIG_G = lib$(JSIG_G).so
|
||||
endif
|
||||
|
||||
JSIGSRCDIR = $(GAMMADIR)/src/os/$(Platform_os_family)/vm
|
||||
|
||||
DEST_JSIG = $(JDK_LIBDIR)/$(LIBJSIG)
|
||||
|
||||
LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig
|
||||
|
||||
# On Bsd we really dont want a mapfile, as this library is small
|
||||
# and preloaded using LD_PRELOAD, making functions private will
|
||||
# cause problems with interposing. See CR: 6466665
|
||||
# LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE))
|
||||
|
||||
LFLAGS_JSIG += -D_GNU_SOURCE -pthread $(LDFLAGS_HASH_STYLE)
|
||||
|
||||
# DEBUG_BINARIES overrides everything, use full -g debug information
|
||||
ifeq ($(DEBUG_BINARIES), true)
|
||||
JSIG_DEBUG_CFLAGS = -g
|
||||
endif
|
||||
|
||||
$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||
@echo Making signal interposition lib...
|
||||
$(QUIETLY) $(CC) $(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||
$(LFLAGS_JSIG) $(JSIG_DEBUG_CFLAGS) -o $@ $<
|
||||
$(QUIETLY) [ -f $(LIBJSIG_G) ] || { ln -s $@ $(LIBJSIG_G); }
|
||||
|
||||
install_jsig: $(LIBJSIG)
|
||||
@echo "Copying $(LIBJSIG) to $(DEST_JSIG)"
|
||||
$(QUIETLY) cp -f $(LIBJSIG) $(DEST_JSIG) && echo "Done"
|
||||
|
||||
.PHONY: install_jsig
|
41
hotspot/make/bsd/makefiles/jvmg.make
Normal file
41
hotspot/make/bsd/makefiles/jvmg.make
Normal file
@ -0,0 +1,41 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making debug version of VM
|
||||
|
||||
# Compiler specific DEBUG_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||
DEBUG_CFLAGS/DEFAULT= $(DEBUG_CFLAGS)
|
||||
DEBUG_CFLAGS/BYFILE = $(DEBUG_CFLAGS/$@)$(DEBUG_CFLAGS/DEFAULT$(DEBUG_CFLAGS/$@))
|
||||
CFLAGS += $(DEBUG_CFLAGS/BYFILE)
|
||||
|
||||
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||
# to inhibit the effect of the previous line on CFLAGS.
|
||||
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||
|
||||
G_SUFFIX = _g
|
||||
VERSION = debug
|
||||
SYSDEFS += -DASSERT -DDEBUG
|
||||
PICFLAGS = DEFAULT
|
117
hotspot/make/bsd/makefiles/jvmti.make
Normal file
117
hotspot/make/bsd/makefiles/jvmti.make
Normal file
@ -0,0 +1,117 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This makefile (jvmti.make) is included from the jvmti.make in the
|
||||
# build directories.
|
||||
#
|
||||
# It knows how to build and run the tools to generate jvmti.
|
||||
|
||||
include $(GAMMADIR)/make/bsd/makefiles/rules.make
|
||||
|
||||
# #########################################################################
|
||||
|
||||
TOPDIR = $(shell echo `pwd`)
|
||||
GENERATED = $(TOPDIR)/../generated
|
||||
JvmtiOutDir = $(GENERATED)/jvmtifiles
|
||||
|
||||
JvmtiSrcDir = $(GAMMADIR)/src/share/vm/prims
|
||||
InterpreterSrcDir = $(GAMMADIR)/src/share/vm/interpreter
|
||||
|
||||
# set VPATH so make knows where to look for source files
|
||||
Src_Dirs_V += $(JvmtiSrcDir)
|
||||
VPATH += $(Src_Dirs_V:%=%:)
|
||||
|
||||
JvmtiGeneratedNames = \
|
||||
jvmtiEnv.hpp \
|
||||
jvmtiEnter.cpp \
|
||||
jvmtiEnterTrace.cpp \
|
||||
jvmtiEnvRecommended.cpp \
|
||||
bytecodeInterpreterWithChecks.cpp \
|
||||
jvmti.h \
|
||||
|
||||
JvmtiEnvFillSource = $(JvmtiSrcDir)/jvmtiEnvFill.java
|
||||
JvmtiEnvFillClass = $(JvmtiOutDir)/jvmtiEnvFill.class
|
||||
|
||||
JvmtiGenSource = $(JvmtiSrcDir)/jvmtiGen.java
|
||||
JvmtiGenClass = $(JvmtiOutDir)/jvmtiGen.class
|
||||
|
||||
JvmtiGeneratedFiles = $(JvmtiGeneratedNames:%=$(JvmtiOutDir)/%)
|
||||
|
||||
XSLT = $(QUIETLY) $(REMOTE) $(RUN.JAVA) -classpath $(JvmtiOutDir) jvmtiGen
|
||||
|
||||
.PHONY: all jvmtidocs clean cleanall
|
||||
|
||||
# #########################################################################
|
||||
|
||||
all: $(JvmtiGeneratedFiles)
|
||||
|
||||
both = $(JvmtiGenClass) $(JvmtiSrcDir)/jvmti.xml $(JvmtiSrcDir)/jvmtiLib.xsl
|
||||
|
||||
$(JvmtiGenClass): $(JvmtiGenSource)
|
||||
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiGenSource)
|
||||
|
||||
$(JvmtiEnvFillClass): $(JvmtiEnvFillSource)
|
||||
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -d $(JvmtiOutDir) $(JvmtiEnvFillSource)
|
||||
|
||||
$(JvmtiOutDir)/jvmtiEnter.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnter.cpp -PARAM interface jvmti
|
||||
|
||||
$(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp: $(JvmtiGenClass) $(InterpreterSrcDir)/bytecodeInterpreter.cpp $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xml -XSL $(InterpreterSrcDir)/bytecodeInterpreterWithChecks.xsl -OUT $(JvmtiOutDir)/bytecodeInterpreterWithChecks.cpp
|
||||
|
||||
$(JvmtiOutDir)/jvmtiEnterTrace.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnter.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnter.xsl -OUT $(JvmtiOutDir)/jvmtiEnterTrace.cpp -PARAM interface jvmti -PARAM trace Trace
|
||||
|
||||
$(JvmtiOutDir)/jvmtiEnvRecommended.cpp: $(both) $(JvmtiSrcDir)/jvmtiEnv.xsl $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiEnvFillClass)
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiEnv.xsl -OUT $(JvmtiOutDir)/jvmtiEnvStub.cpp
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAVA) -classpath $(JvmtiOutDir) jvmtiEnvFill $(JvmtiSrcDir)/jvmtiEnv.cpp $(JvmtiOutDir)/jvmtiEnvStub.cpp $(JvmtiOutDir)/jvmtiEnvRecommended.cpp
|
||||
|
||||
$(JvmtiOutDir)/jvmtiEnv.hpp: $(both) $(JvmtiSrcDir)/jvmtiHpp.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiHpp.xsl -OUT $(JvmtiOutDir)/jvmtiEnv.hpp
|
||||
|
||||
$(JvmtiOutDir)/jvmti.h: $(both) $(JvmtiSrcDir)/jvmtiH.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmtiH.xsl -OUT $(JvmtiOutDir)/jvmti.h
|
||||
|
||||
jvmtidocs: $(JvmtiOutDir)/jvmti.html
|
||||
|
||||
$(JvmtiOutDir)/jvmti.html: $(both) $(JvmtiSrcDir)/jvmti.xsl
|
||||
@echo Generating $@
|
||||
$(XSLT) -IN $(JvmtiSrcDir)/jvmti.xml -XSL $(JvmtiSrcDir)/jvmti.xsl -OUT $(JvmtiOutDir)/jvmti.html
|
||||
|
||||
# #########################################################################
|
||||
|
||||
clean :
|
||||
rm $(JvmtiGenClass) $(JvmtiEnvFillClass) $(JvmtiGeneratedFiles)
|
||||
|
||||
cleanall :
|
||||
rm $(JvmtiGenClass) $(JvmtiEnvFillClass) $(JvmtiGeneratedFiles)
|
||||
|
||||
# #########################################################################
|
||||
|
93
hotspot/make/bsd/makefiles/launcher.make
Normal file
93
hotspot/make/bsd/makefiles/launcher.make
Normal file
@ -0,0 +1,93 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Rules to build gamma launcher, used by vm.make
|
||||
|
||||
|
||||
LAUNCHER_SCRIPT = hotspot
|
||||
LAUNCHER = gamma
|
||||
|
||||
LAUNCHERDIR := $(GAMMADIR)/src/os/posix/launcher
|
||||
LAUNCHERDIR_SHARE := $(GAMMADIR)/src/share/tools/launcher
|
||||
LAUNCHERFLAGS := $(ARCHFLAG) \
|
||||
-I$(LAUNCHERDIR) -I$(GAMMADIR)/src/share/vm/prims \
|
||||
-I$(LAUNCHERDIR_SHARE) \
|
||||
-DFULL_VERSION=\"$(HOTSPOT_RELEASE_VERSION)\" \
|
||||
-DJDK_MAJOR_VERSION=\"$(JDK_MAJOR_VERSION)\" \
|
||||
-DJDK_MINOR_VERSION=\"$(JDK_MINOR_VERSION)\" \
|
||||
-DARCH=\"$(LIBARCH)\" \
|
||||
-DGAMMA \
|
||||
-DLAUNCHER_TYPE=\"gamma\" \
|
||||
-DLINK_INTO_$(LINK_INTO) \
|
||||
$(TARGET_DEFINES)
|
||||
|
||||
ifeq ($(LINK_INTO),AOUT)
|
||||
LAUNCHER.o = launcher.o $(JVM_OBJ_FILES)
|
||||
LAUNCHER_MAPFILE = mapfile_reorder
|
||||
LFLAGS_LAUNCHER$(LDNOMAP) += $(MAPFLAG:FILENAME=$(LAUNCHER_MAPFILE))
|
||||
LFLAGS_LAUNCHER += $(SONAMEFLAG:SONAME=$(LIBJVM)) $(STATIC_LIBGCC)
|
||||
LIBS_LAUNCHER += $(STATIC_STDCXX) $(LIBS)
|
||||
else
|
||||
LAUNCHER.o = launcher.o
|
||||
LFLAGS_LAUNCHER += -L`pwd`
|
||||
LIBS_LAUNCHER += -l$(JVM) $(LIBS)
|
||||
endif
|
||||
|
||||
LINK_LAUNCHER = $(LINK.c)
|
||||
|
||||
LINK_LAUNCHER/PRE_HOOK = $(LINK_LIB.CC/PRE_HOOK)
|
||||
LINK_LAUNCHER/POST_HOOK = $(LINK_LIB.CC/POST_HOOK)
|
||||
|
||||
LAUNCHER_OUT = launcher
|
||||
|
||||
SUFFIXES += .d
|
||||
|
||||
SOURCES := $(shell find $(LAUNCHERDIR) -name "*.c")
|
||||
SOURCES_SHARE := $(shell find $(LAUNCHERDIR_SHARE) -name "*.c")
|
||||
|
||||
OBJS := $(patsubst $(LAUNCHERDIR)/%.c,$(LAUNCHER_OUT)/%.o,$(SOURCES)) $(patsubst $(LAUNCHERDIR_SHARE)/%.c,$(LAUNCHER_OUT)/%.o,$(SOURCES_SHARE))
|
||||
|
||||
DEPFILES := $(patsubst %.o,%.d,$(OBJS))
|
||||
-include $(DEPFILES)
|
||||
|
||||
$(LAUNCHER_OUT)/%.o: $(LAUNCHERDIR_SHARE)/%.c
|
||||
$(QUIETLY) [ -d $(LAUNCHER_OUT) ] || { mkdir -p $(LAUNCHER_OUT); }
|
||||
$(QUIETLY) $(CC) -g -o $@ -c $< -MMD $(LAUNCHERFLAGS) $(CPPFLAGS)
|
||||
|
||||
$(LAUNCHER_OUT)/%.o: $(LAUNCHERDIR)/%.c
|
||||
$(QUIETLY) [ -d $(LAUNCHER_OUT) ] || { mkdir -p $(LAUNCHER_OUT); }
|
||||
$(QUIETLY) $(CC) -g -o $@ -c $< -MMD $(LAUNCHERFLAGS) $(CPPFLAGS)
|
||||
|
||||
$(LAUNCHER): $(OBJS) $(LIBJVM) $(LAUNCHER_MAPFILE)
|
||||
$(QUIETLY) echo Linking launcher...
|
||||
$(QUIETLY) $(LINK_LAUNCHER/PRE_HOOK)
|
||||
$(QUIETLY) $(LINK_LAUNCHER) $(LFLAGS_LAUNCHER) -o $@ $(OBJS) $(LIBS_LAUNCHER)
|
||||
$(QUIETLY) $(LINK_LAUNCHER/POST_HOOK)
|
||||
|
||||
$(LAUNCHER): $(LAUNCHER_SCRIPT)
|
||||
|
||||
$(LAUNCHER_SCRIPT): $(LAUNCHERDIR)/launcher.script
|
||||
$(QUIETLY) sed -e 's/@@LIBARCH@@/$(LIBARCH)/g' $< > $@
|
||||
$(QUIETLY) chmod +x $@
|
||||
|
291
hotspot/make/bsd/makefiles/mapfile-vers-debug
Normal file
291
hotspot/make/bsd/makefiles/mapfile-vers-debug
Normal file
@ -0,0 +1,291 @@
|
||||
#
|
||||
# @(#)mapfile-vers-debug 1.18 07/10/25 16:47:35
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Define public interface.
|
||||
|
||||
SUNWprivate_1.1 {
|
||||
global:
|
||||
# JNI
|
||||
JNI_CreateJavaVM;
|
||||
JNI_GetCreatedJavaVMs;
|
||||
JNI_GetDefaultJavaVMInitArgs;
|
||||
|
||||
# JVM
|
||||
JVM_Accept;
|
||||
JVM_ActiveProcessorCount;
|
||||
JVM_AllocateNewArray;
|
||||
JVM_AllocateNewObject;
|
||||
JVM_ArrayCopy;
|
||||
JVM_AssertionStatusDirectives;
|
||||
JVM_Available;
|
||||
JVM_Bind;
|
||||
JVM_ClassDepth;
|
||||
JVM_ClassLoaderDepth;
|
||||
JVM_Clone;
|
||||
JVM_Close;
|
||||
JVM_CX8Field;
|
||||
JVM_CompileClass;
|
||||
JVM_CompileClasses;
|
||||
JVM_CompilerCommand;
|
||||
JVM_Connect;
|
||||
JVM_ConstantPoolGetClassAt;
|
||||
JVM_ConstantPoolGetClassAtIfLoaded;
|
||||
JVM_ConstantPoolGetDoubleAt;
|
||||
JVM_ConstantPoolGetFieldAt;
|
||||
JVM_ConstantPoolGetFieldAtIfLoaded;
|
||||
JVM_ConstantPoolGetFloatAt;
|
||||
JVM_ConstantPoolGetIntAt;
|
||||
JVM_ConstantPoolGetLongAt;
|
||||
JVM_ConstantPoolGetMethodAt;
|
||||
JVM_ConstantPoolGetMethodAtIfLoaded;
|
||||
JVM_ConstantPoolGetMemberRefInfoAt;
|
||||
JVM_ConstantPoolGetSize;
|
||||
JVM_ConstantPoolGetStringAt;
|
||||
JVM_ConstantPoolGetUTF8At;
|
||||
JVM_CountStackFrames;
|
||||
JVM_CurrentClassLoader;
|
||||
JVM_CurrentLoadedClass;
|
||||
JVM_CurrentThread;
|
||||
JVM_CurrentTimeMillis;
|
||||
JVM_DefineClass;
|
||||
JVM_DefineClassWithSource;
|
||||
JVM_DefineClassWithSourceCond;
|
||||
JVM_DesiredAssertionStatus;
|
||||
JVM_DisableCompiler;
|
||||
JVM_DoPrivileged;
|
||||
JVM_DTraceGetVersion;
|
||||
JVM_DTraceActivate;
|
||||
JVM_DTraceIsProbeEnabled;
|
||||
JVM_DTraceIsSupported;
|
||||
JVM_DTraceDispose;
|
||||
JVM_DumpAllStacks;
|
||||
JVM_DumpThreads;
|
||||
JVM_EnableCompiler;
|
||||
JVM_Exit;
|
||||
JVM_FillInStackTrace;
|
||||
JVM_FindClassFromClass;
|
||||
JVM_FindClassFromClassLoader;
|
||||
JVM_FindClassFromBootLoader;
|
||||
JVM_FindLibraryEntry;
|
||||
JVM_FindLoadedClass;
|
||||
JVM_FindPrimitiveClass;
|
||||
JVM_FindSignal;
|
||||
JVM_FreeMemory;
|
||||
JVM_GC;
|
||||
JVM_GetAllThreads;
|
||||
JVM_GetArrayElement;
|
||||
JVM_GetArrayLength;
|
||||
JVM_GetCPClassNameUTF;
|
||||
JVM_GetCPFieldClassNameUTF;
|
||||
JVM_GetCPFieldModifiers;
|
||||
JVM_GetCPFieldNameUTF;
|
||||
JVM_GetCPFieldSignatureUTF;
|
||||
JVM_GetCPMethodClassNameUTF;
|
||||
JVM_GetCPMethodModifiers;
|
||||
JVM_GetCPMethodNameUTF;
|
||||
JVM_GetCPMethodSignatureUTF;
|
||||
JVM_GetCallerClass;
|
||||
JVM_GetClassAccessFlags;
|
||||
JVM_GetClassAnnotations;
|
||||
JVM_GetClassCPEntriesCount;
|
||||
JVM_GetClassCPTypes;
|
||||
JVM_GetClassConstantPool;
|
||||
JVM_GetClassContext;
|
||||
JVM_GetClassDeclaredConstructors;
|
||||
JVM_GetClassDeclaredFields;
|
||||
JVM_GetClassDeclaredMethods;
|
||||
JVM_GetClassFieldsCount;
|
||||
JVM_GetClassInterfaces;
|
||||
JVM_GetClassLoader;
|
||||
JVM_GetClassMethodsCount;
|
||||
JVM_GetClassModifiers;
|
||||
JVM_GetClassName;
|
||||
JVM_GetClassNameUTF;
|
||||
JVM_GetClassSignature;
|
||||
JVM_GetClassSigners;
|
||||
JVM_GetComponentType;
|
||||
JVM_GetDeclaredClasses;
|
||||
JVM_GetDeclaringClass;
|
||||
JVM_GetEnclosingMethodInfo;
|
||||
JVM_GetFieldAnnotations;
|
||||
JVM_GetFieldIxModifiers;
|
||||
JVM_GetHostName;
|
||||
JVM_GetInheritedAccessControlContext;
|
||||
JVM_GetInterfaceVersion;
|
||||
JVM_GetLastErrorString;
|
||||
JVM_GetManagement;
|
||||
JVM_GetMethodAnnotations;
|
||||
JVM_GetMethodDefaultAnnotationValue;
|
||||
JVM_GetMethodIxArgsSize;
|
||||
JVM_GetMethodIxByteCode;
|
||||
JVM_GetMethodIxByteCodeLength;
|
||||
JVM_GetMethodIxExceptionIndexes;
|
||||
JVM_GetMethodIxExceptionTableEntry;
|
||||
JVM_GetMethodIxExceptionTableLength;
|
||||
JVM_GetMethodIxExceptionsCount;
|
||||
JVM_GetMethodIxLocalsCount;
|
||||
JVM_GetMethodIxMaxStack;
|
||||
JVM_GetMethodIxModifiers;
|
||||
JVM_GetMethodIxNameUTF;
|
||||
JVM_GetMethodIxSignatureUTF;
|
||||
JVM_GetMethodParameterAnnotations;
|
||||
JVM_GetPrimitiveArrayElement;
|
||||
JVM_GetProtectionDomain;
|
||||
JVM_GetSockName;
|
||||
JVM_GetSockOpt;
|
||||
JVM_GetStackAccessControlContext;
|
||||
JVM_GetStackTraceDepth;
|
||||
JVM_GetStackTraceElement;
|
||||
JVM_GetSystemPackage;
|
||||
JVM_GetSystemPackages;
|
||||
JVM_GetThreadStateNames;
|
||||
JVM_GetThreadStateValues;
|
||||
JVM_GetVersionInfo;
|
||||
JVM_Halt;
|
||||
JVM_HoldsLock;
|
||||
JVM_IHashCode;
|
||||
JVM_InitAgentProperties;
|
||||
JVM_InitProperties;
|
||||
JVM_InitializeCompiler;
|
||||
JVM_InitializeSocketLibrary;
|
||||
JVM_InternString;
|
||||
JVM_Interrupt;
|
||||
JVM_InvokeMethod;
|
||||
JVM_IsArrayClass;
|
||||
JVM_IsConstructorIx;
|
||||
JVM_IsInterface;
|
||||
JVM_IsInterrupted;
|
||||
JVM_IsNaN;
|
||||
JVM_IsPrimitiveClass;
|
||||
JVM_IsSameClassPackage;
|
||||
JVM_IsSilentCompiler;
|
||||
JVM_IsSupportedJNIVersion;
|
||||
JVM_IsThreadAlive;
|
||||
JVM_LatestUserDefinedLoader;
|
||||
JVM_Listen;
|
||||
JVM_LoadClass0;
|
||||
JVM_LoadLibrary;
|
||||
JVM_Lseek;
|
||||
JVM_MaxObjectInspectionAge;
|
||||
JVM_MaxMemory;
|
||||
JVM_MonitorNotify;
|
||||
JVM_MonitorNotifyAll;
|
||||
JVM_MonitorWait;
|
||||
JVM_NanoTime;
|
||||
JVM_NativePath;
|
||||
JVM_NewArray;
|
||||
JVM_NewInstanceFromConstructor;
|
||||
JVM_NewMultiArray;
|
||||
JVM_OnExit;
|
||||
JVM_Open;
|
||||
JVM_PrintStackTrace;
|
||||
JVM_RaiseSignal;
|
||||
JVM_RawMonitorCreate;
|
||||
JVM_RawMonitorDestroy;
|
||||
JVM_RawMonitorEnter;
|
||||
JVM_RawMonitorExit;
|
||||
JVM_Read;
|
||||
JVM_Recv;
|
||||
JVM_RecvFrom;
|
||||
JVM_RegisterSignal;
|
||||
JVM_ReleaseUTF;
|
||||
JVM_ResolveClass;
|
||||
JVM_ResumeThread;
|
||||
JVM_Send;
|
||||
JVM_SendTo;
|
||||
JVM_SetArrayElement;
|
||||
JVM_SetClassSigners;
|
||||
JVM_SetLength;
|
||||
JVM_SetPrimitiveArrayElement;
|
||||
JVM_SetProtectionDomain;
|
||||
JVM_SetSockOpt;
|
||||
JVM_SetThreadPriority;
|
||||
JVM_Sleep;
|
||||
JVM_Socket;
|
||||
JVM_SocketAvailable;
|
||||
JVM_SocketClose;
|
||||
JVM_SocketShutdown;
|
||||
JVM_StartThread;
|
||||
JVM_StopThread;
|
||||
JVM_SuspendThread;
|
||||
JVM_SupportsCX8;
|
||||
JVM_Sync;
|
||||
JVM_Timeout;
|
||||
JVM_TotalMemory;
|
||||
JVM_TraceInstructions;
|
||||
JVM_TraceMethodCalls;
|
||||
JVM_UnloadLibrary;
|
||||
JVM_Write;
|
||||
JVM_Yield;
|
||||
JVM_handle_bsd_signal;
|
||||
|
||||
# Old reflection routines
|
||||
# These do not need to be present in the product build in JDK 1.4
|
||||
# but their code has not been removed yet because there will not
|
||||
# be a substantial code savings until JVM_InvokeMethod and
|
||||
# JVM_NewInstanceFromConstructor can also be removed; see
|
||||
# reflectionCompat.hpp.
|
||||
JVM_GetClassConstructor;
|
||||
JVM_GetClassConstructors;
|
||||
JVM_GetClassField;
|
||||
JVM_GetClassFields;
|
||||
JVM_GetClassMethod;
|
||||
JVM_GetClassMethods;
|
||||
JVM_GetField;
|
||||
JVM_GetPrimitiveField;
|
||||
JVM_NewInstance;
|
||||
JVM_SetField;
|
||||
JVM_SetPrimitiveField;
|
||||
|
||||
# debug JVM
|
||||
JVM_AccessVMBooleanFlag;
|
||||
JVM_AccessVMIntFlag;
|
||||
JVM_VMBreakPoint;
|
||||
|
||||
# miscellaneous functions
|
||||
jio_fprintf;
|
||||
jio_printf;
|
||||
jio_snprintf;
|
||||
jio_vfprintf;
|
||||
jio_vsnprintf;
|
||||
fork1;
|
||||
numa_warn;
|
||||
numa_error;
|
||||
|
||||
# Needed because there is no JVM interface for this.
|
||||
sysThreadAvailableStackWithSlack;
|
||||
|
||||
# This is for Forte Analyzer profiling support.
|
||||
AsyncGetCallTrace;
|
||||
|
||||
# INSERT VTABLE SYMBOLS HERE
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
||||
|
40
hotspot/make/bsd/makefiles/mapfile-vers-jsig
Normal file
40
hotspot/make/bsd/makefiles/mapfile-vers-jsig
Normal file
@ -0,0 +1,40 @@
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Define library interface.
|
||||
|
||||
SUNWprivate_1.1 {
|
||||
global:
|
||||
JVM_begin_signal_setting;
|
||||
JVM_end_signal_setting;
|
||||
JVM_get_libjsig_version;
|
||||
JVM_get_signal_action;
|
||||
sigaction;
|
||||
signal;
|
||||
sigset;
|
||||
local:
|
||||
*;
|
||||
};
|
286
hotspot/make/bsd/makefiles/mapfile-vers-product
Normal file
286
hotspot/make/bsd/makefiles/mapfile-vers-product
Normal file
@ -0,0 +1,286 @@
|
||||
#
|
||||
# @(#)mapfile-vers-product 1.19 08/02/12 10:56:37
|
||||
#
|
||||
|
||||
#
|
||||
# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Define public interface.
|
||||
|
||||
SUNWprivate_1.1 {
|
||||
global:
|
||||
# JNI
|
||||
JNI_CreateJavaVM;
|
||||
JNI_GetCreatedJavaVMs;
|
||||
JNI_GetDefaultJavaVMInitArgs;
|
||||
|
||||
# JVM
|
||||
JVM_Accept;
|
||||
JVM_ActiveProcessorCount;
|
||||
JVM_AllocateNewArray;
|
||||
JVM_AllocateNewObject;
|
||||
JVM_ArrayCopy;
|
||||
JVM_AssertionStatusDirectives;
|
||||
JVM_Available;
|
||||
JVM_Bind;
|
||||
JVM_ClassDepth;
|
||||
JVM_ClassLoaderDepth;
|
||||
JVM_Clone;
|
||||
JVM_Close;
|
||||
JVM_CX8Field;
|
||||
JVM_CompileClass;
|
||||
JVM_CompileClasses;
|
||||
JVM_CompilerCommand;
|
||||
JVM_Connect;
|
||||
JVM_ConstantPoolGetClassAt;
|
||||
JVM_ConstantPoolGetClassAtIfLoaded;
|
||||
JVM_ConstantPoolGetDoubleAt;
|
||||
JVM_ConstantPoolGetFieldAt;
|
||||
JVM_ConstantPoolGetFieldAtIfLoaded;
|
||||
JVM_ConstantPoolGetFloatAt;
|
||||
JVM_ConstantPoolGetIntAt;
|
||||
JVM_ConstantPoolGetLongAt;
|
||||
JVM_ConstantPoolGetMethodAt;
|
||||
JVM_ConstantPoolGetMethodAtIfLoaded;
|
||||
JVM_ConstantPoolGetMemberRefInfoAt;
|
||||
JVM_ConstantPoolGetSize;
|
||||
JVM_ConstantPoolGetStringAt;
|
||||
JVM_ConstantPoolGetUTF8At;
|
||||
JVM_CountStackFrames;
|
||||
JVM_CurrentClassLoader;
|
||||
JVM_CurrentLoadedClass;
|
||||
JVM_CurrentThread;
|
||||
JVM_CurrentTimeMillis;
|
||||
JVM_DefineClass;
|
||||
JVM_DefineClassWithSource;
|
||||
JVM_DefineClassWithSourceCond;
|
||||
JVM_DesiredAssertionStatus;
|
||||
JVM_DisableCompiler;
|
||||
JVM_DoPrivileged;
|
||||
JVM_DTraceGetVersion;
|
||||
JVM_DTraceActivate;
|
||||
JVM_DTraceIsProbeEnabled;
|
||||
JVM_DTraceIsSupported;
|
||||
JVM_DTraceDispose;
|
||||
JVM_DumpAllStacks;
|
||||
JVM_DumpThreads;
|
||||
JVM_EnableCompiler;
|
||||
JVM_Exit;
|
||||
JVM_FillInStackTrace;
|
||||
JVM_FindClassFromClass;
|
||||
JVM_FindClassFromClassLoader;
|
||||
JVM_FindClassFromBootLoader;
|
||||
JVM_FindLibraryEntry;
|
||||
JVM_FindLoadedClass;
|
||||
JVM_FindPrimitiveClass;
|
||||
JVM_FindSignal;
|
||||
JVM_FreeMemory;
|
||||
JVM_GC;
|
||||
JVM_GetAllThreads;
|
||||
JVM_GetArrayElement;
|
||||
JVM_GetArrayLength;
|
||||
JVM_GetCPClassNameUTF;
|
||||
JVM_GetCPFieldClassNameUTF;
|
||||
JVM_GetCPFieldModifiers;
|
||||
JVM_GetCPFieldNameUTF;
|
||||
JVM_GetCPFieldSignatureUTF;
|
||||
JVM_GetCPMethodClassNameUTF;
|
||||
JVM_GetCPMethodModifiers;
|
||||
JVM_GetCPMethodNameUTF;
|
||||
JVM_GetCPMethodSignatureUTF;
|
||||
JVM_GetCallerClass;
|
||||
JVM_GetClassAccessFlags;
|
||||
JVM_GetClassAnnotations;
|
||||
JVM_GetClassCPEntriesCount;
|
||||
JVM_GetClassCPTypes;
|
||||
JVM_GetClassConstantPool;
|
||||
JVM_GetClassContext;
|
||||
JVM_GetClassDeclaredConstructors;
|
||||
JVM_GetClassDeclaredFields;
|
||||
JVM_GetClassDeclaredMethods;
|
||||
JVM_GetClassFieldsCount;
|
||||
JVM_GetClassInterfaces;
|
||||
JVM_GetClassLoader;
|
||||
JVM_GetClassMethodsCount;
|
||||
JVM_GetClassModifiers;
|
||||
JVM_GetClassName;
|
||||
JVM_GetClassNameUTF;
|
||||
JVM_GetClassSignature;
|
||||
JVM_GetClassSigners;
|
||||
JVM_GetComponentType;
|
||||
JVM_GetDeclaredClasses;
|
||||
JVM_GetDeclaringClass;
|
||||
JVM_GetEnclosingMethodInfo;
|
||||
JVM_GetFieldAnnotations;
|
||||
JVM_GetFieldIxModifiers;
|
||||
JVM_GetHostName;
|
||||
JVM_GetInheritedAccessControlContext;
|
||||
JVM_GetInterfaceVersion;
|
||||
JVM_GetLastErrorString;
|
||||
JVM_GetManagement;
|
||||
JVM_GetMethodAnnotations;
|
||||
JVM_GetMethodDefaultAnnotationValue;
|
||||
JVM_GetMethodIxArgsSize;
|
||||
JVM_GetMethodIxByteCode;
|
||||
JVM_GetMethodIxByteCodeLength;
|
||||
JVM_GetMethodIxExceptionIndexes;
|
||||
JVM_GetMethodIxExceptionTableEntry;
|
||||
JVM_GetMethodIxExceptionTableLength;
|
||||
JVM_GetMethodIxExceptionsCount;
|
||||
JVM_GetMethodIxLocalsCount;
|
||||
JVM_GetMethodIxMaxStack;
|
||||
JVM_GetMethodIxModifiers;
|
||||
JVM_GetMethodIxNameUTF;
|
||||
JVM_GetMethodIxSignatureUTF;
|
||||
JVM_GetMethodParameterAnnotations;
|
||||
JVM_GetPrimitiveArrayElement;
|
||||
JVM_GetProtectionDomain;
|
||||
JVM_GetSockName;
|
||||
JVM_GetSockOpt;
|
||||
JVM_GetStackAccessControlContext;
|
||||
JVM_GetStackTraceDepth;
|
||||
JVM_GetStackTraceElement;
|
||||
JVM_GetSystemPackage;
|
||||
JVM_GetSystemPackages;
|
||||
JVM_GetThreadStateNames;
|
||||
JVM_GetThreadStateValues;
|
||||
JVM_GetVersionInfo;
|
||||
JVM_Halt;
|
||||
JVM_HoldsLock;
|
||||
JVM_IHashCode;
|
||||
JVM_InitAgentProperties;
|
||||
JVM_InitProperties;
|
||||
JVM_InitializeCompiler;
|
||||
JVM_InitializeSocketLibrary;
|
||||
JVM_InternString;
|
||||
JVM_Interrupt;
|
||||
JVM_InvokeMethod;
|
||||
JVM_IsArrayClass;
|
||||
JVM_IsConstructorIx;
|
||||
JVM_IsInterface;
|
||||
JVM_IsInterrupted;
|
||||
JVM_IsNaN;
|
||||
JVM_IsPrimitiveClass;
|
||||
JVM_IsSameClassPackage;
|
||||
JVM_IsSilentCompiler;
|
||||
JVM_IsSupportedJNIVersion;
|
||||
JVM_IsThreadAlive;
|
||||
JVM_LatestUserDefinedLoader;
|
||||
JVM_Listen;
|
||||
JVM_LoadClass0;
|
||||
JVM_LoadLibrary;
|
||||
JVM_Lseek;
|
||||
JVM_MaxObjectInspectionAge;
|
||||
JVM_MaxMemory;
|
||||
JVM_MonitorNotify;
|
||||
JVM_MonitorNotifyAll;
|
||||
JVM_MonitorWait;
|
||||
JVM_NanoTime;
|
||||
JVM_NativePath;
|
||||
JVM_NewArray;
|
||||
JVM_NewInstanceFromConstructor;
|
||||
JVM_NewMultiArray;
|
||||
JVM_OnExit;
|
||||
JVM_Open;
|
||||
JVM_PrintStackTrace;
|
||||
JVM_RaiseSignal;
|
||||
JVM_RawMonitorCreate;
|
||||
JVM_RawMonitorDestroy;
|
||||
JVM_RawMonitorEnter;
|
||||
JVM_RawMonitorExit;
|
||||
JVM_Read;
|
||||
JVM_Recv;
|
||||
JVM_RecvFrom;
|
||||
JVM_RegisterSignal;
|
||||
JVM_ReleaseUTF;
|
||||
JVM_ResolveClass;
|
||||
JVM_ResumeThread;
|
||||
JVM_Send;
|
||||
JVM_SendTo;
|
||||
JVM_SetArrayElement;
|
||||
JVM_SetClassSigners;
|
||||
JVM_SetLength;
|
||||
JVM_SetPrimitiveArrayElement;
|
||||
JVM_SetProtectionDomain;
|
||||
JVM_SetSockOpt;
|
||||
JVM_SetThreadPriority;
|
||||
JVM_Sleep;
|
||||
JVM_Socket;
|
||||
JVM_SocketAvailable;
|
||||
JVM_SocketClose;
|
||||
JVM_SocketShutdown;
|
||||
JVM_StartThread;
|
||||
JVM_StopThread;
|
||||
JVM_SuspendThread;
|
||||
JVM_SupportsCX8;
|
||||
JVM_Sync;
|
||||
JVM_Timeout;
|
||||
JVM_TotalMemory;
|
||||
JVM_TraceInstructions;
|
||||
JVM_TraceMethodCalls;
|
||||
JVM_UnloadLibrary;
|
||||
JVM_Write;
|
||||
JVM_Yield;
|
||||
JVM_handle_bsd_signal;
|
||||
|
||||
# Old reflection routines
|
||||
# These do not need to be present in the product build in JDK 1.4
|
||||
# but their code has not been removed yet because there will not
|
||||
# be a substantial code savings until JVM_InvokeMethod and
|
||||
# JVM_NewInstanceFromConstructor can also be removed; see
|
||||
# reflectionCompat.hpp.
|
||||
JVM_GetClassConstructor;
|
||||
JVM_GetClassConstructors;
|
||||
JVM_GetClassField;
|
||||
JVM_GetClassFields;
|
||||
JVM_GetClassMethod;
|
||||
JVM_GetClassMethods;
|
||||
JVM_GetField;
|
||||
JVM_GetPrimitiveField;
|
||||
JVM_NewInstance;
|
||||
JVM_SetField;
|
||||
JVM_SetPrimitiveField;
|
||||
|
||||
# miscellaneous functions
|
||||
jio_fprintf;
|
||||
jio_printf;
|
||||
jio_snprintf;
|
||||
jio_vfprintf;
|
||||
jio_vsnprintf;
|
||||
fork1;
|
||||
numa_warn;
|
||||
numa_error;
|
||||
|
||||
# Needed because there is no JVM interface for this.
|
||||
sysThreadAvailableStackWithSlack;
|
||||
|
||||
# This is for Forte Analyzer profiling support.
|
||||
AsyncGetCallTrace;
|
||||
|
||||
# INSERT VTABLE SYMBOLS HERE
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
||||
|
44
hotspot/make/bsd/makefiles/optimized.make
Normal file
44
hotspot/make/bsd/makefiles/optimized.make
Normal file
@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making optimized version of Gamma VM
|
||||
# (This is the "product", not the "release" version.)
|
||||
|
||||
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
|
||||
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
|
||||
|
||||
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
|
||||
|
||||
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
|
||||
CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
||||
|
||||
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||
# to inhibit the effect of the previous line on CFLAGS.
|
||||
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
|
||||
|
||||
G_SUFFIX =
|
||||
VERSION = optimized
|
30
hotspot/make/bsd/makefiles/ppc.make
Normal file
30
hotspot/make/bsd/makefiles/ppc.make
Normal file
@ -0,0 +1,30 @@
|
||||
#
|
||||
# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT)
|
||||
|
||||
# Must also specify if CPU is big endian
|
||||
CFLAGS += -DVM_BIG_ENDIAN
|
||||
|
58
hotspot/make/bsd/makefiles/product.make
Normal file
58
hotspot/make/bsd/makefiles/product.make
Normal file
@ -0,0 +1,58 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making optimized version of Gamma VM
|
||||
# (This is the "product", not the "release" version.)
|
||||
|
||||
# Compiler specific OPT_CFLAGS are passed in from gcc.make, sparcWorks.make
|
||||
OPT_CFLAGS/DEFAULT= $(OPT_CFLAGS)
|
||||
OPT_CFLAGS/BYFILE = $(OPT_CFLAGS/$@)$(OPT_CFLAGS/DEFAULT$(OPT_CFLAGS/$@))
|
||||
|
||||
# (OPT_CFLAGS/SLOWER is also available, to alter compilation of buggy files)
|
||||
|
||||
# If you set HOTSPARC_GENERIC=yes, you disable all OPT_CFLAGS settings
|
||||
CFLAGS$(HOTSPARC_GENERIC) += $(OPT_CFLAGS/BYFILE)
|
||||
|
||||
# Set the environment variable HOTSPARC_GENERIC to "true"
|
||||
# to inhibit the effect of the previous line on CFLAGS.
|
||||
|
||||
# Linker mapfile
|
||||
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-product
|
||||
|
||||
G_SUFFIX =
|
||||
SYSDEFS += -DPRODUCT
|
||||
VERSION = optimized
|
||||
|
||||
# use -g to strip library as -x will discard its symbol table; -x is fine for
|
||||
# executables.
|
||||
ifdef CROSS_COMPILE_ARCH
|
||||
STRIP = $(ALT_COMPILER_PATH)/strip
|
||||
else
|
||||
STRIP = strip
|
||||
endif
|
||||
STRIP_LIBJVM = $(STRIP) -g $@ || exit 1;
|
||||
STRIP_AOUT = $(STRIP) -x $@ || exit 1;
|
||||
|
||||
# Don't strip in VM build; JDK build will strip libraries later
|
||||
# LINK_LIB.CC/POST_HOOK += $(STRIP_$(LINK_INTO))
|
30
hotspot/make/bsd/makefiles/profiled.make
Normal file
30
hotspot/make/bsd/makefiles/profiled.make
Normal file
@ -0,0 +1,30 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making profiled version of Gamma VM
|
||||
# (It is also optimized.)
|
||||
|
||||
CFLAGS += -pg
|
||||
AOUT_FLAGS += -pg
|
||||
LDNOMAP = true
|
216
hotspot/make/bsd/makefiles/rules.make
Normal file
216
hotspot/make/bsd/makefiles/rules.make
Normal file
@ -0,0 +1,216 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Common rules/macros for the vm, adlc.
|
||||
|
||||
# Tell make that .cpp is important
|
||||
.SUFFIXES: .cpp $(SUFFIXES)
|
||||
|
||||
# For now. Other makefiles use CPP as the c++ compiler, but that should really
|
||||
# name the preprocessor.
|
||||
ifeq ($(CCC),)
|
||||
CCC = $(CPP)
|
||||
endif
|
||||
|
||||
DEMANGLER = c++filt
|
||||
DEMANGLE = $(DEMANGLER) < $@ > .$@ && mv -f .$@ $@
|
||||
|
||||
# $(CC) is the c compiler (cc/gcc), $(CCC) is the c++ compiler (CC/g++).
|
||||
C_COMPILE = $(CC) $(CPPFLAGS) $(CFLAGS)
|
||||
CC_COMPILE = $(CCC) $(CPPFLAGS) $(CFLAGS)
|
||||
|
||||
AS.S = $(AS) $(ASFLAGS)
|
||||
|
||||
COMPILE.c = $(C_COMPILE) -c
|
||||
GENASM.c = $(C_COMPILE) -S
|
||||
LINK.c = $(CC) $(LFLAGS) $(AOUT_FLAGS) $(PROF_AOUT_FLAGS)
|
||||
LINK_LIB.c = $(CC) $(LFLAGS) $(SHARED_FLAG)
|
||||
PREPROCESS.c = $(C_COMPILE) -E
|
||||
|
||||
COMPILE.CC = $(CC_COMPILE) -c
|
||||
GENASM.CC = $(CC_COMPILE) -S
|
||||
LINK.CC = $(CCC) $(LFLAGS) $(AOUT_FLAGS) $(PROF_AOUT_FLAGS)
|
||||
LINK_NOPROF.CC = $(CCC) $(LFLAGS) $(AOUT_FLAGS)
|
||||
LINK_LIB.CC = $(CCC) $(LFLAGS) $(SHARED_FLAG)
|
||||
PREPROCESS.CC = $(CC_COMPILE) -E
|
||||
|
||||
# cross compiling the jvm with c2 requires host compilers to build
|
||||
# adlc tool
|
||||
|
||||
HOST.CC_COMPILE = $(HOSTCPP) $(CPPFLAGS) $(CFLAGS)
|
||||
HOST.COMPILE.CC = $(HOST.CC_COMPILE) -c
|
||||
HOST.LINK_NOPROF.CC = $(HOSTCPP) $(LFLAGS) $(AOUT_FLAGS)
|
||||
|
||||
|
||||
# Effect of REMOVE_TARGET is to delete out-of-date files during "gnumake -k".
|
||||
REMOVE_TARGET = rm -f $@
|
||||
|
||||
# Synonyms.
|
||||
COMPILE.cpp = $(COMPILE.CC)
|
||||
GENASM.cpp = $(GENASM.CC)
|
||||
LINK.cpp = $(LINK.CC)
|
||||
LINK_LIB.cpp = $(LINK_LIB.CC)
|
||||
PREPROCESS.cpp = $(PREPROCESS.CC)
|
||||
|
||||
# Note use of ALT_BOOTDIR to explicitly specify location of java and
|
||||
# javac; this is the same environment variable used in the J2SE build
|
||||
# process for overriding the default spec, which is BOOTDIR.
|
||||
# Note also that we fall back to using JAVA_HOME if neither of these is
|
||||
# specified.
|
||||
|
||||
ifdef ALT_BOOTDIR
|
||||
|
||||
RUN.JAVA = $(ALT_BOOTDIR)/bin/java
|
||||
RUN.JAVAP = $(ALT_BOOTDIR)/bin/javap
|
||||
RUN.JAVAH = $(ALT_BOOTDIR)/bin/javah
|
||||
RUN.JAR = $(ALT_BOOTDIR)/bin/jar
|
||||
COMPILE.JAVAC = $(ALT_BOOTDIR)/bin/javac
|
||||
COMPILE.RMIC = $(ALT_BOOTDIR)/bin/rmic
|
||||
BOOT_JAVA_HOME = $(ALT_BOOTDIR)
|
||||
|
||||
else
|
||||
|
||||
ifdef BOOTDIR
|
||||
|
||||
RUN.JAVA = $(BOOTDIR)/bin/java
|
||||
RUN.JAVAP = $(BOOTDIR)/bin/javap
|
||||
RUN.JAVAH = $(BOOTDIR)/bin/javah
|
||||
RUN.JAR = $(BOOTDIR)/bin/jar
|
||||
COMPILE.JAVAC = $(BOOTDIR)/bin/javac
|
||||
COMPILE.RMIC = $(BOOTDIR)/bin/rmic
|
||||
BOOT_JAVA_HOME = $(BOOTDIR)
|
||||
|
||||
else
|
||||
|
||||
ifdef JAVA_HOME
|
||||
|
||||
RUN.JAVA = $(JAVA_HOME)/bin/java
|
||||
RUN.JAVAP = $(JAVA_HOME)/bin/javap
|
||||
RUN.JAVAH = $(JAVA_HOME)/bin/javah
|
||||
RUN.JAR = $(JAVA_HOME)/bin/jar
|
||||
COMPILE.JAVAC = $(JAVA_HOME)/bin/javac
|
||||
COMPILE.RMIC = $(JAVA_HOME)/bin/rmic
|
||||
BOOT_JAVA_HOME = $(JAVA_HOME)
|
||||
|
||||
else
|
||||
|
||||
# take from the PATH, if ALT_BOOTDIR, BOOTDIR and JAVA_HOME are not defined
|
||||
# note that this is to support hotspot build without SA. To build
|
||||
# SA along with hotspot, you need to define ALT_BOOTDIR, BOOTDIR or JAVA_HOME
|
||||
|
||||
RUN.JAVA = java
|
||||
RUN.JAVAP = javap
|
||||
RUN.JAVAH = javah
|
||||
RUN.JAR = jar
|
||||
COMPILE.JAVAC = javac
|
||||
COMPILE.RMIC = rmic
|
||||
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
COMPILE.JAVAC += $(BOOTSTRAP_JAVAC_FLAGS)
|
||||
|
||||
SUM = /usr/bin/sum
|
||||
|
||||
# 'gmake MAKE_VERBOSE=y' gives all the gory details.
|
||||
QUIETLY$(MAKE_VERBOSE) = @
|
||||
RUN.JAR$(MAKE_VERBOSE) += >/dev/null
|
||||
|
||||
# Settings for javac
|
||||
BOOT_SOURCE_LANGUAGE_VERSION = 6
|
||||
BOOT_TARGET_CLASS_VERSION = 6
|
||||
JAVAC_FLAGS = -g -encoding ascii
|
||||
BOOTSTRAP_JAVAC_FLAGS = $(JAVAC_FLAGS) -source $(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
|
||||
|
||||
# With parallel makes, print a message at the end of compilation.
|
||||
ifeq ($(findstring j,$(MFLAGS)),j)
|
||||
COMPILE_DONE = && { echo Done with $<; }
|
||||
endif
|
||||
|
||||
# Include $(NONPIC_OBJ_FILES) definition
|
||||
ifndef LP64
|
||||
include $(GAMMADIR)/make/pic.make
|
||||
endif
|
||||
|
||||
include $(GAMMADIR)/make/altsrc.make
|
||||
|
||||
# The non-PIC object files are only generated for 32 bit platforms.
|
||||
ifdef LP64
|
||||
%.o: %.cpp
|
||||
@echo Compiling $<
|
||||
$(QUIETLY) $(REMOVE_TARGET)
|
||||
$(QUIETLY) $(COMPILE.CC) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE)
|
||||
else
|
||||
%.o: %.cpp
|
||||
@echo Compiling $<
|
||||
$(QUIETLY) $(REMOVE_TARGET)
|
||||
$(QUIETLY) $(if $(findstring $@, $(NONPIC_OBJ_FILES)), \
|
||||
$(subst $(VM_PICFLAG), ,$(COMPILE.CC)) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE), \
|
||||
$(COMPILE.CC) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE))
|
||||
endif
|
||||
|
||||
%.o: %.s
|
||||
@echo Assembling $<
|
||||
$(QUIETLY) $(REMOVE_TARGET)
|
||||
$(QUIETLY) $(AS.S) $(DEPFLAGS) -o $@ $< $(COMPILE_DONE)
|
||||
|
||||
%.s: %.cpp
|
||||
@echo Generating assembly for $<
|
||||
$(QUIETLY) $(GENASM.CC) -o $@ $<
|
||||
$(QUIETLY) $(DEMANGLE) $(COMPILE_DONE)
|
||||
|
||||
# Intermediate files (for debugging macros)
|
||||
%.i: %.cpp
|
||||
@echo Preprocessing $< to $@
|
||||
$(QUIETLY) $(PREPROCESS.CC) $< > $@ $(COMPILE_DONE)
|
||||
|
||||
# Override gnumake built-in rules which do sccs get operations badly.
|
||||
# (They put the checked out code in the current directory, not in the
|
||||
# directory of the original file.) Since this is a symptom of a teamware
|
||||
# failure, and since not all problems can be detected by gnumake due
|
||||
# to incomplete dependency checking... just complain and stop.
|
||||
%:: s.%
|
||||
@echo "========================================================="
|
||||
@echo File $@
|
||||
@echo is out of date with respect to its SCCS file.
|
||||
@echo This file may be from an unresolved Teamware conflict.
|
||||
@echo This is also a symptom of a Teamware bringover/putback failure
|
||||
@echo in which SCCS files are updated but not checked out.
|
||||
@echo Check for other out of date files in your workspace.
|
||||
@echo "========================================================="
|
||||
@exit 666
|
||||
|
||||
%:: SCCS/s.%
|
||||
@echo "========================================================="
|
||||
@echo File $@
|
||||
@echo is out of date with respect to its SCCS file.
|
||||
@echo This file may be from an unresolved Teamware conflict.
|
||||
@echo This is also a symptom of a Teamware bringover/putback failure
|
||||
@echo in which SCCS files are updated but not checked out.
|
||||
@echo Check for other out of date files in your workspace.
|
||||
@echo "========================================================="
|
||||
@exit 666
|
||||
|
||||
.PHONY: default
|
121
hotspot/make/bsd/makefiles/sa.make
Normal file
121
hotspot/make/bsd/makefiles/sa.make
Normal file
@ -0,0 +1,121 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This makefile (sa.make) is included from the sa.make in the
|
||||
# build directories.
|
||||
|
||||
# This makefile is used to build Serviceability Agent java code
|
||||
# and generate JNI header file for native methods.
|
||||
|
||||
include $(GAMMADIR)/make/bsd/makefiles/rules.make
|
||||
|
||||
AGENT_DIR = $(GAMMADIR)/agent
|
||||
|
||||
include $(GAMMADIR)/make/sa.files
|
||||
|
||||
TOPDIR = $(shell echo `pwd`)
|
||||
GENERATED = $(TOPDIR)/../generated
|
||||
|
||||
# tools.jar is needed by the JDI - SA binding
|
||||
SA_CLASSPATH = $(BOOT_JAVA_HOME)/lib/tools.jar
|
||||
|
||||
# TODO: if it's a modules image, check if SA module is installed.
|
||||
MODULELIB_PATH= $(BOOT_JAVA_HOME)/lib/modules
|
||||
|
||||
# gnumake 3.78.1 does not accept the *s that
|
||||
# are in AGENT_FILES1 and AGENT_FILES2, so use the shell to expand them
|
||||
AGENT_FILES1 := $(shell /bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES1))
|
||||
AGENT_FILES2 := $(shell /bin/test -d $(AGENT_DIR) && /bin/ls $(AGENT_FILES2))
|
||||
|
||||
AGENT_FILES1_LIST := $(GENERATED)/agent1.classes.list
|
||||
AGENT_FILES2_LIST := $(GENERATED)/agent2.classes.list
|
||||
|
||||
SA_CLASSDIR = $(GENERATED)/saclasses
|
||||
|
||||
SA_BUILD_VERSION_PROP = "sun.jvm.hotspot.runtime.VM.saBuildVersion=$(SA_BUILD_VERSION)"
|
||||
|
||||
SA_PROPERTIES = $(SA_CLASSDIR)/sa.properties
|
||||
|
||||
# if $(AGENT_DIR) does not exist, we don't build SA
|
||||
# also, we don't build SA on Itanium, PowerPC, ARM or zero.
|
||||
|
||||
all:
|
||||
if [ -d $(AGENT_DIR) -a "$(SRCARCH)" != "ia64" \
|
||||
-a "$(SRCARCH)" != "arm" \
|
||||
-a "$(SRCARCH)" != "ppc" \
|
||||
-a "$(SRCARCH)" != "zero" ] ; then \
|
||||
$(MAKE) -f sa.make $(GENERATED)/sa-jdi.jar; \
|
||||
fi
|
||||
|
||||
$(GENERATED)/sa-jdi.jar: $(AGENT_FILES1) $(AGENT_FILES2)
|
||||
$(QUIETLY) echo "Making $@"
|
||||
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
|
||||
echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(QUIETLY) if [ ! -f $(SA_CLASSPATH) -a ! -d $(MODULELIB_PATH) ] ; then \
|
||||
echo "Missing $(SA_CLASSPATH) file. Use 1.6.0 or later version of JDK";\
|
||||
echo ""; \
|
||||
exit 1; \
|
||||
fi
|
||||
$(QUIETLY) if [ ! -d $(SA_CLASSDIR) ] ; then \
|
||||
mkdir -p $(SA_CLASSDIR); \
|
||||
fi
|
||||
|
||||
# Note: When indented, make tries to execute the '$(shell' comment.
|
||||
# In some environments, cmd processors have limited line length.
|
||||
# To prevent the javac invocation in the next block from using
|
||||
# a very long cmd line, we use javac's @file-list option. We
|
||||
# generate the file lists using make's built-in 'foreach' control
|
||||
# flow which also avoids cmd processor line length issues. Since
|
||||
# the 'foreach' is done as part of make's macro expansion phase,
|
||||
# the initialization of the lists is also done in the same phase
|
||||
# using '$(shell rm ...' instead of using the more traditional
|
||||
# 'rm ...' rule.
|
||||
$(shell rm -rf $(AGENT_FILES1_LIST) $(AGENT_FILES2_LIST))
|
||||
$(foreach file,$(AGENT_FILES1),$(shell echo $(file) >> $(AGENT_FILES1_LIST)))
|
||||
$(foreach file,$(AGENT_FILES2),$(shell echo $(file) >> $(AGENT_FILES2_LIST)))
|
||||
|
||||
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) @$(AGENT_FILES1_LIST)
|
||||
$(QUIETLY) $(REMOTE) $(COMPILE.JAVAC) -classpath $(SA_CLASSPATH) -sourcepath $(AGENT_SRC_DIR) -d $(SA_CLASSDIR) @$(AGENT_FILES2_LIST)
|
||||
|
||||
$(QUIETLY) $(REMOTE) $(COMPILE.RMIC) -classpath $(SA_CLASSDIR) -d $(SA_CLASSDIR) sun.jvm.hotspot.debugger.remote.RemoteDebuggerServer
|
||||
$(QUIETLY) echo "$(SA_BUILD_VERSION_PROP)" > $(SA_PROPERTIES)
|
||||
$(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql/sa.js
|
||||
$(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/utilities/soql/sa.js $(SA_CLASSDIR)/sun/jvm/hotspot/utilities/soql
|
||||
$(QUIETLY) mkdir -p $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources
|
||||
$(QUIETLY) rm -f $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/*
|
||||
$(QUIETLY) cp $(AGENT_SRC_DIR)/sun/jvm/hotspot/ui/resources/*.png $(SA_CLASSDIR)/sun/jvm/hotspot/ui/resources/
|
||||
$(QUIETLY) cp -r $(AGENT_SRC_DIR)/images/* $(SA_CLASSDIR)/
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAR) cf $@ -C $(SA_CLASSDIR)/ .
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAR) uf $@ -C $(AGENT_SRC_DIR) META-INF/services/com.sun.jdi.connect.Connector
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.x86.X86ThreadContext
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.ia64.IA64ThreadContext
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
|
||||
$(QUIETLY) $(REMOTE) $(RUN.JAVAH) -classpath $(SA_CLASSDIR) -d $(GENERATED) -jni sun.jvm.hotspot.debugger.sparc.SPARCThreadContext
|
||||
|
||||
clean:
|
||||
rm -rf $(SA_CLASSDIR)
|
||||
rm -rf $(GENERATED)/sa-jdi.jar
|
||||
rm -rf $(AGENT_FILES1_LIST) $(AGENT_FILES2_LIST)
|
107
hotspot/make/bsd/makefiles/saproc.make
Normal file
107
hotspot/make/bsd/makefiles/saproc.make
Normal file
@ -0,0 +1,107 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Rules to build serviceability agent library, used by vm.make
|
||||
|
||||
# libsaproc[_g].so: serviceability agent
|
||||
SAPROC = saproc
|
||||
SAPROC_G = $(SAPROC)$(G_SUFFIX)
|
||||
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
LIBSAPROC = lib$(SAPROC).dylib
|
||||
LIBSAPROC_G = lib$(SAPROC_G).dylib
|
||||
else
|
||||
LIBSAPROC = lib$(SAPROC).so
|
||||
LIBSAPROC_G = lib$(SAPROC_G).so
|
||||
endif
|
||||
|
||||
AGENT_DIR = $(GAMMADIR)/agent
|
||||
|
||||
SASRCDIR = $(AGENT_DIR)/src/os/$(Platform_os_family)
|
||||
|
||||
# disable building saproc until hsearch_r license issues are resolved
|
||||
#ifeq ($(OS_VENDOR), FreeBSD)
|
||||
#SASRCFILES = $(SASRCDIR)/salibelf.c \
|
||||
# $(SASRCDIR)/symtab.c \
|
||||
# $(SASRCDIR)/libproc_impl.c \
|
||||
# $(SASRCDIR)/ps_proc.c \
|
||||
# $(SASRCDIR)/ps_core.c \
|
||||
# $(SASRCDIR)/hsearch_r.c \
|
||||
# $(SASRCDIR)/BsdDebuggerLocal.c
|
||||
#SALIBS = -lutil -lthread_db
|
||||
#else
|
||||
SASRCFILES = $(SASRCDIR)/StubDebuggerLocal.c
|
||||
SALIBS =
|
||||
#endif
|
||||
|
||||
SAMAPFILE = $(SASRCDIR)/mapfile
|
||||
|
||||
DEST_SAPROC = $(JDK_LIBDIR)/$(LIBSAPROC)
|
||||
|
||||
# DEBUG_BINARIES overrides everything, use full -g debug information
|
||||
ifeq ($(DEBUG_BINARIES), true)
|
||||
SA_DEBUG_CFLAGS = -g
|
||||
endif
|
||||
|
||||
# if $(AGENT_DIR) does not exist, we don't build SA
|
||||
# also, we don't build SA on Itanium, PPC, ARM or zero.
|
||||
|
||||
ifneq ($(wildcard $(AGENT_DIR)),)
|
||||
ifneq ($(filter-out ia64 arm ppc zero,$(SRCARCH)),)
|
||||
BUILDLIBSAPROC = $(LIBSAPROC)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ifneq ($(OS_VENDOR), Darwin)
|
||||
SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE))
|
||||
endif
|
||||
SA_LFLAGS += $(LDFLAGS_HASH_STYLE)
|
||||
|
||||
$(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
|
||||
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
|
||||
echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \
|
||||
exit 1; \
|
||||
fi
|
||||
@echo Making SA debugger back-end...
|
||||
$(QUIETLY) $(CC) -D$(BUILDARCH) -D_GNU_SOURCE \
|
||||
$(SYMFLAG) $(ARCHFLAG) $(SHARED_FLAG) $(PICFLAG) \
|
||||
-I$(SASRCDIR) \
|
||||
-I$(GENERATED) \
|
||||
-I$(BOOT_JAVA_HOME)/include \
|
||||
-I$(BOOT_JAVA_HOME)/include/$(shell uname -s | tr "[:upper:]" "[:lower:]") \
|
||||
$(SASRCFILES) \
|
||||
$(SA_LFLAGS) \
|
||||
$(SA_DEBUG_CFLAGS) \
|
||||
-o $@ \
|
||||
$(SALIBS)
|
||||
$(QUIETLY) [ -f $(LIBSAPROC_G) ] || { ln -s $@ $(LIBSAPROC_G); }
|
||||
|
||||
install_saproc: $(BUILDLIBSAPROC)
|
||||
$(QUIETLY) if [ -e $(LIBSAPROC) ] ; then \
|
||||
echo "Copying $(LIBSAPROC) to $(DEST_SAPROC)"; \
|
||||
cp -f $(LIBSAPROC) $(DEST_SAPROC) && echo "Done"; \
|
||||
fi
|
||||
|
||||
.PHONY: install_saproc
|
32
hotspot/make/bsd/makefiles/shark.make
Normal file
32
hotspot/make/bsd/makefiles/shark.make
Normal file
@ -0,0 +1,32 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright 2008, 2010 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making Shark version of VM
|
||||
|
||||
TYPE = SHARK
|
||||
|
||||
VM_SUBDIR = server
|
||||
|
||||
CFLAGS += -DSHARK
|
24
hotspot/make/bsd/makefiles/sparc.make
Normal file
24
hotspot/make/bsd/makefiles/sparc.make
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
104
hotspot/make/bsd/makefiles/sparcWorks.make
Normal file
104
hotspot/make/bsd/makefiles/sparcWorks.make
Normal file
@ -0,0 +1,104 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# CC, CPP & AS
|
||||
|
||||
CPP = CC
|
||||
CC = cc
|
||||
AS = $(CC) -c
|
||||
|
||||
HOSTCPP = $(CPP)
|
||||
HOSTCC = $(CC)
|
||||
|
||||
ARCHFLAG = $(ARCHFLAG/$(BUILDARCH))
|
||||
ARCHFLAG/i486 = -m32
|
||||
ARCHFLAG/amd64 = -m64
|
||||
|
||||
CFLAGS += $(ARCHFLAG)
|
||||
AOUT_FLAGS += $(ARCHFLAG)
|
||||
LFLAGS += $(ARCHFLAG)
|
||||
ASFLAGS += $(ARCHFLAG)
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Compiler flags
|
||||
|
||||
# position-independent code
|
||||
PICFLAG = -KPIC
|
||||
|
||||
CFLAGS += $(PICFLAG)
|
||||
# no more exceptions
|
||||
CFLAGS += -features=no%except
|
||||
# Reduce code bloat by reverting back to 5.0 behavior for static initializers
|
||||
CFLAGS += -features=no%split_init
|
||||
# allow zero sized arrays
|
||||
CFLAGS += -features=zla
|
||||
|
||||
# Use C++ Interpreter
|
||||
ifdef CC_INTERP
|
||||
CFLAGS += -DCC_INTERP
|
||||
endif
|
||||
|
||||
# We don't need libCstd.so and librwtools7.so, only libCrun.so
|
||||
CFLAGS += -library=Crun
|
||||
LIBS += -lCrun
|
||||
|
||||
CFLAGS += -mt
|
||||
LFLAGS += -mt
|
||||
|
||||
# Compiler warnings are treated as errors
|
||||
#WARNINGS_ARE_ERRORS = -errwarn=%all
|
||||
CFLAGS_WARN/DEFAULT = $(WARNINGS_ARE_ERRORS)
|
||||
# Special cases
|
||||
CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
|
||||
|
||||
# The flags to use for an Optimized build
|
||||
OPT_CFLAGS+=-xO4
|
||||
OPT_CFLAGS/NOOPT=-xO0
|
||||
|
||||
# Flags for creating the dependency files.
|
||||
ifeq ($(shell expr $(COMPILER_REV_NUMERIC) \>= 509), 1)
|
||||
DEPFLAGS = -xMMD -xMF $(DEP_DIR)/$(@:%=%.d)
|
||||
endif
|
||||
|
||||
# -DDONT_USE_PRECOMPILED_HEADER will exclude all includes in precompiled.hpp.
|
||||
CFLAGS += -DDONT_USE_PRECOMPILED_HEADER
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Linker flags
|
||||
|
||||
# Use $(MAPFLAG:FILENAME=real_file_name) to specify a map file.
|
||||
MAPFLAG = -Wl,--version-script=FILENAME
|
||||
|
||||
# Use $(SONAMEFLAG:SONAME=soname) to specify the intrinsic name of a shared obj
|
||||
SONAMEFLAG = -h SONAME
|
||||
|
||||
# Build shared library
|
||||
SHARED_FLAG = -G
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Debug flags
|
||||
DEBUG_CFLAGS += -g
|
||||
FASTDEBUG_CFLAGS = -g0
|
||||
|
27
hotspot/make/bsd/makefiles/sparcv9.make
Normal file
27
hotspot/make/bsd/makefiles/sparcv9.make
Normal file
@ -0,0 +1,27 @@
|
||||
#
|
||||
# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
# gcc 4.0 miscompiles this code in -m64
|
||||
OPT_CFLAGS/macro.o = -O0
|
||||
|
||||
CFLAGS += -D_LP64=1
|
31
hotspot/make/bsd/makefiles/tiered.make
Normal file
31
hotspot/make/bsd/makefiles/tiered.make
Normal file
@ -0,0 +1,31 @@
|
||||
#
|
||||
# Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Sets make macros for making tiered version of VM
|
||||
|
||||
TYPE=TIERED
|
||||
|
||||
VM_SUBDIR = server
|
||||
|
||||
CFLAGS += -DCOMPILER2 -DCOMPILER1
|
142
hotspot/make/bsd/makefiles/top.make
Normal file
142
hotspot/make/bsd/makefiles/top.make
Normal file
@ -0,0 +1,142 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# top.make is included in the Makefile in the build directories.
|
||||
# It DOES NOT include the vm dependency info in order to be faster.
|
||||
# Its main job is to implement the incremental form of make lists.
|
||||
# It also:
|
||||
# -builds and runs adlc via adlc.make
|
||||
# -generates JVMTI source and docs via jvmti.make (JSR-163)
|
||||
# -generate sa-jdi.jar (JDI binding to core files)
|
||||
|
||||
# It assumes the following flags are set:
|
||||
# CFLAGS Platform_file, Src_Dirs_I, Src_Dirs_V, SYSDEFS, AOUT, Obj_Files
|
||||
|
||||
# -- D. Ungar (5/97) from a file by Bill Bush
|
||||
|
||||
# Don't override the built-in $(MAKE).
|
||||
# Instead, use "gmake" (or "gnumake") from the command line. --Rose
|
||||
#MAKE = gmake
|
||||
|
||||
include $(GAMMADIR)/make/altsrc.make
|
||||
|
||||
TOPDIR = $(shell echo `pwd`)
|
||||
GENERATED = $(TOPDIR)/../generated
|
||||
VM = $(GAMMADIR)/src/share/vm
|
||||
Plat_File = $(Platform_file)
|
||||
CDG = cd $(GENERATED);
|
||||
|
||||
ifdef USE_PRECOMPILED_HEADER
|
||||
PrecompiledOption = -DUSE_PRECOMPILED_HEADER
|
||||
UpdatePCH = $(MAKE) -f vm.make $(PRECOMPILED_HEADER) $(MFLAGS)
|
||||
else
|
||||
UpdatePCH = \# precompiled header is not used
|
||||
PrecompiledOption =
|
||||
endif
|
||||
|
||||
Cached_plat = $(GENERATED)/platform.current
|
||||
|
||||
AD_Dir = $(GENERATED)/adfiles
|
||||
ADLC = $(AD_Dir)/adlc
|
||||
AD_Spec = $(call altsrc-replace,$(HS_COMMON_SRC)/cpu/$(Platform_arch)/vm/$(Platform_arch_model).ad)
|
||||
AD_Src = $(call altsrc-replace,$(HS_COMMON_SRC)/share/vm/adlc)
|
||||
AD_Names = ad_$(Platform_arch_model).hpp ad_$(Platform_arch_model).cpp
|
||||
AD_Files = $(AD_Names:%=$(AD_Dir)/%)
|
||||
|
||||
# AD_Files_If_Required/COMPILER1 = ad_stuff
|
||||
AD_Files_If_Required/COMPILER2 = ad_stuff
|
||||
AD_Files_If_Required/TIERED = ad_stuff
|
||||
AD_Files_If_Required = $(AD_Files_If_Required/$(TYPE))
|
||||
|
||||
# Wierd argument adjustment for "gnumake -j..."
|
||||
adjust-mflags = $(GENERATED)/adjust-mflags
|
||||
MFLAGS-adjusted = -r `$(adjust-mflags) "$(MFLAGS)" "$(HOTSPOT_BUILD_JOBS)"`
|
||||
|
||||
|
||||
# default target: update lists, make vm
|
||||
# done in stages to force sequential order with parallel make
|
||||
#
|
||||
|
||||
default: vm_build_preliminaries the_vm
|
||||
@echo All done.
|
||||
|
||||
# This is an explicit dependency for the sake of parallel makes.
|
||||
vm_build_preliminaries: checks $(Cached_plat) $(AD_Files_If_Required) jvmti_stuff sa_stuff
|
||||
@# We need a null action here, so implicit rules don't get consulted.
|
||||
|
||||
$(Cached_plat): $(Plat_File)
|
||||
$(CDG) cp $(Plat_File) $(Cached_plat)
|
||||
|
||||
# make AD files as necessary
|
||||
ad_stuff: $(Cached_plat) $(adjust-mflags)
|
||||
@$(MAKE) -f adlc.make $(MFLAGS-adjusted)
|
||||
|
||||
# generate JVMTI files from the spec
|
||||
jvmti_stuff: $(Cached_plat) $(adjust-mflags)
|
||||
@$(MAKE) -f jvmti.make $(MFLAGS-adjusted)
|
||||
|
||||
# generate SA jar files and native header
|
||||
sa_stuff:
|
||||
@$(MAKE) -f sa.make $(MFLAGS-adjusted)
|
||||
|
||||
# and the VM: must use other makefile with dependencies included
|
||||
|
||||
# We have to go to great lengths to get control over the -jN argument
|
||||
# to the recursive invocation of vm.make. The problem is that gnumake
|
||||
# resets -jN to -j1 for recursive runs. (How helpful.)
|
||||
# Note that the user must specify the desired parallelism level via a
|
||||
# command-line or environment variable name HOTSPOT_BUILD_JOBS.
|
||||
$(adjust-mflags): $(GAMMADIR)/make/$(Platform_os_family)/makefiles/adjust-mflags.sh
|
||||
@+rm -f $@ $@+
|
||||
@+cat $< > $@+
|
||||
@+chmod +x $@+
|
||||
@+mv $@+ $@
|
||||
|
||||
the_vm: vm_build_preliminaries $(adjust-mflags)
|
||||
@$(UpdatePCH)
|
||||
@$(MAKE) -f vm.make $(MFLAGS-adjusted)
|
||||
|
||||
install: the_vm
|
||||
@$(MAKE) -f vm.make install
|
||||
|
||||
# next rules support "make foo.[ois]"
|
||||
|
||||
%.o %.i %.s:
|
||||
$(UpdatePCH)
|
||||
$(MAKE) -f vm.make $(MFLAGS) $@
|
||||
#$(MAKE) -f vm.make $@
|
||||
|
||||
# this should force everything to be rebuilt
|
||||
clean:
|
||||
rm -f $(GENERATED)/*.class
|
||||
$(MAKE) -f vm.make $(MFLAGS) clean
|
||||
|
||||
# just in case it doesn't, this should do it
|
||||
realclean:
|
||||
$(MAKE) -f vm.make $(MFLAGS) clean
|
||||
rm -fr $(GENERATED)
|
||||
|
||||
.PHONY: default vm_build_preliminaries
|
||||
.PHONY: lists ad_stuff jvmti_stuff sa_stuff the_vm clean realclean
|
||||
.PHONY: checks check_os_version install
|
329
hotspot/make/bsd/makefiles/vm.make
Normal file
329
hotspot/make/bsd/makefiles/vm.make
Normal file
@ -0,0 +1,329 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Rules to build JVM and related libraries, included from vm.make in the build
|
||||
# directory.
|
||||
|
||||
# Common build rules.
|
||||
MAKEFILES_DIR=$(GAMMADIR)/make/$(Platform_os_family)/makefiles
|
||||
include $(MAKEFILES_DIR)/rules.make
|
||||
include $(GAMMADIR)/make/altsrc.make
|
||||
|
||||
default: build
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# Defs
|
||||
|
||||
GENERATED = ../generated
|
||||
DEP_DIR = $(GENERATED)/dependencies
|
||||
|
||||
# reads the generated files defining the set of .o's and the .o .h dependencies
|
||||
-include $(DEP_DIR)/*.d
|
||||
|
||||
# read machine-specific adjustments (%%% should do this via buildtree.make?)
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
include $(MAKEFILES_DIR)/zeroshark.make
|
||||
else
|
||||
include $(MAKEFILES_DIR)/$(BUILDARCH).make
|
||||
endif
|
||||
|
||||
# set VPATH so make knows where to look for source files
|
||||
# Src_Dirs_V is everything in src/share/vm/*, plus the right os/*/vm and cpu/*/vm
|
||||
# The adfiles directory contains ad_<arch>.[ch]pp.
|
||||
# The jvmtifiles directory contains jvmti*.[ch]pp
|
||||
Src_Dirs_V += $(GENERATED)/adfiles $(GENERATED)/jvmtifiles
|
||||
VPATH += $(Src_Dirs_V:%=%:)
|
||||
|
||||
# set INCLUDES for C preprocessor.
|
||||
Src_Dirs_I += $(GENERATED)
|
||||
# The order is important for the precompiled headers to work.
|
||||
INCLUDES += $(PRECOMPILED_HEADER_DIR:%=-I%) $(Src_Dirs_I:%=-I%)
|
||||
|
||||
ifeq (${VERSION}, debug)
|
||||
SYMFLAG = -g
|
||||
else
|
||||
SYMFLAG =
|
||||
endif
|
||||
|
||||
# HOTSPOT_RELEASE_VERSION and HOTSPOT_BUILD_VERSION are defined
|
||||
# in $(GAMMADIR)/make/defs.make
|
||||
ifeq ($(HOTSPOT_BUILD_VERSION),)
|
||||
BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)\""
|
||||
else
|
||||
BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)-$(HOTSPOT_BUILD_VERSION)\""
|
||||
endif
|
||||
|
||||
# The following variables are defined in the generated flags.make file.
|
||||
BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\""
|
||||
JRE_VERSION = -DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\""
|
||||
HS_LIB_ARCH = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
|
||||
BUILD_TARGET = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
|
||||
BUILD_USER = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
|
||||
VM_DISTRO = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
|
||||
|
||||
CPPFLAGS = \
|
||||
${SYSDEFS} \
|
||||
${INCLUDES} \
|
||||
${BUILD_VERSION} \
|
||||
${BUILD_TARGET} \
|
||||
${BUILD_USER} \
|
||||
${HS_LIB_ARCH} \
|
||||
${JRE_VERSION} \
|
||||
${VM_DISTRO}
|
||||
|
||||
ifdef DEFAULT_LIBPATH
|
||||
CPPFLAGS += -DDEFAULT_LIBPATH="\"$(DEFAULT_LIBPATH)\""
|
||||
endif
|
||||
|
||||
# CFLAGS_WARN holds compiler options to suppress/enable warnings.
|
||||
CFLAGS += $(CFLAGS_WARN/BYFILE)
|
||||
|
||||
# Do not use C++ exception handling
|
||||
CFLAGS += $(CFLAGS/NOEX)
|
||||
|
||||
# Extra flags from gnumake's invocation or environment
|
||||
CFLAGS += $(EXTRA_CFLAGS)
|
||||
LFLAGS += $(EXTRA_CFLAGS)
|
||||
|
||||
# Don't set excutable bit on stack segment
|
||||
# the same could be done by separate execstack command
|
||||
ifneq ($(OS_VENDOR), Darwin)
|
||||
LFLAGS += -Xlinker -z -Xlinker noexecstack
|
||||
endif
|
||||
|
||||
LIBS += -lm -pthread
|
||||
|
||||
# By default, link the *.o into the library, not the executable.
|
||||
LINK_INTO$(LINK_INTO) = LIBJVM
|
||||
|
||||
JDK_LIBDIR = $(JAVA_HOME)/jre/lib/$(LIBARCH)
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# jvm_db & dtrace
|
||||
include $(MAKEFILES_DIR)/dtrace.make
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# JVM
|
||||
|
||||
JVM = jvm
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
LIBJVM = lib$(JVM).dylib
|
||||
LIBJVM_G = lib$(JVM)$(G_SUFFIX).dylib
|
||||
CFLAGS += -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE
|
||||
else
|
||||
LIBJVM = lib$(JVM).so
|
||||
LIBJVM_G = lib$(JVM)$(G_SUFFIX).so
|
||||
endif
|
||||
|
||||
SPECIAL_PATHS:=adlc c1 gc_implementation opto shark libadt
|
||||
|
||||
SOURCE_PATHS=\
|
||||
$(shell find $(HS_COMMON_SRC)/share/vm/* -type d \! \
|
||||
\( -name DUMMY $(foreach dir,$(SPECIAL_PATHS),-o -name $(dir)) \))
|
||||
SOURCE_PATHS+=$(HS_COMMON_SRC)/os/$(Platform_os_family)/vm
|
||||
SOURCE_PATHS+=$(HS_COMMON_SRC)/os/posix/vm
|
||||
SOURCE_PATHS+=$(HS_COMMON_SRC)/cpu/$(Platform_arch)/vm
|
||||
SOURCE_PATHS+=$(HS_COMMON_SRC)/os_cpu/$(Platform_os_arch)/vm
|
||||
|
||||
CORE_PATHS=$(foreach path,$(SOURCE_PATHS),$(call altsrc,$(path)) $(path))
|
||||
CORE_PATHS+=$(GENERATED)/jvmtifiles
|
||||
|
||||
COMPILER1_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/c1)
|
||||
COMPILER1_PATHS += $(HS_COMMON_SRC)/share/vm/c1
|
||||
|
||||
COMPILER2_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/opto)
|
||||
COMPILER2_PATHS += $(call altsrc,$(HS_COMMON_SRC)/share/vm/libadt)
|
||||
COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/opto
|
||||
COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/libadt
|
||||
COMPILER2_PATHS += $(GENERATED)/adfiles
|
||||
|
||||
SHARK_PATHS := $(GAMMADIR)/src/share/vm/shark
|
||||
|
||||
# Include dirs per type.
|
||||
Src_Dirs/CORE := $(CORE_PATHS)
|
||||
Src_Dirs/COMPILER1 := $(CORE_PATHS) $(COMPILER1_PATHS)
|
||||
Src_Dirs/COMPILER2 := $(CORE_PATHS) $(COMPILER2_PATHS)
|
||||
Src_Dirs/TIERED := $(CORE_PATHS) $(COMPILER1_PATHS) $(COMPILER2_PATHS)
|
||||
Src_Dirs/ZERO := $(CORE_PATHS)
|
||||
Src_Dirs/SHARK := $(CORE_PATHS) $(SHARK_PATHS)
|
||||
Src_Dirs := $(Src_Dirs/$(TYPE))
|
||||
|
||||
COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp chaitin\* c2_\* runtime_\*
|
||||
COMPILER1_SPECIFIC_FILES := c1_\*
|
||||
SHARK_SPECIFIC_FILES := shark
|
||||
ZERO_SPECIFIC_FILES := zero
|
||||
|
||||
# Always exclude these.
|
||||
Src_Files_EXCLUDE := jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
|
||||
|
||||
# Exclude per type.
|
||||
Src_Files_EXCLUDE/CORE := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
|
||||
Src_Files_EXCLUDE/COMPILER1 := $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
|
||||
Src_Files_EXCLUDE/COMPILER2 := $(COMPILER1_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES)
|
||||
Src_Files_EXCLUDE/TIERED := $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES)
|
||||
Src_Files_EXCLUDE/ZERO := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
|
||||
Src_Files_EXCLUDE/SHARK := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES)
|
||||
|
||||
Src_Files_EXCLUDE += $(Src_Files_EXCLUDE/$(TYPE))
|
||||
|
||||
# Special handling of arch model.
|
||||
ifeq ($(Platform_arch_model), x86_32)
|
||||
Src_Files_EXCLUDE += \*x86_64\*
|
||||
endif
|
||||
ifeq ($(Platform_arch_model), x86_64)
|
||||
Src_Files_EXCLUDE += \*x86_32\*
|
||||
endif
|
||||
|
||||
# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE.
|
||||
define findsrc
|
||||
$(notdir $(shell find $(1)/. ! -name . -prune \
|
||||
-a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \
|
||||
-a ! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \)))
|
||||
endef
|
||||
|
||||
Src_Files := $(foreach e,$(Src_Dirs),$(call findsrc,$(e)))
|
||||
|
||||
Obj_Files = $(sort $(addsuffix .o,$(basename $(Src_Files))))
|
||||
|
||||
JVM_OBJ_FILES = $(Obj_Files)
|
||||
|
||||
vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES))
|
||||
|
||||
mapfile : $(MAPFILE) vm.def
|
||||
rm -f $@
|
||||
awk '{ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE") \
|
||||
{ system ("cat vm.def"); } \
|
||||
else \
|
||||
{ print $$0 } \
|
||||
}' > $@ < $(MAPFILE)
|
||||
|
||||
mapfile_reorder : mapfile $(REORDERFILE)
|
||||
rm -f $@
|
||||
cat $^ > $@
|
||||
|
||||
vm.def: $(Res_Files) $(Obj_Files)
|
||||
sh $(GAMMADIR)/make/bsd/makefiles/build_vm_def.sh *.o > $@
|
||||
|
||||
STATIC_CXX = false
|
||||
|
||||
ifeq ($(LINK_INTO),AOUT)
|
||||
LIBJVM.o =
|
||||
LIBJVM_MAPFILE =
|
||||
LIBS_VM = $(LIBS)
|
||||
else
|
||||
LIBJVM.o = $(JVM_OBJ_FILES)
|
||||
LIBJVM_MAPFILE$(LDNOMAP) = mapfile_reorder
|
||||
LFLAGS_VM$(LDNOMAP) += $(MAPFLAG:FILENAME=$(LIBJVM_MAPFILE))
|
||||
LFLAGS_VM += $(SONAMEFLAG:SONAME=$(LIBJVM))
|
||||
|
||||
ifeq ($(OS_VENDOR), Darwin)
|
||||
LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/.
|
||||
LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/..
|
||||
LFLAGS_VM += -Xlinker -install_name -Xlinker @rpath/$(@F)
|
||||
endif
|
||||
|
||||
# JVM is statically linked with libgcc[_s] and libstdc++; this is needed to
|
||||
# get around library dependency and compatibility issues. Must use gcc not
|
||||
# g++ to link.
|
||||
ifeq ($(STATIC_CXX), true)
|
||||
LFLAGS_VM += $(STATIC_LIBGCC)
|
||||
LIBS_VM += $(STATIC_STDCXX)
|
||||
LINK_VM = $(LINK_LIB.c)
|
||||
else
|
||||
LINK_VM = $(LINK_LIB.CC)
|
||||
endif
|
||||
|
||||
LIBS_VM += $(LIBS)
|
||||
endif
|
||||
ifeq ($(ZERO_BUILD), true)
|
||||
LIBS_VM += $(LIBFFI_LIBS)
|
||||
endif
|
||||
ifeq ($(SHARK_BUILD), true)
|
||||
LFLAGS_VM += $(LLVM_LDFLAGS)
|
||||
LIBS_VM += $(LLVM_LIBS)
|
||||
endif
|
||||
|
||||
|
||||
# rule for building precompiled header
|
||||
$(PRECOMPILED_HEADER):
|
||||
$(QUIETLY) echo Generating precompiled header $@
|
||||
$(QUIETLY) mkdir -p $(PRECOMPILED_HEADER_DIR)
|
||||
$(QUIETLY) $(COMPILE.CC) $(DEPFLAGS) -x c++-header $(PRECOMPILED_HEADER_SRC) -o $@ $(COMPILE_DONE)
|
||||
|
||||
# making the library:
|
||||
|
||||
ifneq ($(JVM_BASE_ADDR),)
|
||||
# By default shared library is linked at base address == 0. Modify the
|
||||
# linker script if JVM prefers a different base location. It can also be
|
||||
# implemented with 'prelink -r'. But 'prelink' is not (yet) available on
|
||||
# our build platform (AS-2.1).
|
||||
LD_SCRIPT = libjvm.so.lds
|
||||
$(LD_SCRIPT): $(LIBJVM_MAPFILE)
|
||||
$(QUIETLY) { \
|
||||
rm -rf $@; \
|
||||
$(LINK_VM) -Wl,--verbose $(LFLAGS_VM) 2>&1 | \
|
||||
sed -e '/^======/,/^======/!d' \
|
||||
-e '/^======/d' \
|
||||
-e 's/0\( + SIZEOF_HEADERS\)/$(JVM_BASE_ADDR)\1/' \
|
||||
> $@; \
|
||||
}
|
||||
LD_SCRIPT_FLAG = -Wl,-T,$(LD_SCRIPT)
|
||||
endif
|
||||
|
||||
$(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT)
|
||||
$(QUIETLY) { \
|
||||
echo Linking vm...; \
|
||||
$(LINK_LIB.CC/PRE_HOOK) \
|
||||
$(LINK_VM) $(LD_SCRIPT_FLAG) \
|
||||
$(LFLAGS_VM) -o $@ $(LIBJVM.o) $(LIBS_VM); \
|
||||
$(LINK_LIB.CC/POST_HOOK) \
|
||||
rm -f $@.1; ln -s $@ $@.1; \
|
||||
[ -f $(LIBJVM_G) ] || { ln -s $@ $(LIBJVM_G); ln -s $@.1 $(LIBJVM_G).1; }; \
|
||||
}
|
||||
|
||||
DEST_JVM = $(JDK_LIBDIR)/$(VM_SUBDIR)/$(LIBJVM)
|
||||
|
||||
install_jvm: $(LIBJVM)
|
||||
@echo "Copying $(LIBJVM) to $(DEST_JVM)"
|
||||
$(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done"
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
# Other files
|
||||
|
||||
# Gamma launcher
|
||||
include $(MAKEFILES_DIR)/launcher.make
|
||||
|
||||
# Signal interposition library
|
||||
include $(MAKEFILES_DIR)/jsig.make
|
||||
|
||||
# Serviceability agent
|
||||
include $(MAKEFILES_DIR)/saproc.make
|
||||
|
||||
#----------------------------------------------------------------------
|
||||
|
||||
build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC)
|
||||
|
||||
install: install_jvm install_jsig install_saproc
|
||||
|
||||
.PHONY: default build install install_jvm
|
32
hotspot/make/bsd/makefiles/zero.make
Normal file
32
hotspot/make/bsd/makefiles/zero.make
Normal file
@ -0,0 +1,32 @@
|
||||
#
|
||||
# Copyright (c) 1999, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Setup for Zero (non-Shark) version of VM
|
||||
|
||||
# Select which files to use (in top.make)
|
||||
TYPE = ZERO
|
||||
|
||||
# Install libjvm.so, etc in in server directory.
|
||||
VM_SUBDIR = server
|
62
hotspot/make/bsd/makefiles/zeroshark.make
Normal file
62
hotspot/make/bsd/makefiles/zeroshark.make
Normal file
@ -0,0 +1,62 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright 2007, 2008 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# Setup common to Zero (non-Shark) and Shark versions of VM
|
||||
|
||||
# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrig.o = $(OPT_CFLAGS/NOOPT)
|
||||
# The copied fdlibm routines in sharedRuntimeTrans.o must not be optimized
|
||||
OPT_CFLAGS/sharedRuntimeTrans.o = $(OPT_CFLAGS/NOOPT)
|
||||
|
||||
# Specify that the CPU is little endian, if necessary
|
||||
ifeq ($(ZERO_ENDIANNESS), little)
|
||||
CFLAGS += -DVM_LITTLE_ENDIAN
|
||||
endif
|
||||
|
||||
# Specify that the CPU is 64 bit, if necessary
|
||||
ifeq ($(ARCH_DATA_MODEL), 64)
|
||||
CFLAGS += -D_LP64=1
|
||||
endif
|
||||
|
||||
# Specify the path to the FFI headers
|
||||
ifdef ALT_PACKAGE_PATH
|
||||
PACKAGE_PATH = $(ALT_PACKAGE_PATH)
|
||||
else
|
||||
ifeq ($(OS_VENDOR),Apple)
|
||||
PACKAGE_PATH = /opt/local
|
||||
else
|
||||
ifeq ($(OS_VENDOR),NetBSD)
|
||||
PACKAGE_PATH = /usr/pkg
|
||||
LIBS += -Wl,-R${PACKAGE_PATH}/lib
|
||||
else
|
||||
PACKAGE_PATH = /usr/local
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
CFLAGS += -I$(PACKAGE_PATH)/include
|
||||
LIBS += -L$(PACKAGE_PATH)/lib -lffi
|
||||
|
||||
OPT_CFLAGS/compactingPermGenGen.o = -O1
|
15
hotspot/make/bsd/platform_amd64
Normal file
15
hotspot/make/bsd/platform_amd64
Normal file
@ -0,0 +1,15 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = x86
|
||||
|
||||
arch_model = x86_64
|
||||
|
||||
os_arch = bsd_x86
|
||||
|
||||
os_arch_model = bsd_x86_64
|
||||
|
||||
lib_arch = amd64
|
||||
|
||||
compiler = gcc
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DAMD64
|
17
hotspot/make/bsd/platform_amd64.suncc
Normal file
17
hotspot/make/bsd/platform_amd64.suncc
Normal file
@ -0,0 +1,17 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = x86
|
||||
|
||||
arch_model = x86_64
|
||||
|
||||
os_arch = bsd_x86
|
||||
|
||||
os_arch_model = bsd_x86_64
|
||||
|
||||
lib_arch = amd64
|
||||
|
||||
compiler = sparcWorks
|
||||
|
||||
gnu_dis_arch = amd64
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -DSPARC_WORKS -D_GNU_SOURCE -DAMD64
|
15
hotspot/make/bsd/platform_i486
Normal file
15
hotspot/make/bsd/platform_i486
Normal file
@ -0,0 +1,15 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = x86
|
||||
|
||||
arch_model = x86_32
|
||||
|
||||
os_arch = bsd_x86
|
||||
|
||||
os_arch_model = bsd_x86_32
|
||||
|
||||
lib_arch = i386
|
||||
|
||||
compiler = gcc
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DIA32
|
17
hotspot/make/bsd/platform_i486.suncc
Normal file
17
hotspot/make/bsd/platform_i486.suncc
Normal file
@ -0,0 +1,17 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = x86
|
||||
|
||||
arch_model = x86_32
|
||||
|
||||
os_arch = bsd_x86
|
||||
|
||||
os_arch_model = bsd_x86_32
|
||||
|
||||
lib_arch = i386
|
||||
|
||||
compiler = sparcWorks
|
||||
|
||||
gnu_dis_arch = i386
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -DSPARC_WORKS -D_GNU_SOURCE -DIA32
|
15
hotspot/make/bsd/platform_ia64
Normal file
15
hotspot/make/bsd/platform_ia64
Normal file
@ -0,0 +1,15 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = ia64
|
||||
|
||||
os_arch = bsd_ia64
|
||||
|
||||
lib_arch = ia64
|
||||
|
||||
compiler = gcc
|
||||
|
||||
gnu_dis_arch = ia64
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DIA64 -DCC_INTERP
|
||||
|
||||
mark_style = alignment
|
15
hotspot/make/bsd/platform_sparc
Normal file
15
hotspot/make/bsd/platform_sparc
Normal file
@ -0,0 +1,15 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = sparc
|
||||
|
||||
arch_model = sparc
|
||||
|
||||
os_arch = bsd_sparc
|
||||
|
||||
os_arch_model = bsd_sparc
|
||||
|
||||
lib_arch = sparc
|
||||
|
||||
compiler = gcc
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DSPARC
|
15
hotspot/make/bsd/platform_sparcv9
Normal file
15
hotspot/make/bsd/platform_sparcv9
Normal file
@ -0,0 +1,15 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = sparc
|
||||
|
||||
arch_model = sparc
|
||||
|
||||
os_arch = bsd_sparc
|
||||
|
||||
os_arch_model = bsd_sparc
|
||||
|
||||
lib_arch = sparcv9
|
||||
|
||||
compiler = gcc
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DSPARC
|
17
hotspot/make/bsd/platform_zero.in
Normal file
17
hotspot/make/bsd/platform_zero.in
Normal file
@ -0,0 +1,17 @@
|
||||
os_family = bsd
|
||||
|
||||
arch = zero
|
||||
|
||||
arch_model = zero
|
||||
|
||||
os_arch = bsd_zero
|
||||
|
||||
os_arch_model = bsd_zero
|
||||
|
||||
lib_arch = zero
|
||||
|
||||
compiler = gcc
|
||||
|
||||
gnu_dis_arch = zero
|
||||
|
||||
sysdefs = -D_ALLBSD_SOURCE -D_GNU_SOURCE -DCC_INTERP -DZERO -D@ZERO_ARCHDEF@ -DZERO_LIBARCH=\"@ZERO_LIBARCH@\"
|
@ -63,7 +63,7 @@ CS_PRUNE_GENERATED = -o -name '${OSNAME}_*_core' -o \
|
||||
# space-separated list of identifiers to include only those systems.
|
||||
ifdef CS_OS
|
||||
CS_PRUNE_OS = $(patsubst %,-o -name '*%*',\
|
||||
$(filter-out ${CS_OS},linux macos solaris windows))
|
||||
$(filter-out ${CS_OS},bsd linux macos solaris windows))
|
||||
endif
|
||||
|
||||
# CPU-specific files for all processors are included by default. Set CS_CPU
|
||||
|
@ -118,13 +118,23 @@ endif
|
||||
# Windows should have OS predefined
|
||||
ifeq ($(OS),)
|
||||
OS := $(shell uname -s)
|
||||
ifneq ($(findstring BSD,$(OS)),)
|
||||
OS=bsd
|
||||
endif
|
||||
ifeq ($(OS), Darwin)
|
||||
OS=bsd
|
||||
endif
|
||||
HOST := $(shell uname -n)
|
||||
endif
|
||||
|
||||
# If not SunOS and not Linux, assume Windows
|
||||
# If not SunOS, not Linux and not BSD, assume Windows
|
||||
ifneq ($(OS), Linux)
|
||||
ifneq ($(OS), SunOS)
|
||||
OSNAME=windows
|
||||
ifneq ($(OS), bsd)
|
||||
OSNAME=windows
|
||||
else
|
||||
OSNAME=bsd
|
||||
endif
|
||||
else
|
||||
OSNAME=solaris
|
||||
endif
|
||||
|
@ -1,6 +1,25 @@
|
||||
#
|
||||
# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
Obj_Files += linux_arm.o
|
||||
|
@ -116,33 +116,36 @@ endif
|
||||
|
||||
JDK_INCLUDE_SUBDIR=linux
|
||||
|
||||
# Library suffix
|
||||
LIBRARY_SUFFIX=so
|
||||
|
||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
||||
VM_DEBUG=jvmg
|
||||
|
||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||
|
||||
# client and server subdirectories have symbolic links to ../libjsig.so
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.so
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX)
|
||||
EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
|
||||
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
|
||||
|
||||
ifndef BUILD_CLIENT_ONLY
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
|
||||
ifneq ($(ZERO_BUILD), true)
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Serviceability Binaries
|
||||
# No SA Support for PPC, IA64, ARM or zero
|
||||
ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so \
|
||||
ADD_SA_BINARIES/x86 = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so \
|
||||
ADD_SA_BINARIES/sparc = $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX) \
|
||||
$(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
ADD_SA_BINARIES/ppc =
|
||||
ADD_SA_BINARIES/ia64 =
|
||||
|
@ -1,6 +1,25 @@
|
||||
#
|
||||
# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||
# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
|
||||
|
@ -51,6 +51,9 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/code/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/compiler/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/x86/*.java \
|
||||
@ -94,6 +97,9 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/prims/*.java
|
||||
AGENT_FILES2 = \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/ia64/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux/*.java \
|
||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
||||
|
@ -61,35 +61,38 @@ endif
|
||||
|
||||
JDK_INCLUDE_SUBDIR=solaris
|
||||
|
||||
# Library suffix
|
||||
LIBRARY_SUFFIX=so
|
||||
|
||||
# FIXUP: The subdirectory for a debug build is NOT the same on all platforms
|
||||
VM_DEBUG=jvmg
|
||||
|
||||
EXPORT_LIST += $(EXPORT_DOCS_DIR)/platform/jvmti/jvmti.html
|
||||
|
||||
# client and server subdirectories have symbolic links to ../libjsig.so
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.so
|
||||
# client and server subdirectories have symbolic links to ../libjsig.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libjsig.$(LIBRARY_SUFFIX)
|
||||
|
||||
EXPORT_SERVER_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/server
|
||||
EXPORT_CLIENT_DIR = $(EXPORT_JRE_LIB_ARCH_DIR)/client
|
||||
|
||||
ifneq ($(BUILD_CLIENT_ONLY),true)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_db.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_db.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_dtrace.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_db.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_dtrace.so
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_db.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_db.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/64/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
||||
ifneq ($(BUILD_CLIENT_ONLY), true)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.so
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_db.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/64/libjvm_dtrace.$(LIBRARY_SUFFIX)
|
||||
endif
|
||||
endif
|
||||
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.so
|
||||
EXPORT_LIST += $(EXPORT_JRE_LIB_ARCH_DIR)/libsaproc.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
|
@ -109,6 +109,9 @@ endif
|
||||
|
||||
JDK_INCLUDE_SUBDIR=win32
|
||||
|
||||
# Library suffix
|
||||
LIBRARY_SUFFIX=dll
|
||||
|
||||
# HOTSPOT_RELEASE_VERSION and HOTSPOT_BUILD_VERSION are defined
|
||||
# and added to MAKE_ARGS list in $(GAMMADIR)/make/defs.make.
|
||||
|
||||
@ -175,24 +178,24 @@ EXPORT_CLIENT_DIR = $(EXPORT_JRE_BIN_DIR)/client
|
||||
EXPORT_KERNEL_DIR = $(EXPORT_JRE_BIN_DIR)/kernel
|
||||
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/jvm.dll
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/jvm.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/jvm.pdb
|
||||
EXPORT_LIST += $(EXPORT_SERVER_DIR)/jvm.map
|
||||
EXPORT_LIST += $(EXPORT_LIB_DIR)/jvm.lib
|
||||
ifeq ($(ARCH_DATA_MODEL), 32)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/jvm.dll
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/jvm.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/jvm.pdb
|
||||
EXPORT_LIST += $(EXPORT_CLIENT_DIR)/jvm.map
|
||||
# kernel vm
|
||||
EXPORT_LIST += $(EXPORT_KERNEL_DIR)/Xusage.txt
|
||||
EXPORT_LIST += $(EXPORT_KERNEL_DIR)/jvm.dll
|
||||
EXPORT_LIST += $(EXPORT_KERNEL_DIR)/jvm.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_KERNEL_DIR)/jvm.pdb
|
||||
EXPORT_LIST += $(EXPORT_KERNEL_DIR)/jvm.map
|
||||
endif
|
||||
|
||||
ifeq ($(BUILD_WIN_SA), 1)
|
||||
EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.dll
|
||||
EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.$(LIBRARY_SUFFIX)
|
||||
EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.pdb
|
||||
EXPORT_LIST += $(EXPORT_JRE_BIN_DIR)/sawindbg.map
|
||||
EXPORT_LIST += $(EXPORT_LIB_DIR)/sa-jdi.jar
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user