LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_edef
void parse_edef(lexer *lx) {
	lex_adv(lx);

	//Read identifier if available
	char *tname = NULL;
	s_pos nloc, aloc;
	if (lex_peek(lx).type == TOK_IDENT) {
		tname = lex_peek(lx).dat.sval;
		nloc = lex_peek(lx).loc;
		lex_adv(lx);
	}

	//Read list of enumerations
	aloc = lex_peek(lx).loc;
	if (lex_peek(lx).type == TOK_LBR) {
		int e_val = 0;
		lex_adv(lx);
		token t = lex_peek(lx);
		while (t.type != TOK_RBR) {
			//Check for premature end of input
			if (t.type == TOK_END) {
				c_error(&aloc, "Expected '}' before end of input\n");
				break;
			}

			//Parse a single enumeration
			parse_enum(lx, &e_val);

			//Check for comma
			t = lex_peek(lx);
			if (t.type == TOK_IDENT) {
				c_error(&t.loc, "Expected ',' before identifier\n");
				continue;
			} else if (t.type != TOK_CMM && t.type != TOK_RBR) {
				c_error(&t.loc, "Invalid token in enum definition\n");
			}
			lex_adv(lx);
		}
	}

	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x178, %rsp            # imm = 0x178
movq %rdi, %rbx
callq 0x7a94
leaq 0x148(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x35, (%r14)
jne 0x8d45
leaq 0x118(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
leaq 0xe8(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
movq %rbx, %rdi
callq 0x7a94
leaq 0xb8(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movq 0x18(%r14), %rax
movq %rax, 0x50(%rsp)
movups 0x8(%r14), %xmm0
movaps %xmm0, 0x40(%rsp)
leaq 0x88(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x5, (%r14)
jne 0x8e4f
leaq 0xc(%rsp), %r14
movl $0x0, (%r14)
movq %rbx, %rdi
callq 0x7a94
leaq 0x10(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
leaq 0x18(%rsp), %r15
leaq 0x58(%rsp), %r12
leaq 0x5c7c(%rip), %r13      # 0xea36
leaq 0x5c95(%rip), %rbp      # 0xea56
movl 0x10(%rsp), %eax
cmpl $0x6, %eax
je 0x8e4f
testl %eax, %eax
je 0x8e3c
movq %rbx, %rdi
movq %r14, %rsi
callq 0x9765
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
movups 0x58(%rsp), %xmm0
movups 0x68(%rsp), %xmm1
movups 0x78(%rsp), %xmm2
movaps %xmm2, 0x30(%rsp)
movaps %xmm1, 0x20(%rsp)
movaps %xmm0, 0x10(%rsp)
movl 0x10(%rsp), %eax
cmpl $0x3, %eax
je 0x8e32
cmpl $0x6, %eax
je 0x8e32
movq %r15, %rdi
cmpl $0x35, %eax
jne 0x8e28
movq %r13, %rsi
xorl %eax, %eax
callq 0x3250
jmp 0x8dc1
movq %rbp, %rsi
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
jmp 0x8dc1
leaq 0x5bd1(%rip), %rsi      # 0xea14
leaq 0x40(%rsp), %rdi
xorl %eax, %eax
callq 0x3250
addq $0x178, %rsp            # imm = 0x178
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_decltr_ptr
s_type *parse_decltr_ptr(lexer *lx, s_type *base_type) {
	if (lex_peek(lx).type != TOK_ASR)
		return base_type;
	lex_adv(lx);

	//Clone the base type
	s_type *ptype = type_new(TYPE_PTR);

	//Parse qualifier list
	token t = lex_peek(lx);
	while (t.type == TOK_KW_CONST || t.type == TOK_KW_VOLATILE) {
		switch (t.type) {
			case TOK_KW_CONST: ptype->is_const = 1;	break;
			case TOK_KW_VOLATILE: ptype->is_volatile = 1; break;
		}
		lex_adv(lx);
	}

	ptype->ref = parse_decltr_ptr(lx, base_type);
	return ptype;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x68, %rsp
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x38(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x12, (%r15)
jne 0x8efa
movq %r14, %rdi
callq 0x7a94
movl $0x3, %edi
callq 0xbfcd
movq %rax, %r15
leaq 0x8(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
movl (%r12), %eax
leal -0x53(%rax), %ecx
cmpl $0x1, %ecx
ja 0x8ee9
cmpl $0x54, %eax
je 0x8ecd
cmpl $0x53, %eax
jne 0x8ed5
movl $0x1, 0x10(%r15)
jmp 0x8ed5
movl $0x1, 0x14(%r15)
movq %r14, %rdi
callq 0x7a94
movl 0x8(%rsp), %eax
leal -0x53(%rax), %ecx
cmpl $0x2, %ecx
jb 0x8eb9
movq %r14, %rdi
movq %rbx, %rsi
callq 0x8e61
movq %rax, 0x18(%r15)
jmp 0x8efd
movq %rbx, %r15
movq %r15, %rax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_decltr_back
s_type *parse_decltr_back(lexer *lx, s_type *base_type) {
	s_type *type = base_type;
	if (lex_peek(lx).type == TOK_LBK) {
		lex_adv(lx);

		type = type_new(TYPE_PTR);
		type->ref_len = parse_constexpr(lx);

		//Missing ']'
		token t = lex_peek(lx);
		if (t.type != TOK_RBK)
			c_error(&t.loc, "Missing ']' after array size\n");
		lex_adv(lx);

		//Currently parsing in wrong direction
		type->ref = parse_decltr_back(lx, base_type);
	} else if (lex_peek(lx).type == TOK_LPR) {
		lex_adv(lx);

		type = type_new(TYPE_FUNC);
		type->ret = base_type;

		if (lex_peek(lx).type != TOK_RPR)
			type->param = parse_fparam_list(lx);

		lex_adv(lx);
	}

	return type;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rsi, %r14
movq %rdi, %rbx
leaq 0x98(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x9, (%r15)
jne 0x8f9d
movq %rbx, %rdi
callq 0x7a94
movl $0x3, %edi
callq 0xbfcd
movq %rax, %r15
movq %rbx, %rdi
callq 0x9011
movl %eax, 0x20(%r15)
leaq 0x8(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0xa, (%r12)
je 0x8f84
leaq 0x10(%rsp), %rdi
leaq 0x58e6(%rip), %rsi      # 0xe863
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8f0c
movq %rax, 0x18(%r15)
jmp 0x8fff
leaq 0x68(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x7, (%r15)
jne 0x8ffc
movq %rbx, %rdi
callq 0x7a94
movl $0x4, %edi
callq 0xbfcd
movq %rax, %r15
movq %r14, 0x38(%rax)
leaq 0x38(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x8, (%r14)
je 0x8ff2
movq %rbx, %rdi
callq 0x9042
movq %rax, 0x28(%r15)
movq %rdx, 0x30(%r15)
movq %rbx, %rdi
callq 0x7a94
jmp 0x8fff
movq %r14, %r15
movq %r15, %rax
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_constexpr
int parse_constexpr(lexer *lx) {
	//Read constant expression
	ast_n *expr = parse_expr_cond(lx);
	
	//Evaluate the expression
	int err = 0;
	int res = eval_constexpr_ast(expr, &err);

	astn_del(expr);
	return res;
}

// Assembly:
pushq %rbp
pushq %rbx
pushq %rax
callq 0x98cb
movq %rax, %rbx
leaq 0x4(%rsp), %rsi
movl $0x0, (%rsi)
movq %rax, %rdi
callq 0x3dd8
movl %eax, %ebp
movq %rbx, %rdi
callq 0x35b1
movl %ebp, %eax
addq $0x8, %rsp
popq %rbx
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_fparam_list
vector parse_fparam_list(lexer *lx) {
	//Initialize vector
	vector params;
	vector_init(&params, VECTOR_EMPTY);

	//Return NULL for a blank list
	if (lex_peek(lx).type == TOK_RPR)
		return params;

	//Parse initial item
	s_param *p = parse_fparam(lx);
	vector_add(&params, p);

	//Parse multiple declarations
	while (lex_peek(lx).type == TOK_CMM) {
		lex_adv(lx);
		p = parse_fparam(lx);
		vector_add(&params, p);
	}

	return params;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x70, %rsp
movq %rdi, %rbx
movq %rsp, %rdi
xorl %esi, %esi
callq 0xc964
leaq 0x40(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x8, (%r14)
je 0x90cc
movq %rbx, %rdi
callq 0x9442
movq %rsp, %rdi
movq %rax, %rsi
callq 0xc9fa
leaq 0x10(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, (%r14)
jne 0x90cc
movq %rsp, %r14
leaq 0x10(%rsp), %r15
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0x9442
movq %r14, %rdi
movq %rax, %rsi
callq 0xc9fa
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, 0x10(%rsp)
je 0x909f
movq (%rsp), %rax
movq 0x8(%rsp), %rdx
addq $0x70, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_decltr
s_type *parse_decltr(lexer *lx, s_type *type, token *vname) {
	//Parse pointer types if applicable
	//s_type *ptr_type = parse_decltr_ptr(type);
	//if (ptr_type != type)
	//	return parse_decltr(ptr_type, vname);
	type = parse_decltr_ptr(lx, type); //should work the same?

	//If the asterisk is inside the parenthesis, it indicates that
	//the pointer is bound to what comes after it rather than the
	//preceeding base type
	if (lex_peek(lx).type == TOK_LPR) {
		lex_adv(lx);
		s_type *n_type = parse_decltr(lx, NULL, vname);
		
		//Missing ')'
		token t = lex_peek(lx);
		if (lex_peek(lx).type != TOK_RPR)
			c_error(&t.loc, "Missing ')' in declarator\n");
		lex_adv(lx);

		//Attach trailing array/func types to n_type
		s_type *b_type = parse_decltr_back(lx, type);
		if (n_type == NULL) {
			n_type = b_type;
		} else {
			for (s_type *i = n_type;; i = i->ref) {
				if (i->ref == NULL) {
					i->ref = b_type;
					break;
				}
			}
		}
		return n_type;
	}

	//Do not recurse to parse_decltr after this point
	//Read vname
	token t = lex_peek(lx);
	if (t.type == TOK_IDENT) {
		lex_adv(lx);
		*vname = t;
	}
	return parse_decltr_back(lx, type);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %rdx, %r15
movq %rdi, %rbx
callq 0x8e61
movq %rax, %r14
leaq 0x68(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x7, (%r12)
jne 0x918e
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
xorl %esi, %esi
movq %r15, %rdx
callq 0x90df
movq %rax, %r15
leaq 0x8(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
leaq 0x38(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x8, (%r12)
je 0x9161
leaq 0x10(%rsp), %rdi
leaq 0x5727(%rip), %rsi      # 0xe881
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8f0c
testq %r15, %r15
je 0x91d5
movq %r15, %rdx
movq %rdx, %rcx
movq 0x18(%rdx), %rdx
testq %rdx, %rdx
jne 0x917c
movq %rax, 0x18(%rcx)
jmp 0x91d8
leaq 0x8(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x35, (%r12)
jne 0x91ca
movq %rbx, %rdi
callq 0x7a94
movups 0x8(%rsp), %xmm0
movups 0x18(%rsp), %xmm1
movups 0x28(%rsp), %xmm2
movups %xmm2, 0x20(%r15)
movups %xmm1, 0x10(%r15)
movups %xmm0, (%r15)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8f0c
movq %rax, %r15
movq %r15, %rax
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_decl_init
ast_n *parse_decl_init(lexer *lx) {
	ast_n *node;
	if (lex_peek(lx).type == TOK_LBR) {
		//Read initializer list
		token lbr = lex_peek(lx);
		lex_adv(lx);
		node = parse_init_list(lx);

		//Optional ',' after list
		if (lex_peek(lx).type == TOK_CMM)
			lex_adv(lx);

		//Expect '}'
		token rbr = lex_peek(lx);
		if (rbr.type == TOK_RBR) {
			lex_adv(lx);
		} else if (rbr.type == TOK_END) {
			c_error(&lbr.loc, "Unexpected end of input in initializer\n");
		} else {
			c_error(&rbr.loc, "Expected '}' after initializer list\n");
		}
	} else {
		node = parse_expr_assign(lx);
	}

	return node;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0xc8, %rsp
movq %rdi, %rbx
leaq 0x98(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x5, (%r14)
jne 0x92b5
leaq 0x38(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0x91eb
leaq 0x68(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, (%r14)
jne 0x928f
movq %rbx, %rdi
callq 0x7a94
leaq 0x8(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r14), %eax
testl %eax, %eax
je 0x92bf
cmpl $0x6, %eax
jne 0x92cd
movq %rbx, %rdi
callq 0x7a94
jmp 0x92e0
movq %rbx, %rdi
callq 0x92ed
jmp 0x92e2
leaq 0x40(%rsp), %rdi
leaq 0x5618(%rip), %rsi      # 0xe8e3
jmp 0x92d9
leaq 0x10(%rsp), %rdi
leaq 0x5632(%rip), %rsi      # 0xe90b
xorl %eax, %eax
callq 0x3250
xorl %eax, %eax
addq $0xc8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_assign
ast_n *parse_expr_assign(lexer *lx) {
	ast_n *node = parse_expr_cond(lx);

	//lhs must be unary_expr
	ast_n *n_node;
	int atype = 0;
	switch (lex_peek(lx).type) {
		case TOK_ASSIGN_ADD: atype = EXPR_ADD; goto base;
		case TOK_ASSIGN_SUB: atype = EXPR_SUB; goto base;
		case TOK_ASSIGN_MUL: atype = EXPR_MUL; goto base;
		case TOK_ASSIGN_DIV: atype = EXPR_DIV; goto base;
		case TOK_ASSIGN_MOD: atype = EXPR_MOD; goto base;
		case TOK_ASSIGN_AND: atype = EXPR_AND; goto base;
		case TOK_ASSIGN_OR: atype = EXPR_OR; goto base;
		case TOK_ASSIGN_XOR: atype = EXPR_XOR; goto base;
		case TOK_ASSIGN_LSHIFT: atype = EXPR_LSHIFT; goto base;
		case TOK_ASSIGN_RSHIFT: atype = EXPR_RSHIFT; goto base;

		case TOK_ASSIGN: {
base:			n_node = astn_new(EXPR, EXPR_ASSIGN, lex_peek(lx));
			lex_adv(lx);
			ast_expr *n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_assign(lx);
			break;
			}

		default:
			return node;
	}

	//Expand assignment
	if (atype) {
		ast_n *opr = astn_new(EXPR, atype, lex_peek(lx));
		opr->dat.expr.left = node;
		opr->dat.expr.right = n_node->dat.expr.right;
		n_node->dat.expr.right = opr;
	}

	return n_node;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc0, %rsp
movq %rdi, %r14
callq 0x98cb
movq %rax, %rbx
leaq 0x90(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
movl (%r15), %eax
addl $-0x27, %eax
cmpl $0xa, %eax
ja 0x943d
leaq 0x5300(%rip), %rcx      # 0xe630
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
xorl %ebp, %ebp
movb $0x1, %r12b
jmp 0x9387
movl $0x13, %ebp
jmp 0x9384
movl $0xc, %ebp
jmp 0x9384
movl $0x11, %ebp
jmp 0x9384
movl $0x12, %ebp
jmp 0x9384
movl $0x5, %ebp
jmp 0x9384
movl $0x10, %ebp
jmp 0x9384
movl $0x14, %ebp
jmp 0x9384
movl $0x7, %ebp
jmp 0x9384
movl $0xd, %ebp
jmp 0x9384
movl $0x6, %ebp
xorl %r12d, %r12d
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
xorl %esi, %esi
callq 0x356c
movq %rax, %r15
movq %r14, %rdi
callq 0x7a94
movq %rbx, 0x20(%r15)
movq %r14, %rdi
callq 0x92ed
movq %rax, 0x28(%r15)
testb %r12b, %r12b
jne 0x942a
leaq 0x30(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups 0x20(%r12), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl %ebp, %esi
callq 0x356c
movq %rbx, 0x20(%rax)
movq 0x28(%r15), %rcx
movq %rcx, 0x28(%rax)
movq %rax, 0x28(%r15)
movq %r15, %rax
addq $0xc0, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq %rbx, %r15
jmp 0x942a
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_fparam
s_param *parse_fparam(lexer *lx) {
	//Parse type
	token vname = {0};
	s_type *base_type = parse_decl_spec(lx);

	//Parse declarator
	s_type *type = parse_decltr(lx, base_type, &vname);

	//Create parameter and return
	return param_new(type, vname.dat.sval);
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
xorps %xmm0, %xmm0
movq %rsp, %r14
movaps %xmm0, 0x20(%r14)
movaps %xmm0, 0x10(%r14)
movaps %xmm0, (%r14)
callq 0x85f2
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x90df
movq 0x20(%r14), %rsi
movq %rax, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xc476
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_stmt_cmpd
ast_n *parse_stmt_cmpd(lexer *lx) {
	//Expect '{'
	token t = lex_peek(lx);
	if (t.type == TOK_LBR)
		lex_adv(lx);

	//Parse list of declarations/statements here
	ast_n *base = NULL;
	ast_n *last = NULL;
	while (lex_peek(lx).type != TOK_RBR) {
		//Premature end of file
		token t = lex_peek(lx);
		if (t.type == TOK_END) {
			c_error(&t.loc, "Expected '}' before end of input!\n");
			break;
		}

		//Parse a statement or a declaration
		ast_n *node;
		if (is_type_spec(lx, lex_peek(lx))) {
			node = parse_decl(lx);
		} else {
			node = parse_stmt(lx);
		}
		if (node == NULL) continue;

		//Add the node to the list
		if (base == NULL) {
			base = node;
		} else {
			last->next = node;
		}

		//Move to the end of the list
		//If node already has a next, move to the end of it
		if (node != NULL) {
			last = node;
			while (last->next != NULL)
				last = last->next;
		}
	}

	//Expect '}'
	if (lex_peek(lx).type == TOK_RBR)
		lex_adv(lx);

	ast_n *head = astn_new(STMT, STMT_CMPD, t);
	head->next = base;
	return head;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x128, %rsp            # imm = 0x128
movq %rdi, %rbx
leaq 0x68(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x5, (%r14)
jne 0x94b8
movq %rbx, %rdi
callq 0x7a94
leaq 0xc8(%rsp), %r15
leaq 0x98(%rsp), %r12
xorl %r14d, %r14d
xorl %r13d, %r13d
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x6, 0xc8(%rsp)
je 0x9585
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
movl 0x98(%rsp), %ebp
testl %ebp, %ebp
je 0x953d
leaq 0x38(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
movups 0x38(%rsp), %xmm0
movups 0x48(%rsp), %xmm1
movups 0x58(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movq %rbx, %rdi
callq 0x7c69
movq %rbx, %rdi
testl %eax, %eax
je 0x9555
callq 0x8373
jmp 0x955a
leaq 0xa0(%rsp), %rdi
leaq 0x56cf(%rip), %rsi      # 0xec1b
xorl %eax, %eax
callq 0x3250
jmp 0x957d
callq 0xa846
testq %rax, %rax
je 0x957d
movq %rax, %rcx
testq %r13, %r13
je 0x956e
movq %rax, 0x60(%r14)
movq %r13, %rcx
movq %rax, %r14
movq 0x60(%rax), %rax
testq %rax, %rax
jne 0x956e
movq %rcx, %r13
testl %ebp, %ebp
jne 0x94ce
leaq 0xf8(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x6, (%r14)
jne 0x95a6
movq %rbx, %rdi
callq 0x7a94
movups 0x68(%rsp), %xmm0
movups 0x78(%rsp), %xmm1
movups 0x88(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x2, %edi
movl $0x1, %esi
callq 0x356c
movq %r13, 0x60(%rax)
addq $0x128, %rsp            # imm = 0x128
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_sdef_body
vector parse_sdef_body(lexer *lx) {
	//Advance past '{'
	lex_adv(lx);

	//Parse list of declarations
	vector memb;
	vector_init(&memb, VECTOR_EMPTY);
	while (lex_peek(lx).type != TOK_RBR) {
		if (lex_peek(lx).type == TOK_END) {
			c_error(&lx->tgt->loc, "Expected '}' before end of file\n");
		}

		//Get type
		//TODO: no type classes when parsing for specifier
		token mname = {0};
		s_type *base_type = parse_decl_spec(lx);

		//Parse declarator
		//TODO: bitfields
		s_type *mtype = parse_decltr(lx, type_clone(base_type), &mname);
		if (mname.dat.sval != NULL) {
			//Create new member
			s_param *m = param_new(mtype, mname.dat.sval);
			vector_add(&memb, m);
		} else {
			c_error(&mname.loc, "Declaration declares nothing\n");
		}
		type_del(base_type);

		//Expect ';'
		token t = lex_peek(lx);
		if (t.type != TOK_SEM)
			c_error(&t.loc, "Missing ';' after member definition\n");
		lex_adv(lx);
	}

	//Missing '}'
	token t = lex_peek(lx);
	if (t.type != TOK_RBR)
		c_error(&t.loc, "Missing '}' after struct/union declaration\n");
	lex_adv(lx);

	return memb;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xd8, %rsp
movq %rdi, %rbx
callq 0x7a94
movq %rsp, %rdi
xorl %esi, %esi
callq 0xc964
leaq 0x78(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x6, (%r14)
je 0x9719
leaq 0xa8(%rsp), %r12
leaq 0x10(%rsp), %rbp
leaq 0x48(%rsp), %r13
leaq 0x78(%rsp), %r14
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x0, 0xa8(%rsp)
jne 0x9669
movq (%rbx), %rdi
addq $0x28, %rdi
leaq 0x52e4(%rip), %rsi      # 0xe946
xorl %eax, %eax
callq 0x3250
xorps %xmm0, %xmm0
movaps %xmm0, 0x30(%rsp)
movaps %xmm0, 0x20(%rsp)
movaps %xmm0, 0x10(%rsp)
movq %rbx, %rdi
callq 0x85f2
movq %rax, %r15
movq %rax, %rdi
callq 0xc35c
movq %rbx, %rdi
movq %rax, %rsi
movq %rbp, %rdx
callq 0x90df
movq 0x30(%rsp), %rsi
testq %rsi, %rsi
je 0x96bb
movq %rax, %rdi
callq 0xc476
movq %rsp, %rdi
movq %rax, %rsi
callq 0xc9fa
jmp 0x96ce
leaq 0x18(%rsp), %rdi
leaq 0x5051(%rip), %rsi      # 0xe718
xorl %eax, %eax
callq 0x3250
movq %r15, %rdi
callq 0xc2c4
movq %r13, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x1, 0x48(%rsp)
je 0x96fb
leaq 0x50(%rsp), %rdi
leaq 0x5273(%rip), %rsi      # 0xe967
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x6, 0x78(%rsp)
jne 0x963f
leaq 0x10(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x6, (%r14)
je 0x9742
leaq 0x18(%rsp), %rdi
leaq 0x5251(%rip), %rsi      # 0xe98c
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
movq (%rsp), %rax
movq 0x8(%rsp), %rdx
addq $0xd8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_enum
void parse_enum(lexer *lx, int *val) {
	//Read name
	token t = lex_peek(lx);
	if (t.type != TOK_IDENT) {
		c_error(&t.loc, "Invalid input in enumeration\n");
		return;
	}
	lex_adv(lx);

	//Read optional expression
	if (lex_peek(lx).type == TOK_ASSIGN) {
		lex_adv(lx);
		*val = parse_constexpr(lx);
	}

	//Define a macro for the enumeration
	char buf[64];
	snprintf(buf, 64, "%i", *val);
	symbol *sym = symtable_def(lx->stb, t.dat.sval, type_new(TYPE_MACRO), &t.loc);

	//Copy the expansion to a new string
	char *exp = malloc(strlen(buf)+1);
	strncpy(exp, buf, strlen(buf));
	sym->mac_exp = exp;
	
	(*val)++;
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xa0, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movq %rsp, %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x35, (%r15)
jne 0x9839
movq %r14, %rdi
callq 0x7a94
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x27, (%r15)
jne 0x97c3
movq %r14, %rdi
callq 0x7a94
movq %r14, %rdi
callq 0x9011
movl %eax, (%rbx)
movl (%rbx), %ecx
leaq 0x3d2a(%rip), %rdx      # 0xd4f6
leaq 0x60(%rsp), %r15
movl $0x40, %esi
movq %r15, %rdi
xorl %eax, %eax
callq 0x30d0
movq 0x60(%r14), %r14
leaq 0x8(%rsp), %r12
movq 0x18(%r12), %r13
movl $0x1, %edi
callq 0xbfcd
movq %r14, %rdi
movq %r13, %rsi
movq %rax, %rdx
movq %r12, %rcx
callq 0xbf25
movq %rax, %r14
movq %r15, %rdi
callq 0x30b0
movq %rax, %r12
leaq 0x1(%rax), %rdi
callq 0x3170
movq %rax, %r13
movq %rax, %rdi
movq %r15, %rsi
movq %r12, %rdx
callq 0x3060
movq %r13, 0x48(%r14)
incl (%rbx)
jmp 0x984c
leaq 0x8(%rsp), %rdi
leaq 0x51b1(%rip), %rsi      # 0xe9f6
xorl %eax, %eax
callq 0x3250
addq $0xa0, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr
ast_n *parse_expr(lexer *lx) {
	ast_n *node = parse_expr_assign(lx);

	ast_n *n_node = node;
	while (lex_peek(lx).type == TOK_CMM) {
		lex_adv(lx);
		n_node->next = parse_expr_assign(lx);
		n_node = n_node->next;
	}

	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x30, %rsp
movq %rdi, %rbx
callq 0x92ed
movq %rax, %r14
movq %rsp, %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, (%r15)
jne 0x98ba
movq %rsp, %r15
movq %r14, %r13
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0x92ed
movq %rax, %r12
movq %rax, 0x60(%r13)
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, (%rsp)
movq %r12, %r13
je 0x988f
movq %r14, %rax
addq $0x30, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_cond
ast_n *parse_expr_cond(lexer *lx) {
	ast_n *node = parse_expr_logic_or(lx);

	if (lex_peek(lx).type == TOK_QMK) {
		//Construct ternary node
		ast_n *n_node = astn_new(EXPR, EXPR_COND, lex_peek(lx));
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		lex_adv(lx);

		//Read left result and check for ';'
		ast_n *res_true = parse_expr(lx);
		token t = lex_peek(lx);
		if (t.type != TOK_COL)
			c_error(&t.loc, "Expected ':' in ternary expression\n");
		lex_adv(lx);

		//Read right result and construct result node
		ast_n *res = astn_new(EXPR, EXPR_COND_RES, t);
		ast_n *res_false = parse_expr_cond(lx);
		res->dat.expr.left = res_true;
		res->dat.expr.right = res_false;
		n_expr->right = res;
		return n_node;
	}

	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rdi, %rbx
callq 0x99e4
movq %rax, %r15
leaq 0x98(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0xf, (%r14)
jne 0x99cf
leaq 0x68(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups 0x20(%r14), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x3, %esi
callq 0x356c
movq %rax, %r14
movq %r15, 0x20(%rax)
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0x985d
movq %rax, %r15
leaq 0x38(%rsp), %r12
movq %r12, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x2, (%r12)
je 0x9980
leaq 0x40(%rsp), %rdi
leaq 0x50ff(%rip), %rsi      # 0xea78
xorl %eax, %eax
callq 0x3250
movq %rbx, %rdi
callq 0x7a94
movups 0x38(%rsp), %xmm0
movups 0x48(%rsp), %xmm1
movups 0x58(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x4, %esi
callq 0x356c
movq %rax, %r12
movq %rbx, %rdi
callq 0x98cb
movq %r15, 0x20(%r12)
movq %rax, 0x28(%r12)
movq %r12, 0x28(%r14)
jmp 0x99d2
movq %r15, %r14
movq %r14, %rax
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_logic_or
ast_n *parse_expr_logic_or(lexer *lx) {
	ast_n *node = parse_expr_logic_and(lx);

	if (lex_peek(lx).type == TOK_LOGIC_OR) {
		ast_n *n_node = astn_new(EXPR, EXPR_LOGIC_OR, lex_peek(lx));
		lex_adv(lx);
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		n_expr->right = parse_expr_logic_and(lx);
		return n_node;
	}
	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x90, %rsp
movq %rdi, %rbx
callq 0x9a7a
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x1f, (%r15)
jne 0x9a6a
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x1, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9a7a
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x90, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_logic_and
ast_n *parse_expr_logic_and(lexer *lx) {
	ast_n *node = parse_expr_or(lx);

	if (lex_peek(lx).type == TOK_LOGIC_AND) {
		ast_n *n_node = astn_new(EXPR, EXPR_LOGIC_AND, lex_peek(lx));
		lex_adv(lx);
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		n_expr->right = parse_expr_or(lx);
		return n_node;
	}
	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x90, %rsp
movq %rdi, %rbx
callq 0x9b10
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x20, (%r15)
jne 0x9b00
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x2, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9b10
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x90, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_or
ast_n *parse_expr_or(lexer *lx) {
	ast_n *node = parse_expr_xor(lx);

	if (lex_peek(lx).type == TOK_OR) {
		ast_n *n_node = astn_new(EXPR, EXPR_OR, lex_peek(lx));
		lex_adv(lx);
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		n_expr->right = parse_expr_xor(lx);
		return n_node;
	}
	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x90, %rsp
movq %rdi, %rbx
callq 0x9ba6
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x16, (%r15)
jne 0x9b96
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x5, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9ba6
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x90, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_xor
ast_n *parse_expr_xor(lexer *lx) {
	ast_n *node = parse_expr_and(lx);

	if (lex_peek(lx).type == TOK_XOR) {
		ast_n *n_node = astn_new(EXPR, EXPR_XOR, lex_peek(lx));
		lex_adv(lx);
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		n_expr->right = parse_expr_and(lx);
		return n_node;
	}
	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x90, %rsp
movq %rdi, %rbx
callq 0x9c3c
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x17, (%r15)
jne 0x9c2c
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x6, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9c3c
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x90, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_and
ast_n *parse_expr_and(lexer *lx) {
	ast_n *node = parse_expr_equal(lx);

	if (lex_peek(lx).type == TOK_AND) {
		ast_n *n_node = astn_new(EXPR, EXPR_AND, lex_peek(lx));
		lex_adv(lx);
		ast_expr *n_expr = &n_node->dat.expr;
		n_expr->left = node;
		n_expr->right = parse_expr_equal(lx);
		return n_node;
	}
	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x90, %rsp
movq %rdi, %rbx
callq 0x9cd2
movq %rax, %r14
leaq 0x60(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x15, (%r15)
jne 0x9cc2
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x7, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9cd2
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x90, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_equal
ast_n *parse_expr_equal(lexer *lx) {
	ast_n *node = parse_expr_relation(lx);

	ast_n *n_node;
	ast_expr *n_expr;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_EQ:
			n_node = astn_new(EXPR, EXPR_EQ, t);
			lex_adv(lx);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_relation(lx);
			return n_node;
		case TOK_NEQ:
			n_node = astn_new(EXPR, EXPR_NEQ, t);
			lex_adv(lx);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_relation(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x60, %rsp
movq %rdi, %rbx
callq 0x9d61
movq %rax, %r14
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r15), %eax
cmpl $0x1d, %eax
je 0x9d0a
cmpl $0x1e, %eax
jne 0x9d54
movl $0xf, %esi
jmp 0x9d0f
movl $0xe, %esi
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9d61
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x60, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_relation
ast_n *parse_expr_relation(lexer *lx) {
	ast_n *node = parse_expr_shift(lx);

	ast_n *n_node;
	ast_expr *n_expr;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_LTH:
			n_node = astn_new(EXPR, EXPR_LTH, t);
			lex_adv(lx);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_shift(lx);
			return n_node;
		case TOK_GTH:
			n_node = astn_new(EXPR, EXPR_GTH, t);
			lex_adv(lx);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_shift(lx);
			return n_node;
		case TOK_LEQ:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_LEQ, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_shift(lx);
			return n_node;
		case TOK_GEQ:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_GEQ, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_shift(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x60, %rsp
movq %rdi, %rbx
callq 0x9e91
movq %rax, %r14
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r15), %eax
addl $-0x19, %eax
cmpl $0x3, %eax
ja 0x9e84
leaq 0x48c1(%rip), %rcx      # 0xe65c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x9, %esi
jmp 0x9e61
movq %rbx, %rdi
callq 0x7a94
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0xb, %esi
jmp 0x9e30
movq %rbx, %rdi
callq 0x7a94
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0xa, %esi
callq 0x356c
movq %rax, %r15
jmp 0x9e71
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x8, %esi
callq 0x356c
movq %rax, %r15
movq %rbx, %rdi
callq 0x7a94
movq %r14, 0x20(%r15)
movq %rbx, %rdi
callq 0x9e91
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x60, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_shift
ast_n *parse_expr_shift(lexer *lx) {
	ast_n *node = parse_expr_addt(lx);

	ast_n *n_node;
	ast_expr *n_expr;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_LSHIFT:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_LSHIFT, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_addt(lx);
			return n_node;
		case TOK_RSHIFT:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_RSHIFT, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_addt(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x68, %rsp
movq %rdi, %rbx
callq 0x9f24
movq %rax, %r14
leaq 0x38(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r15), %eax
cmpl $0x25, %eax
je 0x9eca
cmpl $0x26, %eax
jne 0x9f16
movl $0xd, %ebp
jmp 0x9ecf
movl $0xc, %ebp
movq %rbx, %rdi
callq 0x7a94
movups 0x38(%rsp), %xmm0
movups 0x48(%rsp), %xmm1
movups 0x58(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl %ebp, %esi
callq 0x356c
movq %rax, %r15
movq %r14, 0x20(%rax)
movq %rbx, %rdi
callq 0x9f24
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x68, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_addt
ast_n *parse_expr_addt(lexer *lx) {
	ast_n *node = parse_expr_mult(lx);

	ast_n *n_node;
	ast_expr *n_expr;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_ADD:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_ADD, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_addt(lx);
			return n_node;
		case TOK_SUB:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_SUB, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_addt(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x68, %rsp
movq %rdi, %rbx
callq 0x9fab
movq %rax, %r14
leaq 0x38(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r15), %ebp
movl %ebp, %eax
andl $-0x2, %eax
cmpl $0x10, %eax
jne 0x9f9d
movq %rbx, %rdi
callq 0x7a94
movups 0x38(%rsp), %xmm0
movups 0x48(%rsp), %xmm1
movups 0x58(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl %ebp, %esi
callq 0x356c
movq %rax, %r15
movq %r14, 0x20(%rax)
movq %rbx, %rdi
callq 0x9f24
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x68, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_mult
ast_n *parse_expr_mult(lexer *lx) {
	ast_n *node = parse_expr_cast(lx);

	ast_n *n_node;
	ast_expr *n_expr;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_ASR:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_MUL, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_cast(lx);
			return n_node;
		case TOK_DIV:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_DIV, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_cast(lx);
			return n_node;
		case TOK_MOD:
			lex_adv(lx);
			n_node = astn_new(EXPR, EXPR_MOD, t);
			n_expr = &n_node->dat.expr;
			n_expr->left = node;
			n_expr->right = parse_expr_cast(lx);
			return n_node;
	}

	return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x60, %rsp
movq %rdi, %rbx
callq 0xa030
movq %rax, %r14
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r15), %r15d
leal -0x12(%r15), %eax
cmpl $0x2, %eax
ja 0xa023
movq %rbx, %rdi
callq 0x7a94
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl %r15d, %esi
callq 0x356c
movq %rax, %r15
movq %r14, 0x20(%rax)
movq %rbx, %rdi
callq 0xa030
movq %rax, 0x28(%r15)
movq %r15, %r14
movq %r14, %rax
addq $0x60, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_cast
ast_n *parse_expr_cast(lexer *lx) {
	ast_n *node = parse_expr_unary(lx);
	
	ast_n *n_node;
	token t = lex_peek(lx);
	if (t.type == TOK_LPR) {
		lex_adv(lx);
		
		//Parse type
		token vname = BLANK_TOKEN;
		s_type *base_type = parse_decl_spec(lx);
		s_type *type = parse_decltr(lx, base_type, &vname);
		
		//Ensure the type didn't contain a variable name
		if (vname.type != -1)
			c_error(&vname.loc, "Unexpected identifier in cast expression\n");

		//Check for ')'
		token t = lex_peek(lx);
		if (t.type != TOK_RPR)
			c_error(&t.loc, "Missing ')' after parameter list\n");
		lex_adv(lx);

		//Parse following the type cast
		ast_n *n_node = astn_new(EXPR, EXPR_CAST, t);
		n_node->dat.expr.type = type;
		n_node->dat.expr.left = parse_expr_cast(lx);

		//Join to results of parse_expr_unary if needed
		//If the operation is a reference or inc/dec, flag an error
		if (node != NULL) {
			ast_expr *n_expr = &node->dat.expr;
			if (n_expr->kind == EXPR_INC_PRE)
				c_error(NULL, "lvalue required for pre-increment\n");
			if (n_expr->kind == EXPR_DEC_PRE)
				c_error(NULL, "lvalue required for pre-decrement\n");
			if (n_expr->kind == EXPR_REF)
				c_error(NULL, "lvalue required for reference operation\n");
			n_expr->left = n_node;
			return node;
		}
		return n_node;
	}
	
	return node; 
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rdi, %r14
callq 0xa197
movq %rax, %rbx
leaq 0x98(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x7, (%r15)
jne 0xa185
movq %r14, %rdi
callq 0x7a94
leaq 0xa3c3(%rip), %rax      # 0x14438
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups 0x20(%rax), %xmm2
leaq 0x60(%rsp), %r15
movaps %xmm2, 0x20(%r15)
movaps %xmm1, 0x10(%r15)
movaps %xmm0, (%r15)
movq %r14, %rdi
callq 0x85f2
movq %r14, %rdi
movq %rax, %rsi
movq %r15, %rdx
callq 0x90df
movq %rax, %r12
cmpl $-0x1, (%r15)
je 0xa0c5
leaq 0x68(%rsp), %rdi
leaq 0x49de(%rip), %rsi      # 0xea9c
xorl %eax, %eax
callq 0x3250
leaq 0x30(%rsp), %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x8, (%r15)
je 0xa0ee
leaq 0x38(%rsp), %rdi
leaq 0x49df(%rip), %rsi      # 0xeac6
xorl %eax, %eax
callq 0x3250
movq %r14, %rdi
callq 0x7a94
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl $0x15, %esi
callq 0x356c
movq %rax, %r15
movq %r12, 0x10(%rax)
movq %r14, %rdi
callq 0xa030
movq %rax, 0x20(%r15)
testq %rbx, %rbx
je 0xa182
cmpl $0x1c, 0x8(%rbx)
jne 0xa150
leaq 0x49a1(%rip), %rsi      # 0xeae8
xorl %edi, %edi
xorl %eax, %eax
callq 0x3250
cmpl $0x1d, 0x8(%rbx)
jne 0xa166
leaq 0x49ae(%rip), %rsi      # 0xeb0b
xorl %edi, %edi
xorl %eax, %eax
callq 0x3250
cmpl $0x16, 0x8(%rbx)
jne 0xa17c
leaq 0x49bb(%rip), %rsi      # 0xeb2e
xorl %edi, %edi
xorl %eax, %eax
callq 0x3250
movq %r15, 0x20(%rbx)
jmp 0xa185
movq %r15, %rbx
movq %rbx, %rax
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_unary
ast_n *parse_expr_unary(lexer *lx) {
	ast_n *n_node = NULL;
	token t = lex_peek(lx);
	switch (t.type) {
		case TOK_AND: lex_adv(lx); n_node = astn_new(EXPR, EXPR_REF, t); 	break;
		case TOK_ASR: lex_adv(lx); n_node = astn_new(EXPR, EXPR_DEREF, t); 	break;
		case TOK_ADD: lex_adv(lx); n_node = astn_new(EXPR, EXPR_POS, t); 	break;
		case TOK_SUB: lex_adv(lx); n_node = astn_new(EXPR, EXPR_NEG, t); 	break;
		case TOK_NOT: lex_adv(lx); n_node = astn_new(EXPR, EXPR_LOGIC_NOT, t); 	break;
		case TOK_TLD: lex_adv(lx); n_node = astn_new(EXPR, EXPR_NOT, t); 	break;
		case TOK_INC: lex_adv(lx); n_node = astn_new(EXPR, EXPR_INC_PRE, t);	break;
		case TOK_DEC: lex_adv(lx); n_node = astn_new(EXPR, EXPR_DEC_PRE, t); 	break;
		//TODO case TOK_KW_SIZEOF:
	}

	ast_n *node = parse_expr_postfix(lx);
	if (n_node != NULL) {
		n_node->dat.expr.left = node;
		return n_node;
	}

	return node;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x60, %rsp
movq %rdi, %rbx
leaq 0x30(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r14), %eax
addl $-0x10, %eax
cmpl $0x13, %eax
ja 0xa209
movl $0xe0127, %ecx          # imm = 0xE0127
btl %eax, %ecx
jae 0xa209
movl %eax, %eax
leaq 0x44e0(%rip), %rcx      # 0xe6b0
movl (%rcx,%rax,4), %ebp
movq %rbx, %rdi
callq 0x7a94
movups 0x30(%rsp), %xmm0
movups 0x40(%rsp), %xmm1
movups 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x1, %edi
movl %ebp, %esi
callq 0x356c
movq %rax, %r14
jmp 0xa20c
xorl %r14d, %r14d
movq %rbx, %rdi
callq 0xa22e
testq %r14, %r14
je 0xa21f
movq %rax, 0x20(%r14)
jmp 0xa222
movq %rax, %r14
movq %r14, %rax
addq $0x60, %rsp
popq %rbx
popq %r14
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_expr_arglist
ast_n *parse_expr_arglist(lexer *lx) {
	ast_n *node = parse_expr_assign(lx);

	//Arguments will be evaluated in reverse order, so the list will be backwards
	ast_n *head = node;
	while (lex_peek(lx).type == TOK_CMM) {
		lex_adv(lx);
		node = parse_expr_assign(lx);
		node->next = head;
		head = node;
	}

	return head;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
callq 0x92ed
movq %rax, %r14
leaq 0x8(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, (%r15)
jne 0xa624
leaq 0x8(%rsp), %r15
movq %rbx, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0x92ed
movq %rax, %r12
movq %r14, 0x60(%rax)
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x3, 0x8(%rsp)
movq %r12, %r14
je 0xa5f6
jmp 0xa627
movq %r14, %r12
movq %r12, %rax
addq $0x38, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse_stmt
ast_n *parse_stmt(lexer *lx) {
	ast_n *node;
	switch (lex_peek(lx).type) {
		case TOK_KW_IF:
		case TOK_KW_SWITCH:
			node = parse_stmt_selection(lx);
			break;
		case TOK_KW_WHILE:
		case TOK_KW_FOR:
		case TOK_KW_DO:
			node = parse_stmt_iteration(lx);
			break;
		case TOK_KW_CASE:
		case TOK_KW_DEFAULT:
			node = parse_stmt_label(lx);
			break;
		case TOK_KW_GOTO:
		case TOK_KW_BREAK:
		case TOK_KW_CONTINUE:
		case TOK_KW_RETURN:
			node = parse_stmt_jump(lx);
			break;
		case TOK_LBR:
			node = parse_stmt_cmpd(lx);
			break;
		case TOK_IDENT: {
			//Check for label
			//TODO: clean
			token_n *tn = make_tok_node(lex_peek(lx));
			lex_adv(lx);
			token t = lex_peek(lx);
			lex_unget(lx, make_tok_node(t));
			lex_unget(lx, tn);
			if (t.type == TOK_COL) {
				node = parse_stmt_label(lx);
				break;
			}
			} //Fall through
		default:
			node = parse_stmt_expr(lx);
			break;
	}
	return node;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0xc8, %rsp
movq %rdi, %rbx
leaq 0x98(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movl (%r14), %ecx
leal -0x35(%rcx), %eax
cmpl $0xc, %eax
ja 0xa8b8
leaq 0x3df1(%rip), %rcx      # 0xe66c
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rbx, %rdi
callq 0xac9d
jmp 0xa96e
movq %rbx, %rdi
callq 0xaace
jmp 0xa96e
movq %rbx, %rdi
callq 0xab36
jmp 0xa96e
movq %rbx, %rdi
callq 0xa97c
jmp 0xa96e
cmpl $0x5, %ecx
jne 0xa966
movq %rbx, %rdi
callq 0x9486
jmp 0xa96e
leaq 0x68(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups 0x20(%r14), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
callq 0x7ca7
movq %rax, %r14
movq %rbx, %rdi
callq 0x7a94
leaq 0x38(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
callq 0x7a57
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups 0x20(%r15), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
callq 0x7ca7
movq %rbx, %rdi
movq %rax, %rsi
callq 0x7c3b
movq %rbx, %rdi
movq %r14, %rsi
callq 0x7c3b
movl (%r15), %ebp
cmpl $0x2, %ebp
jne 0xa961
movq %rbx, %rdi
callq 0xab36
cmpl $0x2, %ebp
je 0xa96e
movq %rbx, %rdi
callq 0xaeb3
addq $0xc8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq