jhuber6 created this revision. jhuber6 added reviewers: jdoerfert, tianshilei1992, ye-luo. Herald added a subscriber: inglorion. Herald added a project: All. jhuber6 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
The LTO pipeline handles its errors using the diagnostics handler callback function. We were not checking the results of these errors and not properly returning an error code in the linker wrapper when errors occured inside of the LTO pipeline. This patch adds a simple boolean flag to indicate if the LTO backend failed to any reason and quit. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D129423 Files: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp =================================================================== --- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -89,6 +89,9 @@ /// Codegen flags for LTO backend. static codegen::RegisterCodeGenFlags CodeGenFlags; +/// Global flag to indicate that the LTO pipeline threw an error. +static std::atomic<bool> LTOError; + /// Magic section string that marks the existence of offloading data. The /// section will contain one or more offloading binaries stored contiguously. #define OFFLOAD_SECTION_MAGIC_STR ".llvm.offloading" @@ -694,6 +697,7 @@ switch (DI.getSeverity()) { case DS_Error: WithColor::error(errs(), LinkerExecutable) << ErrStorage << "\n"; + LTOError = true; break; case DS_Warning: WithColor::warning(errs(), LinkerExecutable) << ErrStorage << "\n"; @@ -763,6 +767,8 @@ if (Conf.OptLevel > 0) Conf.UseDefaultPipeline = true; Conf.DefaultTriple = Triple.getTriple(); + + LTOError = false; Conf.DiagHandler = diagnosticHandler; Conf.PTO.LoopVectorization = Conf.OptLevel > 1; @@ -968,6 +974,10 @@ if (Error Err = LTOBackend->run(AddStream)) return Err; + if (LTOError) + return createStringError(inconvertibleErrorCode(), + "Errors encountered inside the LTO pipeline."); + // If we are embedding bitcode we only need the intermediate output. if (Args.hasArg(OPT_embed_bitcode)) { if (BitcodeOutput.size() != 1 || !WholeProgram)
Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp =================================================================== --- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -89,6 +89,9 @@ /// Codegen flags for LTO backend. static codegen::RegisterCodeGenFlags CodeGenFlags; +/// Global flag to indicate that the LTO pipeline threw an error. +static std::atomic<bool> LTOError; + /// Magic section string that marks the existence of offloading data. The /// section will contain one or more offloading binaries stored contiguously. #define OFFLOAD_SECTION_MAGIC_STR ".llvm.offloading" @@ -694,6 +697,7 @@ switch (DI.getSeverity()) { case DS_Error: WithColor::error(errs(), LinkerExecutable) << ErrStorage << "\n"; + LTOError = true; break; case DS_Warning: WithColor::warning(errs(), LinkerExecutable) << ErrStorage << "\n"; @@ -763,6 +767,8 @@ if (Conf.OptLevel > 0) Conf.UseDefaultPipeline = true; Conf.DefaultTriple = Triple.getTriple(); + + LTOError = false; Conf.DiagHandler = diagnosticHandler; Conf.PTO.LoopVectorization = Conf.OptLevel > 1; @@ -968,6 +974,10 @@ if (Error Err = LTOBackend->run(AddStream)) return Err; + if (LTOError) + return createStringError(inconvertibleErrorCode(), + "Errors encountered inside the LTO pipeline."); + // If we are embedding bitcode we only need the intermediate output. if (Args.hasArg(OPT_embed_bitcode)) { if (BitcodeOutput.size() != 1 || !WholeProgram)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits