From dd2d6bb1ca343e26f0351f771eae134c239d3d9a Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Tue, 8 Jun 2021 14:57:32 -0700 Subject: [PATCH] LTO: Export functions referenced by non-canonical CFI jump tables LowerTypeTests pass adds functions with a non-canonical jump table to cfiFunctionDecls instead of cfiFunctionDefs. As the jump table is in the regular LTO object, these functions will also need to be exported. This change fixes the non-canonical jump table case and adds a test similar to the existing one for canonical jump tables. Reviewed By: pcc Differential Revision: https://reviews.llvm.org/D103120 --- lib/LTO/LTO.cpp | 3 ++ .../X86/export-jumptable-noncanonical.ll | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/LTO/Resolution/X86/export-jumptable-noncanonical.ll diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index d594c19dc92..69d500ba9bc 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -1480,6 +1480,9 @@ Error LTO::runThinLTO(AddStreamFn AddStream, NativeObjectCache Cache, for (auto &Def : ThinLTO.CombinedIndex.cfiFunctionDefs()) ExportedGUIDs.insert( GlobalValue::getGUID(GlobalValue::dropLLVMManglingEscape(Def))); + for (auto &Decl : ThinLTO.CombinedIndex.cfiFunctionDecls()) + ExportedGUIDs.insert( + GlobalValue::getGUID(GlobalValue::dropLLVMManglingEscape(Decl))); auto isExported = [&](StringRef ModuleIdentifier, ValueInfo VI) { const auto &ExportList = ExportLists.find(ModuleIdentifier); diff --git a/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll b/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll new file mode 100644 index 00000000000..21221751520 --- /dev/null +++ b/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll @@ -0,0 +1,35 @@ +; Test that we do not internalize functions that appear in the CFI jump table in +; the full LTO object file; any such functions will be referenced by the jump +; table. + +; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s +; RUN: llvm-lto2 run -o %t2 -r %t,f1,p -r %t,f2,p -r %t,_start,px %t -save-temps +; RUN: llvm-dis %t2.1.2.internalize.bc -o - | FileCheck %s + +target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK: define void @f1() +define void @f1() !type !0 { + ret void +} + +; CHECK: define internal void @f2() +define void @f2() !type !1 { + ret void +} + +define i1 @_start(i1 %i) { + %1 = select i1 %i, void ()* @f1, void ()* @f2 + %2 = bitcast void ()* %1 to i8* + %3 = call i1 @llvm.type.test(i8* %2, metadata !"typeid1") + ret i1 %3 +} + +declare i1 @llvm.type.test(i8*, metadata) + +!llvm.module.flags = !{!2} + +!0 = !{i64 0, !"typeid1"} +!1 = !{i64 0, !"typeid2"} +!2 = !{i32 4, !"CFI Canonical Jump Tables", i32 0}