Skip to content

Commit 1934a69

Browse files
debuginfo: Make some helper functions in rustc_codegen_llvm::debuginfo::metadata more generally applicable.
1 parent 926e784 commit 1934a69

File tree

1 file changed

+54
-24
lines changed

1 file changed

+54
-24
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

+54-24
Original file line numberDiff line numberDiff line change
@@ -351,14 +351,15 @@ impl<'ll, 'tcx> RecursiveTypeDescription<'ll, 'tcx> {
351351

352352
// ... then create the member descriptions ...
353353
let member_descriptions = member_description_factory.create_member_descriptions(cx);
354+
let type_params = compute_type_parameters(cx, unfinished_type);
354355

355356
// ... and attach them to the stub to complete it.
356357
set_members_of_composite_type(
357358
cx,
358-
unfinished_type,
359359
member_holding_stub,
360360
member_descriptions,
361361
None,
362+
type_params,
362363
);
363364
MetadataCreationResult::new(metadata_stub, true)
364365
}
@@ -983,7 +984,17 @@ fn foreign_type_metadata<'ll, 'tcx>(
983984
debug!("foreign_type_metadata: {:?}", t);
984985

985986
let name = compute_debuginfo_type_name(cx.tcx, t, false);
986-
create_struct_stub(cx, t, &name, unique_type_id, NO_SCOPE_METADATA, DIFlags::FlagZero)
987+
let (size, align) = cx.size_and_align_of(t);
988+
create_struct_stub(
989+
cx,
990+
size,
991+
align,
992+
&name,
993+
unique_type_id,
994+
NO_SCOPE_METADATA,
995+
DIFlags::FlagZero,
996+
None,
997+
)
987998
}
988999

