Skip to content

Commit cca6108

Browse files
committed
group metadata nodes in tuples
!1 = !{!"dyn", !"Trait", !"method", !"fn", "fn(&Type) -> bool"} becomes !1 = !{!2, !3} !2 = !{!"dyn", !"Trait", !"method"} !3 = !{!"fn", !"fn(&Type) -> bool"} and !1 = !{!"drop", !"Trait1", !"drop", !"Trait2", !"drop", !"Trait3"} becomes !1 = !{!2, !3, !4} !2 = !{!"drop", !"Trait1"} !3 = !{!"drop", !"Trait2"} !4 = !{!"drop", !"Trait3"}
1 parent 4701025 commit cca6108

File tree

1 file changed

+46
-25
lines changed

1 file changed

+46
-25
lines changed

src/librustc_codegen_llvm/common.rs

+46-25
Original file line numberDiff line numberDiff line change
@@ -437,47 +437,68 @@ fn add_define_dyn_fn_metadata<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>,
437437
dyn_: Option<(ExistentialTraitRef<'tcx>, Symbol)>,
438438
fn_: Option<FnSig<'tcx>>,
439439
llfn: &'ll Value) {
440-
let mut meta: SmallVec<[&Metadata; 8]> = SmallVec::new();
441-
442440
unsafe {
443-
if let Some((trait_ref, method)) = dyn_ {
441+
let dyn_ = dyn_.map(|(trait_ref, method)| {
442+
444443
let trait_ref = CString::new(trait_ref.to_string()).unwrap();
445444
let method = CString::new(method.to_string()).unwrap();
446445

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+
});
451453

452-
if let Some(sig) = fn_ {
454+
let fn_ = fn_.map(|sig| {
453455
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-
}
457456

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+
});
459464

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+
}
461481
}
462482
}
463483

464484
fn add_define_drop_metadata<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>,
465485
trait_refs: &FxHashSet<ExistentialTraitRef<'tcx>>,
466486
llfn: &'ll Value) {
467487
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| {
473489
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+
);
481502
}
482503
}
483504

0 commit comments

Comments
 (0)