Skip to content

Commit bae6fde

Browse files
committed
Use LLVMDIBuilderCreatePointerType
1 parent 3e9048d commit bae6fde

File tree

3 files changed

+45
-52
lines changed

3 files changed

+45
-52
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -173,17 +173,13 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
173173
"ptr_type={ptr_type}, pointee_type={pointee_type}",
174174
);
175175

176-
let di_node = unsafe {
177-
llvm::LLVMRustDIBuilderCreatePointerType(
178-
DIB(cx),
179-
pointee_type_di_node,
180-
pointer_size.bits(),
181-
pointer_align.abi.bits() as u32,
182-
0, // Ignore DWARF address space.
183-
ptr_type_debuginfo_name.as_c_char_ptr(),
184-
ptr_type_debuginfo_name.len(),
185-
)
186-
};
176+
let di_node = create_pointer_type(
177+
cx,
178+
pointee_type_di_node,
179+
pointer_size,
180+
pointer_align.abi,
181+
&ptr_type_debuginfo_name,
182+
);
187183

188184
DINodeCreationResult { di_node, already_stored_in_typemap: false }
189185
}
@@ -231,17 +227,13 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
231227

232228
// The data pointer type is a regular, thin pointer, regardless of whether this
233229
// is a slice or a trait object.
234-
let data_ptr_type_di_node = unsafe {
235-
llvm::LLVMRustDIBuilderCreatePointerType(
236-
DIB(cx),
237-
pointee_type_di_node,
238-
addr_field.size.bits(),
239-
addr_field.align.abi.bits() as u32,
240-
0, // Ignore DWARF address space.
241-
std::ptr::null(),
242-
0,
243-
)
244-
};
230+
let data_ptr_type_di_node = create_pointer_type(
231+
cx,
232+
pointee_type_di_node,
233+
addr_field.size,
234+
addr_field.align.abi,
235+
"",
236+
);
245237

246238
smallvec![
247239
build_field_di_node(
@@ -327,17 +319,7 @@ fn build_subroutine_type_di_node<'ll, 'tcx>(
327319
}
328320
_ => unreachable!(),
329321
};
330-
let di_node = unsafe {
331-
llvm::LLVMRustDIBuilderCreatePointerType(
332-
DIB(cx),
333-
fn_di_node,
334-
size.bits(),
335-
align.bits() as u32,
336-
0, // Ignore DWARF address space.
337-
name.as_c_char_ptr(),
338-
name.len(),
339-
)
340-
};
322+
let di_node = create_pointer_type(cx, fn_di_node, size, align, &name);
341323

342324
DINodeCreationResult::new(di_node, false)
343325
}
@@ -357,6 +339,26 @@ pub(super) fn create_subroutine_type<'ll>(
357339
}
358340
}
359341

342+
fn create_pointer_type<'ll>(
343+
cx: &CodegenCx<'ll, '_>,
344+
pointee_ty: &'ll llvm::Metadata,
345+
size: Size,
346+
align: Align,
347+
name: &str,
348+
) -> &'ll llvm::Metadata {
349+
unsafe {
350+
llvm::LLVMDIBuilderCreatePointerType(
351+
DIB(cx),
352+
pointee_ty,
353+
size.bits(),
354+
align.bits() as u32,
355+
0, // Ignore DWARF address space.
356+
name.as_ptr(),
357+
name.len(),
358+
)
359+
}
360+
}
361+
360362
/// Create debuginfo for `dyn SomeTrait` types. Currently these are empty structs
361363
/// we with the correct type name (e.g. "dyn SomeTrait<Foo, Item=u32> + Sync").
362364
fn build_dyn_type_di_node<'ll, 'tcx>(

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,6 +1913,16 @@ unsafe extern "C" {
19131913
Encoding: c_uint, // (`LLVMDWARFTypeEncoding`)
19141914
Flags: DIFlags, // (default is `DIFlags::DIFlagZero`)
19151915
) -> &'ll Metadata;
1916+
1917+
pub(crate) fn LLVMDIBuilderCreatePointerType<'ll>(
1918+
Builder: &DIBuilder<'ll>,
1919+
PointeeTy: &'ll Metadata,
1920+
SizeInBits: u64,
1921+
AlignInBits: u32,
1922+
AddressSpace: c_uint, // (optional DWARF address space; default is 0)
1923+
Name: *const c_uchar, // See "PTR_LEN_STR".
1924+
NameLen: size_t,
1925+
) -> &'ll Metadata;
19161926
}
19171927

19181928
#[link(name = "llvm-wrapper", kind = "static")]
@@ -2258,16 +2268,6 @@ unsafe extern "C" {
22582268
Scope: Option<&'a DIScope>,
22592269
) -> &'a DIDerivedType;
22602270

2261-
pub(crate) fn LLVMRustDIBuilderCreatePointerType<'a>(
2262-
Builder: &DIBuilder<'a>,
2263-
PointeeTy: &'a DIType,
2264-
SizeInBits: u64,
2265-
AlignInBits: u32,
2266-
AddressSpace: c_uint,
2267-
Name: *const c_char,
2268-
NameLen: size_t,
2269-
) -> &'a DIDerivedType;
2270-
22712271
pub(crate) fn LLVMRustDIBuilderCreateStructType<'a>(
22722272
Builder: &DIBuilder<'a>,
22732273
Scope: Option<&'a DIDescriptor>,

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,15 +1074,6 @@ LLVMRustDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type,
10741074
LineNo, unwrapDIPtr<DIScope>(Scope)));
10751075
}
10761076

1077-
extern "C" LLVMMetadataRef LLVMRustDIBuilderCreatePointerType(
1078-
LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits,
1079-
uint32_t AlignInBits, unsigned AddressSpace, const char *Name,
1080-
size_t NameLen) {
1081-
return wrap(unwrap(Builder)->createPointerType(
1082-
unwrapDI<DIType>(PointeeTy), SizeInBits, AlignInBits, AddressSpace,
1083-
StringRef(Name, NameLen)));
1084-
}
1085-
10861077
extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateStructType(
10871078
LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name,
10881079
size_t NameLen, LLVMMetadataRef File, unsigned LineNumber,

0 commit comments

Comments
 (0)