mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-22 15:31:00 +00:00
[CodeGen][ObjC] Emit a primitive store to store a __strong field in
ExpandTypeFromArgs This fixes a bug in IRGen where a call to `llvm.objc.storeStrong` was being emitted to initialize a __strong field of an uninitialized temporary struct, which caused crashes at runtime. rdar://problem/51807365
This commit is contained in:
parent
d08dc0655e
commit
d8136f14f1
@ -1047,8 +1047,13 @@ void CodeGenFunction::ExpandTypeFromArgs(
|
||||
auto imagValue = *AI++;
|
||||
EmitStoreOfComplex(ComplexPairTy(realValue, imagValue), LV, /*init*/ true);
|
||||
} else {
|
||||
// Call EmitStoreOfScalar except when the lvalue is a bitfield to emit a
|
||||
// primitive store.
|
||||
assert(isa<NoExpansion>(Exp.get()));
|
||||
EmitStoreThroughLValue(RValue::get(*AI++), LV);
|
||||
if (LV.isBitField())
|
||||
EmitStoreThroughLValue(RValue::get(*AI++), LV);
|
||||
else
|
||||
EmitStoreOfScalar(*AI++, LV);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4544,7 +4544,11 @@ RValue CodeGenFunction::EmitRValueForField(LValue LV,
|
||||
// don't load reference fields.
|
||||
if (FD->getType()->isReferenceType())
|
||||
return RValue::get(FieldLV.getPointer(*this));
|
||||
return EmitLoadOfLValue(FieldLV, Loc);
|
||||
// Call EmitLoadOfScalar except when the lvalue is a bitfield to emit a
|
||||
// primitive load.
|
||||
if (FieldLV.isBitField())
|
||||
return EmitLoadOfLValue(FieldLV, Loc);
|
||||
return RValue::get(EmitLoadOfScalar(FieldLV, Loc));
|
||||
}
|
||||
llvm_unreachable("bad evaluation kind");
|
||||
}
|
||||
|
17
clang/test/CodeGenObjC/nontrivial-struct-param-init.m
Normal file
17
clang/test/CodeGenObjC/nontrivial-struct-param-init.m
Normal file
@ -0,0 +1,17 @@
|
||||
// RUN: %clang_cc1 -triple i386-apple-watchos6.0-simulator -emit-llvm -fblocks -fobjc-arc -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: %[[STRUCT_S:.*]] = type { i8* }
|
||||
|
||||
typedef struct {
|
||||
id x;
|
||||
} S;
|
||||
|
||||
// CHECK: define void @test0(i8* %[[A_0:.*]])
|
||||
// CHECK: %[[A:.*]] = alloca %[[STRUCT_S]], align 4
|
||||
// CHECK: %[[X:.*]] = getelementptr inbounds %[[STRUCT_S]], %[[STRUCT_S]]* %[[A]], i32 0, i32 0
|
||||
// CHECK: store i8* %[[A_0]], i8** %[[X]], align 4
|
||||
// CHECK: %[[V0:.*]] = bitcast %[[STRUCT_S]]* %[[A]] to i8**
|
||||
// CHECK: call void @__destructor_4_s0(i8** %[[V0]]) #2
|
||||
|
||||
void test0(S a) {
|
||||
}
|
Loading…
Reference in New Issue
Block a user