LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_label
void gen_stmt_label(asm_f *f, ast_n *n) {
	//Copy the symbol name to a new string
	char *lsrc = n->dat.stmt.lbl; //here

	//If the label isn't already in the map, store it
	char *lbl = map_get(&f->labels, lsrc);
	if (lbl == NULL) {
		int len = strlen(lsrc);
		char *str = malloc(len+1);
		strncpy(str, lsrc, len);
		str[len] = '\0';

		//Store the copy
		map_insert(&f->labels, str, str);
		lbl = str;
	}

	asmf_add_inst(f, mk_label(lbl));
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rdi, %rbx
movq 0x10(%rsi), %r15
leaq 0x30(%rdi), %r14
movq %r14, %rdi
movq %r15, %rsi
callq 0xc7db
movq %rax, %r12
testq %rax, %rax
jne 0x4e81
movq %r15, %rdi
callq 0x30b0
movq %rax, %r13
incl %eax
movslq %eax, %rdi
callq 0x3170
movq %rax, %r12
movslq %r13d, %r13
movq %rax, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x3060
movb $0x0, (%r12,%r13)
movq %r14, %rdi
movq %r12, %rsi
movq %r12, %rdx
callq 0xc840
movq %r12, %rdi
callq 0x5334
movq %rbx, %rdi
movq %rax, %rsi
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
jmp 0x5543
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_goto
void gen_stmt_goto(asm_f *f, ast_n *n) {
	//Verify label exists in function scope
	symbol *fsym = f->fsym;
	char *lbl = NULL;
	if ((lbl = map_get(&fsym->labels, n->dat.stmt.lbl)) == NULL) {
		c_error(NULL, "Label '%s' used but not defined\n",
			n->dat.stmt.lbl);
		return;
	}

	asmf_add_inst(f, mk_inst(INST_JMP, 1,
		mk_oprd_label(lbl)
	));
	return;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x48, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq 0x20(%rdi), %rdi
addq $0x30, %rdi
movq 0x10(%rsi), %rsi
callq 0xc7db
testq %rax, %rax
je 0x4f06
leaq 0x28(%rsp), %r14
movq %r14, %rdi
movq %rax, %rsi
callq 0x5240
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl $0x45, %edi
movl $0x1, %esi
xorl %eax, %eax
callq 0x5255
movq %rbx, %rdi
movq %rax, %rsi
callq 0x5543
addq $0x48, %rsp
popq %rbx
popq %r14
retq
movq 0x10(%r14), %rdx
leaq 0x868f(%rip), %rsi      # 0xd5a0
xorl %edi, %edi
xorl %eax, %eax
addq $0x48, %rsp
popq %rbx
popq %r14
jmp 0x3250
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_return
void gen_stmt_return(asm_f *f, ast_n *n) {
	//TODO: check for matching return type
	if (n->dat.stmt.expr != NULL) 
		gen_expr(f, n->dat.stmt.expr);
	asmf_add_inst(f, mk_inst(INST_LEAVE, 0));
	asmf_add_inst(f, mk_inst(INST_RET, 0));
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movq 0x18(%rsi), %rsi
testq %rsi, %rsi
je 0x4f36
movq %rbx, %rdi
callq 0x4173
movl $0x42, %edi
xorl %esi, %esi
xorl %eax, %eax
callq 0x5255
movq %rbx, %rdi
movq %rax, %rsi
callq 0x5543
movl $0x41, %edi
xorl %esi, %esi
xorl %eax, %eax
callq 0x5255
movq %rbx, %rdi
movq %rax, %rsi
popq %rbx
jmp 0x5543
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/gen.c
// Function: gen_text
void gen_text(asm_f *f, ast_n *n) {
	//Loop for each declaration and function definition
	ast_n *n_cur = n;
	while (n_cur != NULL) {
		if (n_cur->dat.decl.kind == DECL_STD) {
			gen_decl(f, n_cur);
		} else {
			gen_fdef(f, n_cur);
		}
		n_cur = n_cur->next;
	}
	return;
}

// Assembly:
testq %rsi, %rsi
je 0x521c
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
cmpl $0x0, 0x8(%rbx)
je 0x520c
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4f69
movq 0x60(%rbx), %rbx
testq %rbx, %rbx
jne 0x51fb
addq $0x8, %rsp
popq %rbx
popq %r14
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/inst.c
// Function: mk_inst
inst_n *mk_inst(int op_id, int argc, ...) {
	inst_n *in = malloc(sizeof(struct INST));
	in->op = op_id;
	in->lbl = NULL;
	in->next = NULL;

	//Initialize operands
	va_list args;
	va_start(args, argc);
	for (int i=0; i<3; i++) {
		//Initialize other operands as blank
		if (i >= argc) {
			in->oprd[i].type = -1;
			continue;
		}
		in->oprd[i] = va_arg(args, oprd);
	}
	va_end(args);

	return in;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0xd0, %rsp
movl %esi, %ebx
movl %edi, %ebp
leaq 0x20(%rsp), %r14
movq %rdx, 0x10(%r14)
movq %rcx, 0x18(%r14)
movq %r8, 0x20(%r14)
movq %r9, 0x28(%r14)
testb %al, %al
je 0x52b4
movaps %xmm0, 0x50(%rsp)
movaps %xmm1, 0x60(%rsp)
movaps %xmm2, 0x70(%rsp)
movaps %xmm3, 0x80(%rsp)
movaps %xmm4, 0x90(%rsp)
movaps %xmm5, 0xa0(%rsp)
movaps %xmm6, 0xb0(%rsp)
movaps %xmm7, 0xc0(%rsp)
movl $0x78, %edi
callq 0x3170
movl %ebp, (%rax)
xorl %ecx, %ecx
movq %rcx, 0x8(%rax)
movq %rcx, 0x70(%rax)
movq %r14, 0x10(%rsp)
leaq 0xf0(%rsp), %rdx
movq %rdx, 0x8(%rsp)
movabsq $0x3000000010, %rsi     # imm = 0x3000000010
movq %rsi, (%rsp)
movq %rax, %rsi
addq $0x10, %rsi
movslq %ebx, %rdi
cmpq %rdi, %rcx
jge 0x5315
leaq 0x20(%rdx), %r8
movq %r8, 0x8(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsi)
movups %xmm0, (%rsi)
movq %r8, %rdx
jmp 0x531b
movl $0xffffffff, (%rsi)     # imm = 0xFFFFFFFF
incq %rcx
addq $0x20, %rsi
cmpq $0x3, %rcx
jne 0x52f4
addq $0xd0, %rsp
popq %rbx
popq %r14
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/inst.c
// Function: inst_str
void inst_str(inst_n *in) {
	//Print label
	if (in->lbl != NULL) {
		printf("%s:", in->lbl);
		if (in->next->lbl != NULL) printf("\n");
		return;
	}

	//Print operation
	printf("\t%s", x86_64_str[in->op]);

	//Print operands
	for (int i=0; i<3; i++) {
		oprd o = in->oprd[i];
		if (o.type < 0)
			break;

		if (i > 0) printf(", ");
		else printf("\t");
		if (o.deref != NODEREF)
			printf("[");
		if (o.type == OPRD_REG)
			printf("%s", x86_64_str[o.val.ival]);
		else if (o.type == OPRD_LBL)
			printf("%s", o.val.sval);
		else
			printf("%i", o.val.ival);

		//Dereferencing
		//TODO: DWORD PTR ...
		switch (o.deref) {
			case DEREF:	
				printf("]");
				break;
			case DEREF_REG:
				printf("+%s]", x86_64_str[o.deref_ofs.ival]);
				break;
			case DEREF_IMM: 
				printf("+%i]", o.deref_ofs.ival);
				break;
			case DEREF_LBL: 
				printf("+%s]", o.deref_ofs.sval);
				break;
		}
	}

	printf("\n");
	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movq 0x8(%rdi), %rsi
testq %rsi, %rsi
je 0x5394
leaq 0x84e3(%rip), %rdi      # 0xd852
xorl %eax, %eax
callq 0x30c0
movq 0x70(%rbx), %rax
cmpq $0x0, 0x8(%rax)
jne 0x54b1
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movslq (%rbx), %rax
leaq 0xed92(%rip), %rcx      # 0x14130
movq (%rcx,%rax,8), %rsi
leaq 0x84ad(%rip), %rdi      # 0xd856
xorl %eax, %eax
callq 0x30c0
xorl %ebp, %ebp
movl 0x10(%rbx,%rbp), %r15d
testl %r15d, %r15d
js 0x54b1
movq 0x18(%rbx,%rbp), %r13
movl 0x20(%rbx,%rbp), %r14d
movq 0x28(%rbx,%rbp), %r12
testq %rbp, %rbp
je 0x53e4
leaq 0x847f(%rip), %rdi      # 0xd85a
xorl %eax, %eax
callq 0x30c0
jmp 0x53ee
movl $0x9, %edi
callq 0x3040
testl %r14d, %r14d
je 0x53fd
movl $0x5b, %edi
callq 0x3040
cmpl $0x2, %r15d
je 0x541f
testl %r15d, %r15d
jne 0x5432
movslq %r13d, %rax
leaq 0xed1e(%rip), %rcx      # 0x14130
movq (%rcx,%rax,8), %rsi
leaq 0x843a(%rip), %rdi      # 0xd857
jmp 0x5429
leaq 0x8431(%rip), %rdi      # 0xd857
movq %r13, %rsi
xorl %eax, %eax
callq 0x30c0
jmp 0x5443
leaq 0x80bd(%rip), %rdi      # 0xd4f6
movl %r13d, %esi
xorl %eax, %eax
callq 0x30c0
decl %r14d
cmpl $0x3, %r14d
ja 0x54a3
leaq 0x824d(%rip), %rcx      # 0xd6a0
movslq (%rcx,%r14,4), %rax
addq %rcx, %rax
jmpq *%rax
movl $0x5d, %edi
callq 0x3040
jmp 0x54a3
leaq 0x83f3(%rip), %rdi      # 0xd862
movl %r12d, %esi
xorl %eax, %eax
callq 0x30c0
jmp 0x54a3
leaq 0x83db(%rip), %rdi      # 0xd85d
movq %r12, %rsi
jmp 0x549c
movslq %r12d, %rax
leaq 0xec9f(%rip), %rcx      # 0x14130
movq (%rcx,%rax,8), %rsi
leaq 0x83c1(%rip), %rdi      # 0xd85d
xorl %eax, %eax
callq 0x30c0
addq $0x20, %rbp
cmpq $0x60, %rbp
jne 0x53b2
movl $0xa, %edi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3040
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/inst.c
// Function: asmf_close
void asmf_close(asm_f *f) {
	struct INST *cur = f->text;
	while (cur != NULL) {
		struct INST *next = cur->next;
		inst_del(cur);
		cur = next;
	}

	//Free labels
	for (int i=0; i<f->labels.max; i++) {
		if (f->labels.table[i] != NULL)
			free(f->labels.table[i]);
	}
	map_close(&f->labels);
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq (%rdi), %rdi
testq %rdi, %rdi
je 0x550c
movq 0x70(%rdi), %r14
callq 0x3030
movq %r14, %rdi
testq %r14, %r14
jne 0x54fb
leaq 0x30(%rbx), %r14
cmpl $0x0, 0x44(%rbx)
jle 0x5536
xorl %r15d, %r15d
movq (%r14), %rax
movq (%rax,%r15,8), %rdi
testq %rdi, %rdi
je 0x552a
callq 0x3030
incq %r15
movslq 0x44(%rbx), %rax
cmpq %rax, %r15
jl 0x5519
movq %r14, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0xc696
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/inst.c
// Function: asmf_add_inst
void asmf_add_inst(asm_f *f, inst_n *in) {
	if (f->text == NULL) {
		f->text = in;
		f->text_cur = in;
	} else {
		f->text_cur->next = in;
		f->text_cur = in;
	}

	return;
}

// Assembly:
cmpq $0x0, (%rdi)
je 0x5557
movq 0x8(%rdi), %rax
addq $0x8, %rdi
movq %rsi, 0x70(%rax)
jmp 0x555e
movq %rsi, (%rdi)
addq $0x8, %rdi
movq %rsi, (%rdi)
retq
nop
// File: /workspace/github_c_makefile_star2_O1/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 %r15
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %r15
movl $0x70, %edi
callq 0x3170
movq %rax, %rbx
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movups 0xeb45(%rip), %xmm0     # 0x14438
movups %xmm0, 0x10(%rax)
movups 0xeb4a(%rip), %xmm0     # 0x14448
movups %xmm0, 0x20(%rax)
movups 0xeb4f(%rip), %xmm0     # 0x14458
movups %xmm0, 0x30(%rax)
leaq 0x40(%rax), %rdi
xorl %esi, %esi
callq 0xc964
leaq 0x50(%rbx), %rdi
xorl %esi, %esi
callq 0xc964
movq %r15, 0x60(%rbx)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x5956
testl %eax, %eax
je 0x5947
movq $0x1, 0x68(%rbx)
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
movq %r14, %rdi
movq %rbx, %rsi
callq 0x3416
xorl %ebx, %ebx
jmp 0x593e
// File: /workspace/github_c_makefile_star2_O1/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 %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x8205(%rip), %rsi      # 0xdb71
movq %rbx, %rdi
callq 0x31c0
testq %rax, %rax
je 0x59f5
movq %rax, %r15
movq %rax, %rdi
xorl %esi, %esi
movl $0x2, %edx
callq 0x3190
movq %r15, %rdi
callq 0x3140
movq %rax, %r13
incl %eax
movslq %eax, %rdi
callq 0x3170
movq %rax, %r12
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x3190
movslq %r13d, %r13
movl $0x1, %edx
movq %r12, %rdi
movq %r13, %rsi
movq %r15, %rcx
callq 0x3080
movq %r15, %rdi
callq 0x30a0
movb $0x0, (%r12,%r13)
leaq 0x40(%r14), %rdi
movq %rbx, %rsi
callq 0xc9fa
movq %r14, %rdi
movq %rbx, %rsi
xorl %edx, %edx
movq %r12, %rcx
callq 0x5a01
movl $0x1, %eax
jmp 0x59f7
xorl %eax, %eax
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rcx, %r12
movl %edx, %ebp
movq %rsi, %r15
movq %rdi, %rbx
movl $0x58, %edi
callq 0x3170
movq %rax, %r14
movq %r15, (%rax)
movl %ebp, 0x8(%rax)
movq %r12, 0x10(%rax)
movq %r12, 0x18(%rax)
movb (%r12), %al
movb %al, 0x20(%r14)
cmpl $0x1, %ebp
jne 0x5a54
leaq 0x28(%r14), %rax
movq (%rbx), %rcx
movq 0x38(%rcx), %rdx
movq %rdx, 0x10(%rax)
movups 0x28(%rcx), %xmm0
movups %xmm0, (%rax)
jmp 0x5a60
movq $0x1, 0x28(%r14)
movq %r15, 0x38(%r14)
movq %r14, %rdi
addq $0x40, %rdi
xorl %esi, %esi
callq 0xc964
movq (%rbx), %rax
movq %rax, 0x50(%r14)
movq %r14, (%rbx)
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/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 %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
cmpq $0x0, (%rdi)
je 0x5a9d
movq %rbx, %rdi
callq 0x5ae1
cmpq $0x0, (%rbx)
jne 0x5a8f
leaq 0x40(%rbx), %r14
cmpl $0x0, 0x48(%rbx)
jle 0x5ac3
xorl %r15d, %r15d
movq 0x40(%rbx), %rax
movq (%rax,%r15,8), %rdi
callq 0x3030
incq %r15
movslq 0x48(%rbx), %rax
cmpq %rax, %r15
jl 0x5aaa
movq %r14, %rdi
callq 0xc9b1
leaq 0x50(%rbx), %rdi
callq 0xc9b1
movq %rbx, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x3030
// File: /workspace/github_c_makefile_star2_O1/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 %r14
pushq %rbx
pushq %rax
movq %rdi, %r14
movq (%rdi), %rbx
cmpl $0x0, 0x8(%rbx)
jne 0x5afa
movq 0x10(%rbx), %rdi
callq 0x3030
movq 0x50(%rbx), %rax
movq %rax, (%r14)
leaq 0x40(%rbx), %rdi
callq 0xc9b1
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x3030
// File: /workspace/github_c_makefile_star2_O1/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 %r14
pushq %rbx
pushq %rax
movl %esi, %ebx
movq %rdi, %r14
movl $0xc, %edi
callq 0x3170
movl %ebx, (%rax)
movq $0x0, 0x4(%rax)
addq $0x50, %r14
movq %r14, %rdi
movq %rax, %rsi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0xca91
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/lex.c
// Function: lex_prcc
char lex_prcc(lexer *lx, char **cpos, char *cch, s_pos *cloc) {
	char *pos;
	char nchar;
	s_pos loc;
	if (cpos == NULL || cch == NULL || cloc == NULL) return '\0';

	/*
	 * Move to the next character
	 * If the current column is 0, the lexer is at the beginning of a file context
	 */
	int is_reset = (cloc->col == 0);
	pos = (is_reset) ? *cpos : *(cpos)+1;
	nchar = *pos;
	loc = *cloc;

	//Update location
	if (*cch == '\n') {
		loc.col = (is_reset) ? 1 : 0;
		loc.line++;
	}
	loc.col++;

	/*
	 * Perform trigraph conversion/newline splicing if needed
	 */
	for (;;) {
		//Process trigraphs
		if (*pos == '?' && *(pos+1) == '?') {
			int conv = 1;
			switch (*(pos+2)) {
				case '=': nchar = '#';  break;
				case '(': nchar = '[';  break;
				case '/': nchar = '\\'; break;
				case ')': nchar = ']';  break;
				case '\'': nchar = '^'; break;
				case '<': nchar = '{';  break;
				case '!': nchar = '|';  break;
				case '>': nchar = '}';  break;
				case '-': nchar = '~';  break;
				default: conv = 0; break;
			}

			//A conversion only takes place if the trigram was valid
			if (conv) {
				pos += 2;
				loc.col += 2;
			}
		}

		//Process newline splicing
		if (nchar == '\\' && *(pos+1) == '\n') {
			pos += 2;
			nchar = *pos;
			loc.col = 1;
			loc.line++;
		} else {
			//Stop looping if a line was not spliced
			break;
		}
	}

	*cpos = pos;
	*cch = nchar;
	*cloc = loc;
	return nchar;
}

// Assembly:
testq %rsi, %rsi
sete %al
testq %rdx, %rdx
sete %dil
orb %al, %dil
testq %rcx, %rcx
sete %al
orb %dil, %al
je 0x5b7d
xorl %eax, %eax
retq
pushq %r14
pushq %rbx
movl (%rcx), %r11d
movl 0x4(%rcx), %ebx
xorl %r8d, %r8d
xorl %eax, %eax
testl %ebx, %ebx
sete %r8b
setne %al
movq (%rsi), %rdi
leaq (%rdi,%rax), %r9
movb (%rdi,%rax), %al
leaq 0x8(%rcx), %rdi
movups 0x8(%rcx), %xmm0
movaps %xmm0, -0x18(%rsp)
xorl %r10d, %r10d
cmpb $0xa, (%rdx)
cmovnel %ebx, %r8d
sete %r10b
addl %r11d, %r10d
incl %r8d
leaq 0x7ca2(%rip), %r11      # 0xd868
cmpb $0x3f, (%r9)
jne 0x5c36
cmpb $0x3f, 0x1(%r9)
jne 0x5c36
movzbl 0x2(%r9), %ebx
cmpl $0x3b, %ebx
jg 0x5bf2
addl $-0x21, %ebx
cmpl $0xe, %ebx
ja 0x5c57
movslq (%r11,%rbx,4), %rbx
addq %r11, %rbx
jmpq *%rbx
movb $0x7c, %al
jmp 0x5c1f
cmpl $0x3c, %ebx
je 0x5c19
cmpl $0x3d, %ebx
je 0x5c1d
cmpl $0x3e, %ebx
jne 0x5c57
movb $0x7d, %al
jmp 0x5c1f
movb $0x7e, %al
jmp 0x5c1f
movb $0x5b, %al
jmp 0x5c1f
movb $0x5d, %al
jmp 0x5c1f
movb $0x5e, %al
jmp 0x5c1f
movb $0x5c, %al
jmp 0x5c1f
movb $0x7b, %al
jmp 0x5c1f
movb $0x23, %al
xorl %ebx, %ebx
leaq 0x2(%r9), %r14
testb %bl, %bl
cmoveq %r14, %r9
leal 0x2(%r8), %ebx
cmovnel %r8d, %ebx
movl %ebx, %r8d
cmpb $0x5c, %al
jne 0x5c5b
cmpb $0xa, 0x1(%r9)
jne 0x5c5b
movb 0x2(%r9), %al
addq $0x2, %r9
incl %r10d
movl $0x1, %r8d
jmp 0x5bc6
movb $0x1, %bl
jmp 0x5c21
movq %r9, (%rsi)
movb %al, (%rdx)
movl %r10d, (%rcx)
movl %r8d, 0x4(%rcx)
movaps -0x18(%rsp), %xmm0
movups %xmm0, (%rdi)
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O1/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 %rbx
subq $0x20, %rsp
movq %rdi, %rbx
leaq 0x4(%rsp), %rsi
leaq 0x8(%rsp), %rdx
xorl %ecx, %ecx
callq 0x5c73
testb %al, %al
je 0x67ba
movq (%rbx), %rcx
movb %al, 0x20(%rcx)
movslq 0x4(%rsp), %rax
addq %rax, 0x18(%rcx)
movq 0x18(%rsp), %rax
movq %rax, 0x38(%rcx)
movups 0x8(%rsp), %xmm0
movups %xmm0, 0x28(%rcx)
movq (%rbx), %rax
movb 0x20(%rax), %al
addq $0x20, %rsp
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movq (%rdi), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x67f0
movq %r14, %rdi
callq 0x6776
movq (%r14), %rax
movsbq 0x20(%rax), %r12
movl $0x100, %edi            # imm = 0x100
callq 0x3170
movq %rax, %r15
callq 0x3230
movq %rax, %r13
cmpq $0x5f, %r12
je 0x6825
movq (%r13), %rax
movzwl (%rax,%r12,2), %eax
andl $0x8, %eax
jne 0x6825
xorl %eax, %eax
jmp 0x6878
movq %rbx, (%rsp)
movl $0x100, %ebx            # imm = 0x100
xorl %ebp, %ebp
leaq 0x2(%rbp), %rax
movl %ebx, %ecx
cmpq %rcx, %rax
jne 0x684b
addl %ebx, %ebx
movslq %ebx, %rsi
movq %r15, %rdi
callq 0x31a0
movq %rax, %r15
movb %r12b, (%r15,%rbp)
incq %rbp
movq %r14, %rdi
callq 0x6776
movl %eax, %r12d
cmpb $0x5f, %al
je 0x6830
movq (%r13), %rax
movsbq %r12b, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x8, %eax
jne 0x6830
movl %ebp, %eax
movq (%rsp), %rbx
movb $0x0, (%r15,%rax)
movq %r15, 0x20(%rbx)
movl $0x35, (%rbx)
addq $0x8, %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/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rsi, 0x8(%rsp)
movq %rdi, %r14
callq 0x6776
movl %eax, %ebp
movl $0x100, %edi            # imm = 0x100
callq 0x3170
movq %rax, %r15
xorl %r13d, %r13d
movl $0x100, %ebx            # imm = 0x100
leal 0x2(%r13), %eax
cmpl %ebx, %eax
jne 0x70ac
addl %ebx, %ebx
movslq %ebx, %rsi
movq %r15, %rdi
callq 0x31a0
movq %rax, %r15
cmpb $0x5c, %bpl
je 0x7123
movzbl %bpl, %eax
cmpl $0x22, %eax
jne 0x7157
movq %r15, 0x10(%rsp)
movq %r14, %rdi
callq 0x6776
callq 0x3230
movq %rax, %r12
movq (%r12), %r15
movq (%r14), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x70e9
movq %r14, %rdi
callq 0x6776
movq (%r14), %rax
movsbq 0x20(%rax), %rcx
testb $0x20, 0x1(%r15,%rcx,2)
je 0x7103
movq %r14, %rdi
callq 0x6776
jmp 0x70d4
cmpl $0x0, 0x2c(%rax)
movq 0x10(%rsp), %r15
jne 0x7116
movq %r14, %rdi
callq 0x6776
movq (%r14), %rcx
movb $0x1, %al
cmpb $0x22, 0x20(%rcx)
je 0x7161
jmp 0x716d
movq %r14, %rdi
callq 0x6776
movq %r14, %rdi
callq 0x6dcc
movslq %r13d, %rcx
movb %al, (%r15,%rcx)
movq (%r14), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x714b
movq %r14, %rdi
callq 0x6776
incl %r13d
movq (%r14), %rax
movb 0x20(%rax), %bpl
jmp 0x716b
movslq %r13d, %rax
incl %r13d
movb %bpl, (%r15,%rax)
movq %r14, %rdi
callq 0x6776
movl %eax, %ebp
xorl %eax, %eax
testb %al, %al
je 0x7094
movslq %r13d, %rax
movb $0x0, (%r15,%rax)
movq 0x8(%rsp), %rax
movq %r15, 0x20(%rax)
movl $0x34, (%rax)
addq $0x18, %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/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
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movq (%rdi), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x78be
movq %rbx, %rdi
callq 0x6776
movq (%rbx), %rax
movb 0x20(%rax), %r14b
xorl %ebp, %ebp
movl $0x1, %r15d
testb %r14b, %r14b
jne 0x7904
cmpl $0x0, 0x68(%rbx)
je 0x7904
movq (%rbx), %rax
cmpq $0x0, 0x50(%rax)
je 0x792c
movq %rbx, %rdi
callq 0x6776
movq (%rbx), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x78fb
movq %rbx, %rdi
callq 0x6776
movq (%rbx), %rax
movb 0x20(%rax), %r14b
jmp 0x78cd
callq 0x3230
movq (%rax), %rax
movsbq %r14b, %rcx
testb $0x20, 0x1(%rax,%rcx,2)
je 0x792c
cmpb $0xa, %r14b
cmovel %r15d, %ebp
movq %rbx, %rdi
callq 0x6776
movl %eax, %r14d
jmp 0x78cd
movl %ebp, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O1/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 %r14
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
leaq 0x10(%rdi), %r14
cmpl $0x0, 0x10(%rdi)
jns 0x7955
movq %rbx, %rdi
callq 0x7a94
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups 0x20(%r14), %xmm2
movaps %xmm0, (%rsp)
movaps %xmm2, 0x20(%rsp)
movaps %xmm1, 0x10(%rsp)
movl (%rsp), %eax
leal -0x55(%rax), %ecx
cmpl $0xa, %ecx
ja 0x799b
leaq 0x6141(%rip), %rax      # 0xdac4
movslq (%rax,%rcx,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb40f
cmpl $0x36, %eax
je 0x79fb
cmpl $0x37, %eax
jne 0x7a3c
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xbbcc
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xbc1b
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb870
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xbb70
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xbb11
movq %rbx, %rdi
xorl %esi, %esi
jmp 0x7a21
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xba84
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xbab2
movq %rbx, %rdi
movl $0x1, %esi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb5c8
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb6af
leaq 0x8(%rsp), %rdi
leaq 0x645b(%rip), %rsi      # 0xdea3
xorl %eax, %eax
callq 0x3250
addq $0x38, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O1/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:
cmpl $0x0, 0x10(%rdi)
je 0x7ad9
pushq %rbx
movq %rdi, %rbx
movq %rbx, %rdi
callq 0x7afb
movq %rbx, %rdi
callq 0x719b
cmpl $0xd, 0x10(%rbx)
jne 0x7ad8
movl $0x0, 0x68(%rbx)
movq %rbx, %rdi
callq 0x719b
movq %rbx, %rdi
callq 0x7939
movl $0x1, 0x68(%rbx)
cmpl $0x0, 0x10(%rbx)
jne 0x7a9e
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl $0x0, 0x68(%rdi)
leaq 0x50(%rdi), %rax
movq %rax, (%rsp)
movl $0x1, %ebp
movabsq $0x4fffffffc, %r14      # imm = 0x4FFFFFFFC
movl $0x1, %r13d
movq (%rsp), %rdi
callq 0xcabb
testq %rax, %rax
je 0x7c25
cmpl $0x0, (%rax)
je 0x7b4e
cmpl $0x0, 0x4(%rax)
je 0x7c25
movq (%rbx), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x7b5f
movq %rbx, %rdi
callq 0x6776
movq (%rbx), %rax
movb 0x20(%rax), %al
movl %eax, %r15d
testb %al, %al
je 0x7c07
movq %rbx, %rdi
callq 0x78a3
orl %r13d, %eax
je 0x7bf0
movq (%rbx), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x7b8e
movq %rbx, %rdi
callq 0x6776
movq (%rbx), %rax
cmpb $0x23, 0x20(%rax)
jne 0x7bf0
cmpb $0xa, %r15b
cmovel %ebp, %r13d
movq %rbx, %rdi
callq 0x6776
movq %rbx, %rdi
callq 0x719b
cmpl $0x0, 0x10(%rbx)
jns 0x7bbd
movq %rbx, %rdi
callq 0x7a94
movl 0x10(%rbx), %ecx
addl $-0x36, %ecx
cmpl $0x25, %ecx
setae %al
movq %r14, %r12
shrq %cl, %r12
orb %al, %r12b
xorl %ecx, %ecx
testb $0x1, %r12b
jne 0x7be7
movq %rbx, %rdi
callq 0x7939
movl $0x2, %ecx
movl %r15d, %eax
testb $0x1, %r12b
je 0x7bfd
movq %rbx, %rdi
callq 0x6776
xorl %r13d, %r13d
xorl %ecx, %ecx
testl %ecx, %ecx
je 0x7b65
jmp 0x7c1c
movq (%rbx), %rdi
addq $0x28, %rdi
leaq 0x62ae(%rip), %rsi      # 0xdec3
xorl %eax, %eax
callq 0x3250
testb %r15b, %r15b
jne 0x7b2d
movl $0x1, 0x68(%rbx)
addq $0x8, %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/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:
movq 0x8(%rdi), %rax
movq %rax, 0x30(%rsi)
movq %rsi, 0x8(%rdi)
movups 0xc7ea(%rip), %xmm0     # 0x14438
movups %xmm0, 0x10(%rdi)
movups 0xc7ef(%rip), %xmm0     # 0x14448
movups %xmm0, 0x20(%rdi)
movups 0xc7f4(%rip), %xmm0     # 0x14458
movups %xmm0, 0x30(%rdi)
retq
// File: /workspace/github_c_makefile_star2_O1/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 %rax
movl $0x1, %eax
movl 0x10(%rsp), %ecx
leal -0x42(%rcx), %edx
cmpl $0x13, %edx
jae 0x7c7d
popq %rcx
retq
cmpl $0x35, %ecx
jne 0x7ca3
leaq 0x10(%rsp), %rax
movq 0x60(%rdi), %rdi
movq 0x20(%rax), %rsi
callq 0xc219
movq 0x10(%rax), %rcx
xorl %eax, %eax
cmpl $0x1, 0x8(%rcx)
sete %al
jmp 0x7c7b
xorl %eax, %eax
jmp 0x7c7b
// File: /workspace/github_c_makefile_star2_O1/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 %rax
movl $0x38, %edi
callq 0x3170
movaps 0x10(%rsp), %xmm0
movaps 0x20(%rsp), %xmm1
movaps 0x30(%rsp), %xmm2
movups %xmm0, (%rax)
movups %xmm1, 0x10(%rax)
movups %xmm2, 0x20(%rax)
movq $0x0, 0x30(%rax)
popq %rcx
retq
// File: /workspace/github_c_makefile_star2_O1/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 %rbx
leaq 0x10(%rsp), %rax
movl (%rax), %ecx
movl %ecx, %edx
imull %edi, %edx
leal -0x34(%rdx), %esi
cmpl $0x2, %esi
jae 0x7cf1
movq 0x20(%rax), %rbx
jmp 0x7d6c
cmpl $0x33, %edx
jne 0x7d23
movq 0x28(%rax), %rcx
cmpl $0x7, (%rcx)
jne 0x7d3c
movsd 0x20(%rax), %xmm0
leaq 0xc795(%rip), %rbx      # 0x144a0
leaq 0x667b(%rip), %rdx      # 0xe38d
movl $0x100, %esi            # imm = 0x100
movq %rbx, %rdi
movb $0x1, %al
callq 0x30d0
jmp 0x7d6c
xorl %eax, %eax
testl %edi, %edi
setne %al
leal (%rax,%rcx,2), %eax
cltq
leaq 0xba9a(%rip), %rcx      # 0x137d0
movq (%rcx,%rax,8), %rbx
jmp 0x7d6c
cmpl $0x0, 0xc(%rcx)
movq 0x20(%rax), %rcx
leaq 0xc755(%rip), %rbx      # 0x144a0
je 0x7d56
leaq 0x663d(%rip), %rdx      # 0xe391
jmp 0x7d5d
leaq 0x6639(%rip), %rdx      # 0xe396
movl $0x100, %esi            # imm = 0x100
movq %rbx, %rdi
xorl %eax, %eax
callq 0x30d0
movq %rbx, %rax
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movl %esi, %ebx
movq %rdi, %r14
leaq 0x10(%rdi), %r13
cmpl $0x0, 0x10(%rdi)
jns 0x7d96
movq %r14, %rdi
callq 0x7a94
movups (%r13), %xmm0
movups 0x10(%r13), %xmm1
movups 0x20(%r13), %xmm2
movaps %xmm0, 0x30(%rsp)
movaps %xmm2, 0x50(%rsp)
movaps %xmm1, 0x40(%rsp)
cmpl $0x0, 0x30(%rsp)
je 0x7e6f
leaq 0x65da(%rip), %r15      # 0xe3a0
leaq 0x65ce(%rip), %r12      # 0xe39b
xorl %ebp, %ebp
cmpl $0x0, 0x34(%rsp)
je 0x7df8
testl %ebp, %ebp
je 0x7de4
movl $0xa, %edi
callq 0x3040
testl %ebx, %ebx
jle 0x7df8
movq (%r14), %rax
movl 0x28(%rax), %esi
movq %r12, %rdi
xorl %eax, %eax
callq 0x30c0
movaps 0x30(%rsp), %xmm0
movaps 0x40(%rsp), %xmm1
movaps 0x50(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
movl %ebx, %edi
callq 0x7cd6
movq %r15, %rdi
movq %rax, %rsi
xorl %eax, %eax
callq 0x30c0
movq %r14, %rdi
callq 0x7a94
cmpl $0x0, 0x10(%r14)
jns 0x7e40
movq %r14, %rdi
callq 0x7a94
movups (%r13), %xmm0
movups 0x10(%r13), %xmm1
movups 0x20(%r13), %xmm2
movaps %xmm0, 0x30(%rsp)
movaps %xmm2, 0x50(%rsp)
movaps %xmm1, 0x40(%rsp)
decl %ebp
cmpl $0x0, 0x30(%rsp)
jne 0x7dcf
negl %ebp
jmp 0x7e71
xorl %ebp, %ebp
movl $0xa, %edi
callq 0x3040
testl %ebx, %ebx
jle 0x7e9d
leaq 0x651e(%rip), %rdi      # 0xe3a4
movl %ebp, %esi
xorl %eax, %eax
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x30c0
addq $0x68, %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/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 %r15
pushq %r14
pushq %rbx
movl %esi, %ebx
movq %rdi, %r14
movq (%rdi), %rax
cmpl $0x0, 0x2c(%rax)
jne 0x7ec7
movq %r14, %rdi
callq 0x6776
movq (%r14), %rax
movb 0x20(%rax), %al
testb %al, %al
je 0x7f07
leaq 0x64da(%rip), %r15      # 0xe3b2
movsbl %al, %ecx
testl %ebx, %ebx
jle 0x7ef4
movq (%r14), %rax
movl 0x28(%rax), %esi
movl 0x2c(%rax), %edx
movq %r15, %rdi
xorl %eax, %eax
callq 0x30c0
jmp 0x7efb
movl %ecx, %edi
callq 0x3040
movq %r14, %rdi
callq 0x6776
testb %al, %al
jne 0x7ed8
popq %rbx
popq %r14
popq %r15
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O1/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 %rbx
movl %edi, %ebx
leaq 0x650c(%rip), %rdi      # 0xe426
callq 0x3070
testl %ebx, %ebx
je 0x7f6c
leaq 0x651d(%rip), %rdi      # 0xe447
callq 0x3070
leaq 0x651b(%rip), %rdi      # 0xe451
callq 0x3070
leaq 0x652c(%rip), %rdi      # 0xe46e
callq 0x3070
leaq 0x6554(%rip), %rdi      # 0xe4a2
callq 0x3070
leaq 0x6585(%rip), %rdi      # 0xe4df
callq 0x3070
leaq 0x65b9(%rip), %rdi      # 0xe51f
popq %rbx
jmp 0x3070
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O1/Yamsman[P]scc/src/parse.c
// Function: parse
ast_n *parse(lexer *lx) {
	ast_n *list = NULL; // = parse_stmt();
	ast_n *cur = NULL;
	while (lex_peek(lx).type != TOK_END) {
		//Look ahead to see if next is decl or function def
		int par = 0;
		int fdef = -1;
		token_n *toklist = NULL;
		for (;;) {
			token t = lex_peek(lx);
			switch (t.type) {
				case TOK_RPR: par = 1;    break;
				case TOK_EQ:  fdef = 0;   break;
				case TOK_SEM: fdef = 0;   break; 
				case TOK_LBR: fdef = par; break;
				case TOK_END:
					c_error(&lx->tgt->loc, "Premature end of input\n");
					return NULL;
			}
			token_n *tn = make_tok_node(t);
			tn->next = toklist;
			toklist = tn;

			if (fdef >= 0) break;
			lex_adv(lx);
		}

		//Unget tokens
		while (toklist != NULL) {
			token_n *next = toklist->next;
			lex_unget(lx, toklist);
			toklist = next;
		}

		//Parse accordingly
		ast_n *node;
		switch (fdef) {
			case 0: node = parse_decl(lx); break;
			case 1: node = parse_fdef(lx); break;
		}
		if (node == NULL) continue;
		node->next = NULL;

		//Add declaration/function definition to list
		if (list == NULL) {
			list = node;
		} else {
			cur->next = node;
		}
		cur = node;
	}

	return list;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xa8, %rsp
movq %rdi, %rbx
leaq 0x78(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x0, (%r14)
je 0x8353
leaq 0x633f(%rip), %r13      # 0xe540
movq $0x0, 0x30(%rsp)
movq $0x0, 0x38(%rsp)
movl $0xffffffff, %ebp       # imm = 0xFFFFFFFF
xorl %r14d, %r14d
xorl %r15d, %r15d
leaq 0x48(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
movl 0x48(%rsp), %eax
cmpq $0x8, %rax
ja 0x825b
movslq (%r13,%rax,4), %rax
addq %r13, %rax
jmpq *%rax
movq (%rbx), %rdi
addq $0x28, %rdi
leaq 0x64b3(%rip), %rsi      # 0xe700
xorl %eax, %eax
callq 0x3250
movl $0x1, %edx
jmp 0x82ae
cmpl $0x1d, %eax
jne 0x826f
xorl %ebp, %ebp
jmp 0x826f
movl %r14d, %ebp
jmp 0x826f
movl $0x1, %r14d
movups 0x48(%rsp), %xmm0
movups 0x58(%rsp), %xmm1
movups 0x68(%rsp), %xmm2
movups %xmm2, 0x20(%rsp)
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
callq 0x7ca7
movq %rax, %r12
movq %r15, 0x30(%rax)
movl $0x4, %edx
testl %ebp, %ebp
jns 0x82ab
movq %rbx, %rdi
callq 0x7a94
xorl %edx, %edx
movq %r12, %r15
testl %edx, %edx
je 0x821e
cmpl $0x4, %edx
jne 0x8334
testq %r15, %r15
je 0x82d7
movq 0x30(%r15), %r14
movq %rbx, %rdi
movq %r15, %rsi
callq 0x7c3b
movq %r14, %r15
testq %r14, %r14
jne 0x82c0
cmpl $0x1, %ebp
je 0x82ef
testl %ebp, %ebp
movq 0x40(%rsp), %rax
jne 0x82f7
movq %rbx, %rdi
callq 0x8373
jmp 0x82f7
movq %rbx, %rdi
callq 0x84bf
testq %rax, %rax
movq %rax, 0x40(%rsp)
je 0x8323
movq $0x0, 0x60(%rax)
xorl %edx, %edx
cmpq $0x0, 0x30(%rsp)
je 0x832a
movq 0x38(%rsp), %rcx
movq %rax, 0x60(%rcx)
movq %rax, 0x38(%rsp)
jmp 0x8334
movl $0x2, %edx
jmp 0x8334
movq %rax, 0x38(%rsp)
movq %rax, 0x30(%rsp)
testb $0x5, %dl
jne 0x8353
leaq 0x78(%rsp), %rdi
movq %rbx, %rsi
callq 0x7a57
cmpl $0x0, 0x78(%rsp)
jne 0x8213
jmp 0x835c
movq $0x0, 0x30(%rsp)
movq 0x30(%rsp), %rax
addq $0xa8, %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_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
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rdi, %r14
callq 0x85f2
testq %rax, %rax
je 0x83c5
movq %rax, %rbx
movq %rsp, %r15
movq %r15, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x1, (%r15)
jne 0x83cd
movl (%rbx), %eax
andl $-0x2, %eax
xorl %r15d, %r15d
cmpl $0x8, %eax
je 0x849a
leaq 0x6358(%rip), %rsi      # 0xe718
jmp 0x848e
xorl %r15d, %r15d
jmp 0x84aa
movq %r14, %rdi
movq %rbx, %rsi
callq 0x8a1e
movq %rax, %r15
leaq 0x98(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
movl (%r12), %eax
cmpl $0x1, %eax
je 0x849a
cmpl $0x3, %eax
jne 0x84a2
leaq 0x38(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x3, (%r12)
jne 0x8452
leaq 0x38(%rsp), %r12
movq %r15, %rbp
movq %r14, %rdi
callq 0x7a94
movq %r14, %rdi
movq %rbx, %rsi
callq 0x8a1e
movq %rax, %r13
movq %rax, 0x28(%rbp)
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x3, 0x38(%rsp)
movq %r13, %rbp
je 0x8423
leaq 0x68(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups 0x20(%r12), %xmm2
movaps %xmm2, 0x20(%rsp)
movaps %xmm1, 0x10(%rsp)
movaps %xmm0, (%rsp)
cmpl $0x1, (%rsp)
je 0x849a
leaq 0x62a8(%rip), %rsi      # 0xe736
leaq 0x8(%rsp), %rdi
xorl %eax, %eax
callq 0x3250
movq %r14, %rdi
callq 0x7a94
movq %rbx, %rdi
callq 0xc2c4
movq %r15, %rax
addq $0xc8, %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_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 %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %rdi, %rbx
callq 0x85f2
movq %rax, %r14
xorps %xmm0, %xmm0
leaq 0x30(%rsp), %r12
movaps %xmm0, 0x20(%r12)
movaps %xmm0, 0x10(%r12)
movaps %xmm0, (%r12)
movq %rbx, %rdi
movq %rax, %rsi
movq %r12, %rdx
callq 0x90df
movq %rax, %r15
movq %r14, 0x38(%rax)
movq 0x60(%rbx), %rdi
movq 0x20(%r12), %rsi
leaq 0x38(%rsp), %r12
movq %rax, %rdx
movq %r12, %rcx
callq 0xbf25
movq %rax, %r14
cmpq $0x0, 0x18(%rax)
je 0x853f
movq 0x50(%rsp), %rdx
leaq 0x63fb(%rip), %rsi      # 0xe930
movq %r12, %rdi
xorl %eax, %eax
callq 0x3250
movq 0x60(%rbx), %rdi
callq 0xc0fc
movq 0x60(%rbx), %rax
movq %r14, 0x10(%rax)
cmpl $0x0, 0x30(%r15)
jle 0x8580
xorl %r12d, %r12d
movq 0x28(%r15), %rax
movq (%rax,%r12,8), %rax
movq 0x60(%rbx), %rdi
movq (%rax), %rsi
movq 0x8(%rax), %rdx
xorl %ecx, %ecx
callq 0xbf25
incq %r12
movslq 0x30(%r15), %rax
cmpq %rax, %r12
jl 0x855a
leaq 0x68(%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)
xorl %edi, %edi
movl $0x1, %esi
callq 0x356c
movq %rax, %r15
movq %r14, 0x10(%rax)
movq %rbx, %rdi
callq 0x9486
movq %rax, 0x20(%r15)
movq 0x60(%rbx), %rdi
callq 0xc12f
movq 0x60(%rbx), %rax
movq $0x0, 0x10(%rax)
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_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 %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rsi, %rbx
movq %rdi, %r14
xorps %xmm0, %xmm0
leaq 0x30(%rsp), %r12
movaps %xmm0, 0x20(%r12)
movaps %xmm0, 0x10(%r12)
movaps %xmm0, (%r12)
movq %rsi, %rdi
callq 0xc35c
movq %r14, %rdi
movq %rax, %rsi
movq %r12, %rdx
callq 0x90df
movq %rax, %r15
cmpq $0x0, 0x20(%r12)
jne 0x8a7f
leaq 0x38(%rsp), %rdi
leaq 0x5e24(%rip), %rsi      # 0xe89c
xorl %eax, %eax
callq 0x3250
movq 0x60(%r14), %rdi
leaq 0x38(%rsp), %rcx
movq 0x18(%rcx), %rsi
movq %r15, %rdx
callq 0xbf25
movq %rax, %r12
testq %rax, %rax
jne 0x8aae
movq 0x50(%rsp), %rdi
callq 0x3030
movq %r15, %rdi
callq 0xc2c4
leaq 0x98(%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)
xorl %edi, %edi
xorl %esi, %esi
callq 0x356c
movq %rax, %r15
movq %r12, 0x10(%rax)
leaq 0x68(%rsp), %r12
movq %r12, %rdi
movq %r14, %rsi
callq 0x7a57
cmpl $0x27, (%r12)
jne 0x8b25
movq %r14, %rdi
callq 0x7a94
cmpl $0x1, 0x8(%rbx)
jne 0x8b25
leaq 0x70(%rsp), %rdi
leaq 0x5da4(%rip), %rsi      # 0xe8c2
xorl %eax, %eax
callq 0x3250
movq %r15, %rax
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq