[clang] [lld] [llvm] [LTO][LLD] Prevent invalid LTO libfunc transforms (PR #164916)
Daniel Thornburgh via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 13 16:48:16 PST 2026
================
@@ -279,9 +279,31 @@ static void runNewPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM,
RegisterPassPlugins(Conf.PassPlugins, PB);
std::unique_ptr<TargetLibraryInfoImpl> TLII(
- new TargetLibraryInfoImpl(TM->getTargetTriple(), TM->Options.VecLib));
+ new TargetLibraryInfoImpl(TM->getTargetTriple()));
if (Conf.Freestanding)
TLII->disableAllFunctions();
+
+ TargetLibraryInfo TLI(*TLII);
+ for (unsigned I = 0, E = static_cast<unsigned>(LibFunc::NumLibFuncs); I != E;
+ ++I) {
+ LibFunc F = static_cast<LibFunc>(I);
+ StringRef Name = TLI.getName(F);
+ GlobalValue *Val = Mod.getNamedValue(Name);
+
+ // LibFuncs present in the current TU can always be referenced.
+ if (Val && !Val->isDeclaration())
+ continue;
+
+ // LibFuncs not implemented in bitcode can always be referenced.
+ if (!BitcodeLibFuncs.contains(Name))
+ continue;
+
+ // FIXME: Functions that are somewhere in a ThinLTO link (just not imported
+ // in this module) should not be disabled, as they have already been
+ // extracted.
----------------
mysterymath wrote:
IIRC it's something that would have to be added; the symbol table seen by the LTO backend has only symbols that directly concern a given TU; it doesn't have a global view of the module. Another way I thought to might go about was something like summarily including libcalls into the symbol table without importing them. Still seems worth its own change either way.
https://github.com/llvm/llvm-project/pull/164916
More information about the cfe-commits
mailing list