diff options
author | Andrew Haley <aph@gcc.gnu.org> | 2003-03-10 19:45:30 +0000 |
---|---|---|
committer | Andrew Haley <aph@gcc.gnu.org> | 2003-03-10 19:45:30 +0000 |
commit | c068c63834776a4ee7cc563b4713fc867d11b5a5 (patch) | |
tree | a4c3279fd9e6344dedbfac2337937e049b960715 /libjava/gnu/gcj/runtime | |
parent | 630287af48fcf25759f9e96d0ef39db90b5fa3af (diff) | |
download | gcc-c068c63834776a4ee7cc563b4713fc867d11b5a5.zip gcc-c068c63834776a4ee7cc563b4713fc867d11b5a5.tar.gz gcc-c068c63834776a4ee7cc563b4713fc867d11b5a5.tar.bz2 |
[multiple changes]
2003-03-10 2003-02-27 Mohan Embar <gnustuff@thisiscool.com>
* include/jvm.h: removed declaration of _Jv_ThisExecutable()
setter; made return value of getter const char* instead of char*
* prims.cc: removed all references to _Jv_ThisExecutable().
These are in the platform-specific sections now.
* posix.cc: define platform-specific _Jv_ThisExecutable().
Handle DISABLE_MAIN_ARGS and HAVE_PROC_SELF_EXE cases
* win32.cc: define platform-specific _Jv_ThisExecutable()
using GetModuleFilename()
* java/lang/natRuntime.cc: set gnu.gcj.progname property
to argv[0] instead of _Jv_ThisExecutable()
2003-03-10 Ranjit Mathew <rmathew@hotmail.com>
* gnu/gcj/runtime/NameFinder.java (usingAddr2name): New flag
that is set if we are using addr2name.awk instead of addr2line.
(NameFinder): Set usingAddr2name if using addr2name.awk.
(getExternalLabel): New native method to convert a method
name to an external label.
(lookup): Convert name given by addr2line to an external label
before demangling.
* gnu/gcj/runtime/natNameFinder.cc (LABEL_PREFIX): New string
constant representing the prefix attached to method names to
convert them to an external label.
(gnu::gcj::runtime::NameFinder::getExternalLabel): Define
using LABEL_PREFIX.
From-SVN: r64111
Diffstat (limited to 'libjava/gnu/gcj/runtime')
-rw-r--r-- | libjava/gnu/gcj/runtime/NameFinder.java | 20 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natNameFinder.cc | 33 |
2 files changed, 53 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/runtime/NameFinder.java b/libjava/gnu/gcj/runtime/NameFinder.java index 4089411..19820c1 100644 --- a/libjava/gnu/gcj/runtime/NameFinder.java +++ b/libjava/gnu/gcj/runtime/NameFinder.java @@ -103,6 +103,11 @@ public class NameFinder private BufferedReader addr2lineIn; /** + * Flag set if using addr2name.awk instead of addr2line from binutils. + */ + private boolean usingAddr2name = false; + + /** * Creates a new NameFinder. Call close to get rid of any resources * created while using the <code>lookup</code> methods. */ @@ -142,6 +147,7 @@ public class NameFinder { String[] exec = new String[] {"addr2name.awk", executable}; addr2line = runtime.exec(exec); + usingAddr2name = true; } catch (IOException ioe2) { addr2line = null; } } @@ -181,6 +187,11 @@ public class NameFinder native private String getAddrAsString(RawData addrs, int n); /** + * Returns the label that is exported for the given method name. + */ + native private String getExternalLabel(String name); + + /** * If nth element of stack is an interpreted frame, return the * element representing the method being interpreted. */ @@ -212,6 +223,15 @@ public class NameFinder addr2lineOut.flush(); name = addr2lineIn.readLine(); file = addr2lineIn.readLine(); + + // addr2line uses symbolic debugging information instead + // of the actually exported labels as addr2name.awk does. + // This name might need some modification, depending on + // the system, to make it a label like that returned + // by addr2name.awk or dladdr. + if (! usingAddr2name) + if (name != null && ! "??".equals (name)) + name = getExternalLabel (name); } catch (IOException ioe) { addr2line = null; } } diff --git a/libjava/gnu/gcj/runtime/natNameFinder.cc b/libjava/gnu/gcj/runtime/natNameFinder.cc index 29687cb..6605e38 100644 --- a/libjava/gnu/gcj/runtime/natNameFinder.cc +++ b/libjava/gnu/gcj/runtime/natNameFinder.cc @@ -15,6 +15,8 @@ details. */ #include <config.h> +#include <string.h> + #include <gcj/cni.h> #include <jvm.h> #include <java/lang/String.h> @@ -28,6 +30,37 @@ details. */ #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::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, nameLen, newName + pfxLen); + *(newName + pfxLen + nameLen) = '\0'; + return JvNewStringLatin1 (newName); +} + java::lang::String* gnu::gcj::runtime::NameFinder::getExecutable (void) { |