clang armv7 вызывает неверный символ в определенном встроенном конструкторе в операторе return - PullRequest
0 голосов
/ 28 февраля 2019

Во время работы над библиотекой JNI для Android я столкнулся с проблемой, которую я могу воспроизвести с помощью clang из NDK r19b и следующих MWE:

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).

Я делаю что-то не так или происходит сбой лязгаменя здесь?

Обратите внимание:

  • это не проблема в GCC для arm или clang на x86
  • эта проблема возникает только когда T(Y){} являетсяфункция, которая должна быть встроена.Например, определяя extern template class T<int>; перед функцией, символ указывает на правильную точку.
...