// File: /workspace/github_c_makefile_star2_O0/lucvoo[P]sparse-dev/parse.c
// Function: parse_function_body
static struct token *parse_function_body(struct token *token, struct symbol *decl,
	struct symbol_list **list)
{
	struct symbol_list **old_symbol_list;
	struct symbol *base_type = decl->ctype.base_type;
	struct statement *stmt, **p;
	struct symbol *prev;
	struct symbol *arg;

	old_symbol_list = function_symbol_list;
	if (decl->ctype.modifiers & MOD_INLINE) {
		function_symbol_list = &decl->inline_symbol_list;
		p = &base_type->inline_stmt;
	} else {
		function_symbol_list = &decl->symbol_list;
		p = &base_type->stmt;
	}
	function_computed_target_list = NULL;
	function_computed_goto_list = NULL;

	if ((decl->ctype.modifiers & (MOD_EXTERN|MOD_INLINE)) == MOD_EXTERN) {
		if (Wexternal_function_has_definition)
			warning(decl->pos, "function '%s' with external linkage has definition", show_ident(decl->ident));
	}
	if (!(decl->ctype.modifiers & MOD_STATIC))
		decl->ctype.modifiers |= MOD_EXTERN;

	stmt = start_function(decl);
	*p = stmt;

	FOR_EACH_PTR (base_type->arguments, arg) {
		declare_argument(arg, base_type);
	} END_FOR_EACH_PTR(arg);

	token = statement_list(token->next, &stmt->stmts);
	end_function(decl);

