native: fix stackframe bug on return statements (#12153)
							parent
							
								
									0fafefc078
								
							
						
					
					
						commit
						5eba02ea94
					
				| 
						 | 
				
			
			@ -1369,8 +1369,8 @@ fn (mut g Gen) fn_decl(node ast.FnDecl) {
 | 
			
		|||
	g.push(.rbp)
 | 
			
		||||
	g.mov_rbp_rsp()
 | 
			
		||||
	locals_count := node.scope.objects.len + node.params.len
 | 
			
		||||
	stackframe_size := (locals_count * 8) + 0x10
 | 
			
		||||
	g.sub8(.rsp, stackframe_size)
 | 
			
		||||
	g.stackframe_size = (locals_count * 8) + 0x10
 | 
			
		||||
	g.sub8(.rsp, g.stackframe_size)
 | 
			
		||||
 | 
			
		||||
	if node.params.len > 0 {
 | 
			
		||||
		// g.mov(.r12, 0x77777777)
 | 
			
		||||
| 
						 | 
				
			
			@ -1395,7 +1395,7 @@ fn (mut g Gen) fn_decl(node ast.FnDecl) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// g.leave()
 | 
			
		||||
	g.add8(.rsp, stackframe_size)
 | 
			
		||||
	g.add8(.rsp, g.stackframe_size)
 | 
			
		||||
	g.pop(.rbp)
 | 
			
		||||
	g.ret()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ mut:
 | 
			
		|||
	sect_header_name_pos int
 | 
			
		||||
	offset               i64
 | 
			
		||||
	str_pos              []i64
 | 
			
		||||
	stackframe_size      int
 | 
			
		||||
	strings              []string // TODO use a map and don't duplicate strings
 | 
			
		||||
	file_size_pos        i64
 | 
			
		||||
	main_fn_addr         i64
 | 
			
		||||
| 
						 | 
				
			
			@ -477,7 +478,7 @@ fn (mut g Gen) stmt(node ast.Stmt) {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			// intel specific
 | 
			
		||||
			g.add8(.rsp, 0x20) // XXX depends on scope frame size
 | 
			
		||||
			g.add8(.rsp, g.stackframe_size)
 | 
			
		||||
			g.pop(.rbp)
 | 
			
		||||
			g.ret()
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue