@@ -7,6 +7,7 @@ use std::sync::Arc;
77use std:: { io, iter, slice} ;
88
99use object:: read:: archive:: ArchiveFile ;
10+ use object:: { Object , ObjectSection } ;
1011use rustc_codegen_ssa:: back:: lto:: { SerializedModule , ThinModule , ThinShared } ;
1112use rustc_codegen_ssa:: back:: write:: { CodegenContext , FatLtoInput } ;
1213use rustc_codegen_ssa:: traits:: * ;
@@ -105,31 +106,15 @@ fn get_bitcode_slice_from_object_data<'a>(
105106 // name" which in the public API for sections gets treated as part of the section name, but
106107 // internally in MachOObjectFile.cpp gets treated separately.
107108 let section_name = bitcode_section_name ( cgcx) . to_str ( ) . unwrap ( ) . trim_start_matches ( "__LLVM," ) ;
108- let mut len = 0 ;
109- let data = unsafe {
110- llvm:: LLVMRustGetSliceFromObjectDataByName (
111- obj. as_ptr ( ) ,
112- obj. len ( ) ,
113- section_name. as_ptr ( ) ,
114- section_name. len ( ) ,
115- & mut len,
116- )
117- } ;
118- if !data. is_null ( ) {
119- assert ! ( len != 0 ) ;
120- let bc = unsafe { slice:: from_raw_parts ( data, len) } ;
121109
122- // `bc` must be a sub-slice of `obj`.
123- assert ! ( obj. as_ptr( ) <= bc. as_ptr( ) ) ;
124- assert ! ( bc[ bc. len( ) ..bc. len( ) ] . as_ptr( ) <= obj[ obj. len( ) ..obj. len( ) ] . as_ptr( ) ) ;
110+ let obj =
111+ object:: File :: parse ( obj) . map_err ( |err| LtoBitcodeFromRlib { err : err. to_string ( ) } ) ?;
125112
126- Ok ( bc)
127- } else {
128- assert ! ( len == 0 ) ;
129- Err ( LtoBitcodeFromRlib {
130- llvm_err : llvm:: last_error ( ) . unwrap_or_else ( || "unknown LLVM error" . to_string ( ) ) ,
131- } )
132- }
113+ let section = obj
114+ . section_by_name ( section_name)
115+ . ok_or_else ( || LtoBitcodeFromRlib { err : format ! ( "Can't find section {section_name}" ) } ) ?;
116+
117+ section. data ( ) . map_err ( |err| LtoBitcodeFromRlib { err : err. to_string ( ) } )
133118}
134119
135120/// Performs fat LTO by merging all modules into a single one and returning it
0 commit comments