2010-04-12 97 views
2

我有一个项目,我正在试图用炼金术进行编译。它会编译.o和.a文件,但是当试图创建.swc时,它会失败。这似乎与此错误崩溃:链接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(其中炼金术引擎盖下使用),以弄清楚这是什么错误意味着再熟悉不过了。有任何想法吗?

+0

您使用什么命令创建.swc? – jonathanasdf 2010-04-12 23:12:34

+0

我编辑了这个问题的例子是什么命令看起来像 – paleozogt 2010-04-13 14:17:13

+0

这不是一个«崩溃»,这只是一个错误信息。 – nalply 2010-11-18 12:27:50

回答

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的模块中。

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