.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).
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.
(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`).