TC-Y FAQ

How to compile and test?

To generate a binary from an ARM assembly file:

add-arm.tig
let
  function add(x: int, y: int) : int = x + y
in
  print_int(add(1,(add(2, 3)))); print("\n")
end
tc -e --target-arm --asm-compute --inst-display add-arm.tig
$ tc -e --target-arm --asm-compute --inst-display add-arm.tig
# Tiger final assembler ouput.

# Routine: add
.global tc_l0
.text
tc_l0:
	push	{fp, lr}
	sub	fp, sp, #4
	sub	sp, sp, #4
	str	r1, [fp, #0]
l2:
	add	r0, r2, r3
l3:
	add	sp, sp, #4
	pop	{fp, pc}

.ltorg

.data
l1:
	.word 1
	.asciz "\n"

# Routine: _main
.global tc_main
.text
tc_main:
	push	{fp, lr}
	sub	fp, sp, #4
	sub	sp, sp, #0
l4:
	mov	r1, fp
	ldr	r2, =2
	ldr	r3, =3
	bl	tc_l0
	mov	r3, r0
	mov	r1, fp
	ldr	r2, =1
	bl	tc_l0
	mov	r1, r0
	bl	tc_print_int
	ldr	r1, =l1
	bl	tc_print
l5:
	add	sp, sp, #0
	pop	{fp, pc}

.ltorg
$ echo $?
0
tc -e --target-arm --asm-display add-arm.tig > add-arm.s
$ tc -e --target-arm --asm-display add-arm.tig > add-arm.s

$ echo $?
0
arm-linux-gnueabihf-gcc -march=armv7-a -oadd-arm add-arm.s
$ arm-linux-gnueabihf-gcc -march=armv7-a -oadd-arm add-arm.s
/usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: warning: /tmp/ccqPC6lP.o: missing .note.GNU-stack section implies executable stack
/usr/lib/gcc-cross/arm-linux-gnueabihf/11/../../../../arm-linux-gnueabihf/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
$ echo $?
0

To run your code, use QEMU:

qemu-arm -L /usr/arm-linux-gnueabihf ./add-arm
$ qemu-arm -L /usr/arm-linux-gnueabihf ./add-arm
6
$ echo $?
0

QEMU (Quick Emulator) is a machine emulator and virtualizer. It can emulate a full system, including processor and peripherals. We are using it to emulate an ARM processor.