[libcxx-commits] [PATCH] D103947: [libcxx] Fix using the vcruntime ABI with _HAS_EXCEPTIONS=0 defined

Martin Storsjö via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Sep 22 09:02:03 PDT 2021


mstorsjo added a comment.

In D103947#3015535 <https://reviews.llvm.org/D103947#3015535>, @ldionne wrote:

> In D103947#2989849 <https://reviews.llvm.org/D103947#2989849>, @phosek wrote:
>
>> In D103947#2915640 <https://reviews.llvm.org/D103947#2915640>, @phosek wrote:
>>
>>> In D103947#2911434 <https://reviews.llvm.org/D103947#2911434>, @mstorsjo wrote:
>>>
>>>>> To avoid this, would it be possible to provide an ABI-compatible `std::exception` class, and use that unconditionally when building on top of the VC runtime?
>>>>
>>>> Maybe that's possible - I haven't studied if their regular `std::exception` class does something funky or not.
>>>
>>> Their `std::exception` has two class members (one for the name string and other for what appears to be an deallocation flag) so we would need to conditionally modify the libc++ `std::exception` layout on Windows to match theirs.
>>
>> @ldionne Do you have any more thoughts on this? I'd like to get this change landed to enable the use of libc++ on Windows with `_HAS_EXCEPTIONS=0` but I don't know what's the direction we want to take.
>
> My understanding is that the core of the issue is:
>
>> If `_HAS_EXCEPTIONS` is set to 0, the `vcruntime_exception.h` header doesn't define the ABI base class `std::exception`.
>
> I think we should either always use our own `std::exception` class, or always use theirs (or an ABI compatible version of theirs when exceptions are disabled). To be more concrete, today we have this in `<exception>`:
>
>   #if !defined(_LIBCPP_ABI_VCRUNTIME)
>   class _LIBCPP_EXCEPTION_ABI exception
>   {
>       // ...
>   };
>   
>   class _LIBCPP_EXCEPTION_ABI bad_exception
>       : public exception
>   {
>       // ...
>   };
>   #endif // !_LIBCPP_ABI_VCRUNTIME
>
> I would do something like this instead:
>
>   // <vcruntime_exception.h> defines its own std::exception and std::bad_exception types,
>   // which we use in order to be ABI-compatible with other STLs on Windows.
>   #if defined(_LIBCPP_ABI_VCRUNTIME) && _HAS_EXCEPTIONS
>   #   include <vcruntime_exception.h>
>   
>   // However, <vcruntime_exception.h> does not define std::exception and std::bad_exception 
>   // under -fno-exceptions.
>   //
>   // Since libc++ still wants to provide the std::exception hierarchy under -fno-exceptions
>   // (after all those are simply types like any other), we define an ABI-compatible version 
>   // of the VCRuntime std::exception and std::bad_exception types in that mode.
>   #elif defined(_LIBCPP_ABI_VCRUNTIME) && !_HAS_EXCEPTIONS
>   class _LIBCPP_EXCEPTION_ABI exception
>   {
>       // ABI-compatible definition with vcruntime
>   };
>   
>   class _LIBCPP_EXCEPTION_ABI bad_exception
>       : public exception
>   {
>       // ABI-compatible definition with vcruntime
>   };
>   
>   // On all other platforms, we define our own std::exception and std::bad_exception types
>   // regardless of whether exceptions are turned on as a language feature.
>   #else
>   class _LIBCPP_EXCEPTION_ABI exception
>   {
>       // ...
>   };
>   
>   class _LIBCPP_EXCEPTION_ABI bad_exception
>       : public exception
>   {
>       // ...
>   };
>   #endif
>
> WDYT? Does this make sense to you? @mstorsjo do you think that's sensible, too?

That sounds sensible to me. It's a bit of time since I dove into it so I don't directly recall all the hairly details, but it sounds like it could work yeah.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103947/new/

https://reviews.llvm.org/D103947



More information about the libcxx-commits mailing list