// File: /workspace/github_c_makefile_star2_O0/markdryan[P]subtilis/frontend/parser_exp.c
// Function: subtilis_exp_get_lvalue_with_sym
bool subtilis_exp_get_lvalue_with_sym(subtilis_parser_t *p, subtilis_token_t *t,
				      const subtilis_type_t *stype,
				      const char *var_name, size_t mem_reg,
				      size_t loc, subtilis_ir_operand_t *op,
				      subtilis_type_t *type, bool is_reg,
				      subtilis_error_t *err)
{
	const char *tbuf;

	if (subtilis_type_if_is_numeric(stype) ||
	    (stype->type == SUBTILIS_TYPE_FN) ||
	    (stype->type == SUBTILIS_TYPE_STRING)) {
		subtilis_type_copy(type, stype, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return false;
		subtilis_lexer_get(p->l, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return false;

		if (is_reg) {
			op->reg = loc;
			return true;
		}
		op->reg = subtilis_reference_get_pointer(p, mem_reg, loc, err);

		return false;
	}

	if (stype->type == SUBTILIS_TYPE_REC) {
		subtilis_lexer_get(p->l, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return false;

		tbuf = subtilis_token_get_text(t);
		if ((t->type != SUBTILIS_TOKEN_OPERATOR) || strcmp(tbuf, ".")) {
			subtilis_type_copy(type, stype, err);
			if (err->type != SUBTILIS_ERROR_OK)
				return false;
			op->reg = subtilis_reference_get_pointer(p, mem_reg,
								 loc, err);
			return false;
		}

		/*
		 * Otherwise we have a record field.  We'll recursively call
		 * into this function via subtilis_parser_rec_field_lvalue.
		 */

		op->reg = subtilis_parser_rec_field_lvalue(p, t, stype, mem_reg,
							   loc, type, err);
		return false;
	}

	/*
	 * Need special handling for arrays and vectors
	 */

	if (subtilis_type_if_is_array(stype)) {
		op->reg = subtils_parser_array_lvalue(
		    p, t, stype, loc, var_name, mem_reg, type, err);
		subtilis_lexer_get(p->l, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return false;
		return false;
	}

	if (subtilis_type_if_is_vector(stype)) {
		op->reg = subtils_parser_vector_lvalue(
		    p, t, stype, loc, var_name, mem_reg, type, err);
		subtilis_lexer_get(p->l, t, err);
		if (err->type != SUBTILIS_ERROR_OK)
			return false;
		return false;
	}

	subtilis_error_set_assertion_failed(err);
	return false;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq 0x28(%rbp), %rax
movb 0x20(%rbp), %al
movq 0x18(%rbp), %r10
movq 0x10(%rbp), %r10
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
andb $0x1, %al
movb %al, -0x39(%rbp)
movq -0x20(%rbp), %rdi
callq 0x49d10
testb $0x1, %al
jne 0x240c7
movq -0x20(%rbp), %rax
cmpl $0x9, (%rax)
je 0x240c7
movq -0x20(%rbp), %rax
cmpl $0x7, (%rax)
jne 0x24152
movq 0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x3e4f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x240ea
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x133f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x24110
movb $0x0, -0x1(%rbp)
jmp 0x24337
testb $0x1, -0x39(%rbp)
je 0x2412a
movq -0x38(%rbp), %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movb $0x1, -0x1(%rbp)
jmp 0x24337
movq -0x10(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq 0x28(%rbp), %rcx
callq 0x6d920
movq %rax, %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x20(%rbp), %rax
cmpl $0x16, (%rax)
jne 0x24233
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x133f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x24185
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x18(%rbp), %rdi
callq 0x12d70
movq %rax, -0x48(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x241b0
movq -0x48(%rbp), %rdi
leaq 0x8636f(%rip), %rsi     # 0xaa515
callq 0x12140
cmpl $0x0, %eax
je 0x241fb
movq 0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x3e4f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x241d3
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x10(%rbp), %rdi
movq -0x30(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq 0x28(%rbp), %rcx
callq 0x6d920
movq %rax, %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x30(%rbp), %rcx
movq -0x38(%rbp), %r8
movq 0x18(%rbp), %r9
movq 0x28(%rbp), %rax
movq %rax, (%rsp)
callq 0x345d0
movq %rax, %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x20(%rbp), %rdi
callq 0x49ff0
testb $0x1, %al
jne 0x24242
jmp 0x242a9
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
movq 0x18(%rbp), %r10
movq 0x28(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x18010
movq %rax, %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x133f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x242a0
movb $0x0, -0x1(%rbp)
jmp 0x24337
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq -0x20(%rbp), %rdi
callq 0x4a040
testb $0x1, %al
jne 0x242b8
jmp 0x24319
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x38(%rbp), %rcx
movq -0x28(%rbp), %r8
movq -0x30(%rbp), %r9
movq 0x18(%rbp), %r10
movq 0x28(%rbp), %rax
movq %r10, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x18680
movq %rax, %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
movq 0x28(%rbp), %rdx
callq 0x133f0
movq 0x28(%rbp), %rax
cmpl $0x0, (%rax)
je 0x24313
movb $0x0, -0x1(%rbp)
jmp 0x24337
movb $0x0, -0x1(%rbp)
jmp 0x24337
movq 0x28(%rbp), %rdi
movl $0xf, %esi
leaq 0x865c3(%rip), %rdx     # 0xaa8ec
movl $0xd7, %ecx
callq 0x158e0
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x60, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)