@@ -437,47 +437,68 @@ fn add_define_dyn_fn_metadata<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>,
437
437
dyn_ : Option < ( ExistentialTraitRef < ' tcx > , Symbol ) > ,
438
438
fn_ : Option < FnSig < ' tcx > > ,
439
439
llfn : & ' ll Value ) {
440
- let mut meta: SmallVec < [ & Metadata ; 8 ] > = SmallVec :: new ( ) ;
441
-
442
440
unsafe {
443
- if let Some ( ( trait_ref, method) ) = dyn_ {
441
+ let dyn_ = dyn_. map ( |( trait_ref, method) | {
442
+
444
443
let trait_ref = CString :: new ( trait_ref. to_string ( ) ) . unwrap ( ) ;
445
444
let method = CString :: new ( method. to_string ( ) ) . unwrap ( ) ;
446
445
447
- meta. push ( llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "dyn" ) . as_ptr ( ) ) ) ;
448
- meta. push ( llvm:: LLVMRustCreateMDString ( cx. llcx , trait_ref. as_ptr ( ) ) ) ;
449
- meta. push ( llvm:: LLVMRustCreateMDString ( cx. llcx , method. as_ptr ( ) ) ) ;
450
- }
446
+ let tuple = [
447
+ llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "dyn" ) . as_ptr ( ) ) ,
448
+ llvm:: LLVMRustCreateMDString ( cx. llcx , trait_ref. as_ptr ( ) ) ,
449
+ llvm:: LLVMRustCreateMDString ( cx. llcx , method. as_ptr ( ) )
450
+ ] ;
451
+ llvm:: LLVMRustCreateMDTuple ( cx. llcx , tuple. as_ptr ( ) , tuple. len ( ) as _ )
452
+ } ) ;
451
453
452
- if let Some ( sig ) = fn_ {
454
+ let fn_ = fn_. map ( |sig| {
453
455
let fn_ = CString :: new ( sig_to_string ( sig. inputs ( ) , sig. output ( ) ) ) . unwrap ( ) ;
454
- meta. push ( llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "fn" ) . as_ptr ( ) ) ) ;
455
- meta. push ( llvm:: LLVMRustCreateMDString ( cx. llcx , fn_. as_ptr ( ) ) ) ;
456
- }
457
456
458
- let tuple = llvm:: LLVMRustCreateMDTuple ( cx. llcx , meta. as_ptr ( ) , meta. len ( ) as _ ) ;
457
+ let tuple = [
458
+ llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "fn" ) . as_ptr ( ) ) ,
459
+ llvm:: LLVMRustCreateMDString ( cx. llcx , fn_. as_ptr ( ) ) ,
460
+ ] ;
461
+
462
+ llvm:: LLVMRustCreateMDTuple ( cx. llcx , tuple. as_ptr ( ) , tuple. len ( ) as _ )
463
+ } ) ;
459
464
460
- llvm:: LLVMRustAddFunctionMetadata ( llfn, tuple) ;
465
+ match ( dyn_, fn_) {
466
+ ( Some ( dyn_) , Some ( fn_) ) => {
467
+ let tuple = [ dyn_, fn_] ;
468
+
469
+ llvm:: LLVMRustAddFunctionMetadata (
470
+ llfn,
471
+ llvm:: LLVMRustCreateMDTuple ( cx. llcx , tuple. as_ptr ( ) , tuple. len ( ) as _ ) ,
472
+ ) ;
473
+ }
474
+
475
+ ( Some ( meta) , None ) | ( None , Some ( meta) ) => {
476
+ llvm:: LLVMRustAddFunctionMetadata ( llfn, meta) ;
477
+ }
478
+
479
+ ( None , None ) => { }
480
+ }
461
481
}
462
482
}
463
483
464
484
fn add_define_drop_metadata < ' ll , ' tcx > ( cx : & CodegenCx < ' ll , ' tcx > ,
465
485
trait_refs : & FxHashSet < ExistentialTraitRef < ' tcx > > ,
466
486
llfn : & ' ll Value ) {
467
487
unsafe {
468
- let scope = llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "drop" ) . as_ptr ( ) ) ;
469
-
470
- let mut tuple = vec ! [ scope] ;
471
-
472
- for trait_ref in trait_refs {
488
+ let meta: SmallVec < [ & Metadata ; 4 ] > = trait_refs. iter ( ) . map ( |trait_ref| {
473
489
let trait_ref = CString :: new ( trait_ref. to_string ( ) ) . unwrap ( ) ;
474
- let trait_ref = llvm:: LLVMRustCreateMDString ( cx. llcx , trait_ref. as_ptr ( ) ) ;
475
- tuple. push ( trait_ref) ;
476
- }
477
-
478
- let tuple = llvm:: LLVMRustCreateMDTuple ( cx. llcx , tuple. as_ptr ( ) , tuple. len ( ) as _ ) ;
479
-
480
- llvm:: LLVMRustAddFunctionMetadata ( llfn, tuple) ;
490
+ let tuple = [
491
+ llvm:: LLVMRustCreateMDString ( cx. llcx , const_cstr ! ( "drop" ) . as_ptr ( ) ) ,
492
+ llvm:: LLVMRustCreateMDString ( cx. llcx , trait_ref. as_ptr ( ) ) ,
493
+ ] ;
494
+
495
+ llvm:: LLVMRustCreateMDTuple ( cx. llcx , tuple. as_ptr ( ) , tuple. len ( ) as _ )
496
+ } ) . collect ( ) ;
497
+
498
+ llvm:: LLVMRustAddFunctionMetadata (
499
+ llfn,
500
+ llvm:: LLVMRustCreateMDTuple ( cx. llcx , meta. as_ptr ( ) , meta. len ( ) as _ ) ,
501
+ ) ;
481
502
}
482
503
}
483
504
0 commit comments