Open
Description
Both compile with -O3
void foo(char* buf, const char* src, size_t n) {
memcpy(buf, src, n);
memcpy(buf + n, &n, sizeof(n));
}
gcc generate code:
foo(char*, char const*, unsigned long):
push rbx
mov rbx, rdx
call memcpy
mov QWORD PTR [rax+rbx], rbx
pop rbx
ret
gcc knows memcpy returns its first arg.
clang generate code:
foo(char*, char const*, unsigned long):
push r14
push rbx
push rax
mov rbx, rdx
mov r14, rdi
call memcpy@PLT
mov qword ptr [r14 + rbx], rbx
add rsp, 8
pop rbx
pop r14
ret
clang does not know memcpy returns its first arg. It is worse that even when we tell clang to use return value from memcpy:
void foo2(char* buf, const char* src, size_t n) {
char* ptr = (char*)memcpy(buf, src, n);
memcpy(ptr + n, &n, sizeof(n));
}
clang still generate same code as original foo
. gcc also generate same code for foo
and foo2
.