// File: /workspace/github_c_makefile_star2_O3/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
movl $0x400, %edi            # imm = 0x400
movl $0x1, %esi
callq 0x10f0
movq %rax, %rbx
movq %r12, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x10f0
movq %rax, %r14
movq %rax, %rdi
movq %r12, %rsi
callq 0x1060
movb $0x0, (%r15)
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcaa7
leaq 0x6111(%rip), %rsi      # 0xe1aa
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
je 0x80c6
movzbl (%rbx), %eax
cmpl $0x25, %eax
je 0x8245
cmpl $0x40, %eax
jne 0x8271
leaq 0x66cf(%rip), %rdi      # 0xe790
jmp 0x824f
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1fbb
leaq 0x60e0(%rip), %rsi      # 0xe1b8
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
jne 0x80ef
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1fbb
leaq 0x5fb1(%rip), %rsi      # 0xe0a7
movq %rbx, %rdi
callq 0x1100
testl %eax, %eax
jne 0x810d
movq %r14, %rdi
movq %rbx, %rsi
callq 0x1fbb
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x10f0
movq %rax, %r12
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcaa7
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x10f0
movq %rax, %r13
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcaa7
leaq 0x700d(%rip), %rsi      # 0xf17f
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x81ce
leaq 0x6ffe(%rip), %rsi      # 0xf183
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x81ce
leaq 0x6ff0(%rip), %rsi      # 0xf188
movq %r12, %rdi
callq 0x1100
testl %eax, %eax
je 0x81ce
movq %r13, %rdi
callq 0x3e5b
testl %eax, %eax
je 0x81be
movq %r13, %rdi
callq 0x1090
movb $0x0, -0x1(%r13,%rax)
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x6877
jmp 0x8221
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcaa7
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcaa7
movq %r13, %rdi
callq 0x7b63
movq %rax, %r13
movq %rbx, %rdi
callq 0x7b63
movq %rax, %rbp
leaq 0x675a(%rip), %rsi      # 0xe95b
movq %r15, %rdi
movq %r13, %rdx
movq %rax, %rcx
xorl %eax, %eax
callq 0x11a0
movq %r13, %rdi
callq 0x1030
movq %rbp, %rdi
callq 0x1030
testq %r12, %r12
je 0x822e
movq %r12, %rdi
callq 0x1030
testq %r14, %r14
je 0x823b
movq %r14, %rdi
callq 0x1030
testq %rbx, %rbx
je 0x82ac
movq %rbx, %rdi
jmp 0x82a7
leaq 0xbefc(%rip), %rax      # 0x14148
movq (%rax), %rdi
movq %rbx, %rsi
callq 0x562e
cmpl $-0x1, %eax
je 0x827e
leaq 0x788a(%rip), %rsi      # 0xfaed
movq %r15, %rdi
movl %eax, %edx
xorl %eax, %eax
callq 0x11a0
jmp 0x829c
movq %r15, %rdi
movq %rbx, %rsi
callq 0x1060
jmp 0x829c
movq %rbx, %rdi
callq 0x7b63
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