【发布时间】:2017-05-31 16:12:06
【问题描述】:
我正在尝试这样做:
1- 插入一个变量 t1。
2- 插入对 chrono 函数的调用(以获取时间)。
3- 将计时的返回值存储在 t1 中
4- 插入对“function”(我编写的一个函数)的调用并将 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::指令*) + 71 5 pass.so 0x400265b2 堆栈转储: 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. 在模块“mtd.cc”上运行传递“同步分析器”。 clang:错误:无法执行命令:分段错误(核心转储) clang:错误:clang 前端命令因信号而失败(使用 -v 到 见调用)Ubuntu clang 版本 3.4-1ubuntu3 (tags/RELEASE_34/final) (基于 LLVM 3.4) 目标:i386-pc-linux-gnu 线程模型:posix clang:注意:诊断消息:请提交错误 向http://bugs.debian.org/ 报告并包括崩溃回溯, 预处理的源代码和相关的运行脚本。铿锵声:注意: 诊断信息:
请在错误报告中附加以下文件:预处理 源和相关的运行脚本位于:clang:注意: 诊断消息:/tmp/mtd-7d9a20.cpp clang:注意:诊断消息: /tmp/mtd-7d9a20.sh clang:注意:诊断消息:
************************ make: *** [mtd.o] 错误 254
除了生成上述代码之外,阅读文档对我没有多大帮助。我有以下问题:
1- 我的通行证代码有什么问题?也就是说,我要怎么加代码?
2- 这个错误是什么意思?除了存在分段错误并且无法执行命令(可能是因为我是新手?)之外,我看不到任何有意义的消息。
3- 我知道如何插入对我在另一个 C++ 文件中编写的函数(如“函数”)的调用,而不是对函数的调用,而不是对在 C++ 库中定义的函数(如这个 chrono 函数)的调用,这就是我写“std: :chrono::duration_cast
抱歉,如果我的问题太基本了。我们将不胜感激帮助和指导!
【问题讨论】:
-
该代码没有多大意义(并且肯定不会以当前形式编译),因此不清楚您要做什么。由于不清楚您要做什么,因此基本上无法提供指导。尝试重写问题。 (例如,你为什么要使用 allocas?如果你只想要 t1,你就不需要它们;你真的将该字符串传递给 getOrInsertFunction 吗?这将永远无法工作......)
-
另外,不相关:看起来您使用的是旧的 llvm 版本...
-
嗨@CAFxX。我编辑了问题以使其更清楚,请看一下。谢谢!
标签: c++ linux llvm llvm-clang llvm-ir