cgen: support closures on arm64 (#12863)
parent
8a34fb7857
commit
c6b902d2b7
|
@ -130,7 +130,10 @@ const (
|
||||||
skip_on_amd64 = [
|
skip_on_amd64 = [
|
||||||
'do_not_remove',
|
'do_not_remove',
|
||||||
]
|
]
|
||||||
skip_on_non_amd64 = [
|
skip_on_arm64 = [
|
||||||
|
'do_not_remove',
|
||||||
|
]
|
||||||
|
skip_on_non_amd64_or_arm64 = [
|
||||||
// closures aren't implemented yet:
|
// closures aren't implemented yet:
|
||||||
'vlib/v/tests/closure_test.v',
|
'vlib/v/tests/closure_test.v',
|
||||||
'vlib/context/cancel_test.v',
|
'vlib/context/cancel_test.v',
|
||||||
|
@ -232,12 +235,15 @@ fn main() {
|
||||||
if os.getenv('V_CI_UBUNTU_MUSL').len > 0 {
|
if os.getenv('V_CI_UBUNTU_MUSL').len > 0 {
|
||||||
tsession.skip_files << skip_on_ubuntu_musl
|
tsession.skip_files << skip_on_ubuntu_musl
|
||||||
}
|
}
|
||||||
$if !amd64 {
|
$if !amd64 && !arm64 {
|
||||||
tsession.skip_files << skip_on_non_amd64
|
tsession.skip_files << skip_on_non_amd64
|
||||||
}
|
}
|
||||||
$if amd64 {
|
$if amd64 {
|
||||||
tsession.skip_files << skip_on_amd64
|
tsession.skip_files << skip_on_amd64
|
||||||
}
|
}
|
||||||
|
$if arm64 {
|
||||||
|
tsession.skip_files << skip_on_arm64
|
||||||
|
}
|
||||||
$if !linux {
|
$if !linux {
|
||||||
tsession.skip_files << skip_on_non_linux
|
tsession.skip_files << skip_on_non_linux
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,15 @@ static inline void __sort_ptr(uintptr_t a[], bool b[], int l) {
|
||||||
}
|
}
|
||||||
'
|
'
|
||||||
|
|
||||||
|
fn arm_bytes(nargs int) string {
|
||||||
|
// start:
|
||||||
|
// ldr x16, start-0x08
|
||||||
|
// ldr x<REG>, start-0x10
|
||||||
|
// br x16
|
||||||
|
bytes := '0xd0, 0xff, 0xff, 0x58, 0x6<REG>, 0xff, 0xff, 0x58, 0x00, 0x02, 0x1f, 0xd6'
|
||||||
|
return bytes.replace('<REG>', nargs.str())
|
||||||
|
}
|
||||||
|
|
||||||
// Heavily based on Chris Wellons's work
|
// Heavily based on Chris Wellons's work
|
||||||
// https://nullprogram.com/blog/2017/01/08/
|
// https://nullprogram.com/blog/2017/01/08/
|
||||||
|
|
||||||
|
@ -65,7 +74,7 @@ fn c_closure_helpers(pref &pref.Preferences) string {
|
||||||
if pref.os == .windows {
|
if pref.os == .windows {
|
||||||
verror('closures are not implemented on Windows yet')
|
verror('closures are not implemented on Windows yet')
|
||||||
}
|
}
|
||||||
if pref.arch != .amd64 {
|
if pref.arch !in [.amd64, .arm64] {
|
||||||
verror('closures are not implemented on this architecture yet: $pref.arch')
|
verror('closures are not implemented on this architecture yet: $pref.arch')
|
||||||
}
|
}
|
||||||
mut builder := strings.new_builder(2048)
|
mut builder := strings.new_builder(2048)
|
||||||
|
@ -95,6 +104,24 @@ static unsigned char __closure_thunk[6][13] = {
|
||||||
0xff, 0x25, 0xeb, 0xff, 0xff, 0xff
|
0xff, 0x25, 0xeb, 0xff, 0xff, 0xff
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
')
|
||||||
|
} else if pref.arch == .arm64 {
|
||||||
|
builder.write_string('
|
||||||
|
static unsigned char __closure_thunk[6][12] = {
|
||||||
|
{
|
||||||
|
${arm_bytes(0)}
|
||||||
|
}, {
|
||||||
|
${arm_bytes(1)}
|
||||||
|
}, {
|
||||||
|
${arm_bytes(2)}
|
||||||
|
}, {
|
||||||
|
${arm_bytes(3)}
|
||||||
|
}, {
|
||||||
|
${arm_bytes(4)}
|
||||||
|
}, {
|
||||||
|
${arm_bytes(5)}
|
||||||
|
},
|
||||||
|
};
|
||||||
')
|
')
|
||||||
}
|
}
|
||||||
builder.write_string('
|
builder.write_string('
|
||||||
|
|
Loading…
Reference in New Issue