https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64951
Bug ID: 64951
Summary: g++ generates incorrect code when using a register
variable within a template function
Product: gcc
Version: 4.9.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: inline-asm
Assignee: unassigned at gcc dot gnu.org
Reporter: gdelu...@security-labs.org
Created attachment 34679
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34679&action=edit
Test case for comparing register assignment in a normal function and a template
function
g++ doesn't generate the expected code when using a register variable bound to
a specific CPU register inside a template function.
For instance:
template
inline void SetRdx(T value)
{
register auto __foo asm ("rdx") = value;
asm volatile ( "" :: "r" (__foo) );
}
Calling it with: SetRdx(0x42) will generate the following assembly code:
mov$0x42,%eax
instead of the expected:
mov$0x42,%edx
Moreover, specifying a non-existent CPU register inside the "asm" directive
still compiles and does not throw any error:
register auto __foo asm ("foobar") = value; // compiles to mov $0x42, %eax
It looks as if the asm directive is completely ignored when used within a
template function.
This behavior has been reproduced on gcc 4.9.2, 4.8 and 4.7.