clang  19.0.0git
ODRHash.h
Go to the documentation of this file.
1 //===-- ODRHash.h - Hashing to diagnose ODR failures ------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// This file contains the declaration of the ODRHash class, which calculates
11 /// a hash based on AST nodes, which is stable across different runs.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_CLANG_AST_ODRHASH_H
16 #define LLVM_CLANG_AST_ODRHASH_H
17 
19 #include "clang/AST/Type.h"
20 #include "clang/AST/TemplateBase.h"
21 #include "llvm/ADT/DenseMap.h"
22 #include "llvm/ADT/FoldingSet.h"
23 #include "llvm/ADT/PointerUnion.h"
24 #include "llvm/ADT/SmallVector.h"
25 
26 namespace clang {
27 
28 class APValue;
29 class Decl;
30 class IdentifierInfo;
31 class NestedNameSpecifier;
32 class Stmt;
33 class TemplateParameterList;
34 
35 // ODRHash is used to calculate a hash based on AST node contents that
36 // does not rely on pointer addresses. This allows the hash to not vary
37 // between runs and is usable to detect ODR problems in modules. To use,
38 // construct an ODRHash object, then call Add* methods over the nodes that
39 // need to be hashed. Then call CalculateHash to get the hash value.
40 // Typically, only one Add* call is needed. clear can be called to reuse the
41 // object.
42 class ODRHash {
43  // Use DenseMaps to convert from DeclarationName and Type pointers
44  // to an index value.
45  llvm::DenseMap<DeclarationName, unsigned> DeclNameMap;
46 
47  // Save space by processing bools at the end.
49 
50  llvm::FoldingSetNodeID ID;
51 
52 public:
53  ODRHash() {}
54 
55  // Use this for ODR checking classes between modules. This method compares
56  // more information than the AddDecl class.
58 
59  // Use this for ODR checking records in C/Objective-C between modules. This
60  // method compares more information than the AddDecl class.
61  void AddRecordDecl(const RecordDecl *Record);
62 
63  // Use this for ODR checking ObjC interfaces. This
64  // method compares more information than the AddDecl class.
66 
67  // Use this for ODR checking functions between modules. This method compares
68  // more information than the AddDecl class. SkipBody will process the
69  // hash as if the function has no body.
70  void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody = false);
71 
72  // Use this for ODR checking enums between modules. This method compares
73  // more information than the AddDecl class.
74  void AddEnumDecl(const EnumDecl *Enum);
75 
76  // Use this for ODR checking ObjC protocols. This
77  // method compares more information than the AddDecl class.
79 
80  // Process SubDecls of the main Decl. This method calls the DeclVisitor
81  // while AddDecl does not.
82  void AddSubDecl(const Decl *D);
83 
84  // Reset the object for reuse.
85  void clear();
86 
87  // Add booleans to ID and uses it to calculate the hash.
88  unsigned CalculateHash();
89 
90  // Add AST nodes that need to be processed.
91  void AddDecl(const Decl *D);
92  void AddType(const Type *T);
93  void AddQualType(QualType T);
94  void AddStmt(const Stmt *S);
95  void AddIdentifierInfo(const IdentifierInfo *II);
97  void AddTemplateName(TemplateName Name);
98  void AddDeclarationName(DeclarationName Name, bool TreatAsDecl = false);
101 
102  // Save booleans until the end to lower the size of data to process.
103  void AddBoolean(bool value);
104 
105  void AddStructuralValue(const APValue &);
106 
107  static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent);
108 
109 private:
110  void AddDeclarationNameImpl(DeclarationName Name);
111 };
112 
113 } // end namespace clang
114 
115 #endif
NodeId Parent
Definition: ASTDiff.cpp:191
StringRef P
llvm::MachO::Record Record
Definition: MachO.h:31
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
The name of a declaration.
Represents an enum.
Definition: Decl.h:3870
Represents a function declaration or definition.
Definition: Decl.h:1972
One of these records is kept for each identifier that is lexed.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void AddDecl(const Decl *D)
Definition: ODRHash.cpp:799
void AddStmt(const Stmt *S)
Definition: ODRHash.cpp:24
void AddStructuralValue(const APValue &)
Definition: ODRHash.cpp:1267
void AddCXXRecordDecl(const CXXRecordDecl *Record)
Definition: ODRHash.cpp:561
void clear()
Definition: ODRHash.cpp:212
void AddIdentifierInfo(const IdentifierInfo *II)
Definition: ODRHash.cpp:29
void AddObjCProtocolDecl(const ObjCProtocolDecl *P)
Definition: ODRHash.cpp:774
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
Definition: ODRHash.cpp:34
void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record)
Definition: ODRHash.cpp:626
void AddType(const Type *T)
Definition: ODRHash.cpp:1249
void AddEnumDecl(const EnumDecl *Enum)
Definition: ODRHash.cpp:746
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
Definition: ODRHash.cpp:112
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition: ODRHash.cpp:653
void AddBoolean(bool value)
Definition: ODRHash.cpp:1263
void AddTemplateName(TemplateName Name)
Definition: ODRHash.cpp:141
void AddRecordDecl(const RecordDecl *Record)
Definition: ODRHash.cpp:608
void AddSubDecl(const Decl *D)
Definition: ODRHash.cpp:555
void AddQualType(QualType T)
Definition: ODRHash.cpp:1254
void AddTemplateParameterList(const TemplateParameterList *TPL)
Definition: ODRHash.cpp:203
void AddTemplateArgument(TemplateArgument TA)
Definition: ODRHash.cpp:161
unsigned CalculateHash()
Definition: ODRHash.cpp:218
static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent)
Definition: ODRHash.cpp:529
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2082
A (possibly-)qualified type.
Definition: Type.h:940
Represents a struct/union/class.
Definition: Decl.h:4171
Stmt - This represents one statement.
Definition: Stmt.h:84
Represents a template argument.
Definition: TemplateBase.h:61
Represents a C++ template name within the type system.
Definition: TemplateName.h:202
Stores a list of template parameters for a TemplateDecl and its derived classes.
Definition: DeclTemplate.h:73
The base class of the type hierarchy.
Definition: Type.h:1813
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T