[LLVMbugs] [Bug 15047] New: Calls to no-return functions at end of a function need to be tail-call or followed by a nop

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Jan 22 16:05:24 PST 2013


             Bug #: 15047
           Summary: Calls to no-return functions at end of a function need
                    to be tail-call or followed by a nop
           Product: new-bugs
           Version: 3.1
          Platform: Macintosh
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: paul.q.stevenson at gmail.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Compiling the code below with clang -O2 generates code that skips restoring
registers (since throw_exception() does not return) but which still uses a
callq/blx instruction rather than a jmpq/bx instruction.  This breaks unwind
tables, since the call to f() is still in the call stack, but with the
instruction pointer in the next function in the object file.  Trying to unwind
from further down the stack chain will access the wrong unwind table.

The code should either restore registers and use a tail call (so removing
itself from the call stack), or it should include an unreachable nop after the
non-returning call (so that the instruction pointer is still within the
function bounds).

Clang version: (Apple clang version 4.0 (tags/Apple/clang-421.0.57) (based on
LLVM 3.1svn))

C code:

extern void throw_exception(void) __attribute__((noreturn));

void f(void)

compiled with -target x86_64-apple-darwin11.4.2:

__TEXT,__text) section
0000000000000000    pushq    %rbp
0000000000000001    movq    %rsp, %rbp
0000000000000004    popq    %rbp
0000000000000005    jmpq    0x9

compiled with -target armv7-apple-darwin11.4.2:

(__TEXT,__text) section
00000000        b580    push    {r7, lr}
00000002        466f    mov    r7, sp
00000004    f7ffeffc    blx    0x0

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list