Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 02 Feb 1997 10:39:52 -0500
From:      Bakul Shah <bakul@torrentnet.com>
To:        "Eric J. Chet" <ejc@gargoyle.bazzle.com>
Cc:        Terry Lambert <terry@lambert.org>, hackers@FreeBSD.ORG
Subject:   Re: g++, STL and -frepo on FreeBSD-2.2-Beta 
Message-ID:  <199702021539.KAA21607@chai.plexuscom.com>
In-Reply-To: Your message of "Fri, 31 Jan 1997 23:42:36 EST." <Pine.BSF.3.95.970131231640.15472A-100000@gargoyle.bazzle.com> 

next in thread | previous in thread | raw e-mail | index | archive | help
Terry Lambert writes:

> > g++ -frepo -c x.cc		<========== this succeeds
> > g++ -frepo -o x x.o		<========== this fails
	...
> Clearly, the template class definition
> 
> 	template <class Type>
> 	class list ... {
> 		...
> 	};
> 
> is not in scope.  The header files you have included are apparently
> not sufficient.

If this were the case the compile phase would fail but it does not.
The <stl.h> file includes a file where the list template is defined.

> 	The -frepo patches don't work on our version of the g++ and 
> ld.  I assume ld is the problem.  I haven't had the time to take a look 
> to see what needs to be changed. The -frepo patch from Cygnus when
> applied, should create a set of *.ii one for each source file complied 
> from g++.  The *.ii files specify all templates that need to be 
> instantiated before linking can take place.  I believe there is a collect2
> module that performs the instantiations task.  

I started with the *stock* gcc-2.7.2 distribution (+ 2.7.2-2.7.2.1
diff), not the one in the FreeBSD source tree.

The -frepo patch generates a .rpo file.  In the test case I posted
this .rpo file contains lines like

A -frepo -c
...
O distance_type__FRCQ2t4list1Zi8iterator
O splice__t4list1ZiGQ2t4list1Zi8iteratorRt4list1ZiT1T1
O splice__t4list1ZiGQ2t4list1Zi8iteratorRt4list1ZiT1
O splice__t4list1ZiGQ2t4list1Zi8iteratorRt4list1Zi
...

The ld in /usr/local/lib/gcc-lib/i386-unknown-freebsd2.2/2.7.2.1/ is
apparently the collect2 module, which, I presume, looks at the
.rpo files to find out what classes need to be instantiated.  At
I indicated earlier, g++ -v shows this is the ld called.  Perhaps
this ld fails?  That is where I will look next.

> 	I do know that if you build g++ with John Polstra's ELF patches
> and the -frepo patches.  Then template repository works as advertised.

Where do I find John's ELF patches?

> 	On the other hand, the only thing you lose by not having the
> repository with our native compiler is executable size.  The compiler
> will instantiated every template used in a object file and include it in
> that object file.  Meaning, you can have duplicate template instantiations
> across different object files.

This appears not to be the case.  Are there any flags which make
this possible?  Does libg++-2.7.1 have to be compiled with any
special flags or defines?

Thanks for your responses.

-- bakul



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199702021539.KAA21607>