From 8a617a5f4496c68d7297f025e0d24473e9f57d29 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Wed, 26 Jun 2024 14:51:24 -0400 Subject: [PATCH] [LTO] Avoid assert fail on failed pass plugin load (#96691) Without this patch, passing -load-pass-plugin=nonexistent.so to llvm-lto2 produces a backtrace because LTOBackend.cpp does not handle the error correctly: ``` Failed to load passes from 'nonexistant.so'. Request ignored. Expected must be checked before access or destruction. Unchecked Expected contained error: Could not load library 'nonexistant.so': nonexistant.so: cannot open shared object file: No such file or directoryPLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace. ``` Any tool using `lto::Config::PassPlugins` should suffer similarly. Based on the message "Request ignored" and the continue statement, the intention was apparently to continue on failure to load a plugin. However, no one appears to rely on that behavior now given that it crashes instead, and terminating is consistent with opt. --- llvm/lib/LTO/LTOBackend.cpp | 8 ++------ llvm/test/Feature/load_plugin_error.ll | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index 84a69d9ff1a1f5e..d5d642f0d25e6cf 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -191,12 +191,8 @@ static void RegisterPassPlugins(ArrayRef PassPlugins, // Load requested pass plugins and let them register pass builder callbacks for (auto &PluginFN : PassPlugins) { auto PassPlugin = PassPlugin::Load(PluginFN); - if (!PassPlugin) { - errs() << "Failed to load passes from '" << PluginFN - << "'. Request ignored.\n"; - continue; - } - + if (!PassPlugin) + report_fatal_error(PassPlugin.takeError(), /*gen_crash_diag=*/false); PassPlugin->registerPassBuilderCallbacks(PB); } } diff --git a/llvm/test/Feature/load_plugin_error.ll b/llvm/test/Feature/load_plugin_error.ll index 24a7cce5d8d397e..dc6e037d113870e 100644 --- a/llvm/test/Feature/load_plugin_error.ll +++ b/llvm/test/Feature/load_plugin_error.ll @@ -1,5 +1,18 @@ -; REQUIRES: plugins, examples +; REQUIRES: plugins ; UNSUPPORTED: target={{.*windows.*}} -; RUN: not opt < %s -load-pass-plugin=%t/nonexistant.so -disable-output 2>&1 | FileCheck %s -; CHECK: Could not load library {{.*}}nonexistant.so +; RUN: not opt < %s -load-pass-plugin=%t/nonexistent.so -disable-output 2>&1 | FileCheck %s + +; RUN: opt %s -o %t.o +; RUN: not llvm-lto2 run -load-pass-plugin=%t/nonexistent.so %t.o -o %t \ +; RUN: -r %t.o,test 2>&1 | \ +; RUN: FileCheck %s + +; CHECK: Could not load library {{.*}}nonexistent.so + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define void @test() { + ret void +}