diff options
author | Ben Cheng <bccheng@google.com> | 2012-10-01 10:30:31 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2012-10-01 10:30:31 -0700 |
commit | 82bcbebce43f0227f506d75a5b764b6847041bae (patch) | |
tree | fe9f8597b48a430c4daeb5123e3e8eb28e6f9da9 /gcc-4.7/libjava/darwin.cc | |
parent | 3c052de3bb16ac53b6b6ed659ec7557eb84c7590 (diff) | |
download | toolchain_gcc-82bcbebce43f0227f506d75a5b764b6847041bae.tar.gz toolchain_gcc-82bcbebce43f0227f506d75a5b764b6847041bae.tar.bz2 toolchain_gcc-82bcbebce43f0227f506d75a5b764b6847041bae.zip |
Initial check-in of gcc 4.7.2.
Change-Id: I4a2f5a921c21741a0e18bda986d77e5f1bef0365
Diffstat (limited to 'gcc-4.7/libjava/darwin.cc')
-rw-r--r-- | gcc-4.7/libjava/darwin.cc | 80 |
1 files changed, 80 insertions, 0 deletions
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 <config.h> + +#include <jvm.h> + +/* In theory, we should be able to do: + #include <mach-o/getsect.h> + #include <mach-o/dyld.h> + + 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 <stdint.h> +#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; |