Начиная с Alchemy v0.5a, при компиляции memcpy / memmove / memset интерфейс LLVM иногда (в Mac OS X) генерирует промежуточный код, который не может обработать бэкэнд-компоновщик Alchemy. Он завершится с ошибкой «пока не выбрано».
Временное решение: компилировать на другой платформе (Ubuntu, Windows) или переопределить реализации memcpy / memmove / memset:
static void * custom_memmove( void * destination, const void * source, size_t num ) {
void *result;
__asm__("%0 memmove(%1, %2, %3)\n" : "=r"(result) : "r"(destination), "r"(source), "r"(num));
return result;
}
static void * custom_memcpy ( void * destination, const void * source, size_t num ) {
void *result;
__asm__("%0 memcpy(%1, %2, %3)\n" : "=r"(result) : "r"(destination), "r"(source), "r"(num));
return result;
}
static void * custom_memset ( void * ptr, int value, size_t num ) {
void *result;
__asm__("%0 memset(%1, %2, %3)\n" : "=r"(result) : "r"(ptr), "r"(value), "r"(num));
return result;
}
#define memmove custom_memmove
#define memcpy custom_memcpy
#define memset custom_memset
К сожалению, этот обходной путь требует помещения приведенного выше кода (через #include) в каждый модуль, который использует memcpy.
В конечном итоге я внедрил обходные пути memcpy / memset / memmove, переопределив string.h (используя -I и # include_next ), но для этого потребовался взлом скрипта achacks / gcc, чтобы флаги -I обработано в правильном порядке:
sub dash_I
{
my $arg = (shift);
my $path;
if($arg =~ /-I=?(.*)/)
{ $path = $1 }
else
{ $path = shift(ARGV) }
my $ppath = $incmap{$path};
my @pathes = $ppath ? @$ppath : ($path);
# BUGFIX: insert user -I header search paths
# early so that they override the system search paths
#
#push(@compile, map { "-I$_" } @pathes);
splice(@compile, 1, 0, map { "-I$_" } @pathes);
0
}