LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_init
lexer *lexer_init(symtable *stb, char *fname) {
	lexer *lx = malloc(sizeof(struct LEXER));
	lx->tgt = NULL;
	lx->pre = NULL;
	lx->ahead = BLANK_TOKEN;
	vector_init(&lx->flist, VECTOR_EMPTY);
	vector_init(&lx->conds, VECTOR_EMPTY);
	lx->stb = stb;

	if (!lex_open_file(lx, fname)) {
		c_error(NULL, "Unable to open file '%s': ", fname);
		fflush(stderr);
		perror(NULL);
		free(lx);
		return NULL;
	}
	lx->m_exp = 1;
	lx->m_cexpr = 0;

	return lx;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl $0x70, %edi
callq 0x3190
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq $0x0, (%rax)
movq -0x20(%rbp), %rax
movq $0x0, 0x8(%rax)
movq -0x20(%rbp), %rdi
addq $0x10, %rdi
leaq 0x106b4(%rip), %rsi     # 0x17468
movl $0x30, %edx
callq 0x3160
movq -0x20(%rbp), %rdi
addq $0x40, %rdi
xorl %esi, %esi
callq 0x10680
movq -0x20(%rbp), %rdi
addq $0x50, %rdi
xorl %esi, %esi
callq 0x10680
movq -0x10(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x60(%rax)
movq -0x20(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x6e70
cmpl $0x0, %eax
jne 0x6e3b
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %edi
leaq 0xb0d3(%rip), %rsi      # 0x11edc
movb $0x0, %al
callq 0x3880
movq 0x101d9(%rip), %rax     # 0x16ff0
movq (%rax), %rdi
callq 0x31a0
xorl %eax, %eax
movl %eax, %edi
callq 0x31f0
movq -0x20(%rbp), %rdi
callq 0x3030
movq $0x0, -0x8(%rbp)
jmp 0x6e59
movq -0x20(%rbp), %rax
movl $0x1, 0x68(%rax)
movq -0x20(%rbp), %rax
movl $0x0, 0x6c(%rax)
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_open_file
int lex_open_file(lexer *lx, char *fname) {
	//Attempt to open file
	FILE *src_f = fopen(fname, "r");
	if (!src_f) return 0;

	//Read data from file
	//TODO: use sys/stat.h to get file size
	fseek(src_f, 0, SEEK_END);
	int len = ftell(src_f);
	char *buf = malloc(len+1);
	fseek(src_f, 0, SEEK_SET);
	fread(buf, len, 1, src_f);
	fclose(src_f);
	buf[len] = '\0';

	vector_add(&lx->flist, fname);
	lexer_tgt_open(lx, fname, TGT_FILE, buf);
	return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x18(%rbp), %rdi
leaq 0xaf9e(%rip), %rsi      # 0x11e29
callq 0x31e0
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0x6ea7
movl $0x0, -0x4(%rbp)
jmp 0x6f3c
movq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
movl $0x2, %edx
callq 0x31b0
movq -0x20(%rbp), %rdi
callq 0x3150
movl %eax, -0x24(%rbp)
movl -0x24(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rdi
callq 0x3190
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
xorl %edx, %edx
callq 0x31b0
movq -0x30(%rbp), %rdi
movslq -0x24(%rbp), %rsi
movq -0x20(%rbp), %rcx
movl $0x1, %edx
callq 0x3080
movq -0x20(%rbp), %rdi
callq 0x30a0
movq -0x30(%rbp), %rax
movslq -0x24(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x10(%rbp), %rdi
addq $0x40, %rdi
movq -0x18(%rbp), %rsi
callq 0x107d0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x30(%rbp), %rcx
xorl %edx, %edx
callq 0x6f50
movl $0x1, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_tgt_open
void lexer_tgt_open(lexer *lx, char *name, int type, char *buf) {
	lex_target *n_tgt = malloc(sizeof(struct LEX_TARGET));
	n_tgt->name = name;
	n_tgt->type = type;
	n_tgt->buf = buf;
	n_tgt->pos = buf;
	n_tgt->cch = *buf;

	//Copy location for macro
	if (type == TGT_MACRO) {
		n_tgt->loc = lx->tgt->loc;
	} else {
		n_tgt->loc.line = 1;
		n_tgt->loc.col = 0;
		n_tgt->loc.fname = name;
	}

	vector_init(&n_tgt->mp_exp, VECTOR_EMPTY);
	n_tgt->prev = lx->tgt;
	lx->tgt = n_tgt;
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq %rcx, -0x20(%rbp)
movl $0x58, %edi
callq 0x3190
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movl -0x14(%rbp), %ecx
movq -0x28(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x20(%rbp), %rax
movb (%rax), %cl
movq -0x28(%rbp), %rax
movb %cl, 0x20(%rax)
cmpl $0x1, -0x14(%rbp)
jne 0x6fda
movq -0x28(%rbp), %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
movq 0x28(%rcx), %rdx
movq %rdx, 0x28(%rax)
movq 0x30(%rcx), %rdx
movq %rdx, 0x30(%rax)
movq 0x38(%rcx), %rcx
movq %rcx, 0x38(%rax)
jmp 0x6ffc
movq -0x28(%rbp), %rax
movl $0x1, 0x28(%rax)
movq -0x28(%rbp), %rax
movl $0x0, 0x2c(%rax)
movq -0x10(%rbp), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x28(%rbp), %rdi
addq $0x40, %rdi
xorl %esi, %esi
callq 0x10680
movq -0x8(%rbp), %rax
movq (%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0x50(%rax)
movq -0x28(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, (%rax)
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_close
void lexer_close(lexer *lx) {
	//Pop all targets if any remain
	while (lx->tgt != NULL)
		lexer_tgt_close(lx);

	//Free filenames
	for (int i=0; i<lx->flist.len; i++)
		free(lx->flist.table[i]);

	vector_close(&lx->flist);
	vector_close(&lx->conds);
	free(lx);
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
cmpq $0x0, (%rax)
je 0x7051
movq -0x8(%rbp), %rdi
callq 0x70b0
jmp 0x703c
movl $0x0, -0xc(%rbp)
movl -0xc(%rbp), %eax
movq -0x8(%rbp), %rcx
cmpl 0x48(%rcx), %eax
jge 0x7084
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rax
movslq -0xc(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x3030
movl -0xc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0xc(%rbp)
jmp 0x7058
movq -0x8(%rbp), %rdi
addq $0x40, %rdi
callq 0x10710
movq -0x8(%rbp), %rdi
addq $0x50, %rdi
callq 0x10710
movq -0x8(%rbp), %rdi
callq 0x3030
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_tgt_close
void lexer_tgt_close(lexer *lx) {
	lex_target *tgt = lx->tgt;
	if (tgt->type == TGT_FILE) {
		//Name is freed when lexer is closed
		free(tgt->buf);
	}
	lx->tgt = tgt->prev;
	vector_close(&tgt->mp_exp);

	free(tgt);
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x70de
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x3030
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rcx
movq -0x8(%rbp), %rax
movq %rcx, (%rax)
movq -0x10(%rbp), %rdi
addq $0x40, %rdi
callq 0x10710
movq -0x10(%rbp), %rdi
callq 0x3030
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_add_cond
void lexer_add_cond(lexer *lx, int pass) {
	lex_cond *cond = malloc(sizeof(struct LEX_CONDITION));
	cond->is_true = pass;
	cond->was_true = 0;
	cond->has_else = 0;
	vector_push(&lx->conds, cond);
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl $0xc, %edi
callq 0x3190
movq %rax, -0x18(%rbp)
movl -0xc(%rbp), %ecx
movq -0x18(%rbp), %rax
movl %ecx, (%rax)
movq -0x18(%rbp), %rax
movl $0x0, 0x4(%rax)
movq -0x18(%rbp), %rax
movl $0x0, 0x8(%rax)
movq -0x8(%rbp), %rdi
addq $0x50, %rdi
movq -0x18(%rbp), %rsi
callq 0x108d0
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_advc
char lex_advc(lexer *lx) {
	int len; s_pos loc;
	char nc = lex_nchar(lx, &len, &loc, 0);
	if (nc == '\0') return nc;

	lx->tgt->cch = nc;
	lx->tgt->pos += len;
	lx->tgt->loc = loc;
	return lx->tgt->cch;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x14(%rbp), %rsi
leaq -0x30(%rbp), %rdx
xorl %ecx, %ecx
callq 0x7390
movb %al, -0x31(%rbp)
movsbl -0x31(%rbp), %eax
cmpl $0x0, %eax
jne 0x8223
movb -0x31(%rbp), %al
movb %al, -0x1(%rbp)
jmp 0x8274
movb -0x31(%rbp), %cl
movq -0x10(%rbp), %rax
movq (%rax), %rax
movb %cl, 0x20(%rax)
movl -0x14(%rbp), %edx
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rcx
movslq %edx, %rdx
addq %rdx, %rcx
movq %rcx, 0x18(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
movq %rcx, 0x28(%rax)
movq -0x28(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0x20(%rbp), %rcx
movq %rcx, 0x38(%rax)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movb 0x20(%rax), %al
movb %al, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_ident
void lex_ident(lexer *lx, token *t) {
	int len = 0;
	int bsize = 256;
	char cur = lex_cur(lx);
	char *buf = malloc(bsize);
	while (isalnum(cur) || cur == '_') {
		//Resize if needed
		if (len+2 == bsize) {
			bsize *= 2;
			buf = realloc(buf, bsize);
		}

		//Copy character to buffer
		buf[len++] = cur;
		cur = lex_advc(lx);
	}
	buf[len] = '\0';
	t->dat.sval = buf;
	t->type = TOK_IDENT;
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl $0x0, -0x14(%rbp)
movl $0x100, -0x18(%rbp)     # imm = 0x100
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0x19(%rbp)
movslq -0x18(%rbp), %rdi
callq 0x3190
movq %rax, -0x28(%rbp)
callq 0x3240
movq (%rax), %rax
movsbl -0x19(%rbp), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %ecx
andl $0x8, %ecx
movb $0x1, %al
cmpl $0x0, %ecx
movb %al, -0x29(%rbp)
jne 0x8314
movsbl -0x19(%rbp), %eax
cmpl $0x5f, %eax
sete %al
movb %al, -0x29(%rbp)
movb -0x29(%rbp), %al
testb $0x1, %al
jne 0x831d
jmp 0x8367
movl -0x14(%rbp), %eax
addl $0x2, %eax
cmpl -0x18(%rbp), %eax
jne 0x8341
movl -0x18(%rbp), %eax
shll %eax
movl %eax, -0x18(%rbp)
movq -0x28(%rbp), %rdi
movslq -0x18(%rbp), %rsi
callq 0x31c0
movq %rax, -0x28(%rbp)
movb -0x19(%rbp), %dl
movq -0x28(%rbp), %rax
movl -0x14(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x14(%rbp)
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0x19(%rbp)
jmp 0x82e7
movq -0x28(%rbp), %rax
movslq -0x14(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x28(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movl $0x35, (%rax)
addq $0x30, %rsp
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_str
void lex_str(lexer *lx, token *t) {
	int len = 0;
	int bsize = 256;
	char cur = lex_advc(lx);
	char *buf = malloc(bsize);
	for (;;) {
		//Resize if needed
		if (len+2 == bsize) {
			bsize *= 2;
			buf = realloc(buf, bsize);
		}

		//Get character
		char c = cur;
		if (cur == '"') {
			lex_advc(lx);
			//Check for whitespace concatenation
			while (isspace(lex_cur(lx))) lex_advc(lx);
			if (lex_cur(lx) != '"') break;
			cur = lex_advc(lx);
			continue;
		} else if (cur == '\\') {
			//Escape sequence
			lex_advc(lx);
			buf[len++] = lex_eschar(lx);
			cur = lex_cur(lx);
			continue;
		}

		//Copy character to buffer
		buf[len++] = c;
		cur = lex_advc(lx);
	}
	buf[len] = '\0';
	t->dat.sval = buf;
	t->type = TOK_STR;
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl $0x0, -0x14(%rbp)
movl $0x100, -0x18(%rbp)     # imm = 0x100
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0x19(%rbp)
movslq -0x18(%rbp), %rdi
callq 0x3190
movq %rax, -0x28(%rbp)
movl -0x14(%rbp), %eax
addl $0x2, %eax
cmpl -0x18(%rbp), %eax
jne 0x8d0b
movl -0x18(%rbp), %eax
shll %eax
movl %eax, -0x18(%rbp)
movq -0x28(%rbp), %rdi
movslq -0x18(%rbp), %rsi
callq 0x31c0
movq %rax, -0x28(%rbp)
movb -0x19(%rbp), %al
movb %al, -0x29(%rbp)
movsbl -0x19(%rbp), %eax
cmpl $0x22, %eax
jne 0x8d81
movq -0x8(%rbp), %rdi
callq 0x81f0
callq 0x3240
movq (%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, %cl
movq -0x38(%rbp), %rax
movsbl %cl, %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x2000, %eax           # imm = 0x2000
cmpl $0x0, %eax
je 0x8d5d
movq -0x8(%rbp), %rdi
callq 0x81f0
jmp 0x8d23
movq -0x8(%rbp), %rdi
callq 0x81b0
movsbl %al, %eax
cmpl $0x22, %eax
je 0x8d70
jmp 0x8def
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0x19(%rbp)
jmp 0x8ce7
movsbl -0x19(%rbp), %eax
cmpl $0x5c, %eax
jne 0x8dc4
movq -0x8(%rbp), %rdi
callq 0x81f0
movq -0x8(%rbp), %rdi
callq 0x89c0
movb %al, %dl
movq -0x28(%rbp), %rax
movl -0x14(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x14(%rbp)
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0x19(%rbp)
jmp 0x8ce7
jmp 0x8dc6
movb -0x29(%rbp), %dl
movq -0x28(%rbp), %rax
movl -0x14(%rbp), %ecx
movl %ecx, %esi
addl $0x1, %esi
movl %esi, -0x14(%rbp)
movslq %ecx, %rcx
movb %dl, (%rax,%rcx)
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0x19(%rbp)
jmp 0x8ce7
movq -0x28(%rbp), %rax
movslq -0x14(%rbp), %rcx
movb $0x0, (%rax,%rcx)
movq -0x28(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x10(%rbp), %rax
movl $0x34, (%rax)
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_wspace
int lex_wspace(lexer *lx) {
	int nline = 0;
	char cur = lex_cur(lx);
	for (;;) {
		//Handle whitespace checks at end of lexer context
		if (cur == '\0' && lx->m_exp) {
			if (lx->tgt->prev != NULL) {
				//lexer_tgt_close(lx);
				lex_advc(lx);
				cur = lex_cur(lx);
			} else {
				break;
			}
			continue;
		}
		
		//Check for newline and skip whitespace
		if (!isspace(cur)) break;
		if (cur == '\n') nline = 1;
		cur = lex_advc(lx);
	}
	return nline;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movl $0x0, -0xc(%rbp)
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0xd(%rbp)
movsbl -0xd(%rbp), %eax
cmpl $0x0, %eax
jne 0x964b
movq -0x8(%rbp), %rax
cmpl $0x0, 0x68(%rax)
je 0x964b
movq -0x8(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x50(%rax)
je 0x9647
movq -0x8(%rbp), %rdi
callq 0x81f0
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0xd(%rbp)
jmp 0x9649
jmp 0x9688
jmp 0x960f
callq 0x3240
movq (%rax), %rax
movsbl -0xd(%rbp), %ecx
movslq %ecx, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x2000, %eax           # imm = 0x2000
cmpl $0x0, %eax
jne 0x966a
jmp 0x9688
movsbl -0xd(%rbp), %eax
cmpl $0xa, %eax
jne 0x967a
movl $0x1, -0xc(%rbp)
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0xd(%rbp)
jmp 0x960f
movl -0xc(%rbp), %eax
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_ppd
void lex_ppd(lexer *lx) {
	//Read directive
	token ppd = lex_peek(lx);
	switch (ppd.type) {
		case TOK_KW_DEFINE:	ppd_define(lx);			break;
		case TOK_KW_ELIF:	ppd_elif(lx);			break;
		case TOK_KW_ELSE:	ppd_else(lx);			break;
		case TOK_KW_ENDIF:   	ppd_endif(lx);			break;
		case TOK_KW_ERROR:	ppd_error(lx, 0);		break;
		case TOK_KW_IF:		ppd_if(lx);			break;
		case TOK_KW_IFDEF:	ppd_ifdef(lx);			break;
		case TOK_KW_IFNDEF:	ppd_ifndef(lx);			break;
		case TOK_KW_INCLUDE:	ppd_include(lx);		break;
		case TOK_KW_LINE:					break;
		case TOK_KW_PRAGMA:					break;
		case TOK_KW_UNDEF:	ppd_undef(lx);			break;
		case TOK_KW_WARNING:	ppd_error(lx, 1);		break;
		default:
			c_error(&ppd.loc, "Invalid preprocessor directive\n");
			break;
	}

	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rsi
leaq -0x38(%rbp), %rdi
callq 0x9790
movl -0x38(%rbp), %eax
addl $-0x36, %eax
movl %eax, %ecx
movq %rcx, -0x40(%rbp)
subl $0x29, %eax
ja 0x976c
movq -0x40(%rbp), %rax
leaq 0x8627(%rip), %rcx      # 0x11d00
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
callq 0xe810
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf1a0
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf230
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf2c0
jmp 0x9782
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0xea40
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf050
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf0a0
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xf120
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xeb70
jmp 0x9782
jmp 0x9782
jmp 0x9782
movq -0x8(%rbp), %rdi
callq 0xede0
jmp 0x9782
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0xea40
jmp 0x9782
leaq -0x38(%rbp), %rdi
addq $0x8, %rdi
leaq 0x89e0(%rip), %rsi      # 0x1215b
movb $0x0, %al
callq 0x3880
addq $0x40, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_adv
void lex_adv(lexer *lx) {
reset:	if (lx->ahead.type == TOK_END) return;
	lex_condskip(lx);
	lex_next(lx);
	if (lx->ahead.type == TOK_SNS) {
		lx->m_exp = 0; //Temporarily disable macro expansion
		lex_next(lx);
		lex_ppd(lx);
		lx->m_exp = 1;
		goto reset;
	}
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
cmpl $0x0, 0x10(%rax)
jne 0x97f8
jmp 0x9840
movq -0x8(%rbp), %rdi
callq 0x98a0
movq -0x8(%rbp), %rdi
callq 0x8e20
movq -0x8(%rbp), %rax
cmpl $0xd, 0x10(%rax)
jne 0x983e
movq -0x8(%rbp), %rax
movl $0x0, 0x68(%rax)
movq -0x8(%rbp), %rdi
callq 0x8e20
movq -0x8(%rbp), %rdi
callq 0x96a0
movq -0x8(%rbp), %rax
movl $0x1, 0x68(%rax)
jmp 0x97ec
jmp 0x9840
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: is_condppd
int is_condppd(int type) {
	switch (type) {
		case TOK_KW_ELIF:
		case TOK_KW_ELSE:
		case TOK_KW_ENDIF:
		case TOK_KW_IF:	
		case TOK_KW_IFDEF:
		case TOK_KW_IFNDEF:
			return 1;
	}
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movl %edi, -0x8(%rbp)
movl -0x8(%rbp), %eax
movl %eax, -0xc(%rbp)
addl $-0x36, %eax
subl $0x2, %eax
jb 0x9881
jmp 0x9867
movl -0xc(%rbp), %eax
addl $-0x56, %eax
subl $0x2, %eax
jb 0x9881
jmp 0x9874
movl -0xc(%rbp), %eax
addl $-0x59, %eax
subl $0x1, %eax
ja 0x988a
jmp 0x9881
movl $0x1, -0x4(%rbp)
jmp 0x9891
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_condskip
void lex_condskip(lexer *lx) {
	lex_cond *cond;
	int had_nl = 1;
	lx->m_exp = 0;
reset:	cond = vector_top(&lx->conds);
	if (cond != NULL && (!cond->is_true || cond->was_true)) {
		//Repeat until a conditional directive changes the state
		char cur = lex_cur(lx);
		while (cur != '\0') {
			int nline = lex_wspace(lx);
			if ((nline || had_nl) && lex_cur(lx) == '#') {
				if (cur == '\n') had_nl = 1;
				lex_advc(lx);
				lex_next(lx);

				//Only perform conditional directives
				token t = lex_peek(lx);
				if (is_condppd(t.type)) {
					lex_ppd(lx);
					goto reset;
				}
			}
			cur = lex_advc(lx);
			had_nl = 0;
		}

		//Premature end of input
		if (cur == '\0')
			c_error(&lx->tgt->loc, "Expected #endif before end of input\n");
	}
	lx->m_exp = 1;
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movl $0x1, -0x14(%rbp)
movq -0x8(%rbp), %rax
movl $0x0, 0x68(%rax)
movq -0x8(%rbp), %rdi
addq $0x50, %rdi
callq 0x10970
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x99bb
movq -0x10(%rbp), %rax
cmpl $0x0, (%rax)
je 0x98f1
movq -0x10(%rbp), %rax
cmpl $0x0, 0x4(%rax)
je 0x99bb
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0x15(%rbp)
movsbl -0x15(%rbp), %eax
cmpl $0x0, %eax
je 0x9997
movq -0x8(%rbp), %rdi
callq 0x95f0
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jne 0x9922
cmpl $0x0, -0x14(%rbp)
je 0x997f
movq -0x8(%rbp), %rdi
callq 0x81b0
movsbl %al, %eax
cmpl $0x23, %eax
jne 0x997f
movsbl -0x15(%rbp), %eax
cmpl $0xa, %eax
jne 0x9943
movl $0x1, -0x14(%rbp)
movq -0x8(%rbp), %rdi
callq 0x81f0
movq -0x8(%rbp), %rdi
callq 0x8e20
movq -0x8(%rbp), %rsi
leaq -0x50(%rbp), %rdi
callq 0x9790
movl -0x50(%rbp), %edi
callq 0x9850
cmpl $0x0, %eax
je 0x997d
movq -0x8(%rbp), %rdi
callq 0x96a0
jmp 0x98be
jmp 0x997f
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0x15(%rbp)
movl $0x0, -0x14(%rbp)
jmp 0x98fd
movsbl -0x15(%rbp), %eax
cmpl $0x0, %eax
jne 0x99b9
movq -0x8(%rbp), %rax
movq (%rax), %rdi
addq $0x28, %rdi
leaq 0x87c9(%rip), %rsi      # 0x1217b
movb $0x0, %al
callq 0x3880
jmp 0x99bb
movq -0x8(%rbp), %rax
movl $0x1, 0x68(%rax)
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lex_unget
void lex_unget(lexer *lx, token_n *n) {
	n->next = lx->pre;
	lx->pre = n;
	lx->ahead = BLANK_TOKEN; //force lex_peek to call lex_next
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x10(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rdi
addq $0x10, %rdi
leaq 0xda5d(%rip), %rsi      # 0x17468
movl $0x30, %edx
callq 0x3160
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: is_type_spec
int is_type_spec(lexer *lx, token t) {
	symbol *td;
	switch (t.type) {
		case TOK_KW_VOID: case TOK_KW_CHAR: case TOK_KW_SHORT:
		case TOK_KW_FLOAT: case TOK_KW_TYPEDEF: case TOK_KW_EXTERN:
		case TOK_KW_STATIC: case TOK_KW_AUTO: case TOK_KW_REGISTER:
		case TOK_KW_SIGNED: case TOK_KW_UNSIGNED: case TOK_KW_CONST:
		case TOK_KW_VOLATILE: case TOK_KW_INT: case TOK_KW_DOUBLE:
		case TOK_KW_LONG: case TOK_KW_STRUCT: case TOK_KW_UNION:
		case TOK_KW_ENUM:
			return 1;
		case TOK_IDENT:
			td = symtable_search(lx->stb, t.dat.sval);
			return (td->btype->s_class == CLASS_TYPEDEF);
	}
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
leaq 0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq %rdi, -0x10(%rbp)
movl (%rax), %eax
movl %eax, -0x1c(%rbp)
subl $0x35, %eax
je 0x9a56
jmp 0x9a40
movl -0x1c(%rbp), %eax
addl $-0x42, %eax
subl $0x12, %eax
ja 0x9a88
jmp 0x9a4d
movl $0x1, -0x4(%rbp)
jmp 0x9a8f
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x60(%rcx), %rdi
movq 0x20(%rax), %rsi
callq 0xfb60
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
cmpl $0x1, 0x8(%rax)
sete %al
andb $0x1, %al
movzbl %al, %eax
movl %eax, -0x4(%rbp)
jmp 0x9a8f
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: make_tok_node
token_n *make_tok_node(token t) {
	token_n *node = malloc(sizeof(struct TOKEN_NODE));
	node->t = t;
	node->next = NULL;
	return node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
leaq 0x10(%rbp), %rax
movq %rax, -0x10(%rbp)
movl $0x38, %edi
callq 0x3190
movq -0x10(%rbp), %rsi
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
movl $0x30, %edx
callq 0x3160
movq -0x8(%rbp), %rax
movq $0x0, 0x30(%rax)
movq -0x8(%rbp), %rax
addq $0x10, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: tok_str
const char *tok_str(token t, int nflag) {
	//List is built with both enum and natural representations
	//n*2 -> enum, n*2+1 -> natural
	char *tstr_list[] = {
		#define tok(id, estr, str) estr, str,
		#define kw(id, estr, str) estr, str,
		#include "tok.inc"
		#undef kw
		#undef tok
	};

	//Check for special cases
	static char buf[256];
	switch (t.type * (nflag)) {
		case TOK_CONST:
			if (t.dtype->kind == TYPE_FLOAT)
				snprintf(buf, 256, "%lf", t.dat.fval);
			else if (t.dtype->is_signed)
				snprintf(buf, 256, "%lld", t.dat.ival);
			else
				snprintf(buf, 256, "%llu", t.dat.uval);
			return buf;
		case TOK_STR:
		case TOK_IDENT:
			return t.dat.sval;
	}

	return tstr_list[t.type*2 + (nflag != 0)];
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x620, %rsp            # imm = 0x620
leaq 0x10(%rbp), %rax
movq %rax, -0x620(%rbp)
movl %edi, -0xc(%rbp)
leaq 0xccb0(%rip), %rsi      # 0x167c0
leaq -0x610(%rbp), %rdi
movl $0x600, %edx            # imm = 0x600
callq 0x3160
movq -0x620(%rbp), %rax
movl (%rax), %eax
movl -0xc(%rbp), %ecx
imull %ecx, %eax
movl %eax, -0x614(%rbp)
subl $0x33, %eax
je 0x9b54
jmp 0x9b3d
movl -0x614(%rbp), %eax
addl $-0x34, %eax
subl $0x2, %eax
jb 0x9bf8
jmp 0x9c09
movq -0x620(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x7, (%rax)
jne 0x9b8c
movq -0x620(%rbp), %rax
movsd 0x20(%rax), %xmm0
leaq 0xd959(%rip), %rdi      # 0x174d0
movl $0x100, %esi            # imm = 0x100
leaq 0x8ac0(%rip), %rdx      # 0x12643
movb $0x1, %al
callq 0x30d0
jmp 0x9beb
movq -0x620(%rbp), %rax
movq 0x28(%rax), %rax
cmpl $0x0, 0xc(%rax)
je 0x9bc4
movq -0x620(%rbp), %rax
movq 0x20(%rax), %rcx
leaq 0xd921(%rip), %rdi      # 0x174d0
movl $0x100, %esi            # imm = 0x100
leaq 0x8a8c(%rip), %rdx      # 0x12647
movb $0x0, %al
callq 0x30d0
jmp 0x9be9
movq -0x620(%rbp), %rax
movq 0x20(%rax), %rcx
leaq 0xd8fa(%rip), %rdi      # 0x174d0
movl $0x100, %esi            # imm = 0x100
leaq 0x8a6a(%rip), %rdx      # 0x1264c
movb $0x0, %al
callq 0x30d0
jmp 0x9beb
leaq 0xd8de(%rip), %rax      # 0x174d0
movq %rax, -0x8(%rbp)
jmp 0x9c31
movq -0x620(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x9c31
movq -0x620(%rbp), %rax
movl (%rax), %eax
shll %eax
cmpl $0x0, -0xc(%rbp)
setne %cl
andb $0x1, %cl
movzbl %cl, %ecx
addl %ecx, %eax
cltq
movq -0x610(%rbp,%rax,8), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x620, %rsp            # imm = 0x620
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_debug
void lexer_debug(lexer *lx, int dbg_lvl) {
	//Get all tokens
	int tcount = 0;
	token t = lex_peek(lx);
	while (t.type != TOK_END) {
		s_pos loc = t.loc;
		if (t.nline) {
			if (tcount != 0)
				printf("\n");
			if (dbg_lvl > 0)
				printf("%i:\t", lx->tgt->loc.line);
		}
		printf("%s ", tok_str(t, dbg_lvl));
		tcount++;
		lex_adv(lx);
		t = lex_peek(lx);
	}
	printf("\n");
	if (dbg_lvl > 0)
	printf("# tokens: %i\n", tcount);
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movl $0x0, -0x10(%rbp)
movq -0x8(%rbp), %rsi
leaq -0x40(%rbp), %rdi
callq 0x9790
cmpl $0x0, -0x40(%rbp)
je 0x9d31
movq -0x38(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x48(%rbp)
cmpl $0x0, -0x3c(%rbp)
je 0x9cc2
cmpl $0x0, -0x10(%rbp)
je 0x9ca2
leaq 0x8baa(%rip), %rdi      # 0x12845
movb $0x0, %al
callq 0x30c0
cmpl $0x0, -0xc(%rbp)
jle 0x9cc0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movl 0x28(%rax), %esi
leaq 0x8998(%rip), %rdi      # 0x12651
movb $0x0, %al
callq 0x30c0
jmp 0x9cc2
movl -0xc(%rbp), %edi
movups -0x40(%rbp), %xmm0
movups -0x30(%rbp), %xmm1
movups -0x20(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
callq 0x9af0
movq %rax, %rsi
leaq 0x8968(%rip), %rdi      # 0x12656
movb $0x0, %al
callq 0x30c0
movl -0x10(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x10(%rbp)
movq -0x8(%rbp), %rdi
callq 0x97e0
movq -0x8(%rbp), %rsi
leaq -0x88(%rbp), %rdi
callq 0x9790
leaq -0x40(%rbp), %rdi
leaq -0x88(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
jmp 0x9c66
leaq 0x8b0d(%rip), %rdi      # 0x12845
movb $0x0, %al
callq 0x30c0
cmpl $0x0, -0xc(%rbp)
jle 0x9d56
movl -0x10(%rbp), %esi
leaq 0x890b(%rip), %rdi      # 0x1265a
movb $0x0, %al
callq 0x30c0
addq $0xc0, %rsp
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/lex.c
// Function: lexer_debug_pprc
void lexer_debug_pprc(lexer *lx, int dbg_lvl) {
	char c = lex_cur(lx);
	while (c != '\0') {
		if (dbg_lvl > 0)
			printf("(%i:%i)\t%c\n", lx->tgt->loc.line, lx->tgt->loc.col, c);
		else
			printf("%c", c);
		c = lex_advc(lx);
	}
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movq %rdi, -0x8(%rbp)
movl %esi, -0xc(%rbp)
movq -0x8(%rbp), %rdi
callq 0x81b0
movb %al, -0xd(%rbp)
movsbl -0xd(%rbp), %eax
cmpl $0x0, %eax
je 0x9dd2
cmpl $0x0, -0xc(%rbp)
jle 0x9db2
movq -0x8(%rbp), %rax
movq (%rax), %rax
movl 0x28(%rax), %esi
movq -0x8(%rbp), %rax
movq (%rax), %rax
movl 0x2c(%rax), %edx
movsbl -0xd(%rbp), %ecx
leaq 0x88bf(%rip), %rdi      # 0x12668
movb $0x0, %al
callq 0x30c0
jmp 0x9dc4
movsbl -0xd(%rbp), %esi
leaq 0x88b7(%rip), %rdi      # 0x12674
movb $0x0, %al
callq 0x30c0
movq -0x8(%rbp), %rdi
callq 0x81f0
movb %al, -0xd(%rbp)
jmp 0x9d7b
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/main.c
// Function: usage
void usage(int detail) {
	printf("USAGE: scc [OPTION]... [FILE]...\n");
	if (!detail) return;
	printf("\nOptions:\n");
	printf(" -h\t\tprint this help message\n");
	printf(" -o [outfile]\tspecifies the name of the output file\n");
	printf(" -e\t\tstop after preprocessing phase (-E for detailed output)\n"); 
	printf(" -l\t\tstop after lexical analysis phase (-L for detailed output)\n");
	printf(" -p\t\tstop after parsing phase\n\n");
	return;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x10, %rsp
movl %edi, -0x4(%rbp)
leaq 0x8936(%rip), %rdi      # 0x12728
movb $0x0, %al
callq 0x30c0
cmpl $0x0, -0x4(%rbp)
jne 0x9e01
jmp 0x9e55
leaq 0x8942(%rip), %rdi      # 0x1274a
movb $0x0, %al
callq 0x30c0
leaq 0x893f(%rip), %rdi      # 0x12755
movb $0x0, %al
callq 0x30c0
leaq 0x894f(%rip), %rdi      # 0x12773
movb $0x0, %al
callq 0x30c0
leaq 0x8976(%rip), %rdi      # 0x127a8
movb $0x0, %al
callq 0x30c0
leaq 0x89a6(%rip), %rdi      # 0x127e6
movb $0x0, %al
callq 0x30c0
leaq 0x89d9(%rip), %rdi      # 0x12827
movb $0x0, %al
callq 0x30c0
addq $0x10, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/parse.c
// Function: parse_decl
ast_n *parse_decl(lexer *lx) {
	//Get specifiers
	s_type *type = parse_decl_spec(lx);
	if (!type)
		return NULL;
	
	//Check if specifiers were immediately followed by a semicolon
	token t = lex_peek(lx);
	if (t.type == TOK_SEM) {
		//Check for blank definition
		if (type->kind != TYPE_STRUCT && type->kind != TYPE_UNION)
			c_error(&t.loc, "Declaration declares nothing\n");
		lex_adv(lx);
		type_del(type);
		return NULL;
	}

	//Parse declaration body (declarator [+ initializer])
	char *name = NULL;
	ast_n *node = parse_decl_body(lx, type);
	switch (lex_peek(lx).type) {
		//Parse multiple declarations
		case TOK_CMM: {
			ast_n *node_ex = node;
			while (lex_peek(lx).type == TOK_CMM) {
				lex_adv(lx);
				node_ex->dat.decl.next = parse_decl_body(lx, type);
				node_ex = node_ex->dat.decl.next;
			}

			//Expect ';'
			t = lex_peek(lx);
			if (t.type != TOK_SEM) {
				c_error(&t.loc, "Expected ';' after declaration\n");
			}
			lex_adv(lx);
			} break;

		case TOK_SEM:
			lex_adv(lx);
			break;

		case TOK_LBR:
			break;
	}
	type_del(type);

	return node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0xa6d0
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
jne 0xa3b0
movq $0x0, -0x8(%rbp)
jmp 0xa531
movq -0x10(%rbp), %rsi
leaq -0x48(%rbp), %rdi
callq 0x9790
cmpl $0x1, -0x48(%rbp)
jne 0xa40a
movq -0x18(%rbp), %rax
cmpl $0x8, (%rax)
je 0xa3eb
movq -0x18(%rbp), %rax
cmpl $0x9, (%rax)
je 0xa3eb
leaq -0x48(%rbp), %rdi
addq $0x8, %rdi
leaq 0x87dc(%rip), %rsi      # 0x12bc0
movb $0x0, %al
callq 0x3880
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x18(%rbp), %rdi
callq 0xfca0
movq $0x0, -0x8(%rbp)
jmp 0xa531
movq $0x0, -0x50(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xad50
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x88(%rbp), %rdi
callq 0x9790
movl -0x88(%rbp), %eax
movl %eax, -0xf4(%rbp)
subl $0x1, %eax
je 0xa513
jmp 0xa44a
movl -0xf4(%rbp), %eax
subl $0x3, %eax
je 0xa46b
jmp 0xa457
movl -0xf4(%rbp), %eax
subl $0x5, %eax
je 0xa51e
jmp 0xa520
movq -0x58(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
callq 0x9790
cmpl $0x3, -0xc0(%rbp)
jne 0xa4c7
movq -0x10(%rbp), %rdi
callq 0x97e0
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xad50
movq %rax, %rcx
movq -0x90(%rbp), %rax
movq %rcx, 0x28(%rax)
movq -0x90(%rbp), %rax
movq 0x28(%rax), %rax
movq %rax, -0x90(%rbp)
jmp 0xa476
movq -0x10(%rbp), %rsi
leaq -0xf0(%rbp), %rdi
callq 0x9790
leaq -0x48(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
cmpl $0x1, -0x48(%rbp)
je 0xa508
leaq -0x48(%rbp), %rdi
addq $0x8, %rdi
leaq 0x86dd(%rip), %rsi      # 0x12bde
movb $0x0, %al
callq 0x3880
movq -0x10(%rbp), %rdi
callq 0x97e0
jmp 0xa520
movq -0x10(%rbp), %rdi
callq 0x97e0
jmp 0xa520
jmp 0xa520
movq -0x18(%rbp), %rdi
callq 0xfca0
movq -0x58(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/parse.c
// Function: parse_fdef
ast_n *parse_fdef(lexer *lx) {
	//Get return type
	s_type *r_type = parse_decl_spec(lx);

	//Get declarator
	token f_name = {0};
	s_type *f_type = parse_decltr(lx, r_type, &f_name);
	f_type->ret = r_type;

	//Create symbol (or reuse unless there is a redefinition conflict)
	symbol *s = symtable_def(lx->stb, f_name.dat.sval, f_type, &f_name.loc);
	if (s->fbody != NULL)
		c_error(&f_name.loc, "Redefinition of '%s'\n", f_name.dat.sval);

	//Enter function scope
	symtable_scope_enter(lx->stb);
	lx->stb->func = s;
	for (int i=0; i<f_type->param.len; i++) {
		s_param *p = f_type->param.table[i];
		symtable_def(lx->stb, p->name, p->type, NULL);
	}

	//Create node and parse body
	ast_n *node = astn_new(DECL, DECL_FUNC, lex_peek(lx));
	node->dat.decl.sym = s;
	node->dat.decl.block = parse_stmt_cmpd(lx);

	//Leave function scope
	symtable_scope_leave(lx->stb);
	lx->stb->func = NULL;

	return node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xd0, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
callq 0xa6d0
movq %rax, -0x10(%rbp)
leaq -0x40(%rbp), %rdi
xorl %esi, %esi
movl $0x30, %edx
callq 0x3100
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
leaq -0x40(%rbp), %rdx
callq 0xb660
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rcx
movq -0x48(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
movq -0x20(%rbp), %rsi
movq -0x48(%rbp), %rdx
leaq -0x40(%rbp), %rcx
addq $0x8, %rcx
callq 0xf5f0
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0xa5d3
leaq -0x40(%rbp), %rdi
addq $0x8, %rdi
movq -0x20(%rbp), %rdx
leaq 0x8898(%rip), %rsi      # 0x12e64
movb $0x0, %al
callq 0x3880
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
callq 0xf940
movq -0x50(%rbp), %rcx
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rax
movq %rcx, 0x10(%rax)
movl $0x0, -0x54(%rbp)
movl -0x54(%rbp), %eax
movq -0x48(%rbp), %rcx
cmpl 0x30(%rcx), %eax
jge 0xa642
movq -0x48(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x54(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x60(%rbp)
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
movq -0x60(%rbp), %rax
movq (%rax), %rsi
movq -0x60(%rbp), %rax
movq 0x8(%rax), %rdx
xorl %eax, %eax
movl %eax, %ecx
callq 0xf5f0
movl -0x54(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x54(%rbp)
jmp 0xa5f7
movq -0x8(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0x9790
xorl %eax, %eax
movups -0x98(%rbp), %xmm0
movups -0x88(%rbp), %xmm1
movups -0x78(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
xorl %edi, %edi
movl $0x1, %esi
callq 0x3350
movq %rax, -0x68(%rbp)
movq -0x50(%rbp), %rcx
movq -0x68(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x8(%rbp), %rdi
callq 0xbba0
movq %rax, %rcx
movq -0x68(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
callq 0xf990
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rax
movq $0x0, 0x10(%rax)
movq -0x68(%rbp), %rax
addq $0xd0, %rsp
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O0/Yamsman[P]scc/src/parse.c
// Function: parse_decl_body
ast_n *parse_decl_body(lexer *lx, s_type *base_type) {
	//Parse declarator
	token vname = {0}; 
	s_type *vtype = parse_decltr(lx, type_clone(base_type), &vname);

	//Create a new symbol
	//parse_decltr may not set vname in order to implement parameters
	if (vname.dat.sval == NULL)
		c_error(&vname.loc, "Missing variable name in declaration\n");

	symbol *s = symtable_def(lx->stb, vname.dat.sval, vtype, &vname.loc);
	if (!s) { //If duplicate exists
		free(vname.dat.sval);
		type_del(vtype);
	}

	ast_n *node = astn_new(DECL, DECL_STD, lex_peek(lx));
	ast_decl *decl_n = &node->dat.decl;
	decl_n->sym = s;

	//Check for and parse initialization
	token t = lex_peek(lx);
	if (t.type == TOK_ASSIGN) {
		lex_adv(lx);
		//decl_n->init = parse_decl_init(lx, node);
		
		//Typedefs cannot be initialized
		if (base_type->s_class == CLASS_TYPEDEF)
			c_error(&t.loc, "Attempt to initialize a typedef\n");
	}

	return node;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x100, %rsp            # imm = 0x100
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x40(%rbp), %rdi
xorl %esi, %esi
movl $0x30, %edx
callq 0x3100
movq -0x8(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x10(%rbp), %rdi
callq 0xfdc0
movq -0xc8(%rbp), %rdi
movq %rax, %rsi
leaq -0x40(%rbp), %rdx
callq 0xb660
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0xadbb
leaq -0x40(%rbp), %rdi
addq $0x8, %rdi
leaq 0x801c(%rip), %rsi      # 0x12dd0
movb $0x0, %al
callq 0x3880
movq -0x8(%rbp), %rax
movq 0x60(%rax), %rdi
movq -0x20(%rbp), %rsi
movq -0x48(%rbp), %rdx
leaq -0x40(%rbp), %rcx
addq $0x8, %rcx
callq 0xf5f0
movq %rax, -0x50(%rbp)
cmpq $0x0, -0x50(%rbp)
jne 0xadf5
movq -0x20(%rbp), %rdi
callq 0x3030
movq -0x48(%rbp), %rdi
callq 0xfca0
movq -0x8(%rbp), %rsi
leaq -0x88(%rbp), %rdi
callq 0x9790
xorl %eax, %eax
movups -0x88(%rbp), %xmm0
movups -0x78(%rbp), %xmm1
movups -0x68(%rbp), %xmm2
movq %rsp, %rax
movups %xmm2, 0x20(%rax)
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
xorl %esi, %esi
movl %esi, %edi
callq 0x3350
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x90(%rbp)
movq -0x50(%rbp), %rcx
movq -0x90(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x8(%rbp), %rsi
leaq -0xc0(%rbp), %rdi
callq 0x9790
cmpl $0x27, -0xc0(%rbp)
jne 0xae96
movq -0x8(%rbp), %rdi
callq 0x97e0
movq -0x10(%rbp), %rax
cmpl $0x1, 0x8(%rax)
jne 0xae94
leaq -0xc0(%rbp), %rdi
addq $0x8, %rdi
leaq 0x7f69(%rip), %rsi      # 0x12df6
movb $0x0, %al
callq 0x3880
jmp 0xae96
movq -0x58(%rbp), %rax
addq $0x100, %rsp            # imm = 0x100
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x1a0, %rsp            # imm = 0x1A0
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
callq 0x97e0
movq $0x0, -0x10(%rbp)
movq -0x8(%rbp), %rsi
leaq -0x70(%rbp), %rdi
callq 0x9790
cmpl $0x35, -0x70(%rbp)
jne 0xb1d5
movq -0x8(%rbp), %rsi
leaq -0xa0(%rbp), %rdi
callq 0x9790
movq -0x80(%rbp), %rax
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rsi
leaq -0xd0(%rbp), %rdi
callq 0x9790
movq -0xc8(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rdi
callq 0x97e0
movq -0x8(%rbp), %rsi
leaq -0x100(%rbp), %rdi
callq 0x9790
movq -0xf8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0xf0(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rsi
leaq -0x130(%rbp), %rdi
callq 0x9790
cmpl $0x5, -0x130(%rbp)
jne 0xb30f
movl $0x0, -0x134(%rbp)
movq -0x8(%rbp), %rdi
callq 0x97e0
movq -0x8(%rbp), %rsi
leaq -0x168(%rbp), %rdi
callq 0x9790
cmpl $0x6, -0x168(%rbp)
je 0xb30d
cmpl $0x0, -0x168(%rbp)
jne 0xb273
leaq -0x40(%rbp), %rdi
leaq 0x7ce1(%rip), %rsi      # 0x12f48
movb $0x0, %al
callq 0x3880
jmp 0xb30d
movq -0x8(%rbp), %rdi
leaq -0x134(%rbp), %rsi
callq 0xbf30
movq -0x8(%rbp), %rsi
leaq -0x198(%rbp), %rdi
callq 0x9790
leaq -0x168(%rbp), %rdi
leaq -0x198(%rbp), %rsi
movl $0x30, %edx
callq 0x3160
cmpl $0x35, -0x168(%rbp)
jne 0xb2d2
leaq -0x168(%rbp), %rdi
addq $0x8, %rdi
leaq 0x7ca4(%rip), %rsi      # 0x12f6a
movb $0x0, %al
callq 0x3880
jmp 0xb246
cmpl $0x3, -0x168(%rbp)
je 0xb2fd
cmpl $0x6, -0x168(%rbp)
je 0xb2fd
leaq -0x168(%rbp), %rdi
addq $0x8, %rdi
leaq 0x7c94(%rip), %rsi      # 0x12f8a
movb $0x0, %al
callq 0x3880
jmp 0xb2ff
movq -0x8(%rbp), %rdi
callq 0x97e0
jmp 0xb246
jmp 0xb30f
addq $0x1a0, %rsp            # imm = 0x1A0
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x48(%rbp), %rdi
callq 0x9790
cmpl $0x12, -0x48(%rbp)
je 0xb353
movq -0x18(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xb3fe
movq -0x10(%rbp), %rdi
callq 0x97e0
movl $0x3, %edi
callq 0xf720
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rsi
leaq -0x80(%rbp), %rdi
callq 0x9790
movb $0x1, %al
cmpl $0x53, -0x80(%rbp)
movb %al, -0x81(%rbp)
je 0xb392
cmpl $0x54, -0x80(%rbp)
sete %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0xb39e
jmp 0xb3de
movl -0x80(%rbp), %eax
movl %eax, -0x88(%rbp)
subl $0x53, %eax
je 0xb3bb
jmp 0xb3ae
movl -0x88(%rbp), %eax
subl $0x54, %eax
je 0xb3c8
jmp 0xb3d3
movq -0x50(%rbp), %rax
movl $0x1, 0x10(%rax)
jmp 0xb3d3
movq -0x50(%rbp), %rax
movl $0x1, 0x14(%rax)
movq -0x10(%rbp), %rdi
callq 0x97e0
jmp 0xb377
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xb320
movq %rax, %rcx
movq -0x50(%rbp), %rax
movq %rcx, 0x18(%rax)
movq -0x50(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x90, %rsp
popq %rbp
retq
nopl (%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0xf0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rsi
leaq -0x48(%rbp), %rdi
callq 0x9790
cmpl $0x9, -0x48(%rbp)
jne 0xb4b6
movq -0x8(%rbp), %rdi
callq 0x97e0
movl $0x3, %edi
callq 0xf720
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rdi
callq 0xb570
movl %eax, %ecx
movq -0x18(%rbp), %rax
movl %ecx, 0x20(%rax)
movq -0x8(%rbp), %rsi
leaq -0x78(%rbp), %rdi
callq 0x9790
cmpl $0xa, -0x78(%rbp)
je 0xb490
leaq -0x78(%rbp), %rdi
addq $0x8, %rdi
leaq 0x790e(%rip), %rsi      # 0x12d97
movb $0x0, %al
callq 0x3880
movq -0x8(%rbp), %rdi
callq 0x97e0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xb410
movq %rax, %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x18(%rax)
jmp 0xb55c
movq -0x8(%rbp), %rsi
leaq -0xa8(%rbp), %rdi
callq 0x9790
cmpl $0x7, -0xa8(%rbp)
jne 0xb55a
movq -0x8(%rbp), %rdi
callq 0x97e0
movl $0x4, %edi
callq 0xf720
movq %rax, -0x18(%rbp)
movq -0x10(%rbp), %rcx
movq -0x18(%rbp), %rax
movq %rcx, 0x38(%rax)
movq -0x8(%rbp), %rsi
leaq -0xd8(%rbp), %rdi
callq 0x9790
cmpl $0x8, -0xd8(%rbp)
je 0xb551
movq -0x18(%rbp), %rax
movq %rax, -0xf0(%rbp)
movq -0x8(%rbp), %rdi
callq 0xb5c0
movq %rax, %rcx
movq -0xf0(%rbp), %rax
movq %rcx, -0xe8(%rbp)
movq %rdx, -0xe0(%rbp)
movq -0xe8(%rbp), %rcx
movq %rcx, 0x28(%rax)
movq -0xe0(%rbp), %rcx
movq %rcx, 0x30(%rax)
movq -0x8(%rbp), %rdi
callq 0x97e0
jmp 0xb55c
movq -0x18(%rbp), %rax
addq $0xf0, %rsp
popq %rbp
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
callq 0xc110
movq %rax, -0x10(%rbp)
movl $0x0, -0x14(%rbp)
movq -0x10(%rbp), %rdi
leaq -0x14(%rbp), %rsi
callq 0x4390
movl %eax, -0x18(%rbp)
movq -0x10(%rbp), %rdi
callq 0x33f0
movl -0x18(%rbp), %eax
addq $0x20, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x18(%rbp)
leaq -0x10(%rbp), %rdi
xorl %esi, %esi
callq 0x10680
movq -0x18(%rbp), %rsi
leaq -0x48(%rbp), %rdi
callq 0x9790
cmpl $0x8, -0x48(%rbp)
jne 0xb5ef
jmp 0xb643
movq -0x18(%rbp), %rdi
callq 0xbb40
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rsi
leaq -0x10(%rbp), %rdi
callq 0x107d0
movq -0x18(%rbp), %rsi
leaq -0x80(%rbp), %rdi
callq 0x9790
cmpl $0x3, -0x80(%rbp)
jne 0xb641
movq -0x18(%rbp), %rdi
callq 0x97e0
movq -0x18(%rbp), %rdi
callq 0xbb40
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rsi
leaq -0x10(%rbp), %rdi
callq 0x107d0
jmp 0xb609
jmp 0xb643
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rdx
addq $0x80, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)