Index: llvm/lib/Transforms/Utils/ModuleUtils.cpp =================================================================== --- llvm/lib/Transforms/Utils/ModuleUtils.cpp +++ llvm/lib/Transforms/Utils/ModuleUtils.cpp @@ -209,13 +209,44 @@ bool ExportsSymbols = false; auto AddGlobal = [&](GlobalValue &GV) { if (GV.isDeclaration() || GV.getName().startswith("llvm.") || - !GV.hasExternalLinkage() || GV.hasComdat()) + (!GV.hasExternalLinkage() && + !(GV.hasWeakLinkage() || GV.hasWeakAnyLinkage() || + GV.hasWeakODRLinkage() || GV.hasLinkOnceLinkage() || + GV.hasLinkOnceODRLinkage() || GV.hasCommonLinkage() || + GV.hasComdat())) || + GV.hasComdat()) return; ExportsSymbols = true; Md5.update(GV.getName()); Md5.update(ArrayRef{0}); }; + if (auto *Used = M->getNamedGlobal("llvm.used")) { + if (const auto *A = dyn_cast(Used->getInitializer())) { + for (const Value *Op : A->operands()) { + if (const auto *GV = dyn_cast(Op->stripPointerCasts())) { + Md5.update(GV->getName()); + Md5.update(ArrayRef{0}); + } + } + } + } + if (auto *Used = M->getNamedGlobal("llvm.global_ctors")) { + if (const auto *A = dyn_cast(Used->getInitializer())) { + for (const Value *Op : A->operands()) { + if (const auto *GV = dyn_cast(Op)) { + auto *Elt = GV->getAggregateElement(1); + Md5.update(Elt->getName()); + Md5.update(ArrayRef{0}); + } + } + } + } + + Md5.update(M->getModuleIdentifier()); + Md5.update(ArrayRef{0}); + ExportsSymbols = true; + for (auto &F : *M) AddGlobal(F); for (auto &GV : M->globals()) @@ -233,6 +264,9 @@ SmallString<32> Str; MD5::stringifyResult(R, Str); + + LLVM_DEBUG(dbgs() << "Generated ModuleID: " << Str.str() << "\n"); + return ("." + Str).str(); } Index: llvm/test/CodeGen/PowerPC/aix-static-init-default-priority.ll =================================================================== --- llvm/test/CodeGen/PowerPC/aix-static-init-default-priority.ll +++ llvm/test/CodeGen/PowerPC/aix-static-init-default-priority.ll @@ -28,33 +28,33 @@ ; CHECK: .lglobl init1[DS] ; CHECK: .lglobl .init1 ; CHECK: .csect init1[DS] -; CHECK: __sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0: # @init1 +; CHECK: __sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0: # @init1 ; CHECK: .init1: -; CHECK: .__sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0: +; CHECK: .__sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0: ; CHECK: .lglobl destruct1[DS] ; CHECK: .lglobl .destruct1 ; CHECK: .csect destruct1[DS] -; CHECK: __sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0: # @destruct1 +; CHECK: __sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0: # @destruct1 ; CHECK: .destruct1: -; CHECK: .__sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0: +; CHECK: .__sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0: ; CHECK: .lglobl init2[DS] ; CHECK: .lglobl .init2 ; CHECK: .csect init2[DS] -; CHECK: __sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1: # @init2 +; CHECK: __sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1: # @init2 ; CHECK: .init2: -; CHECK: .__sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1: +; CHECK: .__sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1: ; CHECK: .lglobl destruct2[DS] ; CHECK: .lglobl .destruct2 ; CHECK: .csect destruct2[DS] -; CHECK: __sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1: # @destruct2 +; CHECK: __sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1: # @destruct2 ; CHECK: .destruct2: -; CHECK: .__sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1: - -; CHECK: .globl __sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0 -; CHECK: .globl .__sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0 -; CHECK: .globl __sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1 -; CHECK: .globl .__sinit80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1 -; CHECK: .globl __sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0 -; CHECK: .globl .__sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_0 -; CHECK: .globl __sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1 -; CHECK: .globl .__sterm80000000_clang_ac404299654d2af7eae71e75c17f7c9b_1 +; CHECK: .__sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1: + +; CHECK: .globl __sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0 +; CHECK: .globl .__sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0 +; CHECK: .globl __sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1 +; CHECK: .globl .__sinit80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1 +; CHECK: .globl __sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0 +; CHECK: .globl .__sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_0 +; CHECK: .globl __sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1 +; CHECK: .globl .__sterm80000000_clang_a1bb1778cc94c1a0a7637d6054790664_1 Index: llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll =================================================================== --- llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll +++ llvm/test/CodeGen/PowerPC/aix-static-init-non-default-priority.ll @@ -48,99 +48,99 @@ ; CHECK: .globl .cf1 ; CHECK: .align 2 ; CHECK: .csect cf1[DS] -; CHECK: __sinit00000000_clang_f6a1bc9396775a64c6249effda300afe_0: # @cf1 +; CHECK: __sinit00000000_clang_68423256c9923e2ef42dd17bbb732f44_0: # @cf1 ; CHECK: .cf1: -; CHECK: .__sinit00000000_clang_f6a1bc9396775a64c6249effda300afe_0: +; CHECK: .__sinit00000000_clang_68423256c9923e2ef42dd17bbb732f44_0: ; CHECK: .globl cf2[DS] ; CHECK: .globl .cf2 ; CHECK: .align 2 ; CHECK: .csect cf2[DS] -; CHECK: __sinit00000024_clang_f6a1bc9396775a64c6249effda300afe_1: # @cf2 +; CHECK: __sinit00000024_clang_68423256c9923e2ef42dd17bbb732f44_1: # @cf2 ; CHECK: .cf2: -; CHECK: .__sinit00000024_clang_f6a1bc9396775a64c6249effda300afe_1: +; CHECK: .__sinit00000024_clang_68423256c9923e2ef42dd17bbb732f44_1: ; CHECK: .globl cf3[DS] ; CHECK: .globl .cf3 ; CHECK: .align 2 ; CHECK: .csect cf3[DS] -; CHECK: __sinit000003ec_clang_f6a1bc9396775a64c6249effda300afe_2: # @cf3 +; CHECK: __sinit000003ec_clang_68423256c9923e2ef42dd17bbb732f44_2: # @cf3 ; CHECK: .cf3: -; CHECK: .__sinit000003ec_clang_f6a1bc9396775a64c6249effda300afe_2: +; CHECK: .__sinit000003ec_clang_68423256c9923e2ef42dd17bbb732f44_2: ; CHECK: .globl cf4[DS] ; CHECK: .globl .cf4 ; CHECK: .align 2 ; CHECK: .csect cf4[DS] -; CHECK: __sinit00008c55_clang_f6a1bc9396775a64c6249effda300afe_3: # @cf4 +; CHECK: __sinit00008c55_clang_68423256c9923e2ef42dd17bbb732f44_3: # @cf4 ; CHECK: .cf4: -; CHECK: .__sinit00008c55_clang_f6a1bc9396775a64c6249effda300afe_3: +; CHECK: .__sinit00008c55_clang_68423256c9923e2ef42dd17bbb732f44_3: ; CHECK: .globl cf5[DS] ; CHECK: .globl .cf5 ; CHECK: .align 2 ; CHECK: .csect cf5[DS] -; CHECK: __sinit7ffffc01_clang_f6a1bc9396775a64c6249effda300afe_4: # @cf5 +; CHECK: __sinit7ffffc01_clang_68423256c9923e2ef42dd17bbb732f44_4: # @cf5 ; CHECK: .cf5: -; CHECK: .__sinit7ffffc01_clang_f6a1bc9396775a64c6249effda300afe_4: +; CHECK: .__sinit7ffffc01_clang_68423256c9923e2ef42dd17bbb732f44_4: ; CHECK: .globl df1[DS] ; CHECK: .globl .df1 ; CHECK: .align 2 ; CHECK: .csect df1[DS] -; CHECK: __sterm00000014_clang_f6a1bc9396775a64c6249effda300afe_0: # @df1 +; CHECK: __sterm00000014_clang_68423256c9923e2ef42dd17bbb732f44_0: # @df1 ; CHECK: .df1: -; CHECK: .__sterm00000014_clang_f6a1bc9396775a64c6249effda300afe_0: +; CHECK: .__sterm00000014_clang_68423256c9923e2ef42dd17bbb732f44_0: ; CHECK: .globl df2[DS] ; CHECK: .globl .df2 ; CHECK: .align 2 ; CHECK: .csect df2[DS] -; CHECK: __sterm000003d4_clang_f6a1bc9396775a64c6249effda300afe_1: # @df2 +; CHECK: __sterm000003d4_clang_68423256c9923e2ef42dd17bbb732f44_1: # @df2 ; CHECK: .df2: -; CHECK: .__sterm000003d4_clang_f6a1bc9396775a64c6249effda300afe_1: +; CHECK: .__sterm000003d4_clang_68423256c9923e2ef42dd17bbb732f44_1: ; CHECK: .globl df3[DS] ; CHECK: .globl .df3 ; CHECK: .align 2 ; CHECK: .csect df3[DS] -; CHECK: __sterm000007ff_clang_f6a1bc9396775a64c6249effda300afe_2: # @df3 +; CHECK: __sterm000007ff_clang_68423256c9923e2ef42dd17bbb732f44_2: # @df3 ; CHECK: .df3: -; CHECK: .__sterm000007ff_clang_f6a1bc9396775a64c6249effda300afe_2: +; CHECK: .__sterm000007ff_clang_68423256c9923e2ef42dd17bbb732f44_2: ; CHECK: .globl df4[DS] ; CHECK: .globl .df4 ; CHECK: .align 2 ; CHECK: .csect df4[DS] -; CHECK: __sterm7fff2211_clang_f6a1bc9396775a64c6249effda300afe_3: # @df4 +; CHECK: __sterm7fff2211_clang_68423256c9923e2ef42dd17bbb732f44_3: # @df4 ; CHECK: .df4: -; CHECK: .__sterm7fff2211_clang_f6a1bc9396775a64c6249effda300afe_3: +; CHECK: .__sterm7fff2211_clang_68423256c9923e2ef42dd17bbb732f44_3: ; CHECK: .globl df5[DS] ; CHECK: .globl .df5 ; CHECK: .align 2 ; CHECK: .csect df5[DS] -; CHECK: __sterm80000000_clang_f6a1bc9396775a64c6249effda300afe_4: # @df5 +; CHECK: __sterm80000000_clang_68423256c9923e2ef42dd17bbb732f44_4: # @df5 ; CHECK: .df5: -; CHECK: .__sterm80000000_clang_f6a1bc9396775a64c6249effda300afe_4: - -; CHECK: .globl __sinit00000000_clang_f6a1bc9396775a64c6249effda300afe_0 -; CHECK: .globl .__sinit00000000_clang_f6a1bc9396775a64c6249effda300afe_0 -; CHECK: .globl __sinit00000024_clang_f6a1bc9396775a64c6249effda300afe_1 -; CHECK: .globl .__sinit00000024_clang_f6a1bc9396775a64c6249effda300afe_1 -; CHECK: .globl __sinit000003ec_clang_f6a1bc9396775a64c6249effda300afe_2 -; CHECK: .globl .__sinit000003ec_clang_f6a1bc9396775a64c6249effda300afe_2 -; CHECK: .globl __sinit00008c55_clang_f6a1bc9396775a64c6249effda300afe_3 -; CHECK: .globl .__sinit00008c55_clang_f6a1bc9396775a64c6249effda300afe_3 -; CHECK: .globl __sinit7ffffc01_clang_f6a1bc9396775a64c6249effda300afe_4 -; CHECK: .globl .__sinit7ffffc01_clang_f6a1bc9396775a64c6249effda300afe_4 -; CHECK: .globl __sterm00000014_clang_f6a1bc9396775a64c6249effda300afe_0 -; CHECK: .globl .__sterm00000014_clang_f6a1bc9396775a64c6249effda300afe_0 -; CHECK: .globl __sterm000003d4_clang_f6a1bc9396775a64c6249effda300afe_1 -; CHECK: .globl .__sterm000003d4_clang_f6a1bc9396775a64c6249effda300afe_1 -; CHECK: .globl __sterm000007ff_clang_f6a1bc9396775a64c6249effda300afe_2 -; CHECK: .globl .__sterm000007ff_clang_f6a1bc9396775a64c6249effda300afe_2 -; CHECK: .globl __sterm7fff2211_clang_f6a1bc9396775a64c6249effda300afe_3 -; CHECK: .globl .__sterm7fff2211_clang_f6a1bc9396775a64c6249effda300afe_3 -; CHECK: .globl __sterm80000000_clang_f6a1bc9396775a64c6249effda300afe_4 -; CHECK: .globl .__sterm80000000_clang_f6a1bc9396775a64c6249effda300afe_4 +; CHECK: .__sterm80000000_clang_68423256c9923e2ef42dd17bbb732f44_4: + +; CHECK: .globl __sinit00000000_clang_68423256c9923e2ef42dd17bbb732f44_0 +; CHECK: .globl .__sinit00000000_clang_68423256c9923e2ef42dd17bbb732f44_0 +; CHECK: .globl __sinit00000024_clang_68423256c9923e2ef42dd17bbb732f44_1 +; CHECK: .globl .__sinit00000024_clang_68423256c9923e2ef42dd17bbb732f44_1 +; CHECK: .globl __sinit000003ec_clang_68423256c9923e2ef42dd17bbb732f44_2 +; CHECK: .globl .__sinit000003ec_clang_68423256c9923e2ef42dd17bbb732f44_2 +; CHECK: .globl __sinit00008c55_clang_68423256c9923e2ef42dd17bbb732f44_3 +; CHECK: .globl .__sinit00008c55_clang_68423256c9923e2ef42dd17bbb732f44_3 +; CHECK: .globl __sinit7ffffc01_clang_68423256c9923e2ef42dd17bbb732f44_4 +; CHECK: .globl .__sinit7ffffc01_clang_68423256c9923e2ef42dd17bbb732f44_4 +; CHECK: .globl __sterm00000014_clang_68423256c9923e2ef42dd17bbb732f44_0 +; CHECK: .globl .__sterm00000014_clang_68423256c9923e2ef42dd17bbb732f44_0 +; CHECK: .globl __sterm000003d4_clang_68423256c9923e2ef42dd17bbb732f44_1 +; CHECK: .globl .__sterm000003d4_clang_68423256c9923e2ef42dd17bbb732f44_1 +; CHECK: .globl __sterm000007ff_clang_68423256c9923e2ef42dd17bbb732f44_2 +; CHECK: .globl .__sterm000007ff_clang_68423256c9923e2ef42dd17bbb732f44_2 +; CHECK: .globl __sterm7fff2211_clang_68423256c9923e2ef42dd17bbb732f44_3 +; CHECK: .globl .__sterm7fff2211_clang_68423256c9923e2ef42dd17bbb732f44_3 +; CHECK: .globl __sterm80000000_clang_68423256c9923e2ef42dd17bbb732f44_4 +; CHECK: .globl .__sterm80000000_clang_68423256c9923e2ef42dd17bbb732f44_4 Index: llvm/test/LTO/Resolution/X86/llvm-used-moduleid.ll =================================================================== --- /dev/null +++ llvm/test/LTO/Resolution/X86/llvm-used-moduleid.ll @@ -0,0 +1,19 @@ +; RUN: opt <%s -thinlto-bc -thinlto-split-lto-unit -o %t0 +; RUN: llvm-bcanalyzer %t0 | FileCheck %s + +target triple="x86_64-pc-linux-gnu" + +@llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @a to i8*)], !type !0 + +declare i1 @llvm.type.test(i8*, metadata) +declare void @llvm.assume(i1) + +; CHECK: GLOBALVAL_SUMMARY_BLOCK +; CHECK: FULL_LTO_GLOBALVAL_SUMMARY_BLOCK +define internal void @a() { + %1 = call i1 @llvm.type.test(i8* undef, metadata !"a") + call void @llvm.assume(i1 %1) + ret void +} + +!0 = !{i64 16, !"a"} Index: llvm/test/LTO/Resolution/X86/weak-linkage-moduleid.ll =================================================================== --- /dev/null +++ llvm/test/LTO/Resolution/X86/weak-linkage-moduleid.ll @@ -0,0 +1,19 @@ +; RUN: opt <%s -thinlto-bc -thinlto-split-lto-unit -o %t0 +; RUN: llvm-bcanalyzer %t0 | FileCheck %s + +target triple="x86_64-pc-linux-gnu" + +@p = weak global void ()* @a, !type !0 + +declare i1 @llvm.type.test(i8*, metadata) +declare void @llvm.assume(i1) + +; CHECK: GLOBALVAL_SUMMARY_BLOCK +; CHECK: FULL_LTO_GLOBALVAL_SUMMARY_BLOCK +define internal void @a() { + %1 = call i1 @llvm.type.test(i8* undef, metadata !"a") + call void @llvm.assume(i1 %1) + ret void +} + +!0 = !{i64 16, !"a"} Index: llvm/test/LTO/X86/path-moduleid.ll =================================================================== --- /dev/null +++ llvm/test/LTO/X86/path-moduleid.ll @@ -0,0 +1,27 @@ +; REQUIRES: asserts +; Test that chaning the path to the module doesn't effect the ModuleID. This +; file and Inputs/path-moduleid.ll have the same content, and thus should have +; the same ModuleID. +; RUN: opt -o /dev/null -thinlto-bc -thinlto-split-lto-unit=1 --debug-only=moduleutils %s 2>%t0 +; RUN: mkdir -p %t; cp %s %t/path-moduleid.ll +; RUN: opt -o /dev/null -thinlto-bc -thinlto-split-lto-unit=1 --debug-only=moduleutils %t/path-moduleid.ll 2>%t1 +; RUN: FileCheck %s <%t0 +; RUN: FileCheck %s <%t1 +; RUN: not diff %t0 %t1 + +; CHECK: Generated ModuleID: +target triple="x86_64-pc-linux-gnu" + +@llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @a to i8*)], !type !0 + +declare i1 @llvm.type.test(i8*, metadata) +declare void @llvm.assume(i1) + +define internal void @a() { + %1 = call i1 @llvm.type.test(i8* undef, metadata !"a") + call void @llvm.assume(i1 %1) + ret void +} + + +!0 = !{i64 16, !"a"} Index: llvm/test/Transforms/Util/generate-moduleid.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/Util/generate-moduleid.ll @@ -0,0 +1,17 @@ +; REQUIRES: asserts +; RUN: opt --thinlto-split-lto-unit=1 --thinlto-bc -o %t0 -debug-only=moduleutils <%s 2>&1 | FileCheck %s +; CHECK: Generated ModuleID + +target triple="x86_64-pc-linux-gnu" + +declare i1 @llvm.type.test(i8*, metadata) + +define internal void @foo() !type !1{ +entry: + %0 = tail call i1 @llvm.type.test(i8* null, metadata !"") + ret void +} + +@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 103, void ()* @foo, i8* null }] + +!1 = !{i64 0, !"foo"}