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 "" } 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 }