问题原文如下:
LLVM 实现了指令调度,CPU 实现乱序执行,它们功能存在部分重复,区别和联系是什么?如何协同? LLVM 中实现的指令调度和硬件的乱序执行都可以解决数据依赖、冲突依赖、控制依赖等指令并行问题。也就是说它们的功能应该存在一定的重复,请问它们区别和联系是什么?
有没有好大哥回答一下?
OoO: Out of Order ,乱序执行
]]>于是编译了最新的 clang 和 lld 并安装(之前已下载过 LLVM 的 git 仓库,因此直接编译):
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_INSTALL_PREFIX=/usr/local ../llvm make install
安装位置为 /usr/local/bin/clang ,系统默认使用该版本。(原先的 clang 位于 /usr/bin/clang ,只有 160KB 。 真正的 clang 应该位于 /Library/Developer/CommandLineTools/usr/bin/clang ,有 200MB+)
虽然新版本的 clang 支持 wasm32 选项,但编译出现一大堆问题,所有头文件都找不到了~
即使编译参数里加上系统自带的头文件路径 -I /Library/Developer/CommandLineTools/SDKs/MacOSX13.0.sdk/usr/include/c++/v1
仍然一堆错误,例如 error: "No thread API"
、fatal error: 'string.h' file not found
等等。
或者使用 LLVM 提供的 C 文件 -I llvm-project/libcxx/include
也出现一堆错误。
这是踩到什么坑了吗?
]]>这是我的编译指令:
c++ clang++ -g -O3 -I /home/therlf/LLVM/include -I ./ -I /home/therlf/LLVM_Temp/llvm/include `llvm-config --cxxflags --ldflags --system-libs --libs all` ast/CallExprAST.o ast/NumberExprAST.o ast/PrototypeAST.o ast/FunctionAST.o ast/BinaryExprAST.o ast/VariableExprAST.o lexer/lexer.o logger/logger.o parser/parser.o main.cpp -o main
然后就出现了一系列的undefined error,截取一些如下:
/usr/bin/ld: /tmp/main-2b71c8.o:(.data+0x0): undefined reference to
llvm::DisableABIBreakingChecks /home/therlf/MyProject/tmp/ast/CallExprAST.cpp:6: undefined reference to
llvm::Module::getFunction(llvm::StringRef) const' /home/therlf/LLVM/include/llvm/IR/InstrTypes.h:1112: undefined reference tollvm::Instruction::Instruction(llvm::Type*, unsigned int, llvm::Use*, unsigned int, llvm::Instruction*)' /usr/bin/ld: /home/therlf/LLVM/include/llvm/IR/InstrTypes.h:977: undefined reference to
llvm::VectorType::get(llvm::Type*, llvm::ElementCount)'
我一开始以为是 Including path 的问题,但是我编译 tutorial 那个所有东西都在一块的代码是没问题的,自己编译各个模块也是没问题的,就是在一起编译链接了才会有问题,显示很多很多"undefined error"。
所以我认为是链接的问题,到网上搜一些博主说你必须使用lld来链接,而不是ld,但是之前 LLVM 没有 lld 的时候也是用 ld 来链接的,所以感觉使用 ld 应该也可以,而且我编译完 LLVM 后没有 lld 这个工具。
我的操作系统是Ubuntu 20.04,LLVM 版本为10.0.0svn。 我的 Makefile 如下:
HEADERS = $(shell find ast kaleidoscope lexer logger parser -name '*.h') OBJ = ${SOURCES:.cpp=.o} CC = clang++ CFLAGS = -g -O3 -I /home/therlf/LLVM/include -I ./ -I /home/therlf/LLVM_Temp/llvm/include LLVMFLAGS = `llvm-config --cxxflags --ldflags --system-libs --libs all` .PHONY: main main: main.cpp ${OBJ} ${CC} ${CFLAGS} ${LLVMFLAGS} ${OBJ} $< -o $@ clean: rm -r ${OBJ} %.o: %.cpp ${HEADERS} ${CC} ${CFLAGS} ${LLVMFLAGS} -c $< -o $@ ``` 万分感谢您的帮助!
]]>因为我看到 wiki 上说,llvm 用 c++写的, 所以我猜想,如果我学会了 c++, 将来用 llvm 做东西(开发编程语言), 应该会容易很多
请问我的观点对吗?
各位前辈能给点意见吗?
]]>llvm ir 里默认有 加法和减法的指令
比如加法:
; ModuleID = "ttt" target triple = "unknown-unknown-unknown" target datalayout = "" define double @"fpadd"(double %".1", double %".2") { entry: %"res" = fadd double %".1", %".2" ret double %"res" }
打印功能,我 间接调用了 c 语言的 printf (我看到网上其他人也是如此的,我就抄来了):
; ModuleID = "" target triple = "unknown-unknown-unknown" target datalayout = "" define i32 @"main"() { main.entry: %".2" = getelementptr inbounds [5 x i8], [5 x i8]* @".str0", i32 0, i32 0 %".3" = call i32 (i8*, ...) @"printf"(i8* %".2") ret i32 0 } declare i32 @"printf"(i8* %".1", ...) @".str0" = constant [5 x i8] c"1111\00"
假如我要读取硬盘里的文件,请求某个网址, 是不是无法基于 llvm ir 来实现,只能想办法 间接调用 c 语言的接口?
可是这样的话,那 llvm ir 对于我就没有存在的价值了, 那我为什么不直接用 c 语言开发一门语言,类似 python 基于 c 语言那样? 不是更简单吗
有大哥能解释一下吗?
谢谢
]]>我只要把我的编程语言,翻译成 llvm ir 里的语言, 就可以实现一门可以在大多数平台编译的语言了
所以,在我的语言里,我要实现 print("hello world"), 那我就要掌握 llvm ir 里,怎么实现 打印 hello word,
如果我要实现 定义一个函数的功能, 就要掌握 用 llvm ir 语言定义函数的方法
只有掌握了 llvm ir 语言, 才能实现这个翻译的过程
请问我的理解对吗? 我应该怎么办
下图是我发现的 llvm ir 的语言
如图
.GCC.command.line
。但是 Clang 编译出的 ELF 里没有类似的 section 。 请问哪位有点思路?我应该怎么去找。谢谢
]]>要做本科毕设了,现在想的主题是基于 LLVM 的(因为实习做的事也跟 LLVM 有关),但是像讨论寄存器分配这样的东西弄出来好像到最后也只能成一篇文献综述,不讨老师喜欢工作量也不大。
然后想到,既然几乎所有语言都能编译到 LLVM IR,那么要是有一个基于 LLVM IR 的包管理器,不是件很有意思的事情?
第一个想到的问题是,像 C++ 或者其他编译型语言,都是有 Name Mangling 机制的。如果要求编译出来的符号能相互链接,写代码的时候还得自己把 extern
这样的关键字加上。不过在这一层,可以要求用户在一个配置文件里指定导出符号的名字和签名,好像还是个好事。
第二个问题是,这些代码会不会存在跨平台上的障碍。虽然 LLVM IR 通常来说的确可以跨平台,但是不同平台(架构 /操作系统)的编译器前端生成的 IR 会不会不一样,以及会不会产生一些平台相关的代码现在都不太清楚,得再去看看。
第三个问题是,多数语言的可执行文件最后都需要依赖 Runtime 来运行。所以假设要做包管理器的话,是不是得要求这些 IR 都不能依赖各自语言的 Runtime ?好像到这样的话,就跟普通的 FFI 差不多了,就剩下 LLVM IR 比汇编层次高点这个优势了……
各位熟悉 LLVM 的大佬们对这个 Idea 有什么建议吗?或者有什么我没想到的跟 LLVM 有关的课题也可以告诉我,多谢!
]]>邮件列表:
http://lists.llvm.org/pipermail/llvm-announce/2017-September/000075.html
下载地址:
http://releases.llvm.org/download.html#5.0.0
如果要在 Windows 上构建 LLVM/Clang 可以使用 clangbuilder.
clangbuilder: https://github.com/fstudio/clangbuilder/