	if (!(decl->ctype.modifiers & MOD_INLINE))
		add_symbol(list, decl);
	check_declaration(decl);
	decl->definition = decl;
	prev = decl->same_symbol;
	if (prev && prev->definition) {
		warning(decl->pos, "multiple definitions for function '%s'",
			show_ident(decl->ident));
		info(prev->definition->pos, " the previous one is here");
	} else {
		while (prev) {
			rebind_scope(prev, decl->scope);
			prev->definition = decl;
			prev = prev->same_symbol;
		}
	}
	function_symbol_list = old_symbol_list;
	if (function_computed_goto_list) {
		if (!function_computed_target_list)
			warning(decl->pos, "function '%s' has computed goto but no targets?", show_ident(decl->ident));
		else {
			FOR_EACH_PTR(function_computed_goto_list, stmt) {
				stmt->target_list = function_computed_target_list;
			} END_FOR_EACH_PTR(stmt);
		}
	}
	return expect(token, '}', "at end of function");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xa0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x28(%rbp)
movq 0x68ad6(%rip), %rax     # 0x8d310
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
andq $0x40, %rax
cmpq $0x0, %rax
je 0x24875
movq -0x10(%rbp), %rax
addq $0x48, %rax
addq $0x60, %rax
movq %rax, 0x68aad(%rip)     # 0x8d310
movq -0x28(%rbp), %rax
addq $0x48, %rax
addq $0x58, %rax
movq %rax, -0x38(%rbp)
jmp 0x24898
movq -0x10(%rbp), %rax
addq $0x48, %rax
addq $0x50, %rax
movq %rax, 0x68a88(%rip)     # 0x8d310
movq -0x28(%rbp), %rax
addq $0x48, %rax
addq $0x48, %rax
movq %rax, -0x38(%rbp)
movq $0x0, 0x68a5d(%rip) # 0x8d300
movq $0x0, 0x68a5a(%rip) # 0x8d308
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
andq $0x48, %rax
cmpq $0x8, %rax
jne 0x24902
leaq 0x5ff61(%rip), %rax     # 0x84828
cmpl $0x0, (%rax)
je 0x24900
movq -0x10(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x44150
movq %rax, %rdx
movq -0x90(%rbp), %rax
movq 0x4(%rax), %rdi
leaq 0x42642(%rip), %rsi     # 0x66f3b
movb $0x0, %al
callq 0x16d80
jmp 0x24902
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
andq $0x4, %rax
cmpq $0x0, %rax
jne 0x24924
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rcx
orq $0x8, %rcx
movq %rcx, 0x68(%rax)
movq -0x10(%rbp), %rdi
callq 0x2a100
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %rax
movq %rcx, (%rax)
movq -0x28(%rbp), %rax
movq 0x88(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x50(%rbp), %rax
movq %rax, -0x60(%rbp)
cmpq $0x0, -0x50(%rbp)
jne 0x24964
jmp 0x249dd
jmp 0x24966
movl $0x0, -0x64(%rbp)
movl -0x64(%rbp), %eax
movq -0x58(%rbp), %rcx
movw (%rcx), %cx
shlw $0x8, %cx
sarw $0x8, %cx
movswl %cx, %ecx
cmpl %ecx, %eax
jge 0x249c9
movq -0x58(%rbp), %rax
movslq -0x64(%rbp), %rcx
movq 0x18(%rax,%rcx,8), %rax
movq %rax, -0x48(%rbp)
movq -0x58(%rbp), %rax
movw (%rax), %ax
sarw $0x8, %ax
cwtl
cmpl $0x0, %eax
je 0x249b1
cmpq $0x0, -0x48(%rbp)
jne 0x249b1
jmp 0x249be
movq -0x48(%rbp), %rdi
movq -0x28(%rbp), %rsi
callq 0x2a1d0
movl -0x64(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x64(%rbp)
jmp 0x2496d
jmp 0x249cb
movq -0x58(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x58(%rbp)
cmpq -0x50(%rbp), %rax
jne 0x24966
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x30(%rbp), %rsi
addq $0x10, %rsi
callq 0x23830
movq %rax, -0x8(%rbp)
movq -0x10(%rbp), %rdi
callq 0x2a280
movq -0x10(%rbp), %rax
movq 0x68(%rax), %rax
andq $0x40, %rax
cmpq $0x0, %rax
jne 0x24a1e
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x22cc0
movq -0x10(%rbp), %rdi
callq 0x40580
movq -0x10(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0xc8(%rax)
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x40(%rbp)
je 0x24aaa
movq -0x40(%rbp), %rax
cmpq $0x0, 0xc8(%rax)
je 0x24aaa
movq -0x10(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x44150
movq %rax, %rdx
movq -0x98(%rbp), %rax
movq 0x4(%rax), %rdi
leaq 0x424ea(%rip), %rsi     # 0x66f6e
movb $0x0, %al
callq 0x16d80
movq -0x40(%rbp), %rax
movq 0xc8(%rax), %rax
movq 0x4(%rax), %rdi
leaq 0x424f4(%rip), %rsi     # 0x66f95
movb $0x0, %al
callq 0x16c10
jmp 0x24ae3
jmp 0x24aac
cmpq $0x0, -0x40(%rbp)
je 0x24ae1
movq -0x40(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rsi
callq 0x31dc0
movq -0x10(%rbp), %rcx
movq -0x40(%rbp), %rax
movq %rcx, 0xc8(%rax)
movq -0x40(%rbp), %rax
movq 0x38(%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x24aac
jmp 0x24ae3
movq -0x20(%rbp), %rax
movq %rax, 0x68822(%rip)     # 0x8d310
cmpq $0x0, 0x68812(%rip)     # 0x8d308
je 0x24bfa
cmpq $0x0, 0x687fc(%rip)     # 0x8d300
jne 0x24b3f
movq -0x10(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x44150
movq %rax, %rdx
movq -0xa0(%rbp), %rax
movq 0x4(%rax), %rdi
leaq 0x4247c(%rip), %rsi     # 0x66faf
movb $0x0, %al
callq 0x16d80
jmp 0x24bf8
jmp 0x24b41
movq 0x687c0(%rip), %rax     # 0x8d308
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x80(%rbp)
cmpq $0x0, -0x70(%rbp)
jne 0x24b68
jmp 0x24bf6
jmp 0x24b6a
movl $0x0, -0x84(%rbp)
movl -0x84(%rbp), %eax
movq -0x78(%rbp), %rcx
movw (%rcx), %cx
shlw $0x8, %cx
sarw $0x8, %cx
movswl %cx, %ecx
cmpl %ecx, %eax
jge 0x24bde
movq -0x78(%rbp), %rax
movslq -0x84(%rbp), %rcx
movq 0x18(%rax,%rcx,8), %rax
movq %rax, -0x30(%rbp)
movq -0x78(%rbp), %rax
movw (%rax), %ax
sarw $0x8, %ax
cwtl
cmpl $0x0, %eax
je 0x24bbe
cmpq $0x0, -0x30(%rbp)
jne 0x24bbe
jmp 0x24bcd
movq 0x6873b(%rip), %rcx     # 0x8d300
movq -0x30(%rbp), %rax
movq %rcx, 0x20(%rax)
movl -0x84(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x84(%rbp)
jmp 0x24b74
jmp 0x24be0
movq -0x78(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x78(%rbp)
cmpq -0x70(%rbp), %rax
jne 0x24b6a
jmp 0x24bf8
jmp 0x24bfa
movq -0x8(%rbp), %rdi
movl $0x7d, %esi
leaq 0x423d5(%rip), %rdx     # 0x66fdf
callq 0x22eb0
addq $0xa0, %rsp
popq %rbp
retq
nopl (%rax,%rax)