public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types
@ 2022-03-08  8:07 alex.wabik at gmail dot com
  2022-03-08  8:12 ` [Bug c++/104834] " alex.wabik at gmail dot com
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: alex.wabik at gmail dot com @ 2022-03-08  8:07 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

            Bug ID: 104834
           Summary: visibility=hidden ignored for template instantiations
                    for certain dependent types
           Product: gcc
           Version: 11.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: alex.wabik at gmail dot com
  Target Milestone: ---

Created attachment 52579
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=52579&action=edit
Testcase

Public visibility templates generate instances with public visiblity if a
template parameter is an enum or class enum declared in the translation unit
which uses -fvisibility=hidden, or even explicitly marked with hidden
visibility attribute.

This behaviour does not reproduce on clang, which will only instantiate public
template if the enum has attribute visibility=default, otherwise the
instantiated template has hidden visibility.

The std::thread's constructor instantiates the std::thread::_State_impl type,
which generates functions with default visibility if std::thread is constructed
with a lambda defined in the hidden-visiblity class. This behaviour also does
not reproduce on clang.

I have also seen similar problems with std::function's template constructor,
and with future base instantiations when using std::async, but I was not able
to produce a minimal testcase; The testcase I attach demonstrates the problem
for enums and std::thread only.

The workaround for the enum problem and the lambda problem is to define these
types in the anonymous namespace.

Attaching the test code. Inspecting the compiled object reveals the following
default visibility symbols, which I believe should be hidden:

std::thread::_State_impl<std::thread::_Invoker<std::tuple<ThreadTest::ThreadTest()::{lambda()#1}>
> >::~_State_impl() where the whole ThreadTest class has hidden visibility.

aaa::Wrapper<ThisIsEnum>::get() where the ThisIsEnum type is an enum with
hidden visibility.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
@ 2022-03-08  8:12 ` alex.wabik at gmail dot com
  2022-03-08  8:26 ` pinskia at gcc dot gnu.org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: alex.wabik at gmail dot com @ 2022-03-08  8:12 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

--- Comment #1 from Aleksander Wabik <alex.wabik at gmail dot com> ---
Default visiblity symbols in the object file generated by the compilation:

- in GCC:
$ readelf -sW test.o | grep -v UND | grep -v SECTION | grep  DEFAULT
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.cc
    10: 0000000000000000    40 FUNC    LOCAL  DEFAULT   21 _Z7PubFuncv.cold
    30: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    2
_ZNSt6thread11_State_implINS_8_InvokerISt5tupleIJZN10ThreadTestC4EvEUlvE_EEEEED5Ev
    46: 0000000000000000    40 OBJECT  WEAK   DEFAULT   31
_ZTVNSt6thread11_State_implINS_8_InvokerISt5tupleIJZN10ThreadTestC4EvEUlvE_EEEEEE
    51: 0000000000000000   127 FUNC    GLOBAL DEFAULT   12 _Z7PubFuncv
    60: 0000000000000000     4 FUNC    WEAK   DEFAULT   24
_ZN3aaa7WrapperI12PublicStructE3getEv
    62: 0000000000000000     4 FUNC    WEAK   DEFAULT   26
_ZN3aaa7WrapperI10ThisIsEnumE3getEv
    63: 0000000000000000     4 FUNC    WEAK   DEFAULT   27
_ZN3aaa7WrapperI10PublicEnumE3getEv

- in clang:
$ readelf -sW test.o | grep -v UND | grep -v SECTION | grep  DEFAULT
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.cc
     2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table0
    21: 0000000000000000   151 FUNC    GLOBAL DEFAULT    2 _Z7PubFuncv
    22: 0000000000000000     4 FUNC    WEAK   DEFAULT   12
_ZN3aaa7WrapperI10PublicEnumE3getEv
    25: 0000000000000000     4 FUNC    WEAK   DEFAULT    6
_ZN3aaa7WrapperI12PublicStructE3getEv

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
  2022-03-08  8:12 ` [Bug c++/104834] " alex.wabik at gmail dot com
@ 2022-03-08  8:26 ` pinskia at gcc dot gnu.org
  2022-03-08  8:27 ` rguenth at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-03-08  8:26 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Note I think it is the vtable for std::thread::_State_impl which looks broken
and not the deconstructor.
Note I think there are different issues here too and not really related to
another one.
The enum issue is seperate from the vtable issue.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
  2022-03-08  8:12 ` [Bug c++/104834] " alex.wabik at gmail dot com
  2022-03-08  8:26 ` pinskia at gcc dot gnu.org
