LLVM way to explore https:https://cdn.v2ex.com/navatar/e46d/e7e1/397_normal.png?m=1736182057 https:https://cdn.v2ex.com/navatar/e46d/e7e1/397_large.png?m=1736182057 2024-12-04T04:17:58Z Copyright © 2010-2018, V2EX 指令调度在 LLVM 与 OoO 的区别与联系? tag:www.v2ex.com,2024-12-04:/t/1094913 2024-12-04T04:18:58Z 2024-12-04T04:17:58Z detached member/detached 在知乎看到一个很有意思的问题。
Link

问题原文如下:

LLVM 实现了指令调度,CPU 实现乱序执行,它们功能存在部分重复,区别和联系是什么?如何协同? LLVM 中实现的指令调度和硬件的乱序执行都可以解决数据依赖、冲突依赖、控制依赖等指令并行问题。也就是说它们的功能应该存在一定的重复,请问它们区别和联系是什么?

有没有好大哥回答一下?

OoO: Out of Order ,乱序执行

]]> 使用 LLVM 的 clang 替换苹果自带的有问题吗 tag:www.v2ex.com,2023-07-26:/t/959999 2023-07-26T11:59:32Z 2023-07-26T16:03:39Z iqoo member/iqoo 编译 WebAssembly 时发现 Mac 自带的 clang 编译器无法设置 --target=wasm32 选项,而标准的 clang 可以。

于是编译了最新的 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 也出现一堆错误。

这是踩到什么坑了吗?

]]>
请问 LLVM 如何链接多个目标文件呢? tag:www.v2ex.com,2022-08-15:/t/872906 2022-08-15T02:44:08Z 2022-08-15T02:42:08Z therlf member/therlf 最近在看 LLVM 的 toturial : Kaleidoscope: Code generation to LLVM IR,里面的代码把所有东西都写到一个源文件了,而我选择将它们分为 lexer 、parser 、ast 分别写到不同的代码里,然后分别编译最后链接到一块

