compiling a assembler inline code which use a log of registers and with -O2
option instructions like
movq %rbx, -40(%rsp)
are generated which are wrong cause it writes to not allocated stack which
could lead to corruption on interrupts
code
void foo(const unsigned char *p)
{
unsigned int t0, t1, t2, t3;
__asm__ __volatile__
(
".intel_syntax noprefix;"
"mov r8" ", " "rsi" ";"
"mov r9" ", " "rcx" ";"
".att_syntax prefix;"
: "=a" (t0), "=c" (t1), "=S" (t2), "=D" (t3)
: "D" (p)
: "memory", "cc"
, "%ebx" , "%r8", "%r9", "%r10", "%r11", "%r12" , "%r13", "%r14", "%r15"
);
}
I'll attach source code, generated code and gcc command output
freddy77
--
Summary: bad stack allocation using inline asm
Product: gcc
Version: 4.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: freddy77 at gmail dot com
GCC build triplet: x86_64-linux-gnu
GCC host triplet: x86_64-linux-gnu
GCC target triplet: x86_64-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41941