Skip to content

Commit 363a119

Browse files
gbaraldiKristofferC
authored andcommitted
Make sure we don't promise alignments that are larger than the heap alignment to LLVM (#56938)
Fixes #56937 --------- Co-authored-by: Oscar Smith <[email protected]> (cherry picked from commit 1e2758e)
1 parent af8ae14 commit 363a119

File tree

3 files changed

+9
-0
lines changed

3 files changed

+9
-0
lines changed

src/codegen.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -8552,6 +8552,8 @@ static jl_llvm_functions_t
85528552
Type *RT = Arg->getParamStructRetType();
85538553
TypeSize sz = DL.getTypeAllocSize(RT);
85548554
Align al = DL.getPrefTypeAlign(RT);
8555+
if (al > MAX_ALIGN)
8556+
al = Align(MAX_ALIGN);
85558557
param.addAttribute(Attribute::NonNull);
85568558
// The `dereferenceable` below does not imply `nonnull` for non addrspace(0) pointers.
85578559
param.addDereferenceableAttr(sz);

src/datatype.c

+2
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ void jl_compute_field_offsets(jl_datatype_t *st)
754754
if (al > alignm)
755755
alignm = al;
756756
}
757+
if (alignm > MAX_ALIGN)
758+
alignm = MAX_ALIGN; // We cannot guarantee alignments over 16 bytes because that's what our heap is aligned as
757759
if (LLT_ALIGN(sz, alignm) > sz) {
758760
haspadding = 1;
759761
sz = LLT_ALIGN(sz, alignm);

test/compiler/codegen.jl

+5
Original file line numberDiff line numberDiff line change
@@ -933,3 +933,8 @@ let
933933
end
934934
nothing
935935
end
936+
937+
struct Vec56937 x::NTuple{8, VecElement{Int}} end
938+
939+
x56937 = Ref(Vec56937(ntuple(_->VecElement(1),8)))
940+
@test x56937[].x[1] == VecElement{Int}(1) # shouldn't crash

0 commit comments

Comments
 (0)