c interop type foundation
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user