LLVM вставляет код операции перед инструкцией

Я хочу вставить определенный код операции перед терминатором BasicBlock, в моем случае перед ReturnInst.

Возможно?

Пример:

TerminatorInst* terminator = BasicBlock->getTerminator();
if (isa<ReturnInst>(terminator))  
{
//Insert opcode here.    
}

person Denis    schedule 04.11.2013    source источник


Ответы (2)


Под «кодом операции», я думаю, вы имеете в виду «инструкцию».

Все инструкции имеют конструктор, который получает другую инструкцию в качестве последнего параметра; этот конструктор создает новую инструкцию, а затем вставляет ее прямо перед инструкцией, которая была указана в качестве последнего аргумента, именно то, что вы ищете.

Дополнительные сведения об этом см. в разделе "создание и вставка новой инструкции" раздел руководства пользователя.

person Oak    schedule 04.11.2013
comment
Спасибо! Как я могу добавить инструкцию, которой нет в LLVM (Instructions.h)? - person Denis; 04.11.2013
comment
@ Денис, можешь привести пример того, что ты хочешь вставить? - person Oak; 04.11.2013
comment
Просто, я хочу вставить инструкцию nop(0x90) перед ret - person Denis; 04.11.2013
comment
@Denis 0x90 — это инструкция nop в бинарных файлах x86, а не в LLVM IR — это два разных, разных языка (хотя вы можете встроить сборку в LLVM IR). Вы можете просмотреть список всех инструкций LLVM IR в Справочном руководстве по языку LLVM, в частности , там нет инструкции nop. - person Oak; 04.11.2013
comment
Да, я знаю, какой-нибудь хак для этого? - person Denis; 04.11.2013
comment
@Denis Я не могу представить себе причину, по которой кто-то захочет это сделать ... но, как я писал выше, это возможно возможно с использованием существующего механизма встраивания встроенного кода asm, проверьте ссылку Я предоставил в руководстве langref. - person Oak; 04.11.2013
comment
Спасибо! если я сравниваю два целых числа, ICmpInst *test = new ICmpInst(terminator, CmpInst::ICMP_EQ, const_int32_1, const_int32_2,check); Инструкция удаляется после создания кода asm (имя ООО.ll), мне нужно создать ветку для этого? - person Denis; 04.11.2013
comment
@Denis Мне трудно представить ваш код здесь ... Я предлагаю вам открыть новый вопрос об этом с более полными фрагментами кода. - person Oak; 04.11.2013

Проблема решена с помощью llvm::InlineAsm

llvm::InlineAsm *AsmCode = llvm::InlineAsm::get(Asm, nopInstruction, "", true, false, llvm::InlineAsm::AD_Intel);

где Asm - llvm::FunctionType, nopInstruction - llvm::StringRef(char*)

person Denis    schedule 05.11.2013