URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [darwin.cc] - Rev 780
Go to most recent revision | Compare with Previous | Blame | View Log
/* 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;
Go to most recent revision | Compare with Previous | Blame | View Log