Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit f4b0984

Browse files
committedMar 18, 2025
Create a safe wrapper around LLVMRustDIBuilderCreateMemberType
1 parent 1f34b19 commit f4b0984

File tree

3 files changed

+60
-42
lines changed

3 files changed

+60
-42
lines changed
 

‎compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

+24
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,30 @@ fn build_field_di_node<'ll, 'tcx>(
984984
} else {
985985
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
986986
};
987+
create_member_type(
988+
cx,
989+
owner,
990+
name,
991+
file_metadata,
992+
line_number,
993+
layout,
994+
offset,
995+
flags,
996+
type_di_node,
997+
)
998+
}
999+
1000+
fn create_member_type<'ll, 'tcx>(
1001+
cx: &CodegenCx<'ll, 'tcx>,
1002+
owner: &'ll DIScope,
1003+
name: &str,
1004+
file_metadata: &'ll DIType,
1005+
line_number: u32,
1006+
layout: TyAndLayout<'tcx>,
1007+
offset: Size,
1008+
flags: DIFlags,
1009+
type_di_node: &'ll DIType,
1010+
) -> &'ll DIType {
9871011
unsafe {
9881012
llvm::LLVMRustDIBuilderCreateMemberType(
9891013
DIB(cx),

‎compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs

+17-22
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ use crate::debuginfo::metadata::enums::DiscrResult;
1717
use crate::debuginfo::metadata::type_map::{self, Stub, UniqueTypeId};
1818
use crate::debuginfo::metadata::{
1919
DINodeCreationResult, NO_GENERICS, NO_SCOPE_METADATA, SmallVec, UNKNOWN_LINE_NUMBER,
20-
build_field_di_node, file_metadata, file_metadata_from_def_id, size_and_align_of, type_di_node,
21-
unknown_file_metadata, visibility_di_flags,
20+
build_field_di_node, create_member_type, file_metadata, file_metadata_from_def_id,
21+
size_and_align_of, type_di_node, unknown_file_metadata, visibility_di_flags,
2222
};
2323
use crate::debuginfo::utils::DIB;
2424
use crate::llvm::debuginfo::{DIFile, DIFlags, DIType};
@@ -820,7 +820,6 @@ fn build_union_fields_for_direct_tag_enum_or_coroutine<'ll, 'tcx>(
820820
.unwrap_or_else(|| (unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER));
821821

822822
let field_name = variant_union_field_name(variant_member_info.variant_index);
823-
let (size, align) = size_and_align_of(enum_type_and_layout);
824823

825824
let variant_struct_type_wrapper = build_variant_struct_wrapper_type_di_node(
826825
cx,
@@ -840,27 +839,23 @@ fn build_union_fields_for_direct_tag_enum_or_coroutine<'ll, 'tcx>(
840839
},
841840
);
842841

843-
// We use LLVMRustDIBuilderCreateMemberType() member type directly because
842+
// We use create_member_type() member type directly because
844843
// the build_field_di_node() function does not support specifying a source location,
845844
// which is something that we don't do anywhere else.
846-
unsafe {
847-
llvm::LLVMRustDIBuilderCreateMemberType(
848-
DIB(cx),
849-
enum_type_di_node,
850-
field_name.as_c_char_ptr(),
851-
field_name.len(),
852-
file_di_node,
853-
line_number,
854-
// NOTE: We use the size and align of the entire type, not from variant_layout
855-
// since the later is sometimes smaller (if it has fewer fields).
856-
size.bits(),
857-
align.bits() as u32,
858-
// Union fields are always at offset zero
859-
Size::ZERO.bits(),
860-
di_flags,
861-
variant_struct_type_wrapper,
862-
)
863-
}
845+
create_member_type(
846+
cx,
847+
enum_type_di_node,
848+
&field_name,
849+
file_di_node,
850+
line_number,
851+
// NOTE: We use the layout of the entire type, not from variant_layout
852+
// since the later is sometimes smaller (if it has fewer fields).
853+
enum_type_and_layout,
854+
// Union fields are always at offset zero
855+
Size::ZERO,
856+
di_flags,
857+
variant_struct_type_wrapper,
858+
)
864859
}));
865860

866861
assert_eq!(

‎compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs

+19-20
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ use smallvec::smallvec;
1313
use crate::common::{AsCCharPtr, CodegenCx};
1414
use crate::debuginfo::metadata::type_map::{self, Stub, StubInfo, UniqueTypeId};
1515
use crate::debuginfo::metadata::{
16-
DINodeCreationResult, NO_GENERICS, SmallVec, UNKNOWN_LINE_NUMBER, file_metadata,
17-
file_metadata_from_def_id, size_and_align_of, type_di_node, unknown_file_metadata,
18-
visibility_di_flags,
16+
DINodeCreationResult, NO_GENERICS, SmallVec, UNKNOWN_LINE_NUMBER, create_member_type,
17+
file_metadata, file_metadata_from_def_id, size_and_align_of, type_di_node,
18+
unknown_file_metadata, visibility_di_flags,
1919
};
2020
use crate::debuginfo::utils::{DIB, create_DIArray, get_namespace_for_item};
2121
use crate::llvm::debuginfo::{DIFile, DIFlags, DIType};
@@ -363,23 +363,22 @@ fn build_discr_member_di_node<'ll, 'tcx>(
363363

364364
&Variants::Multiple { tag_field, .. } => {
365365
let tag_base_type = tag_base_type(cx.tcx, enum_or_coroutine_type_and_layout);
366-
let (size, align) = cx.size_and_align_of(tag_base_type);
367-
368-
unsafe {
369-
Some(llvm::LLVMRustDIBuilderCreateMemberType(
370-
DIB(cx),
371-
containing_scope,
372-
tag_name.as_c_char_ptr(),
373-
tag_name.len(),
374-
unknown_file_metadata(cx),
375-
UNKNOWN_LINE_NUMBER,
376-
size.bits(),
377-
align.bits() as u32,
378-
enum_or_coroutine_type_and_layout.fields.offset(tag_field).bits(),
379-
DIFlags::FlagArtificial,
380-
type_di_node(cx, tag_base_type),
381-
))
382-
}
366+
let ty = type_di_node(cx, tag_base_type);
367+
let file = unknown_file_metadata(cx);
368+
369+
let layout = cx.layout_of(tag_base_type);
370+
371+
Some(create_member_type(
372+
cx,
373+
containing_scope,
374+
&tag_name,
375+
file,
376+
UNKNOWN_LINE_NUMBER,
377+
layout,
378+
enum_or_coroutine_type_and_layout.fields.offset(tag_field),
379+
DIFlags::FlagArtificial,
380+
ty,
381+
))
383382
}
384383
}
385384
}

0 commit comments

Comments
 (0)
Failed to load comments.