From dd9682196be6741879c76fa12e89164537d1f96d Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Mon, 29 Jul 2019 17:22:40 +0000 Subject: [PATCH] ThinLTOBitcodeWriter: Include globals associated with type metadata globals in the merged module. Globals that are associated with globals with type metadata need to appear in the merged module because they will reference the global's section directly. Differential Revision: https://reviews.llvm.org/D65312 llvm-svn: 367242 --- llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp | 14 +++++++++++--- .../Transforms/ThinLTOBitcodeWriter/associated.ll | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/ThinLTOBitcodeWriter/associated.ll diff --git a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index 24c476376c14..f0dea11e1b1c 100644 --- a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -218,10 +218,18 @@ void splitAndWriteThinLTOBitcode( promoteTypeIds(M, ModuleId); - // Returns whether a global has attached type metadata. Such globals may - // participate in CFI or whole-program devirtualization, so they need to - // appear in the merged module instead of the thin LTO module. + // Returns whether a global or its associated global has attached type + // metadata. The former may participate in CFI or whole-program + // devirtualization, so they need to appear in the merged module instead of + // the thin LTO module. Similarly, globals that are associated with globals + // with type metadata need to appear in the merged module because they will + // reference the global's section directly. auto HasTypeMetadata = [](const GlobalObject *GO) { + if (MDNode *MD = GO->getMetadata(LLVMContext::MD_associated)) + if (auto *AssocVM = dyn_cast_or_null(MD->getOperand(0))) + if (auto *AssocGO = dyn_cast(AssocVM->getValue())) + if (AssocGO->hasMetadata(LLVMContext::MD_type)) + return true; return GO->hasMetadata(LLVMContext::MD_type); }; diff --git a/llvm/test/Transforms/ThinLTOBitcodeWriter/associated.ll b/llvm/test/Transforms/ThinLTOBitcodeWriter/associated.ll new file mode 100644 index 000000000000..600791d76993 --- /dev/null +++ b/llvm/test/Transforms/ThinLTOBitcodeWriter/associated.ll @@ -0,0 +1,14 @@ +; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s +; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s +; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s + +; M0: @g = external constant +; M0-NOT: @assoc +; M1: @g = constant i8 1 +; M1: @assoc = private constant i8 2 + +@g = constant i8 1, !type !0 +@assoc = private constant i8 2, !associated !1 + +!0 = !{i32 0, !"typeid"} +!1 = !{i8* @g}