Tool也是Clang的Driver库里的一个类,它是具体编译工具的信息,代码注释中的原文是:Tool - Information on a specific compilation tool.(clang/include/clang/Driver/Tool.h)本文将对Tool的实现以及其相关调用关系做一个简单的分析。
一、Tool的实现和继承关系
1、Tool的定义和实现都位于clang/include/clang/Driver/Tool.h和clang/lib/Driver/Tool.cpp之中。
2、Tool的成员变量(Tool.h中)很能说明Tool的相关信息:
/// The tool name (for debugging).
const char *Name;
/// The human readable name for the tool, for use in diagnostics.
const char *ShortName;
/// The tool chain this tool is a part of.
const ToolChain &TheToolChain;
这里可以看到每个tool都有一个名字,还有一个短名字,同时还是构成一个tool chain的一部分。这里也能看到,Tool和ToolChain是双向关联的,Tool中通过TheToolChain关联到它所在的ToolChain,ToolChain通过如下列表和Tool关联:
mutable std::unique_ptr<Tool> Clang;
mutable std::unique_ptr<Tool> Flang;
mutable std::unique_ptr<Tool> Assemble;
mutable std::unique_ptr<Tool> Link;
mutable std::unique_ptr<Tool> IfsMerge;
mutable std::unique_ptr<Tool> OffloadBundler;
mutable std::unique_ptr<Tool> OffloadWrapper;
3、Tool在clang/lib/Driver/ToolChains目录之下具有一系列的子类,以Clang.h为例。Clang.h 之中定义了:
namespace clang {
class ObjCRuntime;
namespace driver {
namespace tools {
/// Clang compiler tool.
class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
/// Clang integrated assembler tool.
class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
/// Offload bundler tool.
class LLVM_LIBRARY_VISIBILITY OffloadBundler final : public Tool {
/// Of