2015-02-28 5 views
4

Я пытаюсь создать и добавить встроенные выражения сборки, используя пропуск llvm. Я знаю, что могу использовать void appendModuleInlineAsm (StringRef Asm), но я не мог заставить его работать.Вставить встроенные выражения сборки, используя Llvm pass

В основном я хочу, чтобы добавить инструкцию, как это:

%X = call i32 asm "bswap $0", "=r,r"(i32 %Y) 

Просто перед другой инструкцией. Кто-нибудь пробовал?

ответ

2

Основная идея:

а) Вы хотите, функцию пропуска перебрать инструкции, б) Вы хотите перебрать основные блоки и инструкции, пока вы найдете инструкцию вы хотите вставить перед тем, с) делать что-то вроде ниже:

llvm::InlineAsm *IA = 
    llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect, 
         /* IsAlignStack */ false, AsmDialect); 
    llvm::CallInst *Result = Builder.CreateCall(IA, Args); 
    Result->addAttribute(llvm::AttributeSet::FunctionIndex, 
         llvm::Attribute::NoUnwind); 

который был щедро украденное из лязга. Взгляните на документы на InlineAsm для остальных аргументов, а Builder - это экземпляр DIBuilder. Убедитесь, что вы установили точку ввода DIBuilder в нужное место.

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