// File: /workspace/github_cpp_makefile_star2_O2/CobaltXII[P]cxcc/./semantic/semantic_analyzer.hpp
// Function: semantic_analyzer_t::validate(std::vector<function_t, std::allocator<function_t>>&)
bool validate(program_t& program) {
		symbol_table_t global_symbols;
		// Add the predefined function sizeof.
		global_symbols.add_symbol(symbol_t(
			{0}, "sizeof", {{{0}, ""}}
		));
		for (int i = 0; i < program.size(); i++) {
			function_t function = program[i];
			// The function is invalid if a function already exists under the
			// same identifier.
			if (global_symbols.exists(function.identifier)) {
				die("redefinition of function '" + function.identifier + "'", function);
				return false;
			}
			// Add the function to the symbol table.
			global_symbols.add_symbol(symbol_t(
				function.type,
				function.identifier,
				function.parameters
			));
			if (!validate_function(function, global_symbols)) {
				return false;
			}
		}
		// The program is semantically correct if this line has been reached.
		// This means that calling expand_ast is completely safe and the
		// resulting output will also be semantically correct.
		expand_ast(program);
		return true;
	}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x2b8, %rsp            # imm = 0x2B8
movq %rsi, 0x18(%rsp)
movq %rdi, 0x10(%rsp)
leaq 0x138(%rsp), %rax
xorps %xmm0, %xmm0
andq $0x0, 0x30(%rax)
movups %xmm0, 0x20(%rax)
movaps %xmm0, -0x8(%rax)
movaps %xmm0, 0x8(%rax)
movb $0x0, 0x18(%rax)
leaq 0xca8a(%rip), %rsi      # 0x10a14
leaq 0x110(%rsp), %rdi
leaq 0x48(%rsp), %rdx
callq 0x3a1e
leaq 0x70(%rsp), %rdi
andq $0x0, -0x8(%rdi)
leaq 0xcde8(%rip), %rsi      # 0x10d95
leaq 0xf(%rsp), %rdx
callq 0x3a1e
leaq 0x30(%rsp), %rdi
leaq 0x68(%rsp), %rsi
pushq $0x1
popq %rdx
leaq 0xe(%rsp), %rcx
callq 0xa024
leaq 0x1b0(%rsp), %rdi
leaq 0x110(%rsp), %rdx
leaq 0x30(%rsp), %rcx
xorl %esi, %esi
callq 0xa05e
leaq 0x1b0(%rsp), %rsi
leaq 0x138(%rsp), %rdi
callq 0xa578
leaq 0x1b0(%rsp), %rdi
callq 0xa0d6
leaq 0x30(%rsp), %rdi
callq 0x6048
leaq 0x70(%rsp), %rdi
callq 0x2100
leaq 0x110(%rsp), %rdi
callq 0x2100
pushq $-0x1
popq %rbx
xorl %r14d, %r14d
leaq 0x190(%rsp), %r12
leaq 0x178(%rsp), %rbp
movq 0x18(%rsp), %rax
movq (%rax), %rsi
movq 0x8(%rax), %rax
subq %rsi, %rax
cqto
pushq $0x68
popq %rcx
idivq %rcx
incq %rbx
movq %rax, 0x28(%rsp)
cmpq %rbx, %rax
jbe 0x415d
movq %rbx, 0x20(%rsp)
addq %r14, %rsi
leaq 0x68(%rsp), %rdi
callq 0xa0f0
movq %r12, %rdi
leaq 0x70(%rsp), %rsi
callq 0x22e0
leaq 0x130(%rsp), %rdi
movq %r12, %r15
movq %r12, %rsi
callq 0xa168
movl %eax, %ebx
movq %r15, %rdi
callq 0x2100
testb %bl, %bl
jne 0x4171
movq 0x68(%rsp), %r15
leaq 0xd0(%rsp), %rdi
leaq 0x70(%rsp), %rsi
callq 0x22e0
movq %rbp, %rbx
movq %rbp, %rdi
leaq 0x90(%rsp), %rsi
callq 0xa25a
leaq 0x268(%rsp), %r13
movq %r13, %rdi
movq %r15, %rsi
leaq 0xd0(%rsp), %rdx
movq %rbx, %rcx
callq 0xa05e
leaq 0x138(%rsp), %rdi
movq %r13, %rsi
callq 0xa578
movq %r13, %rdi
callq 0xa0d6
movq %rbx, %rdi
callq 0x6048
leaq 0xd0(%rsp), %rdi
callq 0x2100
movq 0x10(%rsp), %rdi
leaq 0x68(%rsp), %rsi
leaq 0x130(%rsp), %rdx
callq 0xa2b4
movl %eax, %ebx
addq $0x68, %r14
leaq 0x68(%rsp), %rdi
callq 0x606a
testb %bl, %bl
movq 0x20(%rsp), %rbx
jne 0x4043
jmp 0x41ff
movq 0x10(%rsp), %rdi
movq 0x18(%rsp), %rsi
callq 0xa52c
jmp 0x41ff
leaq 0xc8a3(%rip), %rsi      # 0x10a1b
leaq 0x48(%rsp), %rdi
leaq 0x70(%rsp), %rdx
callq 0x6775
leaq 0xca57(%rip), %rdx      # 0x10be5
leaq 0xf0(%rsp), %rdi
leaq 0x48(%rsp), %rsi
callq 0x3ae1
movq 0x20(%rsp), %rbx
leaq 0x200(%rsp), %rdi
leaq 0x68(%rsp), %rsi
callq 0xa0f0
leaq 0xf0(%rsp), %rsi
leaq 0x200(%rsp), %rdx
movq 0x10(%rsp), %rdi
callq 0xa208
leaq 0x200(%rsp), %rdi
callq 0x606a
leaq 0xf0(%rsp), %rdi
callq 0x2100
leaq 0x48(%rsp), %rdi
callq 0x2100
leaq 0x68(%rsp), %rdi
callq 0x606a
cmpq %rbx, 0x28(%rsp)
setbe %bl
leaq 0x138(%rsp), %rdi
callq 0xdbb0
movl %ebx, %eax
addq $0x2b8, %rsp            # imm = 0x2B8
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %r14
leaq 0x200(%rsp), %rdi
callq 0x606a
jmp 0x423d
movq %rax, %r14
leaq 0xf0(%rsp), %rdi
callq 0x2100
jmp 0x424f
movq %rax, %r14
leaq 0x48(%rsp), %rdi
jmp 0x42e5
jmp 0x42ec
jmp 0x42d5
movq %rax, %r14
leaq 0x1b0(%rsp), %rdi
callq 0xa0d6
jmp 0x4275
movq %rax, %r14
leaq 0x30(%rsp), %rdi
callq 0x6048
jmp 0x4284
movq %rax, %r14
leaq 0x70(%rsp), %rdi
callq 0x2100
jmp 0x4293
movq %rax, %r14
leaq 0x110(%rsp), %rdi
callq 0x2100
jmp 0x42f9
jmp 0x42d5
movq %rax, %r14
jmp 0x42cb
movq %rax, %r14
leaq 0x268(%rsp), %rdi
callq 0xa0d6
jmp 0x42be
movq %rax, %r14
leaq 0x178(%rsp), %rdi
callq 0x6048
leaq 0xd0(%rsp), %rdi
jmp 0x42e5
movq %rax, %r14
jmp 0x42f9
movq %rax, %r14
leaq 0x190(%rsp), %rdi
callq 0x2100
jmp 0x42ef
movq %rax, %r14
leaq 0x68(%rsp), %rdi
callq 0x606a
leaq 0x138(%rsp), %rdi
callq 0xdbb0
movq %r14, %rdi
callq 0x2390