Skip to content

Commit f5bf1b5

Browse files
authored
native: support C constants (#24660)
1 parent c61dda3 commit f5bf1b5

File tree

10 files changed

+274
-40
lines changed

10 files changed

+274
-40
lines changed

vlib/v/gen/native/amd64.v

Lines changed: 133 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,9 @@ fn (mut c Amd64) cmp_var_reg(var Var, reg Register, config VarConfig) {
311311
// TODO
312312
// g.cmp()
313313
}
314+
ExternVar {
315+
c.cmp_var_reg(var_object as ExternVar, reg, config)
316+
}
314317
}
315318
}
316319
LocalVar {
@@ -330,6 +333,9 @@ fn (mut c Amd64) cmp_var_reg(var Var, reg Register, config VarConfig) {
330333
GlobalVar {
331334
// TODO
332335
}
336+
ExternVar {
337+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
338+
}
333339
}
334340
}
335341

@@ -348,6 +354,9 @@ fn (mut c Amd64) cmp_var(var Var, val i32, config VarConfig) {
348354
// TODO
349355
// g.cmp()
350356
}
357+
ExternVar {
358+
c.cmp_var(var_object as ExternVar, val, config)
359+
}
351360
}
352361
}
353362
LocalVar {
@@ -367,6 +376,9 @@ fn (mut c Amd64) cmp_var(var Var, val i32, config VarConfig) {
367376
GlobalVar {
368377
// TODO
369378
}
379+
ExternVar {
380+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
381+
}
370382
}
371383
}
372384

@@ -386,6 +398,9 @@ fn (mut c Amd64) dec_var(var Var, config VarConfig) {
386398
// TODO
387399
// g.dec()
388400
}
401+
ExternVar {
402+
c.dec_var(var_object as ExternVar, config)
403+
}
389404
}
390405
}
391406
LocalVar {
@@ -405,6 +420,9 @@ fn (mut c Amd64) dec_var(var Var, config VarConfig) {
405420
GlobalVar {
406421
// TODO
407422
}
423+
ExternVar {
424+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
425+
}
408426
}
409427
}
410428

@@ -425,6 +443,9 @@ fn (mut c Amd64) inc_var(var Var, config VarConfig) {
425443
// TODO
426444
// g.inc()
427445
}
446+
ExternVar {
447+
c.inc_var(var_object as ExternVar, config)
448+
}
428449
}
429450
}
430451
LocalVar {
@@ -468,6 +489,9 @@ fn (mut c Amd64) inc_var(var Var, config VarConfig) {
468489
c.g.n_error('${@LOCATION} Global variables incrementation is not supported yet')
469490
// TODO
470491
}
492+
ExternVar {
493+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
494+
}
471495
}
472496
}
473497

@@ -662,6 +686,9 @@ fn (mut c Amd64) mov_reg_to_var(var Var, r Register, config VarConfig) {
662686
// TODO
663687
c.g.n_error('${@LOCATION} unsupported Ident Register')
664688
}
689+
ExternVar {
690+
c.mov_reg_to_var(var_object as ExternVar, reg, config)
691+
}
665692
}
666693
}
667694
LocalVar {
@@ -743,6 +770,9 @@ fn (mut c Amd64) mov_reg_to_var(var Var, r Register, config VarConfig) {
743770
// TODO
744771
c.g.n_error('${@LOCATION} Unsupported GlobalVar')
745772
}
773+
ExternVar {
774+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
775+
}
746776
}
747777
}
748778

@@ -760,6 +790,9 @@ fn (mut c Amd64) mov_int_to_var(var Var, integer i32, config VarConfig) {
760790
Register {
761791
// TODO
762792
}
793+
ExternVar {
794+
c.mov_int_to_var(var_object as ExternVar, integer, config)
795+
}
763796
}
764797
}
765798
LocalVar {
@@ -822,6 +855,9 @@ fn (mut c Amd64) mov_int_to_var(var Var, integer i32, config VarConfig) {
822855
GlobalVar {
823856
// TODO
824857
}
858+
ExternVar {
859+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
860+
}
825861
}
826862
}
827863

