clang armv7在return语句中的内联定义的构造函数上调用了错误的符号

时间:2019-02-28 16:19:55

标签: c++ android-ndk clang++ armv7

在为Android开发JNI库时,我偶然发现了一个问题,我可以使用NDK r19b和以下MWE的clang来重现该问题:

void firstFunctionSymbol() {}

template <class Y>
class T {
public:
        T(Y){};
};

T<int> test() {
        return {1};
}

int main(){
        return 0;
}

使用以下方法进行编译和检查时:

$ android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/\
armv7a-linux-androideabi26-clang++ -g -c main.cpp -o main.o
$ android-ndk-r19b/toolchains/arm-linux-androideabi-4.9/prebuilt/\
linux-x86_64/arm-linux-androideabi/bin/objdump -DS main.o --demangle

我得到以下输出:

00000000 <firstFunctionSymbol()>:
void firstFunctionSymbol() {}
   0:   e12fff1e        bx      lr

00000004 <test()>:
class T {
public:
        T(Y){};
};

T<int> test() {
   4:   e92d4800        push    {fp, lr}
   8:   e1a0b00d        mov     fp, sp
   c:   e24dd008        sub     sp, sp, #8
        return {1};
  10:   e28d0004        add     r0, sp, #4
  14:   e3001001        movw    r1, #1
  18:   ebfffffe        bl      0 <firstFunctionSymbol()>
  1c:   e58d0000        str     r0, [sp]
  20:   e1a0d00b        mov     sp, fp
  24:   e8bd8800        pop     {fp, pc}

请注意第18行如何引用firstFunctionSymbol而不是预期的T<int>(int)

我做错什么了吗?还是叮当声使我失望?

请注意:

  • 对于x86上的arm或clang,这在GCC上不是问题
  • 仅当T(Y){}是应内联的函数时,才会出现此问题。例如。通过在函数前定义extern template class T<int>;,符号指向正确的点。

0 个答案:

没有答案