From 82bcbebce43f0227f506d75a5b764b6847041bae Mon Sep 17 00:00:00 2001 From: Ben Cheng Date: Mon, 1 Oct 2012 10:30:31 -0700 Subject: Initial check-in of gcc 4.7.2. Change-Id: I4a2f5a921c21741a0e18bda986d77e5f1bef0365 --- gcc-4.7/libjava/darwin.cc | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 gcc-4.7/libjava/darwin.cc (limited to 'gcc-4.7/libjava/darwin.cc') diff --git a/gcc-4.7/libjava/darwin.cc b/gcc-4.7/libjava/darwin.cc new file mode 100644 index 000000000..f6406b375 --- /dev/null +++ b/gcc-4.7/libjava/darwin.cc @@ -0,0 +1,80 @@ +/* darwin.cc - class loader stuff for Darwin. */ + +/* Copyright (C) 2004, 2007 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. */ + +#include + +#include + +/* In theory, we should be able to do: + #include + #include + + but all the types in these headers changed between Panther and Tiger, + so the only way to be avoid type mismatches is to declare the routines + ourself. */ + +#include +#if !defined (__LP64__) + struct mach_header; +# define JAVA_MACH_HEADER mach_header +# define mh_size_t uint32_t + extern "C" void _dyld_register_func_for_add_image + (void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide)); + extern "C" void _dyld_register_func_for_remove_image + (void (*func)(const struct mach_header *mh, intptr_t vmaddr_slide)); + extern "C" char *getsectdatafromheader + (const struct mach_header *mhp, const char *segname, const char *sectname, + uint32_t *size); +# define GETSECTDATA getsectdatafromheader +#else + struct mach_header_64; +# define JAVA_MACH_HEADER mach_header_64 +# define mh_size_t uint64_t + extern "C" void _dyld_register_func_for_add_image + (void (*func)(const struct mach_header_64 *mh, intptr_t vmaddr_slide)); + extern "C" void _dyld_register_func_for_remove_image + (void (*func)(const struct mach_header_64 *mh, intptr_t vmaddr_slide)); + extern "C" char *getsectdatafromheader_64 + (const struct mach_header_64 *mhp, const char *segname, + const char *sectname, uint64_t *size); +# define GETSECTDATA getsectdatafromheader_64 +#endif + +/* When a new image is loaded, look to see if it has a jcr section + and if so register the classes listed in it. */ + +static void +darwin_java_register_dyld_add_image_hook (const struct JAVA_MACH_HEADER *mh, + intptr_t slide) +{ + char *fde; + mh_size_t sz; + + fde = GETSECTDATA (mh, "__DATA", "jcr", &sz); + if (! fde) + return; + + /* As far as I can tell, you're only supposed to load shared + libraries while having a lock on java.lang.Class. So there's + no need to synchronize on anything here. (I'm not sure how exactly + you can ensure this given lazy library loading. FIXME.) */ + + _Jv_RegisterClasses_Counted ((const jclass *) (fde + slide), + sz / sizeof (jclass *)); +} + +static struct darwin_constructor_s{ + darwin_constructor_s() + { + _dyld_register_func_for_add_image + (darwin_java_register_dyld_add_image_hook); + /* At present, you mustn't unload any java plugin. */ + }; +} darwin_constructor; -- cgit v1.2.3