mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
cg_llvm: fewer_names
in uncached_llvm_type
This commit changes `uncached_llvm_type` so that a named struct type (with an empty name) is always created when the `fewer_names` option is enabled. By skipping the generation of names, we can improve perf. Giving `LLVMStructCreateNamed` an empty name works because LLVM will perform random renames to avoid collisions. Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
6c44bcc4ff
commit
fa01ce802f
@ -51,30 +51,34 @@ fn uncached_llvm_type<'a, 'tcx>(
|
||||
}
|
||||
|
||||
let name = match layout.ty.kind {
|
||||
ty::Closure(..) |
|
||||
ty::Generator(..) |
|
||||
ty::Adt(..) |
|
||||
// FIXME(eddyb) producing readable type names for trait objects can result
|
||||
// in problematically distinct types due to HRTB and subtyping (see #47638).
|
||||
// ty::Dynamic(..) |
|
||||
ty::Foreign(..) |
|
||||
ty::Str => {
|
||||
ty::Adt(..) | ty::Closure(..) | ty::Foreign(..) | ty::Generator(..) | ty::Str
|
||||
if !cx.sess().fewer_names() =>
|
||||
{
|
||||
let mut name = layout.ty.to_string();
|
||||
if let (&ty::Adt(def, _), &Variants::Single { index })
|
||||
= (&layout.ty.kind, &layout.variants)
|
||||
if let (&ty::Adt(def, _), &Variants::Single { index }) =
|
||||
(&layout.ty.kind, &layout.variants)
|
||||
{
|
||||
if def.is_enum() && !def.variants.is_empty() {
|
||||
write!(&mut name, "::{}", def.variants[index].ident).unwrap();
|
||||
}
|
||||
}
|
||||
if let (&ty::Generator(_, _, _), &Variants::Single { index })
|
||||
= (&layout.ty.kind, &layout.variants)
|
||||
if let (&ty::Generator(_, _, _), &Variants::Single { index }) =
|
||||
(&layout.ty.kind, &layout.variants)
|
||||
{
|
||||
write!(&mut name, "::{}", ty::GeneratorSubsts::variant_name(index)).unwrap();
|
||||
}
|
||||
Some(name)
|
||||
}
|
||||
_ => None
|
||||
ty::Adt(..) => {
|
||||
// If `Some` is returned then a named struct is created in LLVM. Name collisions are
|
||||
// avoided by LLVM (with increasing suffixes). If rustc doesn't generate names then that
|
||||
// can improve perf.
|
||||
Some(String::new())
|
||||
}
|
||||
_ => None,
|
||||
};
|
||||
|
||||
match layout.fields {
|
||||
|
Loading…
Reference in New Issue
Block a user