我决定尝试一下 Clang,因为我听说了它的好消息,并且我想尝试一些 C++11 功能。所以,像往常一样,我从一个简单的 hello world 程序开始。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用 GCC 编译得很好的东西不能在 Clang 中编译。相反,我收到此错误。
Apple clang version 4.1 (tags/Apple/clang-421.11.65) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix
"/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 134.9 -v -resource-dir /usr/bin/../lib/clang/4.1 -fmodule-cache-path /var/folders/js/j_8fpm_j0vl1d_2r_lsxlddm0000gn/T/clang-module-cache -fdeprecated-macro -fdebug-compilation-dir /Users/alexanderstein/Desktop/build -ferror-limit 19 -fmessage-length 80 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime-has-arc …Run Code Online (Sandbox Code Playgroud) 我使用 clang++ 3.4 将 C++11 程序 (test.cpp) 编译为 LLVM IR 文件 (test.ll)。该程序包含多个 C++ lambda 函数,我想知道是否可以使用如下技术仅提取 lambda 函数的 IR:
Module *mod = ParseIRFile("test.ll", *err, ctx);
for (Module::iterator f = mod->begin(); f != mod->end(); ++f) {
//is there some function like isLambdaFunction()?
if (f->isLambdaFunction()) {
cout << "Lambda Function" << endl;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 LibTooling 替换 C 代码文件中的函数和变量名称。因此,我下载了 llvm 并按照说明使用 GMake 和 Visual Studio 2015 在 Windows 中进行设置。
有许多教程(例如本教程)我想遵循,但它们都假设您使用的是 Linux/Make,因此它们提供了一个 Makefile,以某种方式管理与 llvm 源代码的集成。
我想要做的是在 Visual Studio 中使用这些示例,但我不知道从哪里开始 - 我可以在给定的 (llvn.sln) 解决方案中创建一个新项目并在那里添加代码吗?我如何告诉 Visual Studio 包含 clang 源(如我提到的那些 Makefile 中所定义)?
我正在尝试解析 LLVM-IR 文件(.ll)并进行静态分析。
我在下面找到了这个示例代码,我尝试构建它,但我不知道要链接哪个库。
#include <iostream>
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
int main(int argc, char** argv)
{
if (argc < 2) {
errs() << "Expected an argument - IR file name\n";
exit(1);
}
LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;
std::unique_ptr<Module> Mod = parseIRFile(argv[1], Err, Context);
if (Mod) {
std::cout << "Mod is not null" << std::endl;
}
else {
std::cout << "Mod is null" << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我给出了下面的命令来构建,它给了我一些未定义的参考错误,我认为这是一个链接错误。
g++ …Run Code Online (Sandbox Code Playgroud) compiler-construction static-analysis llvm llvm-clang llvm-ir
我正在尝试使用以下内联程序集编译 CUDA 代码:
static __device__ uint get_smid(void) {
uint ret;
asm("mov.u32 %0, %smid;" : "=r"(ret) );
return ret;
}
Run Code Online (Sandbox Code Playgroud)
nvcc带有标志的代码编译得很好-Xptxas -v。
当我尝试使用clang++(版本 4.0)和相应的标志-Xcuda-ptxas -v(我认为这是正确的,但我可能错了)编译它时,出现以下错误:
../../include/cutil_subset.h:23:25: error: invalid % escape in inline assembly string asm("mov.u32 %0, %smid;" : "=r"(ret) );
它指向%smid.
我想我应该链接正确的库,但我也有这个:L/cuda/install/lib.
另一种可能是 NVPTX asm 不兼容。在这个页面上,解释了 LLVM 对所有 PTX 变量都有不同的定义(smid 和 warpid 也有一些)。现在,如果提到的代码必须单独(不是内联)编写和编译,我会迷失方向。
有没有人以前处理过类似的问题?欢迎提出建议。
我使用 LLVMopt来运行 pass,例如使用opt -load libMyPass.so my-pass foo.ll > foo1.ll.
foo.ll是一个 IR 文件,我想foo1.ll以 IR 格式包含运行该过程的结果。但foo1.ll变成了位码文件,所以我需要将llvm-dis foo1.ll其转换为 IR 格式。
如何避免运行llvm-dis并opt从 IR 格式转换为 IR 格式?
所以我有一个简单的eBPF代码:
我的.h:
#ifndef __MY_COMMON_H__
#define __MY_COMMON_H__
#include <linux/types.h>
struct foo {
int a;
int b;
int c;
int d;
};
#endif /* __MY_COMMON_H__ */
Run Code Online (Sandbox Code Playgroud)
my_kern.c:
...
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_HASH,
.key_size = ...,
.value_size = ...,
.max_entries = MAX_ENTRIES,
};
struct foo my_foo = {
.a = 150000,
.b = 100,
.c = 10,
.d = 40,
};
SEC("sockops")
int my_bpf(struct bpf_sock_ops *sk_ops)
{
...
};
char _license[] SEC("license") = "GPL";
u32 _version …Run Code Online (Sandbox Code Playgroud) 我正在查看一个使用 Clang 构建的项目,但它需要 GCC 标头。
为什么一个项目需要 Clang 和 GCC 头文件?
是否可以使用 LLVM 读取 C 代码并使其更快?我已经看到很多关于使用 LLVM 将 C++ 转换为(不可读的)C 代码的讨论,但我想知道 LLVM 是否可以读取 C 代码,并生成一个具有相同功能的文件(代码,而不是可执行文件)速度更快。
我想在运行 Ubuntu 20.04 Focal 的 AArch64 Raspberry Pi 4 上使用 clang-11。我查看了https://apt.llvm.org/,但 AArch64 预构建二进制文件似乎不可用?
我尝试直接在 Raspberry Pi 上构建 clang,但速度非常慢,最终我的 SD 卡空间不足。
我如何在 x64 笔记本电脑上自己交叉编译 clang?
llvm-clang ×10
llvm ×5
c++ ×3
clang ×3
llvm-c++-api ×2
arm64 ×1
bpf ×1
c ×1
c++11 ×1
clang++ ×1
cmake ×1
compilation ×1
cuda ×1
gcc ×1
lambda ×1
libtooling ×1
linux-kernel ×1
llvm-ir ×1
networking ×1