Bug 99282 - Emit .cfi_sections without arguments for -fno-asynchronous-unwind-tables
Summary: Emit .cfi_sections without arguments for -fno-asynchronous-unwind-tables
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: assemble-failure, inline-asm
Depends on:
Blocks:
 
Reported: 2021-02-26 05:49 UTC by Fangrui Song
Modified: 2021-09-14 19:46 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Fangrui Song 2021-02-26 05:49:09 UTC
.cfi_* in inline asm is rare, but can be useful if the user wants precise unwind information.

% cat a.c
int main() {
  asm("pushl 0\n.cfi_adjust_cfa_offset 4\npop %%eax\n.cfi_adjust_cfa_offset -4" ::: "eax");
}
% gcc -m32 -c -fomit-frame-pointer -fno-asynchronous-unwind-tables a.c
a.c: Assembler messages:
a.c:3: Error: CFI instruction used without previous .cfi_startproc
a.c:5: Error: CFI instruction used without previous .cfi_startproc

-fasynchronous-unwind-tables & -fno-asynchronous-unwind-tables do not have a predefined macro, so it is difficult for the inline asm to know whether CFI directives should be used. For ergonomics, users just want to write CFI directives and hope they will be silently ignored in -fno-asynchronous-unwind-tables mode. However, GNU as errors for .cfi_* without .cfi_startproc .

I suggest that (1) GCC emits ".cfi_sections" (no argument) at the beginning, (2) GNU as suppresses the error if no .eh_frame/.debug_frame is needed (feature request: https://sourceware.org/bugzilla/show_bug.cgi?id=27472).
Comment 1 Jakub Jelinek 2021-02-26 11:30:04 UTC
There is the __GCC_HAVE_DWARF2_CFI_ASM predefined macro that tells if .cfi* directives are used or not.  And, inline asm that wishes to be usable in both can use that.
Comment 2 Fangrui Song 2021-02-26 23:17:40 UTC
(In reply to Jakub Jelinek from comment #1)
> There is the __GCC_HAVE_DWARF2_CFI_ASM predefined macro that tells if .cfi*
> directives are used or not.  And, inline asm that wishes to be usable in
> both can use that.

Thanks. I did not know this macro. So the user writing inline asm does have a way to know whether .cfi_* should be inserted. If you think emitting `.cfi_sections` is unnecessary, I am fine and happy that this is closed.

(GCC already generates `.cfi_sections .debug_frame\n`, so perhaps supporting `.cfi_sections\n` is not that costly? :) Users will newer toolchain can be a bit happier - they don't need to do `#ifdef __GCC_HAVE_DWARF2_CFI_ASM`).