1 //===--- CommonArgs.h - Args handling for multiple toolchains ---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H 10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H 11 12 #include "clang/Driver/Driver.h" 13 #include "clang/Driver/InputInfo.h" 14 #include "clang/Driver/Multilib.h" 15 #include "clang/Driver/Tool.h" 16 #include "clang/Driver/ToolChain.h" 17 #include "llvm/Support/CodeGen.h" 18 19 namespace clang { 20 namespace driver { 21 namespace tools { 22 23 void addPathIfExists(const Driver &D, const Twine &Path, 24 ToolChain::path_list &Paths); 25 26 void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs, 27 const llvm::opt::ArgList &Args, 28 llvm::opt::ArgStringList &CmdArgs, const JobAction &JA); 29 30 void addLinkerCompressDebugSectionsOption(const ToolChain &TC, 31 const llvm::opt::ArgList &Args, 32 llvm::opt::ArgStringList &CmdArgs); 33 34 void claimNoWarnArgs(const llvm::opt::ArgList &Args); 35 36 bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args, 37 llvm::opt::ArgStringList &CmdArgs); 38 39 void linkSanitizerRuntimeDeps(const ToolChain &TC, 40 llvm::opt::ArgStringList &CmdArgs); 41 42 bool addXRayRuntime(const ToolChain &TC, const llvm::opt::ArgList &Args, 43 llvm::opt::ArgStringList &CmdArgs); 44 45 void linkXRayRuntimeDeps(const ToolChain &TC, 46 llvm::opt::ArgStringList &CmdArgs); 47 48 void AddRunTimeLibs(const ToolChain &TC, const Driver &D, 49 llvm::opt::ArgStringList &CmdArgs, 50 const llvm::opt::ArgList &Args); 51 52 void AddStaticDeviceLibsLinking(Compilation &C, const Tool &T, 53 const JobAction &JA, 54 const InputInfoList &Inputs, 55 const llvm::opt::ArgList &DriverArgs, 56 llvm::opt::ArgStringList &CmdArgs, 57 StringRef Arch, StringRef Target, 58 bool isBitCodeSDL, bool postClangLink); 59 void AddStaticDeviceLibsPostLinking(const Driver &D, 60 const llvm::opt::ArgList &DriverArgs, 61 llvm::opt::ArgStringList &CmdArgs, 62 StringRef Arch, StringRef Target, 63 bool isBitCodeSDL, bool postClangLink); 64 void AddStaticDeviceLibs(Compilation *C, const Tool *T, const JobAction *JA, 65 const InputInfoList *Inputs, const Driver &D, 66 const llvm::opt::ArgList &DriverArgs, 67 llvm::opt::ArgStringList &CmdArgs, StringRef Arch, 68 StringRef Target, bool isBitCodeSDL, 69 bool postClangLink); 70 71 bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, 72 llvm::opt::ArgStringList &CmdArgs, 73 SmallVector<std::string, 8> LibraryPaths, std::string Lib, 74 StringRef Arch, StringRef Target, bool isBitCodeSDL, 75 bool postClangLink); 76 77 bool GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, 78 const JobAction &JA, const InputInfoList &Inputs, 79 const llvm::opt::ArgList &DriverArgs, 80 llvm::opt::ArgStringList &CC1Args, 81 SmallVector<std::string, 8> LibraryPaths, 82 StringRef Lib, StringRef Arch, StringRef Target, 83 bool isBitCodeSDL, bool postClangLink); 84 85 const char *SplitDebugName(const JobAction &JA, const llvm::opt::ArgList &Args, 86 const InputInfo &Input, const InputInfo &Output); 87 88 void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T, 89 const JobAction &JA, const llvm::opt::ArgList &Args, 90 const InputInfo &Output, const char *OutFile); 91 92 void addLTOOptions(const ToolChain &ToolChain, const llvm::opt::ArgList &Args, 93 llvm::opt::ArgStringList &CmdArgs, const InputInfo &Output, 94 const InputInfo &Input, bool IsThinLTO); 95 96 std::tuple<llvm::Reloc::Model, unsigned, bool> 97 ParsePICArgs(const ToolChain &ToolChain, const llvm::opt::ArgList &Args); 98 99 unsigned ParseFunctionAlignment(const ToolChain &TC, 100 const llvm::opt::ArgList &Args); 101 102 unsigned ParseDebugDefaultVersion(const ToolChain &TC, 103 const llvm::opt::ArgList &Args); 104 105 void AddAssemblerKPIC(const ToolChain &ToolChain, 106 const llvm::opt::ArgList &Args, 107 llvm::opt::ArgStringList &CmdArgs); 108 109 void addOpenMPRuntimeSpecificRPath(const ToolChain &TC, 110 const llvm::opt::ArgList &Args, 111 llvm::opt::ArgStringList &CmdArgs); 112 void addArchSpecificRPath(const ToolChain &TC, const llvm::opt::ArgList &Args, 113 llvm::opt::ArgStringList &CmdArgs); 114 void addOpenMPRuntimeLibraryPath(const ToolChain &TC, 115 const llvm::opt::ArgList &Args, 116 llvm::opt::ArgStringList &CmdArgs); 117 /// Returns true, if an OpenMP runtime has been added. 118 bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, 119 const llvm::opt::ArgList &Args, 120 bool ForceStaticHostRuntime = false, 121 bool IsOffloadingHost = false, bool GompNeedsRT = false); 122 123 const char *getAsNeededOption(const ToolChain &TC, bool as_needed); 124 125 llvm::opt::Arg *getLastProfileUseArg(const llvm::opt::ArgList &Args); 126 llvm::opt::Arg *getLastProfileSampleUseArg(const llvm::opt::ArgList &Args); 127 128 bool isObjCAutoRefCount(const llvm::opt::ArgList &Args); 129 130 llvm::StringRef getLTOParallelism(const llvm::opt::ArgList &Args, 131 const Driver &D); 132 133 bool areOptimizationsEnabled(const llvm::opt::ArgList &Args); 134 135 bool isUseSeparateSections(const llvm::Triple &Triple); 136 137 /// \p EnvVar is split by system delimiter for environment variables. 138 /// If \p ArgName is "-I", "-L", or an empty string, each entry from \p EnvVar 139 /// is prefixed by \p ArgName then added to \p Args. Otherwise, for each 140 /// entry of \p EnvVar, \p ArgName is added to \p Args first, then the entry 141 /// itself is added. 142 void addDirectoryList(const llvm::opt::ArgList &Args, 143 llvm::opt::ArgStringList &CmdArgs, const char *ArgName, 144 const char *EnvVar); 145 146 void AddTargetFeature(const llvm::opt::ArgList &Args, 147 std::vector<StringRef> &Features, 148 llvm::opt::OptSpecifier OnOpt, 149 llvm::opt::OptSpecifier OffOpt, StringRef FeatureName); 150 151 std::string getCPUName(const Driver &D, const llvm::opt::ArgList &Args, 152 const llvm::Triple &T, bool FromAs = false); 153 154 /// Iterate \p Args and convert -mxxx to +xxx and -mno-xxx to -xxx and 155 /// append it to \p Features. 156 /// 157 /// Note: Since \p Features may contain default values before calling 158 /// this function, or may be appended with entries to override arguments, 159 /// entries in \p Features are not unique. 160 void handleTargetFeaturesGroup(const llvm::opt::ArgList &Args, 161 std::vector<StringRef> &Features, 162 llvm::opt::OptSpecifier Group); 163 164 /// If there are multiple +xxx or -xxx features, keep the last one. 165 std::vector<StringRef> 166 unifyTargetFeatures(const std::vector<StringRef> &Features); 167 168 /// Handles the -save-stats option and returns the filename to save statistics 169 /// to. 170 SmallString<128> getStatsFileName(const llvm::opt::ArgList &Args, 171 const InputInfo &Output, 172 const InputInfo &Input, const Driver &D); 173 174 /// \p Flag must be a flag accepted by the driver with its leading '-' removed, 175 // otherwise '-print-multi-lib' will not emit them correctly. 176 void addMultilibFlag(bool Enabled, const char *const Flag, 177 Multilib::flags_list &Flags); 178 179 void addX86AlignBranchArgs(const Driver &D, const llvm::opt::ArgList &Args, 180 llvm::opt::ArgStringList &CmdArgs, bool IsLTO); 181 182 void checkAMDGPUCodeObjectVersion(const Driver &D, 183 const llvm::opt::ArgList &Args); 184 185 unsigned getAMDGPUCodeObjectVersion(const Driver &D, 186 const llvm::opt::ArgList &Args); 187 188 bool haveAMDGPUCodeObjectVersionArgument(const Driver &D, 189 const llvm::opt::ArgList &Args); 190 191 void addMachineOutlinerArgs(const Driver &D, const llvm::opt::ArgList &Args, 192 llvm::opt::ArgStringList &CmdArgs, 193 const llvm::Triple &Triple, bool IsLTO); 194 195 void addOpenMPDeviceRTL(const Driver &D, const llvm::opt::ArgList &DriverArgs, 196 llvm::opt::ArgStringList &CC1Args, 197 StringRef BitcodeSuffix, const llvm::Triple &Triple); 198 } // end namespace tools 199 } // end namespace driver 200 } // end namespace clang 201 202 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H 203