Files
2026-06-23 18:24:35 +02:00

127 lines
2.4 KiB
Odin

package target
Kind :: enum u8 {
Aarch64_Macos,
}
Target :: struct {
kind: Kind,
}
C_Primitive :: enum u8 {
Char,
Schar,
Uchar,
Short,
Ushort,
Int,
Uint,
Long,
Ulong,
Longlong,
Ulonglong,
Float,
Double,
Longdouble,
}
Scalar_Kind :: enum u8 {
Signed_Integer,
Unsigned_Integer,
Float,
}
Scalar_Layout :: struct {
bits: int,
alignment: int,
kind: Scalar_Kind,
}
Integer_Extension :: enum u8 {
None,
Sign,
Zero,
}
DEFAULT :: Target{kind=.Aarch64_Macos}
parse :: proc(value: string) -> (Target, bool) {
switch value {
case "aarch64-macos", "arm64-macos":
return DEFAULT, true
case:
return {}, false
}
}
name :: proc(value: Target) -> string {
switch value.kind {
case .Aarch64_Macos:
return "aarch64-macos"
}
return "<unsupported>"
}
pointer_bits :: proc(value: Target) -> int {
switch value.kind {
case .Aarch64_Macos:
return 64
}
return 0
}
llvm_triple :: proc(value: Target) -> string {
switch value.kind {
case .Aarch64_Macos:
return "arm64-apple-macosx13.0.0"
}
return ""
}
llvm_data_layout :: proc(value: Target) -> string {
switch value.kind {
case .Aarch64_Macos:
return "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
}
return ""
}
c_primitive_layout :: proc(value: Target, primitive: C_Primitive) -> Scalar_Layout {
switch value.kind {
case .Aarch64_Macos:
switch primitive {
case .Char, .Schar:
return Scalar_Layout{bits=8, alignment=1, kind=.Signed_Integer}
case .Uchar:
return Scalar_Layout{bits=8, alignment=1, kind=.Unsigned_Integer}
case .Short:
return Scalar_Layout{bits=16, alignment=2, kind=.Signed_Integer}
case .Ushort:
return Scalar_Layout{bits=16, alignment=2, kind=.Unsigned_Integer}
case .Int:
return Scalar_Layout{bits=32, alignment=4, kind=.Signed_Integer}
case .Uint:
return Scalar_Layout{bits=32, alignment=4, kind=.Unsigned_Integer}
case .Long, .Longlong:
return Scalar_Layout{bits=64, alignment=8, kind=.Signed_Integer}
case .Ulong, .Ulonglong:
return Scalar_Layout{bits=64, alignment=8, kind=.Unsigned_Integer}
case .Float:
return Scalar_Layout{bits=32, alignment=4, kind=.Float}
case .Double, .Longdouble:
return Scalar_Layout{bits=64, alignment=8, kind=.Float}
}
}
return {}
}
c_integer_extension :: proc(value: Target, bits: int, signed: bool) -> Integer_Extension {
switch value.kind {
case .Aarch64_Macos:
if bits < 32 {
return .Sign if signed else .Zero
}
}
return .None
}