标签: llvm-clang

从函数获取文件名和位置

我有一个遍历 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)

但是,由于类FunctionBasicBlock没有成员函数getDebugLoc(),这不起作用。我在这里看到了另一篇使用元数据的帖子但我不知道如何访问元数据DILocationDIScope从元数据获取。使用

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)

llvm llvm-clang clang++ llvm-3.0 llvm-ir

1
推荐指数
1
解决办法
1458
查看次数

clang.cindex.LibclangError“未定义符号clang_CXXRecord_isAbstract”

我正在尝试使用以下命令执行 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 版本兼容。

我正在使用 clang-5.0 和https://github.com/llvm-mirror/clang的绑定

c++ python linux llvm-clang

1
推荐指数
1
解决办法
6028
查看次数

在 CMake 中设置 Clang 库的路径

我从 git 构建 llvm 并想在项目中使用这些库,尤其是 libclang。“makefiles”是通过 CMake 生成的,对于 LLVM 部分,我找到了LLVM_DIR重新路由 llvm 库路径的设置,但是对于 Clang,我找不到这样的变量,我仍然在链接行中看到(它是 Cygwin系统) /usr/lib/libclang.dll.a /usr/lib/libclangTooling.dll.a

问题:我应该设置哪个环境变量来获得正确的构建 Clang 库?

cmake llvm clang llvm-clang

1
推荐指数
1
解决办法
2196
查看次数

从地图构造跨度

我有一张地图,我希望返回一个跨度,如下所示

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 编译

c++ llvm-clang c++20

1
推荐指数
1
解决办法
924
查看次数

如何使 LLVM Opt 工具报告每个优化 -O1、-O2 等成功使用的分析通道?

我想知道是否可以让 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)

optimization llvm llvm-clang llvm-ir bitcode

1
推荐指数
1
解决办法
4757
查看次数

在Objective - C中乘以预处理器常量

假设我有以下预处理器定义

#define MYNUMBER 10f;

我想在我的代码中使用它如下:

float someResult = MYNUMBER * 3;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,Xcode认为我试图*用作一元指针标记而不是乘法符号,并导致错误.定义这样一个常量并在乘法表达式中使用它的正确方法是什么?

objective-c llvm llvm-clang ios xcode4.3

0
推荐指数
1
解决办法
206
查看次数

用LLVM编译的omp程序中的omp_outlined

使用LLVM clang ++ 4.9.2使用OMP指令编译cpp程序时,我看到了隐藏函数@ .omp_outlined。是在位码中生成的。我想知道这个隐藏函数是什么,是否有可能避免生成它。

openmp llvm llvm-clang

0
推荐指数
1
解决办法
232
查看次数

为什么我的 C++ 程序会在我忘记 return 语句时崩溃,而不仅仅是返回垃圾?

我最近开始使用 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)

无论返回值如何,该代码都不应崩溃。

c++ freebsd llvm clang llvm-clang

-6
推荐指数
1
解决办法
629
查看次数