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