ModuleUtils: Stop using comdat members to generate unique module ids.

It is possible for two modules to define the same set of external
symbols without causing a duplicate symbol error at link time,
as long as each of the symbols is a comdat member. So we cannot
use them as part of a unique id for the module.

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

llvm-svn: 315026
This commit is contained in:
Peter Collingbourne 2017-10-05 21:54:53 +00:00
parent 9da3c75a13
commit 715bcfe0c9
4 changed files with 11 additions and 2 deletions

View File

@ -85,7 +85,8 @@ void filterDeadComdatFunctions(
Module &M, SmallVectorImpl<Function *> &DeadComdatFunctions); Module &M, SmallVectorImpl<Function *> &DeadComdatFunctions);
/// \brief Produce a unique identifier for this module by taking the MD5 sum of /// \brief Produce a unique identifier for this module by taking the MD5 sum of
/// the names of the module's strong external symbols. /// the names of the module's strong external symbols that are not comdat
/// members.
/// ///
/// This identifier is normally guaranteed to be unique, or the program would /// This identifier is normally guaranteed to be unique, or the program would
/// fail to link due to multiply defined symbols. /// fail to link due to multiply defined symbols.

View File

@ -243,7 +243,7 @@ std::string llvm::getUniqueModuleId(Module *M) {
bool ExportsSymbols = false; bool ExportsSymbols = false;
auto AddGlobal = [&](GlobalValue &GV) { auto AddGlobal = [&](GlobalValue &GV) {
if (GV.isDeclaration() || GV.getName().startswith("llvm.") || if (GV.isDeclaration() || GV.getName().startswith("llvm.") ||
!GV.hasExternalLinkage()) !GV.hasExternalLinkage() || GV.hasComdat())
return; return;
ExportsSymbols = true; ExportsSymbols = true;
Md5.update(GV.getName()); Md5.update(GV.getName());

View File

@ -13,4 +13,6 @@ $al = comdat any
@al = external unnamed_addr alias i8*, getelementptr inbounds ({ [1 x i8*] }, { [1 x i8*] }* @anon, i32 0, i32 0, i32 1) @al = external unnamed_addr alias i8*, getelementptr inbounds ({ [1 x i8*] }, { [1 x i8*] }* @anon, i32 0, i32 0, i32 1)
@foo = global i32 1
!0 = !{i64 8, !"?AVA@@"} !0 = !{i64 8, !"?AVA@@"}

View File

@ -21,4 +21,10 @@ define internal void @f() {
ret void ret void
} }
$h = comdat any
; CHECK: define void @h() comdat
define void @h() comdat {
ret void
}
!0 = !{i32 0, !"typeid"} !0 = !{i32 0, !"typeid"}