天道酬勤,学无止境

llvm

Generate LLVM bitcode for android aosp

问题 谁能给我一个指针,告诉我如何为 Android aosp 生成 LLVM 位码? 我在 build/core/clang/clear_vars.mk 中更改了以下内容: LOCAL_CLANG_CFLAGS:=-emit-llvm -S LOCAL_CLANG_CPPFLAGS:=-emit-llvm -S LOCAL_CLANG:=true 但是,此设置导致 aosp 构建失败。 任何建议将不胜感激。

2022-05-16 13:24:23    分类:技术分享    android   llvm   android-source   bitcode

clang++ warning: "warning: unknown warning option '-Wno-maybe-uninitialized'"

问题 使用以下命令在 Ubuntu 16.04 上安装 LLVM: sudo apt-get install clang llvm 编译时出现以下错误: nlykkei@nlykkei-VirtualBox:~$ clang++ -g toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs` -o toy warning: unknown warning option '-Wno-maybe-uninitialized'; did you mean '-Wno-uninitialized'? [-Wunknown-warning-option] 1 warning generated. 具体来说,我遵循 LLVM 网站上的教程:http://llvm.org/docs/tutorial/LangImpl03.html。 LLVM 的版本是 3.8。 我如何摆脱这个警告? 谢谢。 回答1 这是 llvm-config 中的一个错误。 长话短说, llvm-config输出-Wno-maybe-uninitialized这不是 clang 实现的警告。 一种可能的解决方法是添加一个额外的标志来压制关于未知警告的警告。 clang++ <your flags> -Wno-unknown-warning-option

2022-05-15 20:48:09    分类:技术分享    c++   ubuntu   clang   warnings   llvm

How do you use c++filt with llvm-cov report?

问题 我正在尝试将 demangler 与 llvm-cov 报告工具一起使用。 以下是我正在运行的命令: llvm-cov report /path/to/executable -instr-profile /path/to/default.profdata /path/to/src/ -Xdemangler c++filt -Xdemangler -n 我尝试重新排列选项,并尝试使用“-Xdemangler=c++filt -Xdemangler=-n”代替,还使用--no-strip-underscore 代替-n。 它不会抱怨 demangler,而如果我在命令语法中犯了一个明显的错误,它会告诉我,但输出不会被 demangled。 来自 llvm-cov 文档: -Xdemangler=< TOOL >|< TOOL-OPTION >指定一个符号 demangler。 这可用于使报告更具人类可读性。 可以多次指定此选项以向 demangler 提供参数(例如 -Xdemangler c++filt -Xdemangler -n for C++) 。 拆解器应从标准输入读取换行符分隔的符号列表,并将相同长度的换行符分隔列表写入标准输出。 我使用以下方法确保 c++filt 正常工作,并且确实如此: c++filt -n _ZN4core6ZipperC2ENSt3_

2022-05-15 15:11:20    分类:技术分享    c++   llvm   code-coverage   llvm-cov

How to find the offset value of @PAGE/@PAGEOFF

问题 查看反汇编代码,我看到了如下说明: adrp x8,l066@PAGE add x8,x8,l066@PAGEOFF 它们是在某处定义的偏移标签吗? 以及如何找到它们的价值? 回答1 回答2

2022-05-14 17:45:11    分类:技术分享    assembly   llvm   arm64

Building and using a pass for LLVM 3.8 on OSX

问题 我正在尝试使用 llvm 3.8 在 OSX 上构建和应用通行证。 我使用带有以下公式的 brew 安装了 llvm 3.8: $brew install llvm38在 pass 中我有以下内容: static RegisterPass<SwiftPass> X("pass", "My Pass"); 我构建通行证的 Makefile 如下所示: LIB_NAME = pass$(SUFIX) LDFLAGS = $(shell $(LLVM_PATH)llvm-config --ldflags) CXXFLAGS = -g -Wall -fno-rtti -fPIC -std=c++11 -shared -dynamiclib $(shell $(LLVM_PATH)llvm-config --cxxflags --system-libs --libs core executionengine interpreter mc support nativecodegen) COMPILER = clang++ all: $(LIB_NAME) $(LIB_NAME): $(OBJ) $(COMPILER) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ 如果给了我一些clang: warning: -l[some lib]: 'linker' input

2022-05-14 00:23:05    分类:技术分享    c++   macos   makefile   llvm   llvm-ir

In LLVM IR, how can I print the name of a unnamed value which is represented as an unsigned numeric value with their prefix such as %2?

问题 我想打印出用 LLVM IR 编写的指令(用于练习),我有一个这样的 BitCastInst: %0 = bitcast [32xi32]* %reg to i8* 在这种情况下,如何打印它的左值名称,即未命名值%0 ? 回答1 这些名称实际上并不存在于 IR 的内存表示中——在那里,值只是使用指针引用其他值。 名称在写出时被计算并添加到文本形式中。 这是有道理的,因为变换会不断地操纵 IR,并且每当在某处插入指令时,必须去更新所有名称会很昂贵。 您可以查看AsmWriter的源代码来验证这一点——递增的数字是由 SlotTracker 在这里分配的,这是在 IR 中打印出指令行的代码,如果存在则使用名称或槽号不是。

2022-05-11 09:26:17    分类:技术分享    clang   llvm   llvm-ir

The GEP Instruction: i32 vs i64

问题 我一直在尝试理解 LLVM 的 GetElementPtr (GEP) 指令并遇到了这个文档: http://llvm.org/docs/GetElementPtr.html 这很有帮助,但有一些事情我觉得很困惑。 特别是在“GEP 取消引用了什么?”部分中。 (http://llvm.org/docs/GetElementPtr.html#id6) 讨论以下代码: %MyVar = uninitialized global { [40 x i32 ]* } ... %idx = getelementptr { [40 x i32]* }, { [40 x i32]* }* %MyVar, i64 0, i32 0, i64 0, i64 17 %MyVar是一个全局变量,它是一个指向结构的指针,该结构包含指向 40 个整数数组的指针。 这很清楚。 我知道%MyVar之后的参数是其中的索引,但我不明白为什么其中一些被声明为i64而另一些被声明为i32 。 我的理解是这段代码是为 64 位机器编写的,并且指针被假定为 64 位宽。 %MyVar指向的数组内容为 32 位宽。 那么为什么最后一个索引是i64 17而不是i32 17呢? 我还应该指出,这个例子说明了 GEP 的非法使用(必须取消引用结构中的指针才能索引到 40 个整数的数组),我试图很好地理解为什么会这样。 回答1

2022-05-11 05:33:04    分类:技术分享    llvm   llvm-ir

Generate call to intrinsic using LLVM C API

问题 我正在编写一些使用 LLVM C API 的代码。 如何使用内在函数,例如llvm.cos.f64或llvm.sadd.with.overflow.i32 ? 每当我尝试通过使用LLVMAddGlobal (具有正确的类型签名)生成全局来执行此操作时,我只会在 JIT 链接阶段收到此错误消息: LLVM ERROR: Could not resolve external global address: llvm.cos.f64 我没有使用 LLVM C++ interface ,所以 LLVM insert intrinsic function Cos 中的建议似乎并不适用。 我想我需要像Intrinsic::getDeclaration这样的东西,但我似乎找不到它。 我错过了一些明显的东西吗? 回答1 无需离开 C API。 将内部名称传递给LLVMAddFunction : LLVMTypeRef param_types[] = {LLVMDoubleType()}; LLVMTypeRef fn_type = LLVMFunctionType(LLVMDoubleType(), param_types, 1, false); LLVMValueRef fn = LLVMAddFunction(module, "llvm.cos.f64", fn_type); 然后

2022-05-09 20:34:12    分类:技术分享    llvm   intrinsics

How to Disable Optimization for One File in Xcode

问题 回答1

2022-05-09 18:04:04    分类:技术分享    xcode   clang   llvm

w64-Mingw LLVMSupport.a : undefined reference to __imp_*

问题 试图将某些东西链接到 LLVMSupport 的相当奇怪的错误: C:/projects/builds/LLVM-3.3/lib/../lib/libLLVMsupport.a(Signals.cpp.obj):Signals.cpp:(.text+0x524): undefined reference to `__imp_SymSetOptions' C:/projects/builds/LLVM-3.3/lib/../lib/libLLVMsupport.a(Signals.cpp.obj):Signals.cpp:(.text+0x542): undefined reference to `__imp_SymInitialize' C:/projects/builds/LLVM-3.3/lib/../lib/libLLVMsupport.a(Signals.cpp.obj):Signals.cpp:(.text+0x576): undefined reference to `__imp_SymGetModuleBase64' C:/projects/builds/LLVM-3.3/lib/../lib/libLLVMsupport.a(Signals.cpp.obj):Signals.cpp:(.text+0x582): undefined reference to `

2022-05-09 09:34:15    分类:技术分享    linker   static-libraries   llvm