簡體   English   中英

asm中的不可能約束

[英]impossible constraint in asm

我正在嘗試將 MongoDB 交叉編譯到自定義 Linux。 它在 Linux 上編譯得很好,但是在使用交叉編譯器工具鏈時,它會抱怨這段代碼。

static T compareAndSwap(volatile T* dest, T expected, T newValue) {
       T result = expected;
       asm volatile ("push %%eax\n\t"
                      "push %%ebx\n\t"
                      "push %%ecx\n\t"
                      "push %%edx\n\t"
                      "mov (%%edx), %%ebx\n\t"
                      "mov 4(%%edx), %%ecx\n\t"
                      "mov (%%edi), %%eax\n\t"
                      "mov 4(%%edi), %%edx\n\t"
                      "lock cmpxchg8b (%%esi)\n\t"
                      "mov %%eax, (%%edi)\n\t"
                      "mov %%edx, 4(%%edi)\n\t"
                      "pop %%edx\n\t"
                      "pop %%ecx\n\t"
                      "pop %%ebx\n\t"
                      "pop %%eax\n"
                       :
                       : "S" (dest),
                         "D" (&result),
                         "d" (&newValue)
                       : "memory", "cc");
       return result;
}

編譯器錯誤如下。

_party/js-1.7 -Isrc/third_party/js-1.7 src/mongo/bson/oid.cpp
src/mongo/platform/atomic_intrinsics_gcc.h: In member function 'void mongo::OID::initSequential()':
src/mongo/platform/atomic_intrinsics_gcc.h:123:44: error: impossible constraint in 'asm'
src/mongo/platform/atomic_intrinsics_gcc.h:123:44: error: impossible constraint in 'asm'
scons: *** [build/linux2/cc_gcc/cxx_toolchain-c++/mongo/bson/oid.o] Error 1
scons: building terminated because of errors.

抱怨的第123:44行是前一行的結尾: "memory", "cc");

還看了看其他部分的代碼,編譯成asm代碼,看起來也差不多。 不知道這個發生了什么。

請指教這有什么問題。

嘗試在此處使用__sync_val_compare_and_swap GCC 內在函數。

由於F00F 錯誤lock cmpxchg8b無效。 我猜你正在使用像i586-linux-gcc工具鏈這樣的東西,因此你正在解決這個 Pentium 的問題。

如果您告訴我們您定制的 linux 內核的確切硬件,可能會出現更多解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM