[PATCH] D103120: LTO: Export functions referenced by non-canonical CFI jump tables

Sami Tolvanen via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue May 25 15:22:01 PDT 2021


samitolvanen created this revision.
Herald added subscribers: steven_wu, hiraditya, inglorion.
samitolvanen requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D103120

Files:
  llvm/lib/LTO/LTO.cpp
  llvm/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll


Index: llvm/test/LTO/Resolution/X86/export-jumptable-noncanonical.ll
===================================================================
--- /dev/null
+++ 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}
Index: llvm/lib/LTO/LTO.cpp
===================================================================
--- llvm/lib/LTO/LTO.cpp
+++ llvm/lib/LTO/LTO.cpp
@@ -1480,6 +1480,9 @@
   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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103120.347803.patch
Type: text/x-patch
Size: 1911 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210525/b0af18e8/attachment.bin>


More information about the llvm-commits mailing list