From nobody@FreeBSD.org  Sun Dec 17 08:52:13 2000
Return-Path: <nobody@FreeBSD.org>
Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21])
	by hub.freebsd.org (Postfix) with ESMTP id CABCE37B400
	for <freebsd-gnats-submit@FreeBSD.org>; Sun, 17 Dec 2000 08:52:12 -0800 (PST)
Received: (from nobody@localhost)
	by freefall.freebsd.org (8.11.1/8.11.1) id eBHGqCf10642;
	Sun, 17 Dec 2000 08:52:12 -0800 (PST)
	(envelope-from nobody)
Message-Id: <200012171652.eBHGqCf10642@freefall.freebsd.org>
Date: Sun, 17 Dec 2000 08:52:12 -0800 (PST)
From: yakisoba@f2.dion.ne.jp
Sender: nobody@FreeBSD.org
To: freebsd-gnats-submit@FreeBSD.org
Subject: Merge libgcc_r with libgcc
X-Send-Pr-Version: www-1.0

>Number:         23598
>Category:       gnu
>Synopsis:       Merge libgcc_r with libgcc
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Dec 17 09:00:01 PST 2000
>Closed-Date:    Tue Apr 01 04:37:56 PST 2003
>Last-Modified:  Tue Apr 01 04:37:56 PST 2003
>Originator:     Naohiko Tsuji
>Release:        FreeBSD 4.2-STABLE i386
>Organization:
>Environment:
>Description:
Building "shared" libraries with pthread, we always need "-pthread" flag.

To avoid the flag "-pthread" ...

 1. Create stubs and link it. This stubs for the library and "libgcc_r".
   I thought "libgcc_r-stubs.c" needs for all "shared" libraries with pthread.

   Stub, stub, stub ... I hate this way.

 2. Add weak directive for the library, but cannot for "libgcc_r" without
   hack FreeBSD source tree.

 I found this problem, building libstdc++-v3 on MY make tree.
On merging GCC 3.0 I think this problem will happen.


>How-To-Repeat:

>Fix:
Checking ...

 1. 2.2.0-RELEASE or later has weak directive.

 2. "gthr-posix.h" is ready to make weak symbols.
    If "ASM_WEAKEN_LABEL" is defined in Target Macro file, 
   "SUPPORTS_WEAK 1" is defined in "default.h".
   Then "GTHREAD_USE_WEAK 1" is defined in "gthr.h".
   So "gthr-posix.h" make weak symbols.

 So we can merge "libgcc_r" with "libgcc". I think we should do that
like "gcc/Makefile" generated by configure script.

 1. Add the next line into "config/freebsd.h".

      #ifdef IN_LIBGCC2
      #ifndef __GTHREAD_MUTEX_INIT_FUNCTION
      #define __GTHREAD_MUTEX_INIT_FUNCTION(m) \
	do {                           \
	  pthread_mutex_init (m, NULL) \
        } while (0)
      #endif
      #endif /* IN_LIBGCC2 */

 2. Improve "gnu/usr.bin/cc/cc_tools/freebsd-native.h"

      #define LIBGCC_SPEC "libgcc%{shared:_pic}.a%s"

 3. Create "gthr-default.h" in "gnu/usr.bin/cc/cc_tools" directory.

      gthr-default.h:
      #include "gthr-posix.h"

    This header file is generated by configure script.
  
 4. Add the next line into "gnu/usr.bin/lib/libgcc/Makefile".

      CFLAGS += -DHAVE_GTHR_DEFAULT
      CFLAGS += -DIN_LIBGCC2

    This is same as "gcc/Makefile" generated by configure script.
   
 5. Remove "libgcc_r" from "Makefile.inc1" and "gnu/lib/Makefile".

1 for "Native" and "Ports"
2-5 for "Native" only

P.S.
  No need of my PR/23002 because of this PR. Please remove it.
  See my PR/19327 for a.out and I hope to commit it together.


>Release-Note:
>Audit-Trail:

From: Naohiko Tsuji <yakisoba@f2.dion.ne.jp>
To: freebsd-gnats-submit@FreeBSD.org
Cc:  
Subject: Re: gnu/23598: Merge libgcc_r with libgcc
Date: Tue, 19 Dec 2000 15:39:46 +0900

 >  Sorry, missing "pthread_mutex_init" weak symbol.
 > If we need "__GTHREAD_MUTEX_INIT_FUNCTION", hacking "gcc/gthr-posix.h".
 > So new Fix 1+ instead of previous Fix 1, and new Fix 1.1.
 > 
 >  1+. Add the next line into "config/freebsd.h".
 > 
 >       #ifdef IN_LIBGCC2
 >       #ifndef __GTHREAD_MUTEX_INIT_FUNCTION
 >       #define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function
 >       #endif
 >       #endif /* IN_LIBGCC2 */
 > 
 >  1.1. Improve "contrib/gcc/gthr-posix.h".
 > 
 >       *** gcc/gthr-posix.h.orig
 >       --- gcc/gthr-posix.h
 >       ***************
 >       *** 56,61 ****
 >       --- 56,65 ----
 >         #pragma weak pthread_mutex_trylock 
 >         #pragma weak pthread_mutex_unlock 
 >         
 >       + #ifdef	__GTHREAD_MUTEX_INIT_FUNCTION
 >       + #pragma weak pthread_mutex_init
 >       + #endif
 >       + 
 >         static void *__gthread_active_ptr = &pthread_create;
 >         
 >         static inline int
 >       ***************
 >       *** 142,147 ****
 >       --- 146,157 ----
 >             return pthread_mutex_unlock (mutex);
 >           else
 >             return 0;
 >       + }
 >       + 
 >       + static inline void
 >       + __gthread_mutex_init_function (__gthread_mutex_t *mutex)
 >       + {
 >       +   pthread_mutex_init (mutex, NULL);
 >         }
 >         
 >         #endif /* not __gthr_posix_h */
 
 

