сбой при соединении SWC с Алхимией - PullRequest
2 голосов
/ 13 апреля 2010

У меня есть проект, который я пытаюсь скомпилировать с помощью алхимии. Он скомпилирует файлы .o и .a, но при попытке создать .swc произойдет сбой. Кажется, сбой с этой ошибкой:

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

Я недостаточно знаком с LLVM (который Alchemy использует под капотом), чтобы понять, что означает эта ошибка. Есть идеи?

1 Ответ

1 голос
/ 01 сентября 2010

Начиная с 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
}
...