// File: /workspace/github_c_makefile_star2_O1/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 0x1100
movq %rax, %rbx
movq %r12, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x1100
movq %rax, %r14
movq %rax, %rdi
movq %r12, %rsi
callq 0x1060
movb $0x0, (%r15)
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc26
leaq 0x5ffb(%rip), %rsi      # 0xe1b8
movq %rbx, %rdi
callq 0x1110
testl %eax, %eax
je 0x81ea
movzbl (%rbx), %eax
cmpl $0x25, %eax
je 0x8369
cmpl $0x40, %eax
jne 0x8395
leaq 0x65bb(%rip), %rdi      # 0xe7a0
jmp 0x8373
movq %r14, %rdi
movq %rbx, %rsi
callq 0x201a
leaq 0x5fca(%rip), %rsi      # 0xe1c6
movq %rbx, %rdi
callq 0x1110
testl %eax, %eax
jne 0x8213
movq %r14, %rdi
movq %rbx, %rsi
callq 0x201a
leaq 0x5e93(%rip), %rsi      # 0xe0ad
movq %rbx, %rdi
callq 0x1110
testl %eax, %eax
jne 0x8231
movq %r14, %rdi
movq %rbx, %rsi
callq 0x201a
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x1100
movq %rax, %r12
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc26
movq %rbx, %rdi
callq 0x1090
leaq 0x1(%rax), %rdi
movl $0x1, %esi
callq 0x1100
movq %rax, %r13
movq %rax, %rdi
movq %rbx, %rsi
callq 0x1060
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc26
leaq 0x6ef5(%rip), %rsi      # 0xf18b
movq %r12, %rdi
callq 0x1110
testl %eax, %eax
je 0x82f2
leaq 0x6ee6(%rip), %rsi      # 0xf18f
movq %r12, %rdi
callq 0x1110
testl %eax, %eax
je 0x82f2
leaq 0x6ed8(%rip), %rsi      # 0xf194
movq %r12, %rdi
callq 0x1110
testl %eax, %eax
je 0x82f2
movq %r13, %rdi
callq 0x3f2a
testl %eax, %eax
je 0x82e2
movq %r13, %rdi
callq 0x1090
movb $0x0, -0x1(%r13,%rax)
movq %r13, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x6999
jmp 0x8345
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc26
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc26
movq %r13, %rdi
callq 0x7c87
movq %rax, %r13
movq %rbx, %rdi
callq 0x7c87
movq %rax, %rbp
leaq 0x6643(%rip), %rsi      # 0xe968
movq %r15, %rdi
movq %r13, %rdx
movq %rax, %rcx
xorl %eax, %eax
callq 0x11b0
movq %r13, %rdi
callq 0x1030
movq %rbp, %rdi
callq 0x1030
testq %r12, %r12
je 0x8352
movq %r12, %rdi
callq 0x1030
testq %r14, %r14
je 0x835f
movq %r14, %rdi
callq 0x1030
movq %rbx, %r14
testq %rbx, %rbx
jne 0x83c8
jmp 0x83d0
leaq 0xbde8(%rip), %rax      # 0x14158
movq (%rax), %rdi
movq %rbx, %rsi
callq 0x5725
cmpl $-0x1, %eax
je 0x83a2
leaq 0x7772(%rip), %rsi      # 0xfaf9
movq %r15, %rdi
movl %eax, %edx
xorl %eax, %eax
callq 0x11b0
jmp 0x83c0
movq %r15, %rdi
movq %rbx, %rsi
callq 0x1060
jmp 0x83c0
movq %rbx, %rdi
callq 0x7c87
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