finstrument-functions-exclude-function-list, кажется, не обрабатывает запятые должным образом - PullRequest
1 голос
/ 07 июня 2019

Попытка скомпилировать с помощью finstrument-функций и исключить шаблонную функцию с несколькими параметрами шаблона, используя метод \ для экранирования запятых (как описано для exclude-file-list здесь ), не может правильно отключить инструментарийпереданная функция.

Используемая команда GCC:

gcc -finstrument-functions -finstrument-functions-exclude-function-list='test<float\, int>' main.cpp -o a.out -O0

Выше создается двоичный файл с инструментированной функцией "test".Фрагмент сборки и файл main.cpp, включенные ниже

gcc -dumpversion возвращает "6.2.0", команда выше запускается на Red Hat Enterprise Linux, версия 7.4

Содержимое main.cpp:

template<class T, class U>
T test(int a, T b){
    int res = 0;
    for(int i = 0; i < 1000; i++){
        res += i;
    }
    return(res);
}

int main(int argc, char** argv){
    float a = test<float, int>(argc, 1.0);
    return(0);
}

objdumped выход для «тестовой» функции:

000000000040059f <float test<float, int>(int, float)>:
  40059f:   55                      push   %rbp
  4005a0:   48 89 e5                mov    %rsp,%rbp
  4005a3:   48 83 ec 20             sub    $0x20,%rsp
  4005a7:   89 7d ec                mov    %edi,-0x14(%rbp)
  4005aa:   f3 0f 11 45 e8          movss  %xmm0,-0x18(%rbp)
  4005af:   48 8b 45 08             mov    0x8(%rbp),%rax
  4005b3:   48 89 c6                mov    %rax,%rsi
  4005b6:   bf 9f 05 40 00          mov    $0x40059f,%edi
  4005bb:   e8 70 fe ff ff          callq  400430 <__cyg_profile_func_enter@plt>
  4005c0:   c7 45 f8 00 00 00 00    movl   $0x0,-0x8(%rbp)
  4005c7:   c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
  4005ce:   81 7d fc e7 03 00 00    cmpl   $0x3e7,-0x4(%rbp)
  4005d5:   7f 11                   jg     4005e8 <float test<float, int>(int, float)+0x49>
  4005d7:   8b 55 f8                mov    -0x8(%rbp),%edx
  4005da:   8b 45 fc                mov    -0x4(%rbp),%eax
  4005dd:   01 d0                   add    %edx,%eax
  4005df:   89 45 f8                mov    %eax,-0x8(%rbp)
  4005e2:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
  4005e6:   eb e6                   jmp    4005ce <float test<float, int>(int, float)+0x2f>
  4005e8:   8b 45 f8                mov    -0x8(%rbp),%eax
  4005eb:   66 0f ef c9             pxor   %xmm1,%xmm1
  4005ef:   f3 0f 2a c8             cvtsi2ss %eax,%xmm1
  4005f3:   f3 0f 11 4d e4          movss  %xmm1,-0x1c(%rbp)
  4005f8:   48 8b 45 08             mov    0x8(%rbp),%rax
  4005fc:   48 89 c6                mov    %rax,%rsi
  4005ff:   bf 9f 05 40 00          mov    $0x40059f,%edi
  400604:   e8 17 fe ff ff          callq  400420 <__cyg_profile_func_exit@plt>
  400609:   f3 0f 10 45 e4          movss  -0x1c(%rbp),%xmm0
  40060e:   c9                      leaveq 
  40060f:   c3                      retq

Я ожидал, что тестовая функция не будет инструментирована, но это так.Кто-нибудь знает, почему это так?

Пример проводника компилятора

1 Ответ

0 голосов
/ 12 июня 2019

На всякий случай, если кто-то пойдет по этому пути, и this, и finstrument-functions-exclude-function-list, не учитывающие части пространства имен функции, являются ошибками, и я подал против обоих. Надеюсь, исправление будет реализовано в ближайшее время (работает над одним из них).

Неправильное обращение с пространством имен / классом

Неправильная обработка запятых

...