Skip to content

Commit

Permalink
[ODRHash] Do not rely on Type* when computing the hash.
Browse files Browse the repository at this point in the history
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

llvm-svn: 335853
  • Loading branch information
vgvassilev committed Jun 28, 2018
1 parent 63feb16 commit 61914d3
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 10 deletions.
1 change: 0 additions & 1 deletion clang/include/clang/AST/ODRHash.h
Expand Up @@ -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;
Expand Down
9 changes: 0 additions & 9 deletions clang/lib/AST/ODRHash.cpp
Expand Up @@ -180,7 +180,6 @@ void ODRHash::AddTemplateParameterList(const TemplateParameterList *TPL) {

void ODRHash::clear() {
DeclNameMap.clear();
TypeMap.clear();
Bools.clear();
ID.clear();
}
Expand Down Expand Up @@ -770,14 +769,6 @@ class ODRTypeVisitor : public TypeVisitor<ODRTypeVisitor> {

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);
}

Expand Down
6 changes: 6 additions & 0 deletions clang/test/Modules/Inputs/odr_hash-elaborated-types/first.h
@@ -0,0 +1,6 @@
#ifndef FIRST
#define FIRST

#include "textual_time.h"

#endif
@@ -0,0 +1,5 @@
module M {
module first { header "first.h" export *}
module second { header "second.h" export *}
export *
}
6 changes: 6 additions & 0 deletions clang/test/Modules/Inputs/odr_hash-elaborated-types/second.h
@@ -0,0 +1,6 @@
#ifndef SECOND
#define SECOND

#include "textual_stat.h"

#endif
11 changes: 11 additions & 0 deletions clang/test/Modules/Inputs/odr_hash-elaborated-types/textual_stat.h
@@ -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
@@ -0,0 +1,6 @@
#ifndef _TIME_H
#define _TIME_H

struct timespec { };

#endif
12 changes: 12 additions & 0 deletions clang/test/Modules/odr_hash-elaborated-types.cpp
@@ -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

0 comments on commit 61914d3

Please sign in to comment.