Skip to content

Commit d9d5e01

Browse files
tbaederrAZero13
authored andcommitted
[clang][bytecode] Fix a crash in codegen (llvm#151515)
getRecord() can return nullptr if any one of the fields does, in this case because the array is too large for us to allocate.
1 parent 311b291 commit d9d5e01

File tree

3 files changed

+31
-10
lines changed

3 files changed

+31
-10
lines changed

clang/lib/AST/ByteCode/Compiler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1758,6 +1758,9 @@ bool Compiler<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
17581758
if (Inits.size() == 1 && E->getType() == Inits[0]->getType())
17591759
return this->delegate(Inits[0]);
17601760

1761+
if (!R)
1762+
return false;
1763+
17611764
auto initPrimitiveField = [=](const Record::Field *FieldToInit,
17621765
const Expr *Init, PrimType T,
17631766
bool Activate = false) -> bool {

clang/test/AST/ByteCode/codegen.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ S s;
2323
// CHECK: @sp = constant ptr getelementptr (i8, ptr @s, i64 16), align 8
2424
float &sp = s.c[3];
2525

26+
namespace NearlyZeroInit {
27+
// CHECK: @_ZN14NearlyZeroInit1bE ={{.*}} global{{.*}} { i32, <{ i32, [2147483647 x i32] }> } { i32 1, <{ i32, [2147483647 x i32] }> <{ i32 2, [2147483647 x i32] zeroinitializer }> }{{.*}}
28+
struct B { int n; int arr[1024 * 1024 * 1024 * 2u]; } b = {1, {2}};
29+
}
2630

2731
namespace BaseClassOffsets {
2832
struct A { int a; };

llvm/test/CodeGen/AArch64/cmp-to-cmn.ll

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -781,22 +781,36 @@ define i1 @almost_immediate_neg_ugt_64(i64 %x) {
781781
}
782782

783783
define i1 @cmn_nsw(i32 %a, i32 %b) {
784-
; CHECK-LABEL: cmn_nsw:
785-
; CHECK: // %bb.0:
786-
; CHECK-NEXT: cmn w0, w1
787-
; CHECK-NEXT: cset w0, gt
788-
; CHECK-NEXT: ret
784+
; CHECK-SD-LABEL: cmn_nsw:
785+
; CHECK-SD: // %bb.0:
786+
; CHECK-SD-NEXT: cmn w0, w1
787+
; CHECK-SD-NEXT: cset w0, gt
788+
; CHECK-SD-NEXT: ret
789+
;
790+
; CHECK-GI-LABEL: cmn_nsw:
791+
; CHECK-GI: // %bb.0:
792+
; CHECK-GI-NEXT: neg w8, w1
793+
; CHECK-GI-NEXT: cmp w0, w8
794+
; CHECK-GI-NEXT: cset w0, gt
795+
; CHECK-GI-NEXT: ret
789796
%sub = sub nsw i32 0, %b
790797
%cmp = icmp sgt i32 %a, %sub
791798
ret i1 %cmp
792799
}
793800

794801
define i1 @cmn_nsw_64(i64 %a, i64 %b) {
795-
; CHECK-LABEL: cmn_nsw_64:
796-
; CHECK: // %bb.0:
797-
; CHECK-NEXT: cmn x0, x1
798-
; CHECK-NEXT: cset w0, gt
799-
; CHECK-NEXT: ret
802+
; CHECK-SD-LABEL: cmn_nsw_64:
803+
; CHECK-SD: // %bb.0:
804+
; CHECK-SD-NEXT: cmn x0, x1
805+
; CHECK-SD-NEXT: cset w0, gt
806+
; CHECK-SD-NEXT: ret
807+
;
808+
; CHECK-GI-LABEL: cmn_nsw_64:
809+
; CHECK-GI: // %bb.0:
810+
; CHECK-GI-NEXT: neg x8, x1
811+
; CHECK-GI-NEXT: cmp x0, x8
812+
; CHECK-GI-NEXT: cset w0, gt
813+
; CHECK-GI-NEXT: ret
800814
%sub = sub nsw i64 0, %b
801815
%cmp = icmp sgt i64 %a, %sub
802816
ret i1 %cmp

0 commit comments

Comments
 (0)