<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I’m very excited to have NVIDIA collaborate on libc++. It’s worth supporting your weirdo macro hack as a transitional tool.<div class=""><br class=""></div><div class="">I’m especially interested in working on freestanding in clang / libc++, bringing the good parts of it from the current C++ standard, and working with you and other on the Committee to make C++23 freestanding actually nice (Ben Craig has been working on <a href="http://wg21.link/P0829R3" class="">wg21.link/P0829R3</a>). I hope that we can experiment on what’s “nice” in clang / libc++ in the next few months.</div><div class=""><div class="">One design constraint around freestanding: I want to make sure that clang can keep supporting other STL implementations.</div><div class=""><br class=""></div><div class="">I’d like to understand if we can have a different ABI for freestanding, given that it’s not supported in libc++ today. This might be an opportunity to fix some mistakes.</div><div class=""><br class=""></div></div><div class="">On “freestanding” macro, clang does the following today:</div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Courier" class="">  if (LangOpts.Freestanding)</font></div><div class=""><font face="Courier" class="">    Builder.defineMacro("__STDC_HOSTED__", "0");</font></div><div class=""><font face="Courier" class="">  else</font></div><div class=""><font face="Courier" class="">    Builder.defineMacro("__STDC_HOSTED__</font><span style="font-family: Courier;" class="">"</span><span style="font-family: Courier;" class="">);</span></div></blockquote><div class="">Otherwise, clang’s lib/Headers do some stuff with HOSTED as well, which might interfere with freestanding.</div><div class=""><br class="">Good header hygiene indeed seems necessary, especially for <algorithm>. Louis mentioned that he was interested in looking into this.</div><div class="">Louis did a survey and found the following:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div class=""><div class="">Freestanding in the current C++20 draft requires the following headers:</div></div></div><div class=""><div class=""><div class=""><font face="Courier" class=""><br class=""></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <ciso646></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstddef></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cfloat> </font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <limits> </font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <climits></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdint></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdlib></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <new></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <typeinfo></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <exception></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <initializer_list></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdarg></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <type_traits></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <atomic></font></div></div></div><div class=""><div class=""><div class=""><br class=""></div></div></div><div class=""><div class=""><div class="">Of those headers, I think the following are easy to provide with minimal changes to libc++ and without having to ship a libc++ shared object (or compiler-rt), and they use the following parts of the C Standard Library:</div></div></div><div class=""><div class=""><div class=""><font face="Courier" class=""><br class=""></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <ciso646>: nothing</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstddef>: stddef.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cfloat> : float.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <limits> : stddef.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <climits>: limits.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdint>: stdint.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdlib>: stdlib.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <initializer_list>: stddef.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdarg>: stdarg.h</font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <type_traits>: stddef.h</font></div></div></div><div class=""><div class=""><div class=""><br class=""></div></div></div><div class=""><div class=""><div class="">As a result, I think the following are low-hanging fruit that do not require any runtime support AFAICT:</div></div></div><div class=""><div class=""><div class=""><font face="Courier" class=""><br class=""></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <ciso646></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstddef></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cfloat></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <limits></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <climits></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <cstdint></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <initializer_list></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <type_traits></font></div></div></div><div class=""><div class=""><div class=""><br class=""></div></div></div><div class=""><div class=""><div class="">Other things we might be able to throw in with minimal effort:</div></div></div><div class=""><div class=""><div class=""><font face="Courier" class=""><br class=""></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <bit></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <ratio></font></div></div></div><div class=""><div class=""><div class=""><br class=""></div></div></div><div class=""><div class=""><div class="">Other things that we SHOULD be able to have, but that would require refactoring in libc++ (and most of them are not part of the current freestanding):</div></div></div><div class=""><div class=""><div class=""><font face="Courier" class=""><br class=""></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <tuple></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <pair></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    most if not all of <functional></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    most of <algorithm></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <span></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <array></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    <string_view></font></div></div></div><div class=""><div class=""><div class=""><font face="Courier" class="">    lock-free parts of <atomic></font></div></div></div></blockquote><div class=""><div class=""><div class=""><br class=""></div></div></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Dec 10, 2018, at 9:23 PM, Olivier Giroux via libcxx-dev <<a href="mailto:libcxx-dev@lists.llvm.org" class="">libcxx-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;"><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">Hello libc++-dev,<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">In the discussion of<span class="Apple-converted-space"> </span><a href="https://reviews.llvm.org/D55517" style="color: rgb(149, 79, 114); text-decoration: underline;" class="">https://reviews.llvm.org/D55517</a>, I mentioned that we are attempting a vendor variant of libcxx that uses _VSTD differently. Eric pointed out that I should have started here, so we could talk about design goals. He’s right, I’m sorry.<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">Not one to bury the lede, I’d like to talk about a CUDA C++ standard library.<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">The ultimate goal of something like that should be that most things in C++, if not bolted too-tightly onto the operating system, should be able to be passed and used between CPU and GPU. There’s no fundamental reason why we don’t have a big chunk of C++ working like this,<span class="Apple-converted-space"> </span><i class="">today</i>, if we’re talking about contemporary HPC-friendly GPUs. The reason we don’t have much is that it’s a huge pile of work and everyone has managed to avoid doing it so far.<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">One exploration vehicle was shown at CppCon in September (by me, see: YouTube, and<span class="Apple-converted-space"> </span><a href="https://github.com/ogiroux/freestanding" style="color: rgb(149, 79, 114); text-decoration: underline;" class="">https://github.com/ogiroux/freestanding</a>) and then we made but failed to present a more detailed poster at the LLVM dev meeting in October. And now we’re here.<span class="Apple-converted-space"> </span></span><span style="font-size: 11pt; font-family: "Apple Color Emoji";" class="">😊</span><span style="font-size: 11pt;" class=""><o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">After making a few exploration vehicles (2 overall, 4 for <atomic>), we now think we’ll create version 1 this way:<o:p class=""></o:p></span></div><ol start="1" type="1" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">Wrap select libcxx <*> headers with <cuda/*> to introduce symbols in cuda::* instead of std::*, and…<o:p class=""></o:p></span><ol start="1" type="a" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">These facilities are always heterogeneous, NORTTI, and NOEXCEPTIONS.<o:p class=""></o:p></span></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">Enable users to include them<span class="Apple-converted-space"> </span><i class="">on top of</i><span class="Apple-converted-space"> </span>their host library (that being CPU only).<o:p class=""></o:p></span></li></ol></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">“Select” here means prioritizing headers in Freestanding now, or soon, basically the header-only facilities.<o:p class=""></o:p></span></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">Subsequently help maintain the intersection of libcxx and Freestanding.<o:p class=""></o:p></span></li></ol><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">In terms of libcxx design, we think that we could layer on this surface:<o:p class=""></o:p></span></div><ul type="disc" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">A freestanding mode, say LIBCXX_FREESTANDING, with a design goal of placing low-OS-coupling variants of code for facilities under this mode, and some agreement that Freestanding libraries have different ABI goals than their closest Hosted relative.<o:p class=""></o:p></span><ul type="circle" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">For example, in <atomic>, it would be preferable for Freestanding implementations (and users) if the<span class="Apple-converted-space"> </span><i class="">lock-in-atomic</i><span class="Apple-converted-space"> </span>strategy was used for non-lock-free atomics (instead of the<span class="Apple-converted-space"> </span><i class="">sharded-lock-table</i><span class="Apple-converted-space"> </span>strategy tucked inside __cxa_atomic_*) because that then frees the program from dependencies on libatomic.<o:p class=""></o:p></span></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">It is my intention to contribute the code for this 3<sup class="">rd</sup><span class="Apple-converted-space"> </span>strategy, and other maintenance to <atomic>, some of which I’ve already made in my branch.<o:p class=""></o:p></span></li></ul></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">An extension point that allows std::* symbols to be put into another namespace, both for ABI and to co-exist.<o:p class=""></o:p></span><ul type="circle" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">This is in tension with Eric’s proposed change.<o:p class=""></o:p></span></li></ul></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">An extension point that allows us to tune visibility control, e.g. add __device__ linkage to local-linkage symbols in those headers included in the subset (Freestanding minimum, or the implementation-defined choice).<o:p class=""></o:p></span><ul type="circle" style="margin-bottom: 0in; margin-top: 0in;" class=""><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">This was at one point in tension with changes Louis was making, but I think we’re Ok right now.<o:p class=""></o:p></span></li></ul></li><li class="MsoListParagraph" style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;"><span style="font-size: 11pt;" class="">And, generally speaking, good header inclusion hygiene that tries to minimize what’s pulled into a facility’s header.<o:p class=""></o:p></span></li></ul><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">That should isolate most of the ugly stuff in our code; version 1 will indeed be fairly ugly, no doubt about that. But then, hopefully, this all ends with libcxx gaining a new implementer!<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">Thanks for reading, I’ll try to answer your questions as best I can.<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">Sincerely,<o:p class=""></o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class=""><o:p class=""> </o:p></span></div><div style="margin: 0in 0in 0.0001pt; font-size: 12pt; font-family: Calibri, sans-serif;" class=""><span style="font-size: 11pt;" class="">Olivier<br class=""><br class=""><o:p class=""></o:p></span></div></div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><hr class=""></div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class="">This email message is for the sole use of the intended recipient(s) and may contain confidential information.  Any unauthorized review, use, disclosure or distribution is prohibited.  If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message.</div><div style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><hr class=""></div><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">_______________________________________________</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">libcxx-dev mailing list</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="mailto:libcxx-dev@lists.llvm.org" style="color: rgb(149, 79, 114); text-decoration: underline; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">libcxx-dev@lists.llvm.org</a><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev" style="color: rgb(149, 79, 114); text-decoration: underline; font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev</a></div></blockquote></div><br class=""></div></body></html>