[llvm] 2f9ba6a - LTO: Export functions referenced by non-canonical CFI jump tables

Nick Desaulniers via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 8 15:07:45 PDT 2021


Author: Sami Tolvanen
Date: 2021-06-08T14:57:43-07:00
New Revision: 2f9ba6aa8b6d805728b5df42b7b049b3c23d28a2

URL: https://github.com/llvm/llvm-project/commit/2f9ba6aa8b6d805728b5df42b7b049b3c23d28a2
DIFF: https://github.com/llvm/llvm-project/commit/2f9ba6aa8b6d805728b5df42b7b049b3c23d28a2.diff

LOG: 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

Added: 
    llvm/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll

Modified: 
    llvm/lib/LTO/LTO.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp
index d594c19dc92ba..69d500ba9bcec 100644
--- a/llvm/lib/LTO/LTO.cpp
+++ b/llvm/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/llvm/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll b/llvm/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll
new file mode 100644
index 0000000000000..21221751520fc
--- /dev/null
+++ b/llvm/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}


        


More information about the llvm-commits mailing list