@@ -566,7 +566,7 @@ extern "C" LLVMRustResult LLVMRustOptimize(
566566 LLVMModuleRef ModuleRef, LLVMTargetMachineRef TMRef,
567567 LLVMRustPassBuilderOptLevel OptLevelRust, LLVMRustOptStage OptStage,
568568 bool IsLinkerPluginLTO, bool NoPrepopulatePasses, bool VerifyIR,
569- bool LintIR, LLVMRustThinLTOBuffer **ThinLTOBufferRef, bool EmitThinLTO,
569+ bool LintIR, LLVMRustThinLTOBuffer **ThinLTOBufferRef,
570570 bool EmitThinLTOSummary, bool MergeFunctions, bool UnrollLoops,
571571 bool SLPVectorize, bool LoopVectorize, bool DisableSimplifyLibCalls,
572572 bool EmitLifetimeMarkers, registerEnzymeAndPassPipelineFn EnzymePtr,
@@ -808,7 +808,7 @@ extern "C" LLVMRustResult LLVMRustOptimize(
808808 }
809809
810810 ModulePassManager MPM ;
811- bool NeedThinLTOBufferPasses = EmitThinLTO ;
811+ bool NeedThinLTOBufferPasses = true ;
812812 auto ThinLTOBuffer = std::make_unique<LLVMRustThinLTOBuffer>();
813813 raw_string_ostream ThinLTODataOS (ThinLTOBuffer->data );
814814 raw_string_ostream ThinLinkDataOS (ThinLTOBuffer->thin_link_data );
@@ -840,12 +840,8 @@ extern "C" LLVMRustResult LLVMRustOptimize(
840840 // bitcode for embedding is obtained after performing
841841 // `ThinLTOPreLinkDefaultPipeline`.
842842 MPM .addPass (PB .buildThinLTOPreLinkDefaultPipeline (OptLevel));
843- if (EmitThinLTO) {
844- MPM .addPass (ThinLTOBitcodeWriterPass (
845- ThinLTODataOS, EmitThinLTOSummary ? &ThinLinkDataOS : nullptr ));
846- } else {
847- MPM .addPass (BitcodeWriterPass (ThinLTODataOS));
848- }
843+ MPM .addPass (ThinLTOBitcodeWriterPass (
844+ ThinLTODataOS, EmitThinLTOSummary ? &ThinLinkDataOS : nullptr ));
849845 *ThinLTOBufferRef = ThinLTOBuffer.release ();
850846 MPM .addPass (PB .buildModuleOptimizationPipeline (
851847 OptLevel, ThinOrFullLTOPhase::None));
@@ -870,6 +866,7 @@ extern "C" LLVMRustResult LLVMRustOptimize(
870866 break ;
871867 case LLVMRustOptStage::FatLTO:
872868 MPM = PB .buildLTODefaultPipeline (OptLevel, nullptr );
869+ NeedThinLTOBufferPasses = false ;
873870 break ;
874871 }
875872 }
@@ -895,9 +892,11 @@ extern "C" LLVMRustResult LLVMRustOptimize(
895892 MPM .addPass (CanonicalizeAliasesPass ());
896893 MPM .addPass (NameAnonGlobalPass ());
897894 }
898- // For `-Copt-level=0`, ThinLTO, or LTO.
895+ // For `-Copt-level=0`, and the pre-link fat/thin LTO stages .
899896 if (ThinLTOBufferRef && *ThinLTOBufferRef == nullptr ) {
900- if (EmitThinLTO) {
897+ // thin lto summaries prevent fat lto, so do not emit them if fat
898+ // lto is requested. See PR #136840 for background information.
899+ if (OptStage != LLVMRustOptStage::PreLinkFatLTO) {
901900 MPM .addPass (ThinLTOBitcodeWriterPass (
902901 ThinLTODataOS, EmitThinLTOSummary ? &ThinLinkDataOS : nullptr ));
903902 } else {
0 commit comments