2010-04-12 105 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 
}