Skip to content

Commit e2617a9

Browse files
authored
Rollup merge of #69734 - tmiasko:di-enumerator, r=ecstatic-morse
Change DIBuilderCreateEnumerator signature to match LLVM 9 * Change DIBuilderCreateEnumerator signature to match LLVM 9 C API. * Use provided is unsigned flag when emitting enumerators.
2 parents 5e9888e + 30650f8 commit e2617a9

File tree

4 files changed

+50
-12
lines changed

4 files changed

+50
-12
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

+16-7
Original file line numberDiff line numberDiff line change
@@ -1779,13 +1779,20 @@ fn prepare_enum_metadata(
17791779
.discriminants(cx.tcx)
17801780
.zip(&def.variants)
17811781
.map(|((_, discr), v)| {
1782-
let name = SmallCStr::new(&v.ident.as_str());
1782+
let name = v.ident.as_str();
1783+
let is_unsigned = match discr.ty.kind {
1784+
ty::Int(_) => false,
1785+
ty::Uint(_) => true,
1786+
_ => bug!("non integer discriminant"),
1787+
};
17831788
unsafe {
17841789
Some(llvm::LLVMRustDIBuilderCreateEnumerator(
17851790
DIB(cx),
1786-
name.as_ptr(),
1791+
name.as_ptr().cast(),
1792+
name.len(),
17871793
// FIXME: what if enumeration has i128 discriminant?
1788-
discr.val as u64,
1794+
discr.val as i64,
1795+
is_unsigned,
17891796
))
17901797
}
17911798
})
@@ -1794,13 +1801,15 @@ fn prepare_enum_metadata(
17941801
.as_generator()
17951802
.variant_range(enum_def_id, cx.tcx)
17961803
.map(|variant_index| {
1797-
let name = SmallCStr::new(&substs.as_generator().variant_name(variant_index));
1804+
let name = substs.as_generator().variant_name(variant_index);
17981805
unsafe {
17991806
Some(llvm::LLVMRustDIBuilderCreateEnumerator(
18001807
DIB(cx),
1801-
name.as_ptr(),
1802-
// FIXME: what if enumeration has i128 discriminant?
1803-
variant_index.as_usize() as u64,
1808+
name.as_ptr().cast(),
1809+
name.len(),
1810+
// Generators use u32 as discriminant type.
1811+
variant_index.as_u32().into(),
1812+
true, // IsUnsigned
18041813
))
18051814
}
18061815
})

src/librustc_codegen_llvm/llvm/ffi.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1776,7 +1776,9 @@ extern "C" {
17761776
pub fn LLVMRustDIBuilderCreateEnumerator(
17771777
Builder: &DIBuilder<'a>,
17781778
Name: *const c_char,
1779-
Val: u64,
1779+
NameLen: size_t,
1780+
Value: i64,
1781+
IsUnsigned: bool,
17801782
) -> &'a DIEnumerator;
17811783

17821784
pub fn LLVMRustDIBuilderCreateEnumerationType(

src/rustllvm/RustWrapper.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -891,10 +891,10 @@ extern "C" LLVMValueRef LLVMRustDIBuilderInsertDeclareAtEnd(
891891
unwrap(InsertAtEnd)));
892892
}
893893

894-
extern "C" LLVMMetadataRef
895-
LLVMRustDIBuilderCreateEnumerator(LLVMRustDIBuilderRef Builder,
896-
const char *Name, uint64_t Val) {
897-
return wrap(Builder->createEnumerator(Name, Val));
894+
extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateEnumerator(
895+
LLVMRustDIBuilderRef Builder, const char *Name, size_t NameLen,
896+
int64_t Value, bool IsUnsigned) {
897+
return wrap(Builder->createEnumerator({Name, NameLen}, Value, IsUnsigned));
898898
}
899899

900900
extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateEnumerationType(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Verify that DIEnumerator uses isUnsigned flag when appropriate.
2+
//
3+
// compile-flags: -g -C no-prepopulate-passes
4+
5+
#[repr(i64)]
6+
pub enum I64 {
7+
I64Min = std::i64::MIN,
8+
I64Max = std::i64::MAX,
9+
}
10+
11+
#[repr(u64)]
12+
pub enum U64 {
13+
U64Min = std::u64::MIN,
14+
U64Max = std::u64::MAX,
15+
}
16+
17+
fn main() {
18+
let _a = I64::I64Min;
19+
let _b = I64::I64Max;
20+
let _c = U64::U64Min;
21+
let _d = U64::U64Max;
22+
}
23+
24+
// CHECK: !DIEnumerator(name: "I64Min", value: -9223372036854775808)
25+
// CHECK: !DIEnumerator(name: "I64Max", value: 9223372036854775807)
26+
// CHECK: !DIEnumerator(name: "U64Min", value: 0, isUnsigned: true)
27+
// CHECK: !DIEnumerator(name: "U64Max", value: 18446744073709551615, isUnsigned: true)

0 commit comments

Comments
 (0)