forked from OSchip/llvm-project
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:
parent
9da3c75a13
commit
715bcfe0c9
|
@ -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.
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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@@"}
|
||||||
|
|
|
@ -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"}
|
||||||
|
|
Loading…
Reference in New Issue