diff options
| author | Tyler Mandry <tmandry@gmail.com> | 2019-04-02 16:04:51 -0700 |
|---|---|---|
| committer | Tyler Mandry <tmandry@gmail.com> | 2019-04-25 10:28:09 -0700 |
| commit | 5a7af5480c5f9a7d1b5964e3c77ef18326a3a67b (patch) | |
| tree | af664ff51a4d7189ac0522668c8eb283ccc2847e /src/librustc_codegen_llvm | |
| parent | 4de2d8a86909cec4279c4054790c62c66ca033d7 (diff) | |
| download | rust-5a7af5480c5f9a7d1b5964e3c77ef18326a3a67b.tar.gz rust-5a7af5480c5f9a7d1b5964e3c77ef18326a3a67b.zip | |
Support variantful generators
This allows generators to overlap fields using variants.
Diffstat (limited to 'src/librustc_codegen_llvm')
| -rw-r--r-- | src/librustc_codegen_llvm/debuginfo/metadata.rs | 6 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/type_of.rs | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/librustc_codegen_llvm/debuginfo/metadata.rs b/src/librustc_codegen_llvm/debuginfo/metadata.rs index 31348b99c5a..bbcd3c220d6 100644 --- a/src/librustc_codegen_llvm/debuginfo/metadata.rs +++ b/src/librustc_codegen_llvm/debuginfo/metadata.rs @@ -691,9 +691,12 @@ pub fn type_metadata( usage_site_span).finalize(cx) } ty::Generator(def_id, substs, _) => { - let upvar_tys : Vec<_> = substs.field_tys(def_id, cx.tcx).map(|t| { + // TODO handle variant fields + let upvar_tys : Vec<_> = substs.prefix_tys(def_id, cx.tcx).map(|t| { cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), t) }).collect(); + // TODO use prepare_enum_metadata and update it to handle multiple + // fields in the outer layout. prepare_tuple_metadata(cx, t, &upvar_tys, @@ -1818,6 +1821,7 @@ fn prepare_enum_metadata( }; // The variant part must be wrapped in a struct according to DWARF. + // TODO create remaining fields here, if any. let type_array = create_DIArray(DIB(cx), &[Some(variant_part)]); let struct_wrapper = unsafe { llvm::LLVMRustDIBuilderCreateStructType( diff --git a/src/librustc_codegen_llvm/type_of.rs b/src/librustc_codegen_llvm/type_of.rs index d42fa829161..080f78ff112 100644 --- a/src/librustc_codegen_llvm/type_of.rs +++ b/src/librustc_codegen_llvm/type_of.rs @@ -63,6 +63,11 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, write!(&mut name, "::{}", def.variants[index].ident).unwrap(); } } + if let (&ty::Generator(..), &layout::Variants::Single { index }) + = (&layout.ty.sty, &layout.variants) + { + write!(&mut name, "::variant#{:?}", index).unwrap(); + } Some(name) } _ => None |
