mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Add extra max alignment parameter for metrics (specifically for SIMD)
This commit is contained in:
+29
-52
@@ -116,6 +116,7 @@ struct TargetMetrics {
|
|||||||
TargetArchKind arch;
|
TargetArchKind arch;
|
||||||
isize word_size;
|
isize word_size;
|
||||||
isize max_align;
|
isize max_align;
|
||||||
|
isize max_simd_align;
|
||||||
String target_triplet;
|
String target_triplet;
|
||||||
String target_data_layout;
|
String target_data_layout;
|
||||||
TargetABIKind abi;
|
TargetABIKind abi;
|
||||||
@@ -235,8 +236,9 @@ struct BuildContext {
|
|||||||
TargetEndianKind endian_kind;
|
TargetEndianKind endian_kind;
|
||||||
|
|
||||||
// In bytes
|
// In bytes
|
||||||
i64 word_size; // Size of a pointer, must be >= 4
|
i64 word_size; // Size of a pointer, must be >= 4
|
||||||
i64 max_align; // max alignment, must be >= 1 (and typically >= word_size)
|
i64 max_align; // max alignment, must be >= 1 (and typically >= word_size)
|
||||||
|
i64 max_simd_align; // max alignment, must be >= 1 (and typically >= word_size)
|
||||||
|
|
||||||
CommandKind command_kind;
|
CommandKind command_kind;
|
||||||
String command;
|
String command;
|
||||||
@@ -339,15 +341,13 @@ bool global_ignore_warnings(void) {
|
|||||||
gb_global TargetMetrics target_windows_i386 = {
|
gb_global TargetMetrics target_windows_i386 = {
|
||||||
TargetOs_windows,
|
TargetOs_windows,
|
||||||
TargetArch_i386,
|
TargetArch_i386,
|
||||||
4,
|
4, 4, 8,
|
||||||
8,
|
|
||||||
str_lit("i386-pc-windows-msvc"),
|
str_lit("i386-pc-windows-msvc"),
|
||||||
};
|
};
|
||||||
gb_global TargetMetrics target_windows_amd64 = {
|
gb_global TargetMetrics target_windows_amd64 = {
|
||||||
TargetOs_windows,
|
TargetOs_windows,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-pc-windows-msvc"),
|
str_lit("x86_64-pc-windows-msvc"),
|
||||||
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
};
|
};
|
||||||
@@ -355,24 +355,21 @@ gb_global TargetMetrics target_windows_amd64 = {
|
|||||||
gb_global TargetMetrics target_linux_i386 = {
|
gb_global TargetMetrics target_linux_i386 = {
|
||||||
TargetOs_linux,
|
TargetOs_linux,
|
||||||
TargetArch_i386,
|
TargetArch_i386,
|
||||||
4,
|
4, 4, 8,
|
||||||
8,
|
|
||||||
str_lit("i386-pc-linux-gnu"),
|
str_lit("i386-pc-linux-gnu"),
|
||||||
|
|
||||||
};
|
};
|
||||||
gb_global TargetMetrics target_linux_amd64 = {
|
gb_global TargetMetrics target_linux_amd64 = {
|
||||||
TargetOs_linux,
|
TargetOs_linux,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-pc-linux-gnu"),
|
str_lit("x86_64-pc-linux-gnu"),
|
||||||
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
};
|
};
|
||||||
gb_global TargetMetrics target_linux_arm64 = {
|
gb_global TargetMetrics target_linux_arm64 = {
|
||||||
TargetOs_linux,
|
TargetOs_linux,
|
||||||
TargetArch_arm64,
|
TargetArch_arm64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("aarch64-linux-elf"),
|
str_lit("aarch64-linux-elf"),
|
||||||
str_lit("e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"),
|
str_lit("e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"),
|
||||||
};
|
};
|
||||||
@@ -380,8 +377,7 @@ gb_global TargetMetrics target_linux_arm64 = {
|
|||||||
gb_global TargetMetrics target_linux_arm32 = {
|
gb_global TargetMetrics target_linux_arm32 = {
|
||||||
TargetOs_linux,
|
TargetOs_linux,
|
||||||
TargetArch_arm32,
|
TargetArch_arm32,
|
||||||
4,
|
4, 4, 8,
|
||||||
8,
|
|
||||||
str_lit("arm-linux-gnu"),
|
str_lit("arm-linux-gnu"),
|
||||||
str_lit("e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"),
|
str_lit("e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"),
|
||||||
};
|
};
|
||||||
@@ -389,8 +385,7 @@ gb_global TargetMetrics target_linux_arm32 = {
|
|||||||
gb_global TargetMetrics target_darwin_amd64 = {
|
gb_global TargetMetrics target_darwin_amd64 = {
|
||||||
TargetOs_darwin,
|
TargetOs_darwin,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-apple-darwin"),
|
str_lit("x86_64-apple-darwin"),
|
||||||
str_lit("e-m:o-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:o-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
};
|
};
|
||||||
@@ -398,8 +393,7 @@ gb_global TargetMetrics target_darwin_amd64 = {
|
|||||||
gb_global TargetMetrics target_darwin_arm64 = {
|
gb_global TargetMetrics target_darwin_arm64 = {
|
||||||
TargetOs_darwin,
|
TargetOs_darwin,
|
||||||
TargetArch_arm64,
|
TargetArch_arm64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("arm64-apple-macosx11.0.0"),
|
str_lit("arm64-apple-macosx11.0.0"),
|
||||||
str_lit("e-m:o-i64:64-i128:128-n32:64-S128"), // TODO(bill): Is this correct?
|
str_lit("e-m:o-i64:64-i128:128-n32:64-S128"), // TODO(bill): Is this correct?
|
||||||
};
|
};
|
||||||
@@ -407,16 +401,14 @@ gb_global TargetMetrics target_darwin_arm64 = {
|
|||||||
gb_global TargetMetrics target_freebsd_i386 = {
|
gb_global TargetMetrics target_freebsd_i386 = {
|
||||||
TargetOs_freebsd,
|
TargetOs_freebsd,
|
||||||
TargetArch_i386,
|
TargetArch_i386,
|
||||||
4,
|
4, 4, 8,
|
||||||
8,
|
|
||||||
str_lit("i386-unknown-freebsd-elf"),
|
str_lit("i386-unknown-freebsd-elf"),
|
||||||
};
|
};
|
||||||
|
|
||||||
gb_global TargetMetrics target_freebsd_amd64 = {
|
gb_global TargetMetrics target_freebsd_amd64 = {
|
||||||
TargetOs_freebsd,
|
TargetOs_freebsd,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-unknown-freebsd-elf"),
|
str_lit("x86_64-unknown-freebsd-elf"),
|
||||||
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
};
|
};
|
||||||
@@ -424,8 +416,7 @@ gb_global TargetMetrics target_freebsd_amd64 = {
|
|||||||
gb_global TargetMetrics target_openbsd_amd64 = {
|
gb_global TargetMetrics target_openbsd_amd64 = {
|
||||||
TargetOs_openbsd,
|
TargetOs_openbsd,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-unknown-openbsd-elf"),
|
str_lit("x86_64-unknown-openbsd-elf"),
|
||||||
str_lit("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
};
|
};
|
||||||
@@ -433,16 +424,14 @@ gb_global TargetMetrics target_openbsd_amd64 = {
|
|||||||
gb_global TargetMetrics target_essence_amd64 = {
|
gb_global TargetMetrics target_essence_amd64 = {
|
||||||
TargetOs_essence,
|
TargetOs_essence,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-pc-none-elf"),
|
str_lit("x86_64-pc-none-elf"),
|
||||||
};
|
};
|
||||||
|
|
||||||
gb_global TargetMetrics target_freestanding_wasm32 = {
|
gb_global TargetMetrics target_freestanding_wasm32 = {
|
||||||
TargetOs_freestanding,
|
TargetOs_freestanding,
|
||||||
TargetArch_wasm32,
|
TargetArch_wasm32,
|
||||||
4,
|
4, 8, 16,
|
||||||
8,
|
|
||||||
str_lit("wasm32-freestanding-js"),
|
str_lit("wasm32-freestanding-js"),
|
||||||
str_lit(""),
|
str_lit(""),
|
||||||
};
|
};
|
||||||
@@ -450,8 +439,7 @@ gb_global TargetMetrics target_freestanding_wasm32 = {
|
|||||||
gb_global TargetMetrics target_js_wasm32 = {
|
gb_global TargetMetrics target_js_wasm32 = {
|
||||||
TargetOs_js,
|
TargetOs_js,
|
||||||
TargetArch_wasm32,
|
TargetArch_wasm32,
|
||||||
4,
|
4, 8, 16,
|
||||||
8,
|
|
||||||
str_lit("wasm32-js-js"),
|
str_lit("wasm32-js-js"),
|
||||||
str_lit(""),
|
str_lit(""),
|
||||||
};
|
};
|
||||||
@@ -459,8 +447,7 @@ gb_global TargetMetrics target_js_wasm32 = {
|
|||||||
gb_global TargetMetrics target_js_wasm64 = {
|
gb_global TargetMetrics target_js_wasm64 = {
|
||||||
TargetOs_js,
|
TargetOs_js,
|
||||||
TargetArch_wasm64,
|
TargetArch_wasm64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("wasm64-js-js"),
|
str_lit("wasm64-js-js"),
|
||||||
str_lit(""),
|
str_lit(""),
|
||||||
};
|
};
|
||||||
@@ -468,27 +455,15 @@ gb_global TargetMetrics target_js_wasm64 = {
|
|||||||
gb_global TargetMetrics target_wasi_wasm32 = {
|
gb_global TargetMetrics target_wasi_wasm32 = {
|
||||||
TargetOs_wasi,
|
TargetOs_wasi,
|
||||||
TargetArch_wasm32,
|
TargetArch_wasm32,
|
||||||
4,
|
4, 8, 16,
|
||||||
8,
|
|
||||||
str_lit("wasm32-wasi-js"),
|
str_lit("wasm32-wasi-js"),
|
||||||
str_lit(""),
|
str_lit(""),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// gb_global TargetMetrics target_freestanding_wasm64 = {
|
|
||||||
// TargetOs_freestanding,
|
|
||||||
// TargetArch_wasm64,
|
|
||||||
// 8,
|
|
||||||
// 16,
|
|
||||||
// str_lit("wasm64-freestanding-js"),
|
|
||||||
// str_lit(""),
|
|
||||||
// };
|
|
||||||
|
|
||||||
gb_global TargetMetrics target_freestanding_amd64_sysv = {
|
gb_global TargetMetrics target_freestanding_amd64_sysv = {
|
||||||
TargetOs_freestanding,
|
TargetOs_freestanding,
|
||||||
TargetArch_amd64,
|
TargetArch_amd64,
|
||||||
8,
|
8, 8, 16,
|
||||||
16,
|
|
||||||
str_lit("x86_64-pc-none-gnu"),
|
str_lit("x86_64-pc-none-gnu"),
|
||||||
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"),
|
||||||
TargetABI_SysV,
|
TargetABI_SysV,
|
||||||
@@ -517,7 +492,7 @@ gb_global NamedTargetMetrics named_targets[] = {
|
|||||||
{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
|
{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
|
||||||
{ str_lit("wasi_wasm32"), &target_wasi_wasm32 },
|
{ str_lit("wasi_wasm32"), &target_wasi_wasm32 },
|
||||||
{ str_lit("js_wasm32"), &target_js_wasm32 },
|
{ str_lit("js_wasm32"), &target_js_wasm32 },
|
||||||
{ str_lit("js_wasm64"), &target_js_wasm64 },
|
// { str_lit("js_wasm64"), &target_js_wasm64 },
|
||||||
|
|
||||||
{ str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv },
|
{ str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv },
|
||||||
};
|
};
|
||||||
@@ -1084,14 +1059,16 @@ void init_build_context(TargetMetrics *cross_target) {
|
|||||||
GB_ASSERT(metrics->arch != TargetArch_Invalid);
|
GB_ASSERT(metrics->arch != TargetArch_Invalid);
|
||||||
GB_ASSERT(metrics->word_size > 1);
|
GB_ASSERT(metrics->word_size > 1);
|
||||||
GB_ASSERT(metrics->max_align > 1);
|
GB_ASSERT(metrics->max_align > 1);
|
||||||
|
GB_ASSERT(metrics->max_simd_align > 1);
|
||||||
|
|
||||||
|
|
||||||
bc->metrics = *metrics;
|
bc->metrics = *metrics;
|
||||||
bc->ODIN_OS = target_os_names[metrics->os];
|
bc->ODIN_OS = target_os_names[metrics->os];
|
||||||
bc->ODIN_ARCH = target_arch_names[metrics->arch];
|
bc->ODIN_ARCH = target_arch_names[metrics->arch];
|
||||||
bc->endian_kind = target_endians[metrics->arch];
|
bc->endian_kind = target_endians[metrics->arch];
|
||||||
bc->word_size = metrics->word_size;
|
bc->word_size = metrics->word_size;
|
||||||
bc->max_align = metrics->max_align;
|
bc->max_align = metrics->max_align;
|
||||||
|
bc->max_simd_align = metrics->max_simd_align;
|
||||||
bc->link_flags = str_lit(" ");
|
bc->link_flags = str_lit(" ");
|
||||||
|
|
||||||
#if defined(DEFAULT_TO_THREADED_CHECKER)
|
#if defined(DEFAULT_TO_THREADED_CHECKER)
|
||||||
|
|||||||
+2
-15
@@ -3556,7 +3556,7 @@ i64 type_align_of_internal(Type *t, TypePath *path) {
|
|||||||
|
|
||||||
case Type_SimdVector: {
|
case Type_SimdVector: {
|
||||||
// IMPORTANT TODO(bill): Figure out the alignment of vector types
|
// IMPORTANT TODO(bill): Figure out the alignment of vector types
|
||||||
return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, build_context.max_align*2);
|
return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, build_context.max_simd_align*2);
|
||||||
}
|
}
|
||||||
|
|
||||||
case Type_Matrix:
|
case Type_Matrix:
|
||||||
@@ -3571,22 +3571,9 @@ i64 type_align_of_internal(Type *t, TypePath *path) {
|
|||||||
return build_context.word_size;
|
return build_context.word_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 max_alignment = build_context.word_size;
|
|
||||||
if (is_arch_wasm()) {
|
|
||||||
// NOTE(bill): wasm32 with LLVM defines its default datalayout as:
|
|
||||||
//
|
|
||||||
// e-m:e-p:32:32-i64:64-n32:64-S128
|
|
||||||
//
|
|
||||||
// This means that the alignment of a 64-bit type is 64-bits and not 32-bits like
|
|
||||||
// on other 32-bit architectures
|
|
||||||
//
|
|
||||||
// See: https://github.com/WebAssembly/tool-conventions/blob/main/BasicCABI.md
|
|
||||||
max_alignment = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(bill): Things that are bigger than build_context.word_size, are actually comprised of smaller types
|
// NOTE(bill): Things that are bigger than build_context.word_size, are actually comprised of smaller types
|
||||||
// TODO(bill): Is this correct for 128-bit types (integers)?
|
// TODO(bill): Is this correct for 128-bit types (integers)?
|
||||||
return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, max_alignment);
|
return gb_clamp(next_pow2(type_size_of_internal(t, path)), 1, build_context.max_align);
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 *type_set_offsets_of(Slice<Entity *> const &fields, bool is_packed, bool is_raw_union) {
|
i64 *type_set_offsets_of(Slice<Entity *> const &fields, bool is_packed, bool is_raw_union) {
|
||||||
|
|||||||
Reference in New Issue
Block a user