Message ID | ebc5b615-b75a-443e-94be-7be27b95888d@gmail.com |
---|---|
State | New |
Headers | show |
Series | [committed,_GLIBCXX_INLINE_VERSION] Fix constract violation | expand |
On Sun, 29 Oct 2023 at 21:11, François Dumont <frs.dumont@gmail.com> wrote: > > This fixes handle_contract_violation under versioned namespace mode. > > Tested under Linux x64 and confirmed to also fix Darwin build. > > libstdc++: [_GLIBCXX_INLINE_VERSION] Provide handle_contract_violation > symbol > > libstdc++-v3/ChangeLog: > > * src/experimental/contract.cc > [_GLIBCXX_INLINE_VERSION](handle_contract_violation): Provide > symbol > without version namespace decoration for gcc. >+#if _GLIBCXX_INLINE_VERSION >+// Provide symbol without version namespace decoration for gcc. For the comment in the code, I think this would be better: // The compiler expects the contract_violation class to be in an unversioned // namespace, so provide a forwarding function with the expected symbol name. Do we want the forwarding function to be a weak symbol? The main handler function is weak because we want users to be able to override it with their own handler. But for this new forwarding function, they can't even declare it (because it has a reserved name that doesn't demangle to a valid type for the versioned namespace build).
On 30/10/2023 14:45, Jonathan Wakely wrote: > On Sun, 29 Oct 2023 at 21:11, François Dumont <frs.dumont@gmail.com> wrote: >> This fixes handle_contract_violation under versioned namespace mode. >> >> Tested under Linux x64 and confirmed to also fix Darwin build. >> >> libstdc++: [_GLIBCXX_INLINE_VERSION] Provide handle_contract_violation >> symbol >> >> libstdc++-v3/ChangeLog: >> >> * src/experimental/contract.cc >> [_GLIBCXX_INLINE_VERSION](handle_contract_violation): Provide >> symbol >> without version namespace decoration for gcc. >> +#if _GLIBCXX_INLINE_VERSION >> +// Provide symbol without version namespace decoration for gcc. > For the comment in the code, I think this would be better: > > // The compiler expects the contract_violation class to be in an unversioned > // namespace, so provide a forwarding function with the expected symbol name. Sure, I'll update it. > Do we want the forwarding function to be a weak symbol? The main > handler function is weak because we want users to be able to override > it with their own handler. But for this new forwarding function, they > can't even declare it (because it has a reserved name that doesn't > demangle to a valid type for the versioned namespace build). > Good point, I see no reason neither so I'll remove it.
On Mon, 30 Oct 2023, 18:31 François Dumont, <frs.dumont@gmail.com> wrote: > > On 30/10/2023 14:45, Jonathan Wakely wrote: > > On Sun, 29 Oct 2023 at 21:11, François Dumont <frs.dumont@gmail.com> > wrote: > >> This fixes handle_contract_violation under versioned namespace mode. > >> > >> Tested under Linux x64 and confirmed to also fix Darwin build. > >> > >> libstdc++: [_GLIBCXX_INLINE_VERSION] Provide handle_contract_violation > >> symbol > >> > >> libstdc++-v3/ChangeLog: > >> > >> * src/experimental/contract.cc > >> [_GLIBCXX_INLINE_VERSION](handle_contract_violation): Provide > >> symbol > >> without version namespace decoration for gcc. > >> +#if _GLIBCXX_INLINE_VERSION > >> +// Provide symbol without version namespace decoration for gcc. > > For the comment in the code, I think this would be better: > > > > // The compiler expects the contract_violation class to be in an > unversioned > > // namespace, so provide a forwarding function with the expected symbol > name. > Sure, I'll update it. > > Do we want the forwarding function to be a weak symbol? The main > > handler function is weak because we want users to be able to override > > it with their own handler. But for this new forwarding function, they > > can't even declare it (because it has a reserved name that doesn't > > demangle to a valid type for the versioned namespace build). > > > Good point, I see no reason neither so I'll remove it. > Thanks, looks good for trunk (and gcc-13 maybe?) with that change. >
diff --git a/libstdc++-v3/src/experimental/contract.cc b/libstdc++-v3/src/experimental/contract.cc index 504a6c041f1..d550b49c4eb 100644 --- a/libstdc++-v3/src/experimental/contract.cc +++ b/libstdc++-v3/src/experimental/contract.cc @@ -67,3 +67,11 @@ handle_contract_violation (const std::experimental::contract_violation &violatio std::cerr << std::endl; #endif } + +#if _GLIBCXX_INLINE_VERSION +// Provide symbol without version namespace decoration for gcc. +extern "C" __attribute__ ((weak)) void +_Z25handle_contract_violationRKNSt12experimental18contract_violationE +(const std::experimental::contract_violation &violation) +{ handle_contract_violation(violation); } +#endif