On Mon, Jul 8, 2019 at 2:04 PM Martin Liška <mli...@suse.cz> wrote:
>
> On 6/21/19 4:28 PM, Richard Biener wrote:
> > On Fri, Jun 21, 2019 at 4:13 PM Jakub Jelinek <ja...@redhat.com> wrote:
> >>
> >> On Fri, Jun 21, 2019 at 04:04:00PM +0200, Martin Liška wrote:
> >>> On 6/21/19 1:58 PM, Jakub Jelinek wrote:
> >>>> On Fri, Jun 21, 2019 at 01:52:09PM +0200, Martin Liška wrote:
> >>>>> On 6/21/19 1:47 PM, Jonathan Wakely wrote:
> >>>>>> On Fri, 21 Jun 2019 at 11:40, Martin Liška wrote:
> >>>>>>> Yes, I would be fine to deprecate that for GCC 10.1
> >>>>>>
> >>>>>> Would it be appropriate to issue a warning in GCC 10.x if the option 
> >>>>>> is used?
> >>>>>
> >>>>> Sure. With the patch attached one will see:
> >>>>>
> >>>>> $ gcc -frepo /tmp/main.cc -c
> >>>>> gcc: warning: switch ‘-frepo’ is no longer supported
> >>>>>
> >>>>> I'm sending patch that also removes -frepo tests from test-suite.
> >>>>> I've been testing the patch.
> >>>>
> >>>> IMHO for just deprecation of an option you don't want to remove it from 
> >>>> the
> >>>> testsuite, just match the warning it will generate in those tests, and
> >>>> I'm not convinced you want to remove it from the documentation (rather 
> >>>> than
> >>>> just saying in the documentation that the option is deprecated and might 
> >>>> be
> >>>> removed in a later GCC version).
> >>>
> >>> Agree with you. I'm sending updated version of the patch.
> >>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
> >>
> >> I'm also not convinced about the Deprecated flag, seems like that is a flag
> >> that we use for options that have been already removed.
> >> So, instead there should be some proper warning in the C++ FE for it,
> >> or just Warn.
> >
> > In principle -frepo is a nice idea - does it live up to its promises?  That 
> > is,
> > does it actually work, for example when throwing it on the libstdc++
> > testsuite or a larger C++ project?
>
> I've just tested tramp3d, and it does not survive linking:
>
> g++ tramp3d-v4.o
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> collect: recompiling tramp3d-v4.cpp
> collect: relinking
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function 
> `RefCountedBlockPtr<FieldEngineBaseData<3, Vector<3, double, Full>, 
> ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, double, 
> UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > >, false, 
> RefBlockController<FieldEngineBaseData<3, Vector<3, double, Full>, 
> ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, double, 
> UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > > > 
> >::RefCountedBlockPtr(RefCountedBlockPtr<FieldEngineBaseData<3, Vector<3, 
> double, Full>, ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, double, 
> UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > >, false, 
> RefBlockController<FieldEngineBaseData<3, Vector<3, double, Full>, 
> ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, double, 
> UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > > > > const&)':
> <artificial>:(.text+0x4181b): undefined reference to 
> `RefCountedPtr<RefBlockController<FieldEngineBaseData<3, Vector<3, double, 
> Full>, ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, double, 
> UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > > > 
> >::RefCountedPtr(RefCountedPtr<RefBlockController<FieldEngineBaseData<3, 
> Vector<3, double, Full>, ViewEngine<3, IndexFunction<GenericURM<MeshTraits<3, 
> double, UniformRectilinearTag, CartesianTag, 3> >::PositionsFunctor> > > > > 
> const&)'
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function `std::_Vector_base<Node<Range<3>, 
> Interval<3> >, std::allocator<Node<Range<3>, Interval<3> > > 
> >::_Vector_impl::~_Vector_impl()':
> <artificial>:(.text+0xc1890): undefined reference to 
> `std::allocator<Node<Range<3>, Interval<3> > >::~allocator()'
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function `std::_Vector_base<Node<Range<3>, 
> Interval<3> >, std::allocator<Node<Range<3>, Interval<3> > > 
> >::_Vector_base()':
> <artificial>:(.text+0xc18aa): undefined reference to 
> `std::_Vector_base<Node<Range<3>, Interval<3> >, 
> std::allocator<Node<Range<3>, Interval<3> > > >::_Vector_impl::_Vector_impl()'
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function `std::vector<INode<3>, 
> std::allocator<INode<3> > >::_S_use_relocate()':
> <artificial>:(.text+0xc496f): undefined reference to `std::vector<INode<3>, 
> std::allocator<INode<3> > >::_S_nothrow_relocate(std::integral_constant<bool, 
> true>)'
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function `std::_Vector_base<Node<Range<3>, 
> Interval<3> >, std::allocator<Node<Range<3>, Interval<3> > > 
> >::~_Vector_base()':
> <artificial>:(.text+0xc4cc1): undefined reference to 
> `std::_Vector_base<Node<Range<3>, Interval<3> >, 
> std::allocator<Node<Range<3>, Interval<3> > > >::_M_deallocate(Node<Range<3>, 
> Interval<3> >*, unsigned long)'
> /usr/lib64/gcc/x86_64-suse-linux/9/../../../../x86_64-suse-linux/bin/ld: 
> /tmp/ccEeuyj7.ltrans0.ltrans.o: in function `DataBlockPtr<double, 
> false>::DataBlockPtr()':
> <artificial>:(.text+0xc6f96): undefined reference to 
> `RefCountedBlockPtr<double, false, DataBlockController<double> 
> >::RefCountedBlockPtr()'
> [... many other undefined references ...]
>
> Same happens also for GCC7. It does 17 iteration (#define MAX_ITERATIONS 17) 
> and
> apparently 17 is not enough to resolve all symbols. And it's really slow.

Ouch.

> That said, I would recommend to remove it :)

In the end it's up to the C++ FE maintainers but the above clearly
doesn't look promising
(not sure if it keeps re-compiling _all_ repo-triggered templates or
just incrementally adds
them to new object files).

Also the docs suggest that -frepo is the only way to get template
instantiation commoning
if the target object format doesn't support sth like linkonce or
comdats.  Not sure if we need
to care though.  I don't remember any bugs about -frepo in many last
years but that could
be because it's perfect (well, it is not as seen above, but...).

I'm not opposed to removing -frepo from GCC 10 but then I would start
noting it is obsolete
on the GCC 9 branch at least.

Jason/Nathan?

Thanks,
Richard.

> Martin
>
> > The option doesn't document
> > optimization issues but I assume template bodies are not available
> > for IPA optimizations unless -frepo is combined with LTO where the
> > template CU[s] then bring them in.
> >
> > So I'm not sure - do we really want to remove this feature?
> >
> > Richard.
> >
> >>         Jakub
>

Reply via email to