Skip to content

Commit 5115a38

Browse files
committed
introduce jl_datatype_align
1 parent c2c0997 commit 5115a38

File tree

10 files changed

+23
-22
lines changed

10 files changed

+23
-22
lines changed

src/abi_arm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ Type *preferred_llvm_type(jl_datatype_t *dt, bool isret) const override
270270
// For a Composite Type, the alignment of the copy will have 4-byte
271271
// alignment if its natural alignment is <= 4 and 8-byte alignment if
272272
// its natural alignment is >= 8
273-
size_t align = dt->layout->alignment;
273+
size_t align = jl_datatype_align(dt);
274274
if (align < 4)
275275
align = 4;
276276
if (align > 8)

src/abi_ppc64le.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ Type *preferred_llvm_type(jl_datatype_t *dt, bool isret) const override
144144
// rewrite integer-sized (non-HFA) struct to an array
145145
// the bitsize of the integer gives the desired alignment
146146
if (size > 8) {
147-
if (dt->layout->alignment <= 8) {
147+
if (jl_datatype_align(dt) <= 8) {
148148
return ArrayType::get(T_int64, (size + 7) / 8);
149149
}
150150
else {

src/array.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,10 +193,10 @@ JL_DLLEXPORT jl_array_t *jl_reshape_array(jl_value_t *atype, jl_array_t *data,
193193
assert(store_unboxed(el_type) == !data->flags.ptrarray);
194194
if (!data->flags.ptrarray) {
195195
a->elsize = jl_datatype_size(el_type);
196-
unsigned align = ((jl_datatype_t*)el_type)->layout->alignment;
196+
unsigned align = jl_datatype_align(el_type);
197197
jl_value_t *ownerty = jl_typeof(owner);
198198
unsigned oldalign = (ownerty == (jl_value_t*)jl_string_type ? 1 :
199-
((jl_datatype_t*)jl_tparam0(ownerty))->layout->alignment);
199+
jl_datatype_align(jl_tparam0(ownerty)));
200200
if (oldalign < align)
201201
jl_exceptionf(jl_argumenterror_type,
202202
"reinterpret from alignment %u bytes to alignment %u bytes not allowed",
@@ -283,7 +283,7 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
283283
unsigned align;
284284
if (isunboxed) {
285285
elsz = jl_datatype_size(el_type);
286-
align = ((jl_datatype_t*)el_type)->layout->alignment;
286+
align = jl_datatype_align(el_type);
287287
}
288288
else {
289289
align = elsz = sizeof(void*);
@@ -346,7 +346,7 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
346346
unsigned align;
347347
if (isunboxed) {
348348
elsz = jl_datatype_size(el_type);
349-
align = ((jl_datatype_t*)el_type)->layout->alignment;
349+
align = jl_datatype_align(el_type);
350350
}
351351
else {
352352
align = elsz = sizeof(void*);

src/ccall.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,7 @@ static Value *julia_to_address(Type *to, jl_value_t *jlto, jl_unionall_t *jlto_e
618618
builder.CreateMemCpy(slot,
619619
data_pointer(jvinfo, ctx, slot->getType()),
620620
(uint64_t)jl_datatype_size(ety),
621-
(uint64_t)((jl_datatype_t*)ety)->layout->alignment);
621+
(uint64_t)jl_datatype_align(ety));
622622
mark_gc_use(jvinfo);
623623
}
624624
if (slot->getType() != to)
@@ -657,7 +657,7 @@ static Value *julia_to_native(Type *to, bool toboxed, jl_value_t *jlto, jl_union
657657
builder.CreateMemCpy(slot,
658658
data_pointer(jvinfo, ctx, slot->getType()),
659659
(uint64_t)jl_datatype_size(jlto),
660-
(uint64_t)((jl_datatype_t*)jlto)->layout->alignment);
660+
(uint64_t)jl_datatype_align(jlto));
661661
mark_gc_use(jvinfo);
662662
}
663663
return slot;

src/cgutils.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ static DIType julia_type_to_di(jl_value_t *jt, DIBuilder *dbuilder, bool isboxed
157157
llvm::DIType *t = dbuilder->createBasicType(
158158
jl_symbol_name(jdt->name->name),
159159
SizeInBits,
160-
8 * jdt->layout->alignment,
160+
8 * jl_datatype_align(jdt),
161161
llvm::dwarf::DW_ATE_unsigned);
162162
jdt->ditype = t;
163163
return t;
164164
#else
165165
DIType t = dbuilder->createBasicType(
166166
jl_symbol_name(jdt->name->name),
167167
SizeInBits,
168-
8 * jdt->layout->alignment,
168+
8 * jl_datatype_align(jdt),
169169
llvm::dwarf::DW_ATE_unsigned);
170170
MDNode *M = t;
171171
jdt->ditype = M;
@@ -189,7 +189,7 @@ static DIType julia_type_to_di(jl_value_t *jt, DIBuilder *dbuilder, bool isboxed
189189
NULL, // File
190190
0, // LineNumber
191191
jl_datatype_nbits(jdt), // SizeInBits
192-
8 * jdt->layout->alignment, // AlignInBits
192+
8 * jl_datatype_align(jdt), // AlignInBits
193193
DIFlagZero, // Flags
194194
NULL, // DerivedFrom
195195
DINodeArray(), // Elements
@@ -523,7 +523,7 @@ static Type *julia_struct_to_llvm(jl_value_t *jt, jl_unionall_t *ua, bool *isbox
523523
*jl_ExecutionEngine->getDataLayout();
524524
#endif
525525
unsigned llvm_alignment = DL.getABITypeAlignment((Type*)jst->struct_decl);
526-
unsigned julia_alignment = jst->layout->alignment;
526+
unsigned julia_alignment = jl_datatype_align(jst);
527527
// Check that the alignment adheres to the heap alignment.
528528
assert(julia_alignment <= JL_SMALL_BYTE_ALIGNMENT);
529529
// TODO: Fix alignment calculation in LLVM, as well as in the GC and the struct declaration
@@ -1169,7 +1169,7 @@ static Value *emit_bounds_check(const jl_cgval_t &ainfo, jl_value_t *ty, Value *
11691169
// It is currently unused, but might be used in the future for a more precise answer.
11701170
static unsigned julia_alignment(Value* /*ptr*/, jl_value_t *jltype, unsigned alignment)
11711171
{
1172-
if (!alignment && ((jl_datatype_t*)jltype)->layout->alignment > MAX_ALIGN) {
1172+
if (!alignment && jl_datatype_align(jltype) > MAX_ALIGN) {
11731173
// Type's natural alignment exceeds strictest alignment promised in heap, so return the heap alignment.
11741174
return MAX_ALIGN;
11751175
}

src/codegen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3688,7 +3688,7 @@ static void union_alloca_type(jl_uniontype_t *ut,
36883688
[&](unsigned idx, jl_datatype_t *jt) {
36893689
if (!jl_is_datatype_singleton(jt)) {
36903690
size_t nb1 = jl_datatype_size(jt);
3691-
size_t align1 = jt->layout->alignment;
3691+
size_t align1 = jl_datatype_align(jt);
36923692
if (nb1 > nbytes)
36933693
nbytes = nb1;
36943694
if (align1 > align)
@@ -3959,7 +3959,7 @@ static void emit_assignment(jl_value_t *l, jl_value_t *r, jl_codectx_t *ctx)
39593959
builder.CreateMemCpy(vi.value.V,
39603960
data_pointer(rval_info, ctx, T_pint8),
39613961
copy_bytes,
3962-
((jl_datatype_t*)rval_info.typ)->layout->alignment,
3962+
jl_datatype_align(rval_info.typ),
39633963
vi.isVolatile,
39643964
tbaa);
39653965
}

src/datatype.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
278278
// Should never happen
279279
if (__unlikely(fsz > max_size))
280280
goto throw_ovf;
281-
al = ((jl_datatype_t*)ty)->layout->alignment;
281+
al = jl_datatype_align(ty);
282282
desc[i].isptr = 0;
283283
if (((jl_datatype_t*)ty)->layout->haspadding)
284284
haspadding = 1;
@@ -441,7 +441,7 @@ static jl_value_t *jl_new_bits_internal(jl_value_t *dt, void *data, size_t *len)
441441
size_t nb = jl_datatype_size(bt);
442442
if (nb == 0)
443443
return jl_new_struct_uninit(bt);
444-
*len = LLT_ALIGN(*len, bt->layout->alignment);
444+
*len = LLT_ALIGN(*len, jl_datatype_align(bt));
445445
data = (char*)data + (*len);
446446
*len += nb;
447447
if (bt == jl_uint8_type) return jl_box_uint8(*(uint8_t*)data);
@@ -762,7 +762,7 @@ JL_DLLEXPORT size_t jl_get_alignment(jl_datatype_t *ty)
762762
{
763763
if (ty->layout == NULL)
764764
jl_error("non-leaf type doesn't have an alignment");
765-
return ty->layout->alignment;
765+
return jl_datatype_align(ty);
766766
}
767767

768768
#ifdef __cplusplus

src/intrinsics.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ static jl_cgval_t emit_pointerref(jl_cgval_t *argv, jl_codectx_t *ctx)
616616
Value *strct = emit_allocobj(ctx, size,
617617
literal_pointer_val((jl_value_t*)ety));
618618
im1 = builder.CreateMul(im1, ConstantInt::get(T_size,
619-
LLT_ALIGN(size, ((jl_datatype_t*)ety)->layout->alignment)));
619+
LLT_ALIGN(size, jl_datatype_align(ety))));
620620
Value *thePtr = emit_unbox(T_pint8, e, e.typ);
621621
thePtr = builder.CreateGEP(emit_bitcast(thePtr, T_pint8), im1);
622622
builder.CreateMemCpy(emit_bitcast(strct, T_pint8), thePtr, size, 1);
@@ -673,7 +673,7 @@ static jl_cgval_t emit_pointerset(jl_cgval_t *argv, jl_codectx_t *ctx)
673673
thePtr = emit_unbox(T_pint8, e, e.typ);
674674
uint64_t size = jl_datatype_size(ety);
675675
im1 = builder.CreateMul(im1, ConstantInt::get(T_size,
676-
LLT_ALIGN(size, ((jl_datatype_t*)ety)->layout->alignment)));
676+
LLT_ALIGN(size, jl_datatype_align(ety))));
677677
builder.CreateMemCpy(builder.CreateGEP(thePtr, im1),
678678
data_pointer(x, ctx, T_pint8), size, align_nb);
679679
}

src/julia.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,7 @@ STATIC_INLINE void jl_array_uint8_set(void *a, size_t i, uint8_t x)
773773
#define jl_field_type(st,i) jl_svecref(((jl_datatype_t*)st)->types, (i))
774774
#define jl_field_count(st) jl_svec_len(((jl_datatype_t*)st)->types)
775775
#define jl_datatype_size(t) (((jl_datatype_t*)t)->size)
776+
#define jl_datatype_align(t) (((jl_datatype_t*)t)->layout->alignment)
776777
#define jl_datatype_nbits(t) ((((jl_datatype_t*)t)->size)*8)
777778
#define jl_datatype_nfields(t) (((jl_datatype_t*)(t))->layout->nfields)
778779

src/runtime_intrinsics.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ JL_DLLEXPORT jl_value_t *jl_pointerref(jl_value_t *p, jl_value_t *i, jl_value_t
4646
else {
4747
if (!jl_is_datatype(ety))
4848
jl_error("pointerref: invalid pointer");
49-
size_t nb = LLT_ALIGN(jl_datatype_size(ety), ((jl_datatype_t*)ety)->layout->alignment);
49+
size_t nb = LLT_ALIGN(jl_datatype_size(ety), jl_datatype_align(ety));
5050
char *pp = (char*)jl_unbox_long(p) + (jl_unbox_long(i)-1)*nb;
5151
return jl_new_bits(ety, pp);
5252
}
@@ -67,7 +67,7 @@ JL_DLLEXPORT jl_value_t *jl_pointerset(jl_value_t *p, jl_value_t *x, jl_value_t
6767
else {
6868
if (!jl_is_datatype(ety))
6969
jl_error("pointerset: invalid pointer");
70-
size_t nb = LLT_ALIGN(jl_datatype_size(ety), ((jl_datatype_t*)ety)->layout->alignment);
70+
size_t nb = LLT_ALIGN(jl_datatype_size(ety), jl_datatype_align(ety));
7171
char *pp = (char*)jl_unbox_long(p) + (jl_unbox_long(i)-1)*nb;
7272
if (jl_typeof(x) != ety)
7373
jl_error("pointerset: type mismatch in assign");

0 commit comments

Comments
 (0)