// File: /workspace/github_c_makefile_star2_O0/aquaxis[P]synverll/src/parser_ir_proc.c
// Function: create_adrs_getelementptr
int create_adrs_getelementptr(char *line, char *buf)
{
	char *token = NULL;
	char *line_org = NULL;
	char *name = NULL;
	char *type = NULL;
	int base_adrs = 0;
	char *str1, *str2;

	token = calloc(STR_MAX, 1);
	line_org = calloc(strlen(line)+1,1);
	strcpy(line_org, line);
	strcpy(buf, "");

	// getelementptr
	get_token_llvm(line_org, token);
	if(strcmp(token, "getelementptr")){
		/*
		 * getelementptrでなはい場合はメモリマップからアドレスを取得する
		 */
		if(token[0] == '@'){
			base_adrs = get_adrs_memmap("GLOBAL", token);
			// ToDo:
			// サイズがない場合の処理を考えておこう
			if(base_adrs == -1){
				// アドレスが取得できない場合は変数をそのまま代入する
				str2 = regalloc(token);
				sprintf(buf, "%s", str2);
				free(str2);
			}else{
				sprintf(buf, "%d", base_adrs);
			}
//			sprintf(buf, "%d", base_adrs);
		}else if(token[0] == '%'){
			base_adrs = get_adrs_memmap(module_name, token);
			if(base_adrs == -1){
				// アドレスが取得できない場合は変数をそのまま代入する
				str2 = regalloc(token);
				sprintf(buf, "%s", str2);
				free(str2);
			}else{
				sprintf(buf, "%d", base_adrs);
			}
		}else{
			strcpy(buf, token);
		}
		free(token);
		free(line_org);
		return 0;
	}

	get_irtype_llvm(line_org, token);	// inbounds

	if(!strcmp(token, "inbounds")) get_irtype_llvm(line_org, token);
	if(!strcmp(token, "(")) get_irtype_llvm(line_org, token);
	// ポインタのタイプ
	type = calloc(strlen(token)+1,1);
	strcpy(type, token);

	// ポインタの名前
	get_token_llvm(line_org, token);
	name = calloc(strlen(token)+1,1);
	strcpy(name, token);

	get_token_llvm(line_org, token);	// ,

	if(
		!strcmp(type, "i8*") ||
		!strcmp(type, "i16*") ||
		!strcmp(type, "i32*")
	){
		// シングルタイプの場合
		// タイプ
		get_token_llvm(line_org, token);
		// 数値
		get_token_llvm(line_org, token);

		str1 = regalloc(name);
		str2 = regalloc(token);
		sprintf(buf, "%s + %s", str1, str2);
		free(str1);
		free(str2);
	}else{
		// arrayタイプの場合
		if(is_pointer_type(name)) name[strlen(name) -1] = '\0';
		base_adrs = get_memory_size(name, line_org, buf);
	}

	if(type != NULL) free(type);
	if(line_org != NULL) free(line_org);
	if(token != NULL)	free(token);

	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq $0x0, -0x20(%rbp)
movq $0x0, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movl $0x0, -0x3c(%rbp)
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rdi
callq 0x1070
movq %rax, %rdi
addq $0x1, %rdi
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x1050
movq -0x18(%rbp), %rdi
leaq 0x9e01(%rip), %rsi      # 0x14fc1
callq 0x1050
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x11ca0
movq -0x20(%rbp), %rdi
leaq 0x7fe5(%rip), %rsi      # 0x131c2
callq 0x10d0
cmpl $0x0, %eax
je 0xb2ef
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x40, %eax
jne 0xb255
movq -0x20(%rbp), %rsi
leaq 0x858e(%rip), %rdi      # 0x13790
callq 0x7980
movl %eax, -0x3c(%rbp)
cmpl $-0x1, -0x3c(%rbp)
jne 0xb23e
movq -0x20(%rbp), %rdi
callq 0xaa30
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rdi
movq -0x50(%rbp), %rdx
leaq 0x879c(%rip), %rsi      # 0x139c8
movb $0x0, %al
callq 0x1160
movq -0x50(%rbp), %rdi
callq 0x1030
jmp 0xb253
movq -0x18(%rbp), %rdi
movl -0x3c(%rbp), %edx
leaq 0x988d(%rip), %rsi      # 0x14ad9
movb $0x0, %al
callq 0x1160
jmp 0xb2d1
movq -0x20(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x25, %eax
jne 0xb2c2
leaq 0xcec0(%rip), %rax      # 0x18128
movq (%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x7980
movl %eax, -0x3c(%rbp)
cmpl $-0x1, -0x3c(%rbp)
jne 0xb2ab
movq -0x20(%rbp), %rdi
callq 0xaa30
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rdi
movq -0x50(%rbp), %rdx
leaq 0x872f(%rip), %rsi      # 0x139c8
movb $0x0, %al
callq 0x1160
movq -0x50(%rbp), %rdi
callq 0x1030
jmp 0xb2c0
movq -0x18(%rbp), %rdi
movl -0x3c(%rbp), %edx
leaq 0x9820(%rip), %rsi      # 0x14ad9
movb $0x0, %al
callq 0x1160
jmp 0xb2cf
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x1050
jmp 0xb2d1
movq -0x20(%rbp), %rdi
callq 0x1030
movq -0x28(%rbp), %rdi
callq 0x1030
movl $0x0, -0x4(%rbp)
jmp 0xb4ca
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x25b0
movq -0x20(%rbp), %rdi
leaq 0x7ec9(%rip), %rsi      # 0x131d0
callq 0x10d0
cmpl $0x0, %eax
jne 0xb31e
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x25b0
movq -0x20(%rbp), %rdi
leaq 0x7dd7(%rip), %rsi      # 0x13100
callq 0x10d0
cmpl $0x0, %eax
jne 0xb340
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x25b0
movq -0x20(%rbp), %rdi
callq 0x1070
movq %rax, %rdi
addq $0x1, %rdi
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x1050
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x11ca0
movq -0x20(%rbp), %rdi
callq 0x1070
movq %rax, %rdi
addq $0x1, %rdi
movl $0x1, %esi
callq 0x10c0
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x1050
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x11ca0
movq -0x38(%rbp), %rdi
leaq 0x8dc0(%rip), %rsi      # 0x1417b
callq 0x10d0
cmpl $0x0, %eax
je 0xb3ef
movq -0x38(%rbp), %rdi
leaq 0x8daf(%rip), %rsi      # 0x1417f
callq 0x10d0
cmpl $0x0, %eax
je 0xb3ef
movq -0x38(%rbp), %rdi
leaq 0x8d9f(%rip), %rsi      # 0x14184
callq 0x10d0
cmpl $0x0, %eax
jne 0xb451
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x11ca0
movq -0x28(%rbp), %rdi
movq -0x20(%rbp), %rsi
callq 0x11ca0
movq -0x30(%rbp), %rdi
callq 0xaa30
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rdi
callq 0xaa30
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rdi
movq -0x48(%rbp), %rdx
movq -0x50(%rbp), %rcx
leaq 0x8595(%rip), %rsi      # 0x139cb
movb $0x0, %al
callq 0x1160
movq -0x48(%rbp), %rdi
callq 0x1030
movq -0x50(%rbp), %rdi
callq 0x1030
jmp 0xb493
movq -0x30(%rbp), %rdi
callq 0x5400
cmpl $0x0, %eax
je 0xb47f
movq -0x30(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x30(%rbp), %rdi
callq 0x1070
movq %rax, %rcx
movq -0x58(%rbp), %rax
subq $0x1, %rcx
movb $0x0, (%rax,%rcx)
movq -0x30(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0x18(%rbp), %rdx
callq 0x9420
movl %eax, -0x3c(%rbp)
cmpq $0x0, -0x38(%rbp)
je 0xb4a3
movq -0x38(%rbp), %rdi
callq 0x1030
cmpq $0x0, -0x28(%rbp)
je 0xb4b3
movq -0x28(%rbp), %rdi
callq 0x1030
cmpq $0x0, -0x20(%rbp)
je 0xb4c3
movq -0x20(%rbp), %rdi
callq 0x1030
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)