使用 LLVM 自定义标准 C 库(以支持 llvm 后端优化)

Customize Standard C Library Using LLVM (to support llvm backend optimization)

目的:

我在 LLVM 后端实现了一个通道,它改变了 ARMassembly/binary 的输出格式(例如在每个基本块的末尾添加一个跳转以消除掉落).通过调用:

llc -march=arm somefile.bc

它生成预期的 arm assembly/binary 运行s 在 arm gnu linux 上正确(我使用 qemu-arm 和 gem5 来模拟它)。现在我想在标准 c 库上做同样的事情,但是这里有问题。

问题:

根据:

http://article.gmane.org/gmane.comp.compilers.llvm.devel/77025 
https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_14/docs/OpenProjects.html#glibc   

编译glibc 使用 llvm 可能不是一个合适的选择。另一方面,根据:

http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/047088.html

llvm 可以编译 newlib,因此人们考虑将 newlib 作为替代方案。然而,根据:

http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html#id2711887

newlib 打算支持裸机(无 OS)软件的二进制文件。它仅实现与硬件无关的部分(例如 libc 和 libm),并为每个依赖于硬件的系统调用(例如 libgloss 中的所有内容)保留一个存根。

事实上,我尝试使用配置了“--with-newlib”选项的 arm-none-eabi-gcc 编译一个简单的“hello world”c 程序,程序执行以qemu-arm 和 gem5 上的分段错误。

问题:

我不确定 newlib 是否与 glibc 兼容。我想知道我是否可以使用 llvm 从 newlib 交叉编译机器独立部分(同时更改 arm 输出格式)并使用 arm-none-linux-gnueabi-gcc 到从 glibc 交叉编译机器相关部分并将这两部分放在一起生成我自己的标准 c 库?

我的作品中可能有mistakes/misunderstandings。是否有任何其他可能的方法可以将我的更改至少添加到标准 c 库的一部分,并使程序 运行 在 qemu-arm 或 gem5 上?

为什么不尝试使用musl library? I use it as the standard library for my ELLCC基于clang的交叉编译环境