commit | b2b6cf899044e4771a27702d770deeec7f2c828b | [log] [tgz] |
---|---|---|
author | Devin Jeanpierre <jeanpierreda@google.com> | Thu Jul 07 01:49:27 2022 -0700 |
committer | Copybara-Service <copybara-worker@google.com> | Thu Jul 07 01:49:58 2022 -0700 |
tree | 6569ae1846fd26044c529e77bcafe33583d74c9b | |
parent | 57e0bfadabb1cc649a7920890ae5bfb44ffc1756 [diff] |
Convert RsTypeKind to a cheaply-clonable type with `Rc` inside. The immediate reason for this is to allow it to be returned by a Salsa query. Either the query returns an `RsTypeKind` by value, in which case it should be cheaply clonable, or it returns an `Rc<RsTypeKind>`, in which case the recursive data structure should use `Rc` inside to avoid excessive copying. No matter how we design the query, `RsTypeKind` becomes as so. However, in fact I've wanted this change for a long time before that, and I think it's good even on its own merits. Suppose I want to format `x` as a pointer. The current way to do it is something like `quote!{*const #x}`. But this is "lossy" -- this isn't a structured datatype that says "a pointer to `x`", it's just a code snippet. But if `x` were cheaply clonable, we could simply do `RsTypeKind::Pointer {pointee: Rc::new(x.clone()), mutability: Mutability::Const}`. And so rather than building up token streams in stringly-typed code, we can build up `RsTypeKind` objects. This does occur in practice, e.g. `format_mut_ref_as_uninitialized` formats a `RsTypeKind` as a `MaybeUninit`, returning a `TokenStream`. But after this change, it could instead be implemented to return a new `RsTypeKind`, containing a reference to the old one, and preserving structure -- at least, if we wanted to. I'm not sure where else this occurs, though, which is part of why I hadn't actually proposed this change until now, where it becomes desirable for Salsa. PiperOrigin-RevId: 459454675
Extremely experimental interop tooling for C++ and Rust.
Please don‘t use, this is an experiment and we don’t yet know where will it take us. There will be breaking changes without warning. Unfortunately, we can't take contributions at this point.
$ apt install clang lld bazel $ git clone git@github.com:google/crubit.git $ cd crubit $ bazel build --linkopt=-fuse-ld=/usr/bin/ld.lld //rs_bindings_from_cc:rs_bindings_from_cc_impl
$ git clone https://github.com/llvm/llvm-project $ cd llvm-project $ CC=clang CXX=clang++ cmake -S llvm -B build -DLLVM_ENABLE_PROJECTS='clang' -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install $ cmake --build build -j $ # wait... $ cmake --install build $ cd ../crubit $ LLVM_INSTALL_PATH=../llvm-project/install bazel build //rs_bindings_from_cc:rs_bindings_from_cc_impl