@@ -977,7 +977,6 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
977
977
cx,
978
978
cursor,
979
979
current_fn,
980
- basic_block : llbb,
981
980
current_span : Default :: default ( ) ,
982
981
}
983
982
}
@@ -987,7 +986,8 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
987
986
}
988
987
989
988
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`" )
991
991
}
992
992
993
993
fn set_span ( & mut self , span : Span ) {
@@ -2797,7 +2797,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
2797
2797
///
2798
2798
/// E.g. for `format_args!("{a} {b:x}")` they'll be:
2799
2799
/// * `&a` with `typeof a` and ' ',
2800
- /// * `&b` with `typeof b` and 'x'
2800
+ /// * `&b` with `typeof b` and 'x'
2801
2801
ref_arg_ids_with_ty_and_spec : SmallVec < [ ( Word , Ty < ' tcx > , char ) ; 2 ] > ,
2802
2802
}
2803
2803
struct FormatArgsNotRecognized ( String ) ;
@@ -2810,24 +2810,23 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
2810
2810
SpirvConst :: Scalar ( x) => Some ( u32:: try_from ( x) . ok ( ) ? as usize ) ,
2811
2811
_ => None ,
2812
2812
} ;
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) ?
2817
2819
{
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) ;
2824
2822
}
2825
2823
}
2826
2824
}
2827
2825
None
2828
2826
} ;
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) ?
2831
2830
. iter ( )
2832
2831
. map ( |& id| u8:: try_from ( const_u32_as_usize ( id) ?) . ok ( ) )
2833
2832
. collect :: < Option < Vec < u8 > > > ( ) ?;
@@ -3001,42 +3000,36 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
3001
3000
"fmt::Arguments::new call: ran out of instructions" . into ( ) ,
3002
3001
)
3003
3002
} ) ?;
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) ) =
3005
3004
match fmt_args_new_call_insts[ ..] {
3006
3005
[
3007
3006
Inst :: Call ( call_ret_id, callee_id, ref call_args) ,
3008
3007
Inst :: Store ( st_dst_id, st_val_id) ,
3009
3008
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
3012
3010
&& st_dst_id == ld_src_id
3013
3011
&& ld_val_id == format_args_id =>
3014
3012
{
3015
3013
require_local_var ( st_dst_id, "fmt::Arguments::new destination" ) ?;
3016
3014
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
+
3017
3023
match call_args[ ..] {
3018
3024
// `<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) ,
3035
3028
) ,
3036
3029
3037
3030
// `<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 ) )
3040
3033
}
3041
3034
3042
3035
_ => {
@@ -3068,21 +3061,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
3068
3061
// arguments (from e.g. new `assert!`s being added to `core`),
3069
3062
// we have to confirm their many instructions for removal.
3070
3063
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 ( ) ;
3086
3065
3087
3066
// Each runtime argument has 4 instructions to call one of
3088
3067
// the `fmt::rt::Argument::new_*` functions (and temporarily
@@ -3162,13 +3141,15 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
3162
3141
_ => pieces_slice_ptr_id,
3163
3142
} ;
3164
3143
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 (
3166
3145
|piece_ids| {
3167
3146
piece_ids
3168
3147
. iter ( )
3169
3148
. map ( |& piece_id| {
3170
3149
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
+ }
3172
3153
_ => None ,
3173
3154
}
3174
3155
} )
@@ -3198,7 +3179,9 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
3198
3179
. map ( |s| Cow :: Owned ( s. replace ( '%' , "%%" ) ) )
3199
3180
. interleave ( ref_arg_ids_with_ty_and_spec. iter ( ) . map (
3200
3181
|& ( ref_id, ty, spec) | {
3201
- use rustc_target:: abi:: { Integer :: * , Primitive :: * } ;
3182
+ use rustc_target:: abi:: {
3183
+ Float :: * , Integer :: * , Primitive :: * ,
3184
+ } ;
3202
3185
3203
3186
let layout = self . layout_of ( ty) ;
3204
3187
@@ -3212,7 +3195,7 @@ impl<'a, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'tcx> {
3212
3195
( ' ' | '?' , Some ( Int ( I32 , false ) ) ) => "%u" ,
3213
3196
( 'x' , Some ( Int ( I32 , false ) ) ) => "%x" ,
3214
3197
( ' ' | '?' , Some ( Int ( I32 , true ) ) ) => "%i" ,
3215
- ( ' ' | '?' , Some ( F32 ) ) => "%f" ,
3198
+ ( ' ' | '?' , Some ( Float ( F32 ) ) ) => "%f" ,
3216
3199
3217
3200
_ => "" ,
3218
3201
} ;
0 commit comments