5c30094f48
libstdc++-v3: * configure.host: Remove osf* handling. * config/os/osf: Remove. * doc/xml/manual/using.xml: Remove OSF reference. * testsuite/18_support/pthread_guard.cc: Remove alpha*-*-osf* handling. * testsuite/20_util/shared_ptr/thread/default_weaktoshared.cc: Likewise. * testsuite/20_util/shared_ptr/thread/mutex_weaktoshared.cc: Likewise. * testsuite/21_strings/basic_string/pthread18185.cc: Likewise. * testsuite/21_strings/basic_string/pthread4.cc: Likewise. * testsuite/22_locale/locale/cons/12658_thread-1.cc: Likewise. * testsuite/22_locale/locale/cons/12658_thread-2.cc: Likewise. * testsuite/23_containers/list/pthread1.cc: Likewise. * testsuite/23_containers/list/pthread5.cc: Likewise. * testsuite/23_containers/map/pthread6.cc: Likewise. * testsuite/23_containers/vector/debug/multithreaded_swap.cc: Likewise. * testsuite/27_io/basic_ofstream/pthread2.cc: Likewise. * testsuite/27_io/basic_ostringstream/pthread3.cc: Likewise. * testsuite/30_threads/async/42819.cc: Likewise. * libstdc++-v3/testsuite/30_threads/async/49668.cc: Likewise. * libstdc++-v3/testsuite/30_threads/async/any.cc: Likewise. * libstdc++-v3/testsuite/30_threads/async/async.cc: Likewise. * libstdc++-v3/testsuite/30_threads/async/launch.cc: Likewise. * libstdc++-v3/testsuite/30_threads/async/sync.cc: Likewise. * libstdc++-v3/testsuite/30_threads/call_once/39909.cc: Likewise. * libstdc++-v3/testsuite/30_threads/call_once/49668.cc: Likewise. * libstdc++-v3/testsuite/30_threads/call_once/call_once1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable/members/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable/members/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable/native_handle/typesizes.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable_any/50862.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable_any/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable_any/members/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/condition_variable_any/members/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/cons/move.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/45133.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/get.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/get2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/share.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/valid.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/wait.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/wait_for.cc: Likewise. * libstdc++-v3/testsuite/30_threads/future/members/wait_until.cc: Likewise. * libstdc++-v3/testsuite/30_threads/lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/lock/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/lock/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/lock_guard/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/dest/destructor_locked.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/native_handle/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/native_handle/typesizes.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/try_lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/try_lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/mutex/unlock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/49668.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/alloc.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/move.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/cons/move_assign.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/get_future.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/get_future2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/invoke5.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/reset.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/reset2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/swap.cc: Likewise. * libstdc++-v3/testsuite/30_threads/packaged_task/members/valid.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/cons/alloc.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/cons/move.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/cons/move_assign.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/get_future.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/get_future2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/set_exception.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/set_exception2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/set_value.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/set_value3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/promise/members/swap.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/dest/destructor_locked.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/try_lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/try_lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_mutex/unlock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/dest/destructor_locked.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_for/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/try_lock_until/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/unlock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/cons/move.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/45133.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/get.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/get2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/valid.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/wait.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/wait_for.cc: Likewise. * libstdc++-v3/testsuite/30_threads/shared_future/members/wait_until.cc: Likewise. * libstdc++-v3/testsuite/30_threads/this_thread/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/this_thread/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/this_thread/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/this_thread/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/49668.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/5.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/6.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/7.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/8.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/9.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/cons/moveable.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/5.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/members/hardware_concurrency.cc: Likewise. * libstdc++-v3/testsuite/30_threads/thread/swap/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/dest/destructor_locked.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/typesizes.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_for/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/try_lock_until/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/timed_mutex/unlock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/try_lock/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/try_lock/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/try_lock/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/try_lock/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/5.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/cons/6.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/locking/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/locking/2.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/locking/3.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/locking/4.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/modifiers/1.cc: Likewise. * libstdc++-v3/testsuite/30_threads/unique_lock/modifiers/2.cc: Likewise. * libstdc++-v3/testsuite/ext/rope/pthread7-rope.cc: Likewise. * libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/thread/default_weaktoshared.cc: Likewise. * libstdc++-v3/testsuite/tr1/2_general_utilities/shared_ptr/thread/mutex_weaktoshared.cc: Likewise. libobjc: * configure.ac (enable_objc_gc): Remove alpha*-dec-osf* handling. * configure: Regenerate. * thr.c (_XOPEN_SOURCE): Define unconditionally. libjava: * configure.ac (alpha*-dec-osf*): Remove. * configure: Regenerate. * configure.host (alpha*-dec-osf*): Remove. * gnu/java/net/natPlainDatagramSocketImplPosix.cc (setOption): Use IPV6_MULTICAST_IF unconditionally. * gnu/java/net/natPlainDatagramSocketImplWin32.cc (setOption): Likewise. * gnu/java/net/natPlainSocketImplPosix.cc (gnu::java::net::PlainSocketImpl::accept): Use ::accept instead of _Jv_accept. * include/posix-signal.h [__alpha__ && __osf__]: Remove. * include/posix.h (_POSIX_PII_SOCKET): Don't define. (_Jv_accept): Remove. * java/io/File.java (File._access): Rename to access. Change callers. (File._stat): Likewise. * java/io/File.h: Regenerate. * classpath/lib/java/io/File.class: Regenerate. * java/io/natFilePosix.cc (java::io::File::_access): Rename to access. (java::io::File::_stat): Rename to stat. * java/io/natFileWin32.cc: Likewise. * testsuite/libjava.jni/jni.exp (gcj_jni_get_cxxflags_invocation): Remove alpha*-dec-osf* handling. * testsuite/libjava.jvmti/jvmti-interp.exp (gcj_jni_compile_c_to_so): Likewise. * testsuite/libjava.jvmti/jvmti.exp (gcj_jvmti_compile_cxx_to_o): Likewise. libitm: * configure.tgt (*-*-osf*): Remove. * configure: Regenerate. libgomp: * configure.tgt (alpha*-dec-osf*): Remove. * config/osf/sem.h: Remove. * config/posix/lock.c (_XOPEN_SOURCE): Define unconditionally. libgfortran: * configure.ac: Remove Tru64 reference. * acinclude.m4 (LIBGFOR_GTHREAD_WEAK): Remove alpha*-dec-osf* handling. * configure: Regenerate. * intrinsics/c99_functions.c [__osf__]: Remove. libgcc: * config.host: Remove alpha*-dec-osf5.1* handling. * config/alpha/gthr-posix.c: Remove. * config/alpha/libgcc-osf5.ver: Remove. * config/alpha/osf5-unwind.h: Remove. * config/alpha/t-osf-pthread: Remove. * config/alpha/t-slibgcc-osf: Remove. * config/t-crtfm (crtfastmath.o): Remove -frandom-seed. * gthr-posix.h [!_REENTRANT && __osf__] (_REENTRANT): Don't define. [__osf__ && _PTHREAD_USE_MANGLED_NAMES_]: Remove. * mkmap-flat.awk: Remove osf_export handling. gnattools: * configure.ac: Remove alpha*-dec-osf* handling. * configure: Regenerate. gcc/testsuite: * g++.dg/abi/rtti3.C: Remove alpha*-dec-osf* handling. * g++.dg/abi/thunk4.C: Likewise. * g++.dg/cdce3.C: Don't skip on*-dec-osf5*. Adapt line numbers. * g++.dg/compat/struct-layout-1_generate.c: Remove alpha*-dec-osf* handling. * g++.dg/cpp0x/constexpr-rom.C: Likewise. * g++.dg/eh/spbp.C: Likewise. * g++.dg/ext/label13.C: Likewise. * g++.dg/guality/guality.exp: Likewise. * g++.dg/other/anon5.C: Likewise. * g++.dg/other/pragma-ep-1.C: Remove. * g++.dg/warn/miss-format-1.C: Remove alpha*-dec-osf* handling. * g++.dg/warn/pr31246.C: Likewise. * g++.dg/warn/weak1.C: Likewise. * g++.old-deja/g++.eh/badalloc1.C: Likewise. * g++.old-deja/g++.ext/attrib5.C: Likewise. * gcc.c-torture/compile/limits-declparen.c: Likewise. * gcc.c-torture/compile/limits-pointer.c: Likewise. * gcc.c-torture/execute/20001229-1.c: Remove __osf__ handling. * gcc.dg/attr-weakref-1.c: Remove alpha*-dec-osf* handling. * gcc.dg/c99-stdint-6.c: Remove alpha*-dec-osf5* handling. * gcc.dg/c99-tgmath-1.c: Likewise. * gcc.dg/c99-tgmath-2.c: Likewise. * gcc.dg/c99-tgmath-3.c: Likewise. * gcc.dg/c99-tgmath-4.c: Likewise. * gcc.dg/compat/struct-layout-1_generate.c: Remove alpha*-dec-osf* handling. * gcc.dg/debug/pr49032.c: Likewise. * gcc.dg/guality/guality.exp: Likewise. * gcc.dg/intmax_t-1.c: Likewise. * gcc.dg/pr48616.c: Likewise. * gcc.dg/pragma-ep-1.c: Remove. * gcc.dg/pragma-ep-2.c: Remove. * gcc.dg/pragma-ep-3.c: Remove. * gcc.dg/torture/pr47917.c: Remove alpha*-dec-osf5* handling. * gcc.dg/tree-ssa/pr42585.c: Remove alpha*-dec-osf* handling. * gcc.misc-tests/gcov-14.c: Likewise. * gfortran.dg/guality/guality.exp: Likewise. * lib/target-supports.exp (check_weak_available): Likewise. (add_options_for_tls): Likewise. (check_ascii_locale_available): Likewise. * obj-c++.dg/dwarf-2.mm: Likewise. * objc.dg/dwarf-1.m: Likewise. * objc.dg/dwarf-2.m: Likewise. gcc/c-family: * c-cppbuiltin.c (c_cpp_builtins): Remove #pragma extern_prefix handling. * c-pragma.c (handle_pragma_extern_prefix): Remove. (init_pragma): Don't register extern_prefix. gcc/po: * EXCLUDES (mips-tdump.c, mips-tfile.c): Remove. gcc: * config.gcc (alpha*-dec-osf5.1*): Remove. * config.host (alpha*-dec-osf*): Remove. * configure.ac (*-*-osf*): Remove. (alpha*-dec-osf*): Remove. * configure: Regenerate. * config/alpha/host-osf.c, config/alpha/osf5.h, config/alpha/osf5.opt, config/alpha/va_list.h, config/alpha/x-osf: Remove. * config/alpha/alpha.h (TARGET_LD_BUGGY_LDGP): Remove. * config/alpha/alpha.c (struct machine_function): Update comment. (alpha_start_function): Remove Tru64 UNIX as handling for max_frame_size. * config/alpha/alpha.md ("exception_receiver"): Remove TARGET_LD_BUGGY_LDGP. ("*exception_receiver_2"): Likewise. * except.c (finish_eh_generation): Remove Tru64 reference. * ginclude/stdarg.h [_HIDDEN_VA_LIST]: Don't undef _VA_LIST. * system.h (TARGET_HANDLE_PRAGMA_EXTERN_PREFIX): Poison. * target.def (handle_pragma_extern_prefix): Remove. * Makefile.in (mips-tfile.o-warn): Remove. (ALL_HOST_BACKEND_OBJS): Remove mips-tfile.o, mips-tdump.o. (mips-tfile, mips-tfile.o, mips-tdump, mips-tdump.o): Remove. * mips-tdump.c, mips-tfile.c: Remove. * doc/extend.texi (Symbol-Renaming Pragmas): Remove #pragma extern_prefix. * doc/install.texi (Binaries): Remove Tru64 UNIX reference. (Specific, alpha*-dec-osf5.1): Note removal. * doc/tm.texi.in (Misc, TARGET_HANDLE_PRAGMA_EXTERN_PREFIX): Remove. * doc/tm.texi: Regenerate. * doc/trouble.texi (Cross-Compiler Problems): Remove. gcc/ada: * gcc-interface/Makefile.in (alpha*-dec-osf*): Remove. * a-intnam-tru64.ads, mlib-tgt-specific-tru64.adb, s-mastop-tru64.adb, s-osinte-tru64.adb, s-osinte-tru64.ads, s-taprop-tru64.adb, s-tasinf-tru64.ads, s-taspri-tru64.ads, system-tru64.ads: Remove. * adaint.c (__gnat_number_of_cpus) [__alpha__ && __osf__]: Remove. [IS_CROSS] [!(__alpha__ && __osf__)]: Remove. * env.c [__alpha__ && __osf__]: Remove. * gsocket.h (_OSF_SOURCE): Remove. (HAVE_THREAD_SAFE_GETxxxBYyyy) [__osf__]: Remove. * init.c [__alpha__ && __osf__]: Remove. * link.c [__osf__]: Remove. * s-oscons-tmplt.c [__alpha__ && __osf__]: Remove. [__osf__ && !_SS_MAXSIZE]: Remove. * sysdep.c [__osf__]: Remove. * terminals.c [__alpha__ && __osf__]: Remove. [OSF1]: Remove. * g-traceb.ads: Remove Tru64 reference. * g-trasym.ads: Likewise. * gnat_ugn.texi (Linking a Mixed C++ & Ada Program): Likewise. (Summary of Run-Time Configurations): Likewise. * memtrack.adb: Likewise. fixincludes: * inclhack.def (alpha___extern_prefix): Remove. (alpha___extern_prefix_standards): Remove. (alpha___extern_prefix_sys_stat): Remove. (alpha_bad_lval): Remove. (alpha_pthread): Remove. (alpha_pthread_gcc): Remove. (alpha_pthread_init): Remove. * fixincl.x: Regenerate. * tests/base/pthread.h [ALPHA_PTHREAD_CHECK]: Remove. [ALPHA_PTHREAD_GCC_CHECK]: Remove. [ALPHA_PTHREAD_INIT_CHECK]: Remove. * tests/base/standards.h: Remove. * tests/base/sys/stat.h [ALPHA___EXTERN_PREFIX_SYS_STAT_CHECK]: Remove. * tests/base/testing.h [ALPHA___EXTERN_PREFIX_CHECK]: Remove. [ALPHA_BAD_LVAL_CHECK]: Remove. contrib: * config-list.mk (LIST): Remove alpha-dec-osf5.1. config: * weakref.m4 (GCC_CHECK_ELF_STYLE_WEAKREF): Remove alpha*-dec-osf*. toplevel: * MAINTAINERS (OS Port Maintainers): Remove osf. * configure.ac (enable_libgomp): Remove *-*-osf*. (with_stabs): Remove alpha*-*-osf*. * configure: Regenerate. From-SVN: r185240
548 lines
15 KiB
C
548 lines
15 KiB
C
/* GNU Objective C Runtime Thread Interface
|
|
Copyright (C) 1996, 1997, 2009, 2010, 2012 Free Software Foundation, Inc.
|
|
Contributed by Galen C. Hunt (gchunt@cs.rochester.edu)
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation; either version 3, or (at your option) any later version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
details.
|
|
|
|
Under Section 7 of GPL version 3, you are granted additional
|
|
permissions described in the GCC Runtime Library Exception, version
|
|
3.1, as published by the Free Software Foundation.
|
|
|
|
You should have received a copy of the GNU General Public License and
|
|
a copy of the GCC Runtime Library Exception along with this program;
|
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include "objc-private/common.h"
|
|
#include "objc-private/error.h"
|
|
#define _LIBOBJC
|
|
/* The line below is needed for declarations of functions such as
|
|
pthread_mutexattr_settype, without which gthr-posix.h may fail to
|
|
compile within libobjc. */
|
|
#define _XOPEN_SOURCE 500
|
|
#include "config.h"
|
|
#include "tconfig.h"
|
|
#include "coretypes.h"
|
|
#include "tm.h"
|
|
#include "defaults.h"
|
|
#include "objc/thr.h"
|
|
#include "objc/message.h" /* For objc_msg_lookup(). */
|
|
#include "objc/runtime.h"
|
|
#include "objc-private/module-abi-8.h"
|
|
#include "objc-private/runtime.h"
|
|
#include <gthr.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
/* Global exit status. */
|
|
int __objc_thread_exit_status = 0;
|
|
|
|
/* Flag which lets us know if we ever became multi threaded. */
|
|
int __objc_is_multi_threaded = 0;
|
|
|
|
/* The hook function called when the runtime becomes multi
|
|
threaded. */
|
|
objc_thread_callback _objc_became_multi_threaded = NULL;
|
|
|
|
/* Use this to set the hook function that will be called when the
|
|
runtime initially becomes multi threaded. The hook function is
|
|
only called once, meaning only when the 2nd thread is spawned, not
|
|
for each and every thread.
|
|
|
|
It returns the previous hook function or NULL if there is none.
|
|
|
|
A program outside of the runtime could set this to some function so
|
|
it can be informed; for example, the GNUstep Base Library sets it
|
|
so it can implement the NSBecomingMultiThreaded notification. */
|
|
objc_thread_callback objc_set_thread_callback (objc_thread_callback func)
|
|
{
|
|
objc_thread_callback temp = _objc_became_multi_threaded;
|
|
_objc_became_multi_threaded = func;
|
|
return temp;
|
|
}
|
|
|
|
/* Private functions.
|
|
|
|
These functions are utilized by the runtime, but they are not
|
|
considered part of the public interface. */
|
|
|
|
/* Initialize the threads subsystem. */
|
|
int
|
|
__objc_init_thread_system(void)
|
|
{
|
|
return __gthread_objc_init_thread_system ();
|
|
}
|
|
|
|
/* First function called in a thread, starts everything else.
|
|
|
|
This function is passed to the backend by objc_thread_detach as the
|
|
starting function for a new thread. */
|
|
struct __objc_thread_start_state
|
|
{
|
|
SEL selector;
|
|
id object;
|
|
id argument;
|
|
};
|
|
|
|
static void __attribute__((noreturn))
|
|
__objc_thread_detach_function (struct __objc_thread_start_state *istate)
|
|
{
|
|
/* Valid state? */
|
|
if (istate)
|
|
{
|
|
id (*imp) (id, SEL, id);
|
|
SEL selector = istate->selector;
|
|
id object = istate->object;
|
|
id argument = istate->argument;
|
|
|
|
/* Don't need anymore so free it. */
|
|
objc_free (istate);
|
|
|
|
/* Clear out the thread local storage. */
|
|
objc_thread_set_data (NULL);
|
|
|
|
/* Check to see if we just became multi threaded. */
|
|
if (! __objc_is_multi_threaded)
|
|
{
|
|
__objc_is_multi_threaded = 1;
|
|
|
|
/* Call the hook function. */
|
|
if (_objc_became_multi_threaded != NULL)
|
|
(*_objc_became_multi_threaded) ();
|
|
}
|
|
|
|
/* Call the method. */
|
|
if ((imp = (id (*) (id, SEL, id))objc_msg_lookup (object, selector)))
|
|
(*imp) (object, selector, argument);
|
|
else
|
|
{
|
|
/* FIXME: Should we abort here ? */
|
|
_objc_abort ("objc_thread_detach called with bad selector.\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* FIXME: Should we abort here ? */
|
|
_objc_abort ("objc_thread_detach called with NULL state.\n");
|
|
}
|
|
|
|
/* Exit the thread. */
|
|
objc_thread_exit ();
|
|
|
|
/* Make sure compiler detects no return. */
|
|
__builtin_trap ();
|
|
}
|
|
|
|
/* Public functions.
|
|
|
|
These functions constitute the public interface to the Objective-C
|
|
thread and mutex functionality. */
|
|
|
|
/* Detach a new thread of execution and return its id. Returns NULL
|
|
if fails. Thread is started by sending message with selector to
|
|
object. Message takes a single argument. */
|
|
objc_thread_t
|
|
objc_thread_detach (SEL selector, id object, id argument)
|
|
{
|
|
struct __objc_thread_start_state *istate;
|
|
objc_thread_t thread_id = NULL;
|
|
|
|
/* Allocate the state structure. */
|
|
if (!(istate = (struct __objc_thread_start_state *)objc_malloc
|
|
(sizeof (*istate))))
|
|
return NULL;
|
|
|
|
/* Initialize the state structure. */
|
|
istate->selector = selector;
|
|
istate->object = object;
|
|
istate->argument = argument;
|
|
|
|
/* Lock access. */
|
|
objc_mutex_lock (__objc_runtime_mutex);
|
|
|
|
/* Call the backend to spawn the thread. */
|
|
if ((thread_id = __gthread_objc_thread_detach ((void *)__objc_thread_detach_function,
|
|
istate)) == NULL)
|
|
{
|
|
/* Failed! */
|
|
objc_mutex_unlock (__objc_runtime_mutex);
|
|
objc_free (istate);
|
|
return NULL;
|
|
}
|
|
|
|
/* Increment our thread counter. */
|
|
__objc_runtime_threads_alive++;
|
|
objc_mutex_unlock (__objc_runtime_mutex);
|
|
|
|
return thread_id;
|
|
}
|
|
|
|
/* Set the current thread's priority. */
|
|
int
|
|
objc_thread_set_priority (int priority)
|
|
{
|
|
return __gthread_objc_thread_set_priority (priority);
|
|
}
|
|
|
|
/* Return the current thread's priority. */
|
|
int
|
|
objc_thread_get_priority (void)
|
|
{
|
|
return __gthread_objc_thread_get_priority ();
|
|
}
|
|
|
|
/* Yield our process time to another thread. Any BUSY waiting that is
|
|
done by a thread should use this function to make sure that other
|
|
threads can make progress even on a lazy uniprocessor system. */
|
|
void
|
|
objc_thread_yield (void)
|
|
{
|
|
__gthread_objc_thread_yield ();
|
|
}
|
|
|
|
/* Terminate the current tread. Doesn't return. Actually, if it
|
|
failed returns -1. */
|
|
int
|
|
objc_thread_exit (void)
|
|
{
|
|
/* Decrement our counter of the number of threads alive. */
|
|
objc_mutex_lock (__objc_runtime_mutex);
|
|
__objc_runtime_threads_alive--;
|
|
objc_mutex_unlock (__objc_runtime_mutex);
|
|
|
|
/* Call the backend to terminate the thread. */
|
|
return __gthread_objc_thread_exit ();
|
|
}
|
|
|
|
/* Returns an integer value which uniquely describes a thread. Must
|
|
not be NULL which is reserved as a marker for "no thread". */
|
|
objc_thread_t
|
|
objc_thread_id (void)
|
|
{
|
|
return __gthread_objc_thread_id ();
|
|
}
|
|
|
|
/* Sets the thread's local storage pointer. Returns 0 if successful
|
|
or -1 if failed. */
|
|
int
|
|
objc_thread_set_data (void *value)
|
|
{
|
|
return __gthread_objc_thread_set_data (value);
|
|
}
|
|
|
|
/* Returns the thread's local storage pointer. Returns NULL on
|
|
failure. */
|
|
void *
|
|
objc_thread_get_data (void)
|
|
{
|
|
return __gthread_objc_thread_get_data ();
|
|
}
|
|
|
|
/* Public mutex functions */
|
|
|
|
/* Allocate a mutex. Return the mutex pointer if successful or NULL
|
|
if the allocation failed for any reason. */
|
|
objc_mutex_t
|
|
objc_mutex_allocate (void)
|
|
{
|
|
objc_mutex_t mutex;
|
|
|
|
/* Allocate the mutex structure. */
|
|
if (! (mutex = (objc_mutex_t)objc_malloc (sizeof (struct objc_mutex))))
|
|
return NULL;
|
|
|
|
/* Call backend to create the mutex. */
|
|
if (__gthread_objc_mutex_allocate (mutex))
|
|
{
|
|
/* Failed! */
|
|
objc_free (mutex);
|
|
return NULL;
|
|
}
|
|
|
|
/* Initialize mutex. */
|
|
mutex->owner = NULL;
|
|
mutex->depth = 0;
|
|
return mutex;
|
|
}
|
|
|
|
/* Deallocate a mutex. Note that this includes an implicit mutex_lock
|
|
to insure that no one else is using the lock. It is legal to
|
|
deallocate a lock if we have a lock on it, but illegal to
|
|
deallocate a lock held by anyone else. Returns the number of locks
|
|
on the thread. (1 for deallocate). */
|
|
int
|
|
objc_mutex_deallocate (objc_mutex_t mutex)
|
|
{
|
|
int depth;
|
|
|
|
/* Valid mutex? */
|
|
if (! mutex)
|
|
return -1;
|
|
|
|
/* Acquire lock on mutex. */
|
|
depth = objc_mutex_lock (mutex);
|
|
|
|
/* Call backend to destroy mutex. */
|
|
if (__gthread_objc_mutex_deallocate (mutex))
|
|
return -1;
|
|
|
|
/* Free the mutex structure. */
|
|
objc_free (mutex);
|
|
|
|
/* Return last depth. */
|
|
return depth;
|
|
}
|
|
|
|
/* Grab a lock on a mutex. If this thread already has a lock on this
|
|
mutex then we increment the lock count. If another thread has a
|
|
lock on the mutex we block and wait for the thread to release the
|
|
lock. Returns the lock count on the mutex held by this thread. */
|
|
int
|
|
objc_mutex_lock (objc_mutex_t mutex)
|
|
{
|
|
objc_thread_t thread_id;
|
|
int status;
|
|
|
|
/* Valid mutex? */
|
|
if (! mutex)
|
|
return -1;
|
|
|
|
/* If we already own the lock then increment depth. */
|
|
thread_id = __gthread_objc_thread_id ();
|
|
if (mutex->owner == thread_id)
|
|
return ++mutex->depth;
|
|
|
|
/* Call the backend to lock the mutex. */
|
|
status = __gthread_objc_mutex_lock (mutex);
|
|
|
|
/* Failed? */
|
|
if (status)
|
|
return status;
|
|
|
|
/* Successfully locked the thread. */
|
|
mutex->owner = thread_id;
|
|
return mutex->depth = 1;
|
|
}
|
|
|
|
/* Try to grab a lock on a mutex. If this thread already has a lock
|
|
on this mutex then we increment the lock count and return it. If
|
|
another thread has a lock on the mutex returns -1. */
|
|
int
|
|
objc_mutex_trylock (objc_mutex_t mutex)
|
|
{
|
|
objc_thread_t thread_id;
|
|
int status;
|
|
|
|
/* Valid mutex? */
|
|
if (! mutex)
|
|
return -1;
|
|
|
|
/* If we already own the lock then increment depth. */
|
|
thread_id = __gthread_objc_thread_id ();
|
|
if (mutex->owner == thread_id)
|
|
return ++mutex->depth;
|
|
|
|
/* Call the backend to try to lock the mutex. */
|
|
status = __gthread_objc_mutex_trylock (mutex);
|
|
|
|
/* Failed? */
|
|
if (status)
|
|
return status;
|
|
|
|
/* Successfully locked the thread. */
|
|
mutex->owner = thread_id;
|
|
return mutex->depth = 1;
|
|
}
|
|
|
|
/* Unlocks the mutex by one level. Decrements the lock count on this
|
|
mutex by one. If the lock count reaches zero, release the lock on
|
|
the mutex. Returns the lock count on the mutex. It is an error to
|
|
attempt to unlock a mutex which this thread doesn't hold in which
|
|
case return -1 and the mutex is unaffected. */
|
|
int
|
|
objc_mutex_unlock (objc_mutex_t mutex)
|
|
{
|
|
objc_thread_t thread_id;
|
|
int status;
|
|
|
|
/* Valid mutex? */
|
|
if (! mutex)
|
|
return -1;
|
|
|
|
/* If another thread owns the lock then abort. */
|
|
thread_id = __gthread_objc_thread_id ();
|
|
if (mutex->owner != thread_id)
|
|
return -1;
|
|
|
|
/* Decrement depth and return. */
|
|
if (mutex->depth > 1)
|
|
return --mutex->depth;
|
|
|
|
/* Depth down to zero so we are no longer the owner. */
|
|
mutex->depth = 0;
|
|
mutex->owner = NULL;
|
|
|
|
/* Have the backend unlock the mutex. */
|
|
status = __gthread_objc_mutex_unlock (mutex);
|
|
|
|
/* Failed? */
|
|
if (status)
|
|
return status;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Public condition mutex functions */
|
|
|
|
/* Allocate a condition. Return the condition pointer if successful
|
|
or NULL if the allocation failed for any reason. */
|
|
objc_condition_t
|
|
objc_condition_allocate (void)
|
|
{
|
|
objc_condition_t condition;
|
|
|
|
/* Allocate the condition mutex structure. */
|
|
if (! (condition =
|
|
(objc_condition_t) objc_malloc (sizeof (struct objc_condition))))
|
|
return NULL;
|
|
|
|
/* Call the backend to create the condition mutex. */
|
|
if (__gthread_objc_condition_allocate (condition))
|
|
{
|
|
/* Failed! */
|
|
objc_free (condition);
|
|
return NULL;
|
|
}
|
|
|
|
/* Success! */
|
|
return condition;
|
|
}
|
|
|
|
/* Deallocate a condition. Note that this includes an implicit
|
|
condition_broadcast to insure that waiting threads have the
|
|
opportunity to wake. It is legal to dealloc a condition only if no
|
|
other thread is/will be using it. Here we do NOT check for other
|
|
threads waiting but just wake them up. */
|
|
int
|
|
objc_condition_deallocate (objc_condition_t condition)
|
|
{
|
|
/* Broadcast the condition. */
|
|
if (objc_condition_broadcast (condition))
|
|
return -1;
|
|
|
|
/* Call the backend to destroy. */
|
|
if (__gthread_objc_condition_deallocate (condition))
|
|
return -1;
|
|
|
|
/* Free the condition mutex structure. */
|
|
objc_free (condition);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Wait on the condition unlocking the mutex until
|
|
objc_condition_signal () or objc_condition_broadcast () are called
|
|
for the same condition. The given mutex *must* have the depth set
|
|
to 1 so that it can be unlocked here, so that someone else can lock
|
|
it and signal/broadcast the condition. The mutex is used to lock
|
|
access to the shared data that make up the "condition"
|
|
predicate. */
|
|
int
|
|
objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
|
|
{
|
|
objc_thread_t thread_id;
|
|
|
|
/* Valid arguments? */
|
|
if (! mutex || ! condition)
|
|
return -1;
|
|
|
|
/* Make sure we are owner of mutex. */
|
|
thread_id = __gthread_objc_thread_id ();
|
|
if (mutex->owner != thread_id)
|
|
return -1;
|
|
|
|
/* Cannot be locked more than once. */
|
|
if (mutex->depth > 1)
|
|
return -1;
|
|
|
|
/* Virtually unlock the mutex. */
|
|
mutex->depth = 0;
|
|
mutex->owner = (objc_thread_t)NULL;
|
|
|
|
/* Call the backend to wait. */
|
|
__gthread_objc_condition_wait (condition, mutex);
|
|
|
|
/* Make ourselves owner of the mutex. */
|
|
mutex->owner = thread_id;
|
|
mutex->depth = 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Wake up all threads waiting on this condition. It is recommended
|
|
that the called would lock the same mutex as the threads in
|
|
objc_condition_wait before changing the "condition predicate" and
|
|
make this call and unlock it right away after this call. */
|
|
int
|
|
objc_condition_broadcast (objc_condition_t condition)
|
|
{
|
|
/* Valid condition mutex? */
|
|
if (! condition)
|
|
return -1;
|
|
|
|
return __gthread_objc_condition_broadcast (condition);
|
|
}
|
|
|
|
/* Wake up one thread waiting on this condition. It is recommended
|
|
that the called would lock the same mutex as the threads in
|
|
objc_condition_wait before changing the "condition predicate" and
|
|
make this call and unlock it right away after this call. */
|
|
int
|
|
objc_condition_signal (objc_condition_t condition)
|
|
{
|
|
/* Valid condition mutex? */
|
|
if (! condition)
|
|
return -1;
|
|
|
|
return __gthread_objc_condition_signal (condition);
|
|
}
|
|
|
|
/* Make the objc thread system aware that a thread which is managed
|
|
(started, stopped) by external code could access objc facilities
|
|
from now on. This is used when you are interfacing with some
|
|
external non-objc-based environment/system - you must call
|
|
objc_thread_add () before an alien thread makes any calls to
|
|
Objective-C. Do not cause the _objc_became_multi_threaded hook to
|
|
be executed. */
|
|
void
|
|
objc_thread_add (void)
|
|
{
|
|
objc_mutex_lock (__objc_runtime_mutex);
|
|
__objc_is_multi_threaded = 1;
|
|
__objc_runtime_threads_alive++;
|
|
objc_mutex_unlock (__objc_runtime_mutex);
|
|
}
|
|
|
|
/* Make the objc thread system aware that a thread managed (started,
|
|
stopped) by some external code will no longer access objc and thus
|
|
can be forgotten by the objc thread system. Call
|
|
objc_thread_remove () when your alien thread is done with making
|
|
calls to Objective-C. */
|
|
void
|
|
objc_thread_remove (void)
|
|
{
|
|
objc_mutex_lock (__objc_runtime_mutex);
|
|
__objc_runtime_threads_alive--;
|
|
objc_mutex_unlock (__objc_runtime_mutex);
|
|
}
|
|
|