@@ -868,6 +904,9 @@ fn (mut c Amd64) mov_var_to_reg(reg Register, var Var, config VarConfig) {
868904
Register {
869905
// TODO
870906
}
907+
ExternVar {
908+
c.mov_var_to_reg(reg, var_object as ExternVar, config)
909+
}
871910
}
872911
}
873912
LocalVar {
@@ -933,6 +972,9 @@ fn (mut c Amd64) mov_var_to_reg(reg Register, var Var, config VarConfig) {
933972
GlobalVar {
934973
c.g.n_error('${@LOCATION} Unsupported GlobalVar')
935974
}
975+
ExternVar {
976+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
977+
}
936978
}
937979
}
938980

@@ -2077,19 +2119,34 @@ fn (mut c Amd64) assign_var(var IdentVar, raw_type ast.Type) {
20772119
size := c.g.get_type_size(typ)
20782120
if typ.is_pure_float() {
20792121
match var {
2080-
LocalVar { c.mov_ssereg_to_var(var as LocalVar, .xmm0) }
2081-
GlobalVar { c.mov_ssereg_to_var(var as GlobalVar, .xmm0) }
2122+
LocalVar {
2123+
c.mov_ssereg_to_var(var as LocalVar, .xmm0)
2124+
}
2125+
GlobalVar {
2126+
c.mov_ssereg_to_var(var as GlobalVar, .xmm0)
2127+
}
20822128
// Amd64Register { c.g.mov_ssereg(var as Amd64Register, .xmm0) }
2083-
else {}
2129+
else {
2130+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
2131+
}
20842132
}
20852133
} else if info is ast.Struct && !typ.is_any_kind_of_pointer()
20862134
&& !raw_type.is_any_kind_of_pointer() {
20872135
c.assign_struct_var(var, typ, size)
20882136
} else if int(size) in [1, 2, 4, 8] {
20892137
match var {
2090-
LocalVar { c.mov_reg_to_var(var as LocalVar, Amd64Register.rax) }
2091-
GlobalVar { c.mov_reg_to_var(var as GlobalVar, Amd64Register.rax) }
2092-
Register { c.mov_reg(var as Amd64Register, Amd64Register.rax) }
2138+
LocalVar {
2139+
c.mov_reg_to_var(var as LocalVar, Amd64Register.rax)
2140+
}
2141+
GlobalVar {
2142+
c.mov_reg_to_var(var as GlobalVar, Amd64Register.rax)
2143+
}
2144+
Register {
2145+
c.mov_reg(var as Amd64Register, Amd64Register.rax)
2146+
}
2147+
ExternVar {
2148+
c.mov_reg_to_var(var as ExternVar, Amd64Register.rax)
2149+
}
20932150
}
20942151
} else {
20952152
c.g.n_error('${@LOCATION} error assigning type ${typ} with size ${size}: ${info}')
@@ -2121,6 +2178,12 @@ fn (mut c Amd64) assign_ident_int_lit(node ast.AssignStmt, i i32, int_lit ast.In
21212178
c.div_reg(.rax, .rdx)
21222179
c.mov_reg_to_var(left, Amd64Register.rax)
21232180
}
2181+
.mod_assign {
2182+
c.mov_var_to_reg(Amd64Register.rax, left)
2183+
c.mov64(Amd64Register.rdx, i64(int_lit.val.int()))
2184+
c.mod_reg(.rax, .rdx)
2185+
c.mov_reg_to_var(left, Amd64Register.rax)
2186+
}
21242187
.decl_assign {
21252188
c.allocate_var(left.name, 8, i64(int_lit.val.int()))
21262189
}
@@ -2241,11 +2304,19 @@ fn (mut c Amd64) assign_ident_right_expr(node ast.AssignStmt, i i32, right ast.E
22412304
val := enum_info.fields[right.val] or {
22422305
c.g.n_error('${@LOCATION} enum field not found ${right.val}')
22432306
}
2244-
if node.op == .decl_assign {
2245-
c.allocate_var(ident.name, enum_info.size, val)
2246-
} else {
2247-
c.mov64(Amd64Register.rax, val)
2248-
c.mov_reg_to_var(ident, Amd64Register.rax)
2307+
match val {
2308+
Number {
2309+
if node.op == .decl_assign {
2310+
c.allocate_var(ident.name, enum_info.size, val)
2311+
} else {
2312+
c.mov64(Amd64Register.rax, val)
2313+
c.mov_reg_to_var(ident, Amd64Register.rax)
2314+
}
2315+
}
2316+
ast.Expr {
2317+
c.g.expr(val)
2318+
c.mov_reg_to_var(ident, Amd64Register.rax)
2319+
}
22492320
}
22502321
}
22512322
ast.FloatLiteral {
@@ -2777,14 +2848,35 @@ fn (mut c Amd64) assign_stmt(node ast.AssignStmt) {
27772848
c.pop(.rdx) // effective address of left expr
27782849
c.gen_type_promotion(node.right_types[0], var_type)
27792850

2851+
size := match c.g.get_type_size(var_type) {
2852+
1 { Size._8 }
2853+
2 { Size._16 }
2854+
4 { Size._32 }
2855+
else { Size._64 }
2856+
}
27802857
match node.op {
27812858
.decl_assign, .assign {
2782-
c.mov_store(.rdx, .rax, match c.g.get_type_size(var_type) {
2783-
1 { ._8 }
2784-
2 { ._16 }
2785-
4 { ._32 }
2786-
else { ._64 }
2787-
})
2859+
c.mov_store(.rdx, .rax, size)
2860+
}
2861+
.plus_assign {
2862+
c.mov_deref(Amd64Register.rcx, Amd64Register.rdx, var_type)
2863+
c.add_reg(.rax, .rcx)
2864+
c.mov_store(.rdx, .rax, size)
2865+
}
2866+
.minus_assign {
2867+
c.mov_deref(Amd64Register.rcx, Amd64Register.rdx, var_type)
2868+
c.sub_reg(.rax, .rcx)
2869+
c.mov_store(.rdx, .rax, size)
2870+
}
2871+
.and_assign {
2872+
c.mov_deref(Amd64Register.rcx, Amd64Register.rdx, var_type)
2873+
c.bitand_reg(.rax, .rcx)
2874+
c.mov_store(.rdx, .rax, size)
2875+
}
2876+
.mod_assign {
2877+
c.mov_deref(Amd64Register.rcx, Amd64Register.rdx, var_type)
2878+
c.mod_reg(.rax, .rcx)
2879+
c.mov_store(.rdx, .rax, size)
27882880
}
27892881
else {
27902882
c.g.n_error('${@LOCATION} Unsupported assign instruction (${node.op})')
@@ -3676,6 +3768,9 @@ fn (mut c Amd64) init_struct(var Var, init ast.StructInit) {
36763768
// TODO
36773769
// c.g.cmp()
36783770
}
3771+
ExternVar {
3772+
c.init_struct(var_object as ExternVar, init)
3773+
}
36793774
}
36803775
}
36813776
LocalVar {
@@ -3718,6 +3813,9 @@ fn (mut c Amd64) init_struct(var Var, init ast.StructInit) {
37183813
GlobalVar {
37193814
c.g.n_error('${@LOCATION} GlobalVar not implemented for ast.StructInit')
37203815
}
3816+
ExternVar {
3817+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
3818+
}
37213819
}
37223820
}
37233821

@@ -3766,6 +3864,9 @@ fn (mut c Amd64) init_array(var Var, node ast.ArrayInit) {
37663864
// TODO
37673865
// c.g.cmp()
37683866
}
3867+
ExternVar {
3868+
c.init_array(var_object as ExternVar, node)
3869+
}
37693870
}
37703871
}
37713872
LocalVar {
@@ -3779,6 +3880,9 @@ fn (mut c Amd64) init_array(var Var, node ast.ArrayInit) {
37793880
GlobalVar {
37803881
c.g.n_error('${@LOCATION} GlobalVar not implemented for ast.ArrayInit')
37813882
}
3883+
ExternVar {
3884+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
3885+
}
37823886
}
37833887
}
37843888

@@ -4075,6 +4179,9 @@ fn (mut c Amd64) mov_ssereg_to_var(var Var, reg Amd64SSERegister, config VarConf
40754179
c.mov_ssereg_to_var(var_object as GlobalVar, reg, config)
40764180
}
40774181
Register {}
4182+
ExternVar {
4183+
c.mov_ssereg_to_var(var_object as ExternVar, reg, config)
4184+
}
40784185
}
40794186
}
40804187
LocalVar {
@@ -4100,6 +4207,9 @@ fn (mut c Amd64) mov_ssereg_to_var(var Var, reg Amd64SSERegister, config VarConf
41004207
GlobalVar {
41014208
// TODO
41024209
}
4210+
ExternVar {
4211+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
4212+
}
41034213
}
41044214
}
41054215

@@ -4119,6 +4229,9 @@ fn (mut c Amd64) mov_var_to_ssereg(reg Amd64SSERegister, var Var, config VarConf
41194229
c.mov_var_to_ssereg(reg, var_object as GlobalVar, config)
41204230
}
41214231
Register {}
4232+
ExternVar {
4233+
c.mov_var_to_ssereg(reg, var_object as ExternVar, config)
4234+
}
41224235
}
41234236
}
41244237
LocalVar {
@@ -4144,6 +4257,9 @@ fn (mut c Amd64) mov_var_to_ssereg(reg Amd64SSERegister, var Var, config VarConf
41444257
GlobalVar {
41454258
// TODO
41464259
}
4260+
ExternVar {
4261+
c.g.n_error('${@LOCATION} unsupported var type ${var}')
4262+
}
41474263
}
41484264
}
41494265

