Trouble connecting swc with Alchemy
I have a project that I am trying to compile with alchemy. It will compile .o and .a files, but it will fail when trying to create .swc. Apparently this is an error:
g++ -swc -o mylib.swc my-flex-interface.cpp mylib.a
Cannot yet select: 0x279c810: ch,flag = AVM2ISD::CALL - A call instruction 0x279c7a0, 0x29c4350
0 llc 0x00636dfe _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 6078
1 llc 0x006373a2 _ZNSt8_Rb_treeIN4llvm3sys4PathES2_St9_IdentityIS2_ESt4lessIS2_ESaIS2_EE13insert_uniqueERKS2_ + 7522
2 libSystem.B.dylib 0x9530942b _sigtramp + 43
3 ??? 0xffffffff 0x0 + 4294967295
4 libSystem.B.dylib 0x953968e5 raise + 26
5 libSystem.B.dylib 0x953ac99c abort + 93
6 llc 0x002f4fe0 _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel6Emit_7ERKN4llvm9SDOperandEj + 0
7 llc 0x002f8e1b _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectCodeEN4llvm9SDOperandE + 2219
8 llc 0x002fa193 _ZN98_GLOBAL__N__Volumes_data_dev_FlaCC_llvm_2.1_lib_Target_AVM2_AVM2ISelDAGToDAG.cpp_00000000_F04616B616AVM2DAGToDAGISel10SelectRootEN4llvm9SDOperandE + 819
9 llc 0x002e6a2c _ZN4llvm19X86_64TargetMachineD0Ev + 65116
10 llc 0x003de4ca _ZN4llvm11StoreSDNodeD1Ev + 1610
11 llc 0x0040d3fe _ZN4llvm11StoreSDNodeD1Ev + 193918
12 llc 0x0040f92e _ZN4llvm11StoreSDNodeD1Ev + 203438
13 llc 0x005d1926 _ZN4llvm12FunctionPassD1Ev + 20998
14 llc 0x005d1f3a _ZN4llvm12FunctionPassD1Ev + 22554
15 llc 0x005d20c5 _ZN4llvm12FunctionPassD1Ev + 22949
16 llc 0x00002e44 0x0 + 11844
17 llc 0x00001f36 0x0 + 7990
18 ??? 0x00000006 0x0 + 6
make[2]: *** [src/app/alchemy/sonic.swc] Error 6
make[1]: *** [src/app/alchemy/CMakeFiles/alchemy.dir/all] Error 2
make: *** [all] Error 2
I'm not familiar enough with LLVM (which Alchemy uses under the hood) to understand what this error means. Any ideas?
source to share
As of Alchemy v0.5a, when compiling memcpy / memmove / memset, the LLVM interface sometimes (on Mac OS X) emits intermediate code that the Alchemy backend linker cannot handle. It will crash with a "can not yet select" error.
A workaround is to either compile on a different platform (Ubuntu, Windows) or to override the memcpy / memmove / memset implementations:
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
Unfortunately, this solution requires the above code to be installed (via #include) in every module that uses memcpy.
I ended up using memcpy / memset / memmove workarounds by overriding string.h (using -I and # include_next ), but this requires a hack in the achacks / gcc script so that the -I flags are processed in the correct order:
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
}
source to share