clang 18.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"
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
26namespace clang {
27
28class Decl;
29class IdentifierInfo;
30class NestedNameSpecifier;
31class Stmt;
32class TemplateParameterList;
33
34// ODRHash is used to calculate a hash based on AST node contents that
35// does not rely on pointer addresses. This allows the hash to not vary
36// between runs and is usable to detect ODR problems in modules. To use,
37// construct an ODRHash object, then call Add* methods over the nodes that
38// need to be hashed. Then call CalculateHash to get the hash value.
39// Typically, only one Add* call is needed. clear can be called to reuse the
40// object.
41class ODRHash {
42 // Use DenseMaps to convert from DeclarationName and Type pointers
43 // to an index value.
44 llvm::DenseMap<DeclarationName, unsigned> DeclNameMap;
45
46 // Save space by processing bools at the end.
48
49 llvm::FoldingSetNodeID ID;
50
51public:
53
54 // Use this for ODR checking classes between modules. This method compares
55 // more information than the AddDecl class.
56 void AddCXXRecordDecl(const CXXRecordDecl *Record);
57
58 // Use this for ODR checking records in C/Objective-C between modules. This
59 // method compares more information than the AddDecl class.
60 void AddRecordDecl(const RecordDecl *Record);
61
62 // Use this for ODR checking ObjC interfaces. This
63 // method compares more information than the AddDecl class.
64 void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record);
65
66 // Use this for ODR checking functions between modules. This method compares
67 // more information than the AddDecl class. SkipBody will process the
68 // hash as if the function has no body.
69 void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody = false);
70
71 // Use this for ODR checking enums between modules. This method compares
72 // more information than the AddDecl class.
73 void AddEnumDecl(const EnumDecl *Enum);
74
75 // Use this for ODR checking ObjC protocols. This
76 // method compares more information than the AddDecl class.
78
79 // Process SubDecls of the main Decl. This method calls the DeclVisitor
80 // while AddDecl does not.
81 void AddSubDecl(const Decl *D);
82
83 // Reset the object for reuse.
84 void clear();
85
86 // Add booleans to ID and uses it to calculate the hash.
87 unsigned CalculateHash();
88
89 // Add AST nodes that need to be processed.
90 void AddDecl(const Decl *D);
91 void AddType(const Type *T);
92 void AddQualType(QualType T);
93 void AddStmt(const Stmt *S);
94 void AddIdentifierInfo(const IdentifierInfo *II);
97 void AddDeclarationName(DeclarationName Name, bool TreatAsDecl = false);
100
101 // Save booleans until the end to lower the size of data to process.
102 void AddBoolean(bool value);
103
104 static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent);
105
106private:
107 void AddDeclarationNameImpl(DeclarationName Name);
108};
109
110} // end namespace clang
111
112#endif
NodeId Parent
Definition: ASTDiff.cpp:191
StringRef P
C Language Family Type Representation.
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:1435
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:85
The name of a declaration.
Represents an enum.
Definition: Decl.h:3816
Represents a function declaration or definition.
Definition: Decl.h:1957
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:789
void AddStmt(const Stmt *S)
Definition: ODRHash.cpp:24
void AddCXXRecordDecl(const CXXRecordDecl *Record)
Definition: ODRHash.cpp:557
void clear()
Definition: ODRHash.cpp:208
void AddIdentifierInfo(const IdentifierInfo *II)
Definition: ODRHash.cpp:29
void AddObjCProtocolDecl(const ObjCProtocolDecl *P)
Definition: ODRHash.cpp:764
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
Definition: ODRHash.cpp:34
void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record)
Definition: ODRHash.cpp:622
void AddType(const Type *T)
Definition: ODRHash.cpp:1235
void AddEnumDecl(const EnumDecl *Enum)
Definition: ODRHash.cpp:736
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
Definition: ODRHash.cpp:112
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition: ODRHash.cpp:649
void AddBoolean(bool value)
Definition: ODRHash.cpp:1249
void AddTemplateName(TemplateName Name)
Definition: ODRHash.cpp:141
void AddRecordDecl(const RecordDecl *Record)
Definition: ODRHash.cpp:604
void AddSubDecl(const Decl *D)
Definition: ODRHash.cpp:551
void AddQualType(QualType T)
Definition: ODRHash.cpp:1240
void AddTemplateParameterList(const TemplateParameterList *TPL)
Definition: ODRHash.cpp:199
void AddTemplateArgument(TemplateArgument TA)
Definition: ODRHash.cpp:161
unsigned CalculateHash()
Definition: ODRHash.cpp:214
static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent)
Definition: ODRHash.cpp:525
Represents an ObjC class declaration.
Definition: DeclObjC.h:1150
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2079
A (possibly-)qualified type.
Definition: Type.h:737
Represents a struct/union/class.
Definition: Decl.h:4117
Stmt - This represents one statement.
Definition: Stmt.h:84
Represents a template argument.
Definition: TemplateBase.h:60
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:1603
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.