From 91cdbed4d7b3acff951e0f21008a7775a7f23c20 Mon Sep 17 00:00:00 2001 From: Indu Bhagat Date: Fri, 26 Jan 2024 10:30:18 -0800 Subject: gas: scfi: untraceable control flow should be a hard error PR gas/31284 Currently, if an indirect jump is seen, GCFG (a CFG of ginsns) cannot be created, and the SCFI machinery bails out with a warning: "Warning: Untraceable control flow for func 'foo'; Skipping SCFI" It is, however, better suited if this is a hard error. Change it to a hard error. Also change the message to skip mentioning "SCFI", because the error itself may also useful when ginsns are used for other passes (distinct from SCFI) involving GCFG, like a pass to detect if there is unreachable code. Hence, simply say: "Error: untraceable control flow for func 'foo'" gas/ PR gas/31284 * ginsn.c (ginsn_data_end): Use as_bad instead of as_warn. gas/testsuite/ PR gas/31284 * gas/scfi/x86_64/ginsn-cofi-1.l: Adjust to the expected output in case of errors. * gas/scfi/x86_64/scfi-unsupported-cfg-1.l: Error not Warning. --- gas/ginsn.c | 4 ++-- gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l | 18 ++++++++++-------- gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) (limited to 'gas') diff --git a/gas/ginsn.c b/gas/ginsn.c index 5f6a67c..661f51d 100644 --- a/gas/ginsn.c +++ b/gas/ginsn.c @@ -1161,8 +1161,8 @@ ginsn_data_end (const symbolS *label) /* Build the cfg of ginsn(s) of the function. */ if (!frchain_now->frch_ginsn_data->gcfg_apt_p) { - as_warn (_("Untraceable control flow for func '%s'; Skipping SCFI"), - S_GET_NAME (func)); + as_bad (_("untraceable control flow for func '%s'"), + S_GET_NAME (func)); goto end; } diff --git a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l index fee76f9..ab6b50d 100644 --- a/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l +++ b/gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l @@ -1,3 +1,5 @@ +.*: Assembler messages: +.*:20: Error: untraceable control flow for func 'foo' GAS LISTING .* @@ -12,23 +14,23 @@ GAS LISTING .* 8 ginsn: SYM FUNC_BEGIN 9 foo: 9 ginsn: SYM foo - 10 0000 4801D0 addq %rdx, %rax + 10 \?\?\?\? 4801D0 addq %rdx, %rax 10 ginsn: ADD %r1, %r0, %r0 - 11 0003 E200 loop foo + 11 \?\?\?\? E200 loop foo 11 ginsn: JCC - 12 0005 3EFFE0 notrack jmp \*%rax + 12 \?\?\?\? 3EFFE0 notrack jmp \*%rax 12 ginsn: JMP %r0, - 13 0008 41FFD0 call \*%r8 + 13 \?\?\?\? 41FFD0 call \*%r8 13 ginsn: CALL - 14 000b 67E305 jecxz .L179 + 14 \?\?\?\? 67E305 jecxz .L179 14 ginsn: JCC - 15 000e FF6730 jmp \*48\(%rdi\) + 15 \?\?\?\? FF6730 jmp \*48\(%rdi\) 15 ginsn: JMP %r5, - 16 0011 7000 jo .L179 + 16 \?\?\?\? 7000 jo .L179 16 ginsn: JCC 17 .L179: 17 ginsn: SYM .L179 - 18 0013 C3 ret + 18 \?\?\?\? C3 ret 18 ginsn: RET 19 .LFE0: 19 ginsn: SYM .LFE0 diff --git a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l index 1e138a1..c59ba93 100644 --- a/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l +++ b/gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l @@ -1,3 +1,3 @@ .*Assembler messages: .*50: Warning: SCFI ignores most user-specified CFI directives -.*52: Warning: Untraceable control flow for func 'foo'; Skipping SCFI +.*52: Error: untraceable control flow for func 'foo' -- cgit v1.1