summaryrefslogtreecommitdiff
path: root/libjava/posix.cc
diff options
context:
space:
mode:
authorrmathew <rmathew@138bc75d-0d04-0410-961f-82ee72b054a4>2006-06-29 14:57:39 +0000
committerrmathew <rmathew@138bc75d-0d04-0410-961f-82ee72b054a4>2006-06-29 14:57:39 +0000
commit795a5d4021e6db957b3f2e18e1468bd7064fda28 (patch)
treec184ad263e2312d7a38fbced2682933d1ad843bc /libjava/posix.cc
parenta589f7967ccc42f329a1627c541db03478c59eeb (diff)
downloadgcc-795a5d4021e6db957b3f2e18e1468bd7064fda28.tar.gz
* gcj/javaprims.h (_Jv_uintptr_t): New typedef similar to uintptr_t in
C99. * include/java-stack.h: Include stdlib.h. (_Jv_AddrInfo): New structure to hold address information. * include/posix.h (_Jv_platform_dladdr): Declare. * include/win32.h (_Jv_platform_dladdr): Declare. (backtrace): Remove declaration. * posix.cc: Include dlfcn.h if available. Include java-stack.h. (_Jv_platform_dladdr): Define. * win32.cc: Include string.h. Include java-stack.h. (backtrace): Remove. (_Jv_platform_dladdr): Define. * sysdep/i386/backtrace.h (fallback_backtrace): Check that a potential frame pointer value is 32-bit word-aligned. Use operand of the CALL instruction calling the current function to find its starting address. * stacktrace.cc: Do not include dlfcn.h. Include platform.h. (_Jv_StackTrace::getLineNumberForFrame): Use _Jv_platform_dladdr() instead of dladdr(). (_Jv_StackTrace::GetStackTraceElements): Use nCodeMap even for Windows. (_Jv_StackTrace::GetClassContext): Use fallback_backtrace() for targets with SJLJ exceptions instead of using _Unwind_Backtrace(). (_Jv_StackTrace::GetFirstNonSystemClassLoader): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@115069 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/posix.cc')
-rw-r--r--libjava/posix.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/libjava/posix.cc b/libjava/posix.cc
index 608fd5dad90..41702dfffb9 100644
--- a/libjava/posix.cc
+++ b/libjava/posix.cc
@@ -17,7 +17,12 @@ details. */
#include <signal.h>
#include <stdio.h>
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
#include <jvm.h>
+#include <java-stack.h>
#include <java/lang/Thread.h>
#include <java/io/InterruptedIOException.h>
#include <java/util/Properties.h>
@@ -203,3 +208,31 @@ _Jv_select (int n, fd_set *readfds, fd_set *writefds,
return 0;
#endif
}
+
+// Given an address, find the object that defines it and the nearest
+// defined symbol to that address. Returns 0 if no object defines this
+// address.
+int
+_Jv_platform_dladdr (const void *addr, _Jv_AddrInfo *info)
+{
+ int ret_val = 0;
+
+#if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR)
+ Dl_info addr_info;
+ ret_val = dladdr (addr, &addr_info);
+ if (ret_val != 0)
+ {
+ info->file_name = addr_info.dli_fname;
+ info->base = addr_info.dli_fbase;
+ info->sym_name = addr_info.dli_sname;
+ info->sym_addr = addr_info.dli_saddr;
+ }
+#else
+ info->file_name = NULL;
+ info->base = NULL;
+ info->sym_name = NULL;
+ info->sym_addr = NULL;
+#endif
+
+ return ret_val;
+}