﻿id	summary	reporter	owner	description	type	status	priority	component	version	resolution	keywords	cc
302	Built-in functions may have wrong types on 32-bit	mlbrooks		"I stumbled across this phenomenon while doing other work.  It may represent a broader issue whose impact is not yet understood.  If further impacts are found, please increase the ticket priority accordingly.

A builtin is something that can be called like a function but that GCC may implement in a way that is not a function call.  GCC does not provide prototypes for them.  CFA provides the resolver with prototypes declared in build/libcfa/(host)/prelude/gcc-builtins.cfa.

One such prototype should be
{{{
void * __builtin_memcpy(void *, const void *, size_t);
}}}

I consider this signature correct because 
- it matches `memcpy`
- gcc is built from a table whose signature-implying symbol for it is BT_FN_PTR_PTR_CONST_PTR_SIZE; reading the name suggests my ""correct"" types (this table is in cfa-cc/libcfa/prelude/builtins.def, excerpting from the row marked BUILT_IN_MEMCPY)

However, the signature we actually send to the resolver is:
{{{
void * __builtin_memcpy(void *, const void *, unsigned long);
}}}
which is incorrect on x86, where size_t != unsigned long.

The only impact seen so far is in seeing superfluous casts when inspecting generated code.  Given a prior fix to the return type of sizeof (#269, in which its type becomes size_t), builtin calls on x86 change as in
{{{
git show d3d54b3f6 -- tests/.expect/extension.x86.txt
}}}
having differences like
{{{
- ((void)__builtin_memcpy(((void *)_X4_dstU1U_1), ((const void *)(&_X1ai_1)), sizeof(signed int )));
+ ((void)__builtin_memcpy(((void *)_X4_dstU1U_1), ((const void *)(&_X1ai_1)), ((unsigned long int )sizeof(signed int ))));
}}}
"	defect	new	trivial	cfa-cc	1.0		lowering cast size_t builtin x86	
