为 LLVM 贡献代码

感谢您对为 LLVM 贡献代码感兴趣!有多种方式可以参与贡献,我们感谢所有贡献。如果您有任何问题,您可以使用 论坛 或,进行更交互式的聊天,访问我们的 Discord 服务器irc.oftc.net 上的 IRC #llvm 频道。

如果您想贡献代码,请先熟悉 LLVM 开发者政策

贡献方式

Bug 报告

如果您在使用 LLVM 时遇到 Bug,我们非常希望了解情况。请告知我们并按照 如何提交 LLVM Bug 报告 中的说明创建 Bug 报告。

Bug 修复

如果您有兴趣为 LLVM 贡献代码,在 Bug 追踪器 中标记有 适合新手的问题 关键词的 Bug 是熟悉代码库的好方法。如果您有兴趣修复 Bug,请在上面发表评论,让大家知道您正在处理它。

然后尝试使用上游 LLVM 重现并修复 Bug。首先按照 LLVM 系统入门 中的说明从源代码构建 LLVM,并使用构建的二进制文件来重现 Bug 中描述的故障。使用调试构建(-DCMAKE_BUILD_TYPE=Debug)或带有断言的构建(-DLLVM_ENABLE_ASSERTIONS=On,在调试构建中启用)。

报告安全问题

有一个单独的流程来提交与安全相关的 Bug,请参阅 如何报告安全问题?

较大的工作

如果您有兴趣承担更大的工作,LLVM 的 开放项目页面 上维护着一些有趣的项目列表。如果您有兴趣参与其中任何一个项目,请在 论坛 上发帖,以便我们知道该项目正在进行中。

如何提交补丁

准备好补丁后,就可以提交了。补丁应该

  • 包含一个小的单元测试

  • 符合 LLVM 编码规范。您可以使用 clang-format-diff.pygit-clang-format 工具来自动正确地格式化您的补丁。

  • 不包含任何无关的更改

  • 是一个孤立的更改。独立的更改应作为单独的补丁提交,因为这使得审查更容易。

  • 有一个提交,与上游 origin/main 分支保持最新,并且没有合并。

在发送补丁进行审查之前,请尝试确保它已正确格式化。我们为此使用 clang-format,它通过 git-clang-format 脚本进行 Git 集成。在某些系统上,它可能已经安装(或可以通过您的包管理器安装)。如果是这样,您可以简单地运行它 - 以下命令将仅格式化最近一次提交中更改的代码

% git clang-format HEAD~1

请注意,这会修改文件,但不会提交它们 - 您可能希望运行

% git commit --amend -a

以便使用所有挂起的更改更新最后一次提交。

注意

如果您在系统上尚未安装 clang-formatgit clang-format,则 clang-format 二进制文件将与 clang 一起构建,并且 Git 集成可以从 clang/tools/clang-format/git-clang-format 运行。

LLVM 项目已迁移到 GitHub Pull Request 作为其审查流程。有关使用 GitHub Pull Request 工作流程的更多信息,请参阅我们的 GitHub 文档。我们仍然有一个只读的 LLVM 的 Phabricator 实例。

为了确保合适的人员看到您的补丁,请在请求审查时选择合适的审查者并将他们添加到您的补丁中。合适的审查者是代码所有者(请参阅 CODE_OWNERS.txt)以及在您的补丁涉及的领域进行工作的其他人。GitHub 通常会根据规则或之前处理过该代码的人员建议一些审查者。如果您是新贡献者,则无法以这种方式选择审查者,在这种情况下,您仍然可以通过在评论中抄送他们来吸引潜在审查者的注意 - 只需 @name 他们即可。

审查者可能会在审查期间要求更改或提出问题。如果您不确定如何提供测试用例、文档等,请随时在审查期间寻求指导。请处理反馈并重新发布补丁的更新版本。此循环将持续进行,直到所有请求和评论都得到解决,并且审查者使用 看起来不错LGTM 接受补丁。完成后,可以提交更改。如果您没有提交权限,请在审查期间告知大家,其他人应该代表您提交。

如果您一周内没有收到关于补丁的任何评论,您可以通过“Ping”GitHub PR 来请求审查。“Ping”的常见礼仪频率是一周一次。请记住,您是在请求其他专业开发人员宝贵的时间。

有关 LLVM 代码审查流程的更多信息,请参阅 LLVM 代码审查政策和实践

供开发者从 Git 提交更改

补丁经过审查后,您可以在 GitHub Web 界面中选择“压缩并合并”按钮。您可能需要在将其推送到存储库之前重新设置更改的基准。

LLVM 目前采用线性历史策略,这意味着不允许合并提交。llvm-project GitHub 存储库配置为拒绝包含合并的推送,因此上面提到的 git rebase 步骤是必需的。

如果您在特定的 Git 工作流程方面遇到问题,请寻求帮助。

Git 推送前钩子

我们包含一个可选的推送前钩子,它会在您即将推送的修订版上运行一些健全性检查,并在您一次推送多个提交时询问确认。您可以(在 Unix 系统上)通过从存储库根目录运行以下命令来设置它

% ln -sf ../../llvm/utils/git/pre-push.py .git/hooks/pre-push

关于 LLVM 的有用信息

LLVM 的文档 提供了大量关于 LLVM 内部结构以及各种用户指南的信息。下面列出的页面应该可以很好地概述 LLVM 的高级设计及其内部结构

LLVM 系统入门

讨论如何快速开始使用 LLVM 基础设施。从解压和编译发行版到执行某些工具,应有尽有。

LLVM 语言参考手册

定义了 LLVM 中间表示。

LLVM 程序员手册

介绍 LLVM 源代码库的总体布局、重要的类和 API,以及一些提示和技巧。

LLVM 研究生教程

这是 Adrian Sampson 对 LLVM 基础设施的介绍。虽然它是为研究生编写的,但它提供了对 LLVM 架构、LLVM 的 IR 以及如何编写新 Pass 的良好且简洁的概述。

LLVM 简介

提供编译器黑客对 LLVM 的介绍的书籍章节。