我有一个遍历 LLVM IR 代码的 LLVM 传递,我想为原始代码的函数和基本块获取一个目录和一个文件名。我知道当我有一个指令指针时,我可以使用下面的代码轻松获取信息:感谢@hailinzeng(如何从 LLVM 指令获取文件名和目录?)
const llvm::DebugLoc &location = i_iter->getDebugLoc();
if (location && debugLocationInfoOn) {
std::string dbgInfo;
llvm::raw_string_ostream rso(dbgInfo);
location.print(rso);
std::cout << rso.str();
}
Run Code Online (Sandbox Code Playgroud)
但是,由于类Function和BasicBlock没有成员函数getDebugLoc(),这不起作用。我在这里看到了另一篇使用元数据的帖子,但我不知道如何访问元数据DILocation或DIScope从元数据获取。使用
MDNode *n = inst->getMetadata("dbg");
DILocation loc(n); `
Run Code Online (Sandbox Code Playgroud)
给出以下错误
/usr/lib/llvm-3.9/include/llvm/IR/Metadata.def:83:42: 注意:'llvm::DILocation' 的前向声明 HANDLE_SPECIALIZED_MDNODE_LEAF_UNIQUABLE(DILocation)
我正在使用 llvm 3.9。
更新 :: 感谢斯坦尼斯拉夫·潘克维奇。我没有包含正确的标题,但现在我有一个新问题。DILocation 需要 LLVMContext、StorageType 和 unsigned Line。如何从函数指针获取行号和存储类型?
DILocation(LLVMContext &C, StorageType Storage, unsigned Line,
对于那些处理类似问题的人,您可以使用 LLVMContext
llvm::MDNode * testmd = F.getMetadata("dbg"); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下命令执行 clang 5.0 但它不起作用..我输入:
import clang
import clang.cindex
clang.cindex.Config.set_library_file('/usr/lib/x86_64-linux-gnu/libclang-5.0.so.1')
id = clang.cindex.Index.create()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
clang.cindex.LibclangError:/usr/lib/x86_64-linux-gnu/libclang-5.0.so.1:未定义符号:clang_CXXRecord_isAbstract。请确保您的 python 绑定与您的 libclang.so 版本兼容。
我从 git 构建 llvm 并想在项目中使用这些库,尤其是 libclang。“makefiles”是通过 CMake 生成的,对于 LLVM 部分,我找到了LLVM_DIR重新路由 llvm 库路径的设置,但是对于 Clang,我找不到这样的变量,我仍然在链接行中看到(它是 Cygwin系统)
/usr/lib/libclang.dll.a /usr/lib/libclangTooling.dll.a。
问题:我应该设置哪个环境变量来获得正确的构建 Clang 库?
我有一张地图,我希望返回一个跨度,如下所示
map<string, map<string, Struct>> map;
span<pair<string, map<string, Struct>>> s {map.begin(), map.end()};
Run Code Online (Sandbox Code Playgroud)
编译失败,抱怨没有已知的从 map::iterator 到 span 模板类型的转换。我不确定为什么会失败,因为据我了解,迭代器范围构造函数应该将映射迭代器分解(成对>),然后将其“复制”过来。我在这里缺少什么?
使用 clang8 编译
我想知道是否可以让 LLVMopt工具详细报告在每个优化级别(如-O1、-O2等)期间成功使用了哪些优化通道。
例如,这是文件的简单位码foo.bc:
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 1, i32* %2, align 4
store i32 1, i32* %3, align 4
%4 = load i32, i32* %2, align 4
ret i32 %4
}
Run Code Online (Sandbox Code Playgroud)
这是运行后获得的bitcodeopt -O1 foo.bc -o foo.opt.bc
; Function Attrs: noinline norecurse nounwind …Run Code Online (Sandbox Code Playgroud) 假设我有以下预处理器定义
#define MYNUMBER 10f;
我想在我的代码中使用它如下:
float someResult = MYNUMBER * 3;
Run Code Online (Sandbox Code Playgroud)
当我这样做时,Xcode认为我试图*用作一元指针标记而不是乘法符号,并导致错误.定义这样一个常量并在乘法表达式中使用它的正确方法是什么?
使用LLVM clang ++ 4.9.2使用OMP指令编译cpp程序时,我看到了隐藏函数@ .omp_outlined。是在位码中生成的。我想知道这个隐藏函数是什么,是否有可能避免生成它。
我最近开始使用 CLang 来编译嵌入式 C++ ARM 程序。
在此之前,我使用 GCC 和 C,几乎专门用于嵌入式工作。
我注意到当我有一个返回值的方法时,我忘记了 return 语句,程序核心转储。除了来自我的设备驱动程序之一的“msleep error -1”之外,没有打印任何错误。这是在 FreeBSD 上。
我希望忘记 return 语句只会导致函数返回垃圾,而不是核心转储。
编辑:我要返回一个布尔值,而不是指针或对象或任何复杂的东西。即使返回值无关紧要,程序也会崩溃。
到底是怎么回事?
例如:
bool MyClass::DummyFunc() {
<do some stuff and forget the return value>
}
Run Code Online (Sandbox Code Playgroud)
别处:
if(pMyObj->DummyFunc()) {
print ("Hey, it's true!\n");
} else {
print ("Darn, it's false!\n");
}
Run Code Online (Sandbox Code Playgroud)
无论返回值如何,该代码都不应崩溃。