【问题标题】:impossible constraint in asmasm中的不可能约束
【发布时间】:2012-09-24 15:33:27
【问题描述】:

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

请指教这是什么问题。

【问题讨论】:

    标签: c mongodb assembly cross-compiling


    【解决方案1】:

    在这里尝试使用__sync_val_compare_and_swap GCC 内部函数。

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

    如果您告诉我们您定制的 linux 内核的确切硬件,可能会出现更多解决方法。

    【讨论】:

    • 'Intel(R) Core(TM)2 Quad CPU Q9300 @ 2.50GHz' 64 位处理器。 Linux version 3.5.3-1.fc17.i686.PAE (mockbuild@) (gcc version 4.7.0 20120507 (Red Hat 4.7.0-5) (GCC)。这是我能得到的唯一信息。不知道我是新手,如何使用 __sync_val_compare_and_swap。
    • 尝试使用 __sync_val_compare_and_swap 进行编译。它已经编译了那段代码。但最后它抱怨“未定义对 __sync_val_compare_and_swap_8 的引用”。不明白为什么最后要添加 _8 。有没有办法解决这个问题?提前致谢
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2012-07-22
    • 2018-02-11
    相关资源
    最近更新 更多