Skip to content

Commit 3d5f11c

Browse files
committed
librustc_codegen_llvm: Pass bitflags as raw integral types for FFI (#61306)
The C++ side uses enums with underlying integral types. However, Rust's bitflags types are a single-field struct containing an integral type, which are not always passed the same way in the C ABI. In particular, sparc64's ABI extends integral types to a full 64-bit value, but does not do the same for single-field structs. Thanks to Michael Karcher for finding this bug.
1 parent 9f8cd9d commit 3d5f11c

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

src/librustc_codegen_llvm/debuginfo/metadata.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,7 @@ impl<'ll> MemberDescription<'ll> {
10391039
None => None,
10401040
Some(value) => Some(cx.const_u64(value)),
10411041
},
1042-
self.flags,
1042+
self.flags.bits(),
10431043
self.type_metadata)
10441044
}
10451045
}
@@ -1837,7 +1837,7 @@ fn prepare_enum_metadata(
18371837
UNKNOWN_LINE_NUMBER,
18381838
layout.size.bits(),
18391839
layout.align.abi.bits() as u32,
1840-
DIFlags::FlagZero,
1840+
DIFlags::FlagZero.bits(),
18411841
None,
18421842
0, // RuntimeLang
18431843
unique_type_id_str.as_ptr())
@@ -1896,7 +1896,7 @@ fn prepare_enum_metadata(
18961896
size.bits(),
18971897
align.abi.bits() as u32,
18981898
layout.fields.offset(discr_index).bits(),
1899-
DIFlags::FlagArtificial,
1899+
DIFlags::FlagArtificial.bits(),
19001900
discr_metadata))
19011901
}
19021902
},
@@ -1921,7 +1921,7 @@ fn prepare_enum_metadata(
19211921
size.bits(),
19221922
align.bits() as u32,
19231923
layout.fields.offset(discr_index).bits(),
1924-
DIFlags::FlagArtificial,
1924+
DIFlags::FlagArtificial.bits(),
19251925
discr_metadata))
19261926
}
19271927
},
@@ -1958,7 +1958,7 @@ fn prepare_enum_metadata(
19581958
UNKNOWN_LINE_NUMBER,
19591959
layout.size.bits(),
19601960
layout.align.abi.bits() as u32,
1961-
DIFlags::FlagZero,
1961+
DIFlags::FlagZero.bits(),
19621962
discriminator_metadata,
19631963
empty_array,
19641964
variant_part_unique_type_id_str.as_ptr())
@@ -1976,7 +1976,7 @@ fn prepare_enum_metadata(
19761976
UNKNOWN_LINE_NUMBER,
19771977
layout.size.bits(),
19781978
layout.align.abi.bits() as u32,
1979-
DIFlags::FlagZero,
1979+
DIFlags::FlagZero.bits(),
19801980
None,
19811981
type_array,
19821982
0,
@@ -2142,7 +2142,7 @@ fn create_struct_stub(
21422142
UNKNOWN_LINE_NUMBER,
21432143
struct_size.bits(),
21442144
struct_align.bits() as u32,
2145-
DIFlags::FlagZero,
2145+
DIFlags::FlagZero.bits(),
21462146
None,
21472147
empty_array,
21482148
0,
@@ -2180,7 +2180,7 @@ fn create_union_stub(
21802180
UNKNOWN_LINE_NUMBER,
21812181
union_size.bits(),
21822182
union_align.bits() as u32,
2183-
DIFlags::FlagZero,
2183+
DIFlags::FlagZero.bits(),
21842184
Some(empty_array),
21852185
0, // RuntimeLang
21862186
unique_type_id.as_ptr())
@@ -2283,7 +2283,7 @@ pub fn create_vtable_metadata(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>, vtable: &
22832283
UNKNOWN_LINE_NUMBER,
22842284
Size::ZERO.bits(),
22852285
cx.tcx.data_layout.pointer_align.abi.bits() as u32,
2286-
DIFlags::FlagArtificial,
2286+
DIFlags::FlagArtificial.bits(),
22872287
None,
22882288
empty_array,
22892289
0,

src/librustc_codegen_llvm/debuginfo/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ impl DebugInfoBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
187187
loc.line as c_uint,
188188
type_metadata,
189189
cx.sess().opts.optimize != config::OptLevel::No,
190-
DIFlags::FlagZero,
190+
DIFlags::FlagZero.bits(),
191191
argument_index,
192192
align.bytes() as u32,
193193
)
@@ -321,8 +321,8 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
321321
loc.line as c_uint,
322322
function_type_metadata,
323323
scope_line as c_uint,
324-
flags,
325-
spflags,
324+
flags.bits(),
325+
spflags.bits(),
326326
llfn,
327327
template_parameters,
328328
None)

src/librustc_codegen_llvm/llvm/ffi.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use super::debuginfo::{
22
DIBuilder, DIDescriptor, DIFile, DILexicalBlock, DISubprogram, DIType,
33
DIBasicType, DIDerivedType, DICompositeType, DIScope, DIVariable,
44
DIGlobalVariableExpression, DIArray, DISubrange, DITemplateTypeParameter, DIEnumerator,
5-
DINameSpace, DIFlags, DISPFlags, DebugEmissionKind,
5+
DINameSpace, DebugEmissionKind,
66
};
77

88
use libc::{c_uint, c_int, size_t, c_char};
@@ -564,9 +564,8 @@ pub mod debuginfo {
564564

565565
// These values **must** match with LLVMRustDIFlags!!
566566
bitflags! {
567-
#[repr(C)]
568567
#[derive(Default)]
569-
pub struct DIFlags: ::libc::uint32_t {
568+
pub struct DIFlags: u32 {
570569
const FlagZero = 0;
571570
const FlagPrivate = 1;
572571
const FlagProtected = 2;
@@ -593,9 +592,8 @@ pub mod debuginfo {
593592

594593
// These values **must** match with LLVMRustDISPFlags!!
595594
bitflags! {
596-
#[repr(C)]
597595
#[derive(Default)]
598-
pub struct DISPFlags: ::libc::uint32_t {
596+
pub struct DISPFlags: u32 {
599597
const SPFlagZero = 0;
600598
const SPFlagVirtual = 1;
601599
const SPFlagPureVirtual = 2;
@@ -1452,8 +1450,8 @@ extern "C" {
14521450
LineNo: c_uint,
14531451
Ty: &'a DIType,
14541452
ScopeLine: c_uint,
1455-
Flags: DIFlags,
1456-
SPFlags: DISPFlags,
1453+
Flags: u32,
1454+
SPFlags: u32,
14571455
Fn: &'a Value,
14581456
TParam: &'a DIArray,
14591457
Decl: Option<&'a DIDescriptor>)
@@ -1480,7 +1478,7 @@ extern "C" {
14801478
LineNumber: c_uint,
14811479
SizeInBits: u64,
14821480
AlignInBits: u32,
1483-
Flags: DIFlags,
1481+
Flags: u32,
14841482
DerivedFrom: Option<&'a DIType>,
14851483
Elements: &'a DIArray,
14861484
RunTimeLang: c_uint,
@@ -1496,7 +1494,7 @@ extern "C" {
14961494
SizeInBits: u64,
14971495
AlignInBits: u32,
14981496
OffsetInBits: u64,
1499-
Flags: DIFlags,
1497+
Flags: u32,
15001498
Ty: &'a DIType)
15011499
-> &'a DIDerivedType;
15021500

@@ -1509,7 +1507,7 @@ extern "C" {
15091507
AlignInBits: u32,
15101508
OffsetInBits: u64,
15111509
Discriminant: Option<&'a Value>,
1512-
Flags: DIFlags,
1510+
Flags: u32,
15131511
Ty: &'a DIType)
15141512
-> &'a DIType;
15151513

@@ -1546,7 +1544,7 @@ extern "C" {
15461544
LineNo: c_uint,
15471545
Ty: &'a DIType,
15481546
AlwaysPreserve: bool,
1549-
Flags: DIFlags,
1547+
Flags: u32,
15501548
ArgNo: c_uint,
15511549
AlignInBits: u32)
15521550
-> &'a DIVariable;
@@ -1601,7 +1599,7 @@ extern "C" {
16011599
LineNumber: c_uint,
16021600
SizeInBits: u64,
16031601
AlignInBits: u32,
1604-
Flags: DIFlags,
1602+
Flags: u32,
16051603
Elements: Option<&'a DIArray>,
16061604
RunTimeLang: c_uint,
16071605
UniqueId: *const c_char)
@@ -1614,7 +1612,7 @@ extern "C" {
16141612
LineNo: c_uint,
16151613
SizeInBits: u64,
16161614
AlignInBits: u32,
1617-
Flags: DIFlags,
1615+
Flags: u32,
16181616
Discriminator: Option<&'a DIDerivedType>,
16191617
Elements: &'a DIArray,
16201618
UniqueId: *const c_char)

0 commit comments

Comments
 (0)