这是我的编译指令

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 to llvm::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 $@ ``` 万分感谢您的帮助!
]]>
基于 llvm 开发编程语言,有必要学汇编吗?理由是什么,谢谢 tag:www.v2ex.com,2021-02-16:/t/753626 2021-02-16T16:44:16Z 2021-02-16T18:41:16Z piqizhu8 member/piqizhu8 想更熟悉 LLVM,是不是要学会 c++?还要学其他的吗? tag:www.v2ex.com,2021-01-17:/t/745642 2021-01-17T06:34:51Z 2021-01-18T04:42:20Z piqizhu8 member/piqizhu8 我的最终目标是创造一门编程语言


因为我看到 wiki 上说,llvm 用 c++写的, 所以我猜想,如果我学会了 c++, 将来用 llvm 做东西(开发编程语言), 应该会容易很多

请问我的观点对吗?

各位前辈能给点意见吗?

]]>
我用 llvm 实现了 bb 语言的加法和减法,也套娃的实现了打印功能,那怎么实现更高级的,如 http 请求功能呢,该怎么套娃呢?套 c 语言吗 tag:www.v2ex.com,2020-12-21:/t/737666 2020-12-21T16:28:14Z 2020-12-21T18:11:59Z find456789 member/find456789 我一开始选择学 llvm,是发现 llvm 可以把代码编译成各种平台上的二进制,llvm ir 可以跨平台,我就想着,把自己的代码 转换为 llvm ir 就可以了


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 制作一门语言的编译器,是不是要学会 llvm ir 里的哪个奇怪的语法 tag:www.v2ex.com,2020-12-19:/t/737049 2020-12-19T07:15:47Z 2020-12-19T10:23:12Z find456789 member/find456789 我的理解是,llvm ir 里的语法,应该也类似一门编程语言,但这个语言是针对大部分硬件平台通用的

我只要把我的编程语言,翻译成 llvm ir 里的语言, 就可以实现一门可以在大多数平台编译的语言了

所以,在我的语言里,我要实现 print("hello world"), 那我就要掌握 llvm ir 里,怎么实现 打印 hello word,

如果我要实现 定义一个函数的功能, 就要掌握 用 llvm ir 语言定义函数的方法

只有掌握了 llvm ir 语言, 才能实现这个翻译的过程

请问我的理解对吗? 我应该怎么办


下图是我发现的 llvm ir 的语言

如图

image.png

]]>
用 Clang 编译时如何将编译参数存进 ELF 的某个 section 里? tag:www.v2ex.com,2020-09-03:/t/704047 2020-09-03T16:59:06Z 2020-09-03T20:33:12Z dangyuluo member/dangyuluo 最近遇到一个问题,就是需要从编译好的 ELF 里提取出编译时的参数,比如 Wall,Werror 一类的。GCC 下很容易,有一个 section 叫.GCC.command.line。但是 Clang 编译出的 ELF 里没有类似的 section 。

请问哪位有点思路?我应该怎么去找。谢谢

]]>
LLVM 8.0 发布 WebAssembly target 移除实验标签 tag:www.v2ex.com,2019-03-21:/t/546919 2019-03-21T03:15:41Z 2019-03-21T04:12:41Z gainsurier member/gainsurier https://lists.llvm.org/pipermail/llvm-announce/2019-March/000082.html

- speculative load hardening
- concurrent compilation in the ORC JIT API,
- no longerexperimental WebAssembly target
- a Clang option to initialize automatic variables
- improved pre-compiled header support in clang-cl
- the /Zc:dllexportInlines- flag
- RISC-V support in lld. ]]>
假如要实现一个基于 LLVM IR 的包管理器,有什么坑或者硬伤吗? tag:www.v2ex.com,2019-03-02:/t/540335 2019-03-02T07:34:13Z 2019-03-02T08:29:49Z ecnelises member/ecnelises 背景

要做本科毕设了,现在想的主题是基于 LLVM 的(因为实习做的事也跟 LLVM 有关),但是像讨论寄存器分配这样的东西弄出来好像到最后也只能成一篇文献综述,不讨老师喜欢工作量也不大。

然后想到,既然几乎所有语言都能编译到 LLVM IR,那么要是有一个基于 LLVM IR 的包管理器,不是件很有意思的事情?

问题

第一个想到的问题是,像 C++ 或者其他编译型语言,都是有 Name Mangling 机制的。如果要求编译出来的符号能相互链接,写代码的时候还得自己把 extern 这样的关键字加上。不过在这一层,可以要求用户在一个配置文件里指定导出符号的名字和签名,好像还是个好事。

第二个问题是,这些代码会不会存在跨平台上的障碍。虽然 LLVM IR 通常来说的确可以跨平台,但是不同平台(架构 /操作系统)的编译器前端生成的 IR 会不会不一样,以及会不会产生一些平台相关的代码现在都不太清楚,得再去看看。

第三个问题是,多数语言的可执行文件最后都需要依赖 Runtime 来运行。所以假设要做包管理器的话,是不是得要求这些 IR 都不能依赖各自语言的 Runtime ?好像到这样的话,就跟普通的 FFI 差不多了,就剩下 LLVM IR 比汇编层次高点这个优势了……

求助

各位熟悉 LLVM 的大佬们对这个 Idea 有什么建议吗?或者有什么我没想到的跟 LLVM 有关的课题也可以告诉我,多谢!

]]>
LLVM/Clang LLD LLDB 5.0 正式发布 tag:www.v2ex.com,2017-09-08:/t/389095 2017-09-08T01:37:58Z 2017-09-08T05:44:06Z forcecharlie member/forcecharlie 早上看 reddit 说 clang 5.0 发布了。原来 clang 5.0 预计是 8.23 发布的。延后了半个月,期间多发布了 rc4 rc5

邮件列表:

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/

]]>
有哪位在 RHEL5 下编译过 llvm? tag:www.v2ex.com,2015-11-18:/t/237147 2015-11-18T12:29:54Z 2015-11-18T15:25:22Z hukangha member/hukangha 有没有朋友了解 klee 和 llvm 啊? tag:www.v2ex.com,2015-05-08:/t/189480 2015-05-08T06:07:10Z 2015-12-10T23:19:32Z randy123 member/randy123 本人在进行klee的二次开发,主要是利用符号执行来进行c++程序迭代深度的计算,老师指派的项目,不清楚有没有朋友进行过类似的项目,或者比较了解Klee和LLVM的?希望帮忙讲述一下符号执行的相关概念.

]]>
大家能访问 LLVM(llvm.org)吗 tag:www.v2ex.com,2014-11-10:/t/145355 2014-11-10T06:32:07Z 2014-11-10T06:45:13Z taotao95 member/taotao95 ClangFormat 代码格式化工具 tag:www.v2ex.com,2014-01-08:/t/96208 2014-01-08T13:25:22Z 2014-01-08T13:22:22Z ihacku member/ihacku http://clang.llvm.org/docs/ClangFormat.html ]]> llvm足够成熟了么?跟GCC相比有什么优劣? tag:www.v2ex.com,2013-05-23:/t/69873 2013-05-23T02:30:52Z 2013-05-23T14:12:04Z jiangplus member/jiangplus 王垠果然开始在 LLVM 上做事情了…… tag:www.v2ex.com,2012-09-14:/t/47706 2012-09-14T05:13:00Z 2012-09-17T08:50:24Z hyh1048576 member/hyh1048576 http://blog.sina.com.cn/s/blog_5d90e82f0101b37r.html

“最近为了在 LLVM 上做一些事情,开始重新理解 C++,发现它做的好些事情其实是挺不错的。它里面存在的那些问题,注意避免一下,或者把那些地方改一改,恐怕也就好了。”

我觉得前几天 @virushuo 和 @jjgod 提及 LLVM 的讨论堪称预言帝啊~ ]]>
居然看到LLVM了 tag:www.v2ex.com,2011-04-29:/t/12323 2011-04-29T08:24:58Z 2011-05-20T04:32:53Z prajnamas member/prajnamas ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86