cgen: fix compilation for a project using a lot of json, threads, embeds + parallel-cc (#23467)

This commit is contained in:
Felipe Pena 2025-01-14 17:58:23 -03:00 committed by GitHub
parent dacdafbd3e
commit 9ba294bc73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 29 additions and 16 deletions

View File

@ -600,9 +600,6 @@ pub fn gen(files []&ast.File, mut table ast.Table, pref_ &pref.Preferences) GenO
if g.out_results.len > 0 { if g.out_results.len > 0 {
b.write_string2('\n// V result_xxx definitions:\n', g.out_results.str()) b.write_string2('\n// V result_xxx definitions:\n', g.out_results.str())
} }
if g.json_forward_decls.len > 0 {
b.write_string2('\n// V json forward decls:\n', g.json_forward_decls.str())
}
b.write_string2('\n// V definitions:\n', g.definitions.str()) b.write_string2('\n// V definitions:\n', g.definitions.str())
if g.sort_fn_definitions.len > 0 { if g.sort_fn_definitions.len > 0 {
b.write_string2('\n// V sort fn definitions:\n', g.sort_fn_definitions.str()) b.write_string2('\n// V sort fn definitions:\n', g.sort_fn_definitions.str())
@ -621,18 +618,9 @@ pub fn gen(files []&ast.File, mut table ast.Table, pref_ &pref.Preferences) GenO
if interface_table.len > 0 { if interface_table.len > 0 {
b.write_string2('\n// V interface table:\n', interface_table) b.write_string2('\n// V interface table:\n', interface_table)
} }
if g.waiter_fn_definitions.len > 0 {
b.write_string2('\n// V gowrappers waiter fns:\n', g.waiter_fn_definitions.str())
}
if g.gowrappers.len > 0 {
b.write_string2('\n// V gowrappers:\n', g.gowrappers.str())
}
if g.hotcode_definitions.len > 0 { if g.hotcode_definitions.len > 0 {
b.write_string2('\n// V hotcode definitions:\n', g.hotcode_definitions.str()) b.write_string2('\n// V hotcode definitions:\n', g.hotcode_definitions.str())
} }
if g.embedded_data.len > 0 {
b.write_string2('\n// V embedded data:\n', g.embedded_data.str())
}
if g.shared_functions.len > 0 { if g.shared_functions.len > 0 {
b.writeln('\n// V shared type functions:\n') b.writeln('\n// V shared type functions:\n')
b.write_string2(g.shared_functions.str(), c_concurrency_helpers) b.write_string2(g.shared_functions.str(), c_concurrency_helpers)
@ -659,10 +647,13 @@ pub fn gen(files []&ast.File, mut table ast.Table, pref_ &pref.Preferences) GenO
header = '#ifndef V_HEADER_FILE\n#define V_HEADER_FILE' + header header = '#ifndef V_HEADER_FILE\n#define V_HEADER_FILE' + header
header += '\n#endif\n' header += '\n#endif\n'
mut helpers := strings.new_builder(200_000) mut helpers := strings.new_builder(300_000)
// Code added here (after the header) goes to out_0.c in parallel cc mode // Code added here (after the header) goes to out_0.c in parallel cc mode
// Previously it went to the header which resulted in duplicated code and more code // Previously it went to the header which resulted in duplicated code and more code
// to compile for the C compiler // to compile for the C compiler
if g.embedded_data.len > 0 {
helpers.write_string2('\n// V embedded data:\n', g.embedded_data.str())
}
if g.anon_fn_definitions.len > 0 { if g.anon_fn_definitions.len > 0 {
if g.nr_closures > 0 { if g.nr_closures > 0 {
helpers.writeln2('\n// V closure helpers', c_closure_fn_helpers(g.pref)) helpers.writeln2('\n// V closure helpers', c_closure_fn_helpers(g.pref))
@ -693,6 +684,12 @@ pub fn gen(files []&ast.File, mut table ast.Table, pref_ &pref.Preferences) GenO
} }
} }
} }
if g.waiter_fn_definitions.len > 0 {
if g.pref.parallel_cc {
g.extern_out.write_string2('\n// V gowrappers waiter fns:\n', g.waiter_fn_definitions.bytestr())
}
helpers.write_string2('\n// V gowrappers waiter fns:\n', g.waiter_fn_definitions.str())
}
if g.auto_str_funcs.len > 0 { if g.auto_str_funcs.len > 0 {
helpers.write_string2('\n// V auto str functions:\n', g.auto_str_funcs.str()) helpers.write_string2('\n// V auto str functions:\n', g.auto_str_funcs.str())
} }
@ -702,6 +699,15 @@ pub fn gen(files []&ast.File, mut table ast.Table, pref_ &pref.Preferences) GenO
helpers.writeln(fn_def) helpers.writeln(fn_def)
} }
} }
if g.json_forward_decls.len > 0 {
helpers.write_string2('\n// V json forward decls:\n', g.json_forward_decls.bytestr())
if g.pref.parallel_cc {
g.extern_out.write_string2('\n// V json forward decls:\n', g.json_forward_decls.str())
}
}
if g.gowrappers.len > 0 {
helpers.write_string2('\n// V gowrappers:\n', g.gowrappers.str())
}
if g.dump_funcs.len > 0 { if g.dump_funcs.len > 0 {
helpers.write_string2('\n// V dump functions:\n', g.dump_funcs.str()) helpers.write_string2('\n// V dump functions:\n', g.dump_funcs.str())
} }
@ -1152,6 +1158,9 @@ pub fn (mut g Gen) write_typeof_functions() {
} }
g.writeln2('\treturn "unknown ${util.strip_main_name(sym.name)}";', '}') g.writeln2('\treturn "unknown ${util.strip_main_name(sym.name)}";', '}')
g.writeln2('', 'int v_typeof_interface_idx_${sym.cname}(int sidx) {') g.writeln2('', 'int v_typeof_interface_idx_${sym.cname}(int sidx) {')
if g.pref.parallel_cc {
g.extern_out.writeln('extern int v_typeof_interface_idx_${sym.cname}(int sidx);')
}
for t in inter_info.types { for t in inter_info.types {
sub_sym := g.table.sym(ast.mktyp(t)) sub_sym := g.table.sym(ast.mktyp(t))
if sub_sym.info is ast.Struct && sub_sym.info.is_unresolved_generic() { if sub_sym.info is ast.Struct && sub_sym.info.is_unresolved_generic() {

View File

@ -85,6 +85,9 @@ fn (mut g Gen) gen_embed_file_init(mut node ast.ComptimeCall) {
// into a single generated function _v_embed_file_metadata, that accepts a hash of the absolute path of the embedded // into a single generated function _v_embed_file_metadata, that accepts a hash of the absolute path of the embedded
// files. // files.
fn (mut g Gen) gen_embedded_metadata() { fn (mut g Gen) gen_embedded_metadata() {
if g.pref.parallel_cc {
g.extern_out.writeln('extern v__embed_file__EmbedFileData _v_embed_file_metadata(u64 ef_hash);')
}
g.embedded_data.writeln('v__embed_file__EmbedFileData _v_embed_file_metadata(u64 ef_hash) {') g.embedded_data.writeln('v__embed_file__EmbedFileData _v_embed_file_metadata(u64 ef_hash) {')
g.embedded_data.writeln('\tv__embed_file__EmbedFileData res;') g.embedded_data.writeln('\tv__embed_file__EmbedFileData res;')
g.embedded_data.writeln('\tmemset(&res, 0, sizeof(res));') g.embedded_data.writeln('\tmemset(&res, 0, sizeof(res));')

View File

@ -119,12 +119,13 @@ ${dec_fn_dec} {
} }
} }
') ')
g.json_forward_decls.writeln('${dec_fn_dec};') extern_str := if g.pref.parallel_cc { 'extern ' } else { '' }
g.json_forward_decls.writeln('${extern_str}${dec_fn_dec};')
// Codegen encoder // Codegen encoder
// encode_TYPE funcs receive an object to encode // encode_TYPE funcs receive an object to encode
enc_fn_name := js_enc_name(styp) enc_fn_name := js_enc_name(styp)
enc_fn_dec := 'cJSON* ${enc_fn_name}(${styp} val)' enc_fn_dec := 'cJSON* ${enc_fn_name}(${styp} val)'
g.json_forward_decls.writeln('${enc_fn_dec};\n') g.json_forward_decls.writeln('${extern_str}${enc_fn_dec};\n')
enc.writeln(' enc.writeln('
${enc_fn_dec} { ${enc_fn_dec} {
\tcJSON *o;') \tcJSON *o;')

View File

@ -305,7 +305,7 @@ fn (mut g Gen) spawn_and_go_expr(node ast.SpawnExpr, mode SpawnGoMode) {
} }
g.type_definitions.writeln('} ${wrapper_struct_name};') g.type_definitions.writeln('} ${wrapper_struct_name};')
thread_ret_type := if g.pref.os == .windows { 'u32' } else { 'void*' } thread_ret_type := if g.pref.os == .windows { 'u32' } else { 'void*' }
g.type_definitions.writeln('${g.static_modifier} ${thread_ret_type} ${wrapper_fn_name}(${wrapper_struct_name} *arg);') g.waiter_fn_definitions.writeln('${g.static_non_parallel}${thread_ret_type} ${wrapper_fn_name}(${wrapper_struct_name} *arg);')
g.gowrappers.writeln('${thread_ret_type} ${wrapper_fn_name}(${wrapper_struct_name} *arg) {') g.gowrappers.writeln('${thread_ret_type} ${wrapper_fn_name}(${wrapper_struct_name} *arg) {')
if call_ret_type != ast.void_type { if call_ret_type != ast.void_type {
if g.pref.os == .windows { if g.pref.os == .windows {