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?

+2


source to share


1 answer


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
}

      

+1


source







All Articles