3 addData(S->getStmtClass());
4 // This ensures that non-macro-generated code isn't identical to
5 // macro-generated code.
6 addData(data_collection::getMacroStack(S->getLocStart(), Context));
7 addData(data_collection::getMacroStack(S->getLocEnd(), Context));
13 addData(S->getType());
17 //--- Builtin functionality ----------------------------------------------//
18 class ArrayTypeTraitExpr {
20 addData(S->getTrait());
23 class ExpressionTraitExpr {
25 addData(S->getTrait());
28 class PredefinedExpr {
30 addData(S->getIdentType());
35 addData(S->getTrait());
36 for (unsigned i = 0; i < S->getNumArgs(); ++i)
37 addData(S->getArg(i)->getType());
41 //--- Calls --------------------------------------------------------------//
44 // Function pointers don't have a callee and we just skip hashing it.
45 if (const FunctionDecl *D = S->getDirectCallee()) {
46 // If the function is a template specialization, we also need to handle
47 // the template arguments as they are not included in the qualified name.
48 if (auto Args = D->getTemplateSpecializationArgs()) {
49 std::string ArgString;
51 // Print all template arguments into ArgString
52 llvm::raw_string_ostream OS(ArgString);
53 for (unsigned i = 0; i < Args->size(); ++i) {
54 Args->get(i).print(Context.getLangOpts(), OS);
55 // Add a padding character so that 'foo<X, XX>()' != 'foo<XX, X>()'.
62 addData(D->getQualifiedNameAsString());
67 //--- Value references ---------------------------------------------------//
70 addData(S->getDecl()->getQualifiedNameAsString());
75 addData(S->getMemberDecl()->getName());
79 //--- Literals -----------------------------------------------------------//
80 class IntegerLiteral {
82 addData(llvm::hash_value(S->getValue()));
85 class FloatingLiteral {
87 addData(llvm::hash_value(S->getValue()));
92 addData(S->getString());
95 class CXXBoolLiteralExpr {
97 addData(S->getValue());
100 class CharacterLiteral {
102 addData(S->getValue());
106 //--- Exceptions ---------------------------------------------------------//
109 addData(S->getCaughtType());
113 //--- C++ OOP Stmts ------------------------------------------------------//
114 class CXXDeleteExpr {
116 addData(S->isArrayFormAsWritten()); addData(S->isGlobalDelete());
120 //--- Casts --------------------------------------------------------------//
121 class ObjCBridgedCastExpr {
123 addData(S->getBridgeKind());
127 //--- Miscellaneous Exprs ------------------------------------------------//
128 class BinaryOperator {
130 addData(S->getOpcode());
133 class UnaryOperator {
135 addData(S->getOpcode());
139 //--- Control flow -------------------------------------------------------//
142 addData(S->getLabel()->getName());
145 class IndirectGotoStmt {
147 if (S->getConstantTarget())
148 addData(S->getConstantTarget()->getName());
153 addData(S->getDecl()->getName());
156 class MSDependentExistsStmt {
158 addData(S->isIfExists());
161 class AddrLabelExpr {
163 addData(S->getLabel()->getName());
167 //--- Objective-C --------------------------------------------------------//
168 class ObjCIndirectCopyRestoreExpr {
170 addData(S->shouldCopy());
173 class ObjCPropertyRefExpr {
175 addData(S->isSuperReceiver()); addData(S->isImplicitProperty());
178 class ObjCAtCatchStmt {
180 addData(S->hasEllipsis());
184 //--- Miscellaneous Stmts ------------------------------------------------//
187 addData(S->isRightFold()); addData(S->getOperator());
190 class GenericSelectionExpr {
192 for (unsigned i = 0; i < S->getNumAssocs(); ++i) {
193 addData(S->getAssocType(i));
199 for (const LambdaCapture &C : S->captures()) {
200 addData(C.isPackExpansion());
201 addData(C.getCaptureKind());
202 if (C.capturesVariable())
203 addData(C.getCapturedVar()->getType());
205 addData(S->isGenericLambda());
206 addData(S->isMutable());
211 auto numDecls = std::distance(S->decl_begin(), S->decl_end());
212 addData(static_cast<unsigned>(numDecls));
213 for (const Decl *D : S->decls()) {
214 if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
215 addData(VD->getType());
222 addData(S->isSimple());
223 addData(S->isVolatile());
224 addData(S->generateAsmString(Context));
225 for (unsigned i = 0; i < S->getNumInputs(); ++i) {
226 addData(S->getInputConstraint(i));
228 for (unsigned i = 0; i < S->getNumOutputs(); ++i) {
229 addData(S->getOutputConstraint(i));
231 for (unsigned i = 0; i < S->getNumClobbers(); ++i) {
232 addData(S->getClobber(i));
236 class AttributedStmt {
238 for (const Attr *A : S->getAttrs()) {
239 addData(std::string(A->getSpelling()));