2

錬金術でコンパイルしようとしているプロジェクトがあります。.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が内部で使用している)に精通していないため、このエラーの意味を理解できません。何か案は?

4

1 に答える 1

1

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

残念ながら、この回避策では、memcpyを使用するすべてのモジュールに上記のコードを(#includeを介して)配置する必要があります。

最終的に、string.hをオーバーライドして(-Iと#include_nextを使用して)memcpy / memset / memmoveの回避策を注入しましたが、これには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
}
于 2010-09-01T16:03:14.543 に答える