rust/src/librustc_codegen_llvm
Mazdak Farrokhzad bee074f032
Rollup merge of #69968 - eddyb:tupled-closure-captures, r=nikomatsakis
rustc: keep upvars tupled in {Closure,Generator}Substs.

Previously, each closure/generator capture's (aka "upvar") type was tracked as one "synthetic" type parameter in the closure/generator substs, and figuring out where the parent `fn`'s generics end and the synthetics start involved slicing at `tcx.generics_of(def_id).parent_count`.

Needing to query `generics_of` limited @davidtwco (who wants to compute some `TypeFlags` differently for parent generics vs upvars, and `TyCtxt` is not available there), which is how I got started on this, but it's also possible that the `generics_of` queries are slowing down `{Closure,Generator}Substs` methods.

To give an example, for a `foo::<T, U>::{closure#0}` with captures `x: X` and `y: Y`, substs are:
* before this PR: `[T, U, /*kind*/, /*signature*/, X, Y]`
* after this PR: `[T, U, /*kind*/, /*signature*/, (X, Y)]`

You can see that, with this PR, no matter how many captures, the last 3 entries in the substs (or 5 for a generator) are always the "synthetic" ones, with the last one being the tuple of capture types.

r? @nikomatsakis cc @Zoxc
2020-03-23 10:29:11 +01:00
..
back remove redundant returns (clippy::needless_return) 2020-03-20 20:23:03 +01:00
debuginfo Rollup merge of #69968 - eddyb:tupled-closure-captures, r=nikomatsakis 2020-03-23 10:29:11 +01:00
llvm Rollup merge of #69940 - tmiasko:llvm-api, r=hanna-kruppe 2020-03-23 10:29:07 +01:00
abi.rs Don't redundantly repeat field names (clippy::redundant_field_names) 2020-03-06 19:42:18 +01:00
allocator.rs librustc_codegen_llvm: Use slices instead of 0-terminated strings 2020-03-11 08:10:21 +01:00
asm.rs Rollup merge of #69893 - tmiasko:cstr, r=petrochenkov 2020-03-11 14:03:54 +01:00
attributes.rs use direct imports for rustc::{lint, session}. 2020-03-16 02:52:06 +01:00
base.rs Rollup merge of #69940 - tmiasko:llvm-api, r=hanna-kruppe 2020-03-23 10:29:07 +01:00
build.rs Remove licenses 2018-12-25 21:08:33 -07:00
builder.rs use direct imports for rustc::{lint, session}. 2020-03-16 02:52:06 +01:00
callee.rs Add projection query for upstream drop-glue instances. 2020-01-23 16:56:59 +01:00
Cargo.toml Refactorings to begin getting rid of rustc_codegen_utils 2020-03-19 23:14:46 -05:00
common.rs remove redundant returns (clippy::needless_return) 2020-03-20 20:23:03 +01:00
consts.rs librustc_codegen_llvm: Replace deprecated API usage 2020-03-11 23:56:41 +01:00
context.rs Rollup merge of #69940 - tmiasko:llvm-api, r=hanna-kruppe 2020-03-23 10:29:07 +01:00
declare.rs librustc_codegen_llvm: Replace deprecated API usage 2020-03-11 23:56:41 +01:00
intrinsic.rs Rollup merge of #69940 - tmiasko:llvm-api, r=hanna-kruppe 2020-03-23 10:29:07 +01:00
lib.rs Refactorings to begin getting rid of rustc_codegen_utils 2020-03-19 23:14:46 -05:00
llvm_util.rs use direct imports for rustc::{lint, session}. 2020-03-16 02:52:06 +01:00
metadata.rs Rustfmt 2020-02-07 13:59:31 +01:00
mono_item.rs Auto merge of #67886 - Centril:rustc_hir_canon_imports, r=nagisa 2020-01-06 12:55:40 +00:00
README.md rust-lang.github.io/rustc-dev-guide -> rustc-dev-guide.rust-lang.org 2020-03-10 17:08:18 -03:00
type_.rs remove lifetimes that can be elided (clippy::needless_lifetimes) 2020-03-12 20:03:09 +01:00
type_of.rs Format the world 2019-12-22 17:42:47 -05:00
va_arg.rs use conditions directly 2020-03-03 03:46:45 +01:00
value.rs Format the world 2019-12-22 17:42:47 -05:00

The codegen crate contains the code to convert from MIR into LLVM IR, and then from LLVM IR into machine code. In general it contains code that runs towards the end of the compilation process.

For more information about how codegen works, see the rustc dev guide.