我正在尝试这样做:
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
如果我的问题太基础,请道歉。帮助和指导将不胜感激!
答案 0 :(得分:1)
由于指令继承自LLVM中的值,因此在将函数作为调用指令插入后,只需将该指令传递给下一个函数即可。不需要您尝试执行的加载存储操作。所以调用你的时间函数并将你用来调用它的指令对象传递给&#34;函数&#34;。