@@ -2,7 +2,6 @@ use std::collections::BTreeMap;
22use std:: ffi:: { CStr , CString } ;
33use std:: fs:: File ;
44use std:: path:: { Path , PathBuf } ;
5- use std:: ptr:: NonNull ;
65use std:: sync:: Arc ;
76use std:: { io, iter, slice} ;
87
@@ -187,7 +186,7 @@ pub(crate) fn run_thin(
187186 dcx : DiagCtxtHandle < ' _ > ,
188187 exported_symbols_for_lto : & [ String ] ,
189188 each_linked_rlib_for_lto : & [ PathBuf ] ,
190- modules : Vec < ( String , ThinBuffer ) > ,
189+ modules : Vec < ( String , ModuleBuffer ) > ,
191190 cached_modules : Vec < ( SerializedModule < ModuleBuffer > , WorkProduct ) > ,
192191) -> ( Vec < ThinModule < LlvmCodegenBackend > > , Vec < WorkProduct > ) {
193192 let ( symbols_below_threshold, upstream_modules) =
@@ -203,12 +202,6 @@ pub(crate) fn run_thin(
203202 thin_lto ( cgcx, prof, dcx, modules, upstream_modules, cached_modules, & symbols_below_threshold)
204203}
205204
206- pub ( crate ) fn prepare_thin ( module : ModuleCodegen < ModuleLlvm > ) -> ( String , ThinBuffer ) {
207- let name = module. name ;
208- let buffer = ThinBuffer :: new ( module. module_llvm . llmod ( ) , true ) ;
209- ( name, buffer)
210- }
211-
212205fn fat_lto (
213206 cgcx : & CodegenContext ,
214207 prof : & SelfProfilerRef ,
@@ -297,7 +290,7 @@ fn fat_lto(
297290 // way we know of to do that is to serialize them to a string and them parse
298291 // them later. Not great but hey, that's why it's "fat" LTO, right?
299292 for module in in_memory {
300- let buffer = ModuleBuffer :: new ( module. module_llvm . llmod ( ) ) ;
293+ let buffer = ModuleBuffer :: new ( module. module_llvm . llmod ( ) , false ) ;
301294 let llmod_id = CString :: new ( & module. name [ ..] ) . unwrap ( ) ;
302295 serialized_modules. push ( ( SerializedModule :: Local ( buffer) , llmod_id) ) ;
303296 }
@@ -400,7 +393,7 @@ fn thin_lto(
400393 cgcx : & CodegenContext ,
401394 prof : & SelfProfilerRef ,
402395 dcx : DiagCtxtHandle < ' _ > ,
403- modules : Vec < ( String , ThinBuffer ) > ,
396+ modules : Vec < ( String , ModuleBuffer ) > ,
404397 serialized_modules : Vec < ( SerializedModule < ModuleBuffer > , CString ) > ,
405398 cached_modules : Vec < ( SerializedModule < ModuleBuffer > , WorkProduct ) > ,
406399 symbols_below_threshold : & [ * const libc:: c_char ] ,
@@ -634,7 +627,9 @@ pub(crate) fn run_pass_manager(
634627 } ;
635628
636629 unsafe {
637- write:: llvm_optimize ( cgcx, prof, dcx, module, None , config, opt_level, opt_stage, stage) ;
630+ write:: llvm_optimize (
631+ cgcx, prof, dcx, module, None , None , config, opt_level, opt_stage, stage,
632+ ) ;
638633 }
639634
640635 if cfg ! ( feature = "llvm_enzyme" ) && enable_ad && !thin {
@@ -643,7 +638,7 @@ pub(crate) fn run_pass_manager(
643638 if !config. autodiff . contains ( & config:: AutoDiff :: NoPostopt ) {
644639 unsafe {
645640 write:: llvm_optimize (
646- cgcx, prof, dcx, module, None , config, opt_level, opt_stage, stage,
641+ cgcx, prof, dcx, module, None , None , config, opt_level, opt_stage, stage,
647642 ) ;
648643 }
649644 }
@@ -658,31 +653,26 @@ pub(crate) fn run_pass_manager(
658653 debug ! ( "lto done" ) ;
659654}
660655
661- pub struct ModuleBuffer ( & ' static mut llvm:: ModuleBuffer ) ;
662-
663- unsafe impl Send for ModuleBuffer { }
664- unsafe impl Sync for ModuleBuffer { }
656+ #[ repr( transparent) ]
657+ pub ( crate ) struct Buffer ( & ' static mut llvm:: Buffer ) ;
665658
666- impl ModuleBuffer {
667- pub ( crate ) fn new ( m : & llvm:: Module ) -> ModuleBuffer {
668- ModuleBuffer ( unsafe { llvm:: LLVMRustModuleBufferCreate ( m) } )
669- }
670- }
659+ unsafe impl Send for Buffer { }
660+ unsafe impl Sync for Buffer { }
671661
672- impl ModuleBufferMethods for ModuleBuffer {
673- fn data ( & self ) -> & [ u8 ] {
662+ impl Buffer {
663+ pub ( crate ) fn data ( & self ) -> & [ u8 ] {
674664 unsafe {
675- let ptr = llvm:: LLVMRustModuleBufferPtr ( self . 0 ) ;
676- let len = llvm:: LLVMRustModuleBufferLen ( self . 0 ) ;
665+ let ptr = llvm:: LLVMRustBufferPtr ( self . 0 ) ;
666+ let len = llvm:: LLVMRustBufferLen ( self . 0 ) ;
677667 slice:: from_raw_parts ( ptr, len)
678668 }
679669 }
680670}
681671
682- impl Drop for ModuleBuffer {
672+ impl Drop for Buffer {
683673 fn drop ( & mut self ) {
684674 unsafe {
685- llvm:: LLVMRustModuleBufferFree ( & mut * ( self . 0 as * mut _ ) ) ;
675+ llvm:: LLVMRustBufferFree ( & mut * ( self . 0 as * mut _ ) ) ;
686676 }
687677 }
688678}
@@ -700,48 +690,22 @@ impl Drop for ThinData {
700690 }
701691}
702692
703- pub struct ThinBuffer ( & ' static mut llvm:: ThinLTOBuffer ) ;
704-
705- unsafe impl Send for ThinBuffer { }
706- unsafe impl Sync for ThinBuffer { }
707-
708- impl ThinBuffer {
709- pub ( crate ) fn new ( m : & llvm:: Module , is_thin : bool ) -> ThinBuffer {
710- unsafe {
711- let buffer = llvm:: LLVMRustThinLTOBufferCreate ( m, is_thin) ;
712- ThinBuffer ( buffer)
713- }
714- }
715-
716- pub ( crate ) unsafe fn from_raw_ptr ( ptr : * mut llvm:: ThinLTOBuffer ) -> ThinBuffer {
717- let mut ptr = NonNull :: new ( ptr) . unwrap ( ) ;
718- ThinBuffer ( unsafe { ptr. as_mut ( ) } )
719- }
720-
721- pub ( crate ) fn thin_link_data ( & self ) -> & [ u8 ] {
722- unsafe {
723- let ptr = llvm:: LLVMRustThinLTOBufferThinLinkDataPtr ( self . 0 ) as * const _ ;
724- let len = llvm:: LLVMRustThinLTOBufferThinLinkDataLen ( self . 0 ) ;
725- slice:: from_raw_parts ( ptr, len)
726- }
727- }
693+ pub struct ModuleBuffer {
694+ data : Buffer ,
728695}
729696
730- impl ThinBufferMethods for ThinBuffer {
731- fn data ( & self ) -> & [ u8 ] {
697+ impl ModuleBuffer {
698+ pub ( crate ) fn new ( m : & llvm :: Module , is_thin : bool ) -> ModuleBuffer {
732699 unsafe {
733- let ptr = llvm:: LLVMRustThinLTOBufferPtr ( self . 0 ) as * const _ ;
734- let len = llvm:: LLVMRustThinLTOBufferLen ( self . 0 ) ;
735- slice:: from_raw_parts ( ptr, len)
700+ let buffer = llvm:: LLVMRustModuleSerialize ( m, is_thin) ;
701+ ModuleBuffer { data : Buffer ( buffer) }
736702 }
737703 }
738704}
739705
740- impl Drop for ThinBuffer {
741- fn drop ( & mut self ) {
742- unsafe {
743- llvm:: LLVMRustThinLTOBufferFree ( & mut * ( self . 0 as * mut _ ) ) ;
744- }
706+ impl ModuleBufferMethods for ModuleBuffer {
707+ fn data ( & self ) -> & [ u8 ] {
708+ self . data . data ( )
745709 }
746710}
747711
0 commit comments