예제 #1
0
func (v *gen) genFunction(fn *ir.Function) {
	v.nl()
	v.emitDirec(".globl %s", fn.Name())
	v.emitDirec(".type %s,@function", fn.Name())

	v.emitLabel("%s:", fn.Name())
	// setup the stack
	v.emitOp("pushl @ebp")
	v.emitOp("movl @esp, @ebp")
	v.emitOp("pusha")
	v.emitOp("andl $-16, @esp") // align SP to 16-byte boundary

	alloc := v.target.newAllocator()
	alloc.allocFunction(fn)
	v.emitOp("subl $%d, @esp", alloc.stackSize) // actually allocate the stack vars

	labelNames := make(map[*ir.Block]string)
	for _, block := range fn.Blocks() {
		labelNames[block] = v.nextLabelName()
	}

	for _, block := range fn.Blocks() {
		v.genBlock(block, alloc, labelNames)
	}
}