Убедитесь, что конкретный код испускается или нет

Как я могу убедиться, что какой-то определенный код не выдается?

Скажем, я пытался написать что-то вроде static switch (или же static if) и я хочу определить, есть ли вторая лямбда operator ()Тело испускается:

#include <type_traits>

namespace details
{

template< typename visitor, typename ...visitors >
struct composite_visitor
: std::decay_t< visitor >
, composite_visitor< visitors... >
{

using std::decay_t< visitor >::operator ();
using composite_visitor< visitors... >::operator ();

composite_visitor(visitor & _visitor, visitors &... _visitors)
: std::decay_t< visitor >(std::forward< visitor >(_visitor))
, composite_visitor< visitors... >{_visitors...}
{ ; }

};

template< typename visitor >
struct composite_visitor< visitor >
: std::decay_t< visitor >
{

using std::decay_t< visitor >::operator ();

composite_visitor(visitor & _visitor)
: std::decay_t< visitor >(std::forward< visitor >(_visitor))
{ ; }

};

}

template< typename visitor, typename ...visitors >
details::composite_visitor< visitor, visitors... >
compose_visitors(visitor && _visitor, visitors &&... _visitors)
{
return {_visitor, _visitors...};
}

#include <iostream>

#include <cstdlib>

template< int condition >
void
test()
{
compose_visitors(
[] (std::integral_constant< int, 0 >) { std::cout << 0 << std::endl; },
[&] (std::integral_constant< int, 1 >) { std::cout << 1 << std::endl; },
[] (std::integral_constant< int, 2 >) { std::cout << 2 << std::endl; }
)(std::integral_constant< int, condition >{});
}

int
main()
{
test< 0 >();
//test< 1 >();
test< 2 >();
return EXIT_SUCCESS;
}

Какие приемы позволяют мне обнаружить наличие определенного блока кода в полученном двоичном файле / .o / .a?

Ранее можно было сделать следующее (для НКУ):

  • добавлять -Wa,-adhlns="[email protected]" в CXXFLAGS;
  • добавлять asm volatile ("nop"); оператор для блока кода, который вы хотите проверить;
  • построить, затем запустить awk "/\#APP/, /\#NO_APP/" build/*.lst (вместо символа хеша может быть косая черта), чтобы увидеть встроенную сборку в *.lst файлы в build каталог;
  • если awk печатает что-то, затем генерируется определенный блок кода.

LIVE DEMO

Но я пользуюсь clang и поэтому не может использовать -Wa параметр компилятора. Какой путь для clang? Я знаю, что я могу излучать файлы сборки (.S) с помощью -S опция компилятора, но в большом проекте это трудно сделать, если во время сборки существует цепочка зависимостей. Как излучать сборки к тому же в .o файлы?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]