//===--- ToolChains.h - Platform-specific ToolChain logic -------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #ifndef SWIFT_DRIVER_TOOLCHAINS_H #define SWIFT_DRIVER_TOOLCHAINS_H #include "swift/Basic/LLVM.h" #include "swift/Driver/ToolChain.h" #include "clang/Driver/DarwinSDKInfo.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/Compiler.h" namespace swift { class DiagnosticEngine; namespace driver { namespace toolchains { class LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain { protected: void addLinkerInputArgs(InvocationInfo &II, const JobContext &context) const; void addArgsToLinkARCLite(llvm::opt::ArgStringList &Arguments, const JobContext &context) const; void addSanitizerArgs(llvm::opt::ArgStringList &Arguments, const DynamicLinkJobAction &job, const JobContext &context) const; void addArgsToLinkStdlib(llvm::opt::ArgStringList &Arguments, const DynamicLinkJobAction &job, const JobContext &context) const; void addProfileGenerationArgs(llvm::opt::ArgStringList &Arguments, const JobContext &context) const; void addDeploymentTargetArgs(llvm::opt::ArgStringList &Arguments, const JobContext &context) const; InvocationInfo constructInvocation(const InterpretJobAction &job, const JobContext &context) const override; InvocationInfo constructInvocation(const DynamicLinkJobAction &job, const JobContext &context) const override; InvocationInfo constructInvocation(const StaticLinkJobAction &job, const JobContext &context) const override; void validateArguments(DiagnosticEngine &diags, const llvm::opt::ArgList &args, StringRef defaultTarget) const override; void validateOutputInfo(DiagnosticEngine &diags, const OutputInfo &outputInfo) const override; std::string findProgramRelativeToSwiftImpl(StringRef name) const override; bool shouldStoreInvocationInDebugInfo() const override; /// Information about the SDK that the application is being built against. /// This information is only used by the linker, so it is only populated /// when there will be a linker job. mutable Optional SDKInfo; const Optional TargetVariant; public: Darwin(const Driver &D, const llvm::Triple &Triple, const Optional &TargetVariant) : ToolChain(D, Triple), TargetVariant(TargetVariant) {} ~Darwin() = default; std::string sanitizerRuntimeLibName(StringRef Sanitizer, bool shared = true) const override; Optional getTargetVariant() const { return TargetVariant; } }; class LLVM_LIBRARY_VISIBILITY Windows : public ToolChain { protected: InvocationInfo constructInvocation(const DynamicLinkJobAction &job, const JobContext &context) const override; InvocationInfo constructInvocation(const StaticLinkJobAction &job, const JobContext &context) const override; public: Windows(const Driver &D, const llvm::Triple &Triple) : ToolChain(D, Triple) {} ~Windows() = default; std::string sanitizerRuntimeLibName(StringRef Sanitizer, bool shared = true) const override; }; class LLVM_LIBRARY_VISIBILITY GenericUnix : public ToolChain { protected: InvocationInfo constructInvocation(const InterpretJobAction &job, const JobContext &context) const override; InvocationInfo constructInvocation(const AutolinkExtractJobAction &job, const JobContext &context) const override; /// If provided, and if the user has not already explicitly specified a /// linker to use via the "-fuse-ld=" option, this linker will be passed to /// the compiler invocation via "-fuse-ld=". Return an empty string to not /// specify any specific linker (the "-fuse-ld=" option will not be /// specified). /// /// The default behavior is to use the gold linker on ARM architectures, /// and to not provide a specific linker otherwise. virtual std::string getDefaultLinker() const; /// The target to be passed to the compiler invocation. By default, this /// is the target triple, but this may be overridden to accommodate some /// platforms. virtual std::string getTargetForLinker() const; bool addRuntimeRPath(const llvm::Triple &T, const llvm::opt::ArgList &Args) const; InvocationInfo constructInvocation(const DynamicLinkJobAction &job, const JobContext &context) const override; InvocationInfo constructInvocation(const StaticLinkJobAction &job, const JobContext &context) const override; public: GenericUnix(const Driver &D, const llvm::Triple &Triple) : ToolChain(D, Triple) {} ~GenericUnix() = default; std::string sanitizerRuntimeLibName(StringRef Sanitizer, bool shared = true) const override; }; class LLVM_LIBRARY_VISIBILITY Android : public GenericUnix { protected: std::string getTargetForLinker() const override; public: Android(const Driver &D, const llvm::Triple &Triple) : GenericUnix(D, Triple) {} ~Android() = default; }; class LLVM_LIBRARY_VISIBILITY Cygwin : public GenericUnix { protected: std::string getDefaultLinker() const override; std::string getTargetForLinker() const override; public: Cygwin(const Driver &D, const llvm::Triple &Triple) : GenericUnix(D, Triple) {} ~Cygwin() = default; }; class LLVM_LIBRARY_VISIBILITY OpenBSD : public GenericUnix { protected: std::string getDefaultLinker() const override; public: OpenBSD(const Driver &D, const llvm::Triple &Triple) : GenericUnix(D, Triple) {} ~OpenBSD() = default; }; } // end namespace toolchains } // end namespace driver } // end namespace swift #endif