LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/util.c
// Function: xmalloc
void *
xmalloc(size_t len)
{
	void *buf;

	buf = malloc(len);
	if (!buf && len)
		fatal("malloc:");

	return buf;
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
callq 0x3180
testq %rax, %rax
setne %cl
testq %rbx, %rbx
sete %dl
orb %cl, %dl
je 0xd0fe
popq %rbx
retq
leaq 0x75c9(%rip), %rdi      # 0x146ce
xorl %eax, %eax
callq 0xcffb
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/util.c
// Function: arrayadd
void *
arrayadd(struct array *a, size_t n)
{
	void *v;

	if (a->cap - a->len < n) {
		do a->cap = a->cap ? a->cap * 2 : 256;
		while (a->cap - a->len < n);
		a->val = realloc(a->val, a->cap);
		if (!a->val)
			fatal("realloc");
	}
	v = (char *)a->val + a->len;
	a->len += n;

	return v;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movq 0x8(%rdi), %rcx
movq 0x10(%rdi), %rsi
movq %rsi, %rax
subq %rcx, %rax
cmpq %rbx, %rax
jae 0xd181
movl $0x100, %eax            # imm = 0x100
testq %rsi, %rsi
leaq (%rsi,%rsi), %rsi
cmoveq %rax, %rsi
movq %rsi, %rdx
subq %rcx, %rdx
cmpq %rbx, %rdx
jb 0xd151
movq %rsi, 0x10(%r14)
movq (%r14), %rdi
callq 0x31d0
movq %rax, (%r14)
testq %rax, %rax
je 0xd196
movq 0x8(%r14), %rcx
jmp 0xd184
movq (%r14), %rax
addq %rcx, %rax
addq %rcx, %rbx
movq %rbx, 0x8(%r14)
addq $0x8, %rsp
popq %rbx
popq %r14
retq
leaq 0x7539(%rip), %rdi      # 0x146d6
xorl %eax, %eax
callq 0xcffb
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/util.c
// Function: arraylast
void *
arraylast(struct array *a, size_t n)
{
	if (a->len == 0)
		return NULL;
	assert(n <= a->len);
	return (char *)a->val + a->len - n;
}

// Assembly:
movq 0x8(%rdi), %rax
testq %rax, %rax
je 0xd1f1
cmpq %rsi, %rax
jb 0xd1f4
addq (%rdi), %rax
subq %rsi, %rax
retq
xorl %eax, %eax
retq
pushq %rax
leaq 0x74e2(%rip), %rdi      # 0x146de
leaq 0x74e7(%rip), %rsi      # 0x146ea
leaq 0x74e7(%rip), %rcx      # 0x146f1
pushq $0x7d
popq %rdx
callq 0x30e0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: switchcase
void
switchcase(struct switchcases *cases, unsigned long long i, struct block *b)
{
	struct switchcase *c;

	c = treeinsert(&cases->root, i, sizeof(*c));
	if (!c->node.new)
		error(&tok.loc, "multiple 'case' labels with same value");
	c->body = b;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rdx, %rbx
pushq $0x28
popq %rdx
callq 0xc5fc
movq %rax, %r14
cmpb $0x0, 0x1c(%rax)
jne 0xd26d
leaq 0xeead(%rip), %rdi      # 0x1c108
addq $0x8, %rdi
leaq 0x7622(%rip), %rsi      # 0x14888
xorl %eax, %eax
callq 0xc536
movq %rbx, 0x20(%r14)
addq $0x8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: mkblock
struct block *
mkblock(char *name)
{
	static unsigned id;
	struct block *b;

	b = xmalloc(sizeof(*b));
	b->label.kind = VALUE_LABEL;
	b->label.u.name = name;
	b->label.id = ++id;
	b->insts = (struct array){0};
	b->jump.kind = JUMP_NONE;
	b->phi.res.kind = VALUE_NONE;
	b->next = NULL;

	return b;
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movl $0x88, %edi
callq 0xd0e3
movl $0x7, (%rax)
movq %rbx, 0x8(%rax)
movl 0xeea9(%rip), %ecx      # 0x1c140
incl %ecx
movl %ecx, 0xeea1(%rip)      # 0x1c140
movl %ecx, 0x4(%rax)
xorps %xmm0, %xmm0
andq $0x0, 0x20(%rax)
movups %xmm0, 0x10(%rax)
andl $0x0, 0x60(%rax)
andl $0x0, 0x50(%rax)
andq $0x0, 0x80(%rax)
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: mkglobal
struct value *
mkglobal(struct decl *d)
{
	static unsigned id;
	struct value *v;

	v = xmalloc(sizeof(*v));
	v->kind = VALUE_GLOBAL;
	if (d->kind == DECLOBJECT && d->u.obj.storage == SDTHREAD)
		v->kind |= VALUE_THREAD;
	if (d->asmname) {
		v->u.name = d->asmname;
		v->id = 0;
	} else {
		v->u.name = d->name;
		v->id = d->linkage == LINKNONE ? ++id : 0;
	}

	return v;
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
pushq $0x10
popq %rdi
callq 0xd0e3
movl $0x1, (%rax)
cmpl $0x1, 0x8(%rbx)
jne 0xd2e4
cmpl $0x1, 0x44(%rbx)
jne 0xd2e4
movl $0x11, (%rax)
movq 0x28(%rbx), %rcx
testq %rcx, %rcx
je 0xd2f5
movq %rcx, 0x8(%rax)
xorl %ecx, %ecx
jmp 0xd312
movq (%rbx), %rcx
movq %rcx, 0x8(%rax)
xorl %ecx, %ecx
cmpl $0x0, 0xc(%rbx)
jne 0xd312
movl 0xee3a(%rip), %ecx      # 0x1c144
incl %ecx
movl %ecx, 0xee32(%rip)      # 0x1c144
movl %ecx, 0x4(%rax)
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: mkfunc
struct func *
mkfunc(struct decl *decl, char *name, struct type *t, struct scope *s)
{
	struct func *f;
	struct decl *d;
	struct value *v;

	f = xmalloc(sizeof(*f));
	f->decl = decl;
	f->name = name;
	f->type = t;
	f->start = f->end = mkblock("start");
	f->lastid = 0;
	mapinit(&f->gotos, 8);
	emittype(t->base);

	/* allocate space for parameters */
	f->paramtemps = xreallocarray(NULL, t->u.func.nparam, sizeof *f->paramtemps);
	for (d = t->u.func.params, v = f->paramtemps; d; d = d->next, ++v) {
		emittype(d->type);
		functemp(f, v);
		if(!d->name)
			continue;
		if (d->type->value) {
			d->value = v;
		} else {
			funcalloc(f, d);
			funcstore(f, d->type, QUALNONE, (struct lvalue){d->value}, v);
		}
	}

	t = mkarraytype(&typechar, QUALCONST, strlen(name) + 1);
	d = mkdecl("__func__", DECLOBJECT, t, QUALNONE, LINKNONE);
	d->u.obj.storage = SDSTATIC;
	d->value = mkglobal(d);
	scopeputdecl(s, d);
	f->namedecl = d;

	funclabel(f, mkblock("body"));

	return f;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rcx, (%rsp)
movq %rdx, %r12
movq %rsi, %r15
movq %rdi, %r13
pushq $0x60
popq %rdi
callq 0xd0e3
movq %rax, %rbx
movq %r13, (%rax)
movq %r15, 0x10(%rax)
movq %r12, 0x20(%rax)
leaq 0x6bef(%rip), %rdi      # 0x13f53
callq 0xd279
movq %rax, 0x30(%rbx)
movq %rax, 0x28(%rbx)
andl $0x0, 0x58(%rbx)
leaq 0x38(%rbx), %rdi
pushq $0x8
popq %rsi
callq 0x9988
movq 0x20(%r12), %rdi
callq 0xd4a9
movq 0x50(%r12), %rsi
pushq $0x10
popq %rdx
xorl %edi, %edi
callq 0xd0af
movq %rax, %r13
movq %rax, 0x18(%rbx)
addq $0x48, %r12
movabsq $-0x100000000, %r14     # imm = 0xFFFFFFFF00000000
movq (%r12), %r12
testq %r12, %r12
je 0xd427
movq 0x10(%r12), %rdi
callq 0xd4a9
movl $0x5, (%r13)
andq $0x0, 0x8(%r13)
movl 0x58(%rbx), %eax
incl %eax
movl %eax, 0x58(%rbx)
movl %eax, 0x4(%r13)
cmpq $0x0, (%r12)
je 0xd41d
movq 0x10(%r12), %rax
cmpq $0x0, 0x18(%rax)
je 0xd3f5
movq %r13, 0x20(%r12)
jmp 0xd41d
movq %rbx, %rdi
movq %r12, %rsi
callq 0xd6b0
movq 0x10(%r12), %rsi
movq 0x20(%r12), %rcx
andq %r14, %rbp
movq %rbx, %rdi
xorl %edx, %edx
movq %rbp, %r8
movq %r13, %r9
callq 0xd82c
addq $0x38, %r12
addq $0x10, %r13
jmp 0xd3af
movq %r15, %rdi
callq 0x3090
leaq 0x1(%rax), %rdx
leaq 0xe60e(%rip), %rdi      # 0x1ba48
pushq $0x2
popq %rsi
callq 0xc813
leaq 0x7466(%rip), %rdi      # 0x148af
pushq $0x1
popq %rsi
movq %rax, %rdx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x3724
movq %rax, %r15
andl $0x0, 0x44(%rax)
movq %rax, %rdi
callq 0xd2c0
movq %rax, 0x20(%r15)
movq (%rsp), %rdi
movq %r15, %rsi
callq 0xb693
movq %r15, 0x8(%rbx)
leaq 0x6c52(%rip), %rdi      # 0x140d5
callq 0xd279
movq 0x30(%rbx), %rcx
movq %rax, 0x80(%rcx)
movq %rax, 0x30(%rbx)
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcalloc
static void
funcalloc(struct func *f, struct decl *d)
{
	enum instkind op;
	struct block *end;
	struct value *v;
	int align;

	assert(!d->type->incomplete);
	calcvla(f, d->type);
	end = f->end;
	if (d->type->size) {
		f->end = f->start;
		v = mkintconst(d->type->size);
	} else {
		assert(d->type->kind == TYPEARRAY);
		assert(d->type->u.array.size);
		v = d->type->u.array.size;
	}
	align = d->u.obj.align;
	switch (align) {
	case 1:
	case 2:
	case 4:  op = IALLOC4; break;
	case 8:  op = IALLOC8; break;
	default: v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16));  /* fallthrough */
	case 16: op = IALLOC16; break;
	}
	v = funcinst(f, op, ptrclass, v, NULL);
	if (align > 16) {
		/* TODO: implement alloc32 in QBE and use that instead */
		v = funcinst(f, IADD, ptrclass, v, mkintconst(align - 16));
		v = funcinst(f, IAND, ptrclass, v, mkintconst(-align));
	}
	d->value = v;
	f->end = end;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r14
movq 0x10(%rsi), %rsi
cmpb $0x1, 0x3c(%rsi)
je 0xd7cf
movq %rdi, %rbx
callq 0xea64
movq 0x30(%rbx), %rbp
movq 0x10(%r14), %rax
movq 0x10(%rax), %rdi
testq %rdi, %rdi
je 0xd6f7
movq 0x28(%rbx), %rax
movq %rax, 0x30(%rbx)
callq 0xd317
movq %rax, %r13
jmp 0xd70d
cmpl $0xd, (%rax)
jne 0xd7ee
movq 0x50(%rax), %r13
testq %r13, %r13
je 0xd80d
movl 0x40(%r14), %r12d
movslq %r12d, %r15
pushq $0x1d
popq %rsi
leal -0x1(%r15), %eax
cmpl $0x2, %eax
jb 0xd759
cmpl $0x4, %r12d
je 0xd759
cmpl $0x10, %r12d
je 0xd756
cmpl $0x8, %r12d
jne 0xd736
pushq $0x1e
jmp 0xd758
leaq -0x10(%r15), %rdi
callq 0xd317
pushq $0x1
popq %rsi
pushq $0x6c
popq %rdx
movq %rbx, %rdi
movq %r13, %rcx
movq %rax, %r8
callq 0xed68
movq %rax, %r13
pushq $0x1f
popq %rsi
pushq $0x6c
popq %rdx
movq %rbx, %rdi
movq %r13, %rcx
xorl %r8d, %r8d
callq 0xed68
movq %rax, %r13
cmpl $0x11, %r15d
jl 0xd7b8
addl $-0x10, %r12d
movq %r12, %rdi
callq 0xd317
pushq $0x1
popq %rsi
pushq $0x6c
popq %rdx
movq %rbx, %rdi
movq %r13, %rcx
movq %rax, %r8
callq 0xed68
movq %rax, %r12
negq %r15
movq %r15, %rdi
callq 0xd317
pushq $0xb
popq %rsi
movq %rbx, %rdi
pushq $0x6c
popq %rdx
movq %r12, %rcx
movq %rax, %r8
callq 0xed68
movq %rax, %r13
movq %r13, 0x20(%r14)
movq %rbp, 0x30(%rbx)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x73d5(%rip), %rdi      # 0x14bab
leaq 0x70db(%rip), %rsi      # 0x148b8
leaq 0x73dc(%rip), %rcx      # 0x14bc0
movl $0x16a, %edx            # imm = 0x16A
callq 0x30e0
leaq 0x73f8(%rip), %rdi      # 0x14bed
leaq 0x70bc(%rip), %rsi      # 0x148b8
leaq 0x73bd(%rip), %rcx      # 0x14bc0
movl $0x171, %edx            # imm = 0x171
callq 0x30e0
leaq 0x73f4(%rip), %rdi      # 0x14c08
leaq 0x709d(%rip), %rsi      # 0x148b8
leaq 0x739e(%rip), %rcx      # 0x14bc0
movl $0x172, %edx            # imm = 0x172
callq 0x30e0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: delfunc
void
delfunc(struct func *f)
{
	struct block *b;
	struct inst **inst;

	while (b = f->start) {
		f->start = b->next;
		arrayforeach (&b->insts, inst)
			free(*inst);
		free(b->insts.val);
		free(b);
	}
	mapfree(&f->gotos, free);
	free(f);
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq 0x28(%rbx), %r14
testq %r14, %r14
je 0xdbc2
movq 0x80(%r14), %rax
movq %rax, 0x28(%rbx)
movq 0x10(%r14), %rdi
movq %rdi, %r15
movq 0x18(%r14), %rax
addq %rdi, %rax
cmpq %rax, %r15
je 0xdbb3
movq (%r15), %rdi
callq 0x3250
addq $0x8, %r15
movq 0x10(%r14), %rdi
jmp 0xdb95
callq 0x3250
movq %r14, %rdi
callq 0x3250
jmp 0xdb7a
leaq 0x38(%rbx), %rdi
movq 0xd3cb(%rip), %rsi      # 0x1af98
callq 0x99ff
movq %rbx, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x3250
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcjnz
void
funcjnz(struct func *f, struct value *v, struct type *t, struct block *l1, struct block *l2)
{
	struct block *b = f->end;

	if (b->jump.kind)
		return;
	if (t) {
		assert(t->prop & PROPSCALAR);
		/*
		Ideally we would just do this conversion unconditionally,
		but QBE is not currently able to optimize the conversion
		away for int.
		*/
		if (t->prop & PROPINT && t->size < 4)
			v = convert(f, &typeint, t, v);
		else if (t->prop & PROPFLOAT || t->size > 4)
			v = convert(f, &typebool, t, v);
	}
	b->jump.kind = JUMP_JNZ;
	b->jump.arg = v;
	b->jump.blk[0] = l1;
	b->jump.blk[1] = l2;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq 0x30(%rdi), %r15
cmpl $0x0, 0x60(%r15)
jne 0xdc65
movq %r8, %rbx
movq %rcx, %r14
movq %rsi, %rax
testq %rdx, %rdx
je 0xdc51
movl 0x4(%rdx), %ecx
testb $0x10, %cl
je 0xdc6b
testb $0x2, %cl
je 0xdc36
cmpq $0x4, 0x10(%rdx)
jae 0xdc36
leaq 0xdfcc(%rip), %rsi      # 0x1bc00
jmp 0xdc49
leaq 0xddb3(%rip), %rsi      # 0x1b9f0
testb $0x20, %cl
jne 0xdc49
cmpq $0x5, 0x10(%rdx)
jb 0xdc51
movq %rax, %rcx
callq 0xdc8a
movl $0x2, 0x60(%r15)
movq %rax, 0x68(%r15)
movq %r14, 0x70(%r15)
movq %rbx, 0x78(%r15)
popq %rbx
popq %r14
popq %r15
retq
leaq 0x5934(%rip), %rdi      # 0x135a6
leaq 0x6c3f(%rip), %rsi      # 0x148b8
leaq 0x6c3e(%rip), %rcx      # 0x148be
movl $0x252, %edx            # imm = 0x252
callq 0x30e0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcgoto
struct gotolabel *
funcgoto(struct func *f, char *name)
{
	void **entry;
	struct gotolabel *g;
	struct mapkey key;

	mapkey(&key, name, strlen(name));
	entry = mapput(&f->gotos, &key);
	g = *entry;
	if (!g) {
		g = xmalloc(sizeof(*g));
		g->label = mkblock(name);
		*entry = g;
	}

	return g;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x20, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movq %rsi, %rdi
callq 0x3090
leaq 0x8(%rsp), %r15
movq %r15, %rdi
movq %rbx, %rsi
movq %rax, %rdx
callq 0x995c
addq $0x38, %r14
movq %r14, %rdi
movq %r15, %rsi
callq 0x9a5b
movq (%rax), %r15
testq %r15, %r15
jne 0xdfb8
movq %rax, %r14
pushq $0x10
popq %rdi
callq 0xd0e3
movq %rax, %r15
movq %rbx, %rdi
callq 0xd279
movq %rax, (%r15)
movq %r15, (%r14)
movq %r15, %rax
addq $0x20, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: calcvla
static void
calcvla(struct func *f, struct type *t)
{
	struct value *length, *basesize;

	if (!(t->prop & PROPVM))
		return;
	if (t->base)
		calcvla(f, t->base);
	if (t->kind == TYPEFUNC || t->size)
		return;
	assert(t->kind == TYPEARRAY);
	if (!t->u.array.size) {
		assert(t->base->size || t->base->kind == TYPEARRAY);
		assert(t->u.array.length);
		length = convert(f, &typeulong, t->u.array.length->type, funcexpr(f, t->u.array.length));
		basesize = t->base->size ? mkintconst(t->base->size) : t->base->u.array.size;
		t->u.array.size = funcinst(f, IMUL, 'l', length, basesize);
	}
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
testb $0x40, 0x4(%rsi)
je 0xeb19
movq %rsi, %rbx
movq %rdi, %r14
movq 0x20(%rsi), %rsi
testq %rsi, %rsi
je 0xea8a
movq %r14, %rdi
callq 0xea64
movl (%rbx), %eax
cmpl $0xe, %eax
je 0xeb19
cmpq $0x0, 0x10(%rbx)
jne 0xeb19
cmpl $0xd, %eax
jne 0xeb1f
cmpq $0x0, 0x50(%rbx)
jne 0xeb19
movq 0x20(%rbx), %rax
cmpq $0x0, 0x10(%rax)
jne 0xeabc
cmpl $0xd, (%rax)
jne 0xeb5d
movq 0x40(%rbx), %rsi
testq %rsi, %rsi
je 0xeb3e
movq 0x8(%rsi), %r15
movq %r14, %rdi
callq 0xdfc5
leaq 0xd230(%rip), %rsi      # 0x1bd08
movq %r14, %rdi
movq %r15, %rdx
movq %rax, %rcx
callq 0xdc8a
movq %rax, %r15
movq 0x20(%rbx), %rax
movq 0x10(%rax), %rdi
testq %rdi, %rdi
je 0xeb00
callq 0xd317
movq %rax, %r8
jmp 0xeb04
movq 0x50(%rax), %r8
pushq $0x5
popq %rsi
pushq $0x6c
popq %rdx
movq %r14, %rdi
movq %r15, %rcx
callq 0xed68
movq %rax, 0x50(%rbx)
popq %rbx
popq %r14
popq %r15
retq
leaq 0x5f32(%rip), %rdi      # 0x14a58
leaq 0x5d8b(%rip), %rsi      # 0x148b8
leaq 0x6333(%rip), %rcx      # 0x14e67
movl $0x158, %edx            # imm = 0x158
callq 0x30e0
leaq 0x6379(%rip), %rdi      # 0x14ebe
leaq 0x5d6c(%rip), %rsi      # 0x148b8
leaq 0x6314(%rip), %rcx      # 0x14e67
movl $0x15b, %edx            # imm = 0x15B
callq 0x30e0
leaq 0x632e(%rip), %rdi      # 0x14e92
leaq 0x5d4d(%rip), %rsi      # 0x148b8
leaq 0x62f5(%rip), %rcx      # 0x14e67
movl $0x15a, %edx            # imm = 0x15A
callq 0x30e0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcload
static struct value *
funcload(struct func *f, struct type *t, struct lvalue lval)
{
	struct value *v;
	struct qbetype qt;

	switch (t->kind) {
	case TYPESTRUCT:
	case TYPEUNION:
	case TYPEARRAY:
		return lval.addr;
	}
	qt = qbetype(t);
	v = funcinst(f, qt.load, qt.base, lval.addr, NULL);
	return funcbits(f, t, v, lval.bits);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rcx, %rbx
movq %rdx, %r12
movq %rsi, %r14
movq %rdi, %r15
movl (%rsi), %eax
cmpl $0x10, %eax
ja 0xebb0
movl $0x1a000, %ecx          # imm = 0x1A000
btl %eax, %ecx
jae 0xebb0
movq %r12, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
movq %r14, %rdi
callq 0xee06
movsbl %al, %edx
movq %rax, %rsi
shrq $0x20, %rsi
movq %r15, %rdi
movq %r12, %rcx
xorl %r8d, %r8d
callq 0xed68
movq %r15, %rdi
movq %r14, %rsi
movq %rax, %rdx
movl %ebx, %ecx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
jmp 0xfff9
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: mkfltconst
static struct value *
mkfltconst(int kind, double n)
{
	struct value *v;

	v = xmalloc(sizeof(*v));
	v->kind = kind;
	v->u.f = n;

	return v;
}

// Assembly:
pushq %rbx
subq $0x10, %rsp
movsd %xmm0, 0x8(%rsp)
movl %edi, %ebx
pushq $0x10
popq %rdi
callq 0xd0e3
movl %ebx, (%rax)
movsd 0x8(%rsp), %xmm0
movsd %xmm0, 0x8(%rax)
addq $0x10, %rsp
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funclval
static struct lvalue
funclval(struct func *f, struct expr *e)
{
	struct lvalue lval = {0};
	struct decl *d;

	if (e->kind == EXPRBITFIELD) {
		lval.bits = e->u.bitfield.bits;
		e = e->base;
	}
	switch (e->kind) {
	case EXPRIDENT:
		d = e->u.ident.decl;
		if (d->kind != DECLOBJECT && d->kind != DECLFUNC)
			error(&tok.loc, "identifier '%s' is not an object or function", d->name);
		if (d == f->namedecl) {
			fputs("data ", stdout);
			emitname(d->value);
			printf(" = { b \"%s\", b 0 }\n", f->name);
			f->namedecl = NULL;
		}
		lval.addr = d->value;
		break;
	case EXPRSTRING:
		d = stringdecl(e);
		lval.addr = d->value;
		break;
	case EXPRCOMPOUND:
		if (e->toeval)
			funcexpr(f, e->toeval);
		d = e->u.compound.decl;
		funcinit(f, d, e->u.compound.init, true);
		lval.addr = d->value;
		break;
	case EXPRUNARY:
		if (e->op != TMUL)
			error(&tok.loc, "expression is not an object");
		lval.addr = funcexpr(f, e->base);
		break;
	default:
		if (e->type->kind != TYPESTRUCT && e->type->kind != TYPEUNION)
			error(&tok.loc, "expression is not an object");
		lval.addr = funcexpr(f, e);
	}
	return lval;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r15
movq %rdi, %r14
movl (%rsi), %eax
cmpl $0x4, %eax
jne 0xec35
movl 0x30(%r15), %ebx
movq 0x18(%r15), %r15
movl (%r15), %eax
jmp 0xec37
xorl %ebx, %ebx
cmpl $0x7, %eax
ja 0xed27
movl %eax, %eax
leaq 0x5b7f(%rip), %rcx      # 0x147c8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x30(%r15), %r15
movl 0x8(%r15), %eax
decl %eax
cmpl $0x2, %eax
jb 0xec7d
movq (%r15), %rdx
leaq 0xd49d(%rip), %rdi      # 0x1c108
addq $0x8, %rdi
leaq 0x625a(%rip), %rsi      # 0x14ed0
xorl %eax, %eax
callq 0xc536
cmpq 0x8(%r14), %r15
jne 0xecb9
movq 0xc336(%rip), %rax      # 0x1afc0
movq (%rax), %rsi
leaq 0x5e29(%rip), %rdi      # 0x14abd
callq 0x30f0
movq 0x20(%r15), %rdi
callq 0xf896
movq 0x10(%r14), %rsi
leaq 0x6250(%rip), %rdi      # 0x14efd
xorl %eax, %eax
callq 0x30b0
andq $0x0, 0x8(%r14)
movq 0x20(%r15), %rax
jmp 0xed59
movq 0x28(%r15), %rsi
testq %rsi, %rsi
je 0xecd3
movq %r14, %rdi
callq 0xdfc5
movq 0x30(%r15), %r12
movq 0x38(%r15), %rdx
pushq $0x1
popq %rcx
movq %r14, %rdi
movq %r12, %rsi
callq 0xef08
movq 0x20(%r12), %rax
jmp 0xed59
movq %r15, %rdi
callq 0x5352
movq 0x20(%rax), %rax
jmp 0xed59
cmpl $0x4b, 0x14(%r15)
je 0xed1e
leaq 0xd3fc(%rip), %rdi      # 0x1c108
addq $0x8, %rdi
leaq 0x61fa(%rip), %rsi      # 0x14f11
xorl %eax, %eax
callq 0xc536
movq 0x18(%r15), %rsi
movq %r14, %rdi
jmp 0xed54
movq 0x8(%r15), %rax
movl (%rax), %eax
addl $-0xf, %eax
cmpl $0x2, %eax
jb 0xed4e
leaq 0xd3cc(%rip), %rdi      # 0x1c108
addq $0x8, %rdi
leaq 0x61ca(%rip), %rsi      # 0x14f11
xorl %eax, %eax
callq 0xc536
movq %r14, %rdi
movq %r15, %rsi
callq 0xdfc5
movq %rbx, %rdx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcinst
static struct value *
funcinst(struct func *f, int op, int class, struct value *arg0, struct value *arg1)
{
	struct inst *inst;
	struct block *b;

	if (f->end->jump.kind) {
		b = mkblock("dead");
		funclabel(f, b);
	}
	inst = mkinst(f, op, class, arg0, arg1);
	arrayaddptr(&f->end->insts, inst);
	return &inst->res;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %r8, %r14
movq %rcx, %r12
movl %edx, %r15d
movl %esi, %ebp
movq %rdi, %rbx
movq 0x30(%rdi), %rax
cmpl $0x0, 0x60(%rax)
je 0xeda3
leaq 0x619e(%rip), %rdi      # 0x14f2d
callq 0xd279
movq 0x30(%rbx), %rcx
movq %rax, 0x80(%rcx)
movq %rax, 0x30(%rbx)
pushq $0x28
popq %rdi
callq 0xd0e3
movl %ebp, (%rax)
movl %r15d, 0x4(%rax)
movq %r12, 0x18(%rax)
movq %r14, 0x20(%rax)
testl %r15d, %r15d
sete %dl
cmpl $0x59, %ebp
sete %sil
xorl %ecx, %ecx
orb %dl, %sil
jne 0xede0
andq $0x0, 0x10(%rax)
movl 0x58(%rbx), %ecx
incl %ecx
movl %ecx, 0x58(%rbx)
movl %ecx, 0xc(%rax)
pushq $0x5
popq %rcx
movq %rax, %r14
addq $0x8, %r14
movl %ecx, 0x8(%rax)
movq 0x30(%rbx), %rdi
addq $0x10, %rdi
movq %rax, %rsi
callq 0xd1a4
movq %r14, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: qbetype
static struct qbetype
qbetype(struct type *t)
{
	static const struct qbetype
		ub = {'w', 'b', ILOADUB, ISTOREB},
		sb = {'w', 'b', ILOADSB, ISTOREB},
		uh = {'w', 'h', ILOADUH, ISTOREH},
		sh = {'w', 'h', ILOADSH, ISTOREH},
		w = {'w', 'w', ILOADW, ISTOREW},
		l = {'l', 'l', ILOADL, ISTOREL},
		s = {'s', 's', ILOADS, ISTORES},
		d = {'d', 'd', ILOADD, ISTORED},
		v = {0};

	if (t == &typevoid)
		return v;
	if (!(t->prop & PROPSCALAR))
		return l;
	switch (t->size) {
	case 1: return t->u.basic.issigned ? sb : ub;
	case 2: return t->u.basic.issigned ? sh : uh;
	case 4: return t->prop & PROPFLOAT ? s : w;
	case 8: return t->prop & PROPFLOAT ? d : l;
	case 16: fatal("long double is not yet supported");
	}
	assert(0);
}

// Assembly:
pushq %rax
cmpq 0xc192(%rip), %rdi      # 0x1afa0
je 0xee27
movabsq $0x1700006c6c, %rax     # imm = 0x1700006C6C
movl 0x4(%rdi), %ecx
testb $0x10, %cl
jne 0xee2d
pushq $0x11
popq %rdx
jmp 0xee2b
xorl %eax, %eax
xorl %edx, %edx
popq %rcx
retq
movq 0x10(%rdi), %rdx
leaq -0x1(%rdx), %rsi
cmpq $0x7, %rsi
ja 0xeed5
leaq 0x59a2(%rip), %rdx      # 0x147e8
movslq (%rdx,%rsi,4), %rsi
addq %rdx, %rsi
jmpq *%rsi
movzbl 0x40(%rdi), %ecx
xorl $0x1, %ecx
shlq $0x20, %rcx
movabsq $0x1b00006277, %rax     # imm = 0x1B00006277
addq %rcx, %rax
pushq $0x14
jmp 0xee24
xorl %edx, %edx
testb $0x20, %cl
sete %dl
movabsq $0x1800007777, %rcx     # imm = 0x1800007777
movabsq $0x1600007373, %rax     # imm = 0x1600007373
cmoveq %rcx, %rax
leal 0x10(,%rdx,2), %edx
jmp 0xee2b
xorl %edx, %edx
testb $0x20, %cl
sete %dl
movabsq $0x1500006464, %rcx     # imm = 0x1500006464
cmovneq %rcx, %rax
leal 0xf(,%rdx,2), %edx
jmp 0xee2b
movzbl 0x40(%rdi), %ecx
xorl $0x1, %ecx
shlq $0x20, %rcx
movabsq $0x1900006877, %rax     # imm = 0x1900006877
addq %rcx, %rax
pushq $0x13
jmp 0xee24
cmpq $0x10, %rdx
jne 0xeee9
leaq 0x6050(%rip), %rdi      # 0x14f32
xorl %eax, %eax
callq 0xcffb
leaq 0x5e32(%rip), %rdi      # 0x14d22
leaq 0x59c1(%rip), %rsi      # 0x148b8
leaq 0x6055(%rip), %rcx      # 0x14f53
movl $0xcb, %edx
callq 0x30e0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: zero
static void
zero(struct func *func, struct value *addr, int align, unsigned long long offset, unsigned long long end)
{
	static const enum instkind store[] = {
		[1] = ISTOREB,
		[2] = ISTOREH,
		[4] = ISTOREW,
		[8] = ISTOREL,
	};
	static struct value z = {.kind = VALUE_INTCONST};
	struct value *tmp;
	int a = 1;

	while (offset < end) {
		if ((align - (offset & align - 1)) & a) {
			tmp = offset ? funcinst(func, IADD, ptrclass, addr, mkintconst(offset)) : addr;
			funcinst(func, store[a], 0, &z, tmp);
			offset += a;
		}
		if (a < align)
			a <<= 1;
	}
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %r8, 0x10(%rsp)
movq %rcx, %r14
movq %rsi, %r12
movq %rdi, %rbx
movl %edx, 0x4(%rsp)
movslq %edx, %r13
leal -0x1(%r13), %eax
cltq
movq %rax, 0x8(%rsp)
pushq $0x1
popq %r15
cmpq 0x10(%rsp), %r14
jae 0xf1d3
movq %r14, %rax
andq 0x8(%rsp), %rax
movq %r13, %rcx
subq %rax, %rcx
movslq %r15d, %rbp
testq %rbp, %rcx
je 0xf1c6
movq %r12, %r8
testq %r14, %r14
je 0xf1a8
movq %r14, %rdi
callq 0xd317
movq %rbx, %rdi
pushq $0x1
popq %rsi
pushq $0x6c
popq %rdx
movq %r12, %rcx
movq %rax, %r8
callq 0xed68
movq %rax, %r8
leaq 0x56a1(%rip), %rax      # 0x14850
movl (%rax,%rbp,4), %esi
movq %rbx, %rdi
xorl %edx, %edx
leaq 0xcdb2(%rip), %rcx      # 0x1bf70
callq 0xed68
addq %rbp, %r14
cmpl 0x4(%rsp), %r15d
setl %cl
shll %cl, %r15d
jmp 0xf164
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: casesearch
static void
casesearch(struct func *f, int class, struct value *v, struct switchcase *c, struct block *defaultlabel)
{
	struct value *res, *key;
	struct block *label[3];

	if (!c) {
		funcjmp(f, defaultlabel);
		return;
	}
	label[0] = mkblock("switch_ne");
	label[1] = mkblock("switch_lt");
	label[2] = mkblock("switch_gt");

	/* XXX: linear search if c->node.height < 4 */
	key = mkintconst(c->node.key);
	res = funcinst(f, class == 'w' ? ICEQW : ICEQL, 'w', v, key);
	funcjnz(f, res, NULL, c->body, label[0]);
	funclabel(f, label[0]);
	res = funcinst(f, class == 'w' ? ICULTW : ICULTL, 'w', v, key);
	funcjnz(f, res, NULL, label[1], label[2]);
	funclabel(f, label[1]);
	casesearch(f, class, v, c->node.child[0], defaultlabel);
	funclabel(f, label[2]);
	casesearch(f, class, v, c->node.child[1], defaultlabel);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %r8, 0x20(%rsp)
movq %rcx, %r14
movq %rdx, 0x8(%rsp)
movq %rdi, %r12
movl %esi, 0x1c(%rsp)
cmpl $0x77, %esi
pushq $0x20
popq %rax
pushq $0x2a
popq %rcx
cmovel %eax, %ecx
movl %ecx, 0x18(%rsp)
pushq $0x27
popq %rax
pushq $0x31
popq %rcx
cmovel %eax, %ecx
movl %ecx, 0x14(%rsp)
testq %r14, %r14
je 0xf35f
leaq 0x5d0f(%rip), %rdi      # 0x14f79
callq 0xd279
movq %rax, %rbx
leaq 0x5d0a(%rip), %rdi      # 0x14f83
callq 0xd279
movq %rax, %r13
leaq 0x5d05(%rip), %rdi      # 0x14f8d
callq 0xd279
movq %rax, %rbp
movq (%r14), %rdi
callq 0xd317
movq %rax, %r15
movq %r12, %rdi
movl 0x18(%rsp), %esi
pushq $0x77
popq %rdx
movq 0x8(%rsp), %rcx
movq %rax, %r8
callq 0xed68
movq 0x30(%r12), %rcx
cmpl $0x0, 0x60(%rcx)
jne 0xf2d9
movq 0x20(%r14), %rdx
movl $0x2, 0x60(%rcx)
movq %rax, 0x68(%rcx)
movq %rdx, 0x70(%rcx)
movq %rbx, 0x78(%rcx)
movq 0x30(%r12), %rcx
movq %rbx, 0x80(%rcx)
movq %rbx, 0x30(%r12)
movq %r12, %rdi
movl 0x14(%rsp), %esi
pushq $0x77
popq %rdx
movq 0x8(%rsp), %rcx
movq %r15, %r8
callq 0xed68
movq 0x30(%r12), %rcx
cmpl $0x0, 0x60(%rcx)
jne 0xf31f
movl $0x2, 0x60(%rcx)
movq %rax, 0x68(%rcx)
movq %r13, 0x70(%rcx)
movq %rbp, 0x78(%rcx)
movq 0x30(%r12), %rcx
movq %r13, 0x80(%rcx)
movq %r13, 0x30(%r12)
movq 0x8(%r14), %rcx
movq %r12, %rdi
movl 0x1c(%rsp), %esi
movq 0x8(%rsp), %rdx
movq 0x20(%rsp), %r8
callq 0xf21b
movq 0x30(%r12), %rax
movq %rbp, 0x80(%rax)
movq %rbp, 0x30(%r12)
movq 0x10(%r14), %r14
jmp 0xf25a
movq 0x30(%r12), %rax
cmpl $0x0, 0x60(%rax)
jne 0xf37a
movl $0x1, 0x60(%rax)
movq 0x20(%rsp), %rcx
movq %rcx, 0x70(%rax)
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: emitclass
static void
emitclass(int class, struct value *v)
{
	if (v && v->kind == VALUE_TYPE)
		emitname(v);
	else if (class)
		putchar(class);
	else
		fatal("type has no QBE representation");
}

// Assembly:
testq %rsi, %rsi
je 0xf880
cmpl $0x6, (%rsi)
jne 0xf880
movq %rsi, %rdi
jmp 0xf896
testl %edi, %edi
jne 0x3030
leaq 0x572e(%rip), %rdi      # 0x14fbd
xorl %eax, %eax
jmp 0xcffb
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: emitname
static void
emitname(struct value *v)
{
	static const char sigil[] = {
		[VALUE_TEMP] = '%',
		[VALUE_GLOBAL] = '$',
		[VALUE_TYPE] = ':',
		[VALUE_LABEL] = '@',
	};
	int kind;

	kind = v->kind & 0xf;
	if (kind >= LEN(sigil) || !sigil[kind])
		fatal("invalid value");
	putchar(sigil[kind]);
	if (kind == VALUE_GLOBAL && v->id)
		fputs(".L", stdout);
	if (v->u.name)
		fputs(v->u.name, stdout);
	if (v->id)
		printf(".%u", v->id);
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl (%rdi), %r14d
andl $0xf, %r14d
cmpl $0x7, %r14d
ja 0xf8b3
pushq $0x1d
popq %rax
btl %r14d, %eax
jae 0xf8c1
leaq 0x5722(%rip), %rdi      # 0x14fdc
xorl %eax, %eax
callq 0xcffb
leaq 0x4fb8(%rip), %rax      # 0x14880
movsbl (%r14,%rax), %edi
callq 0x3030
cmpl $0x1, %r14d
jne 0xf8f4
cmpl $0x0, 0x4(%rbx)
je 0xf8f4
movq 0xb6db(%rip), %rax      # 0x1afc0
movq (%rax), %rsi
leaq 0x56fb(%rip), %rdi      # 0x14fea
callq 0x30f0
movq 0x8(%rbx), %rdi
testq %rdi, %rdi
je 0xf90c
movq 0xb6bc(%rip), %rax      # 0x1afc0
movq (%rax), %rsi
callq 0x30f0
movl 0x4(%rbx), %esi
testl %esi, %esi
je 0xf928
leaq 0x56d3(%rip), %rdi      # 0x14fed
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x30b0
addq $0x8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: emitvalue
static void
emitvalue(struct value *v)
{
	switch (v->kind & 0xf) {
	case VALUE_INTCONST:
		printf("%llu", v->u.i);
		break;
	case VALUE_FLTCONST:
		printf("s_%.17g", v->u.f);
		break;
	case VALUE_DBLCONST:
		printf("d_%.17g", v->u.f);
		break;
	case VALUE_GLOBAL:
		if (v->kind & VALUE_THREAD)
			fputs("thread ", stdout);
		/* fallthrough */
	default:
		emitname(v);
		break;
	}
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movl (%rdi), %eax
movl %eax, %ecx
andl $0xf, %ecx
decl %ecx
cmpl $0x3, %ecx
ja 0xf96c
leaq 0x4ed3(%rip), %rdx      # 0x1481c
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
testb $0x10, %al
je 0xf96c
movq 0xb663(%rip), %rax      # 0x1afc0
movq (%rax), %rsi
leaq 0x5146(%rip), %rdi      # 0x14aad
callq 0x30f0
movq %rbx, %rdi
popq %rbx
jmp 0xf896
movsd 0x8(%rbx), %xmm0
leaq 0x5670(%rip), %rdi      # 0x14ff1
jmp 0xf98f
movsd 0x8(%rbx), %xmm0
leaq 0x566a(%rip), %rdi      # 0x14ff9
movb $0x1, %al
popq %rbx
jmp 0x30b0
movq 0x8(%rbx), %rsi
leaq 0x1cfd(%rip), %rdi      # 0x1169f
xorl %eax, %eax
popq %rbx
jmp 0x30b0
// File: /workspace/github_c_makefile_star2_O2/michaelforney[P]cproc/qbe.c
// Function: funcbits
static struct value *
funcbits(struct func *f, struct type *t, struct value *v, struct bitfield b)
{
	int class, bits;

	class = t->size <= 4 ? 'w' : 'l';
	bits = b.after;
	if (bits) {
		bits += (t->size + 3 & ~3) - t->size << 3;
		v = funcinst(f, ISHL, class, v, mkintconst(bits));
	}
	bits += b.before;
	if (bits)
		v = funcinst(f, t->u.basic.issigned ? ISAR : ISHR, class, v, mkintconst(bits));
	return v;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movl %ecx, %r12d
movq %rdx, %rbx
movq %rsi, %r15
movq %rdi, %r14
movq 0x10(%rsi), %rax
cmpq $0x5, %rax
pushq $0x77
popq %rcx
pushq $0x6c
popq %rbp
cmovbl %ecx, %ebp
xorl %r13d, %r13d
cmpl $0x10000, %r12d         # imm = 0x10000
jb 0x10060
movl %r12d, %ecx
sarl $0x10, %ecx
leal 0x3(%rax), %edx
andl $0x1ffffffc, %edx       # imm = 0x1FFFFFFC
subl %eax, %edx
leal (%rcx,%rdx,8), %r13d
movslq %r13d, %rdi
callq 0xd317
pushq $0xe
popq %rsi
movq %r14, %rdi
movl %ebp, %edx
movq %rbx, %rcx
movq %rax, %r8
callq 0xed68
movq %rax, %rbx
movswl %r12w, %eax
addl %r13d, %eax
je 0x1009b
movzbl 0x40(%r15), %r15d
xorl $0xd, %r15d
movslq %eax, %rdi
callq 0xd317
movq %r14, %rdi
movl %r15d, %esi
movl %ebp, %edx
movq %rbx, %rcx
movq %rax, %r8
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0xed68
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/cirocosta[P]stress/src/files.c
// Function: create_file
void
create_file(const char* base, const int i)
{
	FILE* fp;
	char* filename;

	_STRESS_MUST(asprintf(&filename, "%s/file%d", base, i) > 0,
	             "Couldn't create name for file %d",
	             i);
	_STRESS_MUST(
	  (fp = fopen(filename, "a")), "Couldn't create file %s", filename);
	fprintf(fp, "dummy");
	fclose(fp);
	free(filename);
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x10, %rsp
movl %esi, %ebp
movq %rdi, %rdx
leaq 0xa25(%rip), %rsi       # 0x2117
leaq 0x8(%rsp), %rdi
movl %ebp, %ecx
xorl %eax, %eax
callq 0x1140
testl %eax, %eax
jle 0x1751
movq 0x8(%rsp), %rdi
leaq 0xa3e(%rip), %rsi       # 0x214e
callq 0x1150
testq %rax, %rax
je 0x17d6
movq %rax, %rbx
leaq 0xa40(%rip), %rdi       # 0x2168
pushq $0x5
popq %rsi
pushq $0x1
popq %rdx
movq %rax, %rcx
callq 0x1190
movq %rbx, %rdi
callq 0x10b0
movq 0x8(%rsp), %rdi
callq 0x1030
addq $0x10, %rsp
popq %rbx
popq %r14
popq %rbp
retq
movq 0x28a0(%rip), %r14      # 0x3ff8
movq (%r14), %rcx
leaq 0x8cd(%rip), %rdi       # 0x202f
pushq $0x9
popq %rsi
pushq $0x1
popq %rbx
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rcx
leaq 0x8bb(%rip), %rdi       # 0x2035
pushq $0x3
popq %rsi
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rdi
leaq 0x992(%rip), %rsi       # 0x2121
movl %ebp, %edx
xorl %eax, %eax
callq 0x1120
movq (%r14), %rcx
leaq 0x8ba(%rip), %rdi       # 0x205c
pushq $0x2
popq %rsi
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rdi
leaq 0x8a8(%rip), %rsi       # 0x205f
leaq 0x984(%rip), %rdx       # 0x2142
xorl %eax, %eax
callq 0x1120
movq (%r14), %rdi
leaq 0x8ac(%rip), %rsi       # 0x207b
pushq $0x16
jmp 0x1859
movq 0x281b(%rip), %r14      # 0x3ff8
movq (%r14), %rcx
leaq 0x848(%rip), %rdi       # 0x202f
pushq $0x9
popq %rsi
pushq $0x1
popq %rbx
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rcx
leaq 0x836(%rip), %rdi       # 0x2035
pushq $0x3
popq %rsi
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rdi
movq 0x8(%rsp), %rdx
leaq 0x937(%rip), %rsi       # 0x2150
xorl %eax, %eax
callq 0x1120
movq (%r14), %rcx
leaq 0x832(%rip), %rdi       # 0x205c
pushq $0x2
popq %rsi
movq %rbx, %rdx
callq 0x1190
movq (%r14), %rdi
leaq 0x820(%rip), %rsi       # 0x205f
leaq 0x8fc(%rip), %rdx       # 0x2142
xorl %eax, %eax
callq 0x1120
movq (%r14), %rdi
leaq 0x824(%rip), %rsi       # 0x207b
pushq $0x18
popq %rdx
xorl %eax, %eax
callq 0x1120
movq (%r14), %rsi
pushq $0xa
popq %rdi
callq 0x1100
movq (%r14), %rcx
leaq 0x812(%rip), %rdi       # 0x2088
pushq $0xa
popq %rsi
movq %rbx, %rdx
callq 0x1190
pushq $0x1
popq %rdi
callq 0x1180
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile.c
// Function: main
int main(int argc, char **argv)
{
	char *file;
	struct string_list *filelist = NULL;

	bits_in_bool = 8;

	clean_up_symbols(sparse_initialize(argc, argv, &filelist));
	FOR_EACH_PTR(filelist, file) {
		struct symbol_list *list;
		const char *basename = strrchr(file, '/');
		basename = basename ?  basename+1 : file;

		list = sparse(file);

		// Do type evaluation and simplification
		emit_unit_begin(basename);
		clean_up_symbols(list);
		emit_unit_end();
	} END_FOR_EACH_PTR(file);

#if 0
	// And show the allocation statistics
	show_ident_alloc();
	show_token_alloc();
	show_symbol_alloc();
	show_expression_alloc();
	show_statement_alloc();
	show_string_alloc();
	show_bytes_alloc();
#endif
	return 0;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsp, %rbx
andq $0x0, (%rbx)
leaq 0x53f27(%rip), %rax     # 0x6239c
movl $0x8, (%rax)
movq %rbx, %rdx
callq 0x115d0
movq %rax, %rdi
callq 0xe50c
movq (%rbx), %r12
testq %r12, %r12
je 0xe4fb
pushq $0x2f
popq %rbx
movq %r12, %r13
xorl %ebp, %ebp
movl (%r13), %eax
movsbq %al, %rcx
cmpq %rcx, %rbp
jge 0xe4f2
movq 0x18(%r13,%rbp,8), %r14
cmpw $0x100, %ax             # imm = 0x100
jb 0xe4b8
testq %r14, %r14
je 0xe4ed
movq %r14, %rdi
movl %ebx, %esi
callq 0xe130
leaq 0x1(%rax), %r15
testq %rax, %rax
cmoveq %r14, %r15
movq %r14, %rdi
callq 0x118f4
movq %rax, %r14
movq %r15, %rdi
callq 0x385f0
movq %r14, %rdi
callq 0xe50c
callq 0x38601
incq %rbp
jmp 0xe49b
movq 0x10(%r13), %r13
cmpq %r12, %r13
jne 0xe499
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile.c
// Function: clean_up_symbols
static void clean_up_symbols(struct symbol_list *list)
{
	struct symbol *sym;

	FOR_EACH_PTR(list, sym) {
		expand_symbol(sym);
		emit_one_symbol(sym);
	} END_FOR_EACH_PTR(sym);
}

// Assembly:
testq %rdi, %rdi
je 0xe567
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movq %rdi, %r15
xorl %r12d, %r12d
movl (%r15), %eax
movsbq %al, %rcx
cmpq %rcx, %r12
jge 0xe553
movq 0x18(%r15,%r12,8), %r14
cmpw $0x100, %ax             # imm = 0x100
jb 0xe53e
testq %r14, %r14
je 0xe54e
movq %r14, %rdi
callq 0xe7ef
movq %r14, %rdi
callq 0x3867d
incq %r12
jmp 0xe522
movq 0x10(%r15), %r15
cmpq %rbx, %r15
jne 0xe51f
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_unit_end
static void textbuf_emit(struct textbuf **buf_p)
{
	struct textbuf *tmp, *list = *buf_p;

	while (list) {
		tmp = list;
		if (tmp->next == tmp)
			list = NULL;
		else {
			tmp->prev->next = tmp->next;
			tmp->next->prev = tmp->prev;
			list = tmp->next;
		}

		fputs(tmp->text, stdout);

		free(tmp);
	}

	*buf_p = list;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq 0x583b3(%rip), %rbx     # 0x909c0
movq 0x258f4(%rip), %r14     # 0x5df08
testq %rbx, %rbx
je 0x38658
movq 0x10(%rbx), %rax
cmpq %rbx, %rax
je 0x3863c
movq 0x18(%rbx), %rcx
movq %rax, 0x10(%rcx)
movq 0x10(%rbx), %rax
movq 0x18(%rbx), %rcx
movq %rcx, 0x18(%rax)
movq 0x10(%rbx), %r15
jmp 0x3863f
xorl %r15d, %r15d
movq 0x8(%rbx), %rdi
movq (%r14), %rsi
callq 0xe150
movq %rbx, %rdi
callq 0xe030
movq %r15, %rbx
jmp 0x38614
andq $0x0, 0x58360(%rip)     # 0x909c0
leaq 0x29f11(%rip), %rax     # 0x62578
movq (%rax), %rsi
leaq 0xf560(%rip), %rdi      # 0x47bd1
xorl %eax, %eax
popq %rbx
popq %r14
popq %r15
jmp 0xe110
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_object_pre
static void emit_object_pre(const char *name, unsigned long modifiers,
			    unsigned long alignment, unsigned int byte_size)
{
	if ((modifiers & MOD_STATIC) == 0)
		printf(".globl %s\n", name);
	emit_section(".data");
	if (alignment)
		printf("\t.align %lu\n", alignment);
	printf("\t.type\t%s, @object\n", name);
	printf("\t.size\t%s, %d\n", name, byte_size);
	printf("%s:\n", name);
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
movl %ecx, %ebp
movq %rdx, %r14
movq %rdi, %rbx
testb $0x4, %sil
jne 0x390c9
leaq 0xebfe(%rip), %rdi      # 0x47cbd
movq %rbx, %rsi
xorl %eax, %eax
callq 0xe110
leaq 0xebf8(%rip), %rdi      # 0x47cc8
callq 0x3a84d
testq %r14, %r14
je 0x390eb
leaq 0xebed(%rip), %rdi      # 0x47cce
movq %r14, %rsi
xorl %eax, %eax
callq 0xe110
leaq 0xebe9(%rip), %rdi      # 0x47cdb
movq %rbx, %rsi
xorl %eax, %eax
callq 0xe110
leaq 0xebec(%rip), %rdi      # 0x47cef
movq %rbx, %rsi
movl %ebp, %edx
xorl %eax, %eax
callq 0xe110
leaq 0x3461(%rip), %rdi      # 0x3c577
movq %rbx, %rsi
xorl %eax, %eax
popq %rbx
popq %r14
popq %rbp
jmp 0xe110
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_scalar
static void emit_scalar(struct expression *expr, unsigned int bit_size)
{
	const char *type;
	long long ll;

	assert(expr->type == EXPR_VALUE);

	if (expr->value == 0ULL) {
		printf("\t.zero\t%d\n", bit_size / 8);
		return;
	}

	ll = (long long) expr->value;

	switch (bit_size) {
	case 8:		type = "byte";	ll = (char) ll; break;
	case 16:	type = "value";	ll = (short) ll; break;
	case 32:	type = "long";	ll = (int) ll; break;
	case 64:	type = "quad";	break;
	default:	type = NULL;	break;
	}

	assert(type != NULL);

	printf("\t.%s\t%lld\n", type, ll);
}

// Assembly:
pushq %rax
cmpb $0x1, (%rdi)
jne 0x3919c
movq 0x20(%rdi), %rdx
testq %rdx, %rdx
je 0x3915b
addl $-0x8, %esi
roll $0x1d, %esi
cmpl $0x7, %esi
ja 0x391bb
leaq 0xe927(%rip), %rax      # 0x47a6c
movslq (%rax,%rsi,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movsbq %dl, %rdx
leaq 0x506f(%rip), %rsi      # 0x3e1c8
jmp 0x3918d
shrl $0x3, %esi
leaq 0xead0(%rip), %rdi      # 0x47c35
xorl %eax, %eax
popq %rcx
jmp 0xe110
movslq %edx, %rdx
leaq 0x8200(%rip), %rsi      # 0x41377
jmp 0x3918d
leaq 0xebcb(%rip), %rsi      # 0x47d4b
jmp 0x3918d
movswq %dx, %rdx
leaq 0xb750(%rip), %rsi      # 0x448dd
leaq 0xebbc(%rip), %rdi      # 0x47d50
xorl %eax, %eax
popq %rcx
jmp 0xe110
leaq 0xeb5b(%rip), %rdi      # 0x47cfe
leaq 0xea6a(%rip), %rsi      # 0x47c14
leaq 0xeb66(%rip), %rcx      # 0x47d17
movl $0x397, %edx            # imm = 0x397
callq 0xe140
leaq 0xea45(%rip), %rdi      # 0x47c07
leaq 0xea4b(%rip), %rsi      # 0x47c14
leaq 0xeb47(%rip), %rcx      # 0x47d17
movl $0x3a8, %edx            # imm = 0x3A8
callq 0xe140
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: stor_sym_init
static void stor_sym_init(struct symbol *sym)
{
	struct storage *stor;
	struct symbol_private *priv;

	priv = calloc(1, sizeof(*priv) + sizeof(*stor));
	if (!priv)
		die("OOM in stor_sym_init");

	stor = (struct storage *) (priv + 1);

	priv->addr = stor;
	stor->type = STOR_SYM;
	stor->sym = sym;
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
pushq $0x1
popq %rdi
pushq $0x38
popq %rsi
callq 0xe1e0
testq %rax, %rax
je 0x39205
movq %rax, %rcx
addq $0x8, %rcx
movq %rcx, (%rax)
movl $0x2, 0x8(%rax)
movq %rbx, 0x28(%rax)
popq %rbx
retq
leaq 0xeb4f(%rip), %rdi      # 0x47d5b
xorl %eax, %eax
callq 0x1143a
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_initializer
static void emit_initializer(struct symbol *sym,
			     struct expression *expr)
{
	int distance = ea_current - ea_last - 1;

	if (distance > 0)
		printf("\t.zero\t%d\n", (sym->bit_size / 8) * distance);

	if (expr->type == EXPR_VALUE) {
		struct symbol *base_type = sym->ctype.base_type;
		assert(base_type != NULL);

		emit_scalar(expr, sym->bit_size / get_expression_value(base_type->array_size));
		return;
	}
	if (expr->type != EXPR_INITIALIZER)
		return;

	assert(0); /* FIXME */
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movl 0x56331(%rip), %esi     # 0x909c8
notl %esi
addl 0x5632d(%rip), %esi     # 0x909cc
testl %esi, %esi
jle 0x3a6be
movl 0x50(%r14), %eax
pushq $0x8
popq %rcx
cltd
idivl %ecx
imull %eax, %esi
leaq 0xd57e(%rip), %rdi      # 0x47c35
xorl %eax, %eax
callq 0xe110
movzbl (%rbx), %eax
cmpl $0x1, %eax
je 0x3a6d3
cmpl $0x18, %eax
je 0x3a705
addq $0x8, %rsp
popq %rbx
popq %r14
retq
movq 0x60(%r14), %rax
testq %rax, %rax
je 0x3a724
movslq 0x50(%r14), %r14
movq 0x58(%rax), %rdi
callq 0xfe97
movq %rax, %rcx
movq %r14, %rax
cqto
idivq %rcx
movq %rbx, %rdi
movl %eax, %esi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x39124
leaq 0x6739(%rip), %rdi      # 0x40e45
leaq 0xd501(%rip), %rsi      # 0x47c14
leaq 0xd526(%rip), %rcx      # 0x47c40
movl $0x3d1, %edx            # imm = 0x3D1
callq 0xe140
leaq 0xd4d7(%rip), %rdi      # 0x47c02
leaq 0xd4e2(%rip), %rsi      # 0x47c14
leaq 0xd507(%rip), %rcx      # 0x47c40
movl $0x3c9, %edx            # imm = 0x3C9
callq 0xe140
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_global_noinit
static void emit_global_noinit(const char *name, unsigned long modifiers,
			       unsigned long alignment, unsigned int byte_size)
{
	char s[64];

	if (modifiers & MOD_STATIC) {
		sprintf(s, "\t.local\t%s\n", name);
		textbuf_push(&unit_post_text, s);
	}
	if (alignment)
		sprintf(s, "\t.comm\t%s,%d,%lu\n", name, byte_size, alignment);
	else
		sprintf(s, "\t.comm\t%s,%d\n", name, byte_size);
	textbuf_push(&unit_post_text, s);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x48, %rsp
movl %ecx, %ebx
movq %rdx, %r15
movq %rdi, %r14
testb $0x4, %sil
je 0x3a77b
leaq 0xd519(%rip), %rsi      # 0x47c7c
movq %rsp, %r12
movq %r12, %rdi
movq %r14, %rdx
xorl %eax, %eax
callq 0xe300
movq %r12, %rdi
callq 0x3a7c5
testq %r15, %r15
je 0x3a79b
leaq 0xd501(%rip), %rsi      # 0x47c88
movq %rsp, %rdi
movq %r14, %rdx
movl %ebx, %ecx
movq %r15, %r8
xorl %eax, %eax
callq 0xe300
jmp 0x3a7b1
leaq 0xd4f8(%rip), %rsi      # 0x47c9a
movq %rsp, %rdi
movq %r14, %rdx
movl %ebx, %ecx
xorl %eax, %eax
callq 0xe300
movq %rsp, %rdi
callq 0x3a7c5
addq $0x48, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: textbuf_push
static void textbuf_push(struct textbuf **buf_p, const char *text)
{
	struct textbuf *tmp, *list = *buf_p;
	unsigned int text_len = strlen(text);
	unsigned int alloc_len = text_len + 1 + sizeof(*list);

	tmp = calloc(1, alloc_len);
	if (!tmp)
		die("OOM on textbuf alloc");

	tmp->text = ((void *) tmp) + sizeof(*tmp);
	memcpy(tmp->text, text, text_len + 1);
	tmp->len = text_len;

	/* add to end of list */
	if (!list) {
		list = tmp;
		tmp->prev = tmp;
	} else {
		tmp->prev = list->prev;
		tmp->prev->next = tmp;
		list->prev = tmp;
	}
	tmp->next = list;

	*buf_p = list;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %r14
movq 0x561e9(%rip), %r12     # 0x909c0
callq 0xe0f0
movq %rax, %r15
leal 0x21(%rax), %esi
pushq $0x1
popq %rdi
callq 0xe1e0
testq %rax, %rax
je 0x3a83f
movq %rax, %rbx
leal 0x1(%r15), %edx
movq %rax, %rdi
addq $0x20, %rdi
movq %rdi, 0x8(%rax)
movq %r14, %rsi
callq 0xe210
movl %r15d, (%rbx)
movq %rbx, %rax
testq %r12, %r12
je 0x3a824
movq 0x18(%r12), %rax
movq %rax, 0x18(%rbx)
movq %rbx, 0x10(%rax)
movq %r12, %rax
movq %rbx, 0x18(%rax)
movq %rax, 0x10(%rbx)
movq %rax, 0x5618d(%rip)     # 0x909c0
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0xd462(%rip), %rdi      # 0x47ca8
xorl %eax, %eax
callq 0x1143a
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: emit_section
static void emit_section(const char *s)
{
	if (s == current_section)
		return;
	if (current_section && (!strcmp(s, current_section)))
		return;

	printf("\t%s\n", s);
	current_section = s;
}

// Assembly:
movq 0x5617c(%rip), %rsi     # 0x909d0
cmpq %rdi, %rsi
je 0x3a887
pushq %rbx
movq %rdi, %rbx
testq %rsi, %rsi
je 0x3a86e
movq %rbx, %rdi
callq 0xe1f0
testl %eax, %eax
je 0x3a886
leaq 0x6ce0(%rip), %rdi      # 0x41555
movq %rbx, %rsi
xorl %eax, %eax
callq 0xe110
movq %rbx, 0x5614a(%rip)     # 0x909d0
popq %rbx
retq
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: x86_symbol_decl
static void x86_symbol_decl(struct symbol_list *syms)
{
	struct symbol *sym;
	FOR_EACH_PTR(syms, sym) {
		x86_symbol_init(sym);
	} END_FOR_EACH_PTR(sym);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, (%rsp)
testq %rdi, %rdi
je 0x3a920
pushq $0x8
popq %r15
movq (%rsp), %rbx
xorl %ebp, %ebp
movl (%rbx), %eax
movsbq %al, %rcx
cmpq %rcx, %rbp
jge 0x3a916
movq 0x18(%rbx,%rbp,8), %r14
cmpw $0x100, %ax             # imm = 0x100
jb 0x3a8c5
testq %r14, %r14
je 0x3a911
movq 0xb0(%r14), %rdi
movq 0xd0(%r14), %r12
testq %rdi, %rdi
je 0x3a8df
callq 0x39a55
jmp 0x3a8f0
movl 0x50(%r14), %eax
cltd
pushq $0x8
popq %rcx
idivl %ecx
movl %eax, %edi
callq 0x3ab9c
movq %rax, %r13
testq %r12, %r12
jne 0x3a90d
pushq $0x1
popq %rdi
movq %r15, %rsi
callq 0xe1e0
movq %rax, %r12
movq %rax, 0xd0(%r14)
movq %r13, (%r12)
incq %rbp
jmp 0x3a8aa
movq 0x10(%rbx), %rbx
cmpq (%rsp), %rbx
jne 0x3a8a8
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/lucvoo[P]sparse-dev/compile-i386.c
// Function: new_storage
static struct storage *new_storage(enum storage_type type)
{
	struct storage *stor;

	stor = calloc(1, sizeof(*stor));
	if (!stor)
		die("OOM in new_storage");

	stor->type = type;

	return stor;
}

// Assembly:
pushq %rbx
movl %edi, %ebx
pushq $0x1
popq %rdi
pushq $0x30
popq %rsi
callq 0xe1e0
testq %rax, %rax
je 0x3a946
movl %ebx, (%rax)
popq %rbx
retq
leaq 0xd74d(%rip), %rdi      # 0x4809a
xorl %eax, %eax
callq 0x1143a