diff options
Diffstat (limited to 'libjava/gnu/gcj')
-rw-r--r-- | libjava/gnu/gcj/runtime/MethodRef.java | 25 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/StackTrace.java | 167 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natNameFinder.cc | 157 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natStackTrace.cc | 241 |
4 files changed, 0 insertions, 590 deletions
diff --git a/libjava/gnu/gcj/runtime/MethodRef.java b/libjava/gnu/gcj/runtime/MethodRef.java deleted file mode 100644 index f157461..0000000 --- a/libjava/gnu/gcj/runtime/MethodRef.java +++ /dev/null @@ -1,25 +0,0 @@ -// gnu.gcj.runtime.MethodRef -- used by StackTrace. - -/* Copyright (C) 2002 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -package gnu.gcj.runtime; - -import gnu.gcj.RawData; - -class MethodRef -{ - MethodRef(RawData /* Actually _Jv_Method */ m, Class k) - { - klass = k; - method = m; - } - - public RawData method; // Actually a raw pointer to _Jv_Method - public Class klass; -} diff --git a/libjava/gnu/gcj/runtime/StackTrace.java b/libjava/gnu/gcj/runtime/StackTrace.java deleted file mode 100644 index c9f5a1a..0000000 --- a/libjava/gnu/gcj/runtime/StackTrace.java +++ /dev/null @@ -1,167 +0,0 @@ -/* gnu.gcj.runtime.StackTrace -- VM support methods for walking the - stack. - Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc. - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package gnu.gcj.runtime; - -import gnu.gcj.RawData; -import java.util.TreeMap; -import java.util.IdentityHashMap; -import java.util.SortedMap; -import gnu.gcj.runtime.NameFinder; -import java.util.NoSuchElementException; - -/** - * VM dependent state and support methods for walking the stack. - * <p> - * This is the version used by libgcj (http://gcc.gnu.org/java/). - * - * @author Mark Wielaard (mark@klomp.org) - * @author Andrew Haley (aph@redhat.com) - */ -public final class StackTrace -{ - /** - * Fill in the stack trace with the top n frames on current - * execution stack. Can return null if the VM does not support - * capturing the VM execution state. - * - * @see Throwable#fillInStackTrace() - */ - public StackTrace(int n) - { - fillInStackTrace(n, 1); - } - - /** - * Fill in the stack trace with state of the entire execution stack, - * starting from frame <code>offset</code>. Can return null if the - * VM does not support capturing the VM execution state. - * - * This can be very expensive. If you only want part of the stack, - * see <code>Throwable.fillInStackTrace(int)</code> - * - * @see Throwable#fillInStackTrace() - */ - public StackTrace() - { - int n = 64; - - do - { - n *= 4; - fillInStackTrace(n, 1); - } - while (len >= n); - } - - /** - * Return the class containing the execution point represented by - * the Nth frame down the stack. The zeroth frame represents the - * top of the stack, which is the method that called classAt(). - * - * If the Nth frame down the stack was not create by a method - * invocation, return null. - * - * It is not necessary to call <code>fillInStackTrace()</code> with - * a size greater than N before calling this method; if the current - * stack trace is insufficiently large, it will be expanded as - * required. This requires some caution if - * <code>fillInStackTrace()</code> is called from a different - * invocation to the one that calls <code>classAt()</code>. - * classAt() will not call <code>fillInStackTrace()</code> unless N - * is greater than the current length. - * - */ - public native Class classAt(int n); - - /** - * Return the name of the method containing the execution point - * represented by the Nth frame down the stack. The zeroth frame - * represents the top of the stack, which is the method that called - * classAt(). - * - * If the Nth frame down the stack was not create by a method - * invocation, return null. - * - * It is not necessary to call <code>fillInStackTrace()</code> with - * a size greater than N before calling this method; if the current - * stack trace is insufficiently large, it will be expanded as - * required. This requires some caution if - * <code>fillInStackTrace()</code> is called from a different - * invocation to the one that calls <code>classAt()</code>. - * classAt() will not call <code>fillInStackTrace()</code> unless N - * is greater than the current length. - * - */ - public native String methodAt(int n); - - /** - * Return the length of this stack trace. - * - */ - public int length () - { - return len; - } - - public static native Class getClass(RawData ip); - - private static native void update(); - private static MethodRef methodAtAddress(RawData addr) - { - update(); - synchronized (map) - { - return (MethodRef) map.get (addr); - } - } - - gnu.gcj.RawData stackTraceAddrs() - { - return addrs; - } - - private native void fillInStackTrace(int n, int offset); - protected native void finalize(); - - private static native MethodRef getCompiledMethodRef(RawData addr); - private static IdentityHashMap map = new IdentityHashMap(); - - private gnu.gcj.RawData addrs; - private int len; -} diff --git a/libjava/gnu/gcj/runtime/natNameFinder.cc b/libjava/gnu/gcj/runtime/natNameFinder.cc deleted file mode 100644 index d688884..0000000 --- a/libjava/gnu/gcj/runtime/natNameFinder.cc +++ /dev/null @@ -1,157 +0,0 @@ -// natNameFinder.cc - native helper methods for NameFinder.java - -/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -/** - * @author Mark Wielaard (mark@klomp.org) - * Based on the old name-finder.cc by Andrew Haley <aph@cygnus.com>. - */ - -#include <config.h> - -#include <string.h> - -#include <gcj/cni.h> -#include <jvm.h> -#include <java/lang/String.h> -#include <java/lang/StackTraceElement.h> -#include <java/lang/StringBuffer.h> -#include <java-interp.h> - -#include <gnu/gcj/runtime/NameFinder.h> - -#ifdef HAVE_DLFCN_H -#include <dlfcn.h> -#endif - -// On some systems, a prefix is attached to a method name before -// it is exported as a label. The GCC preprocessor predefines -// this prefix as the macro __USER_LABEL_PREFIX__ which expands to -// a string (not string constant) representing the prefix, if any. -#undef LABEL_PREFIX -#ifdef __USER_LABEL_PREFIX__ - -#define USER_LABEL_PREFIX_STRING_0(s) #s -#define USER_LABEL_PREFIX_STRING(s) USER_LABEL_PREFIX_STRING_0(s) - -#define LABEL_PREFIX USER_LABEL_PREFIX_STRING(__USER_LABEL_PREFIX__) - -#else /* __USER_LABEL_PREFIX__ */ - -#define LABEL_PREFIX "" - -#endif /* ! __USER_LABEL_PREFIX__ */ - -java::lang::StackTraceElement* -gnu::gcj::runtime::NameFinder::newElement (java::lang::String* fileName, - jint lineNumber, - java::lang::String* className, - java::lang::String* methName, - jboolean isNative) -{ - return new java::lang::StackTraceElement( fileName, lineNumber, - className, methName, isNative); -} - -java::lang::String* -gnu::gcj::runtime::NameFinder::getExternalLabel (java::lang::String* name) -{ - jsize nameLen = JvGetStringUTFLength (name); - jsize pfxLen = strlen (LABEL_PREFIX); - char *newName = (char *) JvMalloc (pfxLen + nameLen + 1); - *(newName + 0) = '\0'; - strcpy (newName, LABEL_PREFIX); - JvGetStringUTFRegion (name, 0, name->length(), newName + pfxLen); - *(newName + pfxLen + nameLen) = '\0'; - return JvNewStringLatin1 (newName); -} - -java::lang::String* -gnu::gcj::runtime::NameFinder::getExecutable (void) -{ - return JvNewStringLatin1 (_Jv_ThisExecutable ()); -} - -java::lang::String* -gnu::gcj::runtime::NameFinder::getAddrAsString(RawData* addrs, jint n) -{ - _Jv_frame_info *p = (_Jv_frame_info *) addrs; - typedef unsigned word_t __attribute ((mode (word))); - word_t w = (word_t) p[n].addr; - int digits = sizeof (void *) * 2; - char hex[digits+5]; - - strcpy (hex, "0x"); - for (int i = digits - 1; i >= 0; i--) - { - int digit = w % 16; - - w /= 16; - hex[i+2] = digit > 9 ? 'a' + digit - 10 : '0' + digit; - } - hex [digits+2] = 0; - - return JvNewStringLatin1(hex); -} - -java::lang::StackTraceElement* -gnu::gcj::runtime::NameFinder::dladdrLookup(RawData* addrs, jint n) -{ -#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR) - extern char **_Jv_argv; - char name[1024]; - char file_name[1024]; - _Jv_frame_info *stack = (_Jv_frame_info *) addrs; - void* p = stack[n].addr; - Dl_info dl_info; - - if (dladdr (p, &dl_info)) - { - if (dl_info.dli_fname) - strncpy (file_name, dl_info.dli_fname, sizeof file_name); - if (dl_info.dli_sname) - strncpy (name, dl_info.dli_sname, sizeof name); - - /* Don't trust dladdr() if the address is from the main program. */ - if (dl_info.dli_fname != NULL - && dl_info.dli_sname != NULL - && (_Jv_argv == NULL || strcmp (file_name, _Jv_argv[0]) != 0)) - return createStackTraceElement (JvNewStringLatin1 (name), - JvNewStringLatin1 (file_name)); - } -#endif - return NULL; -} - -java::lang::StackTraceElement * -gnu::gcj::runtime::NameFinder::lookupInterp(RawData* addrs, jint n) -{ -#ifdef INTERPRETER - _Jv_frame_info *stack = (_Jv_frame_info *) addrs; - if (stack[n].interp == NULL) - return NULL; - - _Jv_InterpMethod *meth - = reinterpret_cast<_Jv_InterpMethod *> (stack[n].interp); - java::lang::StringBuffer *sb = new java::lang::StringBuffer(); - sb->append(_Jv_NewStringUtf8Const(meth->self->name)); - sb->append(_Jv_NewStringUtf8Const(meth->self->signature)); - // FIXME: source file name and line number can be found from - // bytecode debug information. But currently we don't keep that - // around. - // FIXME: is using the defining class correct here? - java::lang::String *className = meth->defining_class->getName(); - java::lang::String *methodName - = demangleInterpreterMethod(sb->toString(), className); - return new java::lang::StackTraceElement(NULL, -1, - className, methodName, false); -#else // INTERPRETER - return NULL; -#endif // INTERPRETER -} diff --git a/libjava/gnu/gcj/runtime/natStackTrace.cc b/libjava/gnu/gcj/runtime/natStackTrace.cc deleted file mode 100644 index d9f3355..0000000 --- a/libjava/gnu/gcj/runtime/natStackTrace.cc +++ /dev/null @@ -1,241 +0,0 @@ -// natStackTrace.cc - native helper methods for Throwable - -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -/** - * @author Andrew Haley <aph@cygnus.com> - * @author Mark Wielaard <mark@klomp.org> - * - * Native helper methods for VM specific Throwable support. - */ - -#include <config.h> -#include <platform.h> - -#include <string.h> - -#include <jvm.h> -#include <gcj/cni.h> -#include <gnu/gcj/RawData.h> -#include <java/lang/Object.h> -#include <java-threads.h> -#include <gnu/gcj/runtime/MethodRef.h> -#include <gnu/gcj/runtime/StackTrace.h> -#include <java/lang/Thread.h> -#include <java-interp.h> -#include <java/util/IdentityHashMap.h> -#include <java/lang/ArrayIndexOutOfBoundsException.h> - -#include <sys/types.h> - -#include <stdlib.h> - -#include <unistd.h> - -#ifdef HAVE_EXECINFO_H -#include <execinfo.h> -#endif - -#include <unwind.h> - - -#ifdef INTERPRETER -extern "C" void *_Unwind_FindEnclosingFunction (void *pc) - __attribute__((pure)); -#endif // INTERPRETER - -// Fill in this stack trace with MAXLEN elements starting at offset. -void -gnu::gcj::runtime::StackTrace::fillInStackTrace (jint maxlen, jint offset) -{ -#ifdef HAVE_BACKTRACE - offset += 1; - void *_p[maxlen + offset]; - len = backtrace (_p, maxlen + offset) - offset; - void **p = _p + offset; - _Jv_frame_info *frame; - if (len > 0) - { -#ifdef INTERPRETER - extern void *const _Jv_StartOfInterpreter; - extern void * _Jv_EndOfInterpreter; - - java::lang::Thread *thread = java::lang::Thread::currentThread(); - _Jv_MethodChain *interp_frame - = (thread ? reinterpret_cast<_Jv_MethodChain *> (thread->interp_frame) - : NULL); -#endif // INTERPRETER - - frame = (_Jv_frame_info *) _Jv_Malloc (len * sizeof (_Jv_frame_info)); - for (int n = 0; n < len; n++) - { - void *pc = p[n]; - frame[n].addr = pc; - -#ifdef INTERPRETER - frame[n].interp = 0; - - // If _Jv_StartOfInterpreter is NULL either we've never - // entered the intepreter or _Unwind_FindEnclosingFunction - // is broken. - if (__builtin_expect (_Jv_StartOfInterpreter != NULL, false)) - { - // _Jv_StartOfInterpreter marks the very first - // instruction in the interpreter, but - // _Jv_EndOfInterpreter is an upper bound. If PC is - // less than _Jv_EndOfInterpreter it might be in the - // interpreter: we call _Unwind_FindEnclosingFunction to - // find out. - if (pc >= _Jv_StartOfInterpreter - && (pc < _Jv_EndOfInterpreter - || _Jv_EndOfInterpreter == NULL)) - { - if (_Unwind_FindEnclosingFunction (pc) - == _Jv_StartOfInterpreter) - { - frame[n].interp = (void *) interp_frame->self; - interp_frame = interp_frame->next; - } - else - { - // We've found an address that we know is not within - // the interpreter. We use that to refine our upper - // bound on where the interpreter ends. - _Jv_EndOfInterpreter = pc; - } - } - } -#endif // INTERPRETER - - } - } - else - frame = NULL; - - addrs = reinterpret_cast<gnu::gcj::RawData *> (frame); -#else // HAVE_BACKTRACE - (void)maxlen; - (void)offset; -#endif // HAVE_BACKTRACE -} - -/* Obtain the next power-of-2 of some integer. */ -static inline jint -nextpowerof2 (jint n) -{ - n |= (n >> 1); - n |= (n >> 2); - n |= (n >> 4); - n |= (n >> 8); - n |= (n >> 16); - return n+1; -} - -#define GET_FRAME(N) \ -({ \ - if ((N) >= len) \ - fillInStackTrace (nextpowerof2 (N), 1); \ - if ((N) < 0 || (N) >= len) \ - throw new ::java::lang::ArrayIndexOutOfBoundsException (); \ - \ - _Jv_frame_info *frame = (_Jv_frame_info *)addrs; \ - &frame[N]; \ -}) - -gnu::gcj::runtime::MethodRef * -gnu::gcj::runtime::StackTrace::getCompiledMethodRef (gnu::gcj::RawData *addr) -{ - void *p = _Unwind_FindEnclosingFunction (addr); - return gnu::gcj::runtime::StackTrace - ::methodAtAddress ((gnu::gcj::RawData *)p); -} - -java::lang::Class * -gnu::gcj::runtime::StackTrace::getClass (gnu::gcj::RawData *p) -{ - gnu::gcj::runtime::MethodRef *ref = getCompiledMethodRef (p); - if (ref) - return ref->klass; - else - return NULL; -} - -java::lang::Class * -gnu::gcj::runtime::StackTrace::classAt (jint n) -{ - _Jv_frame_info *frame = GET_FRAME (n); - -#ifdef INTERPRETER - if (frame->interp) - { - _Jv_InterpMethod *meth - = reinterpret_cast<_Jv_InterpMethod *> (frame->interp); - return meth->defining_class; - } -#endif // INTERPRETER - - return getClass ((gnu::gcj::RawData *)frame->addr); -} - -java::lang::String* -gnu::gcj::runtime::StackTrace::methodAt (jint n) -{ - _Jv_frame_info *frame = GET_FRAME (n); - _Jv_Method *meth = NULL; - -#ifdef INTERPRETER - if (frame->interp) - { - meth - = reinterpret_cast<_Jv_InterpMethod *> (frame->interp) - ->get_method(); - } -#endif // INTERPRETER - - if (! meth) - { - gnu::gcj::runtime::MethodRef *ref - = getCompiledMethodRef ((gnu::gcj::RawData *)frame->addr); - if (ref) - meth = (_Jv_Method *)ref->method; - } - - return meth - ? _Jv_NewStringUtf8Const (meth->name) - : NULL ; -} - -void -gnu::gcj::runtime::StackTrace::update(void) -{ - jclass klass; - - while ((klass = _Jv_PopClass ())) - { - for (int i=0; i<klass->method_count; i++) - { - JvSynchronize sync (map); - _Jv_Method *meth = &(klass->methods[i]); - if (meth->ncode) // i.e. if p is not abstract - { - gnu::gcj::runtime::MethodRef *ref - = new gnu::gcj::runtime::MethodRef - ((gnu::gcj::RawData *)meth, klass); - map->put ((java::lang::Object*)(meth->ncode), ref); - } - } - } -} - -void -gnu::gcj::runtime::StackTrace::finalize(void) -{ - if (addrs != NULL) - _Jv_Free (addrs); -} |