16

我已经阅读了一些关于 llvm 的网页和文章,我对这个项目很感兴趣。(也许可以学习一些关于编译器编写的知识,而不需要与 x86 的复杂点作斗争)。

有一些页面描述了如何编写 llvm 程序集以及如何组装它,但我没有找到任何关于实际执行这些程序需要什么样的环境的信息。我知道我可以在我的文件上运行 llvm-gcc 以获得在 C 上下文中可执行的目标文件。但是在我不想使用 C 运行时环境(libc.so和朋友)的情况下,运行 llvm 代码需要什么?有这方面的文件吗?

4

4 回答 4

11

似乎有一个LLVM 汇编器

llvm-as 是 LLVM 汇编器。它读取包含人类可读的 LLVM 汇编语言的文件,将其转换为 LLVM 位码,并将结果写入文件或标准输出。

于 2011-10-14T20:42:12.520 回答
7

快速设置:(适用于 windows 上的 llvm 3.4.0 .ll 文件)

来自https://notepad-plus-plus.org/的高级文本编辑器

来自https://github.com/CRogers/LLVM-Windows-Binaries的 llvm 二进制文件

hello.ll 为“UTF-8 without BOM”(此代码采用 llvm 3.4.0 格式):

@msg = internal constant [13 x i8] c"Hello World!\00"
declare i32 @puts(i8*)
define i32 @main() {
    call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @msg, i32 0, i32 0))
    ret i32 0
}

在命令提示符下:

lli hello.ll

快速设置:(适用于 windows 上的 llvm 3.8.0 .ll 文件)

来自https://notepad-plus-plus.org/的高级文本编辑器

clang 二进制文件来自: http: //llvm.org/releases/download.html#3.8.0

hello.ll 为“UTF-8 without BOM”(此代码采用 llvm 3.8.0 格式):

@msg = internal constant [13 x i8] c"Hello World!\00"
declare i32 @puts(i8*)
define i32 @main() {
    call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @msg, i32 0, i32 0))
    ret i32 0
}

在命令提示符下:

clang hello.ll -o hello.exe
hello.exe

或作为单个命令:

clang hello.ll -o hello.exe & hello.exe

关于 char16_t、u16String 等的错误意味着 clang 需要:-fms-compatibility-version=19

于 2016-03-18T20:32:17.463 回答
4

接受 LLVM 程序集的静态编译器:

http://llvm.org/docs/CommandGuide/llc.html

LLVM 汇编语言参考:

http://llvm.org/docs/LangRef.html

于 2012-11-11T04:37:14.673 回答
1

Archlinux 上的 LLVM 11.1 不接受上述答案中的代码。这是来自当前的LLVM IR 文档

cat > hello.ll <<EOF
@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"
declare i32 @puts(i8* nocapture) nounwind
define i32 @main() {   ; i32()*
  %cast210 = getelementptr [13 x i8], [13 x i8]* @.str, i64 0, i64 0
  call i32 @puts(i8* %cast210)
  ret i32 0
}
!0 = !{i32 42, null, !"string"}
!foo = !{!0}
EOF
lli hello.ll

如果您lli单独开始,它不会显示提示,但会接受输入。但是,此输入仅在Ctrl-D(EOF) 之后进行评估。

我来这里是因为我想找到一个 REPL。没运气。

于 2021-03-15T16:41:06.140 回答