asm中不可能的约束

时间:2012-09-24 15:33:28

标签: c mongodb assembly cross-compiling

我正在尝试将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代码,看起来也差不多。不知道这个发生了什么。

请告知这有什么问题。

1 个答案:

答案 0 :(得分:1)

尝试在此使用__sync_val_compare_and_swap GCC内在。

由于F00F bug lock cmpxchg8b无效。我猜你正在使用类似i586-linux-gcc工具链的东西,因此你就可以直接解决这个Pentium的问题了。

如果您告诉我们您自定义Linux内核的确切硬件,可能会有更多解决方法。