[llvm-dev] Use of the C++ standard library in XRay compiler-rt
Dean Michael Berris via llvm-dev
llvm-dev at lists.llvm.org
Sun Mar 12 16:10:48 PDT 2017
> On 9 Mar 2017, at 09:32, David Blaikie via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> I agree that we should clean up the standard library usage even just for consistency.
>
+1 -- now that I think about it, it should be fairly doable (also happy to help with reviews if that helps).
> Searching the xray directory for dependencies:
> ...compiler-rt/lib/xray % grep '#include <[^>.]*>' -oh `find . -type f|grep -v 'tests'` | sort | uniq -c
> 1 #include <algorithm>
> 10 #include <atomic>
> 1 #include <bitset>
> 6 #include <cassert>
> 1 #include <cerrno>
> 1 #include <cstddef>
> 7 #include <cstdint>
> 2 #include <cstdio>
> 1 #include <cstdlib>
> 2 #include <cstring>
> 1 #include <deque>
> 2 #include <iterator>
> 2 #include <limits>
> 2 #include <memory>
> 4 #include <mutex>
> 1 #include <system_error>
> 1 #include <thread>
> 2 #include <tuple>
> 1 #include <unordered_map>
> 1 #include <unordered_set>
> 3 #include <utility>
> I think the biggest part is containers, and they are mostly in ./xray_buffer_queue.h and ./xray_fdr_logging.cc.
Yes, buffer_queue can definitely live without using system_error, unordered_map, and unordered_set. It might make it a bit more complex (we'd need to implement a correct and fairly efficient hash set) but if it means the deployment model is simpler then I'm happy with that trade-off. When we were implementing this, we made a decision to make it so that the "mismatch of standard library implementations" was treated as a lower priority issue -- something we don't think comes up as often, and is easily solvable by re-building the runtime with the standard library the end application/binary will be using anyway. Since XRay is only ever statically-linked (we don't have a dynamic version of it), I thought the rebuild option is slightly simpler than trying to implement the whole XRay runtime in a constrained version of C++ and libc-only functions.
>
> dependencies without buffer queue and fdr logging:
> ...compiler-rt/lib/xray % grep '#include <[^>.]*>' -oh `find . -type f|egrep -v 'tests|buffer|fdr'` | sort | uniq -c
> 9 #include <atomic>
> 4 #include <cassert>
> 1 #include <cerrno>
> 1 #include <cstddef>
> 6 #include <cstdint>
> 2 #include <cstdio>
> 1 #include <cstring>
> 2 #include <iterator>
> 2 #include <limits>
> 1 #include <memory>
> 3 #include <mutex>
> 1 #include <thread>
> 2 #include <tuple>
> 2 #include <utility>
> I believe that this is relatively easy to cleanup. I can do that.
>
> I don't know how hard it is to rewrite buffer queue and fdr logging using compiler_rt infrastructure.
>
The crucial things we need in FDR mode logging are:
- Aligned storage (I suspect this could be done without std::aligned_storage<...>)
- memcpy (we use std::memcpy there, but probably didn't need to)
- thread-local storage (using C++'s `thread_local` keyword)
The buffer queue can be re-written to not use std::system_error in the APIs (use XRay-specific enums instead), internally not use std::atomic<...> types, and have to implement the FIFO queue, a lookup table for ownership, etc. -- while none of these seem hard, they didn't seem worth it at the time of implementation.
> I think buffer_queue's probably sufficiently well bounded that it shouldn't be drastically hard to replace it with a custom implementation. Haven't looked at fdr_logging.
>
> Maps/dictionary-like things might be a bit of a pain in particular. Not sure if the sanitizers already have some reusable idioms/libraries for that.
>
> I'm also not really clear on where the boundary is - which headers or language features ('new'?) can be used, and which can't. Can't say I've ever tried to make code library agnostic.
>
One thing we rely on heavily on in the FDR mode implementation is C++'s `thread_local` keyword. I'm not sure what that entails runtime-wise (does it need pthreads? or something else?) but I'm sure a functional replacement would be alright too.
>
>
> (this came up for me due to what's probably a bug in the way compiler-rt is built - where the lib itself is built with the host compiler but the tests are built/linked with the just-bulit clang. My host compiler uses libstdc++ 6, whereas the just-built clang will use libstdc++ 4.8. So it fails to link due to this mismatch)
How hard would it be to fix that bug?
I would think this error would come up in the wild too, but could be remedied by just rebuilding XRay with the right C++ standard library.
-- Dean
More information about the llvm-dev
mailing list