Zenith-Team/RedHills
GitHub: Zenith-Team/RedHills
Red Hills 是 Clang 的定制分支,旨在实现与 Wii U 专有 Green Hills PowerPC 编译器的完全 ABI 兼容,为该平台的开源代码注入开发提供现代化工具链。
Stars: 0 | Forks: 0
## 概述
**Red Hills** 是 Clang 19.1.7 的一个专门分支,旨在实现与专有的 Green Hills PowerPC Wii U 二进制文件 100% 的 ABI 兼容。我们已经摒弃了陈旧的 C++98 限制,为 Wii U 生态系统提供了一个现代化的、开源的工具链。它是专为 [Tachyon](https://github.com/Zenith-Team/Tachyon) Wii U 代码注入工具包设计的,并内置于其中。
## 目标
- 实现与 GHS 完全的 [ABI 一致性](https://zenith.nsmbu.net/wiki/Green_Hills_C%2B%2B_ABI),使得由任一编译器构建的二进制文件可以相互调用,且无需担心行为差异。
## 非目标
- 实现与 GHS 完全一致的代码生成(codegen)不是我们的目标,例如用于匹配反编译等用途。
- 支持无法结合使用的语言特性(如 C++ 异常)不是我们的目标。
- 成为 GHS 的直接替代品不是我们的目标,因此语言前端和驱动程序调用接口将不会保持一致。
- 维护对非 GHS 通用目标的任何形式的支持不是我们的目标,对于此类用例,请使用上游的 Clang 或其他替代方案。
## 关键变更
可以在[此处](https://zenith.nsmbu.net/wiki/Green_Hills_C%2B%2B_ABI)的文档中找到关于 ABI 的详细指南。
### 一致性
- **成员函数指针** (`ItaniumCXXABI`):修改了结构以反映 GHS 的生成和调用行为。
- **虚函数表** (`CGVTables`):修补了表数据和地址点的生成,以实现接口布局的一致性。
- **类布局** (`RecordLayoutBuilder`):从不使用尾部填充(tail padding),并将虚函数表指针放置在结构体的末尾。
- **多重继承** (`RecordLayoutBuilder`):仅从树中的第一个基类继承虚函数表指针。
- **分配构造函数** (`CGClass`):为空的 `this` 会导致对象在堆上进行分配。
- **统一析构函数** (`ItaniumCXXABI`):移除了基类析构函数和删除析构函数,完整析构函数通过使用一个标志位来同时处理这两者。
- **栈返回**:当使用指针参数 `sret` 在栈中返回值时,`this` 参数具有更高的优先级,而 `sret` 会被放置在其后。
### 扩展
- **__builtin_mangle**:引入了一种在编译时将标识符转换为其修饰名(mangled form)字符串字面量的方法。
- 签名:`const char* __builtin_mangle(Decl, OptionalSignatureForOverloads)`
- **PreserveAll**:在 PowerPC 上增加了对这种调用约定的支持,允许在不破坏处理器寄存器的情况下安全地 hook 函数。
- 为函数添加 `[[clang::preserve_all]]` 属性即可使用此特性。
### 驱动程序默认设置
- **Triple**: `powerpc-eabi`
- **异常**:已禁用(当前不兼容)
- **RTTI**:已禁用(当前不兼容)
- **线程安全静态变量**:已禁用
- **对齐分配**:已禁用
## 限制
请查看 [issue 跟踪器](https://github.com/Zenith-Team/RedHills/issues) 以了解已知的一致性问题或缺失功能的列表。
## 用法
请像使用标准 Clang 一样使用它,但是如果过度偏离默认标志,可能会导致破坏 ABI 一致性或代码生成损坏。
- 请注意,默认行为是仅编译而不进行链接,因为预期会手动调用 `ld` 来生成最终的 RPL。有关更多详细信息,请参阅 [Tachyon](https://github.com/Zenith-Team/Tachyon)。
## 构建
1. 克隆代码仓库
2. 安装依赖项:
- Clang
- CMake
- Ninja
3. 运行适用于您系统的相应设置脚本(`setup[OS].bat/sh`)
4. 使用 `ninja -C build clang` 发起编译
5. 构建好的文件将位于 `build/bin/`
查阅 [LLVM 入门](https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm) 页面以获取有关构建和运行 Red Hills 的更多信息。
### 特别鸣谢
- [Oliver Hunt](https://waffles.dog)
- [The LLVM Project](https://llvm.org)
## 许可证
Red Hills 仓库中的所有代码均在 [Apache License v2.0 with LLVM Exceptions](https://llvm.org/LICENSE.txt) 下提供。标签:ABI兼容, Bash脚本, Clang, PowerPC, SOC Prime, Wii U, 云资产清单, 开发工具, 编译器, 逆向工程