aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorIndu Bhagat <indu.bhagat@oracle.com>2024-01-26 10:30:18 -0800
committerIndu Bhagat <indu.bhagat@oracle.com>2024-01-26 11:31:35 -0800
commit91cdbed4d7b3acff951e0f21008a7775a7f23c20 (patch)
treef8f20ce690cad902b14618b4f42c8ebe981d6534 /gas
parent16cbeae1b2757dd661ef936a505c6b3818a52853 (diff)
downloadgdb-91cdbed4d7b3acff951e0f21008a7775a7f23c20.zip
gdb-91cdbed4d7b3acff951e0f21008a7775a7f23c20.tar.gz
gdb-91cdbed4d7b3acff951e0f21008a7775a7f23c20.tar.bz2
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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ginsn.c4
-rw-r--r--gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l18
-rw-r--r--gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l2
3 files changed, 13 insertions, 11 deletions
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'