vlib/v/gen/native/blacklist.v

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,36 @@ already compiling functions:
2828

2929
// false: whitelist function
3030
// true: blacklist function
31-
const whitelist = {
31+
const blacklist = {
32+
'main.main': false
33+
'c_error_number_str': false
34+
'exit': false
35+
'gc_is_enabled': false
36+
'int_max': false
37+
'int_min': false
38+
'flush_stdout': false
39+
'flush_stderr': false
40+
'print_character': true
41+
'u8.is_alnum': false
42+
'u8.is_bin_digit': false
43+
'u8.is_capital': false
44+
'u8.is_digit': false
45+
'u8.is_hex_digit': false
46+
'u8.is_letter': false
47+
'u8.is_oct_digit': false
48+
'u8.is_space': false
49+
'string.is_capital': false
50+
'string.is_ascii': false
51+
'string.is_identifier': false
52+
'string.is_blank': false
53+
'string.indent_width': false
54+
'string.index_u8': false
55+
'string.last_index': true
56+
'string.last_index_u8': false
57+
'string.contains_u8': false
58+
}
59+
60+
const windows_blacklist = {
3261
'main.main': false
3362
'c_error_number_str': false
3463
'exit': false
@@ -55,5 +84,9 @@ const whitelist = {
5584
}
5685

5786
fn (g &Gen) is_blacklisted(name string, is_builtin bool) bool {
58-
return whitelist[name] or { is_builtin }
87+
if g.pref.os == .windows {
88+
return windows_blacklist[name] or { is_builtin }
89+
} else {
90+
return blacklist[name] or { is_builtin }
91+
}
5992
}

0 commit comments

Comments
 (0)