使用LLVM传递加载和存储变量

时间:2017-01-16 18:31:56

标签: c++ linux llvm llvm-clang llvm-ir

我正在尝试这样做:

1-插入变量t1。

2-插入对chrono函数的调用(以获取时间)。

3-在t1

中存储chrono的返回值

4-拨打"功能" (我写的一个函数)并传递t1作为参数。函数对t1进行了一些计算。

在代码中它是:

float t1 = std::chrono::duration_cast<chrono::nanoseconds(chrono_steady_clock::now().time_since_epoch().count());
function(t1);

但是我想在我试图修改的程序中插入上面的LLVM传递。 我不确定如何做到这一点,但我的想法是:

Constant *TFunc = M.getOrInsertFunction("std::chrono::duration_cast<chrono::nanoseconds(chrono_steady_clock::now().time_since_epoch().count())", Type::getFloatTy(M.getContext()),NULL);
tfunc = cast<Function>(TFunc);
for (*certain type of instructions Inst*){
    CallInst *CurrInst = dyn_cast<CallInst>(Inst);
    AllocaInst *Talloc = new AllocaInst(Type::getFloatTy((*Inst).getContext()),"t1");
    Instruction *Tcall = CallInst::Create(tfunc,"");
    StoreInst* store_t = new StoreInst(Tcall,Talloc,(Instruction*)CurrInst);
    if(storeT != NULL) {
        LoadInst* loadT = new LoadInst(storeT,"",false);
        Value* t1 = loadT;
        Instruction *newInst = CallInst::Create(hook,loadT, "");
        Inst->getInstList().insert((Instruction*)CurrInst, newInst);
    }
}

我得到的错误是:

  

0 libLLVM-3.4.so.1 0x40f8150f llvm :: sys :: PrintStackTrace(_IO_FILE *)+   47 1 libLLVM-3.4.so.1 0x40f8177f 2 libLLVM-3.4.so.1 0x40f812ec 3
  0x40022400 __kernel_sigreturn + 0 4 libLLVM-3.4.so.1 0x40864ee7   llvm :: LoadInst :: LoadInst(llvm :: Value *,char const *,bool,   llvm :: Instruction *)+ 71 5 pass.so 0x400265b2 Stack dump:   0.程序参数:/ usr / bin / clang -cc1 -triple i386-pc-linux-gnu -emit-obj -disable-free -disable-llvm-verifier -main-file-name mtd.cc -mrelocation-model pic -pic-level 2 -fmath-errno -masm-verbose -mconstructor-aliases -fuse-init-array -target-cpu pentium4 -target-linker-version 2.24 -momit-leaf-frame-pointer -g -coverage-file / ../mtd.o   -resource-dir /usr/bin/../lib/clang/3.4 -dependency-file .deps / mtd.d -MT mtd.o -sys-header-deps -MP -include config.h -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D NDEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /usr/lib/llvm-3.4 / include -I /usr/lib/llvm-3.4/include -I /usr/lib/llvm-3.4/include   -internal-isystem /usr/include//c++/4.8 -internal-isystem /usr/include//c++/4.8/i386-linux-gnu -internal-isystem   /usr/include//c++/4.8/backward -internal-isystem   /usr/include//i386-linux-gnu/c++/4.8 -internal-isystem   /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/c++/4.8   -internal-isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/c++/4.8/i686-linux-gnu   -internal-isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/c++/4.8/backward   -internal-isystem /usr/bin/../lib/gcc/i686-linux-gnu/4.8/../../../../include/i686-linux-gnu/c++/4.8   -internal-isystem / usr / local / include -internal-isystem /usr/bin/../lib/clang/3.4/include -internal-externc-isystem   /usr/bin/../lib/gcc/i686-linux-gnu/4.8/include   -internal-externc-isystem / usr / include / i386-linux-gnu -internal-externc-isystem / include -internal-externc-isystem / usr / include -O3 -Woverloaded-virtual -Wcast-qual -W -Wall -w   -std = c ++ 11 -fdeprecated-macro -fdebug-compilation-dir /.../masstree-beta-master   -ferror-limit 19 -fmessage-length 80 -fvisibility-inlines-hidden -mstackrealign -fobjc-runtime = gcc -fdiagnostics-show-option -fcolor-diagnostics -vectorize-loops -vectorize-slp -load /../pass。所以   -o mtd.o -x c ++ mtd.cc   1.文件末尾的解析器   2.每模块优化过程   3.运行通过&#39;同步分析器&#39;在模块&#39; mtd.cc&#39;。 clang:错误:无法执行命令:分段错误(核心转储)   clang:错误:clang frontend命令因信号失败(使用-v to   看看调用)Ubuntu clang版本3.4-1ubuntu3   (标签/ RELEASE_34 / final)(基于LLVM 3.4)目标:i386-pc-linux-gnu   线程模型:posix clang:注意:诊断消息:请提交bug   报告http://bugs.debian.org/并包含崩溃回溯,   预处理源和关联的运行脚本。 clang:注意:   诊断信息:

           

请将以下文件附于BUG报告:预处理   源(s)和相关的运行脚本位于:clang:note:   诊断消息:/tmp/mtd-7d9a20.cpp clang:注意:诊断消息:   /tmp/mtd-7d9a20.sh clang:注意:诊断消息:

     

********************制作:*** [mtd.o]错误254

除了制作上述代码之外,阅读文档并没有多大帮助。我有以下问题:

1-我的密码有什么问题?换句话说,如何添加我想要的代码?

2-这个错误是什么意思?除了存在分段错误而且命令无法执行(可能是因为我是新手?)时,我看不到任何有意义的消息。

3-我知道如何插入对我在另一个C ++文件中编写的函数的调用(如&#34; function&#34;)但不是函数而不是函数而不是C ++库中定义的函数,如chrono函数这就是为什么我写了#34; std :: chrono :: duration_cast

如果我的问题太基础,请道歉。帮助和指导将不胜感激!

1 个答案:

答案 0 :(得分:1)

由于指令继承自LLVM中的值,因此在将函数作为调用指令插入后,只需将该指令传递给下一个函数即可。不需要您尝试执行的加载存储操作。所以调用你的时间函数并将你用来调用它的指令对象传递给&#34;函数&#34;。