From: Naohiko Tsuji <yakisoba@osaka.interq.or.jp>
To: freebsd-gnats-submit@FreeBSD.org
Cc:  
Subject: Re: gnu/23598: Merge libgcc_r with libgcc
Date: Fri, 22 Dec 2000 02:50:33 +0900

  So sorry, building in the GCC original make tree is fine,
 but "make buildworld" in the FreeBSD make tree is not.
  I have to improve "gnu/lib/libgcc/Makefile". But I rewrite it
 because of some reasons.
 
   * Use some header files in the "gnu/usr.bin/cc/cc_tools".
   * "make depend" work fine.
   * XCC -> CC for libgcc2, CC -> OLDCC for libgcc1 if need it.
   * Use <bsd.lib.mk> rules as we can.
   * -p, CXX, XCXX is confused.
 
 --- BEGIN gnu/lib/libgcc/Makefile ---
 # $FreeBSD$
 
 GCCDIR=	${.CURDIR}/../../../contrib/gcc
 XCCDIR=	../../usr.bin/cc
 
 .PATH: ${GCCDIR}/cp ${GCCDIR}
 
 LIB=	gcc
 
 # Install libgcc_pic.a, since ld.so uses it.
 INSTALL_PIC_ARCHIVE=  yes
 
 #
 # XXX This is a hack, but it seems to work.  libgcc1.a is supposed to be
 # compiled by the native compiler, and libgcc2.a is meant to be compiled
 # by *this* version of gcc.
 #
 # Normally, this does not make any difference, since we only have gcc, but
 # when bootstrapping from gcc-2.6.3, we have to use the freshly built 2.7.2
 # compiler for some of the libgcc2.c __attribute__ stuff.
 #
 OLDCC?=	${CC}
 CCLIBFLAGS?= -O
 
 # Members of libgcc1.a.
 LIB1FUNCS= _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 \
 	   _lshrsi3 _ashrsi3 _ashlsi3 \
 	   _divdf3 _muldf3 _negdf2 _adddf3 _subdf3 \
 	   _fixdfsi _fixsfsi _floatsidf _floatsisf _truncdfsf2 _extendsfdf2 \
 	   _addsf3 _negsf2 _subsf3 _mulsf3 _divsf3 \
 	   _eqdf2 _nedf2 _gtdf2 _gedf2 _ltdf2 _ledf2 \
 	   _eqsf2 _nesf2 _gtsf2 _gesf2 _ltsf2 _lesf2
 
 # Library members defined in libgcc2.c.
 LIB2FUNCS= _muldi3 _divdi3 _moddi3 _udivdi3 _umoddi3 _negdi2 \
 	   _lshrdi3 _ashldi3 _ashrdi3 _ffsdi2 \
 	   _udiv_w_sdiv _udivmoddi4 _cmpdi2 _ucmpdi2 _floatdidf _floatdisf \
 	   _fixunsdfsi _fixunssfsi _fixunsdfdi _fixdfdi _fixunssfdi _fixsfdi \
 	   _fixxfdi _fixunsxfdi _floatdixf _fixunsxfsi \
 	   _fixtfdi _fixunstfdi _floatditf \
 	   __gcc_bcmp _varargs __dummy _eprintf \
 	   _bb _shtab _clear_cache _trampoline __main _exit _ctors \
 	   _eh _pure
 
 # Library members defined in new1.cc.
 NEW1FUNCS= _op_new _op_newnt 
 
 # Library members defined in new2.cc.
 NEW2FUNCS= _op_vnew _op_vnewnt _op_delete _op_delnt _op_vdel _op_vdelnt 
 
 SRCS=	${LIB1FUNCS:S/$/.c/}
 SRCS+=	${LIB2FUNCS:S/$/.c/}
 SRCS+=	frame.c
 .if !defined(NO_CXX)
 SRCS+=	${NEW1FUNCS:S/$/.cc/}
 SRCS+=	${NEW2FUNCS:S/$/.cc/}
 SRCS+=	tinfo.cc tinfo2.cc new.cc exception.cc
 .endif
 
 INCLUDES=
 .if exists(${.OBJDIR}/${XCCDIR}/cc_tools)
 INCLUDES+=	-I${.OBJDIR}/${XCCDIR}/cc_tools
 .endif
 INCLUDES+=	-I${.CURDIR}/${XCCDIR}/cc_tools
 INCLUDES+=	-I${GCCDIR}/config -I${GCCDIR}
 
 CFLAGS+=	-fexceptions
 CFLAGS+=	-DIN_GCC
 CFLAGS+=	-DIN_LIBGCC2
 CFLAGS+=	-DHAVE_GTHR_DEFAULT
 .if !defined(NO_CXX)
 CFLAGS+=	-nostdinc++
 CFLAGS+=	-I${GCCDIR}/cp/inc
 .endif
 CFLAGS+=	${INCLUDES}
 
 ${LIB1FUNCS:S/$/.c/}: ${GCCDIR}/libgcc1.c
 	@rm -f ${.TARGET}
 	@echo "#define L${.PREFIX}" > ${.TARGET}
 	@cat ${GCCDIR}/libgcc1.c >> ${.TARGET}
 
 CLEANFILES +=	${LIB1FUNCS:S/$/.c/}
 
 ${LIB1FUNCS:S/$/.o/}:
 	${OLDCC} ${CCLIBFLAGS} ${INCLUDES} -c ${.IMPSRC} -o ${.TARGET}
 	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
 	@mv ${.TARGET}.tmp ${.TARGET}
 
 ${LIB1FUNCS:S/$/.po/}:
 	${OLDCC} -pg ${CCLIBFLAGS} ${INCLUDES} -c ${.IMPSRC} -o ${.TARGET}
 	@${LD} -o ${.TARGET}.tmp -X -r ${.TARGET}
 	@mv ${.TARGET}.tmp ${.TARGET}
 
 ${LIB1FUNCS:S/$/.So/}:
 	${OLDCC} ${PICFLAG} -DPIC ${CCLIBFLAGS} ${INCLUDES} -c ${.IMPSRC} -o ${.TARGET}
 	@${LD} -o ${.TARGET}.tmp -x -r ${.TARGET}
 	@mv ${.TARGET}.tmp ${.TARGET}
 
 ${LIB2FUNCS:S/$/.c/}: ${GCCDIR}/libgcc2.c
 	@rm -f ${.TARGET}
 	@echo "#define L${.PREFIX}" > ${.TARGET}
 	@cat ${GCCDIR}/libgcc2.c >> ${.TARGET}
 
 CLEANFILES +=	${LIB2FUNCS:S/$/.c/}
 
 ${NEW1FUNCS:S/$/.cc/}: ${GCCDIR}/cp/new1.cc
 	@rm -f ${.TARGET}
 	@echo "#define L${.PREFIX}" > ${.TARGET}
 	@cat ${GCCDIR}/cp/new1.cc >> ${.TARGET}
 
 CLEANFILES +=	${NEW1FUNCS:S/$/.cc/}
 
 ${NEW2FUNCS:S/$/.cc/}: ${GCCDIR}/cp/new2.cc
 	@rm -f ${.TARGET}
 	@echo "#define L${.PREFIX}" > ${.TARGET}
 	@cat ${GCCDIR}/cp/new2.cc >> ${.TARGET}
 
 CLEANFILES +=	${NEW2FUNCS:S/$/.cc/}
 
 .include <bsd.lib.mk>
 --- END gnu/lib/libgcc/Makefile ---
 
 
Responsible-Changed-From-To: freebsd-bugs->obrien 
Responsible-Changed-By: sobomax 
Responsible-Changed-When: Tue May 29 08:12:39 PDT 2001 
Responsible-Changed-Why:  
Over to gcc maintainer. 

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=23598 
Responsible-Changed-From-To: obrien->freebsd-bugs 
Responsible-Changed-By: obrien 
Responsible-Changed-When: Mon Sep 10 09:32:58 PDT 2001 
Responsible-Changed-Why:  

http://www.FreeBSD.org/cgi/query-pr.cgi?pr=23598 
State-Changed-From-To: open->closed 
State-Changed-By: gerald 
State-Changed-When: Tue Apr 1 04:35:36 PST 2003 
State-Changed-Why:  
According to Alexander Kabaev <kan@freebsd.org>, who is one of the folks 
looking after our imported GCC these days, this is not applicable/relevant 
any longer in that we use weak references in libgcc_r for quite some time 
already. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=23598 
>Unformatted:
