可以直接使用LLVM汇编吗?

发布于 2024-12-10 03:31:54 字数 256 浏览 0 评论 0原文

我读过一些关于llvm的网页和文章,我对这个项目很感兴趣。 (也许可以学习一些有关编译器编写的知识,而无需为 x86 的复杂点而苦苦挣扎)。

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

I have read some webpages and articles about llvm and I am quite interested in this project. (Maybe to learn something about compiler writing without the need to struggle with the complicated points of x86).

There are pages that describe how to write llvm assembly and how to assemble it, but I did not find anything on what kind of environment is needed to actually execute these. I know that I could run llvm-gcc on my files to get an object file that is executable in a C-context. But in the case that I don't want to use the C runtime environmen (libc.so and friends), what is needed to run llvm code? Is there any documentation on that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

累赘 2024-12-17 03:31:54

似乎有一个 LLVM 汇编器

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

There appears to be an LLVM assembler.

llvm-as is the LLVM assembler. It reads a file containing
human-readable LLVM assembly language, translates it to LLVM bitcode,
and writes the result into a file or to standard output.

—━☆沉默づ 2024-12-17 03:31:54

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

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

来自 https://github.com/CRogers/LLVM-Windows-Binaries

hello.ll as“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

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
}

hello.ll 为“ 命令提示符:

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

或作为单个命令:

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

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

Quick setup: (For llvm 3.4.0 .ll files on windows)

advanced text editor from https://notepad-plus-plus.org/

llvm binaries from https://github.com/CRogers/LLVM-Windows-Binaries

hello.ll as "UTF-8 without BOM" (This code is in llvm 3.4.0 format):

@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
}

In command prompt:

lli hello.ll

Quick setup: (For llvm 3.8.0 .ll files on windows)

advanced text editor from https://notepad-plus-plus.org/

clang binaries from: http://llvm.org/releases/download.html#3.8.0

hello.ll as "UTF-8 without BOM" (This code is in llvm 3.8.0 format):

@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
}

In command prompt:

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

Or as a single command:

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

Errors about char16_t, u16String, etc means clang needs: -fms-compatibility-version=19

锦爱 2024-12-17 03:31:54

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

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

LLVM 汇编语言参考:

http://llvm.org/docs/LangRef.html< /a>

The static compiler, which accepts LLVM Assembly:

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

The LLVM Assembly Language Reference:

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

眼藏柔 2024-12-17 03:31:54

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。运气不好。

LLVM 11.1, on Archlinux, did not accept the code from the answer above. This is from the current LLVM IR docs:

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

If you start lli alone, it does not show a prompt, but accepts input.
This input is only evaluated after Ctrl-D (EOF), though.

I came here, because I wanted to find a REPL. No luck.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文