mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-11 17:08:42 +00:00
Make sure we correctly zero-initialize unions containing a pointer to data member as the first field. PR11487.
llvm-svn: 146009
This commit is contained in:
parent
af748e1180
commit
dae858aca3
@ -1243,13 +1243,17 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
|
||||
for (RecordDecl::field_iterator I = record->field_begin(),
|
||||
E = record->field_end(); I != E; ++I) {
|
||||
const FieldDecl *field = *I;
|
||||
|
||||
// Ignore bit fields.
|
||||
if (field->isBitField())
|
||||
continue;
|
||||
|
||||
unsigned fieldIndex = layout.getLLVMFieldNo(field);
|
||||
elements[fieldIndex] = CGM.EmitNullConstant(field->getType());
|
||||
|
||||
// Fill in non-bitfields. (Bitfields always use a zero pattern, which we
|
||||
// will fill in later.)
|
||||
if (!field->isBitField()) {
|
||||
unsigned fieldIndex = layout.getLLVMFieldNo(field);
|
||||
elements[fieldIndex] = CGM.EmitNullConstant(field->getType());
|
||||
}
|
||||
|
||||
// For unions, stop after the first named field.
|
||||
if (record->isUnion() && field->getDeclName())
|
||||
break;
|
||||
}
|
||||
|
||||
// Fill in the virtual bases, if we're working with the complete object.
|
||||
|
@ -531,6 +531,7 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
|
||||
CharUnits unionAlign = CharUnits::Zero();
|
||||
|
||||
bool hasOnlyZeroSizedBitFields = true;
|
||||
bool checkedFirstFieldZeroInit = false;
|
||||
|
||||
unsigned fieldNo = 0;
|
||||
for (RecordDecl::field_iterator field = D->field_begin(),
|
||||
@ -542,6 +543,11 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
|
||||
if (!fieldType)
|
||||
continue;
|
||||
|
||||
if (field->getDeclName() && !checkedFirstFieldZeroInit) {
|
||||
CheckZeroInitializable(field->getType());
|
||||
checkedFirstFieldZeroInit = true;
|
||||
}
|
||||
|
||||
hasOnlyZeroSizedBitFields = false;
|
||||
|
||||
CharUnits fieldAlign = CharUnits::fromQuantity(
|
||||
|
@ -230,3 +230,13 @@ namespace test4 {
|
||||
// CHECK-GLOBAL: @_ZN5test41dE = global %"struct.test4::D" { %"struct.test4::C.base" zeroinitializer, i32* null, %"struct.test4::B.base" { i32 (...)** null, i64 -1 }, %"struct.test4::A" zeroinitializer }, align 8
|
||||
D d;
|
||||
}
|
||||
|
||||
namespace PR11487 {
|
||||
union U
|
||||
{
|
||||
int U::* mptr;
|
||||
char x[16];
|
||||
} x;
|
||||
// CHECK-GLOBAL: @_ZN7PR114871xE = global %"union.PR11487::U" { i64 -1, [8 x i8] zeroinitializer }, align 8
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user