127 lines
2.4 KiB
Odin
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
|
|
}
|