v2 / vlib / v / pref / arch.c.v
95 lines · 91 sloc · 1.83 KB · a7912e4258c4c5888503bda40e924a89ac7c21c3
Raw
1module pref
2
3pub const C.__V_architecture int
4
5pub enum Arch {
6 _auto
7 amd64 // aka x86_64
8 arm64 // 64-bit arm
9 arm32 // 32-bit arm
10 rv64 // 64-bit risc-v
11 rv32 // 32-bit risc-v
12 i386
13 s390x
14 ppc64le
15 loongarch64
16 sparc64
17 ppc64
18 ppc
19 js_node
20 js_browser
21 js_freestanding
22 wasm32
23 _max
24}
25
26pub fn get_host_arch() Arch {
27 // Note: we can not use `$if arch` here, because V skips cgen for the non
28 // current comptime branches by default, so there is a bootstrapping
29 // problem => the __V_architecture macro is used to resolve it.
30 // TODO: think about how to solve it for non C backends, perhaps we
31 // need a mechanism to always generate all branches for specific functions?
32 if C.__V_architecture <= int(Arch._auto) || C.__V_architecture >= int(Arch._max) {
33 return Arch.amd64
34 }
35 return unsafe { Arch(C.__V_architecture) }
36}
37
38pub fn arch_from_string(arch_str string) !Arch {
39 match arch_str {
40 'amd64', 'x86_64', 'x64', 'x86' { // amd64 recommended
41 return .amd64
42 }
43 'aarch64', 'arm64' { // arm64 recommended
44 return .arm64
45 }
46 'aarch32', 'arm32', 'arm' { // arm32 recommended
47 return .arm32
48 }
49 'rv64', 'riscv64', 'risc-v64', 'riscv', 'risc-v' { // rv64 recommended
50 return .rv64
51 }
52 'rv32', 'riscv32' { // rv32 recommended
53 return .rv32
54 }
55 'x86_32', 'x32', 'i386', 'IA-32', 'ia-32', 'ia32' { // i386 recommended
56 return .i386
57 }
58 's390x' {
59 return .s390x
60 }
61 'loongarch64' {
62 return .loongarch64
63 }
64 'ppc64le' {
65 return .ppc64le
66 }
67 'sparc64' {
68 return .sparc64
69 }
70 'ppc64' {
71 return .ppc64
72 }
73 'ppc', 'ppc32', 'powerpc' {
74 return .ppc
75 }
76 'js', 'js_node' {
77 return .js_node
78 }
79 'js_browser' {
80 return .js_browser
81 }
82 'js_freestanding' {
83 return .js_freestanding
84 }
85 'wasm32', 'wasm' {
86 return .wasm32
87 }
88 '' {
89 return ._auto
90 }
91 else {
92 return error('invalid arch: ${arch_str}')
93 }
94 }
95}
96