clang 20.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 APValue;
29class Decl;
30class IdentifierInfo;
31class NestedNameSpecifier;
32class Stmt;
33class 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.
42class 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
52public:
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);
94 void AddStmt(const Stmt *S);
95 void AddIdentifierInfo(const IdentifierInfo *II);
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
109private:
110 void AddDeclarationNameImpl(DeclarationName Name);
111};
112
113} // end namespace clang
114
115#endif
NodeId Parent
Definition: ASTDiff.cpp:191
StringRef P
const Decl * D
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:3844
Represents a function declaration or definition.
Definition: Decl.h:1932
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:807
void AddStmt(const Stmt *S)
Definition: ODRHash.cpp:24
void AddStructuralValue(const APValue &)
Definition: ODRHash.cpp:1275
void AddCXXRecordDecl(const CXXRecordDecl *Record)
Definition: ODRHash.cpp:569
void clear()
Definition: ODRHash.cpp:219
void AddIdentifierInfo(const IdentifierInfo *II)
Definition: ODRHash.cpp:29
void AddObjCProtocolDecl(const ObjCProtocolDecl *P)
Definition: ODRHash.cpp:782
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
Definition: ODRHash.cpp:34
void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record)
Definition: ODRHash.cpp:634
void AddType(const Type *T)
Definition: ODRHash.cpp:1257
void AddEnumDecl(const EnumDecl *Enum)
Definition: ODRHash.cpp:754
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
Definition: ODRHash.cpp:112
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
Definition: ODRHash.cpp:661
void AddBoolean(bool value)
Definition: ODRHash.cpp:1271
void AddTemplateName(TemplateName Name)
Definition: ODRHash.cpp:141
void AddRecordDecl(const RecordDecl *Record)
Definition: ODRHash.cpp:616
void AddSubDecl(const Decl *D)
Definition: ODRHash.cpp:563
void AddQualType(QualType T)
Definition: ODRHash.cpp:1262
void AddTemplateParameterList(const TemplateParameterList *TPL)
Definition: ODRHash.cpp:210
void AddTemplateArgument(TemplateArgument TA)
Definition: ODRHash.cpp:168
unsigned CalculateHash()
Definition: ODRHash.cpp:225
static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent)
Definition: ODRHash.cpp:537
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
Represents an Objective-C protocol declaration.
Definition: DeclObjC.h:2083
A (possibly-)qualified type.
Definition: Type.h:941
Represents a struct/union/class.
Definition: Decl.h:4145
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:203
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:1829
@ 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
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.