Skip to content

Commit eb272a3

Browse files
gbaraldioscardssmith
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 2253945 commit eb272a3

File tree

3 files changed

+10
-0
lines changed

3 files changed

+10
-0
lines changed

src/codegen.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7715,6 +7715,8 @@ static jl_llvm_functions_t
77157715
Type *RT = Arg->getParamStructRetType();
77167716
TypeSize sz = DL.getTypeAllocSize(RT);
77177717
Align al = DL.getPrefTypeAlign(RT);
7718+
if (al > MAX_ALIGN)
7719+
al = Align(MAX_ALIGN);
77187720
param.addAttribute(Attribute::NonNull);
77197721
// The `dereferenceable` below does not imply `nonnull` for non addrspace(0) pointers.
77207722
param.addDereferenceableAttr(sz);

src/datatype.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,8 @@ void jl_compute_field_offsets(jl_datatype_t *st)
648648
if (al > alignm)
649649
alignm = al;
650650
}
651+
if (alignm > MAX_ALIGN)
652+
alignm = MAX_ALIGN; // We cannot guarantee alignments over 16 bytes because that's what our heap is aligned as
651653
if (LLT_ALIGN(sz, alignm) > sz) {
652654
haspadding = 1;
653655
sz = LLT_ALIGN(sz, alignm);

test/compiler/codegen.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,3 +873,9 @@ end
873873

874874
# Core.getptls() special handling
875875
@test !occursin("call ptr @jlplt", get_llvm(Core.getptls, Tuple{})) #It should lower to a direct load of the ptls and not a ccall
876+
877+
878+
struct Vec56937 x::NTuple{8, VecElement{Int}} end
879+
880+
x56937 = Ref(Vec56937(ntuple(_->VecElement(1),8)))
881+
@test x56937[].x[1] == VecElement{Int}(1) # shouldn't crash

0 commit comments

Comments
 (0)