1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

cgen: generalize _vcleanup of array/string consts + valgrind with tcc

This commit is contained in:
Delyan Angelov 2020-05-25 10:17:06 +03:00
parent ae03aab03e
commit 96808a0e2a
2 changed files with 26 additions and 28 deletions

View File

@ -53,6 +53,7 @@ struct Gen {
typedefs2 strings.Builder typedefs2 strings.Builder
definitions strings.Builder // typedefs, defines etc (everything that goes to the top of the file) definitions strings.Builder // typedefs, defines etc (everything that goes to the top of the file)
inits strings.Builder // contents of `void _vinit(){}` inits strings.Builder // contents of `void _vinit(){}`
cleanups strings.Builder // contents of `void _vcleanup(){}`
gowrappers strings.Builder // all go callsite wrappers gowrappers strings.Builder // all go callsite wrappers
stringliterals strings.Builder // all string literals (they depend on tos3() beeing defined stringliterals strings.Builder // all string literals (they depend on tos3() beeing defined
auto_str_funcs strings.Builder // function bodies of all auto generated _str funcs auto_str_funcs strings.Builder // function bodies of all auto generated _str funcs
@ -121,6 +122,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
auto_str_funcs: strings.new_builder(100) auto_str_funcs: strings.new_builder(100)
comptime_defines: strings.new_builder(100) comptime_defines: strings.new_builder(100)
inits: strings.new_builder(100) inits: strings.new_builder(100)
cleanups: strings.new_builder(100)
pcs_declarations: strings.new_builder(100) pcs_declarations: strings.new_builder(100)
hotcode_definitions: strings.new_builder(100) hotcode_definitions: strings.new_builder(100)
table: table table: table
@ -2292,8 +2294,18 @@ fn (mut g Gen) const_decl_init_later(name, val string, typ table.Type) {
// Initialize more complex consts in `void _vinit(){}` // Initialize more complex consts in `void _vinit(){}`
// (C doesn't allow init expressions that can't be resolved at compile time). // (C doesn't allow init expressions that can't be resolved at compile time).
styp := g.typ(typ) styp := g.typ(typ)
g.definitions.writeln('$styp _const_$name; // inited later') //
g.inits.writeln('\t_const_$name = $val;') cname := '_const_$name'
g.definitions.writeln('$styp $cname; // inited later')
g.inits.writeln('\t$cname = $val;')
if g.pref.autofree {
if styp.starts_with('array_') {
g.cleanups.writeln('\tarray_free(&$cname);')
}
if styp == 'string' {
g.cleanups.writeln('\tstring_free(&$cname);')
}
}
} }
fn (mut g Gen) go_back_out(n int) { fn (mut g Gen) go_back_out(n int) {
@ -2496,26 +2508,7 @@ fn (mut g Gen) write_init_function() {
fn_vcleanup_start_pos := g.out.len fn_vcleanup_start_pos := g.out.len
g.writeln('void _vcleanup() {') g.writeln('void _vcleanup() {')
// g.writeln('puts("cleaning up...");') // g.writeln('puts("cleaning up...");')
if g.is_importing_os() { g.writeln(g.cleanups.str())
g.writeln('array_free(&_const_os__args);')
g.writeln('string_free(&_const_os__wd_at_startup);')
}
//
g.writeln('array_free(&_const_math__bits__de_bruijn32tab);')
g.writeln('array_free(&_const_math__bits__de_bruijn64tab);')
g.writeln('array_free(&_const_math__bits__ntz_8_tab);')
g.writeln('array_free(&_const_math__bits__pop_8_tab);')
g.writeln('array_free(&_const_math__bits__rev_8_tab);')
g.writeln('array_free(&_const_math__bits__len_8_tab);')
g.writeln('array_free(&_const_strconv__ftoa__ten_pow_table_32);')
g.writeln('array_free(&_const_strconv__ftoa__ten_pow_table_64);')
g.writeln('array_free(&_const_strconv__ftoa__powers_of_10);')
g.writeln('array_free(&_const_strconv__ftoa__pow5_split_32);')
g.writeln('array_free(&_const_strconv__ftoa__pow5_inv_split_32);')
g.writeln('array_free(&_const_strconv__ftoa__pow5_split_64);')
g.writeln('array_free(&_const_strconv__ftoa__pow5_inv_split_64);')
g.writeln('array_free(&_const_strconv__dec_round);')
//
g.writeln('}') g.writeln('}')
if g.pref.printfn_list.len > 0 && '_vcleanup' in g.pref.printfn_list { if g.pref.printfn_list.len > 0 && '_vcleanup' in g.pref.printfn_list {
println(g.out.after(fn_vcleanup_start_pos)) println(g.out.after(fn_vcleanup_start_pos))

View File

@ -2,11 +2,12 @@ import os
import term import term
import benchmark import benchmark
[if verbose]
fn vprintln(s string) {
eprintln(s)
}
fn test_all() { fn test_all() {
$if tinyc {
eprintln('Temporarily disabled for tcc, till the generated C code works with tcc.')
exit(0)
}
if os.user_os() != 'linux' && os.getenv('FORCE_VALGRIND_TEST').len == 0 { if os.user_os() != 'linux' && os.getenv('FORCE_VALGRIND_TEST').len == 0 {
eprintln('Valgrind tests can only be run reliably on Linux for now.') eprintln('Valgrind tests can only be run reliably on Linux for now.')
eprintln('You can still do it by setting FORCE_VALGRIND_TEST=1 .') eprintln('You can still do it by setting FORCE_VALGRIND_TEST=1 .')
@ -37,7 +38,9 @@ fn test_all() {
full_test_path := os.real_path(test) full_test_path := os.real_path(test)
println('x.v: $wrkdir/x.v') println('x.v: $wrkdir/x.v')
os.system('cp ${dir}/${test} $wrkdir/x.v') // cant run .vv file os.system('cp ${dir}/${test} $wrkdir/x.v') // cant run .vv file
res := os.exec('$vexe -cflags "-w" -verbose=3 -autofree -csource keep -cg $wrkdir/x.v') or { compile_cmd := '$vexe -cflags "-w" -verbose=3 -autofree -keepc -cg $wrkdir/x.v'
vprintln('compile cmd: $compile_cmd')
res := os.exec(compile_cmd) or {
bench.fail() bench.fail()
eprintln(bench.step_message_fail('valgrind $test failed')) eprintln(bench.step_message_fail('valgrind $test failed'))
continue continue
@ -48,7 +51,9 @@ fn test_all() {
eprintln(res.output) eprintln(res.output)
continue continue
} }
valgrind_res := os.exec('valgrind --error-exitcode=1 --leak-check=full $wrkdir/x') or { valgrind_cmd := 'valgrind --error-exitcode=1 --leak-check=full $wrkdir/x'
vprintln('valgrind cmd: $valgrind_cmd')
valgrind_res := os.exec(valgrind_cmd) or {
bench.fail() bench.fail()
eprintln(bench.step_message_fail('valgrind could not be executed')) eprintln(bench.step_message_fail('valgrind could not be executed'))
continue continue