Skip to content

Commit

Permalink
gas: testsuite: add an x86 testsuite for SCFI
Browse files Browse the repository at this point in the history
The testsuite for SCFI contains target-specific tests.

When a test is executed with --scfi=experimental command line option,
the CFI annotations in the test .s files are skipped altogether by the
GAS for processing.  The CFI directives in the input assembly files are,
however, validated by running the assembler one more time without
--scfi=experimental.

Some testcases are used to highlight those asm constructs that the SCFI
machinery in GAS currently does not support:

  - Only System V AMD64 ABI is supported for now. Using either --32 or
    --x32 with SCFI results in hard error.
    See scfi-unsupported-1.s.

  - Untraceable stack-pointer manipulation in function epilougue and prologue.
    See scfi-unsupported-2.s.

  - Using Dynamically Realigned Arguement Pointer (DRAP) register to
    realign the stack.  For SCFI, the CFA must be only REG_SP or REG_FP
    based.  See scfi-unsupported-drap-1.s

Some testcases are used to highlight some diagnostics that the SCFI
machinery in GAS currently issues, with an intent to help user correct
inadvertent errors in their hand-written asm.  An error is issued when
GAS finds that input asm is not amenable to correct CFI synthesis.

  - (#1) "Warning: SCFI: Asymetrical register restore"
  - (#2) "Error: SCFI: usage of REG_FP as scratch not supported"
  - (#3) "Error: SCFI: unsupported stack manipulation pattern"

In case of (#2) and (#3), SCFI generation is skipped for the respective
function.  Above is a subset of the warnings/errors implemented in the
code.

gas/testsuite/:
	* gas/scfi/README: New test.
	* gas/scfi/x86_64/ginsn-add-1.l: New test.
	* gas/scfi/x86_64/ginsn-add-1.s: New test.
	* gas/scfi/x86_64/ginsn-dw2-regnum-1.l: New test.
	* gas/scfi/x86_64/ginsn-dw2-regnum-1.s: New test.
	* gas/scfi/x86_64/ginsn-pop-1.l: New test.
	* gas/scfi/x86_64/ginsn-pop-1.s: New test.
	* gas/scfi/x86_64/ginsn-push-1.l: New test.
	* gas/scfi/x86_64/ginsn-push-1.s: New test.
	* gas/scfi/x86_64/scfi-add-1.d: New test.
	* gas/scfi/x86_64/scfi-add-1.l: New test.
	* gas/scfi/x86_64/scfi-add-1.s: New test.
	* gas/scfi/x86_64/scfi-add-2.d: New test.
	* gas/scfi/x86_64/scfi-add-2.l: New test.
	* gas/scfi/x86_64/scfi-add-2.s: New test.
	* gas/scfi/x86_64/scfi-asm-marker-1.d: New test.
	* gas/scfi/x86_64/scfi-asm-marker-1.l: New test.
	* gas/scfi/x86_64/scfi-asm-marker-1.s: New test.
	* gas/scfi/x86_64/scfi-asm-marker-2.d: New test.
	* gas/scfi/x86_64/scfi-asm-marker-2.l: New test.
	* gas/scfi/x86_64/scfi-asm-marker-2.s: New test.
	* gas/scfi/x86_64/scfi-asm-marker-3.d: New test.
	* gas/scfi/x86_64/scfi-asm-marker-3.l: New test.
	* gas/scfi/x86_64/scfi-asm-marker-3.s: New test.
	* gas/scfi/x86_64/scfi-bp-sp-1.d: New test.
	* gas/scfi/x86_64/scfi-bp-sp-1.l: New test.
	* gas/scfi/x86_64/scfi-bp-sp-1.s: New test.
	* gas/scfi/x86_64/scfi-bp-sp-2.d: New test.
	* gas/scfi/x86_64/scfi-bp-sp-2.l: New test.
	* gas/scfi/x86_64/scfi-bp-sp-2.s: New test.
	* gas/scfi/x86_64/scfi-callee-saved-1.d: New test.
	* gas/scfi/x86_64/scfi-callee-saved-1.l: New test.
	* gas/scfi/x86_64/scfi-callee-saved-1.s: New test.
	* gas/scfi/x86_64/scfi-callee-saved-2.d: New test.
	* gas/scfi/x86_64/scfi-callee-saved-2.l: New test.
	* gas/scfi/x86_64/scfi-callee-saved-2.s: New test.
	* gas/scfi/x86_64/scfi-callee-saved-3.d: New test.
	* gas/scfi/x86_64/scfi-callee-saved-3.l: New test.
	* gas/scfi/x86_64/scfi-callee-saved-3.s: New test.
	* gas/scfi/x86_64/scfi-callee-saved-4.d: New test.
	* gas/scfi/x86_64/scfi-callee-saved-4.l: New test.
	* gas/scfi/x86_64/scfi-callee-saved-4.s: New test.
	* gas/scfi/x86_64/scfi-cfg-1.d: New test.
	* gas/scfi/x86_64/scfi-cfg-1.l: New test.
	* gas/scfi/x86_64/scfi-cfg-1.s: New test.
	* gas/scfi/x86_64/scfi-cfg-2.d: New test.
	* gas/scfi/x86_64/scfi-cfg-2.l: New test.
	* gas/scfi/x86_64/scfi-cfg-2.s: New test.
	* gas/scfi/x86_64/scfi-cfi-label-1.d: New test.
	* gas/scfi/x86_64/scfi-cfi-label-1.l: New test.
	* gas/scfi/x86_64/scfi-cfi-label-1.s: New test.
	* gas/scfi/x86_64/scfi-cfi-sections-1.d: New test.
	* gas/scfi/x86_64/scfi-cfi-sections-1.l: New test.
	* gas/scfi/x86_64/scfi-cfi-sections-1.s: New test.
	* gas/scfi/x86_64/scfi-cofi-1.d: New test.
	* gas/scfi/x86_64/scfi-cofi-1.l: New test.
	* gas/scfi/x86_64/scfi-cofi-1.s: New test.
	* gas/scfi/x86_64/scfi-diag-1.l: New test.
	* gas/scfi/x86_64/scfi-diag-1.s: New test.
	* gas/scfi/x86_64/scfi-diag-2.l: New test.
	* gas/scfi/x86_64/scfi-diag-2.s: New test.
	* gas/scfi/x86_64/scfi-dyn-stack-1.d: New test.
	* gas/scfi/x86_64/scfi-dyn-stack-1.l: New test.
	* gas/scfi/x86_64/scfi-dyn-stack-1.s: New test.
	* gas/scfi/x86_64/scfi-enter-1.d: New test.
	* gas/scfi/x86_64/scfi-enter-1.l: New test.
	* gas/scfi/x86_64/scfi-enter-1.s: New test.
	* gas/scfi/x86_64/scfi-fp-diag-2.l: New test.
	* gas/scfi/x86_64/scfi-fp-diag-2.s: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-1.d: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-1.l: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-1.s: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-2.d: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-2.l: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-2.s: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-3.d: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-3.l: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-3.s: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-4.d: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-4.l: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-4.s: New test.
	* gas/scfi/x86_64/scfi-indirect-mov-5.s: New test.
	* gas/scfi/x86_64/scfi-lea-1.d: New test.
	* gas/scfi/x86_64/scfi-lea-1.l: New test.
	* gas/scfi/x86_64/scfi-lea-1.s: New test.
	* gas/scfi/x86_64/scfi-leave-1.d: New test.
	* gas/scfi/x86_64/scfi-leave-1.l: New test.
	* gas/scfi/x86_64/scfi-leave-1.s: New test.
	* gas/scfi/x86_64/scfi-pushq-1.d: New test.
	* gas/scfi/x86_64/scfi-pushq-1.l: New test.
	* gas/scfi/x86_64/scfi-pushq-1.s: New test.
	* gas/scfi/x86_64/scfi-pushsection-1.d: New test.
	* gas/scfi/x86_64/scfi-pushsection-1.l: New test.
	* gas/scfi/x86_64/scfi-pushsection-1.s: New test.
	* gas/scfi/x86_64/scfi-pushsection-2.d: New test.
	* gas/scfi/x86_64/scfi-pushsection-2.l: New test.
	* gas/scfi/x86_64/scfi-pushsection-2.s: New test.
	* gas/scfi/x86_64/scfi-selfalign-func-1.d: New test.
	* gas/scfi/x86_64/scfi-selfalign-func-1.l: New test.
	* gas/scfi/x86_64/scfi-selfalign-func-1.s: New test.
	* gas/scfi/x86_64/scfi-simple-1.d: New test.
	* gas/scfi/x86_64/scfi-simple-1.l: New test.
	* gas/scfi/x86_64/scfi-simple-1.s: New test.
	* gas/scfi/x86_64/scfi-simple-2.d: New test.
	* gas/scfi/x86_64/scfi-simple-2.l: New test.
	* gas/scfi/x86_64/scfi-simple-2.s: New test.
	* gas/scfi/x86_64/scfi-sub-1.d: New test.
	* gas/scfi/x86_64/scfi-sub-1.l: New test.
	* gas/scfi/x86_64/scfi-sub-1.s: New test.
	* gas/scfi/x86_64/scfi-sub-2.d: New test.
	* gas/scfi/x86_64/scfi-sub-2.l: New test.
	* gas/scfi/x86_64/scfi-sub-2.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-1.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-1.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-2.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-2.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-3.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-3.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-4.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-4.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-cfg-1.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-cfg-1.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-cfg-2.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-cfg-2.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-drap-1.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-drap-1.s: New test.
	* gas/scfi/x86_64/scfi-unsupported-insn-1.l: New test.
	* gas/scfi/x86_64/scfi-unsupported-insn-1.s: New test.
	* gas/scfi/x86_64/scfi-x86-64.exp: New file.
  • Loading branch information
ibhagatgnu committed Jan 15, 2024
1 parent 9f00e4b commit c27e4f6
Show file tree
Hide file tree
Showing 129 changed files with 3,074 additions and 0 deletions.
16 changes: 16 additions & 0 deletions gas/testsuite/gas/scfi/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Notes on the SCFI testsuite in GAS:

* At this time, SCFI machinery is only supported for x86_64.

* When adding more tests, please keep CFI annotations updated in the .s files.
Ideally the test should be run with and without --scfi (as is done currently
for the core SCFI tests); Such workflow ensures sanity checking of the CFI
annotations.

* Note that GAS issues a warning:
"Warning: --scfi=all ignores some user-specified CFI directive"
when it encounters CFI directives in the input assembly and --scfi (=all) is
active. To bypass the noise from this warning, while keeping the testcases
useful/understandable, most tests are run twice. E.g.,
- run_dump_test "scfi-cfi-add-1" // ignores warnings
- run_list_test "scfi-cfi-add-1" "--scfi --warn" // tests warnings
49 changes: 49 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-add-1.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
GAS LISTING .*


1 ## Testcase with a variety of add.
2 ## Some add insns valid in 64-bit mode may not be processed for SCFI.
3 .text
4 .globl foo
5 .type foo, @function
5 ginsn: SYM FUNC_BEGIN
6 foo:
6 ginsn: SYM foo
7 0000 54 push %rsp
7 ginsn: SUB %r7, 8, %r7
7 ginsn: STORE %r7, \[%r7\+0\]
8 0001 4889E5 movq %rsp, %rbp
8 ginsn: MOV %r7, %r6
9
10 0004 48010425 addq %rax, symbol
10 00000000
11 000c 03042500 add symbol, %eax
11 000000
12 0013 670320 add \(%eax\), %esp
12 ginsn: ADD \[%r0\+0\], %r7, %r7
13 0016 67012405 add %esp, \(,%eax\)
13 00000000
14 001e 67032405 add \(,%eax\), %esp
14 00000000
14 ginsn: ADD \[%r0\+0\], %r7, %r7
15
16 0026 4801C3 addq %rax, %rbx
16 ginsn: ADD %r0, %r3, %r3
17 0029 01C3 add %eax, %ebx
17 ginsn: ADD %r0, %r3, %r3
18
19 002b 4883D408 adc \$8, %rsp
19 ginsn: OTH 0, 0, %r7
20
21 002f 488345F0 addq \$1, -16\(%rbp\)
21 01
22
23 0034 4803D8 \{load\} addq %rax, %rbx
23 ginsn: ADD %r0, %r3, %r3
24
25 0037 C3 ret
25 ginsn: RET
26 .LFE0:
26 ginsn: SYM .LFE0
27 .size foo, .-foo
27 ginsn: SYM FUNC_END
27 changes: 27 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-add-1.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## Testcase with a variety of add.
## Some add insns valid in 64-bit mode may not be processed for SCFI.
.text
.globl foo
.type foo, @function
foo:
push %rsp
movq %rsp, %rbp

addq %rax, symbol
add symbol, %eax
add (%eax), %esp
add %esp, (,%eax)
add (,%eax), %esp

addq %rax, %rbx
add %eax, %ebx

adc $8, %rsp

addq $1, -16(%rbp)

{load} addq %rax, %rbx

ret
.LFE0:
.size foo, .-foo
69 changes: 69 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
GAS LISTING .*


.*# Testcase for DWARF regnum ginsn API
2 .text
3 .globl foo
4 .type foo, @function
4 ginsn: SYM FUNC_BEGIN
5 foo:
5 ginsn: SYM foo
6 0000 0408 add \$8, %al
7 0002 80C108 add \$8, %cl
7 ginsn: ADD %r2, 8, %r2
8 0005 80C208 add \$8, %dl
8 ginsn: ADD %r1, 8, %r1
9 0008 80C408 add \$8, %ah
9 ginsn: ADD %r0, 8, %r0
10 000b 80C508 add \$8, %ch
10 ginsn: ADD %r2, 8, %r2
11 000e 80C608 add \$8, %dh
11 ginsn: ADD %r1, 8, %r1
12 0011 80C708 add \$8, %bh
12 ginsn: ADD %r3, 8, %r3
13
14 0014 4080C008 add \$8, %axl
14 ginsn: ADD %r0, 8, %r0
15 0018 4080C408 add \$8, %spl
15 ginsn: ADD %r7, 8, %r7
16
17 001c 6683C008 add \$8, %ax
17 ginsn: ADD %r0, 8, %r0
18 0020 664183C0 add \$8, %r8w
18 08
18 ginsn: ADD %r8, 8, %r8
19 0025 6683C408 add \$8, %sp
19 ginsn: ADD %r7, 8, %r7
20
21 0029 83C008 add \$8, %eax
21 ginsn: ADD %r0, 8, %r0
22 002c 4183C008 add \$8, %r8d
22 ginsn: ADD %r8, 8, %r8
23 0030 81C40040 add \$16384, %esp
23 0000
23 ginsn: ADD %r7, 16384, %r7
24
25 0036 4883C508 add \$8, %rbp
25 ginsn: ADD %r6, 8, %r6
26
27 003a 488D05FE lea -0x2\(%rip\), %rax
27 FFFFFF
27 ginsn: ADD %r4, -2, %r0
28 0041 67488905 mov %rax, 0x2\(%eip\)
28 02000000
28 ginsn: MOV %r0, \[%r4\+2\]
29 0049 67488B05 mov -0x2\(%eip\), %rax
29 FEFFFFFF
29 ginsn: MOV \[%r4\+-2\], %r0
30
31 0051 C3 ret
31 ginsn: RET
GAS LISTING .*


32 .LFE0:
32 ginsn: SYM .LFE0
33 .size foo, .-foo
33 ginsn: SYM FUNC_END

#pass
33 changes: 33 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-dw2-regnum-1.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Testcase for DWARF regnum ginsn API
.text
.globl foo
.type foo, @function
foo:
add $8, %al
add $8, %cl
add $8, %dl
add $8, %ah
add $8, %ch
add $8, %dh
add $8, %bh

add $8, %axl
add $8, %spl

add $8, %ax
add $8, %r8w
add $8, %sp

add $8, %eax
add $8, %r8d
add $16384, %esp

add $8, %rbp

lea -0x2(%rip), %rax
mov %rax, 0x2(%eip)
mov -0x2(%eip), %rax

ret
.LFE0:
.size foo, .-foo
41 changes: 41 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-pop-1.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
GAS LISTING .*


1 ## Testcase with a variety of pop.
2 ## all pop insns valid in 64-bit mode must be processed for SCFI.
3 .text
4 .globl foo
5 .type foo, @function
5 ginsn: SYM FUNC_BEGIN
6 foo:
6 ginsn: SYM foo
7 0000 660FA1 popw %fs
7 ginsn: LOAD \[%r7\+0\], %r54
7 ginsn: ADD %r7, 2, %r7
8 0003 660FA9 popw %gs
8 ginsn: LOAD \[%r7\+0\], %r55
8 ginsn: ADD %r7, 2, %r7
9 0006 669D popfw
9 ginsn: LOAD \[%r7\+0\], %r49
9 ginsn: ADD %r7, 2, %r7
10 0008 66418F42 popw -8\(%r10\)
10 F8
10 ginsn: LOAD \[%r7\+0\], \[%r10\+0\]
10 ginsn: ADD %r7, 2, %r7
11 000d 428F0415 popq -8\(,%r10\)
11 F8FFFFFF
11 ginsn: LOAD \[%r7\+0\], \[%r10\+0\]
11 ginsn: ADD %r7, 8, %r7
12 0015 8F042500 pop symbol
12 000000
12 ginsn: LOAD \[%r7\+0\], \[%r4\+0\]
12 ginsn: ADD %r7, 8, %r7
13 001c 58 popq %rax
13 ginsn: LOAD \[%r7\+0\], %r0
13 ginsn: ADD %r7, 8, %r7
14 001d C3 ret
14 ginsn: RET
15 .LFE0:
15 ginsn: SYM .LFE0
16 .size foo, .-foo
16 ginsn: SYM FUNC_END
16 changes: 16 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-pop-1.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
## Testcase with a variety of pop.
## all pop insns valid in 64-bit mode must be processed for SCFI.
.text
.globl foo
.type foo, @function
foo:
popw %fs
popw %gs
popfw
popw -8(%r10)
popq -8(,%r10)
pop symbol
popq %rax
ret
.LFE0:
.size foo, .-foo
44 changes: 44 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-push-1.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
GAS LISTING .*


1 ## Testcase with a variety of push.
2 ## all push insns valid in 64-bit mode must be processed for SCFI.
3 .text
4 .globl foo
5 .type foo, @function
5 ginsn: SYM FUNC_BEGIN
6 foo:
6 ginsn: SYM foo
7 0000 660FA0 pushw %fs
7 ginsn: SUB %r7, 2, %r7
7 ginsn: STORE %r54, \[%r7\+0\]
8 0003 660FA8 pushw %gs
8 ginsn: SUB %r7, 2, %r7
8 ginsn: STORE %r55, \[%r7\+0\]
9 0006 666A28 pushw \$40
9 ginsn: SUB %r7, 2, %r7
9 ginsn: STORE 0, \[%r7\+0\]
10 0009 6641FF72 pushw -8\(%r10\)
10 F8
10 ginsn: SUB %r7, 2, %r7
10 ginsn: STORE \[%r10\+0\], \[%r7\+0\]
11 000e 42FF3415 pushq -8\(,%r10\)
11 F8FFFFFF
11 ginsn: SUB %r7, 8, %r7
11 ginsn: STORE \[%r10\+0\], \[%r7\+0\]
12 0016 669C pushfw
12 ginsn: SUB %r7, 2, %r7
12 ginsn: STORE %r49, \[%r7\+0\]
13 0018 FF342500 push symbol
13 000000
13 ginsn: SUB %r7, 8, %r7
13 ginsn: STORE \[%r4\+0\], \[%r7\+0\]
14 001f 50 push %rax
14 ginsn: SUB %r7, 8, %r7
14 ginsn: STORE %r0, \[%r7\+0\]
15 0020 C3 ret
15 ginsn: RET
16 .LFE0:
16 ginsn: SYM .LFE0
17 .size foo, .-foo
17 ginsn: SYM FUNC_END
17 changes: 17 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/ginsn-push-1.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
## Testcase with a variety of push.
## all push insns valid in 64-bit mode must be processed for SCFI.
.text
.globl foo
.type foo, @function
foo:
pushw %fs
pushw %gs
pushw $40
pushw -8(%r10)
pushq -8(,%r10)
pushfw
push symbol
push %rax
ret
.LFE0:
.size foo, .-foo
26 changes: 26 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/scfi-add-1.d
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#as: --scfi=experimental -W
#as:
#objdump: -Wf
#name: Synthesize CFI for add insn 1
#...
Contents of the .eh_frame section:

00000000 0+0014 0+0000 CIE
Version: 1
Augmentation: "zR"
Code alignment factor: 1
Data alignment factor: -8
Return address column: 16
Augmentation data: [01][abc]
DW_CFA_def_cfa: r7 \(rsp\) ofs 8
DW_CFA_offset: r16 \(rip\) at cfa-8
DW_CFA_nop
DW_CFA_nop

0+0018 0+0014 0+001c FDE cie=0+0000 pc=0+0000..0+0005
DW_CFA_advance_loc: 4 to 0+0004
DW_CFA_def_cfa_offset: 0
DW_CFA_nop
#...

#pass
2 changes: 2 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/scfi-add-1.l
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.*Assembler messages:
.*6: Warning: SCFI ignores most user-specified CFI directives
13 changes: 13 additions & 0 deletions gas/testsuite/gas/scfi/x86_64/scfi-add-1.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Testcase for add instruction.
.text
.globl foo
.type foo, @function
foo:
.cfi_startproc
addq $8, %rsp
.cfi_def_cfa_offset 0
ret
.cfi_endproc
.LFE0:
.size foo, .-foo

Loading

0 comments on commit c27e4f6

Please sign in to comment.