Using Stack Unwind Directives Example

The example below is a simple “Hello World” function that shows the usage of local and output registers. For comparison, the first part (A) does not include unwind directives, and the second part (B) includes stak unwind directives and DV detection clues.

Using Unwind Directives

A. "Hello World" Function Without Unwind Directives

// The string is defined in the read only data section
.section .rdata, "a", "progbits"
.align 8
.STRING1:
stringz "Hello World!!!\n"

// The definition of the function hello is in the text section
// The following registers are saved in local registers:
//    gp = r1  - loc0 = r32
//    rp = b0  - loc1 = r33
//    ar.pfs   - loc2 = r34
//    sp = r12 - loc3 = r35
.text
.global hello
.proc hello
hello:
alloc loc2 = ar.pfs, 0, 4, 1, 0
mov loc3 = sp
mov loc1 = b0
addl out0 = @ltoff(.STRING1), gp
;;
ld8 out0 = [out0]
mov loc0 = gp
br.call.sptk.many b0 = printf
;;
mov gp = loc0
mov ar.pfs = loc2
mov b0 = loc1
mov sp = loc3
br.ret.sptk.many b0
.endp hello

.global printf
.type printf, @function

B. "Hello World" Function With Unwind Directives

    .file "hello.c"
.pred.safe_across_calls p1-p5,p16-p63

.section .rdata, "a", "progbits"
.align 8
.STRING1:
stringz "Hello World!!!\n"
.text
.align 16
.global hello#
.proc hello#
hello:
.prologue
.save ar.pfs, r34
alloc r34 = ar.pfs, 0, 4, 1, 0
.vframe r35
mov r35 = r12
.save rp, r33
mov r33 = b0
.body
addl r36 = @ltoff(.STRING1), gp
;;
ld8 r36 = [r36]
mov r32 = r1
br.call.sptk.many b0 = printf#
;;
mov r1 = r32
mov ar.pfs = r34
mov b0 = r33
.restore sp
mov r12 = r35
br.ret.sptk.many b0
.endp hello#

.global printf#
.type printf#, @function