[ODRHash] Do not rely on Type* when computing the hash.

ODRHash aims to provide Cross-TU stable hashing. Making clang::Type pointer
part of the hash connects (remotely) the ODRHash with the TU-specific
::Profile hasher.

r332281 exposed the issue by changing the way the ASTContext different
elaborated types if there is an owning tag. In that case, ODRHash stores two
 different types in its TypeMap which yields false ODR violation in modules.

The current state of implementation shouldn't need the TypeMap concept
anymore. Rip it out.

Differential Revision: https://reviews.llvm.org/D48524


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@335853 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vassil Vassilev 2018-06-28 13:28:44 +00:00
parent bff556fe3c
commit 29cdecbf69
8 changed files with 46 additions and 10 deletions

View File

@ -40,7 +40,6 @@ class ODRHash {
// Use DenseMaps to convert from DeclarationName and Type pointers
// to an index value.
llvm::DenseMap<DeclarationName, unsigned> DeclNameMap;
llvm::DenseMap<const Type*, unsigned> TypeMap;
// Save space by processing bools at the end.
llvm::SmallVector<bool, 128> Bools;

View File

@ -180,7 +180,6 @@ void ODRHash::AddTemplateParameterList(const TemplateParameterList *TPL) {
void ODRHash::clear() {
DeclNameMap.clear();
TypeMap.clear();
Bools.clear();
ID.clear();
}
@ -770,14 +769,6 @@ public:
void ODRHash::AddType(const Type *T) {
assert(T && "Expecting non-null pointer.");
auto Result = TypeMap.insert(std::make_pair(T, TypeMap.size()));
ID.AddInteger(Result.first->second);
// On first encounter of a Type pointer, process it. Every time afterwards,
// only the index value is needed.
if (!Result.second) {
return;
}
ODRTypeVisitor(ID, *this).Visit(T);
}

View File

@ -0,0 +1,6 @@
#ifndef FIRST
#define FIRST
#include "textual_time.h"
#endif

View File

@ -0,0 +1,5 @@
module M {
module first { header "first.h" export *}
module second { header "second.h" export *}
export *
}

View File

@ -0,0 +1,6 @@
#ifndef SECOND
#define SECOND
#include "textual_stat.h"
#endif

View File

@ -0,0 +1,11 @@
#ifndef _SYS_STAT_H
#define _SYS_STAT_H
#include "textual_time.h"
struct stat {
struct timespec st_atim;
struct timespec st_mtim;
};
#endif

View File

@ -0,0 +1,6 @@
#ifndef _TIME_H
#define _TIME_H
struct timespec { };
#endif

View File

@ -0,0 +1,12 @@
// RUN: rm -rf %t
// RUN: %clang_cc1 -std=c++1z -I%S/Inputs/odr_hash-elaborated-types -verify %s
// RUN: %clang_cc1 -std=c++1z -fmodules -fmodules-local-submodule-visibility -fmodule-map-file=%S/Inputs/odr_hash-elaborated-types/module.modulemap -fmodules-cache-path=%t -x c++ -I%S/Inputs/odr_hash-elaborated-types -verify %s
#include "textual_stat.h"
#include "first.h"
#include "second.h"
void use() { struct stat value; }
// expected-no-diagnostics