From 91df08f56d10d79de2e7f64c8234c871a4c64d30 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Fri, 1 Nov 2019 00:37:24 +0300 Subject: [PATCH] cc: experimental -fast option for tcc/codegen in the future --- vlib/builtin/array.v | 12 ++++++------ vlib/compiler/cc.v | 44 ++++++++++++++++++++++++-------------------- vlib/compiler/main.v | 2 ++ 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/vlib/builtin/array.v b/vlib/builtin/array.v index 4ff1913a8a..80b7812705 100644 --- a/vlib/builtin/array.v +++ b/vlib/builtin/array.v @@ -90,7 +90,7 @@ fn array_repeat_old(val voidptr, nr_repeats, elm_size int) array { return arr } -// array.repeat returns new array with the given array elements +// array.repeat returns new array with the given array elements // repeated `nr_repeat` times pub fn (a array) repeat(nr_repeats int) array { if nr_repeats < 0 { @@ -184,7 +184,7 @@ pub fn (a array) left(n int) array { } // array.right returns an array using same buffer as the given array -// but starting with the element of the given array beyond the index `n`. +// but starting with the element of the given array beyond the index `n`. // If `n` is bigger or equal to the length of the given array, // returns an empty array of the same type as the given array. pub fn (a array) right(n int) array { @@ -204,8 +204,8 @@ fn (a array) slice2(start, _end int, end_max bool) array { } // array.slice returns an array using the same buffer as original array -// but starting from the `start` element and ending with the element before -// the `end` element of the original array with the length and capacity +// but starting from the `start` element and ending with the element before +// the `end` element of the original array with the length and capacity // set to the number of the elements in the slice. pub fn (a array) slice(start, _end int) array { mut end := _end @@ -251,7 +251,7 @@ pub fn (a mut array) push_many(val voidptr, size int) { a.len += size } -// array.reverse returns a new array with the elements of +// array.reverse returns a new array with the elements of // the original array in reverse order. pub fn (a array) reverse() array { arr := array { @@ -325,7 +325,7 @@ pub fn (a []bool) str() string { return sb.str() } -// []byte.hex returns a string with the hexadecimal representation +// []byte.hex returns a string with the hexadecimal representation // of the byte elements of the array pub fn (b []byte) hex() string { mut hex := malloc(b.len*2+1) diff --git a/vlib/compiler/cc.v b/vlib/compiler/cc.v index 25dbb842ff..d489e16393 100644 --- a/vlib/compiler/cc.v +++ b/vlib/compiler/cc.v @@ -64,27 +64,31 @@ fn (v mut V) cc() { // TCC on Linux by default, unless -cc was provided // TODO if -cc = cc, TCC is still used, default compiler should be // used instead. - $if linux { - $if !android { - vdir := os.dir(vexe) - tcc_3rd := '$vdir/thirdparty/tcc/bin/tcc' - //println('tcc third "$tcc_3rd"') - tcc_path := '/var/tmp/tcc/bin/tcc' - if os.file_exists(tcc_3rd) && !os.file_exists(tcc_path) { - //println('moving tcc') - // if there's tcc in thirdparty/, that means this is - // a prebuilt V_linux.zip. - // Until the libtcc1.a bug is fixed, we neeed to move - // it to /var/tmp/ - os.system('mv $vdir/thirdparty/tcc /var/tmp/') + if v.pref.fast { + $if linux { + $if !android { + vdir := os.dir(vexe) + tcc_3rd := '$vdir/thirdparty/tcc/bin/tcc' + //println('tcc third "$tcc_3rd"') + tcc_path := '/var/tmp/tcc/bin/tcc' + if os.file_exists(tcc_3rd) && !os.file_exists(tcc_path) { + //println('moving tcc') + // if there's tcc in thirdparty/, that means this is + // a prebuilt V_linux.zip. + // Until the libtcc1.a bug is fixed, we neeed to move + // it to /var/tmp/ + os.system('mv $vdir/thirdparty/tcc /var/tmp/') + } + if v.pref.ccompiler == 'cc' && os.file_exists(tcc_path) { + // TODO tcc bug, needs an empty libtcc1.a fila + //os.mkdir('/var/tmp/tcc/lib/tcc/') + //os.create('/var/tmp/tcc/lib/tcc/libtcc1.a') + v.pref.ccompiler = tcc_path + } } - if v.pref.ccompiler == 'cc' && os.file_exists(tcc_path) { - // TODO tcc bug, needs an empty libtcc1.a fila - //os.mkdir('/var/tmp/tcc/lib/tcc/') - //os.create('/var/tmp/tcc/lib/tcc/libtcc1.a') - v.pref.ccompiler = tcc_path - } - } + } $else { + verror('-fast is only supported on Linux right now') + } } //linux_host := os.user_os() == 'linux' v.log('cc() isprod=$v.pref.is_prod outname=$v.out_name') diff --git a/vlib/compiler/main.v b/vlib/compiler/main.v index ac5cf38a0b..32f2d54909 100644 --- a/vlib/compiler/main.v +++ b/vlib/compiler/main.v @@ -114,6 +114,7 @@ pub mut: // work on the builtin module itself. //generating_vh bool comptime_define string // -D vfmt for `if $vfmt {` + fast bool // use tcc/x64 codegen } // Should be called by main at the end of the compilation process, to cleanup @@ -930,6 +931,7 @@ pub fn new_v(args[]string) &V { is_run: 'run' in args autofree: '-autofree' in args compress: '-compress' in args + fast: '-fast' in args is_repl: is_repl build_mode: build_mode cflags: cflags