// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/irgen_llvmir.c
// Function: ir_func
static void _ir_func(
	IRGeneratorLlvmirContext *ctx,
	ParserASTNode *node
) {
	assert(ctx);
	assert(node);
	assert(node->type == FE_NODE_FUNC);

	ctx->func_symbol = FE_FUNC_AST_NODE_GET_SYMBOL(node);
	assert(ctx->func_symbol);

	ParserASTNode *node_identifier = NULL;
	ParserASTNode *node_func_params = NULL;
	ParserASTNode *node_return_type = NULL;
	ParserASTNode *node_body = NULL;

	int nchilds = node->nchilds;
	if (nchilds == 3) {
		node_identifier = node->childs[0];
		node_func_params = node->childs[1];
		node_body = node->childs[2];
	} else if (nchilds == 4) {
		node_identifier = node->childs[0];
		node_func_params = node->childs[1];
		node_return_type = node->childs[2];
		node_body = node->childs[3];
	} else {
		assert(0);
	}
	assert(node_identifier->type == FE_NODE_IDENTIFIER);
	assert(node_func_params->type == FE_NODE_FUNC_PARAMS);
	if (node_func_params->nchilds > 0) {
		assert(node_func_params->childs[0]->type == FE_NODE_FUNC_PARAMS_ITEM);
	}

	rstr_append_with_char(ctx->body, '\n');

	if (node_body->type == FE_NODE_STATS_BLOCK) {
		rstr_append_with_cstr(ctx->body, "define");
	} else if (node_body->type == FE_NODE_DUMMY) {
		// LLVM IR对于同一个函数不能同时出现define和declare。
		// 如果在ilang中，有一个函数声明，然后又有相应的函数定义，则不为函数声明生成相关的LLVM IR代码（）。
		ParserSymbol *symbol = FE_FUNC_AST_NODE_GET_SYMBOL(node);
		if (!FE_FUNC_SYMBOL_GET_DUMMY(symbol)) {
			return;
		}

		rstr_append_with_cstr(ctx->body, "declare");
	} else {
		assert(0);
	}

	rstr_append_with_char(ctx->body, ' ');

	ResizableString rstr_return_type;
	rstr_init(&rstr_return_type);
	if (node_return_type == NULL) {
		rstr_append_with_cstr(&rstr_return_type, "void");
	} else {
		_ir_type(ctx, &rstr_return_type, node_return_type);
	}
	rstr_append_with_rstr(ctx->body, &rstr_return_type);

	rstr_append_with_char(ctx->body, ' ');

	rstr_append_with_char(ctx->body, '@');
	rstr_append_with_raw(ctx->body, node_identifier->token->content, node_identifier->token->len);

	rstr_append_with_char(ctx->body, '(');
	for (int i = 0; i < node_func_params->nchilds; i++) {
		ParserASTNode *node_param = node_func_params->childs[i];

		switch (node_param->type) {
			case FE_NODE_FUNC_PARAMS_ELLIPSIS_ITEM: {
				rstr_append_with_cstr(ctx->body, "...");
				break;
			}
			case FE_NODE_FUNC_PARAMS_ITEM: {
				assert(node_param->nchilds == 2);
				ParserASTNode *node_t = node_param->childs[1];

				ResizableString rstr_func_params_item;
				rstr_init(&rstr_func_params_item);
				_ir_type(ctx, &rstr_func_params_item, node_t);

				rstr_append_with_rstr(ctx->body, &rstr_func_params_item);
				rstr_free(&rstr_func_params_item);
				break;
			}
			default: {
				assert(0);
				break;
			}
		}

		if (i + 1 < node_func_params->nchilds) {
			rstr_append_with_cstr(ctx->body, ", ");
		}
	}
	rstr_append_with_char(ctx->body, ')');

	if (node_body->type == FE_NODE_STATS_BLOCK) {
		rstr_append_with_cstr(ctx->body, " {\n");

		for (int i = 0; i < node_func_params->nchilds; i++) {
			ParserASTNode *node_param = node_func_params->childs[i];
			if (node_param->type == FE_NODE_FUNC_PARAMS_ELLIPSIS_ITEM) {
				continue;
			}

			ParserASTNode *node_param_type = node_param->childs[1];
			ParserSymbol *symbol = FE_FUNC_PARAM_AST_NODE_GET_SYMBOL(node_param);

			assert(!FE_VAR_SYMBOL_GET_HAS_CODE_GEN_NAME(symbol));

			size_t no = FE_FUNC_SYMBOL_NEXT_NO(ctx->func_symbol);
			FE_VAR_SYMBOL_SET_HAS_CODE_GEN_NAME(symbol, true);	
			ResizableString *code_gen_name = FE_VAR_SYMBOL_GET_CODE_GEN_NAME(symbol);
			rstr_init_with_char(code_gen_name, '%');
			rstr_append_with_raw(
				code_gen_name,
				symbol->token->content,
				symbol->token->len
			);
			rstr_appendf(
				code_gen_name,
				"_%zu",
				no
			);

			ResizableString rstr_param_type;
			rstr_init(&rstr_param_type);
			_ir_type(ctx, &rstr_param_type, node_param_type);
			rstr_appendf(
				ctx->body,
				"%s = alloca %s\n",
				RSTR_CSTR(code_gen_name),
				RSTR_CSTR(&rstr_param_type)
			);
			rstr_appendf(
				ctx->body,
				"store %s %%%d, %s* %s\n",
				RSTR_CSTR(&rstr_param_type),
				i,
				RSTR_CSTR(&rstr_param_type),
				RSTR_CSTR(code_gen_name)
			);
			rstr_free(&rstr_param_type);
		}

		ResizableString *body = ctx->body;
		ctx->body = rstr_new();
		ctx->local_var_defs = rstr_new();

		_ir_stats_block(ctx, node_body);

		rstr_append_with_rstr(body, ctx->local_var_defs);
		rstr_append_with_rstr(body, ctx->body);
	
		rstr_free(ctx->body);
		ctx->body = body;
		rstr_free(ctx->local_var_defs);
		ctx->local_var_defs = NULL;

		rstr_append_with_cstr(ctx->body, "ret ");
		rstr_append_with_rstr(ctx->body, &rstr_return_type);
		if (node_return_type != NULL) {
			rstr_append_with_char(ctx->body, ' ');

			ResizableString rstr_func_default_return_value;
			rstr_init(&rstr_func_default_return_value);
			_ir_func_default_return_value(ctx, &rstr_func_default_return_value, node_return_type);
			rstr_append_with_rstr(ctx->body, &rstr_func_default_return_value);
			rstr_free(&rstr_func_default_return_value);
		}
		rstr_append_with_char(ctx->body, '\n');
		rstr_free(&rstr_return_type);

		rstr_append_with_cstr(ctx->body, "}");
	}
	rstr_append_with_char(ctx->body, '\n');
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x290dc
jmp 0x290fb
leaq 0x53473(%rip), %rdi     # 0x7c556
leaq 0x4efe6(%rip), %rsi     # 0x780d0
movl $0x1394, %edx           # imm = 0x1394
leaq 0x509a2(%rip), %rcx     # 0x79a98
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x29104
jmp 0x29123
leaq 0x4cec8(%rip), %rdi     # 0x75fd3
leaq 0x4efbe(%rip), %rsi     # 0x780d0
movl $0x1395, %edx           # imm = 0x1395
leaq 0x5097a(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x10(%rbp), %rax
cmpl $0xa00, (%rax)          # imm = 0xA00
jne 0x29131
jmp 0x29150
leaq 0x4d01b(%rip), %rdi     # 0x76153
leaq 0x4ef91(%rip), %rsi     # 0x780d0
movl $0x1396, %edx           # imm = 0x1396
leaq 0x5094d(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x40(%rax)
movq -0x8(%rbp), %rax
cmpq $0x0, 0x40(%rax)
je 0x2916d
jmp 0x2918c
leaq 0x4cffa(%rip), %rdi     # 0x7616e
leaq 0x4ef55(%rip), %rsi     # 0x780d0
movl $0x1399, %edx           # imm = 0x1399
leaq 0x50911(%rip), %rcx     # 0x79a98
callq 0x30a0
movq $0x0, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq -0x10(%rbp), %rax
movl 0x44(%rax), %eax
movl %eax, -0x34(%rbp)
cmpl $0x3, -0x34(%rbp)
jne 0x291ed
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x29255
cmpl $0x4, -0x34(%rbp)
jne 0x29234
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x18(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x29253
leaq 0x49220(%rip), %rdi     # 0x7245b
leaq 0x4ee8e(%rip), %rsi     # 0x780d0
movl $0x13ab, %edx           # imm = 0x13AB
leaq 0x5084a(%rip), %rcx     # 0x79a98
callq 0x30a0
jmp 0x29255
movq -0x18(%rbp), %rax
cmpl $0x200, (%rax)          # imm = 0x200
jne 0x29263
jmp 0x29282
leaq 0x4b3c0(%rip), %rdi     # 0x7462a
leaq 0x4ee5f(%rip), %rsi     # 0x780d0
movl $0x13ad, %edx           # imm = 0x13AD
leaq 0x5081b(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x20(%rbp), %rax
cmpl $0xa01, (%rax)          # imm = 0xA01
jne 0x29290
jmp 0x292af
leaq 0x4cee8(%rip), %rdi     # 0x7617f
leaq 0x4ee32(%rip), %rsi     # 0x780d0
movl $0x13ae, %edx           # imm = 0x13AE
leaq 0x507ee(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x20(%rbp), %rax
cmpl $0x0, 0x44(%rax)
jle 0x292ef
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
cmpl $0xa02, (%rax)          # imm = 0xA02
jne 0x292ce
jmp 0x292ed
leaq 0x4ced8(%rip), %rdi     # 0x761ad
leaq 0x4edf4(%rip), %rsi     # 0x780d0
movl $0x13b0, %edx           # imm = 0x13B0
leaq 0x507b0(%rip), %rcx     # 0x79a98
callq 0x30a0
jmp 0x292ef
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0xa, %esi
callq 0x8ea0
movq -0x30(%rbp), %rax
cmpl $0xb00, (%rax)          # imm = 0xB00
jne 0x29323
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x58df1(%rip), %rsi     # 0x8210d
callq 0x8d70
jmp 0x29381
movq -0x30(%rbp), %rax
cmpl $0x900, (%rax)          # imm = 0x900
jne 0x29360
movq -0x10(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
testb $0x1, 0x50(%rax)
jne 0x2934a
jmp 0x299d2
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x5077a(%rip), %rsi     # 0x79ad3
callq 0x8d70
jmp 0x2937f
leaq 0x490f4(%rip), %rdi     # 0x7245b
leaq 0x4ed62(%rip), %rsi     # 0x780d0
movl $0x13c1, %edx           # imm = 0x13C1
leaq 0x5071e(%rip), %rcx     # 0x79a98
callq 0x30a0
jmp 0x29381
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x20, %esi
callq 0x8ea0
leaq -0x50(%rbp), %rdi
callq 0x8c90
cmpq $0x0, -0x28(%rbp)
jne 0x293b5
leaq -0x50(%rbp), %rdi
leaq 0x4f053(%rip), %rsi     # 0x78401
callq 0x8d70
jmp 0x293c6
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rdx
leaq -0x50(%rbp), %rsi
callq 0x299e0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq -0x50(%rbp), %rsi
callq 0x9100
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x20, %esi
callq 0x8ea0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x40, %esi
callq 0x8ea0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x8(%rax), %rsi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movl 0x4(%rax), %edx
callq 0x8f90
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x28, %esi
callq 0x8ea0
movl $0x0, -0x54(%rbp)
movl -0x54(%rbp), %eax
movq -0x20(%rbp), %rcx
cmpl 0x44(%rcx), %eax
jge 0x29560
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
movslq -0x54(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
movl (%rax), %eax
movl %eax, -0xd4(%rbp)
subl $0xa02, %eax            # imm = 0xA02
je 0x2949d
jmp 0x29471
movl -0xd4(%rbp), %eax
subl $0xa03, %eax            # imm = 0xA03
jne 0x2950e
jmp 0x29484
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x4b4c9(%rip), %rsi     # 0x7495c
callq 0x8d70
jmp 0x2952d
movq -0x60(%rbp), %rax
cmpl $0x2, 0x44(%rax)
jne 0x294a9
jmp 0x294c8
leaq 0x4b4b0(%rip), %rdi     # 0x74960
leaq 0x4ec19(%rip), %rsi     # 0x780d0
movl $0x13de, %edx           # imm = 0x13DE
leaq 0x505d5(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x60(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x68(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x68(%rbp), %rdx
leaq -0x78(%rbp), %rsi
callq 0x299e0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq -0x78(%rbp), %rsi
callq 0x9100
leaq -0x78(%rbp), %rdi
callq 0x9310
jmp 0x2952d
leaq 0x48f46(%rip), %rdi     # 0x7245b
leaq 0x4ebb4(%rip), %rsi     # 0x780d0
movl $0x13ea, %edx           # imm = 0x13EA
leaq 0x50570(%rip), %rcx     # 0x79a98
callq 0x30a0
movl -0x54(%rbp), %eax
addl $0x1, %eax
movq -0x20(%rbp), %rcx
cmpl 0x44(%rcx), %eax
jge 0x29550
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x4bc7e(%rip), %rsi     # 0x751c9
callq 0x8d70
jmp 0x29552
movl -0x54(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x54(%rbp)
jmp 0x29438
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x29, %esi
callq 0x8ea0
movq -0x30(%rbp), %rax
cmpl $0xb00, (%rax)          # imm = 0xB00
jne 0x299c0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x4cb67(%rip), %rsi     # 0x760f8
callq 0x8d70
movl $0x0, -0x7c(%rbp)
movl -0x7c(%rbp), %eax
movq -0x20(%rbp), %rcx
cmpl 0x44(%rcx), %eax
jge 0x2987a
movq -0x20(%rbp), %rax
movq 0x48(%rax), %rax
movslq -0x7c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
cmpl $0xa03, (%rax)          # imm = 0xA03
jne 0x295d8
jmp 0x2986c
movq -0x88(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x88(%rbp), %rax
movq 0x60(%rax), %rax
movq %rax, -0x98(%rbp)
movq -0x98(%rbp), %rax
testb $0x1, 0x48(%rax)
jne 0x2960f
jmp 0x2962e
leaq 0x4cbd5(%rip), %rdi     # 0x761eb
leaq 0x4eab3(%rip), %rsi     # 0x780d0
movl $0x1401, %edx           # imm = 0x1401
leaq 0x5046f(%rip), %rcx     # 0x79a98
callq 0x30a0
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rcx
movl 0x54(%rcx), %eax
movl %eax, %edx
addl $0x1, %edx
movl %edx, 0x54(%rcx)
movl %eax, %eax
movq %rax, -0xa0(%rbp)
movq -0x98(%rbp), %rax
movb $0x1, 0x48(%rax)
movq -0x98(%rbp), %rax
addq $0x30, %rax
addq $0x20, %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rdi
movl $0x25, %esi
callq 0x8e40
movq -0xa8(%rbp), %rdi
movq -0x98(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x8(%rax), %rsi
movq -0x98(%rbp), %rax
movq 0x8(%rax), %rax
movl 0x4(%rax), %edx
callq 0x8f90
movq -0xa8(%rbp), %rdi
movq -0xa0(%rbp), %rdx
leaq 0x4ec98(%rip), %rsi     # 0x78352
movb $0x0, %al
callq 0x94d0
leaq -0xb8(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x90(%rbp), %rdx
leaq -0xb8(%rbp), %rsi
callq 0x299e0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xe0(%rbp)
movq -0xa8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x29711
leaq 0x4e1ad(%rip), %rax     # 0x778b5
movq %rax, -0xe8(%rbp)
jmp 0x29723
movq -0xa8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0xe8(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0xf0(%rbp)
cmpq $0x0, -0xb0(%rbp)
jne 0x2974b
leaq 0x4e173(%rip), %rax     # 0x778b5
movq %rax, -0xf8(%rbp)
jmp 0x29759
movq -0xb0(%rbp), %rax
movq %rax, -0xf8(%rbp)
movq -0xf0(%rbp), %rdx
movq -0xe0(%rbp), %rdi
movq -0xf8(%rbp), %rcx
leaq 0x50366(%rip), %rsi     # 0x79adb
movb $0x0, %al
callq 0x94d0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x100(%rbp)
cmpq $0x0, -0xb0(%rbp)
jne 0x297a5
leaq 0x4e119(%rip), %rax     # 0x778b5
movq %rax, -0x108(%rbp)
jmp 0x297b3
movq -0xb0(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x108(%rbp), %rax
movq %rax, -0x118(%rbp)
movl -0x7c(%rbp), %eax
movl %eax, -0x10c(%rbp)
cmpq $0x0, -0xb0(%rbp)
jne 0x297e4
leaq 0x4e0da(%rip), %rax     # 0x778b5
movq %rax, -0x120(%rbp)
jmp 0x297f2
movq -0xb0(%rbp), %rax
movq %rax, -0x120(%rbp)
movq -0x120(%rbp), %rax
movq %rax, -0x128(%rbp)
movq -0xa8(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x2981e
leaq 0x4e0a0(%rip), %rax     # 0x778b5
movq %rax, -0x130(%rbp)
jmp 0x29830
movq -0xa8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x130(%rbp)
movq -0x128(%rbp), %r8
movl -0x10c(%rbp), %ecx
movq -0x118(%rbp), %rdx
movq -0x100(%rbp), %rdi
movq -0x130(%rbp), %r9
leaq 0x50292(%rip), %rsi     # 0x79aeb
movb $0x0, %al
callq 0x94d0
leaq -0xb8(%rbp), %rdi
callq 0x9310
movl -0x7c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x7c(%rbp)
jmp 0x2959d
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xc0(%rbp)
callq 0x91e0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x20(%rax)
callq 0x91e0
movq %rax, %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
callq 0x39800
movq -0xc0(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rsi
callq 0x9100
movq -0xc0(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rsi
callq 0x9100
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x9310
movq -0xc0(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x8(%rbp), %rax
movq 0x30(%rax), %rdi
callq 0x9310
movq -0x8(%rbp), %rax
movq $0x0, 0x30(%rax)
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x501e0(%rip), %rsi     # 0x79b02
callq 0x8d70
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq -0x50(%rbp), %rsi
callq 0x9100
cmpq $0x0, -0x28(%rbp)
je 0x29991
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0x20, %esi
callq 0x8ea0
leaq -0xd0(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rdx
leaq -0xd0(%rbp), %rsi
callq 0x398e0
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x9100
leaq -0xd0(%rbp), %rdi
callq 0x9310
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0xa, %esi
callq 0x8ea0
leaq -0x50(%rbp), %rdi
callq 0x9310
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
leaq 0x4c85d(%rip), %rsi     # 0x76218
callq 0x8d70
movq -0x8(%rbp), %rax
movq 0x20(%rax), %rdi
movl $0xa, %esi
callq 0x8ea0
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
nopl (%rax,%rax)