Make the order of items coming from implicit template specializations deterministic

Currently we sort items in IR according to
1. Source location, and then
2. `Importer::GetDeclOrder()` <- this one ensures that implicit constructors/destructors come in a certain order

Implicit class template specialization decls and their methods have the same source location, which makes the following code snippet problematic:
```
template <typename T>
struct MyStruct {
  void Method(T t);
};

using Alias1 = MyStruct<int>;
using Alias2 = MyStruct<bool>;
```
The generated bindings will contain two structs for the implicit template specializations:
```
pub struct __CcTemplateInst8MyStructIiE {...}
pub struct __CcTemplateInst8MyStructIbE {...}
```
But the order in which they appear is nondeterministic. Same goes for the assertions we generate for these structs, as well as the respective functions in `rs_api_impl.cc`.

This cl addresses the issue by taking into account the mangled name of the class template specialization or function decls when determining the item order.

PiperOrigin-RevId: 456502619
7 files changed
tree: 31d72991e2f432733701006a89f725553bb67fc0
  1. .bazelci/
  2. bazel/
  3. cc_template/
  4. common/
  5. docs/
  6. lifetime_analysis/
  7. lifetime_annotations/
  8. migrator/
  9. nullability_verification/
  10. rs_bindings_from_cc/
  11. .bazelrc
  12. .gitignore
  13. BUILD
  14. Cargo.Bazel.lock
  15. CODE_OF_CONDUCT
  16. CONTRIBUTING
  17. LICENSE
  18. README.md
  19. WORKSPACE
README.md

Crubit: C++/Rust Bidirectional Interop Tool

Build status

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.

Building Crubit

$ 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

Using a prebuilt LLVM tree

$ 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