9891000
fn param_type_metadata<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {
@@ -1299,14 +1310,17 @@ fn prepare_struct_metadata<'ll, 'tcx>(
12991310
};
13001311

13011312
let containing_scope = get_namespace_for_item(cx, struct_def_id);
1313+
let (size, align) = cx.size_and_align_of(struct_type);
13021314

13031315
let struct_metadata_stub = create_struct_stub(
13041316
cx,
1305-
struct_type,
1317+
size,
1318+
align,
13061319
&struct_name,
13071320
unique_type_id,
13081321
Some(containing_scope),
13091322
DIFlags::FlagZero,
1323+
None,
13101324
);
13111325

13121326
create_and_register_recursive_type_forward_declaration(
@@ -1398,15 +1412,18 @@ fn prepare_tuple_metadata<'ll, 'tcx>(
13981412
unique_type_id: UniqueTypeId,
13991413
containing_scope: Option<&'ll DIScope>,
14001414
) -> RecursiveTypeDescription<'ll, 'tcx> {
1415+
let (size, align) = cx.size_and_align_of(tuple_type);
14011416
let tuple_name = compute_debuginfo_type_name(cx.tcx, tuple_type, false);
14021417

14031418
let struct_stub = create_struct_stub(
14041419
cx,
1405-
tuple_type,
1420+
size,
1421+
align,
14061422
&tuple_name[..],
14071423
unique_type_id,
14081424
containing_scope,
14091425
DIFlags::FlagZero,
1426+
None,
14101427
);
14111428

14121429
create_and_register_recursive_type_forward_declaration(
@@ -1581,13 +1598,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
15811598
describe_enum_variant(cx, self.layout, variant_info, self_metadata);
15821599

15831600
let member_descriptions = member_description_factory.create_member_descriptions(cx);
1601+
let type_params = compute_type_parameters(cx, self.enum_type);
15841602

15851603
set_members_of_composite_type(
15861604
cx,
1587-
self.enum_type,
15881605
variant_type_metadata,
15891606
member_descriptions,
15901607
Some(&self.common_members),
1608+
type_params,
15911609
);
15921610
vec![MemberDescription {
15931611
name: variant_info.variant_name(),
@@ -1648,13 +1666,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
16481666

16491667
let member_descriptions =
16501668
member_desc_factory.create_member_descriptions(cx);
1669+
let type_params = compute_type_parameters(cx, self.enum_type);
16511670

16521671
set_members_of_composite_type(
16531672
cx,
1654-
self.enum_type,
16551673
variant_type_metadata,
16561674
member_descriptions,
16571675
Some(&self.common_members),
1676+
type_params,
16581677
);
16591678

16601679
MemberDescription {
@@ -1777,13 +1796,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
17771796
);
17781797

17791798
let member_descriptions = member_desc_factory.create_member_descriptions(cx);
1799+
let type_params = compute_type_parameters(cx, self.enum_type);
17801800

17811801
set_members_of_composite_type(
17821802
cx,
1783-
self.enum_type,
17841803
variant_type_metadata,
17851804
member_descriptions,
17861805
Some(&self.common_members),
1806+
type_params,
17871807
);
17881808

17891809
let (size, align) =
@@ -1823,13 +1843,14 @@ impl<'ll, 'tcx> EnumMemberDescriptionFactory<'ll, 'tcx> {
18231843

18241844
let member_descriptions =
18251845
member_desc_factory.create_member_descriptions(cx);
1846+
let type_params = compute_type_parameters(cx, self.enum_type);
18261847

18271848
set_members_of_composite_type(
18281849
cx,
1829-
self.enum_type,
18301850
variant_type_metadata,
18311851
member_descriptions,
18321852
Some(&self.common_members),
1853+
type_params,
18331854
);
18341855

18351856
let niche_value = calculate_niche_value(i);
@@ -1965,13 +1986,18 @@ fn describe_enum_variant<'ll, 'tcx>(
19651986
.type_map
19661987
.borrow_mut()
19671988
.get_unique_type_id_of_enum_variant(cx, layout.ty, variant_name);
1989+
1990+
let (size, align) = cx.size_and_align_of(layout.ty);
1991+
19681992
create_struct_stub(
19691993
cx,
1970-
layout.ty,
1994+
size,
1995+
align,
19711996
variant_name,
19721997
unique_type_id,
19731998
Some(containing_scope),
19741999
DIFlags::FlagZero,
2000+
None,
19752001
)
19762002
});
19772003

@@ -2308,33 +2334,38 @@ fn composite_type_metadata<'ll, 'tcx>(
23082334
member_descriptions: Vec<MemberDescription<'ll>>,
23092335
containing_scope: Option<&'ll DIScope>,
23102336
) -> &'ll DICompositeType {
2337+
let (size, align) = cx.size_and_align_of(composite_type);
2338+
23112339
// Create the (empty) struct metadata node ...
23122340
let composite_type_metadata = create_struct_stub(
23132341
cx,
2314-
composite_type,
2342+
size,
2343+
align,
23152344
composite_type_name,
23162345
composite_type_unique_id,
23172346
containing_scope,
23182347
DIFlags::FlagZero,
2348+
None,
23192349
);
2350+
23202351
// ... and immediately create and add the member descriptions.
23212352
set_members_of_composite_type(
23222353
cx,
2323-
composite_type,
23242354
composite_type_metadata,
23252355
member_descriptions,
23262356
None,
2357+
compute_type_parameters(cx, composite_type),
23272358
);
23282359

23292360
composite_type_metadata
23302361
}
23312362

23322363
fn set_members_of_composite_type<'ll, 'tcx>(
23332364
cx: &CodegenCx<'ll, 'tcx>,
2334-
composite_type: Ty<'tcx>,
23352365
composite_type_metadata: &'ll DICompositeType,
23362366
member_descriptions: Vec<MemberDescription<'ll>>,
23372367
common_members: Option<&Vec<Option<&'ll DIType>>>,
2368+
type_params: &'ll DIArray,
23382369
) {
23392370
// In some rare cases LLVM metadata uniquing would lead to an existing type
23402371
// description being used instead of a new one created in
@@ -2361,13 +2392,12 @@ fn set_members_of_composite_type<'ll, 'tcx>(
23612392
member_metadata.extend(other_members.iter());
23622393
}
23632394

2364-
let type_params = compute_type_parameters(cx, composite_type);
23652395
unsafe {
2366-
let type_array = create_DIArray(DIB(cx), &member_metadata);
2396+
let field_array = create_DIArray(DIB(cx), &member_metadata);
23672397
llvm::LLVMRustDICompositeTypeReplaceArrays(
23682398
DIB(cx),
23692399
composite_type_metadata,
2370-
Some(type_array),
2400+
Some(field_array),
23712401
Some(type_params),
23722402
);
23732403
}
@@ -2420,14 +2450,14 @@ fn compute_type_parameters<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>) -
24202450
/// with `set_members_of_composite_type()`.
24212451
fn create_struct_stub<'ll, 'tcx>(
24222452
cx: &CodegenCx<'ll, 'tcx>,
2423-
struct_type: Ty<'tcx>,
2424-
struct_type_name: &str,
2453+
size: Size,
2454+
align: Align,
2455+
type_name: &str,
24252456
unique_type_id: UniqueTypeId,
24262457
containing_scope: Option<&'ll DIScope>,
24272458
flags: DIFlags,
2459+
vtable_holder: Option<&'ll DIType>,
24282460
) -> &'ll DICompositeType {
2429-
let (struct_size, struct_align) = cx.size_and_align_of(struct_type);
2430-
24312461
let type_map = debug_context(cx).type_map.borrow();
24322462
let unique_type_id = type_map.get_unique_type_id_as_string(unique_type_id);
24332463

@@ -2440,17 +2470,17 @@ fn create_struct_stub<'ll, 'tcx>(
24402470
llvm::LLVMRustDIBuilderCreateStructType(
24412471
DIB(cx),
24422472
containing_scope,
2443-
struct_type_name.as_ptr().cast(),
2444-
struct_type_name.len(),
2473+
type_name.as_ptr().cast(),
2474+
type_name.len(),
24452475
unknown_file_metadata(cx),
24462476
UNKNOWN_LINE_NUMBER,
2447-
struct_size.bits(),
2448-
struct_align.bits() as u32,
2477+
size.bits(),
2478+
align.bits() as u32,
24492479
flags,
24502480
None,
24512481
empty_array,
24522482
0,
2453-
None,
2483+
vtable_holder,
24542484
unique_type_id.as_ptr().cast(),
24552485
unique_type_id.len(),
24562486
)

0 commit comments

Comments
 (0)