From a495c43386d5634fac9b64e4e0547fde1a6a3741 Mon Sep 17 00:00:00 2001 From: George Karpenkov Date: Sat, 15 Sep 2018 02:03:58 +0000 Subject: [PATCH] Generate unique identifiers for Decl objects The generated identifier is stable across multiple runs, and can be a great visualization or debugging aide. Differential Revision: https://reviews.llvm.org/D52113 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342315 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/DeclBase.h | 3 +++ lib/AST/DeclBase.cpp | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 37ce07b6db..0d52120017 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -1141,6 +1141,9 @@ public: void dump(raw_ostream &Out, bool Deserialize = false) const; + /// \return Unique reproducible object identifier + int64_t getID() const; + /// Looks through the Decl's underlying type to extract a FunctionType /// when possible. Will return null if the type underlying the Decl does not /// have a FunctionType. diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 796b5325ee..6bb2034a9e 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -930,6 +930,13 @@ bool Decl::AccessDeclContextSanity() const { static Decl::Kind getKind(const Decl *D) { return D->getKind(); } static Decl::Kind getKind(const DeclContext *DC) { return DC->getDeclKind(); } +int64_t Decl::getID() const { + Optional Out = getASTContext().getAllocator().identifyObject(this); + assert(Out && "Wrong allocator used"); + assert(*Out % alignof(Decl) == 0 && "Wrong alignment information"); + return *Out / alignof(Decl); +} + const FunctionType *Decl::getFunctionType(bool BlocksToo) const { QualType Ty; if (const auto *D = dyn_cast(this)) -- 2.50.1