@ 2022-03-08  8:27 ` rguenth at gcc dot gnu.org
  2022-03-08  8:27 ` rguenth at gcc dot gnu.org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-03-08  8:27 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  Note that when not optimizing clang also gets you

     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.cc
     2: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table0
     3: 0000000000000010     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table11
     4: 0000000000000028     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table15
     5: 000000000000003c     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table16
     6: 0000000000000050     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table18
     7: 0000000000000064     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table37
     8: 0000000000000078     0 NOTYPE  LOCAL  DEFAULT    4 GCC_except_table47
    69: 0000000000000000    78 FUNC    GLOBAL DEFAULT    2 _Z7PubFuncv
    73: 0000000000000000    14 FUNC    WEAK   DEFAULT   21
_ZN3aaa7WrapperI10PublicEnumE3getEv
    76: 0000000000000000    14 FUNC    WEAK   DEFAULT   15
_ZN3aaa7WrapperI12PublicStructE3getEv
   116: 0000000000000000    27 FUNC    WEAK   DEFAULT  121
_ZSt12__get_helperILm0EPNSt6thread6_StateEJSt14default_deleteIS1_EEERT0_RSt11_Tuple_implIXT_EJS5_DpT1_EE
   118: 0000000000000000    27 FUNC    WEAK   DEFAULT  142
_ZSt12__get_helperILm1ESt14default_deleteINSt6thread6_StateEEJEERT0_RSt11_Tuple_implIXT_EJS4_DpT1_EE
   120: 0000000000000000    30 FUNC    WEAK   DEFAULT  118
_ZSt3getILm0EJPNSt6thread6_StateESt14default_deleteIS1_EEERNSt13tuple_elementIXT_ESt5tupleIJDpT0_EEE4typeERS9_
   122: 0000000000000000    30 FUNC    WEAK   DEFAULT  139
_ZSt3getILm1EJPNSt6thread6_StateESt14default_deleteIS1_EEERNSt13tuple_elementIXT_ESt5tupleIJDpT0_EEE4typeERS9_
   123: 0000000000000000    14 FUNC    WEAK   DEFAULT  134
_ZSt4moveIRPNSt6thread6_StateEEONSt16remove_referenceIT_E4typeEOS5_
   128: 0000000000000000    31 FUNC    WEAK   DEFAULT  156
_ZSteqNSt6thread2idES0_

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
                   ` (2 preceding siblings ...)
  2022-03-08  8:27 ` rguenth at gcc dot gnu.org
@ 2022-03-08  8:27 ` rguenth at gcc dot gnu.org
  2022-03-08  8:28 ` pinskia at gcc dot gnu.org
  2022-03-08  8:35 ` alex.wabik at gmail dot com
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-03-08  8:27 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2022-03-08
      Known to fail|                            |11.2.0, 12.0, 7.5.0
           Keywords|                            |ABI

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
                   ` (3 preceding siblings ...)
  2022-03-08  8:27 ` rguenth at gcc dot gnu.org
@ 2022-03-08  8:28 ` pinskia at gcc dot gnu.org
  2022-03-08  8:35 ` alex.wabik at gmail dot com
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-03-08  8:28 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Oh also the deconstructor has a local symbol so can be safely ignored.
But the vtable is the bug though.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c++/104834] visibility=hidden ignored for template instantiations for certain dependent types
  2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
                   ` (4 preceding siblings ...)
  2022-03-08  8:28 ` pinskia at gcc dot gnu.org
@ 2022-03-08  8:35 ` alex.wabik at gmail dot com
  5 siblings, 0 replies; 7+ messages in thread
From: alex.wabik at gmail dot com @ 2022-03-08  8:35 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104834

--- Comment #5 from Aleksander Wabik <alex.wabik at gmail dot com> ---
(In reply to Andrew Pinski from comment #2)
> The enum issue is seperate from the vtable issue.

Should I create separate bug for that then?

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-03-08  8:35 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-08  8:07 [Bug c++/104834] New: visibility=hidden ignored for template instantiations for certain dependent types alex.wabik at gmail dot com
2022-03-08  8:12 ` [Bug c++/104834] " alex.wabik at gmail dot com
2022-03-08  8:26 ` pinskia at gcc dot gnu.org
2022-03-08  8:27 ` rguenth at gcc dot gnu.org
2022-03-08  8:27 ` rguenth at gcc dot gnu.org
2022-03-08  8:28 ` pinskia at gcc dot gnu.org
2022-03-08  8:35 ` alex.wabik at gmail dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).