@@ -977,7 +977,6 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
977977 cx,
978978 cursor,
979979 current_fn,
980- basic_block : llbb,
981980 current_span : Default :: default ( ) ,
982981 }
983982 }
@@ -987,7 +986,8 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
987986 }
988987
989988 fn llbb ( & self ) -> Self :: BasicBlock {
990- self . basic_block
989+ // FIXME(eddyb) `llbb` should be removed from `rustc_codegen_ssa::traits`.
990+ unreachable ! ( "dead code within `rustc_codegen_ssa`" )
991991 }
992992
993993 fn set_span ( & mut self , span : Span ) {
@@ -2797,7 +2797,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
27972797 ///
27982798 /// E.g. for `format_args!("{a} {b:x}")` they'll be:
27992799 /// * `&a` with `typeof a` and ' ',
2800- /// * `&b` with `typeof b` and 'x'
2800+ /// * `&b` with `typeof b` and 'x'
28012801 ref_arg_ids_with_ty_and_spec : SmallVec < [ ( Word , Ty < ' tcx > , char ) ; 2 ] > ,
28022802 }
28032803 struct FormatArgsNotRecognized ( String ) ;
@@ -2810,24 +2810,23 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
28102810 SpirvConst :: Scalar ( x) => Some ( u32:: try_from ( x) . ok ( ) ? as usize ) ,
28112811 _ => None ,
28122812 } ;
2813- let const_slice_as_elem_ids = |slice_ptr_and_len_ids : & [ Word ] | {
2814- if let [ ptr_id, len_id] = slice_ptr_and_len_ids[ ..] {
2815- if let SpirvConst :: PtrTo { pointee } =
2816- self . builder . lookup_const_by_id ( ptr_id) ?
2813+ let const_slice_as_elem_ids = |ptr_id : Word , len : usize | {
2814+ if let SpirvConst :: PtrTo { pointee } =
2815+ self . builder . lookup_const_by_id ( ptr_id) ?
2816+ {
2817+ if let SpirvConst :: Composite ( elems) =
2818+ self . builder . lookup_const_by_id ( pointee) ?
28172819 {
2818- if let SpirvConst :: Composite ( elems) =
2819- self . builder . lookup_const_by_id ( pointee) ?
2820- {
2821- if elems. len ( ) == const_u32_as_usize ( len_id) ? {
2822- return Some ( elems) ;
2823- }
2820+ if elems. len ( ) == len {
2821+ return Some ( elems) ;
28242822 }
28252823 }
28262824 }
28272825 None
28282826 } ;
2829- let const_str_as_utf8 = |str_ptr_and_len_ids : & [ Word ] | {
2830- let piece_str_bytes = const_slice_as_elem_ids ( str_ptr_and_len_ids) ?
2827+ let const_str_as_utf8 = |& [ str_ptr_id, str_len_id] : & [ Word ; 2 ] | {
2828+ let str_len = const_u32_as_usize ( str_len_id) ?;
2829+ let piece_str_bytes = const_slice_as_elem_ids ( str_ptr_id, str_len) ?
28312830 . iter ( )
28322831 . map ( |& id| u8:: try_from ( const_u32_as_usize ( id) ?) . ok ( ) )
28332832 . collect :: < Option < Vec < u8 > > > ( ) ?;
@@ -3001,42 +3000,36 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
30013000 "fmt::Arguments::new call: ran out of instructions" . into ( ) ,
30023001 )
30033002 } ) ?;
3004- let ( ( pieces_slice_ptr_id, pieces_len_id ) , ( rt_args_slice_ptr_id, rt_args_count) ) =
3003+ let ( ( pieces_slice_ptr_id, pieces_len ) , ( rt_args_slice_ptr_id, rt_args_count) ) =
30053004 match fmt_args_new_call_insts[ ..] {
30063005 [
30073006 Inst :: Call ( call_ret_id, callee_id, ref call_args) ,
30083007 Inst :: Store ( st_dst_id, st_val_id) ,
30093008 Inst :: Load ( ld_val_id, ld_src_id) ,
3010- ] if self . fmt_args_new_fn_ids . borrow ( ) . contains ( & callee_id)
3011- && call_ret_id == st_val_id
3009+ ] if call_ret_id == st_val_id
30123010 && st_dst_id == ld_src_id
30133011 && ld_val_id == format_args_id =>
30143012 {
30153013 require_local_var ( st_dst_id, "fmt::Arguments::new destination" ) ?;
30163014
3015+ let Some ( & ( pieces_len, rt_args_count) ) =
3016+ self . fmt_args_new_fn_ids . borrow ( ) . get ( & callee_id)
3017+ else {
3018+ return Err ( FormatArgsNotRecognized (
3019+ "fmt::Arguments::new callee not registered" . into ( ) ,
3020+ ) ) ;
3021+ } ;
3022+
30173023 match call_args[ ..] {
30183024 // `<core::fmt::Arguments>::new_v1`
3019- [
3020- pieces_slice_ptr_id,
3021- pieces_len_id,
3022- rt_args_slice_ptr_id,
3023- rt_args_len_id,
3024- ] => (
3025- ( pieces_slice_ptr_id, pieces_len_id) ,
3026- (
3027- Some ( rt_args_slice_ptr_id) ,
3028- const_u32_as_usize ( rt_args_len_id) . ok_or_else ( || {
3029- FormatArgsNotRecognized (
3030- "fmt::Arguments::new: args.len() not constant"
3031- . into ( ) ,
3032- )
3033- } ) ?,
3034- ) ,
3025+ [ pieces_slice_ptr_id, rt_args_slice_ptr_id] => (
3026+ ( pieces_slice_ptr_id, pieces_len) ,
3027+ ( Some ( rt_args_slice_ptr_id) , rt_args_count) ,
30353028 ) ,
30363029
30373030 // `<core::fmt::Arguments>::new_const`
3038- [ pieces_slice_ptr_id, pieces_len_id ] => {
3039- ( ( pieces_slice_ptr_id, pieces_len_id ) , ( None , 0 ) )
3031+ [ pieces_slice_ptr_id] if rt_args_count == 0 => {
3032+ ( ( pieces_slice_ptr_id, pieces_len ) , ( None , rt_args_count ) )
30403033 }
30413034
30423035 _ => {
@@ -3068,21 +3061,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
30683061 // arguments (from e.g. new `assert!`s being added to `core`),
30693062 // we have to confirm their many instructions for removal.
30703063 if rt_args_count > 0 {
3071- let rt_args_slice_ptr_id = rt_args_slice_ptr_id. unwrap ( ) ;
3072- let rt_args_array_ptr_id = match try_rev_take ( 1 ) . ok_or_else ( || {
3073- FormatArgsNotRecognized (
3074- "&[fmt::rt::Argument] bitcast: ran out of instructions" . into ( ) ,
3075- )
3076- } ) ?[ ..]
3077- {
3078- [ Inst :: Bitcast ( out_id, in_id) ] if out_id == rt_args_slice_ptr_id => in_id,
3079- _ => {
3080- return Err ( FormatArgsNotRecognized (
3081- "&[fmt::rt::Argument] bitcast" . into ( ) ,
3082- ) ) ;
3083- }
3084- } ;
3085- require_local_var ( rt_args_array_ptr_id, "[fmt::rt::Argument; N]" ) ?;
3064+ let rt_args_array_ptr_id = rt_args_slice_ptr_id. unwrap ( ) ;
30863065
30873066 // Each runtime argument has 4 instructions to call one of
30883067 // the `fmt::rt::Argument::new_*` functions (and temporarily
@@ -3162,13 +3141,15 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31623141 _ => pieces_slice_ptr_id,
31633142 } ;
31643143 decoded_format_args. const_pieces =
3165- const_slice_as_elem_ids ( & [ pieces_slice_ptr_id, pieces_len_id ] ) . and_then (
3144+ const_slice_as_elem_ids ( pieces_slice_ptr_id, pieces_len ) . and_then (
31663145 |piece_ids| {
31673146 piece_ids
31683147 . iter ( )
31693148 . map ( |& piece_id| {
31703149 match self . builder . lookup_const_by_id ( piece_id) ? {
3171- SpirvConst :: Composite ( piece) => const_str_as_utf8 ( piece) ,
3150+ SpirvConst :: Composite ( piece) => {
3151+ const_str_as_utf8 ( piece. try_into ( ) . ok ( ) ?)
3152+ }
31723153 _ => None ,
31733154 }
31743155 } )
@@ -3198,7 +3179,9 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
31983179 . map ( |s| Cow :: Owned ( s. replace ( '%' , "%%" ) ) )
31993180 . interleave ( ref_arg_ids_with_ty_and_spec. iter ( ) . map (
32003181 |& ( ref_id, ty, spec) | {
3201- use rustc_target:: abi:: { Integer :: * , Primitive :: * } ;
3182+ use rustc_target:: abi:: {
3183+ Float :: * , Integer :: * , Primitive :: * ,
3184+ } ;
32023185
32033186 let layout = self . layout_of ( ty) ;
32043187
@@ -3212,7 +3195,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
32123195 ( ' ' | '?' , Some ( Int ( I32 , false ) ) ) => "%u" ,
32133196 ( 'x' , Some ( Int ( I32 , false ) ) ) => "%x" ,
32143197 ( ' ' | '?' , Some ( Int ( I32 , true ) ) ) => "%i" ,
3215- ( ' ' | '?' , Some ( F32 ) ) => "%f" ,
3198+ ( ' ' | '?' , Some ( Float ( F32 ) ) ) => "%f" ,
32163199
32173200 _ => "" ,
32183201 } ;
0 commit comments