cgen: support closures on arm64 (#12863)
							parent
							
								
									8a34fb7857
								
							
						
					
					
						commit
						c6b902d2b7
					
				|  | @ -130,7 +130,10 @@ const ( | |||
| 	skip_on_amd64                 = [ | ||||
| 		'do_not_remove', | ||||
| 	] | ||||
| 	skip_on_non_amd64             = [ | ||||
| 	skip_on_arm64                 = [ | ||||
| 		'do_not_remove', | ||||
| 	] | ||||
| 	skip_on_non_amd64_or_arm64    = [ | ||||
| 		// closures aren't implemented yet:
 | ||||
| 		'vlib/v/tests/closure_test.v', | ||||
| 		'vlib/context/cancel_test.v', | ||||
|  | @ -232,12 +235,15 @@ fn main() { | |||
| 	if os.getenv('V_CI_UBUNTU_MUSL').len > 0 { | ||||
| 		tsession.skip_files << skip_on_ubuntu_musl | ||||
| 	} | ||||
| 	$if !amd64 { | ||||
| 	$if !amd64 && !arm64 { | ||||
| 		tsession.skip_files << skip_on_non_amd64 | ||||
| 	} | ||||
| 	$if amd64 { | ||||
| 		tsession.skip_files << skip_on_amd64 | ||||
| 	} | ||||
| 	$if arm64 { | ||||
| 		tsession.skip_files << skip_on_arm64 | ||||
| 	} | ||||
| 	$if !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
 | ||||
| // https://nullprogram.com/blog/2017/01/08/
 | ||||
| 
 | ||||
|  | @ -65,7 +74,7 @@ fn c_closure_helpers(pref &pref.Preferences) string { | |||
| 	if pref.os == .windows { | ||||
| 		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') | ||||
| 	} | ||||
| 	mut builder := strings.new_builder(2048) | ||||
|  | @ -95,6 +104,24 @@ static unsigned char __closure_thunk[6][13] = { | |||
|         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(' | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue