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

不幸的是,这种解决方法需要将上述代码(通过#include)放入每个使用 memcpy 的模块中。

最终,我通过覆盖 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 回答