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/Basic/CodeGenOptions.h" 13 #include "clang/Driver/Driver.h" 14 #include "clang/Driver/InputInfo.h" 15 #include "clang/Driver/Multilib.h" 16 #include "clang/Driver/Tool.h" 17 #include "clang/Driver/ToolChain.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/Option/Arg.h" 20 #include "llvm/Option/ArgList.h" 21 #include "llvm/Support/CodeGen.h" 22 23 namespace clang { 24 namespace driver { 25 namespace tools { 26 27 void addPathIfExists(const Driver &D, const Twine &Path, 28 ToolChain::path_list &Paths); 29 30 void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs, 31 const llvm::opt::ArgList &Args, 32 llvm::opt::ArgStringList &CmdArgs, const JobAction &JA); 33 34 void addLinkerCompressDebugSectionsOption(const ToolChain &TC, 35 const llvm::opt::ArgList &Args, 36 llvm::opt::ArgStringList &CmdArgs); 37 38 void claimNoWarnArgs(const llvm::opt::ArgList &Args); 39 40 bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args, 41 llvm::opt::ArgStringList &CmdArgs); 42 43 void linkSanitizerRuntimeDeps(const ToolChain &TC, 44 const llvm::opt::ArgList &Args, 45 llvm::opt::ArgStringList &CmdArgs); 46 47 bool addXRayRuntime(const ToolChain &TC, const llvm::opt::ArgList &Args, 48 llvm::opt::ArgStringList &CmdArgs); 49 50 void linkXRayRuntimeDeps(const ToolChain &TC, const llvm::opt::ArgList &Args, 51 llvm::opt::ArgStringList &CmdArgs); 52 53 void AddRunTimeLibs(const ToolChain &TC, const Driver &D, 54 llvm::opt::ArgStringList &CmdArgs, 55 const llvm::opt::ArgList &Args); 56 57 void AddStaticDeviceLibsLinking(Compilation &C, const Tool &T, 58 const JobAction &JA, 59 const InputInfoList &Inputs, 60 const llvm::opt::ArgList &DriverArgs, 61 llvm::opt::ArgStringList &CmdArgs, 62 StringRef Arch, StringRef Target, 63 bool isBitCodeSDL); 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 70 const char *SplitDebugName(const JobAction &JA, const llvm::opt::ArgList &Args, 71 const InputInfo &Input, const InputInfo &Output); 72 73 void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T, 74 const JobAction &JA, const llvm::opt::ArgList &Args, 75 const InputInfo &Output, const char *OutFile); 76 77 void addLTOOptions(const ToolChain &ToolChain, const llvm::opt::ArgList &Args, 78 llvm::opt::ArgStringList &CmdArgs, const InputInfo &Output, 79 const InputInfo &Input, bool IsThinLTO); 80 81 const char *RelocationModelName(llvm::Reloc::Model Model); 82 83 std::tuple<llvm::Reloc::Model, unsigned, bool> 84 ParsePICArgs(const ToolChain &ToolChain, const llvm::opt::ArgList &Args); 85 86 unsigned ParseFunctionAlignment(const ToolChain &TC, 87 const llvm::opt::ArgList &Args); 88 89 void addDebugInfoKind(llvm::opt::ArgStringList &CmdArgs, 90 llvm::codegenoptions::DebugInfoKind DebugInfoKind); 91 92 llvm::codegenoptions::DebugInfoKind 93 debugLevelToInfoKind(const llvm::opt::Arg &A); 94 95 // Extract the integer N from a string spelled "-dwarf-N", returning 0 96 // on mismatch. The StringRef input (rather than an Arg) allows 97 // for use by the "-Xassembler" option parser. 98 unsigned DwarfVersionNum(StringRef ArgValue); 99 // Find a DWARF format version option. 100 // This function is a complementary for DwarfVersionNum(). 101 const llvm::opt::Arg *getDwarfNArg(const llvm::opt::ArgList &Args); 102 unsigned getDwarfVersion(const ToolChain &TC, const llvm::opt::ArgList &Args); 103 104 void AddAssemblerKPIC(const ToolChain &ToolChain, 105 const llvm::opt::ArgList &Args, 106 llvm::opt::ArgStringList &CmdArgs); 107 108 void addArchSpecificRPath(const ToolChain &TC, const llvm::opt::ArgList &Args, 109 llvm::opt::ArgStringList &CmdArgs); 110 void addOpenMPRuntimeLibraryPath(const ToolChain &TC, 111 const llvm::opt::ArgList &Args, 112 llvm::opt::ArgStringList &CmdArgs); 113 /// Returns true, if an OpenMP runtime has been added. 114 bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, 115 const llvm::opt::ArgList &Args, 116 bool ForceStaticHostRuntime = false, 117 bool IsOffloadingHost = false, bool GompNeedsRT = false); 118 119 /// Adds Fortran runtime libraries to \p CmdArgs. 120 void addFortranRuntimeLibs(const ToolChain &TC, const llvm::opt::ArgList &Args, 121 llvm::opt::ArgStringList &CmdArgs); 122 123 /// Adds the path for the Fortran runtime libraries to \p CmdArgs. 124 void addFortranRuntimeLibraryPath(const ToolChain &TC, 125 const llvm::opt::ArgList &Args, 126 llvm::opt::ArgStringList &CmdArgs); 127 128 void addHIPRuntimeLibArgs(const ToolChain &TC, Compilation &C, 129 const llvm::opt::ArgList &Args, 130 llvm::opt::ArgStringList &CmdArgs); 131 132 void addAsNeededOption(const ToolChain &TC, const llvm::opt::ArgList &Args, 133 llvm::opt::ArgStringList &CmdArgs, bool as_needed); 134 135 llvm::opt::Arg *getLastCSProfileGenerateArg(const llvm::opt::ArgList &Args); 136 llvm::opt::Arg *getLastProfileUseArg(const llvm::opt::ArgList &Args); 137 llvm::opt::Arg *getLastProfileSampleUseArg(const llvm::opt::ArgList &Args); 138 139 bool isObjCAutoRefCount(const llvm::opt::ArgList &Args); 140 141 llvm::StringRef getLTOParallelism(const llvm::opt::ArgList &Args, 142 const Driver &D); 143 144 bool areOptimizationsEnabled(const llvm::opt::ArgList &Args); 145 146 bool isUseSeparateSections(const llvm::Triple &Triple); 147 // Parse -mtls-dialect=. Return true if the target supports both general-dynamic 148 // and TLSDESC, and TLSDESC is requested. 149 bool isTLSDESCEnabled(const ToolChain &TC, const llvm::opt::ArgList &Args); 150 151 /// \p EnvVar is split by system delimiter for environment variables. 152 /// If \p ArgName is "-I", "-L", or an empty string, each entry from \p EnvVar 153 /// is prefixed by \p ArgName then added to \p Args. Otherwise, for each 154 /// entry of \p EnvVar, \p ArgName is added to \p Args first, then the entry 155 /// itself is added. 156 void addDirectoryList(const llvm::opt::ArgList &Args, 157 llvm::opt::ArgStringList &CmdArgs, const char *ArgName, 158 const char *EnvVar); 159 160 void AddTargetFeature(const llvm::opt::ArgList &Args, 161 std::vector<StringRef> &Features, 162 llvm::opt::OptSpecifier OnOpt, 163 llvm::opt::OptSpecifier OffOpt, StringRef FeatureName); 164 165 std::string getCPUName(const Driver &D, const llvm::opt::ArgList &Args, 166 const llvm::Triple &T, bool FromAs = false); 167 168 void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, 169 const llvm::opt::ArgList &Args, 170 llvm::opt::ArgStringList &CmdArgs, bool ForAS, 171 bool IsAux = false); 172 173 /// Iterate \p Args and convert -mxxx to +xxx and -mno-xxx to -xxx and 174 /// append it to \p Features. 175 /// 176 /// Note: Since \p Features may contain default values before calling 177 /// this function, or may be appended with entries to override arguments, 178 /// entries in \p Features are not unique. 179 void handleTargetFeaturesGroup(const Driver &D, const llvm::Triple &Triple, 180 const llvm::opt::ArgList &Args, 181 std::vector<StringRef> &Features, 182 llvm::opt::OptSpecifier Group); 183 184 /// If there are multiple +xxx or -xxx features, keep the last one. 185 SmallVector<StringRef> unifyTargetFeatures(ArrayRef<StringRef> Features); 186 187 /// Handles the -save-stats option and returns the filename to save statistics 188 /// to. 189 SmallString<128> getStatsFileName(const llvm::opt::ArgList &Args, 190 const InputInfo &Output, 191 const InputInfo &Input, const Driver &D); 192 193 /// \p Flag must be a flag accepted by the driver. 194 void addMultilibFlag(bool Enabled, const StringRef Flag, 195 Multilib::flags_list &Flags); 196 197 void addX86AlignBranchArgs(const Driver &D, const llvm::opt::ArgList &Args, 198 llvm::opt::ArgStringList &CmdArgs, bool IsLTO, 199 const StringRef PluginOptPrefix = ""); 200 201 void checkAMDGPUCodeObjectVersion(const Driver &D, 202 const llvm::opt::ArgList &Args); 203 204 unsigned getAMDGPUCodeObjectVersion(const Driver &D, 205 const llvm::opt::ArgList &Args); 206 207 bool haveAMDGPUCodeObjectVersionArgument(const Driver &D, 208 const llvm::opt::ArgList &Args); 209 210 void addMachineOutlinerArgs(const Driver &D, const llvm::opt::ArgList &Args, 211 llvm::opt::ArgStringList &CmdArgs, 212 const llvm::Triple &Triple, bool IsLTO, 213 const StringRef PluginOptPrefix = ""); 214 215 void addOpenMPDeviceRTL(const Driver &D, const llvm::opt::ArgList &DriverArgs, 216 llvm::opt::ArgStringList &CC1Args, 217 StringRef BitcodeSuffix, const llvm::Triple &Triple); 218 } // end namespace tools 219 } // end namespace driver 220 } // end namespace clang 221 222 clang::CodeGenOptions::FramePointerKind 223 getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple); 224 225 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_COMMONARGS_H 226