2016-08-02 2 views
1

У меня есть llvm :: Значение. Значение :: свалка() печатаетLLVM: Как узнать, какой тип используется?

void (...)* bitcast (void()* @test_impl to void (...)*) 

Обычно я предположил бы, что это BitCastOperator, однако, этот класс, кажется, не существует в LLVM 3.4.2 (который я использую, потому что один из инструментов, которые я я работаю с еще не портирован на более новую версию).

Какой подкласс Value это? И как я могу ответить на такие вопросы в будущем? Я пробовал:

  • отладка с lldb. Это может сказать только класс высшего уровня.
  • Доступ к информации rtti. У LLVM, похоже, есть собственная система RTTI, которая несовместима с typeid() и не имеет эквивалента typeid().
  • Скомпилировав код API C++, это скажет мне, как создать это значение, и я мог видеть тип этого. Тем не менее, llc -march = cpp терпит неудачу с неясной ошибкой (Invalid primitive type), а clang -march = cpp говорит, что не знает эту архитектуру. Я подтвердил, что clang -version и llc -version дают тот же номер версии.
  • Я подтвердил, что это не бит-код, потому что dyn_cast не работает.

ответ

1
void (...)* bitcast (void()* @test_impl to void (...)*) 

Какой подкласс Value это?

Это constant expression, в частности, битовое константное выражение, представленное классом ConstantExpr. Вы можете получить код операции, используя ConstantExpr::getOpcode или его строковое представление, используя ConstantExpr::getOpcodeName.

bitcast (КНТ ТИП)

Преобразование константы, ДКБ, к другому типу. Ограничения операндов такие же, как и для команды бит-бит.

Вообще, когда вы видите некоторый опкод применяется к постоянным операндам, как и в этом случае (в отличие от bitcast (void()* %1 to void(...)*); glovals вары постоянные), вы должны думать о константах первым. Я действительно не думаю, что есть простой способ построить настоящую инструкцию IR с постоянными операндами, когда существует экземпляр constexpr.

И как я могу ответить на такие вопросы в будущем?

Вы можете использовать llvm::isa и llvm::dynamic_cast, как и вы. Во время отладки я также нашел Value::getValueID.

llc -march=cpp завершается с ошибкой неясного

Боковая примечание: CPPBackend не был обновлен на некоторое время и был removed недавно. Я не удивлен, что это не сработало.

Смежные вопросы