]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gas: scfi: untraceable control flow should be a hard error
authorIndu Bhagat <indu.bhagat@oracle.com>
Fri, 26 Jan 2024 18:30:18 +0000 (10:30 -0800)
committerIndu Bhagat <indu.bhagat@oracle.com>
Fri, 26 Jan 2024 19:31:35 +0000 (11:31 -0800)
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
gas/testsuite/gas/scfi/x86_64/ginsn-cofi-1.l
gas/testsuite/gas/scfi/x86_64/scfi-unsupported-cfg-1.l

index 5f6a67ce4f2b7554c8dc97a9f7352c45a2e53f8e..661f51d23c59f732140c8f828b61d4126e9a6e4b 100644 (file)
@@ -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;
     }
 
index fee76f9cc9b0323328723255c944cc0fb03cab87..ab6b50d47e8f574d287adb59d1eefd277c1f97a8 100644 (file)
@@ -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
index 1e138a102fe8b87cf98a8335908e8845462af280..c59ba93df45a1f18f900ffa1c66c2c737c35bdec 100644 (file)
@@ -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'