| // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "gn/toolchain.h" | 
 |  | 
 | #include <stddef.h> | 
 | #include <string.h> | 
 | #include <utility> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "gn/builtin_tool.h" | 
 | #include "gn/settings.h" | 
 | #include "gn/target.h" | 
 | #include "gn/value.h" | 
 |  | 
 | Toolchain::Toolchain(const Settings* settings, | 
 |                      const Label& label, | 
 |                      const SourceFileSet& build_dependency_files) | 
 |     : Item(settings, label, build_dependency_files) { | 
 |   // Ensure "phony" tool is part of all toolchains by default. | 
 |   const char* phony_name = BuiltinTool::kBuiltinToolPhony; | 
 |   tools_.emplace(phony_name, std::make_unique<BuiltinTool>(phony_name)); | 
 | } | 
 |  | 
 | Toolchain::~Toolchain() = default; | 
 |  | 
 | Toolchain* Toolchain::AsToolchain() { | 
 |   return this; | 
 | } | 
 |  | 
 | const Toolchain* Toolchain::AsToolchain() const { | 
 |   return this; | 
 | } | 
 |  | 
 | Tool* Toolchain::GetTool(const char* name) { | 
 |   DCHECK(name != Tool::kToolNone); | 
 |   auto pair = tools_.find(name); | 
 |   if (pair != tools_.end()) { | 
 |     return pair->second.get(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | const Tool* Toolchain::GetTool(const char* name) const { | 
 |   DCHECK(name != Tool::kToolNone); | 
 |   auto pair = tools_.find(name); | 
 |   if (pair != tools_.end()) { | 
 |     return pair->second.get(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | GeneralTool* Toolchain::GetToolAsGeneral(const char* name) { | 
 |   if (Tool* tool = GetTool(name)) { | 
 |     return tool->AsGeneral(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | const GeneralTool* Toolchain::GetToolAsGeneral(const char* name) const { | 
 |   if (const Tool* tool = GetTool(name)) { | 
 |     return tool->AsGeneral(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | CTool* Toolchain::GetToolAsC(const char* name) { | 
 |   if (Tool* tool = GetTool(name)) { | 
 |     return tool->AsC(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | const CTool* Toolchain::GetToolAsC(const char* name) const { | 
 |   if (const Tool* tool = GetTool(name)) { | 
 |     return tool->AsC(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | RustTool* Toolchain::GetToolAsRust(const char* name) { | 
 |   if (Tool* tool = GetTool(name)) { | 
 |     return tool->AsRust(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | const RustTool* Toolchain::GetToolAsRust(const char* name) const { | 
 |   if (const Tool* tool = GetTool(name)) { | 
 |     return tool->AsRust(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | BuiltinTool* Toolchain::GetToolAsBuiltin(const char* name) { | 
 |   if (Tool* tool = GetTool(name)) { | 
 |     return tool->AsBuiltin(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | const BuiltinTool* Toolchain::GetToolAsBuiltin(const char* name) const { | 
 |   if (const Tool* tool = GetTool(name)) { | 
 |     return tool->AsBuiltin(); | 
 |   } | 
 |   return nullptr; | 
 | } | 
 |  | 
 | void Toolchain::SetTool(std::unique_ptr<Tool> t) { | 
 |   DCHECK(t->name() != Tool::kToolNone); | 
 |   DCHECK(tools_.find(t->name()) == tools_.end()); | 
 |   t->SetComplete(); | 
 |   tools_[t->name()] = std::move(t); | 
 | } | 
 |  | 
 | void Toolchain::ToolchainSetupComplete() { | 
 |   // Collect required bits from all tools. | 
 |   for (const auto& tool : tools_) { | 
 |     substitution_bits_.MergeFrom(tool.second->substitution_bits()); | 
 |   } | 
 |   setup_complete_ = true; | 
 | } | 
 |  | 
 | const Tool* Toolchain::GetToolForSourceType(SourceFile::Type type) const { | 
 |   return GetTool(Tool::GetToolTypeForSourceType(type)); | 
 | } | 
 |  | 
 | const CTool* Toolchain::GetToolForSourceTypeAsC(SourceFile::Type type) const { | 
 |   return GetToolAsC(Tool::GetToolTypeForSourceType(type)); | 
 | } | 
 |  | 
 | const GeneralTool* Toolchain::GetToolForSourceTypeAsGeneral( | 
 |     SourceFile::Type type) const { | 
 |   return GetToolAsGeneral(Tool::GetToolTypeForSourceType(type)); | 
 | } | 
 |  | 
 | const RustTool* Toolchain::GetToolForSourceTypeAsRust( | 
 |     SourceFile::Type type) const { | 
 |   return GetToolAsRust(Tool::GetToolTypeForSourceType(type)); | 
 | } | 
 |  | 
 | const BuiltinTool* Toolchain::GetToolForSourceTypeAsBuiltin( | 
 |     SourceFile::Type type) const { | 
 |   return GetToolAsBuiltin(Tool::GetToolTypeForSourceType(type)); | 
 | } | 
 |  | 
 | const Tool* Toolchain::GetToolForTargetFinalOutput(const Target* target) const { | 
 |   return GetTool(Tool::GetToolTypeForTargetFinalOutput(target)); | 
 | } | 
 |  | 
 | const CTool* Toolchain::GetToolForTargetFinalOutputAsC( | 
 |     const Target* target) const { | 
 |   return GetToolAsC(Tool::GetToolTypeForTargetFinalOutput(target)); | 
 | } | 
 |  | 
 | const GeneralTool* Toolchain::GetToolForTargetFinalOutputAsGeneral( | 
 |     const Target* target) const { | 
 |   return GetToolAsGeneral(Tool::GetToolTypeForTargetFinalOutput(target)); | 
 | } | 
 |  | 
 | const RustTool* Toolchain::GetToolForTargetFinalOutputAsRust( | 
 |     const Target* target) const { | 
 |   return GetToolAsRust(Tool::GetToolTypeForTargetFinalOutput(target)); | 
 | } | 
 |  | 
 | const BuiltinTool* Toolchain::GetToolForTargetFinalOutputAsBuiltin( | 
 |     const Target* target) const { | 
 |   return GetToolAsBuiltin(Tool::GetToolTypeForTargetFinalOutput(target)); | 
 | } |