rs_bindings_from_cc: Add helper function `DebugStringFromDecl`.

So that Crubit developers can easily call this function to print clang::Decl, when debugging IR item lookup errors.

PiperOrigin-RevId: 591230418
Change-Id: I1a141d313c39fd58cffee9e367f1ddd3c01a9e29
diff --git a/rs_bindings_from_cc/BUILD b/rs_bindings_from_cc/BUILD
index 452474b..22e3dbe 100644
--- a/rs_bindings_from_cc/BUILD
+++ b/rs_bindings_from_cc/BUILD
@@ -314,6 +314,7 @@
         "@absl//absl/log:check",
         "@absl//absl/status:statusor",
         "@absl//absl/strings",
+        "@absl//absl/strings:str_format",
         "@llvm-project//clang:ast",
         "@llvm-project//clang:basic",
         "@llvm-project//llvm:Support",
diff --git a/rs_bindings_from_cc/ir.h b/rs_bindings_from_cc/ir.h
index 938751e..b721092 100644
--- a/rs_bindings_from_cc/ir.h
+++ b/rs_bindings_from_cc/ir.h
@@ -25,6 +25,7 @@
 #include "absl/container/flat_hash_set.h"
 #include "absl/log/check.h"
 #include "absl/status/statusor.h"
+#include "absl/strings/str_format.h"
 #include "absl/strings/string_view.h"
 #include "common/strong_int.h"
 #include "rs_bindings_from_cc/bazel_types.h"
@@ -37,6 +38,7 @@
 #include "llvm/ADT/APSInt.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/JSON.h"
+#include "llvm/Support/raw_ostream.h"
 
 namespace crubit {
 
@@ -99,6 +101,18 @@
 //  We use ItemIds for this.
 CRUBIT_DEFINE_STRONG_INT_TYPE(ItemId, uintptr_t);
 
+inline std::string DebugStringFromDecl(const clang::Decl* decl) {
+  auto canonical_decl_id =
+      reinterpret_cast<uintptr_t>(decl->getCanonicalDecl());
+  auto decl_id = reinterpret_cast<uintptr_t>(decl);
+  std::string decl_name;
+  auto ostream = llvm::raw_string_ostream(decl_name);
+  decl->print(ostream);
+  ostream.flush();
+  return absl::StrFormat("Canonical DeclID: %ull; DeclID: %ull; decl: %s",
+                         canonical_decl_id, decl_id, decl_name);
+}
+
 inline ItemId GenerateItemId(const clang::Decl* decl) {
   if (auto namespace_decl = clang::dyn_cast<clang::NamespaceDecl>(decl)) {
     return ItemId(reinterpret_cast<uintptr_t>(namespace_decl));