LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: exists_unaccessed_path_to_return(spirv_cross::CFG const&, unsigned int, std::unordered_set<unsigned int, std::hash<unsigned int>, std::equal_to<unsigned int>, std::allocator<unsigned int>> const&)
static bool exists_unaccessed_path_to_return(const CFG &cfg, uint32_t block, const unordered_set<uint32_t> &blocks)
{
	// This block accesses the variable.
	if (blocks.find(block) != end(blocks))
		return false;

	// We are at the end of the CFG.
	if (cfg.get_succeeding_edges(block).empty())
		return true;

	// If any of our successors have a path to the end, there exists a path from block.
	for (auto &succ : cfg.get_succeeding_edges(block))
		if (exists_unaccessed_path_to_return(cfg, succ, blocks))
			return true;

	return false;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rdx, %rbx
movq %rdi, %r14
movl %esi, %ecx
movq (%rdx), %r8
movq 0x8(%rdx), %r9
xorl %r11d, %r11d
movq %rcx, %rax
xorl %edx, %edx
divq %r9
movq (%r8,%rdx,8), %rax
testq %rax, %rax
je 0x188b9
movq (%rax), %r10
movq %rax, %r11
cmpl %esi, 0x8(%r10)
je 0x188b9
movq %rdx, %rdi
movq %r10, %r15
movq (%r10), %r10
testq %r10, %r10
je 0x188b6
movl 0x8(%r10), %r8d
movq %r8, %rax
xorl %edx, %edx
divq %r9
movl $0x0, %r11d
cmpq %rdi, %rdx
jne 0x188b9
movq %r15, %r11
cmpl %esi, %r8d
jne 0x1888a
jmp 0x188b9
xorl %r11d, %r11d
testq %r11, %r11
je 0x188c8
cmpq $0x0, (%r11)
je 0x188c8
xorl %ebp, %ebp
jmp 0x18916
movq 0x28(%r14), %rax
leaq (%rcx,%rcx,2), %rcx
movq (%rax,%rcx,8), %r15
movq 0x8(%rax,%rcx,8), %r12
movb $0x1, %bpl
cmpq %r12, %r15
je 0x18916
movl (%r15), %esi
movq %r14, %rdi
movq %rbx, %rdx
callq 0x18850
testb %al, %al
jne 0x18916
addq $0x4, %r15
cmpq %r12, %r15
setne %bpl
je 0x18916
movl (%r15), %esi
movq %r14, %rdi
movq %rbx, %rdx
callq 0x18850
addq $0x4, %r15
testb %al, %al
je 0x188f7
movl %ebp, %eax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::AnalyzeVariableScopeAccessHandler::notify_variable_access(unsigned int, unsigned int)
void Compiler::AnalyzeVariableScopeAccessHandler::notify_variable_access(uint32_t id, uint32_t block)
{
	if (id_is_phi_variable(id))
		accessed_variables_to_block[id].insert(block);
	else if (id_is_potential_temporary(id))
		accessed_temporaries_to_block[id].insert(block);
}

// Assembly:
pushq %rbx
subq $0x10, %rsp
movq %rdi, %rbx
movl %esi, (%rsp)
movl %edx, 0x4(%rsp)
callq 0x18e74
testb %al, %al
je 0x18e1c
addq $0x18, %rbx
jmp 0x18e4e
movl (%rsp), %eax
movq 0x8(%rbx), %rdx
movq 0x20(%rdx), %rcx
movq 0x28(%rdx), %rdx
subq %rcx, %rdx
shrq $0x4, %rdx
cmpl %edx, %eax
jae 0x18e6e
shlq $0x4, %rax
cmpq $0x0, (%rcx,%rax)
je 0x18e4a
addq %rax, %rcx
cmpl $0x9, 0x8(%rcx)
jne 0x18e6e
addq $0x50, %rbx
movq %rsp, %rsi
movq %rbx, %rdi
callq 0x237d8
leaq 0x8(%rsp), %rdx
movq %rax, (%rdx)
leaq 0x4(%rsp), %rsi
movq %rax, %rdi
callq 0x1fc02
addq $0x10, %rsp
popq %rbx
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::AnalyzeVariableScopeAccessHandler::id_is_phi_variable(unsigned int) const
bool Compiler::AnalyzeVariableScopeAccessHandler::id_is_phi_variable(uint32_t id) const
{
	if (id >= compiler.get_current_id_bound())
		return false;
	auto *var = compiler.maybe_get<SPIRVariable>(id);
	return var && var->phi_variable;
}

// Assembly:
pushq %rax
movq 0x8(%rdi), %rdi
movq 0x28(%rdi), %rax
subq 0x20(%rdi), %rax
shrq $0x4, %rax
cmpl %esi, %eax
jbe 0x18e98
callq 0xc7f4
testq %rax, %rax
je 0x18e98
movb 0x5a(%rax), %al
jmp 0x18e9a
xorl %eax, %eax
popq %rcx
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::AnalyzeVariableScopeAccessHandler::id_is_potential_temporary(unsigned int) const
bool Compiler::AnalyzeVariableScopeAccessHandler::id_is_potential_temporary(uint32_t id) const
{
	if (id >= compiler.get_current_id_bound())
		return false;

	// Temporaries are not created before we start emitting code.
	return compiler.ir.ids[id].empty() || (compiler.ir.ids[id].get_type() == TypeExpression);
}

// Assembly:
movq 0x8(%rdi), %rcx
movq 0x20(%rcx), %rax
movq 0x28(%rcx), %rcx
subq %rax, %rcx
shrq $0x4, %rcx
cmpl %esi, %ecx
jbe 0x18ecb
movl %esi, %ecx
shlq $0x4, %rcx
cmpq $0x0, (%rax,%rcx)
je 0x18ece
addq %rcx, %rax
cmpl $0x9, 0x8(%rax)
sete %al
retq
xorl %eax, %eax
retq
movb $0x1, %al
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cfg.hpp
// Function: void spirv_cross::CFG::walk_from<spirv_cross::Compiler::analyze_variable_scope(spirv_cross::SPIRFunction&, spirv_cross::Compiler::AnalyzeVariableScopeAccessHandler&)::$_0>(std::unordered_set<unsigned int, std::hash<unsigned int>, std::equal_to<unsigned int>, std::allocator<unsigned int>>&, unsigned int, spirv_cross::Compiler::analyze_variable_scope(spirv_cross::SPIRFunction&, spirv_cross::Compiler::AnalyzeVariableScopeAccessHandler&)::$_0 const&) const
void walk_from(std::unordered_set<uint32_t> &seen_blocks, uint32_t block, const Op &op) const
	{
		if (seen_blocks.count(block))
			return;
		seen_blocks.insert(block);

		op(block);
		for (auto b : succeeding_edges[block])
			walk_from(seen_blocks, b, op);
	}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x10, %rsp
movq %rcx, %rbx
movq %rsi, %r14
movq %rdi, %r15
leaq 0x4(%rsp), %rsi
movl %edx, (%rsi)
movq %r14, %rdi
callq 0x1fbce
testq %rax, %rax
je 0x19eaa
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
leaq 0x8(%rsp), %rdx
movq %r14, (%rdx)
leaq 0x4(%rsp), %r12
movq %r14, %rdi
movq %r12, %rsi
callq 0x1fc02
movl (%r12), %ecx
movq (%rbx), %rax
movq (%rax), %rdi
movq 0x8(%rax), %r8
xorl %r10d, %r10d
movq %rcx, %rax
xorl %edx, %edx
divq %r8
movq (%rdi,%rdx,8), %rax
testq %rax, %rax
je 0x19f21
movq (%rax), %r9
movq %rax, %r10
cmpl %ecx, 0x8(%r9)
je 0x19f21
movq %rdx, %rsi
movq %r9, %r11
movq (%r9), %r9
testq %r9, %r9
je 0x19f1e
movl 0x8(%r9), %edi
movq %rdi, %rax
xorl %edx, %edx
divq %r8
movl $0x0, %r10d
cmpq %rsi, %rdx
jne 0x19f21
movq %r11, %r10
cmpl %ecx, %edi
jne 0x19ef3
jmp 0x19f21
xorl %r10d, %r10d
testq %r10, %r10
je 0x19f33
cmpq $0x0, (%r10)
je 0x19f33
movq 0x8(%rbx), %rax
movb $0x0, (%rax)
movq 0x28(%r15), %rax
leaq (%rcx,%rcx,2), %rcx
movq (%rax,%rcx,8), %r12
movq 0x8(%rax,%rcx,8), %r13
cmpq %r13, %r12
je 0x19e9c
movl (%r12), %edx
movq %r15, %rdi
movq %r14, %rsi
movq %rbx, %rcx
callq 0x19e72
addq $0x4, %r12
jmp 0x19f44
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::get_common_basic_type(spirv_cross::SPIRType const&, spirv_cross::SPIRType::BaseType&)
bool Compiler::get_common_basic_type(const SPIRType &type, SPIRType::BaseType &base_type)
{
	if (type.basetype == SPIRType::Struct)
	{
		base_type = SPIRType::Unknown;
		for (auto &member_type : type.member_types)
		{
			SPIRType::BaseType member_base;
			if (!get_common_basic_type(get<SPIRType>(member_type), member_base))
				return false;

			if (base_type == SPIRType::Unknown)
				base_type = member_base;
			else if (base_type != member_base)
				return false;
		}
		return true;
	}
	else
	{
		base_type = type.basetype;
		return true;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %r14
movl 0xc(%rsi), %eax
cmpl $0xc, %eax
jne 0x1a02e
movl $0x0, (%r14)
movq 0x68(%rsi), %r13
movq 0x70(%rsi), %rbp
cmpq %rbp, %r13
sete %bl
je 0x1a033
movq %rdi, %r15
movl (%r13), %esi
callq 0xa426
leaq 0x4(%rsp), %rdx
movq %r15, %rdi
movq %rax, %rsi
callq 0x19f94
testb %al, %al
je 0x1a033
addq $0x4, %r13
leaq 0x4(%rsp), %r12
movl (%r14), %eax
movl 0x4(%rsp), %ecx
testl %eax, %eax
je 0x19fff
cmpl %ecx, %eax
je 0x1a002
jmp 0x1a033
movl %ecx, (%r14)
cmpq %rbp, %r13
sete %bl
je 0x1a033
movl (%r13), %esi
movq %r15, %rdi
callq 0xa426
movq %r15, %rdi
movq %rax, %rsi
movq %r12, %rdx
callq 0x19f94
addq $0x4, %r13
testb %al, %al
jne 0x19fee
jmp 0x1a033
movl %eax, (%r14)
movb $0x1, %bl
andb $0x1, %bl
movl %ebx, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::update_active_builtins()
void Compiler::update_active_builtins()
{
	active_input_builtins.reset();
	active_output_builtins.reset();
	cull_distance_count = 0;
	clip_distance_count = 0;
	ActiveBuiltinHandler handler(*this);
	traverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x18, %rsp
movq %rdi, %rbx
xorl %r14d, %r14d
movq %r14, 0x2d0(%rdi)
addq $0x2d8, %rdi            # imm = 0x2D8
callq 0xd540
movq %r14, 0x310(%rbx)
leaq 0x318(%rbx), %rdi
callq 0xd540
movq %r14, 0x350(%rbx)
leaq 0xe2a4f(%rip), %rax     # 0xfd228
addq $0x10, %rax
leaq 0x8(%rsp), %r14
movq %rax, (%r14)
movq %rbx, 0x8(%r14)
movl 0x108(%rbx), %esi
movq %rbx, %rdi
callq 0xb9ca
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x13ece
addq $0x18, %rsp
popq %rbx
popq %r14
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::has_active_builtin(spv::BuiltIn, spv::StorageClass)
bool Compiler::has_active_builtin(BuiltIn builtin, StorageClass storage)
{
	const Bitset *flags;
	switch (storage)
	{
	case StorageClassInput:
		flags = &active_input_builtins;
		break;
	case StorageClassOutput:
		flags = &active_output_builtins;
		break;

	default:
		return false;
	}
	return flags->get(builtin);
}

// Assembly:
cmpl $0x1, %edx
je 0x1a81f
cmpl $0x3, %edx
jne 0x1a859
movl $0x310, %eax            # imm = 0x310
jmp 0x1a824
movl $0x2d0, %eax            # imm = 0x2D0
pushq %rax
addq %rax, %rdi
movl %esi, 0x4(%rsp)
cmpl $0x3f, %esi
ja 0x1a840
movl $0x1, %eax
movl %esi, %ecx
shlq %cl, %rax
andq (%rdi), %rax
jmp 0x1a84e
addq $0x8, %rdi
leaq 0x4(%rsp), %rsi
callq 0x1fbce
testq %rax, %rax
setne %al
addq $0x8, %rsp
retq
xorl %eax, %eax
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::analyze_image_and_sampler_usage()
void Compiler::analyze_image_and_sampler_usage()
{
	CombinedImageSamplerDrefHandler dref_handler(*this);
	traverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), dref_handler);

	CombinedImageSamplerUsageHandler handler(*this, dref_handler.dref_combined_samplers);
	traverse_all_reachable_opcodes(get<SPIRFunction>(ir.default_entry_point), handler);
	comparison_ids = move(handler.comparison_ids);
	need_subpass_input = handler.need_subpass_input;

	// Forward information from separate images and samplers into combined image samplers.
	for (auto &combined : combined_image_samplers)
		if (comparison_ids.count(combined.sampler_id))
			comparison_ids.insert(combined.combined_id);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xe8, %rsp
movq %rdi, %r12
leaq 0xe2a11(%rip), %r15     # 0xfd288
addq $0x10, %r15
leaq 0x20(%rsp), %r14
movq %r15, -0x10(%r14)
movq %rdi, -0x8(%r14)
leaq 0x50(%rsp), %rax
movq %rax, -0x30(%rax)
movq $0x1, -0x28(%rax)
xorps %xmm0, %xmm0
movups %xmm0, -0x20(%rax)
movl $0x3f800000, -0x10(%rax) # imm = 0x3F800000
movups %xmm0, -0x8(%rax)
movl 0x108(%rdi), %esi
callq 0xb9ca
leaq 0x10(%rsp), %rdx
movq %r12, %rdi
movq %rax, %rsi
callq 0x13ece
leaq 0xe2a1b(%rip), %rbx     # 0xfd2e8
addq $0x10, %rbx
leaq 0x70(%rsp), %rax
movq %rbx, -0x18(%rax)
movq %r12, -0x10(%rax)
movq %r14, -0x8(%rax)
leaq 0xa0(%rsp), %rax
movq %rax, -0x30(%rax)
movl $0x1, %ecx
movq %rcx, -0x28(%rax)
xorps %xmm0, %xmm0
movups %xmm0, -0x20(%rax)
movl $0x3f800000, %edx       # imm = 0x3F800000
movl %edx, -0x10(%rax)
movups %xmm0, -0x8(%rax)
leaq 0xa8(%rsp), %r14
leaq 0xd8(%rsp), %rax
movq %rax, -0x30(%rax)
movq %rcx, -0x28(%rax)
movups %xmm0, -0x20(%rax)
movl %edx, -0x10(%rax)
movups %xmm0, -0x8(%rax)
movb $0x0, 0x8(%rax)
movl 0x108(%r12), %esi
movq %r12, %rdi
callq 0xb9ca
leaq 0x58(%rsp), %rdx
movq %r12, %rdi
movq %rax, %rsi
callq 0x13ece
leaq 0x360(%r12), %r13
movq %r13, %rdi
movq %r14, %rsi
callq 0x6734
movb 0xe0(%rsp), %al
movb %al, 0x398(%r12)
movq 0x1d8(%r12), %rbp
movq 0x1e0(%r12), %r14
cmpq %r14, %rbp
je 0x1a9ba
leaq 0x8(%rsp), %r12
leaq 0x8(%rbp), %rsi
movq %r13, %rdi
callq 0x1fbce
testq %rax, %rax
je 0x1a9b1
movq %r13, 0x8(%rsp)
movq %r13, %rdi
movq %rbp, %rsi
movq %r12, %rdx
callq 0x1fc02
addq $0xc, %rbp
cmpq %r14, %rbp
jne 0x1a98d
movq %rbx, 0x58(%rsp)
leaq 0xa8(%rsp), %rdi
callq 0xd5b0
leaq 0x70(%rsp), %rdi
callq 0x1fb34
movq %r15, 0x10(%rsp)
leaq 0x20(%rsp), %rdi
callq 0xd5b0
addq $0xe8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rdi
callq 0xd589
jmp 0x1aa06
movq %rax, %r12
jmp 0x1aa25
movq %rax, %r12
movq %rbx, 0x58(%rsp)
leaq 0xa8(%rsp), %rdi
callq 0xd5b0
leaq 0x70(%rsp), %rdi
callq 0x1fb34
movq %r15, 0x10(%rsp)
leaq 0x20(%rsp), %rdi
callq 0xd5b0
movq %r12, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::CombinedImageSamplerDrefHandler::handle(spv::Op, unsigned int const*, unsigned int)
bool Compiler::CombinedImageSamplerDrefHandler::handle(spv::Op opcode, const uint32_t *args, uint32_t)
{
	// Mark all sampled images which are used with Dref.
	switch (opcode)
	{
	case OpImageSampleDrefExplicitLod:
	case OpImageSampleDrefImplicitLod:
	case OpImageSampleProjDrefExplicitLod:
	case OpImageSampleProjDrefImplicitLod:
	case OpImageSparseSampleProjDrefImplicitLod:
	case OpImageSparseSampleDrefImplicitLod:
	case OpImageSparseSampleProjDrefExplicitLod:
	case OpImageSparseSampleDrefExplicitLod:
	case OpImageDrefGather:
	case OpImageSparseDrefGather:
		dref_combined_samplers.insert(args[2]);
		return true;

	default:
		break;
	}

	return true;
}

// Assembly:
leal -0x59(%rsi), %eax
cmpl $0x8, %eax
jbe 0x1aa5b
addl $0xfffffecd, %esi       # imm = 0xFFFFFECD
cmpl $0x8, %esi
ja 0x1aa83
movl $0x133, %eax            # imm = 0x133
btl %esi, %eax
jb 0x1aa65
jmp 0x1aa83
movl $0x133, %ecx            # imm = 0x133
btl %eax, %ecx
jae 0x1aa44
pushq %rax
addq $0x10, %rdi
addq $0x8, %rdx
movq %rsp, %rax
movq %rdi, (%rax)
movq %rdx, %rsi
movq %rax, %rdx
callq 0x1fc02
addq $0x8, %rsp
movb $0x1, %al
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::CFGBuilder::follow_function_call(spirv_cross::SPIRFunction const&)
bool Compiler::CFGBuilder::follow_function_call(const SPIRFunction &func)
{
	if (function_cfgs.find(func.self) == end(function_cfgs))
	{
		function_cfgs[func.self].reset(new CFG(compiler, func));
		return true;
	}
	else
		return false;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x10(%rdi), %r15
leaq 0x8(%rsi), %r12
movl 0x8(%rsi), %ecx
movq %rcx, %rax
xorl %edx, %edx
divq 0x18(%rdi)
movq %r15, %rdi
movq %rdx, %rsi
movq %r12, %rdx
callq 0x23bfa
testq %rax, %rax
je 0x1aeeb
cmpq $0x0, (%rax)
sete %bpl
jmp 0x1aeee
movb $0x1, %bpl
testb %bpl, %bpl
je 0x1af30
movq %r15, %rdi
movq %r12, %rsi
callq 0x23dc6
movq %rax, %r15
movl $0x90, %edi
callq 0x6250
movq %rax, %r12
movq 0x8(%r14), %rsi
movq %rax, %rdi
movq %rbx, %rdx
callq 0x71ec
movq (%r15), %rsi
movq %r12, (%r15)
testq %rsi, %rsi
je 0x1af30
movq %r15, %rdi
callq 0xe096
movl %ebp, %eax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rax, %rbx
movl $0x90, %esi
movq %r12, %rdi
callq 0x6260
movq %rbx, %rdi
callq 0x64a0
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::CombinedImageSamplerUsageHandler::begin_function_scope(unsigned int const*, unsigned int)
bool Compiler::CombinedImageSamplerUsageHandler::begin_function_scope(const uint32_t *args, uint32_t length)
{
	if (length < 3)
		return false;

	auto &func = compiler.get<SPIRFunction>(args[2]);
	const auto *arg = &args[3];
	length -= 3;

	for (uint32_t i = 0; i < length; i++)
	{
		auto &argument = func.arguments[i];
		dependency_hierarchy[argument.id].insert(arg[i]);
	}

	return true;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movl %edx, 0xc(%rsp)
cmpl $0x3, %edx
jb 0x1afd7
movq %rsi, %r14
movq %rdi, %r15
movq 0x8(%rdi), %rdi
movl 0x8(%rsi), %esi
callq 0xb9ca
movq %rax, %r12
movl 0xc(%rsp), %eax
addl $-0x3, %eax
je 0x1afd7
addq $0xc, %r14
addq $0x18, %r15
movl %eax, %eax
shlq $0x2, %rax
leaq (%rax,%rax,4), %rbp
xorl %ebx, %ebx
leaq 0x10(%rsp), %r13
movq 0x18(%r12), %rax
leaq (%rax,%rbx), %rsi
addq $0x4, %rsi
movq %r15, %rdi
callq 0x237d8
movq %rax, 0x10(%rsp)
movq %rax, %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0x1fc02
addq $0x4, %r14
addq $0x14, %rbx
cmpq %rbx, %rbp
jne 0x1afa2
cmpl $0x3, 0xc(%rsp)
setae %al
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::CombinedImageSamplerUsageHandler::add_hierarchy_to_comparison_ids(unsigned int)
void Compiler::CombinedImageSamplerUsageHandler::add_hierarchy_to_comparison_ids(uint32_t id)
{
	// Traverse the variable dependency hierarchy and tag everything in its path with comparison ids.
	comparison_ids.insert(id);
	for (auto &dep_id : dependency_hierarchy[id])
		add_hierarchy_to_comparison_ids(dep_id);
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x18, %rsp
movq %rdi, %rbx
leaq 0xc(%rsp), %r14
movl %esi, (%r14)
addq $0x50, %rdi
leaq 0x10(%rsp), %rdx
movq %rdi, (%rdx)
movq %r14, %rsi
callq 0x1fc02
leaq 0x18(%rbx), %rdi
movq %r14, %rsi
callq 0x237d8
movq 0x10(%rax), %r14
testq %r14, %r14
je 0x1b03a
movl 0x8(%r14), %esi
movq %rbx, %rdi
callq 0x1afee
movq (%r14), %r14
jmp 0x1b024
addq $0x18, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::CombinedImageSamplerUsageHandler::handle(spv::Op, unsigned int const*, unsigned int)
bool Compiler::CombinedImageSamplerUsageHandler::handle(Op opcode, const uint32_t *args, uint32_t length)
{
	switch (opcode)
	{
	case OpAccessChain:
	case OpInBoundsAccessChain:
	case OpLoad:
	{
		if (length < 3)
			return false;
		dependency_hierarchy[args[1]].insert(args[2]);

		// Ideally defer this to OpImageRead, but then we'd need to track loaded IDs.
		// If we load an image, we're going to use it and there is little harm in declaring an unused gl_FragCoord.
		auto &type = compiler.get<SPIRType>(args[0]);
		if (type.image.dim == DimSubpassData)
			need_subpass_input = true;

		// If we load a SampledImage and it will be used with Dref, propagate the state up.
		if (dref_combined_samplers.count(args[1]) != 0)
			add_hierarchy_to_comparison_ids(args[1]);
		break;
	}

	case OpSampledImage:
	{
		if (length < 4)
			return false;

		uint32_t result_type = args[0];
		uint32_t result_id = args[1];
		auto &type = compiler.get<SPIRType>(result_type);
		if (type.image.depth || dref_combined_samplers.count(result_id) != 0)
		{
			// This image must be a depth image.
			uint32_t image = args[2];
			add_hierarchy_to_comparison_ids(image);

			// This sampler must be a SamplerComparisonState, and not a regular SamplerState.
			uint32_t sampler = args[3];
			add_hierarchy_to_comparison_ids(sampler);

			// Mark the OpSampledImage itself as being comparison state.
			comparison_ids.insert(result_id);
		}
		return true;
	}

	default:
		break;
	}

	return true;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdx, %r15
movq %rdi, %r14
movb $0x1, %bl
leal -0x41(%rsi), %eax
cmpl $0x2, %eax
jb 0x1b067
cmpl $0x56, %esi
je 0x1b0cc
cmpl $0x3d, %esi
jne 0x1b0d3
cmpl $0x3, %ecx
jb 0x1b0d1
leaq 0x18(%r14), %rdi
leaq 0x4(%r15), %r12
movq %r12, %rsi
callq 0x237d8
leaq 0x8(%r15), %rsi
leaq 0x10(%rsp), %rdx
movq %rax, (%rdx)
movq %rax, %rdi
callq 0x1fc02
movq 0x8(%r14), %rdi
movl (%r15), %esi
callq 0xa426
cmpl $0x6, 0x84(%rax)
jne 0x1b0ad
movb $0x1, 0x88(%r14)
movq 0x10(%r14), %rdi
movq %r12, %rsi
callq 0x1fbce
testq %rax, %rax
je 0x1b0d3
movl (%r12), %esi
movq %r14, %rdi
callq 0x1afee
jmp 0x1b0d3
cmpl $0x4, %ecx
jae 0x1b0e1
xorl %ebx, %ebx
movl %ebx, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
movl (%r15), %esi
movl 0x4(%r15), %eax
movl %eax, 0xc(%rsp)
movq 0x8(%r14), %rdi
callq 0xa426
cmpb $0x0, 0x88(%rax)
jne 0x1b111
movq 0x10(%r14), %rdi
leaq 0xc(%rsp), %rsi
callq 0x1fbce
testq %rax, %rax
je 0x1b0d3
movl 0x8(%r15), %esi
movq %r14, %rdi
callq 0x1afee
movl 0xc(%r15), %esi
movq %r14, %rdi
callq 0x1afee
addq $0x50, %r14
leaq 0x10(%rsp), %rdx
movq %r14, (%rdx)
leaq 0xc(%rsp), %rsi
movq %r14, %rdi
callq 0x1fc02
jmp 0x1b0d3
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::buffer_is_hlsl_counter_buffer(unsigned int) const
bool Compiler::buffer_is_hlsl_counter_buffer(uint32_t id) const
{
	// First, check for the proper decoration.
	if (ir.meta.at(id).hlsl_is_magic_counter_buffer)
		return true;

	// Check for legacy fallback method.
	// FIXME: This should be deprecated eventually.

	if (ir.meta.at(id).hlsl_magic_counter_buffer_candidate)
	{
		auto *var = maybe_get<SPIRVariable>(id);
		// Ensure that this is actually a buffer object.
		return var && (var->storage == StorageClassStorageBuffer ||
		               has_decoration(get<SPIRType>(var->basetype).self, DecorationBufferBlock));
	}
	else
		return false;
}

// Assembly:
pushq %rbp
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl %esi, %eax
movq 0x38(%rdi), %rcx
movq 0x40(%rdi), %rdi
subq %rcx, %rdi
sarq $0x3, %rdi
movabsq $-0x7063e7063e7063e7, %rdx # imm = 0x8F9C18F9C18F9C19
imulq %rdi, %rdx
cmpq %rax, %rdx
jbe 0x1b1d1
imulq $0x148, %rax, %rax      # imm = 0x148
movb $0x1, %bpl
cmpb $0x0, 0x141(%rcx,%rax)
jne 0x1b1c8
addq %rax, %rcx
cmpb $0x1, 0x140(%rcx)
jne 0x1b1c6
movq %rbx, %rdi
callq 0x1bc26
testq %rax, %rax
je 0x1b1c6
cmpl $0xc, 0x10(%rax)
je 0x1b1c8
movl 0xc(%rax), %esi
movq %rbx, %rdi
callq 0x1b9de
movl 0x8(%rax), %esi
addq $0x8, %rbx
movq %rbx, %rdi
movl $0x3, %edx
addq $0x8, %rsp
popq %rbx
popq %rbp
jmp 0x24fbc
xorl %ebp, %ebp
movl %ebp, %eax
addq $0x8, %rsp
popq %rbx
popq %rbp
retq
leaq 0x99f41(%rip), %rdi     # 0xb5119
movq %rax, %rsi
xorl %eax, %eax
callq 0x63d0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::buffer_get_hlsl_counter_buffer(unsigned int, unsigned int&) const
bool Compiler::buffer_get_hlsl_counter_buffer(uint32_t id, uint32_t &counter_id) const
{
	// First, check for the proper decoration.
	if (ir.meta[id].hlsl_magic_counter_buffer != 0)
	{
		counter_id = ir.meta[id].hlsl_magic_counter_buffer;
		return true;
	}

	// Check for legacy fallback method.
	// FIXME: This should be deprecated eventually.

	auto &name = get_name(id);
	uint32_t id_bound = get_current_id_bound();
	for (uint32_t i = 0; i < id_bound; i++)
	{
		if (ir.meta[i].hlsl_magic_counter_buffer_candidate && ir.meta[i].hlsl_magic_counter_buffer_name == name)
		{
			auto *var = maybe_get<SPIRVariable>(i);
			// Ensure that this is actually a buffer object.
			if (var && (var->storage == StorageClassStorageBuffer ||
			            has_decoration(get<SPIRType>(var->basetype).self, DecorationBufferBlock)))
			{
				counter_id = i;
				return true;
			}
		}
	}
	return false;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdx, %rbx
movl %esi, %esi
movq 0x38(%rdi), %r13
imulq $0x148, %rsi, %rcx      # imm = 0x148
movl 0x144(%r13,%rcx), %eax
testl %eax, %eax
je 0x1b212
movl %eax, (%rbx)
movb $0x1, %al
jmp 0x1b2d9
movq %rdi, %r14
movq 0x40(%rdi), %rax
subq %r13, %rax
sarq $0x3, %rax
movabsq $-0x7063e7063e7063e7, %rdx # imm = 0x8F9C18F9C18F9C19
imulq %rax, %rdx
cmpq %rsi, %rdx
jbe 0x1b2f0
movq 0x28(%r14), %rdx
subq 0x20(%r14), %rdx
shrq $0x4, %rdx
testl %edx, %edx
setne %al
je 0x1b2d9
addq %rcx, %r13
leaq 0x8(%r14), %rax
movq %rax, (%rsp)
movl %edx, %ebp
movl $0x140, %r15d           # imm = 0x140
xorl %r12d, %r12d
movq 0x38(%r14), %rax
cmpb $0x1, (%rax,%r15)
jne 0x1b2c7
movq -0x18(%rax,%r15), %rdx
cmpq 0x8(%r13), %rdx
jne 0x1b2c7
testq %rdx, %rdx
je 0x1b291
movq (%r13), %rsi
movq -0x20(%rax,%r15), %rdi
callq 0x6280
testl %eax, %eax
jne 0x1b2c7
movq %r14, %rdi
movl %r12d, %esi
callq 0x1bc26
testq %rax, %rax
je 0x1b2c7
cmpl $0xc, 0x10(%rax)
je 0x1b2e8
movl 0xc(%rax), %esi
movq %r14, %rdi
callq 0x1b9de
movl 0x8(%rax), %esi
movq (%rsp), %rdi
movl $0x3, %edx
callq 0x24fbc
testb %al, %al
jne 0x1b2e8
incq %r12
addq $0x148, %r15            # imm = 0x148
cmpq %r12, %rbp
jne 0x1b264
seta %al
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl %r12d, (%rbx)
jmp 0x1b20b
leaq 0x99e22(%rip), %rdi     # 0xb5119
xorl %eax, %eax
callq 0x63d0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.cpp
// Function: spirv_cross::Compiler::combined_decoration_for_member(spirv_cross::SPIRType const&, unsigned int) const
Bitset Compiler::combined_decoration_for_member(const SPIRType &type, uint32_t index) const
{
	Bitset flags;
	auto &memb = ir.meta[type.self].members;
	if (index >= memb.size())
		return flags;
	auto &dec = memb[index];

	// If our type is a struct, traverse all the members as well recursively.
	flags.merge_or(dec.decoration_flags);
	for (uint32_t i = 0; i < type.member_types.size(); i++)
		flags.merge_or(combined_decoration_for_member(get<SPIRType>(type.member_types[i]), i));

	return flags;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x58, %rsp
movq %rdx, %r14
movq %rsi, %r15
movq $0x0, (%rdi)
leaq 0x38(%rdi), %rax
movq %rax, 0x8(%rdi)
movq $0x1, 0x10(%rdi)
xorps %xmm0, %xmm0
movups %xmm0, 0x18(%rdi)
movl $0x3f800000, 0x28(%rdi) # imm = 0x3F800000
movq %rdi, 0x8(%rsp)
movups %xmm0, 0x30(%rdi)
movl 0x8(%rdx), %eax
movq 0x38(%rsi), %rdx
imulq $0x148, %rax, %rsi      # imm = 0x148
movl %ecx, %ecx
movq 0xd0(%rdx,%rsi), %rax
movq 0xd8(%rdx,%rsi), %rdx
subq %rax, %rdx
sarq $0x4, %rdx
movabsq $0x4ec4ec4ec4ec4ec5, %rsi # imm = 0x4EC4EC4EC4EC4EC5
imulq %rdx, %rsi
cmpq %rcx, %rsi
jbe 0x1b7c2
movq 0x8(%rsp), %rsi
leaq 0x8(%rsi), %r12
imulq $0xd0, %rcx, %rcx
movq 0x60(%rax,%rcx), %rdx
movq %rdx, (%rsi)
movq 0x78(%rax,%rcx), %rbp
testq %rbp, %rbp
je 0x1b740
leaq 0x18(%rsp), %r13
leaq 0x8(%rbp), %rsi
movq %r12, 0x18(%rsp)
movq %r12, %rdi
movq %r13, %rdx
callq 0x1fc02
movq (%rbp), %rbp
testq %rbp, %rbp
jne 0x1b723
movq 0x68(%r14), %rax
cmpq %rax, 0x70(%r14)
je 0x1b7c2
xorl %r13d, %r13d
leaq 0x10(%rsp), %rbp
movl (%rax,%r13,4), %esi
movq %r15, %rdi
callq 0x1b9de
leaq 0x18(%rsp), %rdi
movq %r15, %rsi
movq %rax, %rdx
movl %r13d, %ecx
callq 0x1b67c
movq 0x18(%rsp), %rax
movq 0x8(%rsp), %rcx
orq %rax, (%rcx)
movq 0x30(%rsp), %rbx
testq %rbx, %rbx
je 0x1b7a1
leaq 0x8(%rbx), %rsi
movq %r12, 0x10(%rsp)
movq %r12, %rdi
movq %rbp, %rdx
callq 0x1fc02
movq (%rbx), %rbx
jmp 0x1b783
leaq 0x20(%rsp), %rdi
callq 0xd5b0
incl %r13d
movq 0x68(%r14), %rax
movq 0x70(%r14), %rcx
subq %rax, %rcx
sarq $0x2, %rcx
cmpq %r13, %rcx
ja 0x1b752
movq 0x8(%rsp), %rax
addq $0x58, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
jmp 0x1b7d8
movq %rax, %rbx
jmp 0x1b7ea
movq %rax, %rbx
leaq 0x20(%rsp), %rdi
callq 0xd5b0
movq %r12, %rdi
callq 0xd5b0
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross.hpp
// Function: spirv_cross::SPIRVariable const* spirv_cross::Compiler::maybe_get<spirv_cross::SPIRVariable>(unsigned int) const
const T *maybe_get(uint32_t id) const
	{
		if (ir.ids.at(id).get_type() == T::type)
			return &get<T>(id);
		else
			return nullptr;
	}

// Assembly:
movl %esi, %eax
movq 0x20(%rdi), %rcx
movq 0x28(%rdi), %rdx
subq %rcx, %rdx
sarq $0x4, %rdx
cmpq %rax, %rdx
jbe 0x1bc4e
shlq $0x4, %rax
cmpl $0x2, 0x8(%rcx,%rax)
je 0x1baba
xorl %eax, %eax
retq
pushq %rax
leaq 0x994c3(%rip), %rdi     # 0xb5119
movq %rax, %rsi
xorl %eax, %eax
callq 0x63d0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_common.hpp
// Function: spirv_cross::Variant::operator=(spirv_cross::Variant const&)
Variant &operator=(const Variant &other)
	{
#ifdef SPIRV_CROSS_COPY_CONSTRUCTOR_SANITIZE
		abort();
#endif
		if (this != &other)
		{
			holder.reset();
			if (other.holder)
				holder = other.holder->clone();
			type = other.type;
			allow_type_rewrite = other.allow_type_rewrite;
		}
		return *this;
	}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rdi, %rbx
cmpq %rsi, %rdi
je 0x1d3d2
movq %rsi, %r14
movq (%rbx), %rdi
movq $0x0, (%rbx)
testq %rdi, %rdi
je 0x1d383
movq (%rdi), %rax
callq *0x8(%rax)
movq (%r14), %rsi
testq %rsi, %rsi
je 0x1d3c4
movq (%rsi), %rax
leaq 0x8(%rsp), %r15
movq %r15, %rdi
callq *0x10(%rax)
movq (%r15), %rax
movq $0x0, (%r15)
movq (%rbx), %rdi
movq %rax, (%rbx)
testq %rdi, %rdi
je 0x1d3b4
movq (%rdi), %rax
callq *0x8(%rax)
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x1d3c4
movq (%rdi), %rax
callq *0x8(%rax)
movl 0x8(%r14), %eax
movl %eax, 0x8(%rbx)
movb 0xc(%r14), %al
movb %al, 0xc(%rbx)
movq %rbx, %rax
addq $0x10, %rsp
popq %rbx
popq %r14
popq %r15
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_common.hpp
// Function: spirv_cross::SPIRExpression& spirv_cross::variant_set<spirv_cross::SPIRExpression, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, unsigned int&, bool>(spirv_cross::Variant&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&&, unsigned int&, bool&&)
T &variant_set(Variant &var, P &&... args)
{
	auto uptr = std::unique_ptr<T>(new T(std::forward<P>(args)...));
	auto ptr = uptr.get();
	var.set(std::move(uptr), T::type);
	return *ptr;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x30, %rsp
movq %rcx, %r15
movq %rdx, %r12
movq %rsi, %r13
movq %rdi, %r14
movl $0x58, %edi
callq 0x6250
movq %rax, %rbx
leaq 0x20(%rsp), %rcx
movq %rcx, -0x10(%rcx)
movq (%r13), %rsi
leaq 0x10(%r13), %rdx
cmpq %rdx, %rsi
je 0x5d621
movq %rsi, 0x10(%rsp)
movq (%rdx), %rsi
movq %rsi, 0x20(%rsp)
jmp 0x5d627
movups (%rdx), %xmm0
movups %xmm0, (%rcx)
movq 0x8(%r13), %rsi
movq %rsi, 0x18(%rsp)
movq %rdx, (%r13)
xorl %r8d, %r8d
movq %r8, 0x8(%r13)
movb $0x0, 0x10(%r13)
movl (%r12), %edi
movb (%r15), %dl
movq %r8, 0x8(%rbx)
leaq 0x9fe16(%rip), %r8      # 0xfd468
addq $0x10, %r8
movq %r8, (%rbx)
addq $0x20, %rax
movq %rax, 0x10(%rbx)
movq 0x10(%rsp), %r8
cmpq %rcx, %r8
je 0x5d67a
movq %r8, 0x10(%rbx)
movq 0x20(%rsp), %rax
movq %rax, 0x20(%rbx)
jmp 0x5d680
movups (%rcx), %xmm0
movups %xmm0, (%rax)
movq %rsi, 0x18(%rbx)
movq %rcx, 0x10(%rsp)
xorl %eax, %eax
movq %rax, 0x18(%rsp)
movb %al, 0x20(%rsp)
movl %edi, 0x30(%rbx)
movl $0x0, 0x34(%rbx)
movb %dl, 0x38(%rbx)
movb %al, 0x39(%rbx)
xorps %xmm0, %xmm0
movups %xmm0, 0x40(%rbx)
movq %rax, 0x50(%rbx)
leaq 0x8(%rsp), %rsi
movq %rbx, (%rsi)
movq %r14, %rdi
movl $0x9, %edx
callq 0x22d94
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x5d6d4
movq (%rdi), %rax
callq *0x8(%rax)
movq $0x0, 0x8(%rsp)
movq %rbx, %rax
addq $0x30, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
movq %rax, %rbx
movq 0x8(%rsp), %rdi
testq %rdi, %rdi
je 0x5d701
movq (%rdi), %rax
callq *0x8(%rax)
movq $0x0, 0x8(%rsp)
movq %rbx, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_common.hpp
// Function: spirv_cross::Variant::set(std::unique_ptr<spirv_cross::IVariant, std::default_delete<spirv_cross::IVariant>>, unsigned int)
void set(std::unique_ptr<IVariant> val, uint32_t new_type)
	{
		holder = std::move(val);
		if (!allow_type_rewrite && type != TypeNone && type != new_type)
			SPIRV_CROSS_THROW("Overwriting a variant with new type.");
		type = new_type;
		allow_type_rewrite = false;
	}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x28, %rsp
movl %edx, %ebx
movq %rdi, %r14
movq (%rsi), %rax
movq $0x0, (%rsi)
movq (%rdi), %rdi
movq %rax, (%r14)
testq %rdi, %rdi
je 0x22dbe
movq (%rdi), %rax
callq *0x8(%rax)
cmpb $0x0, 0xc(%r14)
jne 0x22dd7
movl 0x8(%r14), %eax
testl %eax, %eax
sete %cl
cmpl %ebx, %eax
sete %al
orb %cl, %al
je 0x22deb
movl %ebx, 0x8(%r14)
movb $0x0, 0xc(%r14)
addq $0x28, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movl $0x10, %edi
callq 0x6140
movq %rax, %rbx
leaq 0x18(%rsp), %r15
movq %r15, -0x10(%r15)
leaq 0x93489(%rip), %rsi     # 0xb6291
leaq 0x934a6(%rip), %rdx     # 0xb62b5
leaq 0x8(%rsp), %rdi
callq 0x7c64
movb $0x1, %bpl
leaq 0x8(%rsp), %rsi
movq %rbx, %rdi
callq 0x6320
leaq 0xd9f68(%rip), %rax     # 0xfcd98
addq $0x10, %rax
movq %rax, (%rbx)
xorl %ebp, %ebp
leaq 0xd9f40(%rip), %rsi     # 0xfcd80
movq 0xdb191(%rip), %rdx     # 0xfdfd8
movq %rbx, %rdi
callq 0x6470
movq %rax, %r14
movq 0x8(%rsp), %rdi
cmpq %r15, %rdi
je 0x22e71
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x22e71
movq %rax, %r14
movb $0x1, %bpl
testb %bpl, %bpl
je 0x22e7e
movq %rbx, %rdi
callq 0x6200
movq %r14, %rdi
callq 0x64a0
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::get_member_name[abi:cxx11](unsigned int, unsigned int) const
const string &ParsedIR::get_member_name(uint32_t id, uint32_t index) const
{
	auto &m = meta[id];
	if (index >= m.members.size())
	{
		static string empty;
		return empty;
	}

	return m.members[index].alias;
}

// Assembly:
movl %esi, %eax
movq 0x30(%rdi), %rsi
movl %edx, %ecx
imulq $0x148, %rax, %rdx      # imm = 0x148
movq 0xd0(%rsi,%rdx), %rax
movq 0xd8(%rsi,%rdx), %rdx
subq %rax, %rdx
sarq $0x4, %rdx
movabsq $0x4ec4ec4ec4ec4ec5, %rsi # imm = 0x4EC4EC4EC4EC4EC5
imulq %rdx, %rsi
cmpq %rcx, %rsi
jbe 0x2461e
imulq $0xd0, %rcx, %rcx
addq %rcx, %rax
retq
movb 0xd9ee4(%rip), %al      # 0xfe508
testb %al, %al
je 0x24630
leaq 0xd9eb9(%rip), %rax     # 0xfe4e8
retq
pushq %rbx
subq $0x10, %rsp
leaq 0x8(%rsp), %rbx
movq %rbx, %rdi
callq 0x6b22
movq (%rbx), %rax
addq $0x10, %rsp
popq %rbx
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::set_name(unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
void ParsedIR::set_name(uint32_t id, const string &name)
{
	auto &str = meta[id].decoration.alias;
	str.clear();

	if (name.empty())
		return;

	// glslang uses identifiers to pass along meaningful information
	// about HLSL reflection.
	// FIXME: This should be deprecated eventually.
	auto &m = meta[id];
	if (source.hlsl && name.size() >= 6 && name.find("@count") == name.size() - 6)
	{
		m.hlsl_magic_counter_buffer_candidate = true;
		m.hlsl_magic_counter_buffer_name = name.substr(0, name.find("@count"));
	}
	else
	{
		m.hlsl_magic_counter_buffer_candidate = false;
		m.hlsl_magic_counter_buffer_name.clear();
	}

	// Reserved for temporaries.
	if (name[0] == '_' && name.size() >= 2 && isdigit(name[1]))
		return;

	str = ensure_valid_identifier(name, false);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x20, %rsp
movl %esi, %eax
movq 0x30(%rdi), %rbx
imulq $0x148, %rax, %r13      # imm = 0x148
movq $0x0, 0x8(%rbx,%r13)
movq (%rbx,%r13), %rax
movb $0x0, (%rax)
movq 0x8(%rdx), %rax
testq %rax, %rax
je 0x24797
movq %rdx, %r14
movq 0x30(%rdi), %r15
addq %r13, %r15
cmpq $0x6, %rax
jb 0x24727
cmpb $0x0, 0x10a(%rdi)
je 0x24727
leaq 0x91ea5(%rip), %rsi     # 0xb6550
movl $0x6, %ecx
movq %r14, %rdi
xorl %edx, %edx
callq 0x6490
movq 0x8(%r14), %rcx
addq $-0x6, %rcx
cmpq %rcx, %rax
jne 0x24727
movb $0x1, 0x140(%r15)
leaq 0x91e7a(%rip), %rsi     # 0xb6550
movl $0x6, %ecx
movq %r14, %rdi
xorl %edx, %edx
callq 0x6490
movq %rsp, %r12
movq %r12, %rdi
movq %r14, %rsi
xorl %edx, %edx
movq %rax, %rcx
callq 0x6290
addq $0x120, %r15            # imm = 0x120
movq %r15, %rdi
movq %r12, %rsi
callq 0x6310
movq (%r12), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x24744
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
jmp 0x24744
xorl %eax, %eax
movb %al, 0x140(%r15)
movq $0x0, 0x128(%r15)
movq 0x120(%r15), %rcx
movb %al, (%rcx)
movq (%r14), %rax
cmpb $0x5f, (%rax)
jne 0x2475f
cmpq $0x2, 0x8(%r14)
jb 0x2475f
movsbl 0x1(%rax), %eax
addl $-0x30, %eax
cmpl $0xa, %eax
jb 0x24797
addq %r13, %rbx
movq %rsp, %r15
movq %r15, %rdi
movq %r14, %rsi
xorl %edx, %edx
callq 0x247a5
movq %rbx, %rdi
movq %r15, %rsi
callq 0x6310
movq (%r15), %rdi
leaq 0x10(%rsp), %rax
cmpq %rax, %rdi
je 0x24797
movq 0x10(%rsp), %rsi
incq %rsi
callq 0x6260
addq $0x20, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ensure_valid_identifier(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, bool)
static string ensure_valid_identifier(const string &name, bool member)
{
	// Functions in glslangValidator are mangled with name(<mangled> stuff.
	// Normally, we would never see '(' in any legal identifiers, so just strip them out.
	auto str = name.substr(0, name.find('('));

	for (uint32_t i = 0; i < str.size(); i++)
	{
		auto &c = str[i];

		if (member)
		{
			// _m<num> variables are reserved by the internal implementation,
			// otherwise, make sure the name is a valid identifier.
			if (i == 0)
				c = isalpha(c) ? c : '_';
			else if (i == 2 && str[0] == '_' && str[1] == 'm')
				c = isalpha(c) ? c : '_';
			else
				c = isalnum(c) ? c : '_';
		}
		else
		{
			// _<num> variables are reserved by the internal implementation,
			// otherwise, make sure the name is a valid identifier.
			if (i == 0 || (str[0] == '_' && i == 1))
				c = isalpha(c) ? c : '_';
			else
				c = isalnum(c) ? c : '_';
		}
	}
	return str;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movl %edx, %ebx
movq %rsi, %r15
movq %rdi, %r14
xorl %r12d, %r12d
movq %rsi, %rdi
movl $0x28, %esi
xorl %edx, %edx
callq 0x6340
movq %r14, %rdi
movq %r15, %rsi
xorl %edx, %edx
movq %rax, %rcx
callq 0x6290
cmpq $0x0, 0x8(%r14)
je 0x24848
movq (%r14), %r15
testb %bl, %bl
je 0x247f2
cmpl $0x2, %r12d
je 0x24805
testl %r12d, %r12d
je 0x24812
jmp 0x24821
testl %r12d, %r12d
je 0x24812
cmpl $0x1, %r12d
jne 0x24821
cmpb $0x5f, (%r15)
je 0x24812
jmp 0x24821
cmpb $0x5f, (%r15)
jne 0x24821
cmpb $0x6d, 0x1(%r15)
jne 0x24821
movb (%r15,%r12), %bpl
movsbl %bpl, %edi
callq 0x6420
jmp 0x2482e
movb (%r15,%r12), %bpl
movsbl %bpl, %edi
callq 0x6270
movl $0x5f, %ecx
testl %eax, %eax
je 0x2483b
movzbl %bpl, %ecx
movb %cl, (%r15,%r12)
incl %r12d
cmpq %r12, 0x8(%r14)
ja 0x247de
movq %r14, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::set_member_name(unsigned int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
void ParsedIR::set_member_name(uint32_t id, uint32_t index, const string &name)
{
	meta[id].members.resize(max(meta[id].members.size(), size_t(index) + 1));

	auto &str = meta[id].members[index].alias;
	str.clear();
	if (name.empty())
		return;

	// Reserved for unnamed members.
	if (name[0] == '_' && name.size() >= 3 && name[1] == 'm' && isdigit(name[2]))
		return;

	str = ensure_valid_identifier(name, true);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rcx, %rbx
movq %rdi, %r14
movl %esi, %eax
movq 0x30(%rdi), %rcx
imulq $0x148, %rax, %r15      # imm = 0x148
leaq 0xd0(%r15), %rdi
addq %rcx, %rdi
movq 0xd8(%rcx,%r15), %rax
subq 0xd0(%rcx,%r15), %rax
sarq $0x4, %rax
movabsq $0x4ec4ec4ec4ec4ec5, %rsi # imm = 0x4EC4EC4EC4EC4EC5
imulq %rax, %rsi
movl %edx, %r12d
leaq 0x1(%r12), %rax
cmpq %rax, %rsi
cmovbeq %rax, %rsi
callq 0x1bf8e
movq 0x30(%r14), %rax
movq 0xd0(%rax,%r15), %r14
imulq $0xd0, %r12, %rax
movq $0x0, 0x8(%r14,%rax)
movq (%r14,%rax), %rcx
movb $0x0, (%rcx)
movq 0x8(%rbx), %rcx
testq %rcx, %rcx
je 0x2493b
cmpq $0x3, %rcx
jb 0x248fe
movq (%rbx), %rcx
cmpb $0x5f, (%rcx)
jne 0x248fe
cmpb $0x6d, 0x1(%rcx)
jne 0x248fe
movsbl 0x2(%rcx), %ecx
addl $-0x30, %ecx
cmpl $0xa, %ecx
jb 0x2493b
addq %rax, %r14
leaq 0x8(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
movl $0x1, %edx
callq 0x247a5
movq %r14, %rdi
movq %r15, %rsi
callq 0x6310
movq (%r15), %rdi
leaq 0x18(%rsp), %rax
cmpq %rax, %rdi
je 0x2493b
movq 0x18(%rsp), %rsi
incq %rsi
callq 0x6260
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::set_decoration_string(unsigned int, spv::Decoration, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&)
void ParsedIR::set_decoration_string(uint32_t id, Decoration decoration, const string &argument)
{
	auto &dec = meta[id].decoration;
	dec.decoration_flags.set(decoration);

	switch (decoration)
	{
	case DecorationHlslSemanticGOOGLE:
		dec.hlsl_semantic = argument;
		break;

	default:
		break;
	}
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rcx, %rbx
movl %edx, %ebp
movl %esi, %eax
imulq $0x148, %rax, %r14      # imm = 0x148
addq 0x30(%rdi), %r14
movl %edx, 0x4(%rsp)
cmpl $0x3f, %edx
ja 0x2497b
movl $0x1, %eax
movl %ebp, %ecx
shlq %cl, %rax
orq %rax, 0x60(%r14)
jmp 0x24991
leaq 0x68(%r14), %rdi
leaq 0x8(%rsp), %rdx
movq %rdi, (%rdx)
leaq 0x4(%rsp), %rsi
callq 0x1fc02
cmpl $0x1603, %ebp           # imm = 0x1603
jne 0x249a8
addq $0x40, %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x6170
addq $0x10, %rsp
popq %rbx
popq %r14
popq %rbp
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::set_decoration(unsigned int, spv::Decoration, unsigned int)
void ParsedIR::set_decoration(uint32_t id, Decoration decoration, uint32_t argument)
{
	auto &dec = meta[id].decoration;
	dec.decoration_flags.set(decoration);

	switch (decoration)
	{
	case DecorationBuiltIn:
		dec.builtin = true;
		dec.builtin_type = static_cast<BuiltIn>(argument);
		break;

	case DecorationLocation:
		dec.location = argument;
		break;

	case DecorationComponent:
		dec.component = argument;
		break;

	case DecorationOffset:
		dec.offset = argument;
		break;

	case DecorationArrayStride:
		dec.array_stride = argument;
		break;

	case DecorationMatrixStride:
		dec.matrix_stride = argument;
		break;

	case DecorationBinding:
		dec.binding = argument;
		break;

	case DecorationDescriptorSet:
		dec.set = argument;
		break;

	case DecorationInputAttachmentIndex:
		dec.input_attachment = argument;
		break;

	case DecorationSpecId:
		dec.spec_id = argument;
		break;

	case DecorationIndex:
		dec.index = argument;
		break;

	case DecorationHlslCounterBufferGOOGLE:
		meta[id].hlsl_magic_counter_buffer = argument;
		meta[id].hlsl_is_magic_counter_buffer = true;
		break;

	default:
		break;
	}
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x10, %rsp
movl %ecx, %ebx
movl %edx, %r14d
movq %rdi, %r15
movl %esi, %eax
imulq $0x148, %rax, %r13      # imm = 0x148
movq 0x30(%rdi), %r12
addq %r13, %r12
movl %edx, 0x4(%rsp)
cmpl $0x3f, %edx
ja 0x249f2
movl $0x1, %eax
movl %r14d, %ecx
shlq %cl, %rax
orq %rax, 0x60(%r12)
jmp 0x24a09
leaq 0x68(%r12), %rdi
leaq 0x8(%rsp), %rdx
movq %rdi, (%rdx)
leaq 0x4(%rsp), %rsi
callq 0x1fc02
cmpl $0xa, %r14d
jle 0x24a35
leal -0x1e(%r14), %eax
cmpl $0xd, %eax
ja 0x24a58
leaq 0x91a59(%rip), %rcx     # 0xb6478
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movl %ebx, 0xa4(%r12)
jmp 0x24adf
cmpl $0x1, %r14d
je 0x24a7a
cmpl $0x6, %r14d
je 0x24a84
cmpl $0x7, %r14d
jne 0x24adf
movl %ebx, 0xbc(%r12)
jmp 0x24adf
cmpl $0x1602, %r14d          # imm = 0x1602
je 0x24aca
cmpl $0xb, %r14d
jne 0x24adf
movb $0x1, 0xcc(%r12)
movl %ebx, 0xa0(%r12)
jmp 0x24adf
movl %ebx, 0xc4(%r12)
jmp 0x24adf
movl %ebx, 0xb8(%r12)
jmp 0x24adf
movl %ebx, 0xac(%r12)
jmp 0x24adf
movl %ebx, 0xb4(%r12)
jmp 0x24adf
movl %ebx, 0xa8(%r12)
jmp 0x24adf
movl %ebx, 0xb0(%r12)
jmp 0x24adf
movl %ebx, 0xc8(%r12)
jmp 0x24adf
movl %ebx, 0xc0(%r12)
jmp 0x24adf
movq 0x30(%r15), %rax
movl %ebx, 0x144(%rax,%r13)
movb $0x1, 0x141(%rax,%r13)
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
nop
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::set_member_decoration(unsigned int, unsigned int, spv::Decoration, unsigned int)
void ParsedIR::set_member_decoration(uint32_t id, uint32_t index, Decoration decoration, uint32_t argument)
{
	meta[id].members.resize(max(meta[id].members.size(), size_t(index) + 1));
	auto &dec = meta[id].members[index];
	dec.decoration_flags.set(decoration);

	switch (decoration)
	{
	case DecorationBuiltIn:
		dec.builtin = true;
		dec.builtin_type = static_cast<BuiltIn>(argument);
		break;

	case DecorationLocation:
		dec.location = argument;
		break;

	case DecorationComponent:
		dec.component = argument;
		break;

	case DecorationBinding:
		dec.binding = argument;
		break;

	case DecorationOffset:
		dec.offset = argument;
		break;

	case DecorationSpecId:
		dec.spec_id = argument;
		break;

	case DecorationMatrixStride:
		dec.matrix_stride = argument;
		break;

	case DecorationIndex:
		dec.index = argument;
		break;

	default:
		break;
	}
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x10, %rsp
movl %r8d, %ebx
movl %ecx, %r14d
movq %rdi, %r15
movl %esi, %eax
movq 0x30(%rdi), %rcx
imulq $0x148, %rax, %r12      # imm = 0x148
leaq 0xd0(%r12), %rdi
addq %rcx, %rdi
movq 0xd8(%rcx,%r12), %rax
subq 0xd0(%rcx,%r12), %rax
sarq $0x4, %rax
movabsq $0x4ec4ec4ec4ec4ec5, %rsi # imm = 0x4EC4EC4EC4EC4EC5
imulq %rax, %rsi
movl %edx, %r13d
leaq 0x1(%r13), %rax
cmpq %rax, %rsi
cmovbeq %rax, %rsi
callq 0x1bf8e
movq 0x30(%r15), %rax
imulq $0xd0, %r13, %r15
addq 0xd0(%rax,%r12), %r15
movl %r14d, 0x4(%rsp)
cmpl $0x3f, %r14d
ja 0x24b80
movl $0x1, %eax
movl %r14d, %ecx
shlq %cl, %rax
orq %rax, 0x60(%r15)
jmp 0x24b96
leaq 0x68(%r15), %rdi
leaq 0x8(%rsp), %rdx
movq %rdi, (%rdx)
leaq 0x4(%rsp), %rsi
callq 0x1fc02
cmpl $0x1d, %r14d
jle 0x24bbf
addl $-0x1e, %r14d
cmpl $0x5, %r14d
ja 0x24c16
leaq 0x91903(%rip), %rax     # 0xb64b0
movslq (%rax,%r14,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movl %ebx, 0xa4(%r15)
jmp 0x24c16
cmpl $0x1, %r14d
je 0x24c06
cmpl $0x7, %r14d
je 0x24c0f
cmpl $0xb, %r14d
jne 0x24c16
movb $0x1, 0xcc(%r15)
movl %ebx, 0xa0(%r15)
jmp 0x24c16
movl %ebx, 0xb0(%r15)
jmp 0x24c16
movl %ebx, 0xc8(%r15)
jmp 0x24c16
movl %ebx, 0xa8(%r15)
jmp 0x24c16
movl %ebx, 0xb4(%r15)
jmp 0x24c16
movl %ebx, 0xc4(%r15)
jmp 0x24c16
movl %ebx, 0xbc(%r15)
addq $0x10, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_cpp_makefile_star2_O1/rossy[P]crossc/SPIRV-Cross/spirv_cross_parsed_ir.cpp
// Function: spirv_cross::ParsedIR::mark_used_as_array_length(unsigned int)
void ParsedIR::mark_used_as_array_length(uint32_t id)
{
	switch (ids[id].get_type())
	{
	case TypeConstant:
		get<SPIRConstant>(id).is_used_as_array_length = true;
		break;

	case TypeConstantOp:
	{
		auto &cop = get<SPIRConstantOp>(id);
		for (uint32_t arg_id : cop.arguments)
			mark_used_as_array_length(arg_id);
		break;
	}

	case TypeUndef:
		break;

	default:
		assert(0);
	}
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movl %esi, %ecx
movq 0x18(%rdi), %rdi
shlq $0x4, %rcx
movl 0x8(%rdi,%rcx), %eax
cmpl $0xd, %eax
je 0x24c58
addq %rcx, %rdi
cmpl $0xa, %eax
je 0x24c5e
cmpl $0x3, %eax
jne 0x24c81
callq 0x1be66
movb $0x1, 0x109(%rax)
popq %rbx
popq %r14
popq %r15
retq
callq 0x25f0e
movq 0x10(%rax), %r14
movq 0x18(%rax), %r15
cmpq %r15, %r14
je 0x24c58
movl (%r14), %esi
movq %rbx, %rdi
callq 0x24c24
addq $0x4, %r14
jmp 0x24c6b
leaq 0x9ee7b(%rip), %rdi     # 0xc3b03
leaq 0x918c8(%rip), %rsi     # 0xb6557
leaq 0x918e7(%rip), %rcx     # 0xb657d
movl $0x113, %edx            # imm = 0x113
callq 0x61b0