show an info message if a C compiler is not installed
parent
e31d892598
commit
9e19472c33
|
@ -38,11 +38,10 @@
|
||||||
- declarative ui with hot reload (similar to swiftui)
|
- declarative ui with hot reload (similar to swiftui)
|
||||||
- "building a simple blog with vweb" tutorial + youtube video
|
- "building a simple blog with vweb" tutorial + youtube video
|
||||||
+ fix interfaces
|
+ fix interfaces
|
||||||
- merge v.c and v_win.c
|
|
||||||
+ fast.vlang.io
|
+ fast.vlang.io
|
||||||
+ bare metal support
|
+ bare metal support
|
||||||
+ inline assembly
|
+ inline assembly
|
||||||
+ x64 machine code generation (ELF)
|
+ x64 machine code generation (ELF)
|
||||||
- require explicit C.fn definitions, add all missing definitions
|
+ require explicit C.fn definitions, add all missing definitions
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
fn test_fn() {
|
||||||
|
println('test fn')
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println('x64 test')
|
println('x64 test')
|
||||||
for _ in 0..5 {
|
for _ in 0..5 {
|
||||||
println('Hello world from V x64 machine code generator!')
|
println('Hello world from V x64 machine code generator!')
|
||||||
}
|
}
|
||||||
println('Hello again!')
|
println('Hello again!')
|
||||||
|
test_fn()
|
||||||
|
println('dne')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_fn() {
|
|
||||||
println('test fn')
|
|
||||||
}
|
|
||||||
|
|
|
@ -311,12 +311,14 @@ start:
|
||||||
goto start
|
goto start
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
verror('C compiler error, while attempting to run: \n' +
|
verror('C compiler error, while attempting to run: \n' +
|
||||||
'-----------------------------------------------------------\n' +
|
'-----------------------------------------------------------\n' +
|
||||||
'$cmd\n' +
|
'$cmd\n' +
|
||||||
'-----------------------------------------------------------\n' +
|
'-----------------------------------------------------------\n' +
|
||||||
'Probably your C compiler is missing. \n' +
|
'Probably your C compiler is missing. \n' +
|
||||||
'Please reinstall it, or make it available in your PATH.')
|
'Please reinstall it, or make it available in your PATH.\n\n' +
|
||||||
|
missing_compiler_info())
|
||||||
}
|
}
|
||||||
|
|
||||||
if v.pref.is_debug {
|
if v.pref.is_debug {
|
||||||
|
@ -512,3 +514,16 @@ fn get_cmdline_cflags(args []string) string {
|
||||||
}
|
}
|
||||||
return cflags
|
return cflags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn missing_compiler_info() string {
|
||||||
|
$if windows {
|
||||||
|
return 'https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows'
|
||||||
|
}
|
||||||
|
$if linux {
|
||||||
|
return 'On Debian/Ubuntu, run `sudo apt install build-essential`'
|
||||||
|
}
|
||||||
|
$if mac {
|
||||||
|
return 'Install command line XCode tools with `xcode-select --install`'
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
|
@ -512,6 +512,9 @@ fn (p mut Parser) fn_decl() {
|
||||||
f.defer_text[f.scope_level] = ' ${cgen_name}_time += time__ticks() - _PROF_START;'
|
f.defer_text[f.scope_level] = ' ${cgen_name}_time += time__ticks() - _PROF_START;'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if p.pref.x64 {
|
||||||
|
p.x64.register_function_address(f.name)
|
||||||
|
}
|
||||||
p.statements_no_rcbr()
|
p.statements_no_rcbr()
|
||||||
//p.cgen.nogen = false
|
//p.cgen.nogen = false
|
||||||
// Print counting result after all statements in main
|
// Print counting result after all statements in main
|
||||||
|
@ -712,6 +715,9 @@ fn (p mut Parser) fn_call(f mut Fn, method_ph int, receiver_var, receiver_type s
|
||||||
if is_comptime_define {
|
if is_comptime_define {
|
||||||
p.cgen.nogen = true
|
p.cgen.nogen = true
|
||||||
}
|
}
|
||||||
|
if p.pref.x64 && !p.first_pass() {
|
||||||
|
p.x64.call_fn(f.name)
|
||||||
|
}
|
||||||
p.calling_c = f.is_c
|
p.calling_c = f.is_c
|
||||||
if f.is_c && !p.builtin_mod {
|
if f.is_c && !p.builtin_mod {
|
||||||
if f.name == 'free' {
|
if f.name == 'free' {
|
||||||
|
|
|
@ -15,6 +15,7 @@ mut:
|
||||||
file_size_pos i64
|
file_size_pos i64
|
||||||
main_fn_addr i64
|
main_fn_addr i64
|
||||||
code_start_pos i64 // location of the start of the assembly instructions
|
code_start_pos i64 // location of the start of the assembly instructions
|
||||||
|
fn_addr map[string]i64
|
||||||
//string_addr map[string]i64
|
//string_addr map[string]i64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +45,10 @@ pub fn new_gen(out_name string) &Gen {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (g &Gen) pos() i64 {
|
||||||
|
return g.buf.len
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn (g mut Gen) write8(n int) {
|
fn (g mut Gen) write8(n int) {
|
||||||
// write 1 byte
|
// write 1 byte
|
||||||
|
@ -155,10 +160,13 @@ fn (g mut Gen) mov64(reg Register, val i64) {
|
||||||
g.write64(val)
|
g.write64(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (g mut Gen) call(val int) {
|
fn (g mut Gen) call(addr int) {
|
||||||
//println('call val=$val')
|
//rel := g.abs_to_rel_addr(addr)
|
||||||
|
rel := 0xffffffff - int(abs(addr - g.buf.len))-1
|
||||||
|
|
||||||
|
println('call addr=$addr rel_addr=$addr pos=$g.buf.len')
|
||||||
g.write8(0xe8)
|
g.write8(0xe8)
|
||||||
g.write32(val)
|
g.write32(addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (g mut Gen) syscall() {
|
fn (g mut Gen) syscall() {
|
||||||
|
@ -228,4 +236,19 @@ fn (g mut Gen) mov(reg Register, val int) {
|
||||||
g.write32(val)
|
g.write32(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn (g mut Gen) register_function_address(name string) {
|
||||||
|
addr := g.pos()
|
||||||
|
println('reg fn addr $name $addr')
|
||||||
|
g.fn_addr[name] = addr
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn (g mut Gen) call_fn(name string) {
|
||||||
|
if !name.contains('__') {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
addr := g.fn_addr[name]
|
||||||
|
g.call(int(addr))
|
||||||
|
println('call $name $addr')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue