[PATCH] D144982: Fix -fsplit-lto-unit with ifuncs

Daniel Kiss via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 28 10:01:16 PST 2023


danielkiss created this revision.
danielkiss added reviewers: tejohnson, aeubanks.
Herald added subscribers: ormris, steven_wu, hiraditya, inglorion, Prazek.
Herald added a project: All.
danielkiss requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

ifuncs can't take part of the whole-program devirtualization so no need them to be copied to the merged module. 
The corresponding resolver function also kept out which caused the crash.

Fixes #60962


https://reviews.llvm.org/D144982

Files:
  llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
  llvm/test/ThinLTO/X86/ifunc_splitlto.ll


Index: llvm/test/ThinLTO/X86/ifunc_splitlto.ll
===================================================================
--- /dev/null
+++ llvm/test/ThinLTO/X86/ifunc_splitlto.ll
@@ -0,0 +1,31 @@
+; regresstion test for https://github.com/llvm/llvm-project/issues/60962
+; 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
+
+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"
+
+ at i = ifunc ptr (ptr, i64), ptr @hoge
+
+ at g = constant i8 1, !type !0
+ at assoc = private constant i8 2, !associated !1
+
+define ptr @hoge() !type !2 {
+bb:
+  ret ptr null
+}
+
+; M0: @g = external constant
+; M0: @i = ifunc ptr (ptr, i64), ptr @hoge
+; M0: define ptr @hoge()
+; M0-NOT: @assoc
+; M1: @g = constant i8 1
+; M1: @assoc = private constant i8 2
+; M1-NOT: @i = ifunc ptr (ptr, i64), ptr @hoge
+; M1-NOT: define ptr @hoge()
+
+!0 = !{i32 0, !"typeid"}
+!1 = !{ptr @g}
+!2 = !{i64 0, !2}
+!3 = distinct !{}
Index: llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
===================================================================
--- llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
+++ llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
@@ -340,6 +340,14 @@
   StripDebugInfo(*MergedM);
   MergedM->setModuleInlineAsm("");
 
+  // Remove ifuncs from MergedM due the corresponding functions are also
+  // kept out from MergeM.
+  SmallVector<GlobalIFunc *, 8> IFuncsToErease;
+  for (auto &IF : MergedM->ifuncs())
+    IFuncsToErease.push_back(&IF);
+  for (auto &IF : IFuncsToErease)
+    MergedM->eraseIFunc(IF);
+
   // Clone any llvm.*used globals to ensure the included values are
   // not deleted.
   cloneUsedGlobalVariables(M, *MergedM, /*CompilerUsed*/ false);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144982.501193.patch
Type: text/x-patch
Size: 1914 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230228/0587e5bd/attachment.bin>


More information about the llvm-commits mailing list