From 3c17dd1ccdc104a63d848f4547c8b5062941d4b5 Mon Sep 17 00:00:00 2001 From: "Sergey Semyonov (Serge)" Date: Thu, 29 Sep 2016 11:02:20 +0000 Subject: [PATCH] libsupc++ Makefile git-svn-id: svn://kolibrios.org@6556 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../toolchain/gcc/5x/libstdc++-v3/Makefile | 26 ++- .../gcc/5x/libstdc++-v3/libsupc++/Makefile | 178 +++++++++++------- .../5x/libstdc++-v3/libsupc++/cp-demangle.c | 22 +-- .../5x/libstdc++-v3/libsupc++/cp-demangle.h | 5 + .../gcc/5x/libstdc++-v3/libsupc++/demangle.h | 23 ++- .../5x/libstdc++-v3/libsupc++/gthr_mutex.c | 150 --------------- .../5x/libstdc++-v3/libsupc++/vterminate.idb | Bin 131222 -> 0 bytes 7 files changed, 167 insertions(+), 237 deletions(-) delete mode 100644 contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/gthr_mutex.c delete mode 100644 contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/vterminate.idb diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/Makefile b/contrib/toolchain/gcc/5x/libstdc++-v3/Makefile index e25ece93c..6ac55dbf7 100644 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/Makefile +++ b/contrib/toolchain/gcc/5x/libstdc++-v3/Makefile @@ -35,13 +35,13 @@ cxx98_sources = \ src/c++98/compatibility-debug_list-2.cc cxx11_sources = \ - compatibility-c++0x.cc \ - compatibility-atomic-c++0x.cc \ - compatibility-thread-c++0x.cc \ - compatibility-chrono.cc \ - compatibility-condvar.cc + src/c++11/compatibility-c++0x.cc \ + src/c++11/compatibility-atomic-c++0x.cc \ + src/c++11/compatibility-thread-c++0x.cc \ + src/c++11/compatibility-chrono.cc \ + src/c++11/compatibility-condvar.cc -compat_sources = $(cxx98_sources) +compat_sources = $(cxx98_sources) $(cxx11_sources) cow_string_host_sources = \ src/c++98/collate_members_cow.cc \ @@ -244,7 +244,19 @@ src/c++98/parallel_settings.o: src/c++98/parallel_settings.cc src/c++11/hashtable_c++0x.o: src/c++11/hashtable_c++0x.cc - $(CXXCOMPILE) -fimplicit-templates -o $@ $< + $(CXXCOMPILE) -std=gnu++11 -fimplicit-templates -o $@ $< + +src/c++11/compatibility-c++0x.o: src/c++11/compatibility-c++0x.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +src/c++11/compatibility-thread-c++0x.o: src/c++11/compatibility-thread-c++0x.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +src/c++11/compatibility-chrono.o: src/c++11/compatibility-chrono.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +src/c++11/compatibility-condvar.o: src/c++11/compatibility-condvar.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< clean: -rm -f *.o diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/Makefile b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/Makefile index c930829c2..9fbaf09a1 100644 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/Makefile +++ b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/Makefile @@ -6,68 +6,81 @@ LD = kos32-ld CPP= kos32-g++ STRIP = kos32-strip +INSTALLDIR:= /home/autobuild/tools/win32/mingw32/lib + +export SDK_DIR:= $(abspath ../../../../../sdk) + CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -fomit-frame-pointer -CPPFLAGS = -fno-rtti +CFLAGSCPP = -nostdinc++ -fno-implicit-templates -Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi +CFLAGSCPP+= -fdiagnostics-show-location=once -ffunction-sections -fdata-sections ARFLAGS= crs -INCLUDES= -I. -I../include/mingw32 -I../include -I../../newlib/libc/include -I/home/autobuild/tools/win32/include +GLIBCXX_INCLUDE_DIR= ../include +INCLUDES= -I../include/mingw32 -I../include -I./ -I$(SDK_DIR)/sources/newlib/libc/include -LIBS:= -ldll -lc.dll +DEFINES= -D_GLIBCXX_HAVE_TLS -DEFINES= -DHAVE_CONFIG_H -DIN_GCC -DIN_GLIBCPP_V3 -DUSE_EMUTLS=1 -D_GLIBCXX_HAVE_TLS +C_COMPILE= $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) +CXXCOMPILE= $(CPP) $(CFLAGS) $(CFLAGSCPP) $(INCLUDES) $(DEFINES) SOURCES = \ - cp-demangle.c \ - array_type_info.cc \ - atexit_thread.cc \ - bad_alloc.cc \ - bad_cast.cc \ - bad_typeid.cc \ - class_type_info.cc \ - del_op.cc \ - del_opnt.cc \ - del_opv.cc \ - del_opvnt.cc \ - dyncast.cc \ - eh_alloc.cc \ - eh_aux_runtime.cc \ - eh_call.cc \ - eh_catch.cc \ - eh_exception.cc \ - eh_globals.cc \ - eh_personality.cc \ - eh_ptr.cc \ - eh_term_handler.cc \ - eh_terminate.cc \ - eh_throw.cc \ - eh_tm.cc \ - eh_type.c \ - eh_unex_handler.cc \ - enum_type_info.cc \ - function_type_info.cc \ - fundamental_type_info.cc \ - guard.cc \ - guard_error.cc \ - hash_bytes.cc \ - nested_exception.cc \ - new_handler.cc \ - new_op.cc \ - new_opnt.cc \ - new_opv.cc \ - new_opvnt.cc \ - pbase_type_info.cc \ - pmem_type_info.cc \ - pointer_type_info.cc \ - pure.cc \ - si_class_type_info.cc \ - tinfo.cc \ - tinfo2.cc \ - vec.cc \ - vmi_class_type_info.cc \ - vterminate.cc - + cp-demangle.c \ + array_type_info.cc \ + atexit_arm.cc \ + atexit_thread.cc \ + bad_alloc.cc \ + bad_array_length.cc \ + bad_array_new.cc \ + bad_cast.cc \ + bad_typeid.cc \ + class_type_info.cc \ + del_op.cc \ + del_ops.cc \ + del_opnt.cc \ + del_opv.cc \ + del_opvs.cc \ + del_opvnt.cc \ + dyncast.cc \ + eh_alloc.cc \ + eh_arm.cc \ + eh_aux_runtime.cc \ + eh_call.cc \ + eh_catch.cc \ + eh_exception.cc \ + eh_globals.cc \ + eh_personality.cc \ + eh_ptr.cc \ + eh_term_handler.cc \ + eh_terminate.cc \ + eh_tm.cc \ + eh_throw.cc \ + eh_type.cc \ + eh_unex_handler.cc \ + enum_type_info.cc \ + function_type_info.cc \ + fundamental_type_info.cc \ + guard.cc \ + guard_error.cc \ + hash_bytes.cc \ + nested_exception.cc \ + new_handler.cc \ + new_op.cc \ + new_opnt.cc \ + new_opv.cc \ + new_opvnt.cc \ + pbase_type_info.cc \ + pmem_type_info.cc \ + pointer_type_info.cc \ + pure.cc \ + si_class_type_info.cc \ + tinfo.cc \ + tinfo2.cc \ + vec.cc \ + vmi_class_type_info.cc \ + vterminate.cc + OBJECTS = $(patsubst %.cc, %.o, $(patsubst %.c, %.o, $(SOURCES))) @@ -76,29 +89,60 @@ OBJECTS = $(patsubst %.cc, %.o, $(patsubst %.c, %.o, $(SOURCES))) all:$(LIBRARY).a $(LIBRARY).a: $(OBJECTS) Makefile - $(AR) $(ARFLAGS) $(LIBRARY).a $(OBJECTS) - mv -f $(LIBRARY).a ../../../lib + $(AR) $(ARFLAGS) $(LIBRARY).a $(OBJECTS) + mv -f $(LIBRARY).a $(INSTALLDIR) + -%.o : %.c Makefile - $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< %.o : %.cc Makefile - $(CPP) $(CFLAGS) $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< + $(CXXCOMPILE) -o $@ $< -eh_ptr.o: eh_ptr.cc - $(CPP) $(CFLAGS) -std=gnu++0x $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< + +cp-demangle.o: cp-demangle.c + $(C_COMPILE) -DHAVE_CONFIG_H -D_USE_32BIT_TIME_T -DIN_GLIBCPP_V3 -Wno-error -o $@ $< + +bad_array_length.o: bad_array_length.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +bad_array_new.o: bad_array_new.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +eh_aux_runtime.o: eh_aux_runtime.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +eh_ptr.o: eh_ptr.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +eh_terminate.o: eh_terminate.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< eh_throw.o: eh_throw.cc - $(CPP) $(CFLAGS) -std=gnu++0x $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< + $(CXXCOMPILE) -std=gnu++11 -o $@ $< -guard.o: guard.cc - $(CPP) $(CFLAGS) -std=gnu++0x $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< +guard.o: guard.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< -atexit_thread.o: atexit_thread.cc - $(CPP) $(CFLAGS) -std=gnu++0x $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< +atexit_thread.o: atexit_thread.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +nested_exception.o: nested_exception.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +new_handler.o: new_handler.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +new_op.o: new_op.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +new_opnt.o: new_opnt.cc + $(CXXCOMPILE) -std=gnu++11 -o $@ $< + +del_ops.o: del_ops.cc + $(CXXCOMPILE) -std=gnu++14 -o $@ $< + +del_opvs.o: del_opvs.cc + $(CXXCOMPILE) -std=gnu++14 -o $@ $< -nested_exception.o: nested_exception.cc - $(CPP) $(CFLAGS) -std=gnu++0x $(CPPFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< clean: -rm -f *.o diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.c b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.c index 00dd58ad1..aef2e9b32 100644 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.c +++ b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.c @@ -2302,7 +2302,7 @@ cplus_demangle_type (struct d_info *di) *pret = d_function_type (di); } else - *pret = cplus_demangle_type (di); + *pret = cplus_demangle_type (di); if (!*pret) return NULL; if ((*pret)->type == DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS @@ -2397,11 +2397,11 @@ cplus_demangle_type (struct d_info *di) candidate. */ if (! di->is_conversion) { - if (! d_add_substitution (di, ret)) - return NULL; - ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, - d_template_args (di)); - } + if (! d_add_substitution (di, ret)) + return NULL; + ret = d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, ret, + d_template_args (di)); + } else { struct demangle_component *args; @@ -4109,7 +4109,7 @@ cplus_demangle_print_callback (int options, * sizeof (*dpi.copy_templates)); #endif - d_print_comp (&dpi, options, dc); + d_print_comp (&dpi, options, dc); } d_print_flush (&dpi); @@ -4334,7 +4334,7 @@ d_get_saved_scope (struct d_print_info *dpi, static void d_print_comp_inner (struct d_print_info *dpi, int options, - const struct demangle_component *dc) + const struct demangle_component *dc) { /* Magic variable to let reference smashing skip over the next modifier without needing to modify *dc. */ @@ -5785,9 +5785,9 @@ d_print_expr_op (struct d_print_info *dpi, int options, static void d_print_cast (struct d_print_info *dpi, int options, - const struct demangle_component *dc) + const struct demangle_component *dc) { - d_print_comp (dpi, options, d_left (dc)); + d_print_comp (dpi, options, d_left (dc)); } /* Print a conversion operator. */ @@ -5821,7 +5821,7 @@ d_print_conversion (struct d_print_info *dpi, int options, parameters from scope after printing the operator name, so we need to handle the template printing here. */ if (dpi->current_template != NULL) - dpi->templates = dpt.next; + dpi->templates = dpt.next; if (d_last_char (dpi) == '<') d_append_char (dpi, ' '); diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.h b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.h index ae635beb4..6fce0252d 100644 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.h +++ b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/cp-demangle.h @@ -122,6 +122,11 @@ struct d_info mangled name to the demangled name, such as standard substitutions and builtin types. */ int expansion; + /* Non-zero if we are parsing an expression. */ + int is_expression; + /* Non-zero if we are parsing the type operand of a conversion + operator, but not when in an expression. */ + int is_conversion; }; /* To avoid running past the ending '\0', don't: diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/demangle.h b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/demangle.h index 58bf547d5..7fa7557b2 100644 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/demangle.h +++ b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/demangle.h @@ -63,9 +63,10 @@ extern "C" { #define DMGL_EDG (1 << 13) #define DMGL_GNU_V3 (1 << 14) #define DMGL_GNAT (1 << 15) +#define DMGL_DLANG (1 << 16) /* If none of these are set, use 'current_demangling_style' as the default. */ -#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT) +#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT|DMGL_DLANG) /* Enumeration of possible demangling styles. @@ -87,7 +88,8 @@ extern enum demangling_styles edg_demangling = DMGL_EDG, gnu_v3_demangling = DMGL_GNU_V3, java_demangling = DMGL_JAVA, - gnat_demangling = DMGL_GNAT + gnat_demangling = DMGL_GNAT, + dlang_demangling = DMGL_DLANG } current_demangling_style; /* Define string names for the various demangling styles. */ @@ -102,6 +104,7 @@ extern enum demangling_styles #define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3" #define JAVA_DEMANGLING_STYLE_STRING "java" #define GNAT_DEMANGLING_STYLE_STRING "gnat" +#define DLANG_DEMANGLING_STYLE_STRING "dlang" /* Some macros to test what demangling style is active. */ @@ -115,6 +118,7 @@ extern enum demangling_styles #define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3) #define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA) #define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT) +#define DLANG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_DLANG) /* Provide information about the available demangle styles. This code is pulled from gdb into libiberty because it is useful to binutils also. */ @@ -169,10 +173,17 @@ java_demangle_v3 (const char *mangled); char * ada_demangle (const char *mangled, int options); +extern char * +dlang_demangle (const char *mangled, int options); + enum gnu_v3_ctor_kinds { gnu_v3_complete_object_ctor = 1, gnu_v3_base_object_ctor, gnu_v3_complete_object_allocating_ctor, + /* These are not part of the V3 ABI. Unified constructors are generated + as a speed-for-space optimization when the -fdeclone-ctor-dtor option + is used, and are always internal symbols. */ + gnu_v3_unified_ctor, gnu_v3_object_ctor_group }; @@ -188,6 +199,10 @@ enum gnu_v3_dtor_kinds { gnu_v3_deleting_dtor = 1, gnu_v3_complete_object_dtor, gnu_v3_base_object_dtor, + /* These are not part of the V3 ABI. Unified destructors are generated + as a speed-for-space optimization when the -fdeclone-ctor-dtor option + is used, and are always internal symbols. */ + gnu_v3_unified_dtor, gnu_v3_object_dtor_group }; @@ -365,6 +380,10 @@ enum demangle_component_type /* A typecast, represented as a unary operator. The one subtree is the type to which the argument should be cast. */ DEMANGLE_COMPONENT_CAST, + /* A conversion operator, represented as a unary operator. The one + subtree is the type to which the argument should be converted + to. */ + DEMANGLE_COMPONENT_CONVERSION, /* A nullary expression. The left subtree is the operator. */ DEMANGLE_COMPONENT_NULLARY, /* A unary expression. The left subtree is the operator, and the diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/gthr_mutex.c b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/gthr_mutex.c deleted file mode 100644 index f5cb8eb1a..000000000 --- a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/gthr_mutex.c +++ /dev/null @@ -1,150 +0,0 @@ -#include -#include -#include - -void __mutex_lock(volatile int *val); - -static inline int tls_get(int key) -{ - int val; - __asm__ __volatile__( - "movl %%fs:(%1), %0" - :"=r"(val) - :"r"(key)); - - return val; -}; - -typedef struct { - int done; - long started; -} __gthread_once_t; - -typedef struct { - int counter; - void *sema; -} __gthread_mutex_t; - -typedef struct { - int counter; - int depth; - unsigned long owner; - int sema; -} __gthread_recursive_mutex_t; - - -int -__gthr_win32_once (__gthread_once_t *once, void (*func) (void)) -{ - if (once == NULL || func == NULL) - return EINVAL; - - if (! once->done) - { - if (__sync_add_and_fetch (&(once->started), 1) == 0) - { - (*func) (); - once->done = 1; - } - else - { - /* Another thread is currently executing the code, so wait for it - to finish; yield the CPU in the meantime. If performance - does become an issue, the solution is to use an Event that - we wait on here (and set above), but that implies a place to - create the event before this routine is called. */ - while (! once->done) - delay(1); - } - } - return 0; -} - -void __gthr_win32_mutex_init_function (__gthread_mutex_t *mutex) -{ - mutex->counter = 0; - mutex->sema = 0; -} - -int __gthr_win32_mutex_lock (__gthread_mutex_t *mutex) -{ - __mutex_lock(&mutex->counter); - return 0; -} - -int -__gthr_win32_mutex_unlock (__gthread_mutex_t *mutex) -{ - mutex->counter = 0; - return 0; -} - -void -__gthr_win32_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex) -{ - mutex->counter = -1; - mutex->depth = 0; - mutex->owner = 0; - mutex->sema = 0; -} - -void -__gthr_win32_mutex_destroy (__gthread_mutex_t *mutex) -{ } - -int -__gthr_win32_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) -{ - int me = tls_get(0); - if ( __sync_add_and_fetch(&mutex->counter, 1) == 0) - { - mutex->depth = 1; - mutex->owner = me; - mutex->sema = 1; - } - else if (mutex->owner == me) - { - __sync_sub_and_fetch(&mutex->counter, 1); - ++(mutex->depth); - } - else - { - __mutex_lock(&mutex->sema); - mutex->depth = 1; - mutex->owner = me; - } - return 0; -} - -int -__gthr_win32_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex) -{ - int me = tls_get(0); - if (__sync_val_compare_and_swap (&mutex->counter, -1, 0) < 0) - { - mutex->depth = 1; - mutex->owner = me; - mutex->sema = 1; - } - else if (mutex->owner == me) - ++(mutex->depth); - else - return 1; - - return 0; -} - -int -__gthr_win32_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) -{ - --(mutex->depth); - if (mutex->depth == 0) - { - mutex->owner = 0; - - if (__sync_sub_and_fetch (&mutex->counter, 1) >= 0) - mutex->sema = 0; - } - - return 0; -} diff --git a/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/vterminate.idb b/contrib/toolchain/gcc/5x/libstdc++-v3/libsupc++/vterminate.idb deleted file mode 100644 index 0c32e179ff45d694871fb730d2f6568073ca204c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131222 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