// File: /workspace/github_c_makefile_star2_O2/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r15
movq %rdi, %r12
pushq $0x1
popq %r14
movl $0x400, %edi            # imm = 0x400
movq %r14, %rsi
callq 0x10f0
movq %rax, %rbx
movq %r12, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movq %r14, %rsi
callq 0x10f0
movq %rax, %r14
movq %rax, %rdi
movq %r12, %rsi
callq 0x1060
movb $0x0, (%r15)
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc4ad
leaq 0x5580(%rip), %rsi      # 0xd1aa
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
je 0x7c57
movzbl (%rbx), %eax
cmpl $0x25, %eax
je 0x7dc7
cmpl $0x40, %eax
jne 0x7df3
leaq 0x5b1e(%rip), %rdi      # 0xd770
jmp 0x7dd1
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1ec1
leaq 0x554f(%rip), %rsi      # 0xd1b8
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
jne 0x7c80
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1ec1
leaq 0x5420(%rip), %rsi      # 0xd0a7
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
jne 0x7c9e
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1ec1
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
pushq $0x1
popq %r13
movq %r13, %rsi
callq 0x10f0
movq %rax, %r12
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc4ad
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movq %r13, %rsi
callq 0x10f0
movq %rax, %r13
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc4ad
leaq 0x645c(%rip), %rsi      # 0xe15f
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x7d5f
leaq 0x644d(%rip), %rsi      # 0xe163
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x7d5f
leaq 0x643f(%rip), %rsi      # 0xe168
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x7d5f
movq %r13, %rdi
callq 0x3d39
testl %eax, %eax
je 0x7d4f
movq %r13, %rdi
callq 0x1090
movb $0x0, -0x1(%r13,%rax)
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x6593
jmp 0x7db2
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc4ad
movq %r14, %rdi
movq %rbx, %rsi
callq 0xc4ad
movq %r13, %rdi
callq 0x7706
movq %rax, %r13
movq %rbx, %rdi
callq 0x7706
movq %rax, %rbp
leaq 0x5ba9(%rip), %rsi      # 0xd93b
movq %r15, %rdi
movq %r13, %rdx
movq %rax, %rcx
xorl %eax, %eax
callq 0x11a0
movq %r13, %rdi
callq 0x1030
movq %rbp, %rdi
callq 0x1030
movq %r12, %rdi
callq 0x1030
movq %r14, %rdi
callq 0x1030
movq %rbx, %r14
jmp 0x7e26
leaq 0xb37a(%rip), %rax      # 0x13148
movq (%rax), %rdi
movq %rbx, %rsi
callq 0x53de
cmpl $-0x1, %eax
je 0x7e00
leaq 0x6ce8(%rip), %rsi      # 0xeacd
movq %r15, %rdi
movl %eax, %edx
xorl %eax, %eax
callq 0x11a0
jmp 0x7e1e
movq %r15, %rdi
movq %rbx, %rsi
callq 0x1060
jmp 0x7e1e
movq %rbx, %rdi
callq 0x7706
movq %rax, %r12
movq %r15, %rdi
movq %rax, %rsi
callq 0x1060
movq %r12, %rdi
callq 0x1030
movq %rbx, %rdi
callq 0x1030
movq %r14, %rdi
callq 0x1030
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq