// File: /workspace/github_c_makefile_star2_O0/hsjoihs[P]c-compiler/type.c
// Function: debug_print_type
void debug_print_type(const struct Type *ref_type)
{
	struct Type type = *ref_type;
	switch (type.type_category) {
	case PTR_:
		fprintf(stderr, "pointer to ");
		debug_print_type(type.derived_from);
		return;
	case VOID_:
		fprintf(stderr, "void");
		return;
	case INT_:
		fprintf(stderr, "int");
		return;
	case CHAR_:
		fprintf(stderr, "char");
		return;
	case STRUCT_NOT_UNION:
		fprintf(stderr, "struct %s", type.s.struct_or_union_tag);
		return;
	case UNION:
		fprintf(stderr, "union %s", type.s.struct_or_union_tag);
		return;
	case ENUM_:
		fprintf(stderr, "enum %s", type.e.enum_tag);
		return;
	case ARRAY:
		fprintf(stderr, "array (length %d) of ", type.array_length);
		debug_print_type(type.derived_from);
		return;
	case FN:
		fprintf(stderr, "function (");
		switch (type.param_infos_validity) {
		case INVALID: {
			fprintf(stderr, "param: no info");
			break;
		}
		case VALID: {
			if (type.param_infos.length == 0) {
				fprintf(stderr, "no params");
			} else if (type.param_infos.length < 2) {
				const struct TypeAndIdent *vec_0 = type.param_infos.vector[0];
				fprintf(stderr,
				        "%s: ", vec_0->ident_str ? vec_0->ident_str : "@anon");
				debug_print_type(&vec_0->type);
			} else {
				fprintf(stderr, "params: \n");
				for (int i = 0; i < type.param_infos.length; i++) {
					const struct TypeAndIdent *ptr_paraminfo =
					    type.param_infos.vector[i];
					fprintf(stderr, "  %s: ",
					        ptr_paraminfo->ident_str ? ptr_paraminfo->ident_str
					                                 : "@anon");
					debug_print_type(&ptr_paraminfo->type);
					fprintf(stderr, "\n");
				}
			}
			break;
		}
		case VA_ARGS: {
			if (type.param_infos.length == 0) {
				fprintf(stderr, "no params varg");
			} else {
				fprintf(stderr, "params: \n");
				for (int i = 0; i < type.param_infos.length; i++) {
					const struct TypeAndIdent *ptr_paraminfo =
					    type.param_infos.vector[i];
					fprintf(stderr, "  %s: ",
					        ptr_paraminfo->ident_str ? ptr_paraminfo->ident_str
					                                 : "@anon");
					debug_print_type(&ptr_paraminfo->type);
					fprintf(stderr, "\n");
				}
				fprintf(stderr, ", ...");
			}
			break;
		}
		}
		fprintf(stderr, ") returning ");
		debug_print_type(type.derived_from);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movups 0x40(%rax), %xmm0
movaps %xmm0, -0x20(%rbp)
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups 0x20(%rax), %xmm2
movups 0x30(%rax), %xmm3
movaps %xmm3, -0x30(%rbp)
movaps %xmm2, -0x40(%rbp)
movaps %xmm1, -0x50(%rbp)
movaps %xmm0, -0x60(%rbp)
movl -0x60(%rbp), %eax
movq %rax, -0x90(%rbp)
subq $0x8, %rax
ja 0xb7f7
movq -0x90(%rbp), %rax
leaq 0xa000(%rip), %rcx      # 0x153ec
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x10bfc(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0xa074(%rip), %rsi      # 0x1547a
movb $0x0, %al
callq 0x10d0
movq -0x58(%rbp), %rdi
callq 0xb390
jmp 0xb7f7
movq 0x10bd6(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0xa05a(%rip), %rsi      # 0x15486
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10bb9(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0xa60b(%rip), %rsi      # 0x15a54
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10b9c(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0xa025(%rip), %rsi      # 0x1548b
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10b7f(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
movq -0x30(%rbp), %rdx
leaq 0xa009(%rip), %rsi      # 0x15490
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10b5e(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
movq -0x30(%rbp), %rdx
leaq 0x9ff2(%rip), %rsi      # 0x1549a
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10b3d(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
movq -0x20(%rbp), %rdx
leaq 0x9fda(%rip), %rsi      # 0x154a3
movb $0x0, %al
callq 0x10d0
jmp 0xb7f7
movq 0x10b1c(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
movl -0x50(%rbp), %edx
leaq 0x9fc2(%rip), %rsi      # 0x154ab
movb $0x0, %al
callq 0x10d0
movq -0x58(%rbp), %rdi
callq 0xb390
jmp 0xb7f7
movq 0x10af3(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9fb2(%rip), %rsi      # 0x154c1
xorl %eax, %eax
callq 0x10d0
movl -0x38(%rbp), %eax
movl %eax, -0x94(%rbp)
testl %eax, %eax
je 0xb546
jmp 0xb525
movl -0x94(%rbp), %eax
subl $0x1, %eax
je 0xb563
jmp 0xb532
movl -0x94(%rbp), %eax
subl $0x2, %eax
je 0xb6ca
jmp 0xb7d6
movq 0x10aab(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9f75(%rip), %rsi      # 0x154cc
movb $0x0, %al
callq 0x10d0
jmp 0xb7d6
cmpl $0x0, -0x48(%rbp)
jne 0xb586
movq 0x10a88(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9f61(%rip), %rsi      # 0x154db
movb $0x0, %al
callq 0x10d0
jmp 0xb6c5
cmpl $0x2, -0x48(%rbp)
jge 0xb5fe
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x68(%rbp)
movq 0x10a5a(%rip), %rax     # 0x1bff8
movq (%rax), %rax
movq %rax, -0xa0(%rbp)
movq -0x68(%rbp), %rax
cmpq $0x0, 0x50(%rax)
je 0xb5c4
movq -0x68(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0xa8(%rbp)
jmp 0xb5d4
leaq 0x9f1a(%rip), %rax      # 0x154e5
movq %rax, -0xa8(%rbp)
jmp 0xb5d4
movq -0xa0(%rbp), %rdi
movq -0xa8(%rbp), %rdx
leaq 0x9f0e(%rip), %rsi      # 0x154f7
movb $0x0, %al
callq 0x10d0
movq -0x68(%rbp), %rdi
callq 0xb390
jmp 0xb6c3
movq 0x109f3(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9edc(%rip), %rsi      # 0x154eb
movb $0x0, %al
callq 0x10d0
movl $0x0, -0x6c(%rbp)
movl -0x6c(%rbp), %eax
cmpl -0x48(%rbp), %eax
jge 0xb6c1
movq -0x40(%rbp), %rax
movslq -0x6c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x78(%rbp)
movq 0x109b8(%rip), %rax     # 0x1bff8
movq (%rax), %rax
movq %rax, -0xb0(%rbp)
movq -0x78(%rbp), %rax
cmpq $0x0, 0x50(%rax)
je 0xb666
movq -0x78(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0xb8(%rbp)
jmp 0xb676
leaq 0x9e78(%rip), %rax      # 0x154e5
movq %rax, -0xb8(%rbp)
jmp 0xb676
movq -0xb0(%rbp), %rdi
movq -0xb8(%rbp), %rdx
leaq 0x9e6a(%rip), %rsi      # 0x154f5
movb $0x0, %al
callq 0x10d0
movq -0x78(%rbp), %rdi
callq 0xb390
movq 0x10956(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9ce8(%rip), %rsi      # 0x15394
movb $0x0, %al
callq 0x10d0
movl -0x6c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x6c(%rbp)
jmp 0xb61d
jmp 0xb6c3
jmp 0xb6c5
jmp 0xb7d6
cmpl $0x0, -0x48(%rbp)
jne 0xb6ed
movq 0x10921(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9e1b(%rip), %rsi      # 0x154fc
movb $0x0, %al
callq 0x10d0
jmp 0xb7d4
movq 0x10904(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9ded(%rip), %rsi      # 0x154eb
movb $0x0, %al
callq 0x10d0
movl $0x0, -0x7c(%rbp)
movl -0x7c(%rbp), %eax
cmpl -0x48(%rbp), %eax
jge 0xb7bc
movq -0x40(%rbp), %rax
movslq -0x7c(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x88(%rbp)
movq 0x108c6(%rip), %rax     # 0x1bff8
movq (%rax), %rax
movq %rax, -0xc0(%rbp)
movq -0x88(%rbp), %rax
cmpq $0x0, 0x50(%rax)
je 0xb75e
movq -0x88(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0xc8(%rbp)
jmp 0xb76e
leaq 0x9d80(%rip), %rax      # 0x154e5
movq %rax, -0xc8(%rbp)
jmp 0xb76e
movq -0xc0(%rbp), %rdi
movq -0xc8(%rbp), %rdx
leaq 0x9d72(%rip), %rsi      # 0x154f5
movb $0x0, %al
callq 0x10d0
movq -0x88(%rbp), %rdi
callq 0xb390
movq 0x1085b(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9bed(%rip), %rsi      # 0x15394
movb $0x0, %al
callq 0x10d0
movl -0x7c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x7c(%rbp)
jmp 0xb70c
movq 0x10835(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9d3e(%rip), %rsi      # 0x1550b
movb $0x0, %al
callq 0x10d0
jmp 0xb7d6
movq 0x1081b(%rip), %rax     # 0x1bff8
movq (%rax), %rdi
leaq 0x9d2a(%rip), %rsi      # 0x15511
movb $0x0, %al
callq 0x10d0
movq -0x58(%rbp), %rdi
callq 0xb390
addq $0xd0, %rsp
popq %rbp
retq