| Eugene Zelenko | d4304d2 | 2015-11-04 21:37:17 +0000 | [diff] [blame] | 1 | //===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===// | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 2 | // | 
|  | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
|  | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
|  | 7 | // | 
|  | 8 | //===----------------------------------------------------------------------===// | 
|  | 9 |  | 
|  | 10 | #include "Tools.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 11 | #include "InputInfo.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 12 | #include "ToolChains.h" | 
| Ben Langmuir | e056ec3 | 2015-02-04 18:34:23 +0000 | [diff] [blame] | 13 | #include "clang/Basic/CharInfo.h" | 
| Josh Magee | e0fc1a8 | 2014-02-11 01:35:14 +0000 | [diff] [blame] | 14 | #include "clang/Basic/LangOptions.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 15 | #include "clang/Basic/ObjCRuntime.h" | 
| Kevin Enderby | ae2ec47 | 2013-01-17 21:38:06 +0000 | [diff] [blame] | 16 | #include "clang/Basic/Version.h" | 
| Rafael Espindola | 3e34e65 | 2015-02-03 16:33:53 +0000 | [diff] [blame] | 17 | #include "clang/Config/config.h" | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 18 | #include "clang/Driver/Action.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 19 | #include "clang/Driver/Compilation.h" | 
| Daniel Dunbar | 1a8a2e8 | 2009-10-29 02:39:57 +0000 | [diff] [blame] | 20 | #include "clang/Driver/Driver.h" | 
|  | 21 | #include "clang/Driver/DriverDiagnostic.h" | 
| Daniel Dunbar | 04c4c2c | 2009-03-18 07:06:02 +0000 | [diff] [blame] | 22 | #include "clang/Driver/Job.h" | 
| Daniel Dunbar | da13faf | 2009-11-19 04:25:22 +0000 | [diff] [blame] | 23 | #include "clang/Driver/Options.h" | 
| Alexey Samsonov | 609213f9 | 2013-08-19 09:14:21 +0000 | [diff] [blame] | 24 | #include "clang/Driver/SanitizerArgs.h" | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 25 | #include "clang/Driver/ToolChain.h" | 
| Daniel Dunbar | 04c4c2c | 2009-03-18 07:06:02 +0000 | [diff] [blame] | 26 | #include "clang/Driver/Util.h" | 
| Benjamin Kramer | 33335df | 2015-03-01 21:36:40 +0000 | [diff] [blame] | 27 | #include "llvm/ADT/STLExtras.h" | 
| Daniel Dunbar | 1c28f1e | 2009-09-09 22:32:48 +0000 | [diff] [blame] | 28 | #include "llvm/ADT/SmallString.h" | 
| Hans Wennborg | 188382e | 2013-09-20 18:16:35 +0000 | [diff] [blame] | 29 | #include "llvm/ADT/StringExtras.h" | 
| Douglas Gregor | f7b87cb | 2009-10-29 00:41:01 +0000 | [diff] [blame] | 30 | #include "llvm/ADT/StringSwitch.h" | 
| Daniel Dunbar | b4a3e43 | 2009-09-09 22:32:34 +0000 | [diff] [blame] | 31 | #include "llvm/ADT/Twine.h" | 
| Reid Kleckner | 898229a | 2013-06-14 17:17:23 +0000 | [diff] [blame] | 32 | #include "llvm/Option/Arg.h" | 
|  | 33 | #include "llvm/Option/ArgList.h" | 
|  | 34 | #include "llvm/Option/Option.h" | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 35 | #include "llvm/Support/CodeGen.h" | 
| David Blaikie | 24bbfed2 | 2014-03-31 23:29:38 +0000 | [diff] [blame] | 36 | #include "llvm/Support/Compression.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 37 | #include "llvm/Support/ErrorHandling.h" | 
| Michael J. Spencer | f6efe58 | 2011-01-10 02:34:13 +0000 | [diff] [blame] | 38 | #include "llvm/Support/FileSystem.h" | 
| Michael J. Spencer | 8aaf499 | 2010-11-29 18:12:39 +0000 | [diff] [blame] | 39 | #include "llvm/Support/Host.h" | 
| Hans Wennborg | 188382e | 2013-09-20 18:16:35 +0000 | [diff] [blame] | 40 | #include "llvm/Support/Path.h" | 
| Michael J. Spencer | 8aaf499 | 2010-11-29 18:12:39 +0000 | [diff] [blame] | 41 | #include "llvm/Support/Process.h" | 
| Chandler Carruth | 5553d0d | 2014-01-07 11:51:46 +0000 | [diff] [blame] | 42 | #include "llvm/Support/Program.h" | 
| Chandler Carruth | 3a02247 | 2012-12-04 09:13:33 +0000 | [diff] [blame] | 43 | #include "llvm/Support/raw_ostream.h" | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 44 | #include "llvm/Support/TargetParser.h" | 
| Daniel Dunbar | 04c4c2c | 2009-03-18 07:06:02 +0000 | [diff] [blame] | 45 |  | 
| Ben Langmuir | 3b7b540 | 2015-02-03 19:28:37 +0000 | [diff] [blame] | 46 | #ifdef LLVM_ON_UNIX | 
|  | 47 | #include <unistd.h> // For getuid(). | 
|  | 48 | #endif | 
|  | 49 |  | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 50 | using namespace clang::driver; | 
|  | 51 | using namespace clang::driver::tools; | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 52 | using namespace clang; | 
| Reid Kleckner | 898229a | 2013-06-14 17:17:23 +0000 | [diff] [blame] | 53 | using namespace llvm::opt; | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 54 |  | 
| Eric Christopher | 49062a5 | 2015-12-22 03:12:34 +0000 | [diff] [blame] | 55 | static void handleTargetFeaturesGroup(const ArgList &Args, | 
|  | 56 | std::vector<const char *> &Features, | 
|  | 57 | OptSpecifier Group) { | 
|  | 58 | for (const Arg *A : Args.filtered(Group)) { | 
|  | 59 | StringRef Name = A->getOption().getName(); | 
|  | 60 | A->claim(); | 
|  | 61 |  | 
|  | 62 | // Skip over "-m". | 
|  | 63 | assert(Name.startswith("m") && "Invalid feature name."); | 
|  | 64 | Name = Name.substr(1); | 
|  | 65 |  | 
|  | 66 | bool IsNegative = Name.startswith("no-"); | 
|  | 67 | if (IsNegative) | 
|  | 68 | Name = Name.substr(3); | 
|  | 69 | Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name)); | 
|  | 70 | } | 
|  | 71 | } | 
|  | 72 |  | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 73 | static const char *getSparcAsmModeForCPU(StringRef Name, | 
|  | 74 | const llvm::Triple &Triple) { | 
|  | 75 | if (Triple.getArch() == llvm::Triple::sparcv9) { | 
|  | 76 | return llvm::StringSwitch<const char *>(Name) | 
|  | 77 | .Case("niagara", "-Av9b") | 
|  | 78 | .Case("niagara2", "-Av9b") | 
|  | 79 | .Case("niagara3", "-Av9d") | 
|  | 80 | .Case("niagara4", "-Av9d") | 
|  | 81 | .Default("-Av9"); | 
|  | 82 | } else { | 
|  | 83 | return llvm::StringSwitch<const char *>(Name) | 
|  | 84 | .Case("v8", "-Av8") | 
|  | 85 | .Case("supersparc", "-Av8") | 
|  | 86 | .Case("sparclite", "-Asparclite") | 
|  | 87 | .Case("f934", "-Asparclite") | 
|  | 88 | .Case("hypersparc", "-Av8") | 
|  | 89 | .Case("sparclite86x", "-Asparclite") | 
|  | 90 | .Case("sparclet", "-Asparclet") | 
|  | 91 | .Case("tsc701", "-Asparclet") | 
|  | 92 | .Case("v9", "-Av8plus") | 
|  | 93 | .Case("ultrasparc", "-Av8plus") | 
|  | 94 | .Case("ultrasparc3", "-Av8plus") | 
|  | 95 | .Case("niagara", "-Av8plusb") | 
|  | 96 | .Case("niagara2", "-Av8plusb") | 
|  | 97 | .Case("niagara3", "-Av8plusd") | 
|  | 98 | .Case("niagara4", "-Av8plusd") | 
| Jacob Baungard Hansen | 1bf1282 | 2016-07-04 08:56:08 +0000 | [diff] [blame] | 99 | .Case("leon2", "-Av8") | 
|  | 100 | .Case("at697e", "-Av8") | 
|  | 101 | .Case("at697f", "-Av8") | 
|  | 102 | .Case("leon3", "-Av8") | 
|  | 103 | .Case("ut699", "-Av8") | 
|  | 104 | .Case("gr712rc", "-Av8") | 
|  | 105 | .Case("leon4", "-Av8") | 
|  | 106 | .Case("gr740", "-Av8") | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 107 | .Default("-Av8"); | 
|  | 108 | } | 
|  | 109 | } | 
|  | 110 |  | 
| Daniel Dunbar | 64198ef | 2009-09-10 01:21:05 +0000 | [diff] [blame] | 111 | /// CheckPreprocessingOptions - Perform some validation of preprocessing | 
|  | 112 | /// arguments that is shared with gcc. | 
|  | 113 | static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) { | 
| Hans Wennborg | 8f00837 | 2014-06-11 19:44:53 +0000 | [diff] [blame] | 114 | if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) { | 
|  | 115 | if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) && | 
|  | 116 | !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) { | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 117 | D.Diag(diag::err_drv_argument_only_allowed_with) | 
| Hans Wennborg | 8f00837 | 2014-06-11 19:44:53 +0000 | [diff] [blame] | 118 | << A->getBaseArg().getAsString(Args) | 
|  | 119 | << (D.IsCLMode() ? "/E, /P or /EP" : "-E"); | 
|  | 120 | } | 
|  | 121 | } | 
| Daniel Dunbar | 64198ef | 2009-09-10 01:21:05 +0000 | [diff] [blame] | 122 | } | 
|  | 123 |  | 
| Daniel Dunbar | 4eadb60 | 2009-09-10 01:21:12 +0000 | [diff] [blame] | 124 | /// CheckCodeGenerationOptions - Perform some validation of code generation | 
|  | 125 | /// arguments that is shared with gcc. | 
|  | 126 | static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) { | 
|  | 127 | // In gcc, only ARM checks this, but it seems reasonable to check universally. | 
|  | 128 | if (Args.hasArg(options::OPT_static)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 129 | if (const Arg *A = | 
|  | 130 | Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic)) | 
|  | 131 | D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) | 
|  | 132 | << "-static"; | 
| Daniel Dunbar | 4eadb60 | 2009-09-10 01:21:12 +0000 | [diff] [blame] | 133 | } | 
|  | 134 |  | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 135 | // Add backslashes to escape spaces and other backslashes. | 
|  | 136 | // This is used for the space-separated argument list specified with | 
|  | 137 | // the -dwarf-debug-flags option. | 
|  | 138 | static void EscapeSpacesAndBackslashes(const char *Arg, | 
|  | 139 | SmallVectorImpl<char> &Res) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 140 | for (; *Arg; ++Arg) { | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 141 | switch (*Arg) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 142 | default: | 
|  | 143 | break; | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 144 | case ' ': | 
|  | 145 | case '\\': | 
|  | 146 | Res.push_back('\\'); | 
|  | 147 | break; | 
|  | 148 | } | 
|  | 149 | Res.push_back(*Arg); | 
|  | 150 | } | 
|  | 151 | } | 
|  | 152 |  | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 153 | // Quote target names for inclusion in GNU Make dependency files. | 
|  | 154 | // Only the characters '$', '#', ' ', '\t' are quoted. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 155 | static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) { | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 156 | for (unsigned i = 0, e = Target.size(); i != e; ++i) { | 
|  | 157 | switch (Target[i]) { | 
|  | 158 | case ' ': | 
|  | 159 | case '\t': | 
|  | 160 | // Escape the preceding backslashes | 
|  | 161 | for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j) | 
|  | 162 | Res.push_back('\\'); | 
|  | 163 |  | 
|  | 164 | // Escape the space/tab | 
|  | 165 | Res.push_back('\\'); | 
|  | 166 | break; | 
|  | 167 | case '$': | 
|  | 168 | Res.push_back('$'); | 
|  | 169 | break; | 
|  | 170 | case '#': | 
|  | 171 | Res.push_back('\\'); | 
|  | 172 | break; | 
|  | 173 | default: | 
|  | 174 | break; | 
|  | 175 | } | 
|  | 176 |  | 
|  | 177 | Res.push_back(Target[i]); | 
|  | 178 | } | 
|  | 179 | } | 
|  | 180 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 181 | static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs, | 
|  | 182 | const char *ArgName, const char *EnvVar) { | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 183 | const char *DirList = ::getenv(EnvVar); | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 184 | bool CombinedArg = false; | 
|  | 185 |  | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 186 | if (!DirList) | 
|  | 187 | return; // Nothing to do. | 
|  | 188 |  | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 189 | StringRef Name(ArgName); | 
|  | 190 | if (Name.equals("-I") || Name.equals("-L")) | 
|  | 191 | CombinedArg = true; | 
|  | 192 |  | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 193 | StringRef Dirs(DirList); | 
|  | 194 | if (Dirs.empty()) // Empty string should not add '.'. | 
|  | 195 | return; | 
|  | 196 |  | 
|  | 197 | StringRef::size_type Delim; | 
| Rafael Espindola | 04b3fc4 | 2013-06-25 14:29:51 +0000 | [diff] [blame] | 198 | while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) { | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 199 | if (Delim == 0) { // Leading colon. | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 200 | if (CombinedArg) { | 
|  | 201 | CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); | 
|  | 202 | } else { | 
|  | 203 | CmdArgs.push_back(ArgName); | 
|  | 204 | CmdArgs.push_back("."); | 
|  | 205 | } | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 206 | } else { | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 207 | if (CombinedArg) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 208 | CmdArgs.push_back( | 
|  | 209 | Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim))); | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 210 | } else { | 
|  | 211 | CmdArgs.push_back(ArgName); | 
|  | 212 | CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim))); | 
|  | 213 | } | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 214 | } | 
| Nico Weber | 8935578 | 2012-03-19 15:00:03 +0000 | [diff] [blame] | 215 | Dirs = Dirs.substr(Delim + 1); | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 216 | } | 
|  | 217 |  | 
|  | 218 | if (Dirs.empty()) { // Trailing colon. | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 219 | if (CombinedArg) { | 
|  | 220 | CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + ".")); | 
|  | 221 | } else { | 
|  | 222 | CmdArgs.push_back(ArgName); | 
|  | 223 | CmdArgs.push_back("."); | 
|  | 224 | } | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 225 | } else { // Add the last path. | 
| Chad Rosier | 616e8a5 | 2012-10-30 21:42:09 +0000 | [diff] [blame] | 226 | if (CombinedArg) { | 
|  | 227 | CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs)); | 
|  | 228 | } else { | 
|  | 229 | CmdArgs.push_back(ArgName); | 
|  | 230 | CmdArgs.push_back(Args.MakeArgString(Dirs)); | 
|  | 231 | } | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 232 | } | 
|  | 233 | } | 
|  | 234 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 235 | static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs, | 
|  | 236 | const ArgList &Args, ArgStringList &CmdArgs) { | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 237 | const Driver &D = TC.getDriver(); | 
|  | 238 |  | 
| Daniel Dunbar | 1094bb1 | 2011-02-19 05:33:51 +0000 | [diff] [blame] | 239 | // Add extra linker input arguments which are not treated as inputs | 
|  | 240 | // (constructed via -Xarch_). | 
|  | 241 | Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input); | 
|  | 242 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 243 | for (const auto &II : Inputs) { | 
| Eric Christopher | c198407 | 2015-12-08 02:10:19 +0000 | [diff] [blame] | 244 | if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType())) | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 245 | // Don't try to pass LLVM inputs unless we have native support. | 
| Eric Christopher | c198407 | 2015-12-08 02:10:19 +0000 | [diff] [blame] | 246 | D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString(); | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 247 |  | 
| Daniel Dunbar | 2cc3f17 | 2010-09-17 00:45:02 +0000 | [diff] [blame] | 248 | // Add filenames immediately. | 
|  | 249 | if (II.isFilename()) { | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 250 | CmdArgs.push_back(II.getFilename()); | 
| Daniel Dunbar | 2cc3f17 | 2010-09-17 00:45:02 +0000 | [diff] [blame] | 251 | continue; | 
|  | 252 | } | 
|  | 253 |  | 
|  | 254 | // Otherwise, this is a linker input argument. | 
|  | 255 | const Arg &A = II.getInputArg(); | 
|  | 256 |  | 
|  | 257 | // Handle reserved library options. | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 258 | if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) | 
| Daniel Dunbar | 3f7796f | 2010-09-17 01:20:05 +0000 | [diff] [blame] | 259 | TC.AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 260 | else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) | 
| Shantonu Sen | afeb03b | 2010-09-17 18:39:08 +0000 | [diff] [blame] | 261 | TC.AddCCKextLibArgs(Args, CmdArgs); | 
| Arthur Marble | 31fb6f4 | 2014-07-16 21:16:16 +0000 | [diff] [blame] | 262 | else if (A.getOption().matches(options::OPT_z)) { | 
|  | 263 | // Pass -z prefix for gcc linker compatibility. | 
|  | 264 | A.claim(); | 
|  | 265 | A.render(Args, CmdArgs); | 
|  | 266 | } else { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 267 | A.renderAsInput(Args, CmdArgs); | 
| Arthur Marble | 31fb6f4 | 2014-07-16 21:16:16 +0000 | [diff] [blame] | 268 | } | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 269 | } | 
| Bill Wendling | 281ca29 | 2012-03-12 21:22:35 +0000 | [diff] [blame] | 270 |  | 
|  | 271 | // LIBRARY_PATH - included following the user specified library paths. | 
| Richard Barton | 5828d7b | 2013-12-17 11:11:25 +0000 | [diff] [blame] | 272 | //                and only supported on native toolchains. | 
|  | 273 | if (!TC.isCrossCompiling()) | 
|  | 274 | addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH"); | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 275 | } | 
|  | 276 |  | 
| John McCall | 31168b0 | 2011-06-15 23:02:42 +0000 | [diff] [blame] | 277 | /// \brief Determine whether Objective-C automated reference counting is | 
|  | 278 | /// enabled. | 
|  | 279 | static bool isObjCAutoRefCount(const ArgList &Args) { | 
|  | 280 | return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); | 
|  | 281 | } | 
|  | 282 |  | 
| Ted Kremenek | e65b086 | 2012-03-06 20:05:56 +0000 | [diff] [blame] | 283 | /// \brief Determine whether we are linking the ObjC runtime. | 
|  | 284 | static bool isObjCRuntimeLinked(const ArgList &Args) { | 
| Bob Wilson | 29536fc | 2012-08-07 19:58:00 +0000 | [diff] [blame] | 285 | if (isObjCAutoRefCount(Args)) { | 
|  | 286 | Args.ClaimAllArgs(options::OPT_fobjc_link_runtime); | 
| Ted Kremenek | e65b086 | 2012-03-06 20:05:56 +0000 | [diff] [blame] | 287 | return true; | 
| Bob Wilson | 29536fc | 2012-08-07 19:58:00 +0000 | [diff] [blame] | 288 | } | 
| Ted Kremenek | e65b086 | 2012-03-06 20:05:56 +0000 | [diff] [blame] | 289 | return Args.hasArg(options::OPT_fobjc_link_runtime); | 
|  | 290 | } | 
|  | 291 |  | 
| Michael J. Spencer | 66e2b20 | 2012-10-19 22:37:06 +0000 | [diff] [blame] | 292 | static bool forwardToGCC(const Option &O) { | 
| Reid Kleckner | 3793d5e | 2013-06-19 15:09:06 +0000 | [diff] [blame] | 293 | // Don't forward inputs from the original command line.  They are added from | 
|  | 294 | // InputInfoList. | 
| Richard Smith | 8e5e976 | 2013-06-20 01:33:59 +0000 | [diff] [blame] | 295 | return O.getKind() != Option::InputClass && | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 296 | !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput); | 
| Michael J. Spencer | 66e2b20 | 2012-10-19 22:37:06 +0000 | [diff] [blame] | 297 | } | 
|  | 298 |  | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 299 | /// Apply \a Work on the current tool chain \a RegularToolChain and any other | 
|  | 300 | /// offloading tool chain that is associated with the current action \a JA. | 
|  | 301 | static void | 
|  | 302 | forAllAssociatedToolChains(Compilation &C, const JobAction &JA, | 
|  | 303 | const ToolChain &RegularToolChain, | 
|  | 304 | llvm::function_ref<void(const ToolChain &)> Work) { | 
|  | 305 | // Apply Work on the current/regular tool chain. | 
|  | 306 | Work(RegularToolChain); | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 307 |  | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 308 | // Apply Work on all the offloading tool chains associated with the current | 
|  | 309 | // action. | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 310 | if (JA.isHostOffloading(Action::OFK_Cuda)) | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 311 | Work(*C.getSingleOffloadToolChain<Action::OFK_Cuda>()); | 
| Samuel Antao | 102c182 | 2016-07-28 22:42:42 +0000 | [diff] [blame] | 312 | else if (JA.isDeviceOffloading(Action::OFK_Cuda)) | 
|  | 313 | Work(*C.getSingleOffloadToolChain<Action::OFK_Host>()); | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 314 |  | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 315 | // | 
|  | 316 | // TODO: Add support for other offloading programming models here. | 
|  | 317 | // | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 318 | } | 
|  | 319 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 320 | void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, | 
|  | 321 | const Driver &D, const ArgList &Args, | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 322 | ArgStringList &CmdArgs, | 
|  | 323 | const InputInfo &Output, | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 324 | const InputInfoList &Inputs) const { | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 325 | Arg *A; | 
| Andrey Turetskiy | 4798eb6 | 2016-06-16 10:36:09 +0000 | [diff] [blame] | 326 | const bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); | 
| Daniel Dunbar | 367dbb9 | 2009-06-08 21:48:20 +0000 | [diff] [blame] | 327 |  | 
| Daniel Dunbar | 64198ef | 2009-09-10 01:21:05 +0000 | [diff] [blame] | 328 | CheckPreprocessingOptions(D, Args); | 
|  | 329 |  | 
|  | 330 | Args.AddLastArg(CmdArgs, options::OPT_C); | 
|  | 331 | Args.AddLastArg(CmdArgs, options::OPT_CC); | 
| Daniel Dunbar | 367dbb9 | 2009-06-08 21:48:20 +0000 | [diff] [blame] | 332 |  | 
|  | 333 | // Handle dependency file generation. | 
| Daniel Dunbar | 86aed7d | 2010-12-08 21:33:40 +0000 | [diff] [blame] | 334 | if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) || | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 335 | (A = Args.getLastArg(options::OPT_MD)) || | 
|  | 336 | (A = Args.getLastArg(options::OPT_MMD))) { | 
|  | 337 | // Determine the output location. | 
|  | 338 | const char *DepFile; | 
| Benjamin Kramer | 2715fce | 2012-09-26 19:01:49 +0000 | [diff] [blame] | 339 | if (Arg *MF = Args.getLastArg(options::OPT_MF)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 340 | DepFile = MF->getValue(); | 
| Chad Rosier | 633dcdc | 2013-01-24 19:14:47 +0000 | [diff] [blame] | 341 | C.addFailureResultFile(DepFile, &JA); | 
| Benjamin Kramer | 2715fce | 2012-09-26 19:01:49 +0000 | [diff] [blame] | 342 | } else if (Output.getType() == types::TY_Dependencies) { | 
|  | 343 | DepFile = Output.getFilename(); | 
| Daniel Dunbar | 0bfb21e | 2009-11-19 03:26:40 +0000 | [diff] [blame] | 344 | } else if (A->getOption().matches(options::OPT_M) || | 
|  | 345 | A->getOption().matches(options::OPT_MM)) { | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 346 | DepFile = "-"; | 
|  | 347 | } else { | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 348 | DepFile = getDependencyFileName(Args, Inputs); | 
| Chad Rosier | 633dcdc | 2013-01-24 19:14:47 +0000 | [diff] [blame] | 349 | C.addFailureResultFile(DepFile, &JA); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 350 | } | 
|  | 351 | CmdArgs.push_back("-dependency-file"); | 
|  | 352 | CmdArgs.push_back(DepFile); | 
|  | 353 |  | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 354 | // Add a default target if one wasn't specified. | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 355 | if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) { | 
|  | 356 | const char *DepTarget; | 
|  | 357 |  | 
|  | 358 | // If user provided -o, that is the dependency target, except | 
|  | 359 | // when we are only generating a dependency file. | 
|  | 360 | Arg *OutputOpt = Args.getLastArg(options::OPT_o); | 
|  | 361 | if (OutputOpt && Output.getType() != types::TY_Dependencies) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 362 | DepTarget = OutputOpt->getValue(); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 363 | } else { | 
|  | 364 | // Otherwise derive from the base input. | 
|  | 365 | // | 
|  | 366 | // FIXME: This should use the computed output file location. | 
| Dylan Noblesmith | 2c1dd27 | 2012-02-05 02:13:05 +0000 | [diff] [blame] | 367 | SmallString<128> P(Inputs[0].getBaseInput()); | 
| Michael J. Spencer | e169675 | 2010-12-18 00:19:12 +0000 | [diff] [blame] | 368 | llvm::sys::path::replace_extension(P, "o"); | 
|  | 369 | DepTarget = Args.MakeArgString(llvm::sys::path::filename(P)); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 370 | } | 
|  | 371 |  | 
|  | 372 | CmdArgs.push_back("-MT"); | 
| Dylan Noblesmith | 2c1dd27 | 2012-02-05 02:13:05 +0000 | [diff] [blame] | 373 | SmallString<128> Quoted; | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 374 | QuoteTarget(DepTarget, Quoted); | 
|  | 375 | CmdArgs.push_back(Args.MakeArgString(Quoted)); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 376 | } | 
|  | 377 |  | 
| Daniel Dunbar | 0bfb21e | 2009-11-19 03:26:40 +0000 | [diff] [blame] | 378 | if (A->getOption().matches(options::OPT_M) || | 
|  | 379 | A->getOption().matches(options::OPT_MD)) | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 380 | CmdArgs.push_back("-sys-header-deps"); | 
| Manuel Klimek | c68aa16 | 2015-03-19 12:00:22 +0000 | [diff] [blame] | 381 | if ((isa<PrecompileJobAction>(JA) && | 
|  | 382 | !Args.hasArg(options::OPT_fno_module_file_deps)) || | 
|  | 383 | Args.hasArg(options::OPT_fmodule_file_deps)) | 
| Argyrios Kyrtzidis | 6d0753d | 2014-03-14 03:07:38 +0000 | [diff] [blame] | 384 | CmdArgs.push_back("-module-file-deps"); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 385 | } | 
|  | 386 |  | 
| Peter Collingbourne | 77b0e7f2 | 2011-07-12 19:35:15 +0000 | [diff] [blame] | 387 | if (Args.hasArg(options::OPT_MG)) { | 
|  | 388 | if (!A || A->getOption().matches(options::OPT_MD) || | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 389 | A->getOption().matches(options::OPT_MMD)) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 390 | D.Diag(diag::err_drv_mg_requires_m_or_mm); | 
| Peter Collingbourne | 77b0e7f2 | 2011-07-12 19:35:15 +0000 | [diff] [blame] | 391 | CmdArgs.push_back("-MG"); | 
|  | 392 | } | 
|  | 393 |  | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 394 | Args.AddLastArg(CmdArgs, options::OPT_MP); | 
| Paul Robinson | d7214a7 | 2015-04-27 18:14:32 +0000 | [diff] [blame] | 395 | Args.AddLastArg(CmdArgs, options::OPT_MV); | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 396 |  | 
|  | 397 | // Convert all -MQ <target> args to -MT <quoted target> | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 398 | for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) { | 
| Daniel Dunbar | a442fd5 | 2010-06-11 22:00:13 +0000 | [diff] [blame] | 399 | A->claim(); | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 400 |  | 
| Daniel Dunbar | a442fd5 | 2010-06-11 22:00:13 +0000 | [diff] [blame] | 401 | if (A->getOption().matches(options::OPT_MQ)) { | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 402 | CmdArgs.push_back("-MT"); | 
| Dylan Noblesmith | 2c1dd27 | 2012-02-05 02:13:05 +0000 | [diff] [blame] | 403 | SmallString<128> Quoted; | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 404 | QuoteTarget(A->getValue(), Quoted); | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 405 | CmdArgs.push_back(Args.MakeArgString(Quoted)); | 
|  | 406 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 407 | // -MT flag - no change | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 408 | } else { | 
| Daniel Dunbar | a442fd5 | 2010-06-11 22:00:13 +0000 | [diff] [blame] | 409 | A->render(Args, CmdArgs); | 
| Chris Lattner | bf2803f | 2010-03-29 17:55:58 +0000 | [diff] [blame] | 410 | } | 
|  | 411 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 412 |  | 
| Justin Lebar | 9421ba6 | 2016-08-15 20:38:52 +0000 | [diff] [blame] | 413 | // Add offload include arguments specific for CUDA.  This must happen before | 
|  | 414 | // we -I or -include anything else, because we must pick up the CUDA headers | 
|  | 415 | // from the particular CUDA installation, rather than from e.g. | 
|  | 416 | // /usr/local/include. | 
|  | 417 | if (JA.isOffloading(Action::OFK_Cuda)) | 
|  | 418 | getToolChain().AddCudaIncludeArgs(Args, CmdArgs); | 
|  | 419 |  | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 420 | // Add -i* options, and automatically translate to | 
|  | 421 | // -include-pch/-include-pth for transparent PCH support. It's | 
|  | 422 | // wonky, but we include looking for .gch so we can support seamless | 
|  | 423 | // replacement into a build system already set up to be generating | 
|  | 424 | // .gch files. | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 425 | int YcIndex = -1, YuIndex = -1; | 
|  | 426 | { | 
|  | 427 | int AI = -1; | 
|  | 428 | const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc); | 
|  | 429 | const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu); | 
|  | 430 | for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) { | 
|  | 431 | // Walk the whole i_Group and skip non "-include" flags so that the index | 
|  | 432 | // here matches the index in the next loop below. | 
|  | 433 | ++AI; | 
|  | 434 | if (!A->getOption().matches(options::OPT_include)) | 
|  | 435 | continue; | 
|  | 436 | if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0) | 
|  | 437 | YcIndex = AI; | 
|  | 438 | if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0) | 
|  | 439 | YuIndex = AI; | 
|  | 440 | } | 
|  | 441 | } | 
|  | 442 | if (isa<PrecompileJobAction>(JA) && YcIndex != -1) { | 
|  | 443 | Driver::InputList Inputs; | 
|  | 444 | D.BuildInputs(getToolChain(), C.getArgs(), Inputs); | 
|  | 445 | assert(Inputs.size() == 1 && "Need one input when building pch"); | 
|  | 446 | CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") + | 
|  | 447 | Inputs[0].second->getValue())); | 
|  | 448 | } | 
|  | 449 |  | 
| Argyrios Kyrtzidis | 2f23b41 | 2010-09-30 16:53:47 +0000 | [diff] [blame] | 450 | bool RenderedImplicitInclude = false; | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 451 | int AI = -1; | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 452 | for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) { | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 453 | ++AI; | 
|  | 454 |  | 
| Nico Weber | d8ff0ee | 2016-04-02 19:10:07 +0000 | [diff] [blame] | 455 | if (getToolChain().getDriver().IsCLMode() && | 
|  | 456 | A->getOption().matches(options::OPT_include)) { | 
| Junmo Park | e19d679 | 2016-03-17 06:41:27 +0000 | [diff] [blame] | 457 | // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 458 | // include is compiled into foo.h, and everything after goes into | 
|  | 459 | // the .obj file. /Yufoo.h means that all includes prior to and including | 
|  | 460 | // foo.h are completely skipped and replaced with a use of the pch file | 
|  | 461 | // for foo.h.  (Each flag can have at most one value, multiple /Yc flags | 
|  | 462 | // just mean that the last one wins.)  If /Yc and /Yu are both present | 
|  | 463 | // and refer to the same file, /Yc wins. | 
|  | 464 | // Note that OPT__SLASH_FI gets mapped to OPT_include. | 
|  | 465 | // FIXME: The code here assumes that /Yc and /Yu refer to the same file. | 
|  | 466 | // cl.exe seems to support both flags with different values, but that | 
|  | 467 | // seems strange (which flag does /Fp now refer to?), so don't implement | 
| Nico Weber | d1728f0 | 2016-03-23 18:17:02 +0000 | [diff] [blame] | 468 | // that until someone needs it. | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 469 | int PchIndex = YcIndex != -1 ? YcIndex : YuIndex; | 
|  | 470 | if (PchIndex != -1) { | 
|  | 471 | if (isa<PrecompileJobAction>(JA)) { | 
|  | 472 | // When building the pch, skip all includes after the pch. | 
|  | 473 | assert(YcIndex != -1 && PchIndex == YcIndex); | 
|  | 474 | if (AI >= YcIndex) | 
|  | 475 | continue; | 
|  | 476 | } else { | 
|  | 477 | // When using the pch, skip all includes prior to the pch. | 
| Nico Weber | d1728f0 | 2016-03-23 18:17:02 +0000 | [diff] [blame] | 478 | if (AI < PchIndex) { | 
|  | 479 | A->claim(); | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 480 | continue; | 
| Nico Weber | d1728f0 | 2016-03-23 18:17:02 +0000 | [diff] [blame] | 481 | } | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 482 | if (AI == PchIndex) { | 
|  | 483 | A->claim(); | 
|  | 484 | CmdArgs.push_back("-include-pch"); | 
|  | 485 | CmdArgs.push_back( | 
|  | 486 | Args.MakeArgString(D.GetClPchPath(C, A->getValue()))); | 
|  | 487 | continue; | 
|  | 488 | } | 
|  | 489 | } | 
|  | 490 | } | 
|  | 491 | } else if (A->getOption().matches(options::OPT_include)) { | 
|  | 492 | // Handling of gcc-style gch precompiled headers. | 
| Argyrios Kyrtzidis | 2f23b41 | 2010-09-30 16:53:47 +0000 | [diff] [blame] | 493 | bool IsFirstImplicitInclude = !RenderedImplicitInclude; | 
|  | 494 | RenderedImplicitInclude = true; | 
|  | 495 |  | 
| Argyrios Kyrtzidis | 90bdfbb | 2010-08-11 23:27:58 +0000 | [diff] [blame] | 496 | // Use PCH if the user requested it. | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 497 | bool UsePCH = D.CCCUsePCH; | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 498 |  | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 499 | bool FoundPTH = false; | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 500 | bool FoundPCH = false; | 
| Rafael Espindola | 00eaafd | 2013-06-25 15:03:59 +0000 | [diff] [blame] | 501 | SmallString<128> P(A->getValue()); | 
|  | 502 | // We want the files to have a name like foo.h.pch. Add a dummy extension | 
|  | 503 | // so that replace_extension does the right thing. | 
|  | 504 | P += ".dummy"; | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 505 | if (UsePCH) { | 
| Rafael Espindola | 00eaafd | 2013-06-25 15:03:59 +0000 | [diff] [blame] | 506 | llvm::sys::path::replace_extension(P, "pch"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 507 | if (llvm::sys::fs::exists(P)) | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 508 | FoundPCH = true; | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 509 | } | 
|  | 510 |  | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 511 | if (!FoundPCH) { | 
| Rafael Espindola | 00eaafd | 2013-06-25 15:03:59 +0000 | [diff] [blame] | 512 | llvm::sys::path::replace_extension(P, "pth"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 513 | if (llvm::sys::fs::exists(P)) | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 514 | FoundPTH = true; | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 515 | } | 
|  | 516 |  | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 517 | if (!FoundPCH && !FoundPTH) { | 
| Rafael Espindola | 00eaafd | 2013-06-25 15:03:59 +0000 | [diff] [blame] | 518 | llvm::sys::path::replace_extension(P, "gch"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 519 | if (llvm::sys::fs::exists(P)) { | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 520 | FoundPCH = UsePCH; | 
|  | 521 | FoundPTH = !UsePCH; | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 522 | } | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 523 | } | 
|  | 524 |  | 
|  | 525 | if (FoundPCH || FoundPTH) { | 
| Argyrios Kyrtzidis | 2f23b41 | 2010-09-30 16:53:47 +0000 | [diff] [blame] | 526 | if (IsFirstImplicitInclude) { | 
|  | 527 | A->claim(); | 
|  | 528 | if (UsePCH) | 
|  | 529 | CmdArgs.push_back("-include-pch"); | 
|  | 530 | else | 
|  | 531 | CmdArgs.push_back("-include-pth"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 532 | CmdArgs.push_back(Args.MakeArgString(P)); | 
| Argyrios Kyrtzidis | 2f23b41 | 2010-09-30 16:53:47 +0000 | [diff] [blame] | 533 | continue; | 
|  | 534 | } else { | 
|  | 535 | // Ignore the PCH if not first on command line and emit warning. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 536 | D.Diag(diag::warn_drv_pch_not_first_include) << P | 
|  | 537 | << A->getAsString(Args); | 
| Argyrios Kyrtzidis | 2f23b41 | 2010-09-30 16:53:47 +0000 | [diff] [blame] | 538 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 539 | } | 
| Saleem Abdulrasool | 88879e6 | 2016-06-17 17:23:16 +0000 | [diff] [blame] | 540 | } else if (A->getOption().matches(options::OPT_isystem_after)) { | 
|  | 541 | // Handling of paths which must come late.  These entries are handled by | 
|  | 542 | // the toolchain itself after the resource dir is inserted in the right | 
|  | 543 | // search order. | 
|  | 544 | // Do not claim the argument so that the use of the argument does not | 
|  | 545 | // silently go unnoticed on toolchains which do not honour the option. | 
|  | 546 | continue; | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 547 | } | 
|  | 548 |  | 
|  | 549 | // Not translated, render as usual. | 
|  | 550 | A->claim(); | 
|  | 551 | A->render(Args, CmdArgs); | 
|  | 552 | } | 
|  | 553 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 554 | Args.AddAllArgs(CmdArgs, | 
|  | 555 | {options::OPT_D, options::OPT_U, options::OPT_I_Group, | 
|  | 556 | options::OPT_F, options::OPT_index_header_map}); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 557 |  | 
| Douglas Katzman | 9dc81a4 | 2015-10-02 14:41:38 +0000 | [diff] [blame] | 558 | // Add -Wp, and -Xpreprocessor if using the preprocessor. | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 559 |  | 
|  | 560 | // FIXME: There is a very unfortunate problem here, some troubled | 
|  | 561 | // souls abuse -Wp, to pass preprocessor options in gcc syntax. To | 
|  | 562 | // really support that we would have to parse and then translate | 
|  | 563 | // those options. :( | 
|  | 564 | Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA, | 
|  | 565 | options::OPT_Xpreprocessor); | 
| Daniel Dunbar | 38b6279 | 2009-10-29 01:53:44 +0000 | [diff] [blame] | 566 |  | 
|  | 567 | // -I- is a deprecated GCC feature, reject it. | 
|  | 568 | if (Arg *A = Args.getLastArg(options::OPT_I_)) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 569 | D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args); | 
| Chandler Carruth | 24e17e1 | 2010-10-20 07:00:47 +0000 | [diff] [blame] | 570 |  | 
|  | 571 | // If we have a --sysroot, and don't have an explicit -isysroot flag, add an | 
|  | 572 | // -isysroot to the CC1 invocation. | 
| Sebastian Pop | 980920a | 2012-04-16 04:16:43 +0000 | [diff] [blame] | 573 | StringRef sysroot = C.getSysRoot(); | 
|  | 574 | if (sysroot != "") { | 
| Chandler Carruth | 24e17e1 | 2010-10-20 07:00:47 +0000 | [diff] [blame] | 575 | if (!Args.hasArg(options::OPT_isysroot)) { | 
|  | 576 | CmdArgs.push_back("-isysroot"); | 
| Sebastian Pop | 980920a | 2012-04-16 04:16:43 +0000 | [diff] [blame] | 577 | CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); | 
| Chandler Carruth | 24e17e1 | 2010-10-20 07:00:47 +0000 | [diff] [blame] | 578 | } | 
|  | 579 | } | 
| Douglas Gregor | 5dc3899 | 2013-02-07 00:21:12 +0000 | [diff] [blame] | 580 |  | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 581 | // Parse additional include paths from environment variables. | 
| Chandler Carruth | 9802c14 | 2011-11-04 07:12:58 +0000 | [diff] [blame] | 582 | // FIXME: We should probably sink the logic for handling these from the | 
|  | 583 | // frontend into the driver. It will allow deleting 4 otherwise unused flags. | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 584 | // CPATH - included following the user specified includes (but prior to | 
|  | 585 | // builtin and standard includes). | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 586 | addDirectoryList(Args, CmdArgs, "-I", "CPATH"); | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 587 | // C_INCLUDE_PATH - system includes enabled when compiling C. | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 588 | addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH"); | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 589 | // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++. | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 590 | addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH"); | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 591 | // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC. | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 592 | addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH"); | 
| Benjamin Kramer | 8404eb0 | 2011-09-22 21:41:16 +0000 | [diff] [blame] | 593 | // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++. | 
| Bill Wendling | c0938f3 | 2012-03-12 22:10:06 +0000 | [diff] [blame] | 594 | addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH"); | 
| Chandler Carruth | 6bfd84f | 2011-11-04 07:12:53 +0000 | [diff] [blame] | 595 |  | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 596 | // While adding the include arguments, we also attempt to retrieve the | 
|  | 597 | // arguments of related offloading toolchains or arguments that are specific | 
|  | 598 | // of an offloading programming model. | 
| Artem Belevich | fa11ab5 | 2015-11-17 22:28:46 +0000 | [diff] [blame] | 599 |  | 
| Chandler Carruth | 6bfd84f | 2011-11-04 07:12:53 +0000 | [diff] [blame] | 600 | // Add C++ include arguments, if needed. | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 601 | if (types::isCXX(Inputs[0].getType())) | 
|  | 602 | forAllAssociatedToolChains(C, JA, getToolChain(), | 
|  | 603 | [&Args, &CmdArgs](const ToolChain &TC) { | 
|  | 604 | TC.AddClangCXXStdlibIncludeArgs(Args, CmdArgs); | 
|  | 605 | }); | 
| Chandler Carruth | a796f53 | 2011-11-05 20:17:13 +0000 | [diff] [blame] | 606 |  | 
| Andrey Turetskiy | 4798eb6 | 2016-06-16 10:36:09 +0000 | [diff] [blame] | 607 | // Add system include arguments for all targets but IAMCU. | 
| Samuel Antao | 6ad1170 | 2016-07-27 22:46:31 +0000 | [diff] [blame] | 608 | if (!IsIAMCU) | 
|  | 609 | forAllAssociatedToolChains(C, JA, getToolChain(), | 
|  | 610 | [&Args, &CmdArgs](const ToolChain &TC) { | 
|  | 611 | TC.AddClangSystemIncludeArgs(Args, CmdArgs); | 
|  | 612 | }); | 
|  | 613 | else { | 
| Andrey Turetskiy | 4798eb6 | 2016-06-16 10:36:09 +0000 | [diff] [blame] | 614 | // For IAMCU add special include arguments. | 
|  | 615 | getToolChain().AddIAMCUIncludeArgs(Args, CmdArgs); | 
|  | 616 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 617 | } | 
|  | 618 |  | 
| Daniel Dunbar | d609b7b | 2009-11-17 06:37:03 +0000 | [diff] [blame] | 619 | // FIXME: Move to target hook. | 
|  | 620 | static bool isSignedCharDefault(const llvm::Triple &Triple) { | 
|  | 621 | switch (Triple.getArch()) { | 
|  | 622 | default: | 
|  | 623 | return true; | 
|  | 624 |  | 
| Tim Northover | 9bb857a | 2013-01-31 12:13:10 +0000 | [diff] [blame] | 625 | case llvm::Triple::aarch64: | 
| Christian Pirker | 9b019ae | 2014-02-25 13:51:00 +0000 | [diff] [blame] | 626 | case llvm::Triple::aarch64_be: | 
| Jim Grosbach | 7c2c664 | 2011-05-24 15:40:46 +0000 | [diff] [blame] | 627 | case llvm::Triple::arm: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 628 | case llvm::Triple::armeb: | 
| Oliver Stannard | abed2ee | 2014-10-24 11:28:47 +0000 | [diff] [blame] | 629 | case llvm::Triple::thumb: | 
|  | 630 | case llvm::Triple::thumbeb: | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 631 | if (Triple.isOSDarwin() || Triple.isOSWindows()) | 
|  | 632 | return true; | 
|  | 633 | return false; | 
|  | 634 |  | 
| Daniel Dunbar | d609b7b | 2009-11-17 06:37:03 +0000 | [diff] [blame] | 635 | case llvm::Triple::ppc: | 
|  | 636 | case llvm::Triple::ppc64: | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 637 | if (Triple.isOSDarwin()) | 
| Daniel Dunbar | d609b7b | 2009-11-17 06:37:03 +0000 | [diff] [blame] | 638 | return true; | 
|  | 639 | return false; | 
| Ulrich Weigand | 4744507 | 2013-05-06 16:26:41 +0000 | [diff] [blame] | 640 |  | 
| David Majnemer | dcecd93 | 2015-05-23 19:23:55 +0000 | [diff] [blame] | 641 | case llvm::Triple::hexagon: | 
| Bill Schmidt | 778d387 | 2013-07-26 01:36:11 +0000 | [diff] [blame] | 642 | case llvm::Triple::ppc64le: | 
| Ulrich Weigand | 4744507 | 2013-05-06 16:26:41 +0000 | [diff] [blame] | 643 | case llvm::Triple::systemz: | 
| Robert Lytton | 0e07649 | 2013-08-13 09:43:10 +0000 | [diff] [blame] | 644 | case llvm::Triple::xcore: | 
| Ulrich Weigand | 4744507 | 2013-05-06 16:26:41 +0000 | [diff] [blame] | 645 | return false; | 
| Daniel Dunbar | d609b7b | 2009-11-17 06:37:03 +0000 | [diff] [blame] | 646 | } | 
|  | 647 | } | 
|  | 648 |  | 
| Robert Lytton | 0e07649 | 2013-08-13 09:43:10 +0000 | [diff] [blame] | 649 | static bool isNoCommonDefault(const llvm::Triple &Triple) { | 
|  | 650 | switch (Triple.getArch()) { | 
|  | 651 | default: | 
|  | 652 | return false; | 
|  | 653 |  | 
|  | 654 | case llvm::Triple::xcore: | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 655 | case llvm::Triple::wasm32: | 
|  | 656 | case llvm::Triple::wasm64: | 
| Robert Lytton | 0e07649 | 2013-08-13 09:43:10 +0000 | [diff] [blame] | 657 | return true; | 
|  | 658 | } | 
|  | 659 | } | 
|  | 660 |  | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 661 | // ARM tools start. | 
|  | 662 |  | 
|  | 663 | // Get SubArch (vN). | 
|  | 664 | static int getARMSubArchVersionNumber(const llvm::Triple &Triple) { | 
|  | 665 | llvm::StringRef Arch = Triple.getArchName(); | 
| Chandler Carruth | aa0caeb | 2015-08-30 02:16:36 +0000 | [diff] [blame] | 666 | return llvm::ARM::parseArchVersion(Arch); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 667 | } | 
|  | 668 |  | 
|  | 669 | // True if M-profile. | 
|  | 670 | static bool isARMMProfile(const llvm::Triple &Triple) { | 
|  | 671 | llvm::StringRef Arch = Triple.getArchName(); | 
| Chandler Carruth | aa0caeb | 2015-08-30 02:16:36 +0000 | [diff] [blame] | 672 | unsigned Profile = llvm::ARM::parseArchProfile(Arch); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 673 | return Profile == llvm::ARM::PK_M; | 
|  | 674 | } | 
|  | 675 |  | 
|  | 676 | // Get Arch/CPU from args. | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 677 | static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch, | 
|  | 678 | llvm::StringRef &CPU, bool FromAs = false) { | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 679 | if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) | 
|  | 680 | CPU = A->getValue(); | 
|  | 681 | if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) | 
|  | 682 | Arch = A->getValue(); | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 683 | if (!FromAs) | 
|  | 684 | return; | 
|  | 685 |  | 
|  | 686 | for (const Arg *A : | 
|  | 687 | Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { | 
|  | 688 | StringRef Value = A->getValue(); | 
|  | 689 | if (Value.startswith("-mcpu=")) | 
|  | 690 | CPU = Value.substr(6); | 
|  | 691 | if (Value.startswith("-march=")) | 
|  | 692 | Arch = Value.substr(7); | 
|  | 693 | } | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 694 | } | 
|  | 695 |  | 
| Silviu Baranga | f9671dd | 2013-10-21 10:54:53 +0000 | [diff] [blame] | 696 | // Handle -mhwdiv=. | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 697 | // FIXME: Use ARMTargetParser. | 
| Silviu Baranga | f9671dd | 2013-10-21 10:54:53 +0000 | [diff] [blame] | 698 | static void getARMHWDivFeatures(const Driver &D, const Arg *A, | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 699 | const ArgList &Args, StringRef HWDiv, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 700 | std::vector<const char *> &Features) { | 
| Chandler Carruth | aa0caeb | 2015-08-30 02:16:36 +0000 | [diff] [blame] | 701 | unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv); | 
|  | 702 | if (!llvm::ARM::getHWDivFeatures(HWDivID, Features)) | 
| Silviu Baranga | f9671dd | 2013-10-21 10:54:53 +0000 | [diff] [blame] | 703 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
|  | 704 | } | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 705 |  | 
| Amara Emerson | 4cdb87b | 2013-10-01 10:20:54 +0000 | [diff] [blame] | 706 | // Handle -mfpu=. | 
| Amara Emerson | 4cdb87b | 2013-10-01 10:20:54 +0000 | [diff] [blame] | 707 | static void getARMFPUFeatures(const Driver &D, const Arg *A, | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 708 | const ArgList &Args, StringRef FPU, | 
| Amara Emerson | 4cdb87b | 2013-10-01 10:20:54 +0000 | [diff] [blame] | 709 | std::vector<const char *> &Features) { | 
| Chandler Carruth | aa0caeb | 2015-08-30 02:16:36 +0000 | [diff] [blame] | 710 | unsigned FPUID = llvm::ARM::parseFPU(FPU); | 
|  | 711 | if (!llvm::ARM::getFPUFeatures(FPUID, Features)) | 
| Chad Rosier | cfbfc58 | 2012-04-04 20:51:35 +0000 | [diff] [blame] | 712 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
|  | 713 | } | 
|  | 714 |  | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 715 | // Decode ARM features from string like +[no]featureA+[no]featureB+... | 
|  | 716 | static bool DecodeARMFeatures(const Driver &D, StringRef text, | 
|  | 717 | std::vector<const char *> &Features) { | 
|  | 718 | SmallVector<StringRef, 8> Split; | 
|  | 719 | text.split(Split, StringRef("+"), -1, false); | 
|  | 720 |  | 
|  | 721 | for (StringRef Feature : Split) { | 
|  | 722 | const char *FeatureName = llvm::ARM::getArchExtFeature(Feature); | 
|  | 723 | if (FeatureName) | 
|  | 724 | Features.push_back(FeatureName); | 
|  | 725 | else | 
|  | 726 | return false; | 
|  | 727 | } | 
|  | 728 | return true; | 
|  | 729 | } | 
|  | 730 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 731 | // Check if -march is valid by checking if it can be canonicalised and parsed. | 
|  | 732 | // getARMArch is used here instead of just checking the -march value in order | 
|  | 733 | // to handle -march=native correctly. | 
|  | 734 | static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args, | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 735 | llvm::StringRef ArchName, | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 736 | std::vector<const char *> &Features, | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 737 | const llvm::Triple &Triple) { | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 738 | std::pair<StringRef, StringRef> Split = ArchName.split("+"); | 
|  | 739 |  | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 740 | std::string MArch = arm::getARMArch(ArchName, Triple); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 741 | if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID || | 
|  | 742 | (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features))) | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 743 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 744 | } | 
|  | 745 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 746 | // Check -mcpu=. Needs ArchName to handle -mcpu=generic. | 
|  | 747 | static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args, | 
|  | 748 | llvm::StringRef CPUName, llvm::StringRef ArchName, | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 749 | std::vector<const char *> &Features, | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 750 | const llvm::Triple &Triple) { | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 751 | std::pair<StringRef, StringRef> Split = CPUName.split("+"); | 
|  | 752 |  | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 753 | std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 754 | if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() || | 
|  | 755 | (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features))) | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 756 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 757 | } | 
|  | 758 |  | 
| Akira Hatanaka | 9d99bb5 | 2015-08-26 19:00:11 +0000 | [diff] [blame] | 759 | static bool useAAPCSForMachO(const llvm::Triple &T) { | 
|  | 760 | // The backend is hardwired to assume AAPCS for M-class processors, ensure | 
|  | 761 | // the frontend matches that. | 
|  | 762 | return T.getEnvironment() == llvm::Triple::EABI || | 
|  | 763 | T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T); | 
|  | 764 | } | 
|  | 765 |  | 
| Asiri Rathnayake | 9e3c7cb | 2014-10-03 09:11:41 +0000 | [diff] [blame] | 766 | // Select the float ABI as determined by -msoft-float, -mhard-float, and | 
|  | 767 | // -mfloat-abi=. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 768 | arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) { | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 769 | const Driver &D = TC.getDriver(); | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 770 | const llvm::Triple &Triple = TC.getEffectiveTriple(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 771 | auto SubArch = getARMSubArchVersionNumber(Triple); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 772 | arm::FloatABI ABI = FloatABI::Invalid; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 773 | if (Arg *A = | 
|  | 774 | Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, | 
|  | 775 | options::OPT_mfloat_abi_EQ)) { | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 776 | if (A->getOption().matches(options::OPT_msoft_float)) { | 
|  | 777 | ABI = FloatABI::Soft; | 
|  | 778 | } else if (A->getOption().matches(options::OPT_mhard_float)) { | 
|  | 779 | ABI = FloatABI::Hard; | 
|  | 780 | } else { | 
|  | 781 | ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue()) | 
|  | 782 | .Case("soft", FloatABI::Soft) | 
|  | 783 | .Case("softfp", FloatABI::SoftFP) | 
|  | 784 | .Case("hard", FloatABI::Hard) | 
|  | 785 | .Default(FloatABI::Invalid); | 
|  | 786 | if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 787 | D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 788 | ABI = FloatABI::Soft; | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 789 | } | 
|  | 790 | } | 
| Akira Hatanaka | 9d99bb5 | 2015-08-26 19:00:11 +0000 | [diff] [blame] | 791 |  | 
|  | 792 | // It is incorrect to select hard float ABI on MachO platforms if the ABI is | 
|  | 793 | // "apcs-gnu". | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 794 | if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) && | 
|  | 795 | ABI == FloatABI::Hard) { | 
|  | 796 | D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args) | 
|  | 797 | << Triple.getArchName(); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 798 | } | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 799 | } | 
|  | 800 |  | 
|  | 801 | // If unspecified, choose the default based on the platform. | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 802 | if (ABI == FloatABI::Invalid) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 803 | switch (Triple.getOS()) { | 
| Bob Wilson | 6524dd3 | 2011-10-14 05:03:44 +0000 | [diff] [blame] | 804 | case llvm::Triple::Darwin: | 
|  | 805 | case llvm::Triple::MacOSX: | 
| Tim Northover | 756447a | 2015-10-30 16:30:36 +0000 | [diff] [blame] | 806 | case llvm::Triple::IOS: | 
|  | 807 | case llvm::Triple::TvOS: { | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 808 | // Darwin defaults to "softfp" for v6 and v7. | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 809 | ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 810 | ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI; | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 811 | break; | 
|  | 812 | } | 
| Tim Northover | 756447a | 2015-10-30 16:30:36 +0000 | [diff] [blame] | 813 | case llvm::Triple::WatchOS: | 
|  | 814 | ABI = FloatABI::Hard; | 
|  | 815 | break; | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 816 |  | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 817 | // FIXME: this is invalid for WindowsCE | 
|  | 818 | case llvm::Triple::Win32: | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 819 | ABI = FloatABI::Hard; | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 820 | break; | 
|  | 821 |  | 
| Rafael Espindola | 0f207ed | 2012-12-13 04:17:14 +0000 | [diff] [blame] | 822 | case llvm::Triple::FreeBSD: | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 823 | switch (Triple.getEnvironment()) { | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 824 | case llvm::Triple::GNUEABIHF: | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 825 | ABI = FloatABI::Hard; | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 826 | break; | 
|  | 827 | default: | 
|  | 828 | // FreeBSD defaults to soft float | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 829 | ABI = FloatABI::Soft; | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 830 | break; | 
|  | 831 | } | 
| Rafael Espindola | 0f207ed | 2012-12-13 04:17:14 +0000 | [diff] [blame] | 832 | break; | 
|  | 833 |  | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 834 | default: | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 835 | switch (Triple.getEnvironment()) { | 
| Jiangning Liu | 61b06cb | 2012-07-31 08:06:29 +0000 | [diff] [blame] | 836 | case llvm::Triple::GNUEABIHF: | 
| Rafael Espindola | 0fa6680 | 2016-06-24 21:35:06 +0000 | [diff] [blame] | 837 | case llvm::Triple::MuslEABIHF: | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 838 | case llvm::Triple::EABIHF: | 
|  | 839 | ABI = FloatABI::Hard; | 
| Jiangning Liu | 61b06cb | 2012-07-31 08:06:29 +0000 | [diff] [blame] | 840 | break; | 
| Bob Wilson | d1447c4 | 2011-02-04 17:59:28 +0000 | [diff] [blame] | 841 | case llvm::Triple::GNUEABI: | 
| Rafael Espindola | 0fa6680 | 2016-06-24 21:35:06 +0000 | [diff] [blame] | 842 | case llvm::Triple::MuslEABI: | 
| Bob Wilson | d1447c4 | 2011-02-04 17:59:28 +0000 | [diff] [blame] | 843 | case llvm::Triple::EABI: | 
|  | 844 | // EABI is always AAPCS, and if it was not marked 'hard', it's softfp | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 845 | ABI = FloatABI::SoftFP; | 
| Bob Wilson | d1447c4 | 2011-02-04 17:59:28 +0000 | [diff] [blame] | 846 | break; | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 847 | case llvm::Triple::Android: | 
|  | 848 | ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft; | 
| Chandler Carruth | c89aa9d | 2012-01-10 19:47:42 +0000 | [diff] [blame] | 849 | break; | 
| Bob Wilson | d1447c4 | 2011-02-04 17:59:28 +0000 | [diff] [blame] | 850 | default: | 
|  | 851 | // Assume "soft", but warn the user we are guessing. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 852 | if (Triple.isOSBinFormatMachO() && | 
|  | 853 | Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em) | 
| Tim Northover | 99694fe | 2016-04-13 17:08:51 +0000 | [diff] [blame] | 854 | ABI = FloatABI::Hard; | 
|  | 855 | else | 
|  | 856 | ABI = FloatABI::Soft; | 
|  | 857 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 858 | if (Triple.getOS() != llvm::Triple::UnknownOS || | 
|  | 859 | !Triple.isOSBinFormatMachO()) | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 860 | D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft"; | 
| Bob Wilson | d1447c4 | 2011-02-04 17:59:28 +0000 | [diff] [blame] | 861 | break; | 
|  | 862 | } | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 863 | } | 
|  | 864 | } | 
|  | 865 |  | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 866 | assert(ABI != FloatABI::Invalid && "must select an ABI"); | 
|  | 867 | return ABI; | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 868 | } | 
|  | 869 |  | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 870 | static void getARMTargetFeatures(const ToolChain &TC, | 
|  | 871 | const llvm::Triple &Triple, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 872 | const ArgList &Args, | 
| Rafael Espindola | 9c6fb0f | 2013-11-23 14:36:40 +0000 | [diff] [blame] | 873 | std::vector<const char *> &Features, | 
|  | 874 | bool ForAS) { | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 875 | const Driver &D = TC.getDriver(); | 
|  | 876 |  | 
| Akira Hatanaka | 3fb33a5 | 2015-07-07 06:42:05 +0000 | [diff] [blame] | 877 | bool KernelOrKext = | 
|  | 878 | Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 879 | arm::FloatABI ABI = arm::getARMFloatABI(TC, Args); | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 880 | const Arg *WaCPU = nullptr, *WaFPU = nullptr; | 
|  | 881 | const Arg *WaHDiv = nullptr, *WaArch = nullptr; | 
|  | 882 |  | 
| Nico Weber | 6e0ebae | 2015-04-29 21:16:40 +0000 | [diff] [blame] | 883 | if (!ForAS) { | 
|  | 884 | // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these | 
|  | 885 | // yet (it uses the -mfloat-abi and -msoft-float options), and it is | 
|  | 886 | // stripped out by the ARM target. We should probably pass this a new | 
|  | 887 | // -target-option, which is handled by the -cc1/-cc1as invocation. | 
|  | 888 | // | 
|  | 889 | // FIXME2:  For consistency, it would be ideal if we set up the target | 
|  | 890 | // machine state the same when using the frontend or the assembler. We don't | 
|  | 891 | // currently do that for the assembler, we pass the options directly to the | 
|  | 892 | // backend and never even instantiate the frontend TargetInfo. If we did, | 
|  | 893 | // and used its handleTargetFeatures hook, then we could ensure the | 
|  | 894 | // assembler and the frontend behave the same. | 
|  | 895 |  | 
|  | 896 | // Use software floating point operations? | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 897 | if (ABI == arm::FloatABI::Soft) | 
| Nico Weber | 6e0ebae | 2015-04-29 21:16:40 +0000 | [diff] [blame] | 898 | Features.push_back("+soft-float"); | 
|  | 899 |  | 
|  | 900 | // Use software floating point argument passing? | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 901 | if (ABI != arm::FloatABI::Hard) | 
| Nico Weber | 6e0ebae | 2015-04-29 21:16:40 +0000 | [diff] [blame] | 902 | Features.push_back("+soft-float-abi"); | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 903 | } else { | 
|  | 904 | // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down | 
|  | 905 | // to the assembler correctly. | 
|  | 906 | for (const Arg *A : | 
|  | 907 | Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { | 
|  | 908 | StringRef Value = A->getValue(); | 
|  | 909 | if (Value.startswith("-mfpu=")) { | 
|  | 910 | WaFPU = A; | 
|  | 911 | } else if (Value.startswith("-mcpu=")) { | 
|  | 912 | WaCPU = A; | 
|  | 913 | } else if (Value.startswith("-mhwdiv=")) { | 
|  | 914 | WaHDiv = A; | 
|  | 915 | } else if (Value.startswith("-march=")) { | 
|  | 916 | WaArch = A; | 
|  | 917 | } | 
|  | 918 | } | 
| Nico Weber | 6e0ebae | 2015-04-29 21:16:40 +0000 | [diff] [blame] | 919 | } | 
|  | 920 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 921 | // Check -march. ClangAs gives preference to -Wa,-march=. | 
|  | 922 | const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 923 | StringRef ArchName; | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 924 | if (WaArch) { | 
|  | 925 | if (ArchArg) | 
|  | 926 | D.Diag(clang::diag::warn_drv_unused_argument) | 
|  | 927 | << ArchArg->getAsString(Args); | 
|  | 928 | ArchName = StringRef(WaArch->getValue()).substr(7); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 929 | checkARMArchName(D, WaArch, Args, ArchName, Features, Triple); | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 930 | // FIXME: Set Arch. | 
|  | 931 | D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args); | 
|  | 932 | } else if (ArchArg) { | 
|  | 933 | ArchName = ArchArg->getValue(); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 934 | checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 935 | } | 
|  | 936 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 937 | // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=. | 
|  | 938 | const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 939 | StringRef CPUName; | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 940 | if (WaCPU) { | 
|  | 941 | if (CPUArg) | 
|  | 942 | D.Diag(clang::diag::warn_drv_unused_argument) | 
|  | 943 | << CPUArg->getAsString(Args); | 
|  | 944 | CPUName = StringRef(WaCPU->getValue()).substr(6); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 945 | checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple); | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 946 | } else if (CPUArg) { | 
|  | 947 | CPUName = CPUArg->getValue(); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 948 | checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 949 | } | 
| John Brawn | a95c1a8 | 2015-05-08 12:52:18 +0000 | [diff] [blame] | 950 |  | 
| Renato Golin | 23459c6 | 2015-07-30 16:40:17 +0000 | [diff] [blame] | 951 | // Add CPU features for generic CPUs | 
|  | 952 | if (CPUName == "native") { | 
|  | 953 | llvm::StringMap<bool> HostFeatures; | 
|  | 954 | if (llvm::sys::getHostCPUFeatures(HostFeatures)) | 
|  | 955 | for (auto &F : HostFeatures) | 
|  | 956 | Features.push_back( | 
|  | 957 | Args.MakeArgString((F.second ? "+" : "-") + F.first())); | 
|  | 958 | } | 
|  | 959 |  | 
|  | 960 | // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=. | 
|  | 961 | const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ); | 
|  | 962 | if (WaFPU) { | 
|  | 963 | if (FPUArg) | 
|  | 964 | D.Diag(clang::diag::warn_drv_unused_argument) | 
|  | 965 | << FPUArg->getAsString(Args); | 
|  | 966 | getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6), | 
|  | 967 | Features); | 
|  | 968 | } else if (FPUArg) { | 
|  | 969 | getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features); | 
|  | 970 | } | 
|  | 971 |  | 
|  | 972 | // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=. | 
|  | 973 | const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ); | 
|  | 974 | if (WaHDiv) { | 
|  | 975 | if (HDivArg) | 
|  | 976 | D.Diag(clang::diag::warn_drv_unused_argument) | 
|  | 977 | << HDivArg->getAsString(Args); | 
|  | 978 | getARMHWDivFeatures(D, WaHDiv, Args, | 
|  | 979 | StringRef(WaHDiv->getValue()).substr(8), Features); | 
|  | 980 | } else if (HDivArg) | 
|  | 981 | getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features); | 
|  | 982 |  | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 983 | // Setting -msoft-float effectively disables NEON because of the GCC | 
|  | 984 | // implementation, although the same isn't true of VFP or VFP3. | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 985 | if (ABI == arm::FloatABI::Soft) { | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 986 | Features.push_back("-neon"); | 
| Amara Emerson | ecbe18e | 2014-02-12 10:22:35 +0000 | [diff] [blame] | 987 | // Also need to explicitly disable features which imply NEON. | 
|  | 988 | Features.push_back("-crypto"); | 
|  | 989 | } | 
| Bernard Ogden | 18b5701 | 2013-10-29 09:47:51 +0000 | [diff] [blame] | 990 |  | 
| Eric Christopher | 269c2a2 | 2015-04-04 03:34:43 +0000 | [diff] [blame] | 991 | // En/disable crc code generation. | 
|  | 992 | if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) { | 
| Bernard Ogden | 18b5701 | 2013-10-29 09:47:51 +0000 | [diff] [blame] | 993 | if (A->getOption().matches(options::OPT_mcrc)) | 
|  | 994 | Features.push_back("+crc"); | 
|  | 995 | else | 
|  | 996 | Features.push_back("-crc"); | 
|  | 997 | } | 
| Vladimir Sukharev | c6dab75 | 2015-05-14 08:25:18 +0000 | [diff] [blame] | 998 |  | 
| Akira Hatanaka | c269482 | 2015-07-07 08:28:42 +0000 | [diff] [blame] | 999 | // Look for the last occurrence of -mlong-calls or -mno-long-calls. If | 
|  | 1000 | // neither options are specified, see if we are compiling for kernel/kext and | 
|  | 1001 | // decide whether to pass "+long-calls" based on the OS and its version. | 
| Akira Hatanaka | 3fb33a5 | 2015-07-07 06:42:05 +0000 | [diff] [blame] | 1002 | if (Arg *A = Args.getLastArg(options::OPT_mlong_calls, | 
|  | 1003 | options::OPT_mno_long_calls)) { | 
|  | 1004 | if (A->getOption().matches(options::OPT_mlong_calls)) | 
|  | 1005 | Features.push_back("+long-calls"); | 
| Tim Northover | 756447a | 2015-10-30 16:30:36 +0000 | [diff] [blame] | 1006 | } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) && | 
|  | 1007 | !Triple.isWatchOS()) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1008 | Features.push_back("+long-calls"); | 
| Akira Hatanaka | 3fb33a5 | 2015-07-07 06:42:05 +0000 | [diff] [blame] | 1009 | } | 
| Akira Hatanaka | 580efb2 | 2015-07-16 00:43:00 +0000 | [diff] [blame] | 1010 |  | 
| Akira Hatanaka | 7651dd8 | 2015-07-28 22:26:45 +0000 | [diff] [blame] | 1011 | // Kernel code has more strict alignment requirements. | 
|  | 1012 | if (KernelOrKext) | 
|  | 1013 | Features.push_back("+strict-align"); | 
|  | 1014 | else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, | 
|  | 1015 | options::OPT_munaligned_access)) { | 
|  | 1016 | if (A->getOption().matches(options::OPT_munaligned_access)) { | 
|  | 1017 | // No v6M core supports unaligned memory access (v6M ARM ARM A3.2). | 
|  | 1018 | if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) | 
|  | 1019 | D.Diag(diag::err_target_unsupported_unaligned) << "v6m"; | 
| Bradley Smith | f4affc1 | 2016-03-03 13:52:22 +0000 | [diff] [blame] | 1020 | // v8M Baseline follows on from v6M, so doesn't support unaligned memory | 
|  | 1021 | // access either. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1022 | else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline) | 
| Bradley Smith | f4affc1 | 2016-03-03 13:52:22 +0000 | [diff] [blame] | 1023 | D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base"; | 
| Akira Hatanaka | 7651dd8 | 2015-07-28 22:26:45 +0000 | [diff] [blame] | 1024 | } else | 
|  | 1025 | Features.push_back("+strict-align"); | 
|  | 1026 | } else { | 
|  | 1027 | // Assume pre-ARMv6 doesn't support unaligned accesses. | 
|  | 1028 | // | 
|  | 1029 | // ARMv6 may or may not support unaligned accesses depending on the | 
|  | 1030 | // SCTLR.U bit, which is architecture-specific. We assume ARMv6 | 
|  | 1031 | // Darwin and NetBSD targets support unaligned accesses, and others don't. | 
|  | 1032 | // | 
|  | 1033 | // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit | 
|  | 1034 | // which raises an alignment fault on unaligned accesses. Linux | 
|  | 1035 | // defaults this bit to 0 and handles it as a system-wide (not | 
|  | 1036 | // per-process) setting. It is therefore safe to assume that ARMv7+ | 
|  | 1037 | // Linux targets support unaligned accesses. The same goes for NaCl. | 
|  | 1038 | // | 
|  | 1039 | // The above behavior is consistent with GCC. | 
|  | 1040 | int VersionNum = getARMSubArchVersionNumber(Triple); | 
|  | 1041 | if (Triple.isOSDarwin() || Triple.isOSNetBSD()) { | 
| Alexandros Lamprineas | eda554a | 2015-10-05 12:45:10 +0000 | [diff] [blame] | 1042 | if (VersionNum < 6 || | 
|  | 1043 | Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m) | 
| Akira Hatanaka | 7651dd8 | 2015-07-28 22:26:45 +0000 | [diff] [blame] | 1044 | Features.push_back("+strict-align"); | 
|  | 1045 | } else if (Triple.isOSLinux() || Triple.isOSNaCl()) { | 
|  | 1046 | if (VersionNum < 7) | 
|  | 1047 | Features.push_back("+strict-align"); | 
|  | 1048 | } else | 
|  | 1049 | Features.push_back("+strict-align"); | 
|  | 1050 | } | 
|  | 1051 |  | 
| Akira Hatanaka | 0a23fac | 2015-07-21 01:41:08 +0000 | [diff] [blame] | 1052 | // llvm does not support reserving registers in general. There is support | 
|  | 1053 | // for reserving r9 on ARM though (defined as a platform-specific register | 
|  | 1054 | // in ARM EABI). | 
|  | 1055 | if (Args.hasArg(options::OPT_ffixed_r9)) | 
|  | 1056 | Features.push_back("+reserve-r9"); | 
|  | 1057 |  | 
| Dimitry Andric | 0810739 | 2016-01-06 07:42:18 +0000 | [diff] [blame] | 1058 | // The kext linker doesn't know how to deal with movw/movt. | 
|  | 1059 | if (KernelOrKext || Args.hasArg(options::OPT_mno_movt)) | 
| Akira Hatanaka | 580efb2 | 2015-07-16 00:43:00 +0000 | [diff] [blame] | 1060 | Features.push_back("+no-movt"); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1061 | } | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1062 |  | 
| Saleem Abdulrasool | ce63ce9 | 2015-09-19 18:19:44 +0000 | [diff] [blame] | 1063 | void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args, | 
|  | 1064 | ArgStringList &CmdArgs, bool KernelOrKext) const { | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1065 | // Select the ABI to use. | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1066 | // FIXME: Support -meabi. | 
| Eric Christopher | 5227653 | 2014-12-10 22:58:34 +0000 | [diff] [blame] | 1067 | // FIXME: Parts of this are duplicated in the backend, unify this somehow. | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 1068 | const char *ABIName = nullptr; | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1069 | if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 1070 | ABIName = A->getValue(); | 
| Tim Northover | e5c6f4c | 2014-05-22 12:54:30 +0000 | [diff] [blame] | 1071 | } else if (Triple.isOSBinFormatMachO()) { | 
| Akira Hatanaka | 9d99bb5 | 2015-08-26 19:00:11 +0000 | [diff] [blame] | 1072 | if (useAAPCSForMachO(Triple)) { | 
| Daniel Dunbar | 5f18f6e | 2012-10-22 18:30:51 +0000 | [diff] [blame] | 1073 | ABIName = "aapcs"; | 
| Tim Northover | d88ecb3 | 2016-01-27 19:32:40 +0000 | [diff] [blame] | 1074 | } else if (Triple.isWatchABI()) { | 
| Tim Northover | 756447a | 2015-10-30 16:30:36 +0000 | [diff] [blame] | 1075 | ABIName = "aapcs16"; | 
| Daniel Dunbar | 5f18f6e | 2012-10-22 18:30:51 +0000 | [diff] [blame] | 1076 | } else { | 
|  | 1077 | ABIName = "apcs-gnu"; | 
|  | 1078 | } | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 1079 | } else if (Triple.isOSWindows()) { | 
|  | 1080 | // FIXME: this is invalid for WindowsCE | 
|  | 1081 | ABIName = "aapcs"; | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1082 | } else { | 
|  | 1083 | // Select the default based on the platform. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1084 | switch (Triple.getEnvironment()) { | 
| Logan Chien | c6fd820 | 2012-09-02 09:30:11 +0000 | [diff] [blame] | 1085 | case llvm::Triple::Android: | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1086 | case llvm::Triple::GNUEABI: | 
| Jiangning Liu | 61b06cb | 2012-07-31 08:06:29 +0000 | [diff] [blame] | 1087 | case llvm::Triple::GNUEABIHF: | 
| Rafael Espindola | 0fa6680 | 2016-06-24 21:35:06 +0000 | [diff] [blame] | 1088 | case llvm::Triple::MuslEABI: | 
|  | 1089 | case llvm::Triple::MuslEABIHF: | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1090 | ABIName = "aapcs-linux"; | 
|  | 1091 | break; | 
| Joerg Sonnenberger | d75a1f8 | 2013-12-16 19:16:04 +0000 | [diff] [blame] | 1092 | case llvm::Triple::EABIHF: | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1093 | case llvm::Triple::EABI: | 
|  | 1094 | ABIName = "aapcs"; | 
|  | 1095 | break; | 
| Oliver Stannard | ec8b6b3 | 2014-09-04 10:38:53 +0000 | [diff] [blame] | 1096 | default: | 
| Eric Christopher | 7a8b31d | 2014-12-18 02:08:51 +0000 | [diff] [blame] | 1097 | if (Triple.getOS() == llvm::Triple::NetBSD) | 
|  | 1098 | ABIName = "apcs-gnu"; | 
|  | 1099 | else | 
|  | 1100 | ABIName = "aapcs"; | 
| Oliver Stannard | ec8b6b3 | 2014-09-04 10:38:53 +0000 | [diff] [blame] | 1101 | break; | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1102 | } | 
|  | 1103 | } | 
|  | 1104 | CmdArgs.push_back("-target-abi"); | 
|  | 1105 | CmdArgs.push_back(ABIName); | 
|  | 1106 |  | 
| Anton Korobeynikov | a29e462 | 2012-04-09 13:38:30 +0000 | [diff] [blame] | 1107 | // Determine floating point ABI from the options & target defaults. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1108 | arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 1109 | if (ABI == arm::FloatABI::Soft) { | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 1110 | // Floating point operations and argument passing are soft. | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 1111 | // FIXME: This changes CPP defines, we need -target-soft-float. | 
| Daniel Dunbar | a74f8ff | 2009-11-30 08:42:00 +0000 | [diff] [blame] | 1112 | CmdArgs.push_back("-msoft-float"); | 
| Daniel Dunbar | 6cc525b | 2009-12-08 19:49:51 +0000 | [diff] [blame] | 1113 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1114 | CmdArgs.push_back("soft"); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 1115 | } else if (ABI == arm::FloatABI::SoftFP) { | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 1116 | // Floating point operations are hard, but argument passing is soft. | 
| Daniel Dunbar | 6cc525b | 2009-12-08 19:49:51 +0000 | [diff] [blame] | 1117 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1118 | CmdArgs.push_back("soft"); | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 1119 | } else { | 
|  | 1120 | // Floating point operations and argument passing are hard. | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 1121 | assert(ABI == arm::FloatABI::Hard && "Invalid float abi!"); | 
| Daniel Dunbar | 6cc525b | 2009-12-08 19:49:51 +0000 | [diff] [blame] | 1122 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1123 | CmdArgs.push_back("hard"); | 
| Daniel Dunbar | 7848592 | 2009-09-10 23:00:09 +0000 | [diff] [blame] | 1124 | } | 
| Daniel Dunbar | 893d475 | 2009-12-19 04:15:38 +0000 | [diff] [blame] | 1125 |  | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1126 | // Forward the -mglobal-merge option for explicit control over the pass. | 
| Chad Rosier | ba3df1d | 2011-08-26 00:26:29 +0000 | [diff] [blame] | 1127 | if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, | 
|  | 1128 | options::OPT_mno_global_merge)) { | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1129 | CmdArgs.push_back("-backend-option"); | 
| Chad Rosier | ba3df1d | 2011-08-26 00:26:29 +0000 | [diff] [blame] | 1130 | if (A->getOption().matches(options::OPT_mno_global_merge)) | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1131 | CmdArgs.push_back("-arm-global-merge=false"); | 
|  | 1132 | else | 
|  | 1133 | CmdArgs.push_back("-arm-global-merge=true"); | 
| Chad Rosier | ba3df1d | 2011-08-26 00:26:29 +0000 | [diff] [blame] | 1134 | } | 
| Chad Rosier | f1985d2 | 2012-05-16 20:40:09 +0000 | [diff] [blame] | 1135 |  | 
| Bob Wilson | 9c8af45 | 2013-04-11 18:53:25 +0000 | [diff] [blame] | 1136 | if (!Args.hasFlag(options::OPT_mimplicit_float, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1137 | options::OPT_mno_implicit_float, true)) | 
| Chad Rosier | f1985d2 | 2012-05-16 20:40:09 +0000 | [diff] [blame] | 1138 | CmdArgs.push_back("-no-implicit-float"); | 
| Daniel Dunbar | 0f5c542 | 2009-09-10 04:57:17 +0000 | [diff] [blame] | 1139 | } | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 1140 | // ARM tools end. | 
| Daniel Dunbar | 0f5c542 | 2009-09-10 04:57:17 +0000 | [diff] [blame] | 1141 |  | 
| Tim Northover | 573cbee | 2014-05-24 12:52:07 +0000 | [diff] [blame] | 1142 | /// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are | 
|  | 1143 | /// targeting. | 
|  | 1144 | static std::string getAArch64TargetCPU(const ArgList &Args) { | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 1145 | Arg *A; | 
|  | 1146 | std::string CPU; | 
|  | 1147 | // If we have -mtune or -mcpu, use that. | 
|  | 1148 | if ((A = Args.getLastArg(options::OPT_mtune_EQ))) { | 
| Gabor Ballabas | a24a1a4 | 2015-07-20 11:28:20 +0000 | [diff] [blame] | 1149 | CPU = StringRef(A->getValue()).lower(); | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 1150 | } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) { | 
| Renato Golin | 4045f66 | 2015-05-08 15:44:36 +0000 | [diff] [blame] | 1151 | StringRef Mcpu = A->getValue(); | 
| Gabor Ballabas | 726ce7f | 2015-06-12 17:33:37 +0000 | [diff] [blame] | 1152 | CPU = Mcpu.split("+").first.lower(); | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1153 | } | 
|  | 1154 |  | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 1155 | // Handle CPU name is 'native'. | 
|  | 1156 | if (CPU == "native") | 
|  | 1157 | return llvm::sys::getHostCPUName(); | 
|  | 1158 | else if (CPU.size()) | 
|  | 1159 | return CPU; | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1160 |  | 
| James Molloy | 9b1586b | 2014-04-17 12:51:17 +0000 | [diff] [blame] | 1161 | // Make sure we pick "cyclone" if -arch is used. | 
|  | 1162 | // FIXME: Should this be picked by checking the target triple instead? | 
|  | 1163 | if (Args.getLastArg(options::OPT_arch)) | 
|  | 1164 | return "cyclone"; | 
|  | 1165 |  | 
|  | 1166 | return "generic"; | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1167 | } | 
|  | 1168 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1169 | void Clang::AddAArch64TargetArgs(const ArgList &Args, | 
| Tim Northover | 573cbee | 2014-05-24 12:52:07 +0000 | [diff] [blame] | 1170 | ArgStringList &CmdArgs) const { | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 1171 | const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1172 |  | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1173 | if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) || | 
|  | 1174 | Args.hasArg(options::OPT_mkernel) || | 
|  | 1175 | Args.hasArg(options::OPT_fapple_kext)) | 
|  | 1176 | CmdArgs.push_back("-disable-red-zone"); | 
|  | 1177 |  | 
|  | 1178 | if (!Args.hasFlag(options::OPT_mimplicit_float, | 
|  | 1179 | options::OPT_mno_implicit_float, true)) | 
|  | 1180 | CmdArgs.push_back("-no-implicit-float"); | 
|  | 1181 |  | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 1182 | const char *ABIName = nullptr; | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1183 | if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) | 
|  | 1184 | ABIName = A->getValue(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1185 | else if (Triple.isOSDarwin()) | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1186 | ABIName = "darwinpcs"; | 
|  | 1187 | else | 
|  | 1188 | ABIName = "aapcs"; | 
|  | 1189 |  | 
|  | 1190 | CmdArgs.push_back("-target-abi"); | 
|  | 1191 | CmdArgs.push_back(ABIName); | 
|  | 1192 |  | 
| Bradley Smith | 9ff6433 | 2014-10-13 10:16:06 +0000 | [diff] [blame] | 1193 | if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769, | 
|  | 1194 | options::OPT_mno_fix_cortex_a53_835769)) { | 
|  | 1195 | CmdArgs.push_back("-backend-option"); | 
|  | 1196 | if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769)) | 
|  | 1197 | CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1"); | 
|  | 1198 | else | 
|  | 1199 | CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0"); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 1200 | } else if (Triple.isAndroid()) { | 
| Bradley Smith | 04ee8aa | 2014-10-16 16:35:14 +0000 | [diff] [blame] | 1201 | // Enabled A53 errata (835769) workaround by default on android | 
|  | 1202 | CmdArgs.push_back("-backend-option"); | 
|  | 1203 | CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1"); | 
| Bradley Smith | 9ff6433 | 2014-10-13 10:16:06 +0000 | [diff] [blame] | 1204 | } | 
|  | 1205 |  | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1206 | // Forward the -mglobal-merge option for explicit control over the pass. | 
| Bob Wilson | bdd2b3c | 2014-05-29 19:43:02 +0000 | [diff] [blame] | 1207 | if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge, | 
|  | 1208 | options::OPT_mno_global_merge)) { | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1209 | CmdArgs.push_back("-backend-option"); | 
| Bob Wilson | bdd2b3c | 2014-05-29 19:43:02 +0000 | [diff] [blame] | 1210 | if (A->getOption().matches(options::OPT_mno_global_merge)) | 
| Ahmed Bougacha | 256a869 | 2015-04-11 00:10:44 +0000 | [diff] [blame] | 1211 | CmdArgs.push_back("-aarch64-global-merge=false"); | 
|  | 1212 | else | 
|  | 1213 | CmdArgs.push_back("-aarch64-global-merge=true"); | 
| Bob Wilson | bdd2b3c | 2014-05-29 19:43:02 +0000 | [diff] [blame] | 1214 | } | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 1215 | } | 
|  | 1216 |  | 
| Simon Atanasyan | 3b7589a | 2012-04-07 22:09:23 +0000 | [diff] [blame] | 1217 | // Get CPU and ABI names. They are not independent | 
|  | 1218 | // so we have to calculate them together. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1219 | void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple, | 
|  | 1220 | StringRef &CPUName, StringRef &ABIName) { | 
| Simon Atanasyan | 1a3665b6 | 2014-01-27 13:59:04 +0000 | [diff] [blame] | 1221 | const char *DefMips32CPU = "mips32r2"; | 
|  | 1222 | const char *DefMips64CPU = "mips64r2"; | 
| Akira Hatanaka | 37fd9e9 | 2011-09-26 21:07:52 +0000 | [diff] [blame] | 1223 |  | 
| Daniel Sanders | 2bf1366 | 2014-07-10 14:40:57 +0000 | [diff] [blame] | 1224 | // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the | 
|  | 1225 | // default for mips64(el)?-img-linux-gnu. | 
|  | 1226 | if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies && | 
|  | 1227 | Triple.getEnvironment() == llvm::Triple::GNU) { | 
|  | 1228 | DefMips32CPU = "mips32r6"; | 
|  | 1229 | DefMips64CPU = "mips64r6"; | 
|  | 1230 | } | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 1231 |  | 
| Petar Jovanovic | 9fe32cd | 2015-07-17 12:57:30 +0000 | [diff] [blame] | 1232 | // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android). | 
| Petar Jovanovic | 009494f | 2016-05-17 10:46:10 +0000 | [diff] [blame] | 1233 | if (Triple.isAndroid()) { | 
|  | 1234 | DefMips32CPU = "mips32"; | 
| Petar Jovanovic | 9fe32cd | 2015-07-17 12:57:30 +0000 | [diff] [blame] | 1235 | DefMips64CPU = "mips64r6"; | 
| Petar Jovanovic | 009494f | 2016-05-17 10:46:10 +0000 | [diff] [blame] | 1236 | } | 
| Daniel Sanders | 2bf1366 | 2014-07-10 14:40:57 +0000 | [diff] [blame] | 1237 |  | 
| Brad Smith | ba26f58 | 2015-01-06 02:53:17 +0000 | [diff] [blame] | 1238 | // MIPS3 is the default for mips64*-unknown-openbsd. | 
|  | 1239 | if (Triple.getOS() == llvm::Triple::OpenBSD) | 
|  | 1240 | DefMips64CPU = "mips3"; | 
|  | 1241 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1242 | if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ)) | 
| Simon Atanasyan | e0cc7c7 | 2013-10-09 12:12:24 +0000 | [diff] [blame] | 1243 | CPUName = A->getValue(); | 
| Simon Atanasyan | 464a7f7 | 2012-09-10 08:32:41 +0000 | [diff] [blame] | 1244 |  | 
| Simon Atanasyan | 4938ddb | 2013-04-21 13:30:10 +0000 | [diff] [blame] | 1245 | if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 1246 | ABIName = A->getValue(); | 
| Simon Atanasyan | 4938ddb | 2013-04-21 13:30:10 +0000 | [diff] [blame] | 1247 | // Convert a GNU style Mips ABI name to the name | 
|  | 1248 | // accepted by LLVM Mips backend. | 
|  | 1249 | ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1250 | .Case("32", "o32") | 
|  | 1251 | .Case("64", "n64") | 
|  | 1252 | .Default(ABIName); | 
| Simon Atanasyan | 4938ddb | 2013-04-21 13:30:10 +0000 | [diff] [blame] | 1253 | } | 
| Simon Atanasyan | 464a7f7 | 2012-09-10 08:32:41 +0000 | [diff] [blame] | 1254 |  | 
|  | 1255 | // Setup default CPU and ABI names. | 
|  | 1256 | if (CPUName.empty() && ABIName.empty()) { | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1257 | switch (Triple.getArch()) { | 
| Simon Atanasyan | 464a7f7 | 2012-09-10 08:32:41 +0000 | [diff] [blame] | 1258 | default: | 
|  | 1259 | llvm_unreachable("Unexpected triple arch name"); | 
|  | 1260 | case llvm::Triple::mips: | 
|  | 1261 | case llvm::Triple::mipsel: | 
|  | 1262 | CPUName = DefMips32CPU; | 
|  | 1263 | break; | 
|  | 1264 | case llvm::Triple::mips64: | 
|  | 1265 | case llvm::Triple::mips64el: | 
|  | 1266 | CPUName = DefMips64CPU; | 
|  | 1267 | break; | 
|  | 1268 | } | 
|  | 1269 | } | 
|  | 1270 |  | 
| Daniel Sanders | 0ca86fe | 2016-06-06 12:02:21 +0000 | [diff] [blame] | 1271 | if (ABIName.empty() && | 
|  | 1272 | (Triple.getVendor() == llvm::Triple::MipsTechnologies || | 
|  | 1273 | Triple.getVendor() == llvm::Triple::ImaginationTechnologies)) { | 
|  | 1274 | ABIName = llvm::StringSwitch<const char *>(CPUName) | 
|  | 1275 | .Case("mips1", "o32") | 
|  | 1276 | .Case("mips2", "o32") | 
|  | 1277 | .Case("mips3", "n64") | 
|  | 1278 | .Case("mips4", "n64") | 
|  | 1279 | .Case("mips5", "n64") | 
|  | 1280 | .Case("mips32", "o32") | 
|  | 1281 | .Case("mips32r2", "o32") | 
|  | 1282 | .Case("mips32r3", "o32") | 
|  | 1283 | .Case("mips32r5", "o32") | 
|  | 1284 | .Case("mips32r6", "o32") | 
|  | 1285 | .Case("mips64", "n64") | 
|  | 1286 | .Case("mips64r2", "n64") | 
|  | 1287 | .Case("mips64r3", "n64") | 
|  | 1288 | .Case("mips64r5", "n64") | 
|  | 1289 | .Case("mips64r6", "n64") | 
|  | 1290 | .Case("octeon", "n64") | 
|  | 1291 | .Case("p5600", "o32") | 
|  | 1292 | .Default(""); | 
|  | 1293 | } | 
|  | 1294 |  | 
| Simon Atanasyan | a42a84e | 2014-07-02 13:20:36 +0000 | [diff] [blame] | 1295 | if (ABIName.empty()) { | 
|  | 1296 | // Deduce ABI name from the target triple. | 
|  | 1297 | if (Triple.getArch() == llvm::Triple::mips || | 
|  | 1298 | Triple.getArch() == llvm::Triple::mipsel) | 
|  | 1299 | ABIName = "o32"; | 
|  | 1300 | else | 
|  | 1301 | ABIName = "n64"; | 
|  | 1302 | } | 
|  | 1303 |  | 
|  | 1304 | if (CPUName.empty()) { | 
| Simon Atanasyan | 464a7f7 | 2012-09-10 08:32:41 +0000 | [diff] [blame] | 1305 | // Deduce CPU name from ABI name. | 
|  | 1306 | CPUName = llvm::StringSwitch<const char *>(ABIName) | 
| Daniel Sanders | 07c8654 | 2016-05-27 14:30:23 +0000 | [diff] [blame] | 1307 | .Case("o32", DefMips32CPU) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1308 | .Cases("n32", "n64", DefMips64CPU) | 
|  | 1309 | .Default(""); | 
| Simon Atanasyan | 464a7f7 | 2012-09-10 08:32:41 +0000 | [diff] [blame] | 1310 | } | 
| Simon Atanasyan | c92717f | 2014-07-23 09:27:10 +0000 | [diff] [blame] | 1311 |  | 
|  | 1312 | // FIXME: Warn on inconsistent use of -march and -mabi. | 
| Simon Atanasyan | 3b7589a | 2012-04-07 22:09:23 +0000 | [diff] [blame] | 1313 | } | 
|  | 1314 |  | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 1315 | std::string mips::getMipsABILibSuffix(const ArgList &Args, | 
|  | 1316 | const llvm::Triple &Triple) { | 
|  | 1317 | StringRef CPUName, ABIName; | 
|  | 1318 | tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); | 
|  | 1319 | return llvm::StringSwitch<std::string>(ABIName) | 
|  | 1320 | .Case("o32", "") | 
|  | 1321 | .Case("n32", "32") | 
|  | 1322 | .Case("n64", "64"); | 
|  | 1323 | } | 
|  | 1324 |  | 
| Simon Atanasyan | 0da400c | 2013-02-27 14:55:49 +0000 | [diff] [blame] | 1325 | // Convert ABI name to the GNU tools acceptable variant. | 
|  | 1326 | static StringRef getGnuCompatibleMipsABIName(StringRef ABI) { | 
|  | 1327 | return llvm::StringSwitch<llvm::StringRef>(ABI) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1328 | .Case("o32", "32") | 
|  | 1329 | .Case("n64", "64") | 
|  | 1330 | .Default(ABI); | 
| Simon Atanasyan | 0da400c | 2013-02-27 14:55:49 +0000 | [diff] [blame] | 1331 | } | 
|  | 1332 |  | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1333 | // Select the MIPS float ABI as determined by -msoft-float, -mhard-float, | 
|  | 1334 | // and -mfloat-abi=. | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1335 | static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) { | 
|  | 1336 | mips::FloatABI ABI = mips::FloatABI::Invalid; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1337 | if (Arg *A = | 
|  | 1338 | Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, | 
|  | 1339 | options::OPT_mfloat_abi_EQ)) { | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1340 | if (A->getOption().matches(options::OPT_msoft_float)) | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1341 | ABI = mips::FloatABI::Soft; | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1342 | else if (A->getOption().matches(options::OPT_mhard_float)) | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1343 | ABI = mips::FloatABI::Hard; | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1344 | else { | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1345 | ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue()) | 
|  | 1346 | .Case("soft", mips::FloatABI::Soft) | 
|  | 1347 | .Case("hard", mips::FloatABI::Hard) | 
|  | 1348 | .Default(mips::FloatABI::Invalid); | 
|  | 1349 | if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) { | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1350 | D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1351 | ABI = mips::FloatABI::Hard; | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1352 | } | 
|  | 1353 | } | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1354 | } | 
|  | 1355 |  | 
|  | 1356 | // If unspecified, choose the default based on the platform. | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1357 | if (ABI == mips::FloatABI::Invalid) { | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1358 | // Assume "hard", because it's a default value used by gcc. | 
|  | 1359 | // When we start to recognize specific target MIPS processors, | 
|  | 1360 | // we will be able to select the default more correctly. | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1361 | ABI = mips::FloatABI::Hard; | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1362 | } | 
|  | 1363 |  | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1364 | assert(ABI != mips::FloatABI::Invalid && "must select an ABI"); | 
|  | 1365 | return ABI; | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1366 | } | 
|  | 1367 |  | 
| Simon Atanasyan | 9b1932d | 2012-07-05 18:51:43 +0000 | [diff] [blame] | 1368 | static void AddTargetFeature(const ArgList &Args, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1369 | std::vector<const char *> &Features, | 
|  | 1370 | OptSpecifier OnOpt, OptSpecifier OffOpt, | 
| Simon Atanasyan | 9b1932d | 2012-07-05 18:51:43 +0000 | [diff] [blame] | 1371 | StringRef FeatureName) { | 
|  | 1372 | if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) { | 
| Simon Atanasyan | 9b1932d | 2012-07-05 18:51:43 +0000 | [diff] [blame] | 1373 | if (A->getOption().matches(OnOpt)) | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1374 | Features.push_back(Args.MakeArgString("+" + FeatureName)); | 
| Simon Atanasyan | 9b1932d | 2012-07-05 18:51:43 +0000 | [diff] [blame] | 1375 | else | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1376 | Features.push_back(Args.MakeArgString("-" + FeatureName)); | 
| Simon Atanasyan | 9b1932d | 2012-07-05 18:51:43 +0000 | [diff] [blame] | 1377 | } | 
|  | 1378 | } | 
|  | 1379 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1380 | static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple, | 
|  | 1381 | const ArgList &Args, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1382 | std::vector<const char *> &Features) { | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1383 | StringRef CPUName; | 
|  | 1384 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 1385 | mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1386 | ABIName = getGnuCompatibleMipsABIName(ABIName); | 
|  | 1387 |  | 
| Daniel Sanders | feb6130 | 2014-08-08 15:47:17 +0000 | [diff] [blame] | 1388 | AddTargetFeature(Args, Features, options::OPT_mno_abicalls, | 
|  | 1389 | options::OPT_mabicalls, "noabicalls"); | 
| Daniel Sanders | e805f44 | 2014-08-08 13:44:50 +0000 | [diff] [blame] | 1390 |  | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1391 | mips::FloatABI FloatABI = getMipsFloatABI(D, Args); | 
|  | 1392 | if (FloatABI == mips::FloatABI::Soft) { | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1393 | // FIXME: Note, this is a hack. We need to pass the selected float | 
|  | 1394 | // mode to the MipsTargetInfoBase to define appropriate macros there. | 
|  | 1395 | // Now it is the only method. | 
|  | 1396 | Features.push_back("+soft-float"); | 
|  | 1397 | } | 
|  | 1398 |  | 
| Simon Atanasyan | 22127ce | 2013-09-24 09:09:16 +0000 | [diff] [blame] | 1399 | if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) { | 
| Matheus Almeida | 602bff3 | 2014-05-07 16:16:07 +0000 | [diff] [blame] | 1400 | StringRef Val = StringRef(A->getValue()); | 
| Petar Jovanovic | 1dbc317 | 2015-04-14 12:49:08 +0000 | [diff] [blame] | 1401 | if (Val == "2008") { | 
|  | 1402 | if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008) | 
|  | 1403 | Features.push_back("+nan2008"); | 
|  | 1404 | else { | 
|  | 1405 | Features.push_back("-nan2008"); | 
|  | 1406 | D.Diag(diag::warn_target_unsupported_nan2008) << CPUName; | 
|  | 1407 | } | 
|  | 1408 | } else if (Val == "legacy") { | 
|  | 1409 | if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy) | 
|  | 1410 | Features.push_back("-nan2008"); | 
|  | 1411 | else { | 
|  | 1412 | Features.push_back("+nan2008"); | 
|  | 1413 | D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName; | 
|  | 1414 | } | 
|  | 1415 | } else | 
| Matheus Almeida | 602bff3 | 2014-05-07 16:16:07 +0000 | [diff] [blame] | 1416 | D.Diag(diag::err_drv_unsupported_option_argument) | 
|  | 1417 | << A->getOption().getName() << Val; | 
| Simon Atanasyan | 22127ce | 2013-09-24 09:09:16 +0000 | [diff] [blame] | 1418 | } | 
|  | 1419 |  | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1420 | AddTargetFeature(Args, Features, options::OPT_msingle_float, | 
|  | 1421 | options::OPT_mdouble_float, "single-float"); | 
|  | 1422 | AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16, | 
|  | 1423 | "mips16"); | 
|  | 1424 | AddTargetFeature(Args, Features, options::OPT_mmicromips, | 
|  | 1425 | options::OPT_mno_micromips, "micromips"); | 
|  | 1426 | AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp, | 
|  | 1427 | "dsp"); | 
|  | 1428 | AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2, | 
|  | 1429 | "dspr2"); | 
|  | 1430 | AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa, | 
|  | 1431 | "msa"); | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1432 |  | 
| Petar Jovanovic | 3ca1622 | 2016-05-18 12:46:06 +0000 | [diff] [blame] | 1433 | // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32 | 
|  | 1434 | // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and | 
|  | 1435 | // nooddspreg. | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1436 | if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, | 
|  | 1437 | options::OPT_mfp64)) { | 
|  | 1438 | if (A->getOption().matches(options::OPT_mfp32)) | 
|  | 1439 | Features.push_back(Args.MakeArgString("-fp64")); | 
|  | 1440 | else if (A->getOption().matches(options::OPT_mfpxx)) { | 
|  | 1441 | Features.push_back(Args.MakeArgString("+fpxx")); | 
|  | 1442 | Features.push_back(Args.MakeArgString("+nooddspreg")); | 
|  | 1443 | } else | 
|  | 1444 | Features.push_back(Args.MakeArgString("+fp64")); | 
| Toma Tabacu | 94ea686 | 2015-06-16 13:54:13 +0000 | [diff] [blame] | 1445 | } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) { | 
| Daniel Sanders | 2e9427a | 2014-07-16 09:57:54 +0000 | [diff] [blame] | 1446 | Features.push_back(Args.MakeArgString("+fpxx")); | 
|  | 1447 | Features.push_back(Args.MakeArgString("+nooddspreg")); | 
| Petar Jovanovic | 3ca1622 | 2016-05-18 12:46:06 +0000 | [diff] [blame] | 1448 | } else if (mips::isFP64ADefault(Triple, CPUName)) { | 
|  | 1449 | Features.push_back(Args.MakeArgString("+fp64")); | 
|  | 1450 | Features.push_back(Args.MakeArgString("+nooddspreg")); | 
| Daniel Sanders | 2e9427a | 2014-07-16 09:57:54 +0000 | [diff] [blame] | 1451 | } | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 1452 |  | 
| Daniel Sanders | 28e5d39 | 2014-07-10 10:39:51 +0000 | [diff] [blame] | 1453 | AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg, | 
|  | 1454 | options::OPT_modd_spreg, "nooddspreg"); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1455 | } | 
|  | 1456 |  | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1457 | void Clang::AddMIPSTargetArgs(const ArgList &Args, | 
| Simon Atanasyan | f008724 | 2013-04-14 14:07:41 +0000 | [diff] [blame] | 1458 | ArgStringList &CmdArgs) const { | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1459 | const Driver &D = getToolChain().getDriver(); | 
|  | 1460 | StringRef CPUName; | 
|  | 1461 | StringRef ABIName; | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1462 | const llvm::Triple &Triple = getToolChain().getTriple(); | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 1463 | mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); | 
| Simon Atanasyan | 590ad8f | 2012-06-02 15:06:29 +0000 | [diff] [blame] | 1464 |  | 
|  | 1465 | CmdArgs.push_back("-target-abi"); | 
|  | 1466 | CmdArgs.push_back(ABIName.data()); | 
|  | 1467 |  | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1468 | mips::FloatABI ABI = getMipsFloatABI(D, Args); | 
|  | 1469 | if (ABI == mips::FloatABI::Soft) { | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1470 | // Floating point operations and argument passing are soft. | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1471 | CmdArgs.push_back("-msoft-float"); | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1472 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1473 | CmdArgs.push_back("soft"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1474 | } else { | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1475 | // Floating point operations and argument passing are hard. | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 1476 | assert(ABI == mips::FloatABI::Hard && "Invalid float abi!"); | 
| Akira Hatanaka | 6976ec8 | 2012-03-23 23:07:09 +0000 | [diff] [blame] | 1477 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1478 | CmdArgs.push_back("hard"); | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1479 | } | 
| Simon Atanasyan | 6f23fa0 | 2012-07-05 14:19:39 +0000 | [diff] [blame] | 1480 |  | 
| Simon Atanasyan | 2eaec51 | 2012-12-01 18:27:21 +0000 | [diff] [blame] | 1481 | if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) { | 
|  | 1482 | if (A->getOption().matches(options::OPT_mxgot)) { | 
|  | 1483 | CmdArgs.push_back("-mllvm"); | 
|  | 1484 | CmdArgs.push_back("-mxgot"); | 
|  | 1485 | } | 
|  | 1486 | } | 
|  | 1487 |  | 
| Simon Atanasyan | c580b32 | 2013-05-11 06:33:44 +0000 | [diff] [blame] | 1488 | if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1, | 
|  | 1489 | options::OPT_mno_ldc1_sdc1)) { | 
|  | 1490 | if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) { | 
|  | 1491 | CmdArgs.push_back("-mllvm"); | 
|  | 1492 | CmdArgs.push_back("-mno-ldc1-sdc1"); | 
|  | 1493 | } | 
|  | 1494 | } | 
|  | 1495 |  | 
| Akira Hatanaka | 0aa60ef | 2013-07-19 18:58:48 +0000 | [diff] [blame] | 1496 | if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division, | 
|  | 1497 | options::OPT_mno_check_zero_division)) { | 
|  | 1498 | if (A->getOption().matches(options::OPT_mno_check_zero_division)) { | 
|  | 1499 | CmdArgs.push_back("-mllvm"); | 
|  | 1500 | CmdArgs.push_back("-mno-check-zero-division"); | 
|  | 1501 | } | 
|  | 1502 | } | 
|  | 1503 |  | 
| Simon Atanasyan | ec4b1c1 | 2012-08-27 20:55:56 +0000 | [diff] [blame] | 1504 | if (Arg *A = Args.getLastArg(options::OPT_G)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 1505 | StringRef v = A->getValue(); | 
| Simon Atanasyan | ec4b1c1 | 2012-08-27 20:55:56 +0000 | [diff] [blame] | 1506 | CmdArgs.push_back("-mllvm"); | 
|  | 1507 | CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v)); | 
|  | 1508 | A->claim(); | 
|  | 1509 | } | 
| Simon Dardis | d0e83ba | 2016-05-27 15:13:31 +0000 | [diff] [blame] | 1510 |  | 
|  | 1511 | if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) { | 
|  | 1512 | StringRef Val = StringRef(A->getValue()); | 
|  | 1513 | if (mips::hasCompactBranches(CPUName)) { | 
|  | 1514 | if (Val == "never" || Val == "always" || Val == "optimal") { | 
|  | 1515 | CmdArgs.push_back("-mllvm"); | 
|  | 1516 | CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val)); | 
|  | 1517 | } else | 
|  | 1518 | D.Diag(diag::err_drv_unsupported_option_argument) | 
|  | 1519 | << A->getOption().getName() << Val; | 
|  | 1520 | } else | 
|  | 1521 | D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName; | 
|  | 1522 | } | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 1523 | } | 
|  | 1524 |  | 
| Hal Finkel | 8eb5928 | 2012-06-11 22:35:19 +0000 | [diff] [blame] | 1525 | /// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting. | 
|  | 1526 | static std::string getPPCTargetCPU(const ArgList &Args) { | 
|  | 1527 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 1528 | StringRef CPUName = A->getValue(); | 
| Hal Finkel | 8eb5928 | 2012-06-11 22:35:19 +0000 | [diff] [blame] | 1529 |  | 
|  | 1530 | if (CPUName == "native") { | 
|  | 1531 | std::string CPU = llvm::sys::getHostCPUName(); | 
|  | 1532 | if (!CPU.empty() && CPU != "generic") | 
|  | 1533 | return CPU; | 
|  | 1534 | else | 
|  | 1535 | return ""; | 
|  | 1536 | } | 
|  | 1537 |  | 
|  | 1538 | return llvm::StringSwitch<const char *>(CPUName) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1539 | .Case("common", "generic") | 
|  | 1540 | .Case("440", "440") | 
|  | 1541 | .Case("440fp", "440") | 
|  | 1542 | .Case("450", "450") | 
|  | 1543 | .Case("601", "601") | 
|  | 1544 | .Case("602", "602") | 
|  | 1545 | .Case("603", "603") | 
|  | 1546 | .Case("603e", "603e") | 
|  | 1547 | .Case("603ev", "603ev") | 
|  | 1548 | .Case("604", "604") | 
|  | 1549 | .Case("604e", "604e") | 
|  | 1550 | .Case("620", "620") | 
|  | 1551 | .Case("630", "pwr3") | 
|  | 1552 | .Case("G3", "g3") | 
|  | 1553 | .Case("7400", "7400") | 
|  | 1554 | .Case("G4", "g4") | 
|  | 1555 | .Case("7450", "7450") | 
|  | 1556 | .Case("G4+", "g4+") | 
|  | 1557 | .Case("750", "750") | 
|  | 1558 | .Case("970", "970") | 
|  | 1559 | .Case("G5", "g5") | 
|  | 1560 | .Case("a2", "a2") | 
|  | 1561 | .Case("a2q", "a2q") | 
|  | 1562 | .Case("e500mc", "e500mc") | 
|  | 1563 | .Case("e5500", "e5500") | 
|  | 1564 | .Case("power3", "pwr3") | 
|  | 1565 | .Case("power4", "pwr4") | 
|  | 1566 | .Case("power5", "pwr5") | 
|  | 1567 | .Case("power5x", "pwr5x") | 
|  | 1568 | .Case("power6", "pwr6") | 
|  | 1569 | .Case("power6x", "pwr6x") | 
|  | 1570 | .Case("power7", "pwr7") | 
|  | 1571 | .Case("power8", "pwr8") | 
| Nemanja Ivanovic | d99f21b | 2016-05-09 18:58:02 +0000 | [diff] [blame] | 1572 | .Case("power9", "pwr9") | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1573 | .Case("pwr3", "pwr3") | 
|  | 1574 | .Case("pwr4", "pwr4") | 
|  | 1575 | .Case("pwr5", "pwr5") | 
|  | 1576 | .Case("pwr5x", "pwr5x") | 
|  | 1577 | .Case("pwr6", "pwr6") | 
|  | 1578 | .Case("pwr6x", "pwr6x") | 
|  | 1579 | .Case("pwr7", "pwr7") | 
|  | 1580 | .Case("pwr8", "pwr8") | 
| Nemanja Ivanovic | d99f21b | 2016-05-09 18:58:02 +0000 | [diff] [blame] | 1581 | .Case("pwr9", "pwr9") | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1582 | .Case("powerpc", "ppc") | 
|  | 1583 | .Case("powerpc64", "ppc64") | 
|  | 1584 | .Case("powerpc64le", "ppc64le") | 
|  | 1585 | .Default(""); | 
| Hal Finkel | 8eb5928 | 2012-06-11 22:35:19 +0000 | [diff] [blame] | 1586 | } | 
|  | 1587 |  | 
|  | 1588 | return ""; | 
|  | 1589 | } | 
|  | 1590 |  | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 1591 | static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple, | 
|  | 1592 | const ArgList &Args, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1593 | std::vector<const char *> &Features) { | 
| Eric Christopher | 49062a5 | 2015-12-22 03:12:34 +0000 | [diff] [blame] | 1594 | handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group); | 
| Eric Christopher | 643bb6a | 2013-10-16 20:40:08 +0000 | [diff] [blame] | 1595 |  | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 1596 | ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args); | 
|  | 1597 | if (FloatABI == ppc::FloatABI::Soft && | 
|  | 1598 | !(Triple.getArch() == llvm::Triple::ppc64 || | 
|  | 1599 | Triple.getArch() == llvm::Triple::ppc64le)) | 
|  | 1600 | Features.push_back("+soft-float"); | 
|  | 1601 | else if (FloatABI == ppc::FloatABI::Soft && | 
|  | 1602 | (Triple.getArch() == llvm::Triple::ppc64 || | 
|  | 1603 | Triple.getArch() == llvm::Triple::ppc64le)) | 
| Eric Christopher | bce2788 | 2015-12-28 21:57:05 +0000 | [diff] [blame] | 1604 | D.Diag(diag::err_drv_invalid_mfloat_abi) | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 1605 | << "soft float is not supported for ppc64"; | 
|  | 1606 |  | 
| Eric Christopher | 643bb6a | 2013-10-16 20:40:08 +0000 | [diff] [blame] | 1607 | // Altivec is a bit weird, allow overriding of the Altivec feature here. | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 1608 | AddTargetFeature(Args, Features, options::OPT_faltivec, | 
|  | 1609 | options::OPT_fno_altivec, "altivec"); | 
| Hal Finkel | 8eb5928 | 2012-06-11 22:35:19 +0000 | [diff] [blame] | 1610 | } | 
|  | 1611 |  | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 1612 | ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) { | 
|  | 1613 | ppc::FloatABI ABI = ppc::FloatABI::Invalid; | 
|  | 1614 | if (Arg *A = | 
|  | 1615 | Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, | 
|  | 1616 | options::OPT_mfloat_abi_EQ)) { | 
|  | 1617 | if (A->getOption().matches(options::OPT_msoft_float)) | 
|  | 1618 | ABI = ppc::FloatABI::Soft; | 
|  | 1619 | else if (A->getOption().matches(options::OPT_mhard_float)) | 
|  | 1620 | ABI = ppc::FloatABI::Hard; | 
|  | 1621 | else { | 
|  | 1622 | ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue()) | 
|  | 1623 | .Case("soft", ppc::FloatABI::Soft) | 
|  | 1624 | .Case("hard", ppc::FloatABI::Hard) | 
|  | 1625 | .Default(ppc::FloatABI::Invalid); | 
|  | 1626 | if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) { | 
|  | 1627 | D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); | 
|  | 1628 | ABI = ppc::FloatABI::Hard; | 
|  | 1629 | } | 
|  | 1630 | } | 
|  | 1631 | } | 
|  | 1632 |  | 
|  | 1633 | // If unspecified, choose the default based on the platform. | 
|  | 1634 | if (ABI == ppc::FloatABI::Invalid) { | 
|  | 1635 | ABI = ppc::FloatABI::Hard; | 
|  | 1636 | } | 
|  | 1637 |  | 
|  | 1638 | return ABI; | 
|  | 1639 | } | 
|  | 1640 |  | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 1641 | void Clang::AddPPCTargetArgs(const ArgList &Args, | 
|  | 1642 | ArgStringList &CmdArgs) const { | 
|  | 1643 | // Select the ABI to use. | 
|  | 1644 | const char *ABIName = nullptr; | 
| Eric Christopher | 71e5e3d | 2015-07-10 18:25:54 +0000 | [diff] [blame] | 1645 | if (getToolChain().getTriple().isOSLinux()) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1646 | switch (getToolChain().getArch()) { | 
| Hal Finkel | 0d0a1a5 | 2015-03-11 19:14:15 +0000 | [diff] [blame] | 1647 | case llvm::Triple::ppc64: { | 
|  | 1648 | // When targeting a processor that supports QPX, or if QPX is | 
|  | 1649 | // specifically enabled, default to using the ABI that supports QPX (so | 
|  | 1650 | // long as it is not specifically disabled). | 
|  | 1651 | bool HasQPX = false; | 
|  | 1652 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) | 
|  | 1653 | HasQPX = A->getValue() == StringRef("a2q"); | 
|  | 1654 | HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX); | 
|  | 1655 | if (HasQPX) { | 
|  | 1656 | ABIName = "elfv1-qpx"; | 
|  | 1657 | break; | 
|  | 1658 | } | 
|  | 1659 |  | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 1660 | ABIName = "elfv1"; | 
|  | 1661 | break; | 
| Hal Finkel | 0d0a1a5 | 2015-03-11 19:14:15 +0000 | [diff] [blame] | 1662 | } | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 1663 | case llvm::Triple::ppc64le: | 
|  | 1664 | ABIName = "elfv2"; | 
|  | 1665 | break; | 
|  | 1666 | default: | 
|  | 1667 | break; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1668 | } | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 1669 |  | 
| Eric Christopher | 71e5e3d | 2015-07-10 18:25:54 +0000 | [diff] [blame] | 1670 | if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) | 
|  | 1671 | // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore | 
|  | 1672 | // the option if given as we don't have backend support for any targets | 
|  | 1673 | // that don't use the altivec abi. | 
|  | 1674 | if (StringRef(A->getValue()) != "altivec") | 
|  | 1675 | ABIName = A->getValue(); | 
|  | 1676 |  | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 1677 | ppc::FloatABI FloatABI = | 
|  | 1678 | ppc::getPPCFloatABI(getToolChain().getDriver(), Args); | 
|  | 1679 |  | 
|  | 1680 | if (FloatABI == ppc::FloatABI::Soft) { | 
|  | 1681 | // Floating point operations and argument passing are soft. | 
|  | 1682 | CmdArgs.push_back("-msoft-float"); | 
|  | 1683 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1684 | CmdArgs.push_back("soft"); | 
|  | 1685 | } else { | 
|  | 1686 | // Floating point operations and argument passing are hard. | 
|  | 1687 | assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!"); | 
|  | 1688 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1689 | CmdArgs.push_back("hard"); | 
|  | 1690 | } | 
|  | 1691 |  | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 1692 | if (ABIName) { | 
|  | 1693 | CmdArgs.push_back("-target-abi"); | 
|  | 1694 | CmdArgs.push_back(ABIName); | 
|  | 1695 | } | 
|  | 1696 | } | 
|  | 1697 |  | 
|  | 1698 | bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) { | 
|  | 1699 | Arg *A = Args.getLastArg(options::OPT_mabi_EQ); | 
|  | 1700 | return A && (A->getValue() == StringRef(Value)); | 
|  | 1701 | } | 
|  | 1702 |  | 
| Tom Stellard | 6674c70 | 2013-04-01 20:56:53 +0000 | [diff] [blame] | 1703 | /// Get the (LLVM) name of the R600 gpu we are targeting. | 
|  | 1704 | static std::string getR600TargetGPU(const ArgList &Args) { | 
|  | 1705 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | 
| Benjamin Kramer | b2ccade | 2013-10-21 12:33:55 +0000 | [diff] [blame] | 1706 | const char *GPUName = A->getValue(); | 
| Tom Stellard | 6674c70 | 2013-04-01 20:56:53 +0000 | [diff] [blame] | 1707 | return llvm::StringSwitch<const char *>(GPUName) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1708 | .Cases("rv630", "rv635", "r600") | 
|  | 1709 | .Cases("rv610", "rv620", "rs780", "rs880") | 
|  | 1710 | .Case("rv740", "rv770") | 
|  | 1711 | .Case("palm", "cedar") | 
|  | 1712 | .Cases("sumo", "sumo2", "sumo") | 
|  | 1713 | .Case("hemlock", "cypress") | 
|  | 1714 | .Case("aruba", "cayman") | 
|  | 1715 | .Default(GPUName); | 
| Tom Stellard | 6674c70 | 2013-04-01 20:56:53 +0000 | [diff] [blame] | 1716 | } | 
|  | 1717 | return ""; | 
|  | 1718 | } | 
|  | 1719 |  | 
| Jacques Pienaar | d964cc2 | 2016-03-28 21:02:54 +0000 | [diff] [blame] | 1720 | static std::string getLanaiTargetCPU(const ArgList &Args) { | 
|  | 1721 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | 
|  | 1722 | return A->getValue(); | 
|  | 1723 | } | 
|  | 1724 | return ""; | 
|  | 1725 | } | 
|  | 1726 |  | 
| Jacob Baungard Hansen | 13a4937 | 2016-05-24 08:30:08 +0000 | [diff] [blame] | 1727 | sparc::FloatABI sparc::getSparcFloatABI(const Driver &D, | 
|  | 1728 | const ArgList &Args) { | 
|  | 1729 | sparc::FloatABI ABI = sparc::FloatABI::Invalid; | 
|  | 1730 | if (Arg *A = | 
|  | 1731 | Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, | 
|  | 1732 | options::OPT_mfloat_abi_EQ)) { | 
|  | 1733 | if (A->getOption().matches(options::OPT_msoft_float)) | 
|  | 1734 | ABI = sparc::FloatABI::Soft; | 
|  | 1735 | else if (A->getOption().matches(options::OPT_mhard_float)) | 
|  | 1736 | ABI = sparc::FloatABI::Hard; | 
|  | 1737 | else { | 
|  | 1738 | ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue()) | 
|  | 1739 | .Case("soft", sparc::FloatABI::Soft) | 
|  | 1740 | .Case("hard", sparc::FloatABI::Hard) | 
|  | 1741 | .Default(sparc::FloatABI::Invalid); | 
|  | 1742 | if (ABI == sparc::FloatABI::Invalid && | 
|  | 1743 | !StringRef(A->getValue()).empty()) { | 
|  | 1744 | D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args); | 
|  | 1745 | ABI = sparc::FloatABI::Hard; | 
|  | 1746 | } | 
|  | 1747 | } | 
|  | 1748 | } | 
|  | 1749 |  | 
|  | 1750 | // If unspecified, choose the default based on the platform. | 
|  | 1751 | // Only the hard-float ABI on Sparc is standardized, and it is the | 
|  | 1752 | // default. GCC also supports a nonstandard soft-float ABI mode, also | 
|  | 1753 | // implemented in LLVM. However as this is not standard we set the default | 
|  | 1754 | // to be hard-float. | 
|  | 1755 | if (ABI == sparc::FloatABI::Invalid) { | 
|  | 1756 | ABI = sparc::FloatABI::Hard; | 
|  | 1757 | } | 
|  | 1758 |  | 
|  | 1759 | return ABI; | 
|  | 1760 | } | 
|  | 1761 |  | 
|  | 1762 | static void getSparcTargetFeatures(const Driver &D, const ArgList &Args, | 
|  | 1763 | std::vector<const char *> &Features) { | 
|  | 1764 | sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args); | 
|  | 1765 | if (FloatABI == sparc::FloatABI::Soft) | 
|  | 1766 | Features.push_back("+soft-float"); | 
|  | 1767 | } | 
|  | 1768 |  | 
| Bruno Cardoso Lopes | e7f211c | 2010-11-09 17:21:19 +0000 | [diff] [blame] | 1769 | void Clang::AddSparcTargetArgs(const ArgList &Args, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1770 | ArgStringList &CmdArgs) const { | 
| Jacob Baungard Hansen | 13a4937 | 2016-05-24 08:30:08 +0000 | [diff] [blame] | 1771 | sparc::FloatABI FloatABI = | 
|  | 1772 | sparc::getSparcFloatABI(getToolChain().getDriver(), Args); | 
| Bruno Cardoso Lopes | e7f211c | 2010-11-09 17:21:19 +0000 | [diff] [blame] | 1773 |  | 
| Jacob Baungard Hansen | 13a4937 | 2016-05-24 08:30:08 +0000 | [diff] [blame] | 1774 | if (FloatABI == sparc::FloatABI::Soft) { | 
|  | 1775 | // Floating point operations and argument passing are soft. | 
|  | 1776 | CmdArgs.push_back("-msoft-float"); | 
|  | 1777 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1778 | CmdArgs.push_back("soft"); | 
|  | 1779 | } else { | 
|  | 1780 | // Floating point operations and argument passing are hard. | 
|  | 1781 | assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!"); | 
|  | 1782 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 1783 | CmdArgs.push_back("hard"); | 
| Bruno Cardoso Lopes | e7f211c | 2010-11-09 17:21:19 +0000 | [diff] [blame] | 1784 | } | 
|  | 1785 | } | 
|  | 1786 |  | 
| Marcin Koscielnicki | b31ee6d | 2016-05-04 23:37:40 +0000 | [diff] [blame] | 1787 | void Clang::AddSystemZTargetArgs(const ArgList &Args, | 
|  | 1788 | ArgStringList &CmdArgs) const { | 
|  | 1789 | if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false)) | 
|  | 1790 | CmdArgs.push_back("-mbackchain"); | 
|  | 1791 | } | 
|  | 1792 |  | 
| Richard Sandiford | 4652d89 | 2013-07-19 16:51:51 +0000 | [diff] [blame] | 1793 | static const char *getSystemZTargetCPU(const ArgList &Args) { | 
|  | 1794 | if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) | 
|  | 1795 | return A->getValue(); | 
|  | 1796 | return "z10"; | 
|  | 1797 | } | 
|  | 1798 |  | 
| Ulrich Weigand | 3a610eb | 2015-04-01 12:54:25 +0000 | [diff] [blame] | 1799 | static void getSystemZTargetFeatures(const ArgList &Args, | 
|  | 1800 | std::vector<const char *> &Features) { | 
|  | 1801 | // -m(no-)htm overrides use of the transactional-execution facility. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1802 | if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) { | 
| Ulrich Weigand | 3a610eb | 2015-04-01 12:54:25 +0000 | [diff] [blame] | 1803 | if (A->getOption().matches(options::OPT_mhtm)) | 
|  | 1804 | Features.push_back("+transactional-execution"); | 
|  | 1805 | else | 
|  | 1806 | Features.push_back("-transactional-execution"); | 
|  | 1807 | } | 
| Ulrich Weigand | 66ff51b | 2015-05-05 19:35:52 +0000 | [diff] [blame] | 1808 | // -m(no-)vx overrides use of the vector facility. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1809 | if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) { | 
| Ulrich Weigand | 66ff51b | 2015-05-05 19:35:52 +0000 | [diff] [blame] | 1810 | if (A->getOption().matches(options::OPT_mvx)) | 
|  | 1811 | Features.push_back("+vector"); | 
|  | 1812 | else | 
|  | 1813 | Features.push_back("-vector"); | 
|  | 1814 | } | 
| Ulrich Weigand | 3a610eb | 2015-04-01 12:54:25 +0000 | [diff] [blame] | 1815 | } | 
|  | 1816 |  | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1817 | static const char *getX86TargetCPU(const ArgList &Args, | 
|  | 1818 | const llvm::Triple &Triple) { | 
|  | 1819 | if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 1820 | if (StringRef(A->getValue()) != "native") { | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 1821 | if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h") | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 1822 | return "core-avx2"; | 
|  | 1823 |  | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1824 | return A->getValue(); | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 1825 | } | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1826 |  | 
|  | 1827 | // FIXME: Reject attempts to use -march=native unless the target matches | 
|  | 1828 | // the host. | 
|  | 1829 | // | 
|  | 1830 | // FIXME: We should also incorporate the detected target features for use | 
|  | 1831 | // with -native. | 
|  | 1832 | std::string CPU = llvm::sys::getHostCPUName(); | 
|  | 1833 | if (!CPU.empty() && CPU != "generic") | 
|  | 1834 | return Args.MakeArgString(CPU); | 
|  | 1835 | } | 
|  | 1836 |  | 
| Reid Kleckner | 3123eff | 2015-06-30 16:32:04 +0000 | [diff] [blame] | 1837 | if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) { | 
|  | 1838 | // Mapping built by referring to X86TargetInfo::getDefaultFeatures(). | 
|  | 1839 | StringRef Arch = A->getValue(); | 
|  | 1840 | const char *CPU; | 
|  | 1841 | if (Triple.getArch() == llvm::Triple::x86) { | 
|  | 1842 | CPU = llvm::StringSwitch<const char *>(Arch) | 
|  | 1843 | .Case("IA32", "i386") | 
|  | 1844 | .Case("SSE", "pentium3") | 
|  | 1845 | .Case("SSE2", "pentium4") | 
|  | 1846 | .Case("AVX", "sandybridge") | 
|  | 1847 | .Case("AVX2", "haswell") | 
|  | 1848 | .Default(nullptr); | 
|  | 1849 | } else { | 
|  | 1850 | CPU = llvm::StringSwitch<const char *>(Arch) | 
|  | 1851 | .Case("AVX", "sandybridge") | 
|  | 1852 | .Case("AVX2", "haswell") | 
|  | 1853 | .Default(nullptr); | 
|  | 1854 | } | 
|  | 1855 | if (CPU) | 
|  | 1856 | return CPU; | 
|  | 1857 | } | 
|  | 1858 |  | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1859 | // Select the default CPU if none was given (or detection failed). | 
|  | 1860 |  | 
|  | 1861 | if (Triple.getArch() != llvm::Triple::x86_64 && | 
|  | 1862 | Triple.getArch() != llvm::Triple::x86) | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 1863 | return nullptr; // This routine is only handling x86 targets. | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1864 |  | 
|  | 1865 | bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64; | 
|  | 1866 |  | 
|  | 1867 | // FIXME: Need target hooks. | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 1868 | if (Triple.isOSDarwin()) { | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 1869 | if (Triple.getArchName() == "x86_64h") | 
|  | 1870 | return "core-avx2"; | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1871 | return Is64Bit ? "core2" : "yonah"; | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 1872 | } | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1873 |  | 
| Filipe Cabecinhas | 4b44257 | 2015-01-27 17:27:37 +0000 | [diff] [blame] | 1874 | // Set up default CPU name for PS4 compilers. | 
|  | 1875 | if (Triple.isPS4CPU()) | 
|  | 1876 | return "btver2"; | 
|  | 1877 |  | 
| Alexey Bataev | 286d1b9 | 2014-01-31 04:07:13 +0000 | [diff] [blame] | 1878 | // On Android use targets compatible with gcc | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 1879 | if (Triple.isAndroid()) | 
| Alexey Bataev | 286d1b9 | 2014-01-31 04:07:13 +0000 | [diff] [blame] | 1880 | return Is64Bit ? "x86-64" : "i686"; | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1881 |  | 
| Benjamin Kramer | b2ccade | 2013-10-21 12:33:55 +0000 | [diff] [blame] | 1882 | // Everything else goes to x86-64 in 64-bit mode. | 
|  | 1883 | if (Is64Bit) | 
|  | 1884 | return "x86-64"; | 
|  | 1885 |  | 
|  | 1886 | switch (Triple.getOS()) { | 
|  | 1887 | case llvm::Triple::FreeBSD: | 
|  | 1888 | case llvm::Triple::NetBSD: | 
|  | 1889 | case llvm::Triple::OpenBSD: | 
|  | 1890 | return "i486"; | 
|  | 1891 | case llvm::Triple::Haiku: | 
|  | 1892 | return "i586"; | 
|  | 1893 | case llvm::Triple::Bitrig: | 
|  | 1894 | return "i686"; | 
|  | 1895 | default: | 
|  | 1896 | // Fallback to p4. | 
|  | 1897 | return "pentium4"; | 
|  | 1898 | } | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 1899 | } | 
|  | 1900 |  | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 1901 | /// Get the (LLVM) name of the WebAssembly cpu we are targeting. | 
|  | 1902 | static StringRef getWebAssemblyTargetCPU(const ArgList &Args) { | 
|  | 1903 | // If we have -mcpu=, use that. | 
|  | 1904 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | 
|  | 1905 | StringRef CPU = A->getValue(); | 
|  | 1906 |  | 
|  | 1907 | #ifdef __wasm__ | 
|  | 1908 | // Handle "native" by examining the host. "native" isn't meaningful when | 
|  | 1909 | // cross compiling, so only support this when the host is also WebAssembly. | 
|  | 1910 | if (CPU == "native") | 
|  | 1911 | return llvm::sys::getHostCPUName(); | 
|  | 1912 | #endif | 
|  | 1913 |  | 
|  | 1914 | return CPU; | 
|  | 1915 | } | 
|  | 1916 |  | 
|  | 1917 | return "generic"; | 
|  | 1918 | } | 
|  | 1919 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 1920 | static std::string getCPUName(const ArgList &Args, const llvm::Triple &T, | 
|  | 1921 | bool FromAs = false) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 1922 | switch (T.getArch()) { | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1923 | default: | 
|  | 1924 | return ""; | 
|  | 1925 |  | 
| Amara Emerson | 703da2e | 2013-10-31 09:32:33 +0000 | [diff] [blame] | 1926 | case llvm::Triple::aarch64: | 
| Christian Pirker | 9b019ae | 2014-02-25 13:51:00 +0000 | [diff] [blame] | 1927 | case llvm::Triple::aarch64_be: | 
| Tim Northover | 573cbee | 2014-05-24 12:52:07 +0000 | [diff] [blame] | 1928 | return getAArch64TargetCPU(Args); | 
| Quentin Colombet | d9f2620 | 2014-04-15 00:27:35 +0000 | [diff] [blame] | 1929 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1930 | case llvm::Triple::arm: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 1931 | case llvm::Triple::armeb: | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1932 | case llvm::Triple::thumb: | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 1933 | case llvm::Triple::thumbeb: { | 
|  | 1934 | StringRef MArch, MCPU; | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 1935 | getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 1936 | return arm::getARMTargetCPU(MCPU, MArch, T); | 
|  | 1937 | } | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1938 | case llvm::Triple::mips: | 
|  | 1939 | case llvm::Triple::mipsel: | 
|  | 1940 | case llvm::Triple::mips64: | 
|  | 1941 | case llvm::Triple::mips64el: { | 
|  | 1942 | StringRef CPUName; | 
|  | 1943 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 1944 | mips::getMipsCPUAndABI(Args, T, CPUName, ABIName); | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1945 | return CPUName; | 
|  | 1946 | } | 
|  | 1947 |  | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 1948 | case llvm::Triple::nvptx: | 
|  | 1949 | case llvm::Triple::nvptx64: | 
|  | 1950 | if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) | 
|  | 1951 | return A->getValue(); | 
|  | 1952 | return ""; | 
|  | 1953 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1954 | case llvm::Triple::ppc: | 
|  | 1955 | case llvm::Triple::ppc64: | 
|  | 1956 | case llvm::Triple::ppc64le: { | 
|  | 1957 | std::string TargetCPUName = getPPCTargetCPU(Args); | 
|  | 1958 | // LLVM may default to generating code for the native CPU, | 
|  | 1959 | // but, like gcc, we default to a more generic option for | 
|  | 1960 | // each architecture. (except on Darwin) | 
|  | 1961 | if (TargetCPUName.empty() && !T.isOSDarwin()) { | 
|  | 1962 | if (T.getArch() == llvm::Triple::ppc64) | 
|  | 1963 | TargetCPUName = "ppc64"; | 
|  | 1964 | else if (T.getArch() == llvm::Triple::ppc64le) | 
|  | 1965 | TargetCPUName = "ppc64le"; | 
|  | 1966 | else | 
|  | 1967 | TargetCPUName = "ppc"; | 
|  | 1968 | } | 
|  | 1969 | return TargetCPUName; | 
|  | 1970 | } | 
|  | 1971 |  | 
|  | 1972 | case llvm::Triple::sparc: | 
| Douglas Katzman | f36dddf | 2015-05-11 15:21:44 +0000 | [diff] [blame] | 1973 | case llvm::Triple::sparcel: | 
| Roman Divacky | b1ae3d4 | 2014-02-25 18:35:30 +0000 | [diff] [blame] | 1974 | case llvm::Triple::sparcv9: | 
|  | 1975 | if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1976 | return A->getValue(); | 
|  | 1977 | return ""; | 
|  | 1978 |  | 
|  | 1979 | case llvm::Triple::x86: | 
|  | 1980 | case llvm::Triple::x86_64: | 
|  | 1981 | return getX86TargetCPU(Args, T); | 
|  | 1982 |  | 
|  | 1983 | case llvm::Triple::hexagon: | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 1984 | return "hexagon" + | 
|  | 1985 | toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1986 |  | 
| Jacques Pienaar | d964cc2 | 2016-03-28 21:02:54 +0000 | [diff] [blame] | 1987 | case llvm::Triple::lanai: | 
|  | 1988 | return getLanaiTargetCPU(Args); | 
|  | 1989 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1990 | case llvm::Triple::systemz: | 
|  | 1991 | return getSystemZTargetCPU(Args); | 
|  | 1992 |  | 
|  | 1993 | case llvm::Triple::r600: | 
| Tom Stellard | d8e38a3 | 2015-01-06 20:34:47 +0000 | [diff] [blame] | 1994 | case llvm::Triple::amdgcn: | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 1995 | return getR600TargetGPU(Args); | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 1996 |  | 
|  | 1997 | case llvm::Triple::wasm32: | 
|  | 1998 | case llvm::Triple::wasm64: | 
|  | 1999 | return getWebAssemblyTargetCPU(Args); | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 2000 | } | 
|  | 2001 | } | 
|  | 2002 |  | 
| Alp Toker | ce365ca | 2013-12-02 12:43:03 +0000 | [diff] [blame] | 2003 | static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args, | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 2004 | ArgStringList &CmdArgs, bool IsThinLTO) { | 
| Alp Toker | ce365ca | 2013-12-02 12:43:03 +0000 | [diff] [blame] | 2005 | // Tell the linker to load the plugin. This has to come before AddLinkerInputs | 
|  | 2006 | // as gold requires -plugin to come before any -plugin-opt that -Wl might | 
|  | 2007 | // forward. | 
|  | 2008 | CmdArgs.push_back("-plugin"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2009 | std::string Plugin = | 
|  | 2010 | ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so"; | 
| Alp Toker | ce365ca | 2013-12-02 12:43:03 +0000 | [diff] [blame] | 2011 | CmdArgs.push_back(Args.MakeArgString(Plugin)); | 
|  | 2012 |  | 
|  | 2013 | // Try to pass driver level flags relevant to LTO code generation down to | 
|  | 2014 | // the plugin. | 
|  | 2015 |  | 
|  | 2016 | // Handle flags for selecting CPU variants. | 
|  | 2017 | std::string CPU = getCPUName(Args, ToolChain.getTriple()); | 
|  | 2018 | if (!CPU.empty()) | 
|  | 2019 | CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU)); | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 2020 |  | 
| James Molloy | f97fdae | 2015-12-21 10:44:36 +0000 | [diff] [blame] | 2021 | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { | 
|  | 2022 | StringRef OOpt; | 
|  | 2023 | if (A->getOption().matches(options::OPT_O4) || | 
|  | 2024 | A->getOption().matches(options::OPT_Ofast)) | 
|  | 2025 | OOpt = "3"; | 
|  | 2026 | else if (A->getOption().matches(options::OPT_O)) | 
|  | 2027 | OOpt = A->getValue(); | 
|  | 2028 | else if (A->getOption().matches(options::OPT_O0)) | 
|  | 2029 | OOpt = "0"; | 
|  | 2030 | if (!OOpt.empty()) | 
|  | 2031 | CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt)); | 
|  | 2032 | } | 
|  | 2033 |  | 
| Teresa Johnson | 6ef80dc | 2015-11-02 18:03:12 +0000 | [diff] [blame] | 2034 | if (IsThinLTO) | 
|  | 2035 | CmdArgs.push_back("-plugin-opt=thinlto"); | 
| Paul Robinson | 4391d09 | 2016-01-25 19:46:40 +0000 | [diff] [blame] | 2036 |  | 
|  | 2037 | // If an explicit debugger tuning argument appeared, pass it along. | 
|  | 2038 | if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, | 
|  | 2039 | options::OPT_ggdbN_Group)) { | 
|  | 2040 | if (A->getOption().matches(options::OPT_glldb)) | 
|  | 2041 | CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb"); | 
|  | 2042 | else if (A->getOption().matches(options::OPT_gsce)) | 
|  | 2043 | CmdArgs.push_back("-plugin-opt=-debugger-tune=sce"); | 
|  | 2044 | else | 
|  | 2045 | CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb"); | 
|  | 2046 | } | 
| Alp Toker | ce365ca | 2013-12-02 12:43:03 +0000 | [diff] [blame] | 2047 | } | 
|  | 2048 |  | 
| Sanjay Patel | 2987c29 | 2015-06-11 14:53:41 +0000 | [diff] [blame] | 2049 | /// This is a helper function for validating the optional refinement step | 
|  | 2050 | /// parameter in reciprocal argument strings. Return false if there is an error | 
|  | 2051 | /// parsing the refinement step. Otherwise, return true and set the Position | 
|  | 2052 | /// of the refinement step in the input string. | 
| Craig Topper | 3db9ba4 | 2015-09-21 00:20:04 +0000 | [diff] [blame] | 2053 | static bool getRefinementStep(StringRef In, const Driver &D, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2054 | const Arg &A, size_t &Position) { | 
| Sanjay Patel | 2987c29 | 2015-06-11 14:53:41 +0000 | [diff] [blame] | 2055 | const char RefinementStepToken = ':'; | 
|  | 2056 | Position = In.find(RefinementStepToken); | 
|  | 2057 | if (Position != StringRef::npos) { | 
|  | 2058 | StringRef Option = A.getOption().getName(); | 
|  | 2059 | StringRef RefStep = In.substr(Position + 1); | 
|  | 2060 | // Allow exactly one numeric character for the additional refinement | 
|  | 2061 | // step parameter. This is reasonable for all currently-supported | 
|  | 2062 | // operations and architectures because we would expect that a larger value | 
|  | 2063 | // of refinement steps would cause the estimate "optimization" to | 
|  | 2064 | // under-perform the native operation. Also, if the estimate does not | 
|  | 2065 | // converge quickly, it probably will not ever converge, so further | 
|  | 2066 | // refinement steps will not produce a better answer. | 
|  | 2067 | if (RefStep.size() != 1) { | 
|  | 2068 | D.Diag(diag::err_drv_invalid_value) << Option << RefStep; | 
|  | 2069 | return false; | 
|  | 2070 | } | 
|  | 2071 | char RefStepChar = RefStep[0]; | 
|  | 2072 | if (RefStepChar < '0' || RefStepChar > '9') { | 
|  | 2073 | D.Diag(diag::err_drv_invalid_value) << Option << RefStep; | 
|  | 2074 | return false; | 
|  | 2075 | } | 
|  | 2076 | } | 
|  | 2077 | return true; | 
|  | 2078 | } | 
|  | 2079 |  | 
|  | 2080 | /// The -mrecip flag requires processing of many optional parameters. | 
|  | 2081 | static void ParseMRecip(const Driver &D, const ArgList &Args, | 
|  | 2082 | ArgStringList &OutStrings) { | 
|  | 2083 | StringRef DisabledPrefixIn = "!"; | 
|  | 2084 | StringRef DisabledPrefixOut = "!"; | 
|  | 2085 | StringRef EnabledPrefixOut = ""; | 
|  | 2086 | StringRef Out = "-mrecip="; | 
|  | 2087 |  | 
|  | 2088 | Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ); | 
|  | 2089 | if (!A) | 
|  | 2090 | return; | 
|  | 2091 |  | 
|  | 2092 | unsigned NumOptions = A->getNumValues(); | 
|  | 2093 | if (NumOptions == 0) { | 
|  | 2094 | // No option is the same as "all". | 
|  | 2095 | OutStrings.push_back(Args.MakeArgString(Out + "all")); | 
|  | 2096 | return; | 
|  | 2097 | } | 
|  | 2098 |  | 
|  | 2099 | // Pass through "all", "none", or "default" with an optional refinement step. | 
|  | 2100 | if (NumOptions == 1) { | 
|  | 2101 | StringRef Val = A->getValue(0); | 
|  | 2102 | size_t RefStepLoc; | 
|  | 2103 | if (!getRefinementStep(Val, D, *A, RefStepLoc)) | 
|  | 2104 | return; | 
|  | 2105 | StringRef ValBase = Val.slice(0, RefStepLoc); | 
|  | 2106 | if (ValBase == "all" || ValBase == "none" || ValBase == "default") { | 
|  | 2107 | OutStrings.push_back(Args.MakeArgString(Out + Val)); | 
|  | 2108 | return; | 
|  | 2109 | } | 
|  | 2110 | } | 
|  | 2111 |  | 
|  | 2112 | // Each reciprocal type may be enabled or disabled individually. | 
|  | 2113 | // Check each input value for validity, concatenate them all back together, | 
|  | 2114 | // and pass through. | 
|  | 2115 |  | 
|  | 2116 | llvm::StringMap<bool> OptionStrings; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2117 | OptionStrings.insert(std::make_pair("divd", false)); | 
|  | 2118 | OptionStrings.insert(std::make_pair("divf", false)); | 
|  | 2119 | OptionStrings.insert(std::make_pair("vec-divd", false)); | 
|  | 2120 | OptionStrings.insert(std::make_pair("vec-divf", false)); | 
|  | 2121 | OptionStrings.insert(std::make_pair("sqrtd", false)); | 
|  | 2122 | OptionStrings.insert(std::make_pair("sqrtf", false)); | 
|  | 2123 | OptionStrings.insert(std::make_pair("vec-sqrtd", false)); | 
|  | 2124 | OptionStrings.insert(std::make_pair("vec-sqrtf", false)); | 
| Sanjay Patel | 2987c29 | 2015-06-11 14:53:41 +0000 | [diff] [blame] | 2125 |  | 
|  | 2126 | for (unsigned i = 0; i != NumOptions; ++i) { | 
|  | 2127 | StringRef Val = A->getValue(i); | 
|  | 2128 |  | 
|  | 2129 | bool IsDisabled = Val.startswith(DisabledPrefixIn); | 
|  | 2130 | // Ignore the disablement token for string matching. | 
|  | 2131 | if (IsDisabled) | 
|  | 2132 | Val = Val.substr(1); | 
|  | 2133 |  | 
|  | 2134 | size_t RefStep; | 
|  | 2135 | if (!getRefinementStep(Val, D, *A, RefStep)) | 
|  | 2136 | return; | 
|  | 2137 |  | 
|  | 2138 | StringRef ValBase = Val.slice(0, RefStep); | 
|  | 2139 | llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase); | 
|  | 2140 | if (OptionIter == OptionStrings.end()) { | 
|  | 2141 | // Try again specifying float suffix. | 
|  | 2142 | OptionIter = OptionStrings.find(ValBase.str() + 'f'); | 
|  | 2143 | if (OptionIter == OptionStrings.end()) { | 
|  | 2144 | // The input name did not match any known option string. | 
|  | 2145 | D.Diag(diag::err_drv_unknown_argument) << Val; | 
|  | 2146 | return; | 
|  | 2147 | } | 
|  | 2148 | // The option was specified without a float or double suffix. | 
|  | 2149 | // Make sure that the double entry was not already specified. | 
|  | 2150 | // The float entry will be checked below. | 
|  | 2151 | if (OptionStrings[ValBase.str() + 'd']) { | 
|  | 2152 | D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val; | 
|  | 2153 | return; | 
|  | 2154 | } | 
|  | 2155 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2156 |  | 
| Sanjay Patel | 2987c29 | 2015-06-11 14:53:41 +0000 | [diff] [blame] | 2157 | if (OptionIter->second == true) { | 
|  | 2158 | // Duplicate option specified. | 
|  | 2159 | D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val; | 
|  | 2160 | return; | 
|  | 2161 | } | 
|  | 2162 |  | 
|  | 2163 | // Mark the matched option as found. Do not allow duplicate specifiers. | 
|  | 2164 | OptionIter->second = true; | 
|  | 2165 |  | 
|  | 2166 | // If the precision was not specified, also mark the double entry as found. | 
|  | 2167 | if (ValBase.back() != 'f' && ValBase.back() != 'd') | 
|  | 2168 | OptionStrings[ValBase.str() + 'd'] = true; | 
|  | 2169 |  | 
|  | 2170 | // Build the output string. | 
|  | 2171 | StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut; | 
|  | 2172 | Out = Args.MakeArgString(Out + Prefix + Val); | 
|  | 2173 | if (i != NumOptions - 1) | 
|  | 2174 | Out = Args.MakeArgString(Out + ","); | 
|  | 2175 | } | 
|  | 2176 |  | 
|  | 2177 | OutStrings.push_back(Args.MakeArgString(Out)); | 
|  | 2178 | } | 
|  | 2179 |  | 
| Eric Christopher | c54920a | 2015-03-23 19:26:05 +0000 | [diff] [blame] | 2180 | static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple, | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 2181 | const ArgList &Args, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2182 | std::vector<const char *> &Features) { | 
| Craig Topper | a8bd600 | 2015-03-31 05:45:00 +0000 | [diff] [blame] | 2183 | // If -march=native, autodetect the feature list. | 
|  | 2184 | if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) { | 
|  | 2185 | if (StringRef(A->getValue()) == "native") { | 
|  | 2186 | llvm::StringMap<bool> HostFeatures; | 
|  | 2187 | if (llvm::sys::getHostCPUFeatures(HostFeatures)) | 
|  | 2188 | for (auto &F : HostFeatures) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2189 | Features.push_back( | 
|  | 2190 | Args.MakeArgString((F.second ? "+" : "-") + F.first())); | 
| Craig Topper | a8bd600 | 2015-03-31 05:45:00 +0000 | [diff] [blame] | 2191 | } | 
|  | 2192 | } | 
|  | 2193 |  | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 2194 | if (Triple.getArchName() == "x86_64h") { | 
|  | 2195 | // x86_64h implies quite a few of the more modern subtarget features | 
|  | 2196 | // for Haswell class CPUs, but not all of them. Opt-out of a few. | 
|  | 2197 | Features.push_back("-rdrnd"); | 
|  | 2198 | Features.push_back("-aes"); | 
|  | 2199 | Features.push_back("-pclmul"); | 
|  | 2200 | Features.push_back("-rtm"); | 
|  | 2201 | Features.push_back("-hle"); | 
|  | 2202 | Features.push_back("-fsgsbase"); | 
|  | 2203 | } | 
|  | 2204 |  | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 2205 | const llvm::Triple::ArchType ArchType = Triple.getArch(); | 
| Eric Christopher | c54920a | 2015-03-23 19:26:05 +0000 | [diff] [blame] | 2206 | // Add features to be compatible with gcc for Android. | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 2207 | if (Triple.isAndroid()) { | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 2208 | if (ArchType == llvm::Triple::x86_64) { | 
| Alexey Volkov | 54ff080 | 2014-06-25 12:15:36 +0000 | [diff] [blame] | 2209 | Features.push_back("+sse4.2"); | 
|  | 2210 | Features.push_back("+popcnt"); | 
|  | 2211 | } else | 
|  | 2212 | Features.push_back("+ssse3"); | 
| Alexey Bataev | 286d1b9 | 2014-01-31 04:07:13 +0000 | [diff] [blame] | 2213 | } | 
|  | 2214 |  | 
| Eric Christopher | c54920a | 2015-03-23 19:26:05 +0000 | [diff] [blame] | 2215 | // Set features according to the -arch flag on MSVC. | 
| Ehsan Akhgari | eeb7e65 | 2014-07-15 18:27:51 +0000 | [diff] [blame] | 2216 | if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) { | 
|  | 2217 | StringRef Arch = A->getValue(); | 
|  | 2218 | bool ArchUsed = false; | 
|  | 2219 | // First, look for flags that are shared in x86 and x86-64. | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 2220 | if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) { | 
| Ehsan Akhgari | eeb7e65 | 2014-07-15 18:27:51 +0000 | [diff] [blame] | 2221 | if (Arch == "AVX" || Arch == "AVX2") { | 
|  | 2222 | ArchUsed = true; | 
|  | 2223 | Features.push_back(Args.MakeArgString("+" + Arch.lower())); | 
|  | 2224 | } | 
|  | 2225 | } | 
|  | 2226 | // Then, look for x86-specific flags. | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 2227 | if (ArchType == llvm::Triple::x86) { | 
| Ehsan Akhgari | eeb7e65 | 2014-07-15 18:27:51 +0000 | [diff] [blame] | 2228 | if (Arch == "IA32") { | 
|  | 2229 | ArchUsed = true; | 
|  | 2230 | } else if (Arch == "SSE" || Arch == "SSE2") { | 
|  | 2231 | ArchUsed = true; | 
|  | 2232 | Features.push_back(Args.MakeArgString("+" + Arch.lower())); | 
|  | 2233 | } | 
|  | 2234 | } | 
|  | 2235 | if (!ArchUsed) | 
|  | 2236 | D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args); | 
|  | 2237 | } | 
|  | 2238 |  | 
| Jim Grosbach | 82eee26 | 2013-11-16 00:53:35 +0000 | [diff] [blame] | 2239 | // Now add any that the user explicitly requested on the command line, | 
|  | 2240 | // which may override the defaults. | 
| Eric Christopher | 49062a5 | 2015-12-22 03:12:34 +0000 | [diff] [blame] | 2241 | handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2242 | } | 
|  | 2243 |  | 
| Daniel Dunbar | 3b3191f | 2009-09-09 22:33:08 +0000 | [diff] [blame] | 2244 | void Clang::AddX86TargetArgs(const ArgList &Args, | 
|  | 2245 | ArgStringList &CmdArgs) const { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2246 | if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) || | 
| Daniel Dunbar | e2cf8f7 | 2009-09-10 22:59:57 +0000 | [diff] [blame] | 2247 | Args.hasArg(options::OPT_mkernel) || | 
|  | 2248 | Args.hasArg(options::OPT_fapple_kext)) | 
| Daniel Dunbar | 8bed86c | 2009-11-20 22:21:36 +0000 | [diff] [blame] | 2249 | CmdArgs.push_back("-disable-red-zone"); | 
| Daniel Dunbar | e2cf8f7 | 2009-09-10 22:59:57 +0000 | [diff] [blame] | 2250 |  | 
| Bob Wilson | 2616e2e | 2013-02-10 16:01:41 +0000 | [diff] [blame] | 2251 | // Default to avoid implicit floating-point for kernel/kext code, but allow | 
|  | 2252 | // that to be overridden with -mno-soft-float. | 
|  | 2253 | bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) || | 
|  | 2254 | Args.hasArg(options::OPT_fapple_kext)); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2255 | if (Arg *A = Args.getLastArg( | 
|  | 2256 | options::OPT_msoft_float, options::OPT_mno_soft_float, | 
|  | 2257 | options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) { | 
| Bob Wilson | 2616e2e | 2013-02-10 16:01:41 +0000 | [diff] [blame] | 2258 | const Option &O = A->getOption(); | 
|  | 2259 | NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) || | 
|  | 2260 | O.matches(options::OPT_msoft_float)); | 
|  | 2261 | } | 
|  | 2262 | if (NoImplicitFloat) | 
| Daniel Dunbar | 8bed86c | 2009-11-20 22:21:36 +0000 | [diff] [blame] | 2263 | CmdArgs.push_back("-no-implicit-float"); | 
| Nico Weber | ad8e36c | 2014-05-13 11:11:24 +0000 | [diff] [blame] | 2264 |  | 
|  | 2265 | if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) { | 
|  | 2266 | StringRef Value = A->getValue(); | 
|  | 2267 | if (Value == "intel" || Value == "att") { | 
|  | 2268 | CmdArgs.push_back("-mllvm"); | 
|  | 2269 | CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value)); | 
|  | 2270 | } else { | 
|  | 2271 | getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument) | 
|  | 2272 | << A->getOption().getName() << Value; | 
|  | 2273 | } | 
|  | 2274 | } | 
| Andrey Turetskiy | 6a8b91d | 2016-04-21 10:16:48 +0000 | [diff] [blame] | 2275 |  | 
|  | 2276 | // Set flags to support MCU ABI. | 
| Andrey Turetskiy | 5fea71c | 2016-06-29 10:57:17 +0000 | [diff] [blame] | 2277 | if (Args.hasFlag(options::OPT_miamcu, options::OPT_mno_iamcu, false)) { | 
|  | 2278 | CmdArgs.push_back("-mfloat-abi"); | 
|  | 2279 | CmdArgs.push_back("soft"); | 
|  | 2280 | CmdArgs.push_back("-mstack-alignment=4"); | 
| Andrey Turetskiy | 6a8b91d | 2016-04-21 10:16:48 +0000 | [diff] [blame] | 2281 | } | 
| Daniel Dunbar | 3b3191f | 2009-09-09 22:33:08 +0000 | [diff] [blame] | 2282 | } | 
|  | 2283 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 2284 | void Clang::AddHexagonTargetArgs(const ArgList &Args, | 
|  | 2285 | ArgStringList &CmdArgs) const { | 
| Matthew Curtis | 6b22278 | 2012-12-07 13:52:44 +0000 | [diff] [blame] | 2286 | CmdArgs.push_back("-mqdsp6-compat"); | 
|  | 2287 | CmdArgs.push_back("-Wreturn-type"); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 2288 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 2289 | if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { | 
|  | 2290 | std::string N = llvm::utostr(G.getValue()); | 
|  | 2291 | std::string Opt = std::string("-hexagon-small-data-threshold=") + N; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2292 | CmdArgs.push_back("-mllvm"); | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 2293 | CmdArgs.push_back(Args.MakeArgString(Opt)); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 2294 | } | 
|  | 2295 |  | 
| Sirish Pande | 11ebc4e | 2012-05-10 20:19:54 +0000 | [diff] [blame] | 2296 | if (!Args.hasArg(options::OPT_fno_short_enums)) | 
|  | 2297 | CmdArgs.push_back("-fshort-enums"); | 
|  | 2298 | if (Args.getLastArg(options::OPT_mieee_rnd_near)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2299 | CmdArgs.push_back("-mllvm"); | 
|  | 2300 | CmdArgs.push_back("-enable-hexagon-ieee-rnd-near"); | 
| Sirish Pande | 11ebc4e | 2012-05-10 20:19:54 +0000 | [diff] [blame] | 2301 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2302 | CmdArgs.push_back("-mllvm"); | 
|  | 2303 | CmdArgs.push_back("-machine-sink-split=0"); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 2304 | } | 
|  | 2305 |  | 
| Jacques Pienaar | d964cc2 | 2016-03-28 21:02:54 +0000 | [diff] [blame] | 2306 | void Clang::AddLanaiTargetArgs(const ArgList &Args, | 
|  | 2307 | ArgStringList &CmdArgs) const { | 
|  | 2308 | if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) { | 
|  | 2309 | StringRef CPUName = A->getValue(); | 
|  | 2310 |  | 
|  | 2311 | CmdArgs.push_back("-target-cpu"); | 
|  | 2312 | CmdArgs.push_back(Args.MakeArgString(CPUName)); | 
|  | 2313 | } | 
|  | 2314 | if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { | 
|  | 2315 | StringRef Value = A->getValue(); | 
|  | 2316 | // Only support mregparm=4 to support old usage. Report error for all other | 
|  | 2317 | // cases. | 
|  | 2318 | int Mregparm; | 
|  | 2319 | if (Value.getAsInteger(10, Mregparm)) { | 
|  | 2320 | if (Mregparm != 4) { | 
|  | 2321 | getToolChain().getDriver().Diag( | 
|  | 2322 | diag::err_drv_unsupported_option_argument) | 
|  | 2323 | << A->getOption().getName() << Value; | 
|  | 2324 | } | 
|  | 2325 | } | 
|  | 2326 | } | 
|  | 2327 | } | 
|  | 2328 |  | 
| Dan Gohman | e3d71e1 | 2016-01-07 01:00:21 +0000 | [diff] [blame] | 2329 | void Clang::AddWebAssemblyTargetArgs(const ArgList &Args, | 
|  | 2330 | ArgStringList &CmdArgs) const { | 
|  | 2331 | // Default to "hidden" visibility. | 
|  | 2332 | if (!Args.hasArg(options::OPT_fvisibility_EQ, | 
|  | 2333 | options::OPT_fvisibility_ms_compat)) { | 
|  | 2334 | CmdArgs.push_back("-fvisibility"); | 
|  | 2335 | CmdArgs.push_back("hidden"); | 
|  | 2336 | } | 
|  | 2337 | } | 
|  | 2338 |  | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2339 | // Decode AArch64 features from string like +[no]featureA+[no]featureB+... | 
| Craig Topper | bf3e327 | 2014-08-30 16:55:52 +0000 | [diff] [blame] | 2340 | static bool DecodeAArch64Features(const Driver &D, StringRef text, | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2341 | std::vector<const char *> &Features) { | 
|  | 2342 | SmallVector<StringRef, 8> Split; | 
|  | 2343 | text.split(Split, StringRef("+"), -1, false); | 
|  | 2344 |  | 
| Benjamin Kramer | 72e6431 | 2015-09-24 14:48:49 +0000 | [diff] [blame] | 2345 | for (StringRef Feature : Split) { | 
| Zijiao Ma | 33e9521 | 2016-07-28 06:24:48 +0000 | [diff] [blame] | 2346 | if (const char *FeatureName = llvm::AArch64::getArchExtFeature(Feature)) | 
|  | 2347 | Features.push_back(FeatureName); | 
| Douglas Katzman | 2675d01 | 2015-06-29 19:12:56 +0000 | [diff] [blame] | 2348 | else if (Feature == "neon" || Feature == "noneon") | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2349 | D.Diag(diag::err_drv_no_neon_modifier); | 
|  | 2350 | else | 
|  | 2351 | return false; | 
|  | 2352 | } | 
|  | 2353 | return true; | 
|  | 2354 | } | 
|  | 2355 |  | 
|  | 2356 | // Check if the CPU name and feature modifiers in -mcpu are legal. If yes, | 
|  | 2357 | // decode CPU and feature. | 
|  | 2358 | static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU, | 
|  | 2359 | std::vector<const char *> &Features) { | 
|  | 2360 | std::pair<StringRef, StringRef> Split = Mcpu.split("+"); | 
|  | 2361 | CPU = Split.first; | 
| Zijiao Ma | 33e9521 | 2016-07-28 06:24:48 +0000 | [diff] [blame] | 2362 |  | 
|  | 2363 | if (CPU == "generic") { | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2364 | Features.push_back("+neon"); | 
|  | 2365 | } else { | 
| Zijiao Ma | 33e9521 | 2016-07-28 06:24:48 +0000 | [diff] [blame] | 2366 | unsigned ArchKind = llvm::AArch64::parseCPUArch(CPU); | 
|  | 2367 | unsigned Extersion = llvm::AArch64::getDefaultExtensions(CPU, ArchKind); | 
|  | 2368 |  | 
|  | 2369 | if (!llvm::AArch64::getExtensionFeatures(Extersion, Features)) | 
|  | 2370 | return false; | 
|  | 2371 | } | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2372 |  | 
|  | 2373 | if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features)) | 
|  | 2374 | return false; | 
|  | 2375 |  | 
|  | 2376 | return true; | 
|  | 2377 | } | 
|  | 2378 |  | 
|  | 2379 | static bool | 
|  | 2380 | getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, | 
|  | 2381 | const ArgList &Args, | 
|  | 2382 | std::vector<const char *> &Features) { | 
| Gabor Ballabas | 3645149 | 2015-06-18 14:23:12 +0000 | [diff] [blame] | 2383 | std::string MarchLowerCase = March.lower(); | 
|  | 2384 | std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+"); | 
| Vladimir Sukharev | e851e04 | 2015-04-16 15:53:09 +0000 | [diff] [blame] | 2385 |  | 
| Zijiao Ma | 33e9521 | 2016-07-28 06:24:48 +0000 | [diff] [blame] | 2386 | unsigned ArchKind = llvm::AArch64::parseArch(Split.first); | 
|  | 2387 | if (ArchKind == static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID) || | 
|  | 2388 | !llvm::AArch64::getArchFeatures(ArchKind, Features) || | 
|  | 2389 | (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))) | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2390 | return false; | 
|  | 2391 |  | 
|  | 2392 | return true; | 
|  | 2393 | } | 
|  | 2394 |  | 
|  | 2395 | static bool | 
|  | 2396 | getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, | 
|  | 2397 | const ArgList &Args, | 
|  | 2398 | std::vector<const char *> &Features) { | 
|  | 2399 | StringRef CPU; | 
| Gabor Ballabas | 726ce7f | 2015-06-12 17:33:37 +0000 | [diff] [blame] | 2400 | std::string McpuLowerCase = Mcpu.lower(); | 
|  | 2401 | if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features)) | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2402 | return false; | 
|  | 2403 |  | 
|  | 2404 | return true; | 
|  | 2405 | } | 
|  | 2406 |  | 
|  | 2407 | static bool | 
|  | 2408 | getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune, | 
|  | 2409 | const ArgList &Args, | 
|  | 2410 | std::vector<const char *> &Features) { | 
| Gabor Ballabas | a24a1a4 | 2015-07-20 11:28:20 +0000 | [diff] [blame] | 2411 | std::string MtuneLowerCase = Mtune.lower(); | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2412 | // Handle CPU name is 'native'. | 
| Gabor Ballabas | a24a1a4 | 2015-07-20 11:28:20 +0000 | [diff] [blame] | 2413 | if (MtuneLowerCase == "native") | 
|  | 2414 | MtuneLowerCase = llvm::sys::getHostCPUName(); | 
|  | 2415 | if (MtuneLowerCase == "cyclone") { | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2416 | Features.push_back("+zcm"); | 
|  | 2417 | Features.push_back("+zcz"); | 
|  | 2418 | } | 
|  | 2419 | return true; | 
|  | 2420 | } | 
|  | 2421 |  | 
|  | 2422 | static bool | 
|  | 2423 | getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, | 
|  | 2424 | const ArgList &Args, | 
|  | 2425 | std::vector<const char *> &Features) { | 
|  | 2426 | StringRef CPU; | 
|  | 2427 | std::vector<const char *> DecodedFeature; | 
| Gabor Ballabas | 726ce7f | 2015-06-12 17:33:37 +0000 | [diff] [blame] | 2428 | std::string McpuLowerCase = Mcpu.lower(); | 
|  | 2429 | if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature)) | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2430 | return false; | 
|  | 2431 |  | 
|  | 2432 | return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features); | 
|  | 2433 | } | 
|  | 2434 |  | 
| Justin Bogner | f905256 | 2015-11-13 23:07:31 +0000 | [diff] [blame] | 2435 | static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args, | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2436 | std::vector<const char *> &Features) { | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2437 | Arg *A; | 
|  | 2438 | bool success = true; | 
|  | 2439 | // Enable NEON by default. | 
|  | 2440 | Features.push_back("+neon"); | 
|  | 2441 | if ((A = Args.getLastArg(options::OPT_march_EQ))) | 
|  | 2442 | success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features); | 
|  | 2443 | else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) | 
|  | 2444 | success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features); | 
| Tim Northover | 642e770 | 2014-11-10 21:17:23 +0000 | [diff] [blame] | 2445 | else if (Args.hasArg(options::OPT_arch)) | 
|  | 2446 | success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args, | 
|  | 2447 | Features); | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2448 |  | 
|  | 2449 | if (success && (A = Args.getLastArg(options::OPT_mtune_EQ))) | 
|  | 2450 | success = | 
|  | 2451 | getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features); | 
|  | 2452 | else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ))) | 
|  | 2453 | success = | 
|  | 2454 | getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features); | 
| Tim Northover | 642e770 | 2014-11-10 21:17:23 +0000 | [diff] [blame] | 2455 | else if (Args.hasArg(options::OPT_arch)) | 
|  | 2456 | success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), | 
|  | 2457 | Args, Features); | 
| Kevin Qin | 110db6f | 2014-07-18 07:03:22 +0000 | [diff] [blame] | 2458 |  | 
|  | 2459 | if (!success) | 
|  | 2460 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
| Amara Emerson | 04e2ecf | 2014-01-23 15:48:30 +0000 | [diff] [blame] | 2461 |  | 
|  | 2462 | if (Args.getLastArg(options::OPT_mgeneral_regs_only)) { | 
|  | 2463 | Features.push_back("-fp-armv8"); | 
|  | 2464 | Features.push_back("-crypto"); | 
|  | 2465 | Features.push_back("-neon"); | 
|  | 2466 | } | 
| Bradley Smith | 418c593 | 2014-05-02 15:17:51 +0000 | [diff] [blame] | 2467 |  | 
|  | 2468 | // En/disable crc | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2469 | if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) { | 
| Bradley Smith | 418c593 | 2014-05-02 15:17:51 +0000 | [diff] [blame] | 2470 | if (A->getOption().matches(options::OPT_mcrc)) | 
|  | 2471 | Features.push_back("+crc"); | 
|  | 2472 | else | 
|  | 2473 | Features.push_back("-crc"); | 
|  | 2474 | } | 
| Akira Hatanaka | 4e3c86f | 2015-07-25 00:18:00 +0000 | [diff] [blame] | 2475 |  | 
| Akira Hatanaka | 085da7e | 2015-07-29 14:25:58 +0000 | [diff] [blame] | 2476 | if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, | 
|  | 2477 | options::OPT_munaligned_access)) | 
|  | 2478 | if (A->getOption().matches(options::OPT_mno_unaligned_access)) | 
|  | 2479 | Features.push_back("+strict-align"); | 
|  | 2480 |  | 
| Justin Bogner | f905256 | 2015-11-13 23:07:31 +0000 | [diff] [blame] | 2481 | if (Args.hasArg(options::OPT_ffixed_x18)) | 
| Akira Hatanaka | 4e3c86f | 2015-07-25 00:18:00 +0000 | [diff] [blame] | 2482 | Features.push_back("+reserve-x18"); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2483 | } | 
|  | 2484 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 2485 | static void getHexagonTargetFeatures(const ArgList &Args, | 
|  | 2486 | std::vector<const char *> &Features) { | 
|  | 2487 | bool HasHVX = false, HasHVXD = false; | 
|  | 2488 |  | 
| Eric Christopher | 49062a5 | 2015-12-22 03:12:34 +0000 | [diff] [blame] | 2489 | // FIXME: This should be able to use handleTargetFeaturesGroup except it is | 
|  | 2490 | // doing dependent option handling here rather than in initFeatureMap or a | 
|  | 2491 | // similar handler. | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 2492 | for (auto &A : Args) { | 
|  | 2493 | auto &Opt = A->getOption(); | 
|  | 2494 | if (Opt.matches(options::OPT_mhexagon_hvx)) | 
|  | 2495 | HasHVX = true; | 
|  | 2496 | else if (Opt.matches(options::OPT_mno_hexagon_hvx)) | 
|  | 2497 | HasHVXD = HasHVX = false; | 
|  | 2498 | else if (Opt.matches(options::OPT_mhexagon_hvx_double)) | 
|  | 2499 | HasHVXD = HasHVX = true; | 
|  | 2500 | else if (Opt.matches(options::OPT_mno_hexagon_hvx_double)) | 
|  | 2501 | HasHVXD = false; | 
|  | 2502 | else | 
|  | 2503 | continue; | 
|  | 2504 | A->claim(); | 
|  | 2505 | } | 
|  | 2506 |  | 
|  | 2507 | Features.push_back(HasHVX  ? "+hvx" : "-hvx"); | 
|  | 2508 | Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double"); | 
|  | 2509 | } | 
|  | 2510 |  | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 2511 | static void getWebAssemblyTargetFeatures(const ArgList &Args, | 
|  | 2512 | std::vector<const char *> &Features) { | 
| Eric Christopher | 49062a5 | 2015-12-22 03:12:34 +0000 | [diff] [blame] | 2513 | handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group); | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 2514 | } | 
|  | 2515 |  | 
| Konstantin Zhuravlyov | 5124bf8 | 2016-04-12 21:42:15 +0000 | [diff] [blame] | 2516 | static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args, | 
|  | 2517 | std::vector<const char *> &Features) { | 
|  | 2518 | if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) { | 
|  | 2519 | StringRef value = dAbi->getValue(); | 
|  | 2520 | if (value == "1.0") { | 
|  | 2521 | Features.push_back("+amdgpu-debugger-insert-nops"); | 
| Konstantin Zhuravlyov | e6dbd90 | 2016-05-26 19:36:39 +0000 | [diff] [blame] | 2522 | Features.push_back("+amdgpu-debugger-reserve-regs"); | 
|  | 2523 | Features.push_back("+amdgpu-debugger-emit-prologue"); | 
| Konstantin Zhuravlyov | 5124bf8 | 2016-04-12 21:42:15 +0000 | [diff] [blame] | 2524 | } else { | 
|  | 2525 | D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args); | 
|  | 2526 | } | 
|  | 2527 | } | 
|  | 2528 |  | 
|  | 2529 | handleTargetFeaturesGroup( | 
|  | 2530 | Args, Features, options::OPT_m_amdgpu_Features_Group); | 
|  | 2531 | } | 
|  | 2532 |  | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 2533 | static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple, | 
| Rafael Espindola | 9c6fb0f | 2013-11-23 14:36:40 +0000 | [diff] [blame] | 2534 | const ArgList &Args, ArgStringList &CmdArgs, | 
|  | 2535 | bool ForAS) { | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 2536 | const Driver &D = TC.getDriver(); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2537 | std::vector<const char *> Features; | 
|  | 2538 | switch (Triple.getArch()) { | 
|  | 2539 | default: | 
|  | 2540 | break; | 
|  | 2541 | case llvm::Triple::mips: | 
|  | 2542 | case llvm::Triple::mipsel: | 
|  | 2543 | case llvm::Triple::mips64: | 
|  | 2544 | case llvm::Triple::mips64el: | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 2545 | getMIPSTargetFeatures(D, Triple, Args, Features); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2546 | break; | 
|  | 2547 |  | 
|  | 2548 | case llvm::Triple::arm: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 2549 | case llvm::Triple::armeb: | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2550 | case llvm::Triple::thumb: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 2551 | case llvm::Triple::thumbeb: | 
| Saleem Abdulrasool | 06f6f99 | 2015-09-19 20:40:16 +0000 | [diff] [blame] | 2552 | getARMTargetFeatures(TC, Triple, Args, Features, ForAS); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2553 | break; | 
|  | 2554 |  | 
|  | 2555 | case llvm::Triple::ppc: | 
|  | 2556 | case llvm::Triple::ppc64: | 
|  | 2557 | case llvm::Triple::ppc64le: | 
| Petar Jovanovic | 88a328f | 2015-12-14 17:51:50 +0000 | [diff] [blame] | 2558 | getPPCTargetFeatures(D, Triple, Args, Features); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2559 | break; | 
| Ulrich Weigand | 3a610eb | 2015-04-01 12:54:25 +0000 | [diff] [blame] | 2560 | case llvm::Triple::systemz: | 
|  | 2561 | getSystemZTargetFeatures(Args, Features); | 
|  | 2562 | break; | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2563 | case llvm::Triple::aarch64: | 
| Christian Pirker | 9b019ae | 2014-02-25 13:51:00 +0000 | [diff] [blame] | 2564 | case llvm::Triple::aarch64_be: | 
| Justin Bogner | f905256 | 2015-11-13 23:07:31 +0000 | [diff] [blame] | 2565 | getAArch64TargetFeatures(D, Args, Features); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2566 | break; | 
|  | 2567 | case llvm::Triple::x86: | 
|  | 2568 | case llvm::Triple::x86_64: | 
| Ehsan Akhgari | eeb7e65 | 2014-07-15 18:27:51 +0000 | [diff] [blame] | 2569 | getX86TargetFeatures(D, Triple, Args, Features); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2570 | break; | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 2571 | case llvm::Triple::hexagon: | 
|  | 2572 | getHexagonTargetFeatures(Args, Features); | 
|  | 2573 | break; | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 2574 | case llvm::Triple::wasm32: | 
|  | 2575 | case llvm::Triple::wasm64: | 
|  | 2576 | getWebAssemblyTargetFeatures(Args, Features); | 
| Adrian McCarthy | 084148f | 2016-08-25 18:24:35 +0000 | [diff] [blame] | 2577 | break; | 
| Jacob Baungard Hansen | 13a4937 | 2016-05-24 08:30:08 +0000 | [diff] [blame] | 2578 | case llvm::Triple::sparc: | 
|  | 2579 | case llvm::Triple::sparcel: | 
|  | 2580 | case llvm::Triple::sparcv9: | 
|  | 2581 | getSparcTargetFeatures(D, Args, Features); | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 2582 | break; | 
| Konstantin Zhuravlyov | 5124bf8 | 2016-04-12 21:42:15 +0000 | [diff] [blame] | 2583 | case llvm::Triple::r600: | 
|  | 2584 | case llvm::Triple::amdgcn: | 
|  | 2585 | getAMDGPUTargetFeatures(D, Args, Features); | 
|  | 2586 | break; | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2587 | } | 
| Rafael Espindola | 4396480 | 2013-08-21 17:34:32 +0000 | [diff] [blame] | 2588 |  | 
|  | 2589 | // Find the last of each feature. | 
|  | 2590 | llvm::StringMap<unsigned> LastOpt; | 
|  | 2591 | for (unsigned I = 0, N = Features.size(); I < N; ++I) { | 
|  | 2592 | const char *Name = Features[I]; | 
|  | 2593 | assert(Name[0] == '-' || Name[0] == '+'); | 
|  | 2594 | LastOpt[Name + 1] = I; | 
|  | 2595 | } | 
|  | 2596 |  | 
|  | 2597 | for (unsigned I = 0, N = Features.size(); I < N; ++I) { | 
|  | 2598 | // If this feature was overridden, ignore it. | 
|  | 2599 | const char *Name = Features[I]; | 
|  | 2600 | llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1); | 
|  | 2601 | assert(LastI != LastOpt.end()); | 
|  | 2602 | unsigned Last = LastI->second; | 
|  | 2603 | if (Last != I) | 
|  | 2604 | continue; | 
|  | 2605 |  | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2606 | CmdArgs.push_back("-target-feature"); | 
| Rafael Espindola | 4396480 | 2013-08-21 17:34:32 +0000 | [diff] [blame] | 2607 | CmdArgs.push_back(Name); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 2608 | } | 
| Tim Northover | 2fe823a | 2013-08-01 09:23:19 +0000 | [diff] [blame] | 2609 | } | 
|  | 2610 |  | 
| David Majnemer | ae39481 | 2014-12-09 00:12:30 +0000 | [diff] [blame] | 2611 | static bool | 
|  | 2612 | shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime, | 
|  | 2613 | const llvm::Triple &Triple) { | 
|  | 2614 | // We use the zero-cost exception tables for Objective-C if the non-fragile | 
|  | 2615 | // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and | 
|  | 2616 | // later. | 
|  | 2617 | if (runtime.isNonFragile()) | 
|  | 2618 | return true; | 
|  | 2619 |  | 
|  | 2620 | if (!Triple.isMacOSX()) | 
|  | 2621 | return false; | 
|  | 2622 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2623 | return (!Triple.isMacOSXVersionLT(10, 5) && | 
| David Majnemer | ae39481 | 2014-12-09 00:12:30 +0000 | [diff] [blame] | 2624 | (Triple.getArch() == llvm::Triple::x86_64 || | 
|  | 2625 | Triple.getArch() == llvm::Triple::arm)); | 
|  | 2626 | } | 
|  | 2627 |  | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2628 | /// Adds exception related arguments to the driver command arguments. There's a | 
|  | 2629 | /// master flag, -fexceptions and also language specific flags to enable/disable | 
|  | 2630 | /// C++ and Objective-C exceptions. This makes it possible to for example | 
|  | 2631 | /// disable C++ exceptions but enable Objective-C exceptions. | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2632 | static void addExceptionArgs(const ArgList &Args, types::ID InputType, | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2633 | const ToolChain &TC, bool KernelOrKext, | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 2634 | const ObjCRuntime &objcRuntime, | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2635 | ArgStringList &CmdArgs) { | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2636 | const Driver &D = TC.getDriver(); | 
|  | 2637 | const llvm::Triple &Triple = TC.getTriple(); | 
|  | 2638 |  | 
| Chad Rosier | 4fab82c | 2012-03-26 22:04:46 +0000 | [diff] [blame] | 2639 | if (KernelOrKext) { | 
|  | 2640 | // -mkernel and -fapple-kext imply no exceptions, so claim exception related | 
|  | 2641 | // arguments now to avoid warnings about unused arguments. | 
|  | 2642 | Args.ClaimAllArgs(options::OPT_fexceptions); | 
|  | 2643 | Args.ClaimAllArgs(options::OPT_fno_exceptions); | 
|  | 2644 | Args.ClaimAllArgs(options::OPT_fobjc_exceptions); | 
|  | 2645 | Args.ClaimAllArgs(options::OPT_fno_objc_exceptions); | 
|  | 2646 | Args.ClaimAllArgs(options::OPT_fcxx_exceptions); | 
|  | 2647 | Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions); | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2648 | return; | 
| Chad Rosier | 4fab82c | 2012-03-26 22:04:46 +0000 | [diff] [blame] | 2649 | } | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2650 |  | 
| Reid Kleckner | 0bb1fc4 | 2015-07-10 22:25:44 +0000 | [diff] [blame] | 2651 | // See if the user explicitly enabled exceptions. | 
|  | 2652 | bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, | 
|  | 2653 | false); | 
| Daniel Dunbar | 30a12b8 | 2010-09-14 23:12:31 +0000 | [diff] [blame] | 2654 |  | 
| David Majnemer | ae39481 | 2014-12-09 00:12:30 +0000 | [diff] [blame] | 2655 | // Obj-C exceptions are enabled by default, regardless of -fexceptions. This | 
|  | 2656 | // is not necessarily sensible, but follows GCC. | 
|  | 2657 | if (types::isObjC(InputType) && | 
|  | 2658 | Args.hasFlag(options::OPT_fobjc_exceptions, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2659 | options::OPT_fno_objc_exceptions, true)) { | 
| David Majnemer | ae39481 | 2014-12-09 00:12:30 +0000 | [diff] [blame] | 2660 | CmdArgs.push_back("-fobjc-exceptions"); | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2661 |  | 
| David Majnemer | ae39481 | 2014-12-09 00:12:30 +0000 | [diff] [blame] | 2662 | EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple); | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2663 | } | 
|  | 2664 |  | 
|  | 2665 | if (types::isCXX(InputType)) { | 
| David Majnemer | 5972939 | 2016-02-18 08:15:05 +0000 | [diff] [blame] | 2666 | // Disable C++ EH by default on XCore and PS4. | 
|  | 2667 | bool CXXExceptionsEnabled = | 
|  | 2668 | Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU(); | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2669 | Arg *ExceptionArg = Args.getLastArg( | 
|  | 2670 | options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions, | 
|  | 2671 | options::OPT_fexceptions, options::OPT_fno_exceptions); | 
|  | 2672 | if (ExceptionArg) | 
| David Majnemer | 8de6864 | 2014-12-05 08:11:58 +0000 | [diff] [blame] | 2673 | CXXExceptionsEnabled = | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2674 | ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) || | 
|  | 2675 | ExceptionArg->getOption().matches(options::OPT_fexceptions); | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2676 |  | 
|  | 2677 | if (CXXExceptionsEnabled) { | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 2678 | if (Triple.isPS4CPU()) { | 
|  | 2679 | ToolChain::RTTIMode RTTIMode = TC.getRTTIMode(); | 
|  | 2680 | assert(ExceptionArg && | 
|  | 2681 | "On the PS4 exceptions should only be enabled if passing " | 
|  | 2682 | "an argument"); | 
|  | 2683 | if (RTTIMode == ToolChain::RM_DisabledExplicitly) { | 
|  | 2684 | const Arg *RTTIArg = TC.getRTTIArg(); | 
|  | 2685 | assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!"); | 
|  | 2686 | D.Diag(diag::err_drv_argument_not_allowed_with) | 
|  | 2687 | << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args); | 
|  | 2688 | } else if (RTTIMode == ToolChain::RM_EnabledImplicitly) | 
|  | 2689 | D.Diag(diag::warn_drv_enabling_rtti_with_exceptions); | 
|  | 2690 | } else | 
|  | 2691 | assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly); | 
|  | 2692 |  | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2693 | CmdArgs.push_back("-fcxx-exceptions"); | 
|  | 2694 |  | 
| David Majnemer | 8de6864 | 2014-12-05 08:11:58 +0000 | [diff] [blame] | 2695 | EH = true; | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2696 | } | 
|  | 2697 | } | 
|  | 2698 |  | 
| David Majnemer | 8de6864 | 2014-12-05 08:11:58 +0000 | [diff] [blame] | 2699 | if (EH) | 
| Anders Carlsson | e96ab55 | 2011-02-28 02:27:16 +0000 | [diff] [blame] | 2700 | CmdArgs.push_back("-fexceptions"); | 
| Rafael Espindola | 00a6657 | 2009-10-01 13:33:33 +0000 | [diff] [blame] | 2701 | } | 
|  | 2702 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2703 | static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) { | 
| Daniel Dunbar | e246fbe | 2013-04-16 18:21:19 +0000 | [diff] [blame] | 2704 | bool Default = true; | 
|  | 2705 | if (TC.getTriple().isOSDarwin()) { | 
|  | 2706 | // The native darwin assembler doesn't support the linker_option directives, | 
|  | 2707 | // so we disable them if we think the .s file will be passed to it. | 
|  | 2708 | Default = TC.useIntegratedAs(); | 
|  | 2709 | } | 
|  | 2710 | return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink, | 
|  | 2711 | Default); | 
|  | 2712 | } | 
|  | 2713 |  | 
| Ted Kremenek | 6209366 | 2013-03-12 17:02:12 +0000 | [diff] [blame] | 2714 | static bool ShouldDisableDwarfDirectory(const ArgList &Args, | 
|  | 2715 | const ToolChain &TC) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2716 | bool UseDwarfDirectory = | 
|  | 2717 | Args.hasFlag(options::OPT_fdwarf_directory_asm, | 
|  | 2718 | options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs()); | 
| Nick Lewycky | 1d617ac | 2011-10-17 23:05:52 +0000 | [diff] [blame] | 2719 | return !UseDwarfDirectory; | 
|  | 2720 | } | 
|  | 2721 |  | 
| Joerg Sonnenberger | ef317a2 | 2011-05-06 14:35:16 +0000 | [diff] [blame] | 2722 | /// \brief Check whether the given input tree contains any compilation actions. | 
|  | 2723 | static bool ContainsCompileAction(const Action *A) { | 
| Bob Wilson | 23a55f1 | 2014-12-21 07:00:00 +0000 | [diff] [blame] | 2724 | if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A)) | 
| Joerg Sonnenberger | ef317a2 | 2011-05-06 14:35:16 +0000 | [diff] [blame] | 2725 | return true; | 
|  | 2726 |  | 
| Nico Weber | 5a459f8 | 2016-02-23 19:30:43 +0000 | [diff] [blame] | 2727 | for (const auto &AI : A->inputs()) | 
|  | 2728 | if (ContainsCompileAction(AI)) | 
| Joerg Sonnenberger | ef317a2 | 2011-05-06 14:35:16 +0000 | [diff] [blame] | 2729 | return true; | 
|  | 2730 |  | 
|  | 2731 | return false; | 
|  | 2732 | } | 
|  | 2733 |  | 
|  | 2734 | /// \brief Check if -relax-all should be passed to the internal assembler. | 
|  | 2735 | /// This is done by default when compiling non-assembler source with -O0. | 
|  | 2736 | static bool UseRelaxAll(Compilation &C, const ArgList &Args) { | 
|  | 2737 | bool RelaxDefault = true; | 
|  | 2738 |  | 
|  | 2739 | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) | 
|  | 2740 | RelaxDefault = A->getOption().matches(options::OPT_O0); | 
|  | 2741 |  | 
|  | 2742 | if (RelaxDefault) { | 
|  | 2743 | RelaxDefault = false; | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 2744 | for (const auto &Act : C.getActions()) { | 
|  | 2745 | if (ContainsCompileAction(Act)) { | 
| Joerg Sonnenberger | ef317a2 | 2011-05-06 14:35:16 +0000 | [diff] [blame] | 2746 | RelaxDefault = true; | 
|  | 2747 | break; | 
|  | 2748 | } | 
|  | 2749 | } | 
|  | 2750 | } | 
|  | 2751 |  | 
|  | 2752 | return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2753 | RelaxDefault); | 
| Joerg Sonnenberger | ef317a2 | 2011-05-06 14:35:16 +0000 | [diff] [blame] | 2754 | } | 
|  | 2755 |  | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2756 | // Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases | 
|  | 2757 | // to the corresponding DebugInfoKind. | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2758 | static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) { | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2759 | assert(A.getOption().matches(options::OPT_gN_Group) && | 
|  | 2760 | "Not a -g option that specifies a debug-info level"); | 
|  | 2761 | if (A.getOption().matches(options::OPT_g0) || | 
|  | 2762 | A.getOption().matches(options::OPT_ggdb0)) | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2763 | return codegenoptions::NoDebugInfo; | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2764 | if (A.getOption().matches(options::OPT_gline_tables_only) || | 
|  | 2765 | A.getOption().matches(options::OPT_ggdb1)) | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2766 | return codegenoptions::DebugLineTablesOnly; | 
|  | 2767 | return codegenoptions::LimitedDebugInfo; | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2768 | } | 
|  | 2769 |  | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2770 | // Extract the integer N from a string spelled "-dwarf-N", returning 0 | 
|  | 2771 | // on mismatch. The StringRef input (rather than an Arg) allows | 
|  | 2772 | // for use by the "-Xassembler" option parser. | 
|  | 2773 | static unsigned DwarfVersionNum(StringRef ArgValue) { | 
|  | 2774 | return llvm::StringSwitch<unsigned>(ArgValue) | 
|  | 2775 | .Case("-gdwarf-2", 2) | 
|  | 2776 | .Case("-gdwarf-3", 3) | 
|  | 2777 | .Case("-gdwarf-4", 4) | 
| Eric Christopher | 3cb592d | 2015-12-28 19:58:44 +0000 | [diff] [blame] | 2778 | .Case("-gdwarf-5", 5) | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2779 | .Default(0); | 
|  | 2780 | } | 
|  | 2781 |  | 
|  | 2782 | static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs, | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2783 | codegenoptions::DebugInfoKind DebugInfoKind, | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2784 | unsigned DwarfVersion, | 
|  | 2785 | llvm::DebuggerKind DebuggerTuning) { | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2786 | switch (DebugInfoKind) { | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2787 | case codegenoptions::DebugLineTablesOnly: | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2788 | CmdArgs.push_back("-debug-info-kind=line-tables-only"); | 
|  | 2789 | break; | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2790 | case codegenoptions::LimitedDebugInfo: | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2791 | CmdArgs.push_back("-debug-info-kind=limited"); | 
|  | 2792 | break; | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2793 | case codegenoptions::FullDebugInfo: | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2794 | CmdArgs.push_back("-debug-info-kind=standalone"); | 
|  | 2795 | break; | 
|  | 2796 | default: | 
|  | 2797 | break; | 
|  | 2798 | } | 
|  | 2799 | if (DwarfVersion > 0) | 
|  | 2800 | CmdArgs.push_back( | 
| Benjamin Kramer | 32bd3c8 | 2015-10-08 10:31:17 +0000 | [diff] [blame] | 2801 | Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion))); | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 2802 | switch (DebuggerTuning) { | 
|  | 2803 | case llvm::DebuggerKind::GDB: | 
|  | 2804 | CmdArgs.push_back("-debugger-tuning=gdb"); | 
|  | 2805 | break; | 
|  | 2806 | case llvm::DebuggerKind::LLDB: | 
|  | 2807 | CmdArgs.push_back("-debugger-tuning=lldb"); | 
|  | 2808 | break; | 
|  | 2809 | case llvm::DebuggerKind::SCE: | 
|  | 2810 | CmdArgs.push_back("-debugger-tuning=sce"); | 
|  | 2811 | break; | 
|  | 2812 | default: | 
|  | 2813 | break; | 
|  | 2814 | } | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2815 | } | 
|  | 2816 |  | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2817 | static void CollectArgsForIntegratedAssembler(Compilation &C, | 
|  | 2818 | const ArgList &Args, | 
|  | 2819 | ArgStringList &CmdArgs, | 
|  | 2820 | const Driver &D) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2821 | if (UseRelaxAll(C, Args)) | 
|  | 2822 | CmdArgs.push_back("-mrelax-all"); | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2823 |  | 
| David Majnemer | 2b9349d | 2015-12-21 22:09:34 +0000 | [diff] [blame] | 2824 | // Only default to -mincremental-linker-compatible if we think we are | 
|  | 2825 | // targeting the MSVC linker. | 
|  | 2826 | bool DefaultIncrementalLinkerCompatible = | 
|  | 2827 | C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment(); | 
|  | 2828 | if (Args.hasFlag(options::OPT_mincremental_linker_compatible, | 
|  | 2829 | options::OPT_mno_incremental_linker_compatible, | 
|  | 2830 | DefaultIncrementalLinkerCompatible)) | 
|  | 2831 | CmdArgs.push_back("-mincremental-linker-compatible"); | 
|  | 2832 |  | 
| Oliver Stannard | 7921e83 | 2016-07-27 08:54:13 +0000 | [diff] [blame] | 2833 | switch (C.getDefaultToolChain().getArch()) { | 
|  | 2834 | case llvm::Triple::arm: | 
|  | 2835 | case llvm::Triple::armeb: | 
|  | 2836 | case llvm::Triple::thumb: | 
|  | 2837 | case llvm::Triple::thumbeb: | 
|  | 2838 | if (Arg *A = Args.getLastArg(options::OPT_mimplicit_it_EQ)) { | 
|  | 2839 | StringRef Value = A->getValue(); | 
|  | 2840 | if (Value == "always" || Value == "never" || Value == "arm" || | 
|  | 2841 | Value == "thumb") { | 
|  | 2842 | CmdArgs.push_back("-mllvm"); | 
|  | 2843 | CmdArgs.push_back(Args.MakeArgString("-arm-implicit-it=" + Value)); | 
|  | 2844 | } else { | 
|  | 2845 | D.Diag(diag::err_drv_unsupported_option_argument) | 
|  | 2846 | << A->getOption().getName() << Value; | 
|  | 2847 | } | 
|  | 2848 | } | 
|  | 2849 | break; | 
|  | 2850 | default: | 
|  | 2851 | break; | 
|  | 2852 | } | 
|  | 2853 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2854 | // When passing -I arguments to the assembler we sometimes need to | 
|  | 2855 | // unconditionally take the next argument.  For example, when parsing | 
|  | 2856 | // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the | 
|  | 2857 | // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo' | 
|  | 2858 | // arg after parsing the '-I' arg. | 
|  | 2859 | bool TakeNextArg = false; | 
| David Peixotto | dfb6614 | 2013-11-14 22:52:58 +0000 | [diff] [blame] | 2860 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2861 | // When using an integrated assembler, translate -Wa, and -Xassembler | 
|  | 2862 | // options. | 
|  | 2863 | bool CompressDebugSections = false; | 
| Rafael Espindola | f8f01c3 | 2016-05-29 02:01:14 +0000 | [diff] [blame] | 2864 |  | 
| Rafael Espindola | 557679f | 2016-06-20 23:54:44 +0000 | [diff] [blame] | 2865 | bool UseRelaxRelocations = ENABLE_X86_RELAX_RELOCATIONS; | 
| Scott Egerton | b67d469 | 2016-01-14 13:01:48 +0000 | [diff] [blame] | 2866 | const char *MipsTargetFeature = nullptr; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2867 | for (const Arg *A : | 
|  | 2868 | Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { | 
|  | 2869 | A->claim(); | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2870 |  | 
| Benjamin Kramer | 72e6431 | 2015-09-24 14:48:49 +0000 | [diff] [blame] | 2871 | for (StringRef Value : A->getValues()) { | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 2872 | if (TakeNextArg) { | 
|  | 2873 | CmdArgs.push_back(Value.data()); | 
|  | 2874 | TakeNextArg = false; | 
|  | 2875 | continue; | 
|  | 2876 | } | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2877 |  | 
| Daniel Sanders | 3d5e568 | 2015-10-27 18:04:42 +0000 | [diff] [blame] | 2878 | switch (C.getDefaultToolChain().getArch()) { | 
|  | 2879 | default: | 
|  | 2880 | break; | 
|  | 2881 | case llvm::Triple::mips: | 
|  | 2882 | case llvm::Triple::mipsel: | 
|  | 2883 | case llvm::Triple::mips64: | 
|  | 2884 | case llvm::Triple::mips64el: | 
|  | 2885 | if (Value == "--trap") { | 
|  | 2886 | CmdArgs.push_back("-target-feature"); | 
|  | 2887 | CmdArgs.push_back("+use-tcc-in-div"); | 
|  | 2888 | continue; | 
|  | 2889 | } | 
|  | 2890 | if (Value == "--break") { | 
|  | 2891 | CmdArgs.push_back("-target-feature"); | 
|  | 2892 | CmdArgs.push_back("-use-tcc-in-div"); | 
|  | 2893 | continue; | 
|  | 2894 | } | 
|  | 2895 | if (Value.startswith("-msoft-float")) { | 
|  | 2896 | CmdArgs.push_back("-target-feature"); | 
|  | 2897 | CmdArgs.push_back("+soft-float"); | 
|  | 2898 | continue; | 
|  | 2899 | } | 
|  | 2900 | if (Value.startswith("-mhard-float")) { | 
|  | 2901 | CmdArgs.push_back("-target-feature"); | 
|  | 2902 | CmdArgs.push_back("-soft-float"); | 
|  | 2903 | continue; | 
|  | 2904 | } | 
| Scott Egerton | b67d469 | 2016-01-14 13:01:48 +0000 | [diff] [blame] | 2905 |  | 
|  | 2906 | MipsTargetFeature = llvm::StringSwitch<const char *>(Value) | 
|  | 2907 | .Case("-mips1", "+mips1") | 
|  | 2908 | .Case("-mips2", "+mips2") | 
|  | 2909 | .Case("-mips3", "+mips3") | 
|  | 2910 | .Case("-mips4", "+mips4") | 
|  | 2911 | .Case("-mips5", "+mips5") | 
|  | 2912 | .Case("-mips32", "+mips32") | 
|  | 2913 | .Case("-mips32r2", "+mips32r2") | 
|  | 2914 | .Case("-mips32r3", "+mips32r3") | 
|  | 2915 | .Case("-mips32r5", "+mips32r5") | 
|  | 2916 | .Case("-mips32r6", "+mips32r6") | 
|  | 2917 | .Case("-mips64", "+mips64") | 
|  | 2918 | .Case("-mips64r2", "+mips64r2") | 
|  | 2919 | .Case("-mips64r3", "+mips64r3") | 
|  | 2920 | .Case("-mips64r5", "+mips64r5") | 
|  | 2921 | .Case("-mips64r6", "+mips64r6") | 
|  | 2922 | .Default(nullptr); | 
|  | 2923 | if (MipsTargetFeature) | 
|  | 2924 | continue; | 
| Daniel Sanders | 3d5e568 | 2015-10-27 18:04:42 +0000 | [diff] [blame] | 2925 | } | 
|  | 2926 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2927 | if (Value == "-force_cpusubtype_ALL") { | 
|  | 2928 | // Do nothing, this is the default and we don't support anything else. | 
|  | 2929 | } else if (Value == "-L") { | 
|  | 2930 | CmdArgs.push_back("-msave-temp-labels"); | 
|  | 2931 | } else if (Value == "--fatal-warnings") { | 
|  | 2932 | CmdArgs.push_back("-massembler-fatal-warnings"); | 
|  | 2933 | } else if (Value == "--noexecstack") { | 
|  | 2934 | CmdArgs.push_back("-mnoexecstack"); | 
|  | 2935 | } else if (Value == "-compress-debug-sections" || | 
|  | 2936 | Value == "--compress-debug-sections") { | 
|  | 2937 | CompressDebugSections = true; | 
|  | 2938 | } else if (Value == "-nocompress-debug-sections" || | 
|  | 2939 | Value == "--nocompress-debug-sections") { | 
|  | 2940 | CompressDebugSections = false; | 
| Rafael Espindola | f8f01c3 | 2016-05-29 02:01:14 +0000 | [diff] [blame] | 2941 | } else if (Value == "-mrelax-relocations=yes" || | 
|  | 2942 | Value == "--mrelax-relocations=yes") { | 
|  | 2943 | UseRelaxRelocations = true; | 
|  | 2944 | } else if (Value == "-mrelax-relocations=no" || | 
|  | 2945 | Value == "--mrelax-relocations=no") { | 
|  | 2946 | UseRelaxRelocations = false; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2947 | } else if (Value.startswith("-I")) { | 
|  | 2948 | CmdArgs.push_back(Value.data()); | 
|  | 2949 | // We need to consume the next argument if the current arg is a plain | 
|  | 2950 | // -I. The next arg will be the include directory. | 
|  | 2951 | if (Value == "-I") | 
|  | 2952 | TakeNextArg = true; | 
|  | 2953 | } else if (Value.startswith("-gdwarf-")) { | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2954 | // "-gdwarf-N" options are not cc1as options. | 
|  | 2955 | unsigned DwarfVersion = DwarfVersionNum(Value); | 
|  | 2956 | if (DwarfVersion == 0) { // Send it onward, and let cc1as complain. | 
|  | 2957 | CmdArgs.push_back(Value.data()); | 
|  | 2958 | } else { | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 2959 | RenderDebugEnablingArgs(Args, CmdArgs, | 
|  | 2960 | codegenoptions::LimitedDebugInfo, | 
|  | 2961 | DwarfVersion, llvm::DebuggerKind::Default); | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 2962 | } | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 2963 | } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") || | 
|  | 2964 | Value.startswith("-mhwdiv") || Value.startswith("-march")) { | 
|  | 2965 | // Do nothing, we'll validate it later. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2966 | } else { | 
|  | 2967 | D.Diag(diag::err_drv_unsupported_option_argument) | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2968 | << A->getOption().getName() << Value; | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2969 | } | 
|  | 2970 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 2971 | } | 
|  | 2972 | if (CompressDebugSections) { | 
|  | 2973 | if (llvm::zlib::isAvailable()) | 
|  | 2974 | CmdArgs.push_back("-compress-debug-sections"); | 
|  | 2975 | else | 
|  | 2976 | D.Diag(diag::warn_debug_compression_unavailable); | 
|  | 2977 | } | 
| Rafael Espindola | f8f01c3 | 2016-05-29 02:01:14 +0000 | [diff] [blame] | 2978 | if (UseRelaxRelocations) | 
|  | 2979 | CmdArgs.push_back("--mrelax-relocations"); | 
| Scott Egerton | b67d469 | 2016-01-14 13:01:48 +0000 | [diff] [blame] | 2980 | if (MipsTargetFeature != nullptr) { | 
|  | 2981 | CmdArgs.push_back("-target-feature"); | 
|  | 2982 | CmdArgs.push_back(MipsTargetFeature); | 
|  | 2983 | } | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 2984 | } | 
|  | 2985 |  | 
| Alexey Samsonov | 99ee10d | 2014-05-22 21:13:30 +0000 | [diff] [blame] | 2986 | // This adds the static libclang_rt.builtins-arch.a directly to the command line | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 2987 | // FIXME: Make sure we can also emit shared objects if they're requested | 
|  | 2988 | // and available, check for possible errors, etc. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 2989 | static void addClangRT(const ToolChain &TC, const ArgList &Args, | 
|  | 2990 | ArgStringList &CmdArgs) { | 
|  | 2991 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins")); | 
| Alexey Samsonov | bdfa6c2 | 2014-04-01 13:31:10 +0000 | [diff] [blame] | 2992 | } | 
|  | 2993 |  | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 2994 | namespace { | 
|  | 2995 | enum OpenMPRuntimeKind { | 
|  | 2996 | /// An unknown OpenMP runtime. We can't generate effective OpenMP code | 
|  | 2997 | /// without knowing what runtime to target. | 
|  | 2998 | OMPRT_Unknown, | 
|  | 2999 |  | 
|  | 3000 | /// The LLVM OpenMP runtime. When completed and integrated, this will become | 
|  | 3001 | /// the default for Clang. | 
|  | 3002 | OMPRT_OMP, | 
|  | 3003 |  | 
|  | 3004 | /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for | 
|  | 3005 | /// this runtime but can swallow the pragmas, and find and link against the | 
|  | 3006 | /// runtime library itself. | 
|  | 3007 | OMPRT_GOMP, | 
|  | 3008 |  | 
| Chandler Carruth | c6625c6 | 2015-05-28 21:10:31 +0000 | [diff] [blame] | 3009 | /// The legacy name for the LLVM OpenMP runtime from when it was the Intel | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 3010 | /// OpenMP runtime. We support this mode for users with existing dependencies | 
|  | 3011 | /// on this runtime library name. | 
|  | 3012 | OMPRT_IOMP5 | 
|  | 3013 | }; | 
| Alexander Kornienko | ab9db51 | 2015-06-22 23:07:51 +0000 | [diff] [blame] | 3014 | } | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 3015 |  | 
|  | 3016 | /// Compute the desired OpenMP runtime from the flag provided. | 
| Chandler Carruth | c6625c6 | 2015-05-28 21:10:31 +0000 | [diff] [blame] | 3017 | static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC, | 
|  | 3018 | const ArgList &Args) { | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 3019 | StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME); | 
|  | 3020 |  | 
|  | 3021 | const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ); | 
|  | 3022 | if (A) | 
|  | 3023 | RuntimeName = A->getValue(); | 
|  | 3024 |  | 
|  | 3025 | auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3026 | .Case("libomp", OMPRT_OMP) | 
|  | 3027 | .Case("libgomp", OMPRT_GOMP) | 
|  | 3028 | .Case("libiomp5", OMPRT_IOMP5) | 
|  | 3029 | .Default(OMPRT_Unknown); | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 3030 |  | 
|  | 3031 | if (RT == OMPRT_Unknown) { | 
|  | 3032 | if (A) | 
|  | 3033 | TC.getDriver().Diag(diag::err_drv_unsupported_option_argument) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3034 | << A->getOption().getName() << A->getValue(); | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 3035 | else | 
|  | 3036 | // FIXME: We could use a nicer diagnostic here. | 
|  | 3037 | TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp"; | 
|  | 3038 | } | 
|  | 3039 |  | 
|  | 3040 | return RT; | 
|  | 3041 | } | 
|  | 3042 |  | 
| Joerg Sonnenberger | 95a9013 | 2015-09-23 14:06:52 +0000 | [diff] [blame] | 3043 | static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC, | 
|  | 3044 | const ArgList &Args) { | 
|  | 3045 | if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, | 
|  | 3046 | options::OPT_fno_openmp, false)) | 
|  | 3047 | return; | 
|  | 3048 |  | 
|  | 3049 | switch (getOpenMPRuntime(TC, Args)) { | 
|  | 3050 | case OMPRT_OMP: | 
|  | 3051 | CmdArgs.push_back("-lomp"); | 
|  | 3052 | break; | 
|  | 3053 | case OMPRT_GOMP: | 
|  | 3054 | CmdArgs.push_back("-lgomp"); | 
|  | 3055 | break; | 
|  | 3056 | case OMPRT_IOMP5: | 
|  | 3057 | CmdArgs.push_back("-liomp5"); | 
|  | 3058 | break; | 
|  | 3059 | case OMPRT_Unknown: | 
|  | 3060 | // Already diagnosed. | 
|  | 3061 | break; | 
|  | 3062 | } | 
|  | 3063 | } | 
|  | 3064 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3065 | static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, | 
|  | 3066 | ArgStringList &CmdArgs, StringRef Sanitizer, | 
|  | 3067 | bool IsShared, bool IsWhole) { | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3068 | // Wrap any static runtimes that must be forced into executable in | 
| Peter Collingbourne | f7ef3fd81 | 2013-10-20 21:29:13 +0000 | [diff] [blame] | 3069 | // whole-archive. | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3070 | if (IsWhole) CmdArgs.push_back("-whole-archive"); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3071 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared)); | 
|  | 3072 | if (IsWhole) CmdArgs.push_back("-no-whole-archive"); | 
| Alexey Samsonov | bfb0cd3 | 2013-02-27 11:14:55 +0000 | [diff] [blame] | 3073 | } | 
|  | 3074 |  | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3075 | // Tries to use a file with the list of dynamic symbols that need to be exported | 
|  | 3076 | // from the runtime library. Returns true if the file was found. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3077 | static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, | 
|  | 3078 | ArgStringList &CmdArgs, | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3079 | StringRef Sanitizer) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3080 | SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer)); | 
| Saleem Abdulrasool | 6815094 | 2014-12-30 22:52:08 +0000 | [diff] [blame] | 3081 | if (llvm::sys::fs::exists(SanRT + ".syms")) { | 
|  | 3082 | CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms")); | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3083 | return true; | 
|  | 3084 | } | 
|  | 3085 | return false; | 
|  | 3086 | } | 
|  | 3087 |  | 
|  | 3088 | static void linkSanitizerRuntimeDeps(const ToolChain &TC, | 
|  | 3089 | ArgStringList &CmdArgs) { | 
|  | 3090 | // Force linking against the system libraries sanitizers depends on | 
|  | 3091 | // (see PR15823 why this is necessary). | 
|  | 3092 | CmdArgs.push_back("--no-as-needed"); | 
|  | 3093 | CmdArgs.push_back("-lpthread"); | 
|  | 3094 | CmdArgs.push_back("-lrt"); | 
|  | 3095 | CmdArgs.push_back("-lm"); | 
|  | 3096 | // There's no libdl on FreeBSD. | 
|  | 3097 | if (TC.getTriple().getOS() != llvm::Triple::FreeBSD) | 
|  | 3098 | CmdArgs.push_back("-ldl"); | 
|  | 3099 | } | 
|  | 3100 |  | 
|  | 3101 | static void | 
|  | 3102 | collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, | 
|  | 3103 | SmallVectorImpl<StringRef> &SharedRuntimes, | 
|  | 3104 | SmallVectorImpl<StringRef> &StaticRuntimes, | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3105 | SmallVectorImpl<StringRef> &NonWholeStaticRuntimes, | 
|  | 3106 | SmallVectorImpl<StringRef> &HelperStaticRuntimes, | 
|  | 3107 | SmallVectorImpl<StringRef> &RequiredSymbols) { | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3108 | const SanitizerArgs &SanArgs = TC.getSanitizerArgs(); | 
|  | 3109 | // Collect shared runtimes. | 
|  | 3110 | if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) { | 
|  | 3111 | SharedRuntimes.push_back("asan"); | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 3112 | } | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3113 | // The stats_client library is also statically linked into DSOs. | 
|  | 3114 | if (SanArgs.needsStatsRt()) | 
|  | 3115 | StaticRuntimes.push_back("stats_client"); | 
| Alexey Samsonov | bdfa6c2 | 2014-04-01 13:31:10 +0000 | [diff] [blame] | 3116 |  | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3117 | // Collect static runtimes. | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 3118 | if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) { | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3119 | // Don't link static runtimes into DSOs or if compiling for Android. | 
| Alexey Samsonov | bdfa6c2 | 2014-04-01 13:31:10 +0000 | [diff] [blame] | 3120 | return; | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3121 | } | 
|  | 3122 | if (SanArgs.needsAsanRt()) { | 
|  | 3123 | if (SanArgs.needsSharedAsanRt()) { | 
|  | 3124 | HelperStaticRuntimes.push_back("asan-preinit"); | 
|  | 3125 | } else { | 
|  | 3126 | StaticRuntimes.push_back("asan"); | 
|  | 3127 | if (SanArgs.linkCXXRuntimes()) | 
|  | 3128 | StaticRuntimes.push_back("asan_cxx"); | 
|  | 3129 | } | 
|  | 3130 | } | 
|  | 3131 | if (SanArgs.needsDfsanRt()) | 
|  | 3132 | StaticRuntimes.push_back("dfsan"); | 
|  | 3133 | if (SanArgs.needsLsanRt()) | 
|  | 3134 | StaticRuntimes.push_back("lsan"); | 
| Alexey Samsonov | 381845d | 2015-04-27 22:07:50 +0000 | [diff] [blame] | 3135 | if (SanArgs.needsMsanRt()) { | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3136 | StaticRuntimes.push_back("msan"); | 
| Alexey Samsonov | 381845d | 2015-04-27 22:07:50 +0000 | [diff] [blame] | 3137 | if (SanArgs.linkCXXRuntimes()) | 
|  | 3138 | StaticRuntimes.push_back("msan_cxx"); | 
|  | 3139 | } | 
|  | 3140 | if (SanArgs.needsTsanRt()) { | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3141 | StaticRuntimes.push_back("tsan"); | 
| Alexey Samsonov | 381845d | 2015-04-27 22:07:50 +0000 | [diff] [blame] | 3142 | if (SanArgs.linkCXXRuntimes()) | 
|  | 3143 | StaticRuntimes.push_back("tsan_cxx"); | 
|  | 3144 | } | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3145 | if (SanArgs.needsUbsanRt()) { | 
| Alexey Samsonov | 3109546 | 2015-04-01 22:42:25 +0000 | [diff] [blame] | 3146 | StaticRuntimes.push_back("ubsan_standalone"); | 
|  | 3147 | if (SanArgs.linkCXXRuntimes()) | 
|  | 3148 | StaticRuntimes.push_back("ubsan_standalone_cxx"); | 
| Alexey Samsonov | b01f936 | 2014-05-12 18:39:51 +0000 | [diff] [blame] | 3149 | } | 
| Peter Collingbourne | c4122c1 | 2015-06-15 21:08:13 +0000 | [diff] [blame] | 3150 | if (SanArgs.needsSafeStackRt()) | 
|  | 3151 | StaticRuntimes.push_back("safestack"); | 
| Evgeniy Stepanov | fd6f92d | 2015-12-15 23:00:20 +0000 | [diff] [blame] | 3152 | if (SanArgs.needsCfiRt()) | 
|  | 3153 | StaticRuntimes.push_back("cfi"); | 
| Evgeniy Stepanov | 3fd61df | 2016-01-25 23:34:52 +0000 | [diff] [blame] | 3154 | if (SanArgs.needsCfiDiagRt()) { | 
| Evgeniy Stepanov | e3fb51c | 2015-12-16 00:38:42 +0000 | [diff] [blame] | 3155 | StaticRuntimes.push_back("cfi_diag"); | 
| Evgeniy Stepanov | 3fd61df | 2016-01-25 23:34:52 +0000 | [diff] [blame] | 3156 | if (SanArgs.linkCXXRuntimes()) | 
|  | 3157 | StaticRuntimes.push_back("ubsan_standalone_cxx"); | 
|  | 3158 | } | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3159 | if (SanArgs.needsStatsRt()) { | 
|  | 3160 | NonWholeStaticRuntimes.push_back("stats"); | 
|  | 3161 | RequiredSymbols.push_back("__sanitizer_stats_register"); | 
|  | 3162 | } | 
| Derek Bruening | 256c2e1 | 2016-04-21 21:32:04 +0000 | [diff] [blame] | 3163 | if (SanArgs.needsEsanRt()) | 
|  | 3164 | StaticRuntimes.push_back("esan"); | 
| Kostya Serebryany | 7bca6c2 | 2011-11-30 01:39:16 +0000 | [diff] [blame] | 3165 | } | 
|  | 3166 |  | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3167 | // Should be called before we add system libraries (C++ ABI, libstdc++/libc++, | 
|  | 3168 | // C runtime, etc). Returns true if sanitizer system deps need to be linked in. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3169 | static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, | 
|  | 3170 | ArgStringList &CmdArgs) { | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3171 | SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes, | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3172 | NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols; | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3173 | collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes, | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3174 | NonWholeStaticRuntimes, HelperStaticRuntimes, | 
|  | 3175 | RequiredSymbols); | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3176 | for (auto RT : SharedRuntimes) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3177 | addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false); | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3178 | for (auto RT : HelperStaticRuntimes) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3179 | addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3180 | bool AddExportDynamic = false; | 
|  | 3181 | for (auto RT : StaticRuntimes) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3182 | addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true); | 
|  | 3183 | AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3184 | } | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3185 | for (auto RT : NonWholeStaticRuntimes) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3186 | addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false); | 
|  | 3187 | AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT); | 
| Peter Collingbourne | dc13453 | 2016-01-16 00:31:22 +0000 | [diff] [blame] | 3188 | } | 
|  | 3189 | for (auto S : RequiredSymbols) { | 
|  | 3190 | CmdArgs.push_back("-u"); | 
|  | 3191 | CmdArgs.push_back(Args.MakeArgString(S)); | 
|  | 3192 | } | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 3193 | // If there is a static runtime with no dynamic list, force all the symbols | 
|  | 3194 | // to be dynamic to be sure we export sanitizer interface functions. | 
|  | 3195 | if (AddExportDynamic) | 
|  | 3196 | CmdArgs.push_back("-export-dynamic"); | 
|  | 3197 | return !StaticRuntimes.empty(); | 
| Peter Collingbourne | c377275 | 2013-08-07 22:47:34 +0000 | [diff] [blame] | 3198 | } | 
|  | 3199 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3200 | static bool addXRayRuntime(const ToolChain &TC, const ArgList &Args, | 
|  | 3201 | ArgStringList &CmdArgs) { | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 3202 | if (Args.hasFlag(options::OPT_fxray_instrument, | 
|  | 3203 | options::OPT_fnoxray_instrument, false)) { | 
|  | 3204 | CmdArgs.push_back("-whole-archive"); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3205 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, "xray", false)); | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 3206 | CmdArgs.push_back("-no-whole-archive"); | 
|  | 3207 | return true; | 
|  | 3208 | } | 
|  | 3209 | return false; | 
|  | 3210 | } | 
|  | 3211 |  | 
| Dean Michael Berris | 39baab9 | 2016-07-14 04:58:44 +0000 | [diff] [blame] | 3212 | static void linkXRayRuntimeDeps(const ToolChain &TC, const ArgList &Args, | 
|  | 3213 | ArgStringList &CmdArgs) { | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 3214 | CmdArgs.push_back("--no-as-needed"); | 
|  | 3215 | CmdArgs.push_back("-lpthread"); | 
|  | 3216 | CmdArgs.push_back("-lrt"); | 
|  | 3217 | CmdArgs.push_back("-lm"); | 
|  | 3218 | CmdArgs.push_back("-latomic"); | 
| Dean Michael Berris | 39baab9 | 2016-07-14 04:58:44 +0000 | [diff] [blame] | 3219 | if (TC.GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) | 
|  | 3220 | CmdArgs.push_back("-lc++"); | 
|  | 3221 | else | 
|  | 3222 | CmdArgs.push_back("-lstdc++"); | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 3223 | if (TC.getTriple().getOS() != llvm::Triple::FreeBSD) | 
|  | 3224 | CmdArgs.push_back("-ldl"); | 
|  | 3225 | } | 
|  | 3226 |  | 
| Reid Kleckner | 86ea770 | 2015-02-04 23:45:07 +0000 | [diff] [blame] | 3227 | static bool areOptimizationsEnabled(const ArgList &Args) { | 
|  | 3228 | // Find the last -O arg and see if it is non-zero. | 
|  | 3229 | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) | 
|  | 3230 | return !A->getOption().matches(options::OPT_O0); | 
|  | 3231 | // Defaults to -O0. | 
|  | 3232 | return false; | 
|  | 3233 | } | 
|  | 3234 |  | 
| Tim Northover | c0f6c9b | 2016-08-23 18:12:58 +0000 | [diff] [blame] | 3235 | static bool mustUseFramePointerForTarget(const llvm::Triple &Triple) { | 
|  | 3236 | switch (Triple.getArch()){ | 
|  | 3237 | default: | 
|  | 3238 | return false; | 
|  | 3239 | case llvm::Triple::arm: | 
|  | 3240 | case llvm::Triple::thumb: | 
|  | 3241 | // ARM Darwin targets require a frame pointer to be always present to aid | 
|  | 3242 | // offline debugging via backtraces. | 
|  | 3243 | return Triple.isOSDarwin(); | 
|  | 3244 | } | 
|  | 3245 | } | 
|  | 3246 |  | 
|  | 3247 | static bool useFramePointerForTargetByDefault(const ArgList &Args, | 
|  | 3248 | const llvm::Triple &Triple) { | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 3249 | switch (Triple.getArch()) { | 
|  | 3250 | case llvm::Triple::xcore: | 
|  | 3251 | case llvm::Triple::wasm32: | 
|  | 3252 | case llvm::Triple::wasm64: | 
|  | 3253 | // XCore never wants frame pointers, regardless of OS. | 
|  | 3254 | // WebAssembly never wants frame pointers. | 
| Benjamin Kramer | 34cb043 | 2013-10-16 17:42:39 +0000 | [diff] [blame] | 3255 | return false; | 
| Dan Gohman | c285307 | 2015-09-03 22:51:53 +0000 | [diff] [blame] | 3256 | default: | 
|  | 3257 | break; | 
| Benjamin Kramer | 34cb043 | 2013-10-16 17:42:39 +0000 | [diff] [blame] | 3258 | } | 
| Reid Kleckner | 86ea770 | 2015-02-04 23:45:07 +0000 | [diff] [blame] | 3259 |  | 
| Ed Schouten | 9e4da07 | 2016-08-11 19:23:30 +0000 | [diff] [blame] | 3260 | if (Triple.isOSLinux() || Triple.getOS() == llvm::Triple::CloudABI) { | 
| Reid Kleckner | 86ea770 | 2015-02-04 23:45:07 +0000 | [diff] [blame] | 3261 | switch (Triple.getArch()) { | 
|  | 3262 | // Don't use a frame pointer on linux if optimizing for certain targets. | 
|  | 3263 | case llvm::Triple::mips64: | 
|  | 3264 | case llvm::Triple::mips64el: | 
|  | 3265 | case llvm::Triple::mips: | 
|  | 3266 | case llvm::Triple::mipsel: | 
|  | 3267 | case llvm::Triple::systemz: | 
|  | 3268 | case llvm::Triple::x86: | 
|  | 3269 | case llvm::Triple::x86_64: | 
|  | 3270 | return !areOptimizationsEnabled(Args); | 
|  | 3271 | default: | 
|  | 3272 | return true; | 
|  | 3273 | } | 
|  | 3274 | } | 
|  | 3275 |  | 
|  | 3276 | if (Triple.isOSWindows()) { | 
|  | 3277 | switch (Triple.getArch()) { | 
|  | 3278 | case llvm::Triple::x86: | 
|  | 3279 | return !areOptimizationsEnabled(Args); | 
| Akira Hatanaka | 8f5866a | 2016-02-26 05:07:00 +0000 | [diff] [blame] | 3280 | case llvm::Triple::x86_64: | 
|  | 3281 | return Triple.isOSBinFormatMachO(); | 
| Saleem Abdulrasool | a8180a2 | 2015-10-03 03:39:28 +0000 | [diff] [blame] | 3282 | case llvm::Triple::arm: | 
|  | 3283 | case llvm::Triple::thumb: | 
|  | 3284 | // Windows on ARM builds with FPO disabled to aid fast stack walking | 
|  | 3285 | return true; | 
| Reid Kleckner | 86ea770 | 2015-02-04 23:45:07 +0000 | [diff] [blame] | 3286 | default: | 
|  | 3287 | // All other supported Windows ISAs use xdata unwind information, so frame | 
|  | 3288 | // pointers are not generally useful. | 
|  | 3289 | return false; | 
|  | 3290 | } | 
|  | 3291 | } | 
|  | 3292 |  | 
|  | 3293 | return true; | 
| Benjamin Kramer | 34cb043 | 2013-10-16 17:42:39 +0000 | [diff] [blame] | 3294 | } | 
|  | 3295 |  | 
| Rafael Espindola | 224dd63 | 2011-12-14 21:02:23 +0000 | [diff] [blame] | 3296 | static bool shouldUseFramePointer(const ArgList &Args, | 
|  | 3297 | const llvm::Triple &Triple) { | 
|  | 3298 | if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer, | 
|  | 3299 | options::OPT_fomit_frame_pointer)) | 
| Tim Northover | c0f6c9b | 2016-08-23 18:12:58 +0000 | [diff] [blame] | 3300 | return A->getOption().matches(options::OPT_fno_omit_frame_pointer) || | 
|  | 3301 | mustUseFramePointerForTarget(Triple); | 
|  | 3302 |  | 
| Xinliang David Li | 4dff875 | 2015-11-23 17:30:31 +0000 | [diff] [blame] | 3303 | if (Args.hasArg(options::OPT_pg)) | 
|  | 3304 | return true; | 
| Rafael Espindola | 224dd63 | 2011-12-14 21:02:23 +0000 | [diff] [blame] | 3305 |  | 
| Tim Northover | c0f6c9b | 2016-08-23 18:12:58 +0000 | [diff] [blame] | 3306 | return useFramePointerForTargetByDefault(Args, Triple); | 
| Rafael Espindola | 224dd63 | 2011-12-14 21:02:23 +0000 | [diff] [blame] | 3307 | } | 
|  | 3308 |  | 
| Eric Christopher | b7d97e9 | 2013-04-03 01:58:53 +0000 | [diff] [blame] | 3309 | static bool shouldUseLeafFramePointer(const ArgList &Args, | 
|  | 3310 | const llvm::Triple &Triple) { | 
|  | 3311 | if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer, | 
|  | 3312 | options::OPT_momit_leaf_frame_pointer)) | 
| Tim Northover | c0f6c9b | 2016-08-23 18:12:58 +0000 | [diff] [blame] | 3313 | return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer) || | 
|  | 3314 | mustUseFramePointerForTarget(Triple); | 
|  | 3315 |  | 
| Xinliang David Li | 4dff875 | 2015-11-23 17:30:31 +0000 | [diff] [blame] | 3316 | if (Args.hasArg(options::OPT_pg)) | 
|  | 3317 | return true; | 
| Eric Christopher | b7d97e9 | 2013-04-03 01:58:53 +0000 | [diff] [blame] | 3318 |  | 
| Filipe Cabecinhas | b1e6c2d | 2015-01-27 18:08:32 +0000 | [diff] [blame] | 3319 | if (Triple.isPS4CPU()) | 
|  | 3320 | return false; | 
|  | 3321 |  | 
| Tim Northover | c0f6c9b | 2016-08-23 18:12:58 +0000 | [diff] [blame] | 3322 | return useFramePointerForTargetByDefault(Args, Triple); | 
| Eric Christopher | b7d97e9 | 2013-04-03 01:58:53 +0000 | [diff] [blame] | 3323 | } | 
|  | 3324 |  | 
| Rafael Espindola | c7367ff | 2013-08-10 01:40:10 +0000 | [diff] [blame] | 3325 | /// Add a CC1 option to specify the debug compilation directory. | 
| Chandler Carruth | 4d5e1a9 | 2012-12-17 21:40:04 +0000 | [diff] [blame] | 3326 | static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) { | 
| Benjamin Kramer | 698d7c8 | 2013-04-27 08:12:29 +0000 | [diff] [blame] | 3327 | SmallString<128> cwd; | 
|  | 3328 | if (!llvm::sys::fs::current_path(cwd)) { | 
| Chad Rosier | a35d5a3 | 2013-04-26 20:49:50 +0000 | [diff] [blame] | 3329 | CmdArgs.push_back("-fdebug-compilation-dir"); | 
|  | 3330 | CmdArgs.push_back(Args.MakeArgString(cwd)); | 
| Chandler Carruth | 4d5e1a9 | 2012-12-17 21:40:04 +0000 | [diff] [blame] | 3331 | } | 
|  | 3332 | } | 
|  | 3333 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3334 | static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) { | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 3335 | Arg *FinalOutput = Args.getLastArg(options::OPT_o); | 
|  | 3336 | if (FinalOutput && Args.hasArg(options::OPT_c)) { | 
|  | 3337 | SmallString<128> T(FinalOutput->getValue()); | 
|  | 3338 | llvm::sys::path::replace_extension(T, "dwo"); | 
|  | 3339 | return Args.MakeArgString(T); | 
|  | 3340 | } else { | 
|  | 3341 | // Use the compilation dir. | 
| Nico Weber | e8e5311 | 2014-05-11 01:04:02 +0000 | [diff] [blame] | 3342 | SmallString<128> T( | 
|  | 3343 | Args.getLastArgValue(options::OPT_fdebug_compilation_dir)); | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 3344 | SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput())); | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 3345 | llvm::sys::path::replace_extension(F, "dwo"); | 
|  | 3346 | T += F; | 
|  | 3347 | return Args.MakeArgString(F); | 
|  | 3348 | } | 
|  | 3349 | } | 
|  | 3350 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3351 | static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T, | 
|  | 3352 | const JobAction &JA, const ArgList &Args, | 
|  | 3353 | const InputInfo &Output, const char *OutFile) { | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 3354 | ArgStringList ExtractArgs; | 
|  | 3355 | ExtractArgs.push_back("--extract-dwo"); | 
|  | 3356 |  | 
|  | 3357 | ArgStringList StripArgs; | 
|  | 3358 | StripArgs.push_back("--strip-dwo"); | 
|  | 3359 |  | 
|  | 3360 | // Grabbing the output of the earlier compile step. | 
|  | 3361 | StripArgs.push_back(Output.getFilename()); | 
|  | 3362 | ExtractArgs.push_back(Output.getFilename()); | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 3363 | ExtractArgs.push_back(OutFile); | 
|  | 3364 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3365 | const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy")); | 
| Justin Lebar | d98cea8 | 2016-01-11 23:15:21 +0000 | [diff] [blame] | 3366 | InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename()); | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 3367 |  | 
|  | 3368 | // First extract the dwo sections. | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 3369 | C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II)); | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 3370 |  | 
|  | 3371 | // Then remove them from the original .o file. | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 3372 | C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II)); | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 3373 | } | 
|  | 3374 |  | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3375 | /// \brief Vectorize at all optimization levels greater than 1 except for -Oz. | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 3376 | /// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled. | 
|  | 3377 | static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) { | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3378 | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { | 
| Rafael Espindola | ad70d96 | 2013-08-27 16:58:15 +0000 | [diff] [blame] | 3379 | if (A->getOption().matches(options::OPT_O4) || | 
|  | 3380 | A->getOption().matches(options::OPT_Ofast)) | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3381 | return true; | 
|  | 3382 |  | 
|  | 3383 | if (A->getOption().matches(options::OPT_O0)) | 
|  | 3384 | return false; | 
|  | 3385 |  | 
|  | 3386 | assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag"); | 
|  | 3387 |  | 
| Rafael Espindola | 91780de | 2013-08-26 14:05:41 +0000 | [diff] [blame] | 3388 | // Vectorize -Os. | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3389 | StringRef S(A->getValue()); | 
| Rafael Espindola | 91780de | 2013-08-26 14:05:41 +0000 | [diff] [blame] | 3390 | if (S == "s") | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3391 | return true; | 
|  | 3392 |  | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 3393 | // Don't vectorize -Oz, unless it's the slp vectorizer. | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3394 | if (S == "z") | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 3395 | return isSlpVec; | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 3396 |  | 
|  | 3397 | unsigned OptLevel = 0; | 
|  | 3398 | if (S.getAsInteger(10, OptLevel)) | 
|  | 3399 | return false; | 
|  | 3400 |  | 
|  | 3401 | return OptLevel > 1; | 
|  | 3402 | } | 
|  | 3403 |  | 
|  | 3404 | return false; | 
|  | 3405 | } | 
|  | 3406 |  | 
| Ben Langmuir | 2cb4a78 | 2014-02-05 22:21:15 +0000 | [diff] [blame] | 3407 | /// Add -x lang to \p CmdArgs for \p Input. | 
|  | 3408 | static void addDashXForInput(const ArgList &Args, const InputInfo &Input, | 
|  | 3409 | ArgStringList &CmdArgs) { | 
|  | 3410 | // When using -verify-pch, we don't want to provide the type | 
|  | 3411 | // 'precompiled-header' if it was inferred from the file extension | 
|  | 3412 | if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH) | 
|  | 3413 | return; | 
|  | 3414 |  | 
|  | 3415 | CmdArgs.push_back("-x"); | 
|  | 3416 | if (Args.hasArg(options::OPT_rewrite_objc)) | 
|  | 3417 | CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX)); | 
|  | 3418 | else | 
|  | 3419 | CmdArgs.push_back(types::getTypeName(Input.getType())); | 
|  | 3420 | } | 
|  | 3421 |  | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 3422 | static VersionTuple getMSCompatibilityVersion(unsigned Version) { | 
| Saleem Abdulrasool | c68237b | 2014-07-16 03:13:50 +0000 | [diff] [blame] | 3423 | if (Version < 100) | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 3424 | return VersionTuple(Version); | 
| Saleem Abdulrasool | c68237b | 2014-07-16 03:13:50 +0000 | [diff] [blame] | 3425 |  | 
|  | 3426 | if (Version < 10000) | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 3427 | return VersionTuple(Version / 100, Version % 100); | 
| Saleem Abdulrasool | c68237b | 2014-07-16 03:13:50 +0000 | [diff] [blame] | 3428 |  | 
|  | 3429 | unsigned Build = 0, Factor = 1; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3430 | for (; Version > 10000; Version = Version / 10, Factor = Factor * 10) | 
| Saleem Abdulrasool | c68237b | 2014-07-16 03:13:50 +0000 | [diff] [blame] | 3431 | Build = Build + (Version % 10) * Factor; | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 3432 | return VersionTuple(Version / 100, Version % 100, Build); | 
| Saleem Abdulrasool | c68237b | 2014-07-16 03:13:50 +0000 | [diff] [blame] | 3433 | } | 
|  | 3434 |  | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 3435 | // Claim options we don't want to warn if they are unused. We do this for | 
| Rafael Espindola | 7a45e87 | 2015-01-05 13:44:59 +0000 | [diff] [blame] | 3436 | // options that build systems might add but are unused when assembling or only | 
|  | 3437 | // running the preprocessor for example. | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 3438 | static void claimNoWarnArgs(const ArgList &Args) { | 
|  | 3439 | // Don't warn about unused -f(no-)?lto.  This can happen when we're | 
| Rafael Espindola | 7a45e87 | 2015-01-05 13:44:59 +0000 | [diff] [blame] | 3440 | // preprocessing, precompiling or assembling. | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 3441 | Args.ClaimAllArgs(options::OPT_flto_EQ); | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 3442 | Args.ClaimAllArgs(options::OPT_flto); | 
|  | 3443 | Args.ClaimAllArgs(options::OPT_fno_lto); | 
|  | 3444 | } | 
|  | 3445 |  | 
| Ben Langmuir | 3b7b540 | 2015-02-03 19:28:37 +0000 | [diff] [blame] | 3446 | static void appendUserToPath(SmallVectorImpl<char> &Result) { | 
|  | 3447 | #ifdef LLVM_ON_UNIX | 
|  | 3448 | const char *Username = getenv("LOGNAME"); | 
|  | 3449 | #else | 
|  | 3450 | const char *Username = getenv("USERNAME"); | 
|  | 3451 | #endif | 
|  | 3452 | if (Username) { | 
|  | 3453 | // Validate that LoginName can be used in a path, and get its length. | 
|  | 3454 | size_t Len = 0; | 
|  | 3455 | for (const char *P = Username; *P; ++P, ++Len) { | 
| Ben Langmuir | e056ec3 | 2015-02-04 18:34:23 +0000 | [diff] [blame] | 3456 | if (!isAlphanumeric(*P) && *P != '_') { | 
| Ben Langmuir | 3b7b540 | 2015-02-03 19:28:37 +0000 | [diff] [blame] | 3457 | Username = nullptr; | 
|  | 3458 | break; | 
|  | 3459 | } | 
|  | 3460 | } | 
|  | 3461 |  | 
|  | 3462 | if (Username && Len > 0) { | 
|  | 3463 | Result.append(Username, Username + Len); | 
|  | 3464 | return; | 
|  | 3465 | } | 
|  | 3466 | } | 
|  | 3467 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3468 | // Fallback to user id. | 
| Ben Langmuir | 3b7b540 | 2015-02-03 19:28:37 +0000 | [diff] [blame] | 3469 | #ifdef LLVM_ON_UNIX | 
|  | 3470 | std::string UID = llvm::utostr(getuid()); | 
|  | 3471 | #else | 
|  | 3472 | // FIXME: Windows seems to have an 'SID' that might work. | 
|  | 3473 | std::string UID = "9999"; | 
|  | 3474 | #endif | 
|  | 3475 | Result.append(UID.begin(), UID.end()); | 
|  | 3476 | } | 
|  | 3477 |  | 
| Adrian McCarthy | e4b26fc | 2016-05-13 23:20:11 +0000 | [diff] [blame] | 3478 | VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC, | 
| David Majnemer | e11d373 | 2015-06-08 00:22:46 +0000 | [diff] [blame] | 3479 | const llvm::Triple &Triple, | 
|  | 3480 | const llvm::opt::ArgList &Args, | 
|  | 3481 | bool IsWindowsMSVC) { | 
|  | 3482 | if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, | 
|  | 3483 | IsWindowsMSVC) || | 
|  | 3484 | Args.hasArg(options::OPT_fmsc_version) || | 
|  | 3485 | Args.hasArg(options::OPT_fms_compatibility_version)) { | 
|  | 3486 | const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version); | 
|  | 3487 | const Arg *MSCompatibilityVersion = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3488 | Args.getLastArg(options::OPT_fms_compatibility_version); | 
| David Majnemer | e11d373 | 2015-06-08 00:22:46 +0000 | [diff] [blame] | 3489 |  | 
|  | 3490 | if (MSCVersion && MSCompatibilityVersion) { | 
|  | 3491 | if (D) | 
|  | 3492 | D->Diag(diag::err_drv_argument_not_allowed_with) | 
|  | 3493 | << MSCVersion->getAsString(Args) | 
|  | 3494 | << MSCompatibilityVersion->getAsString(Args); | 
|  | 3495 | return VersionTuple(); | 
|  | 3496 | } | 
|  | 3497 |  | 
|  | 3498 | if (MSCompatibilityVersion) { | 
|  | 3499 | VersionTuple MSVT; | 
|  | 3500 | if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D) | 
|  | 3501 | D->Diag(diag::err_drv_invalid_value) | 
|  | 3502 | << MSCompatibilityVersion->getAsString(Args) | 
|  | 3503 | << MSCompatibilityVersion->getValue(); | 
|  | 3504 | return MSVT; | 
|  | 3505 | } | 
|  | 3506 |  | 
|  | 3507 | if (MSCVersion) { | 
|  | 3508 | unsigned Version = 0; | 
|  | 3509 | if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D) | 
|  | 3510 | D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args) | 
|  | 3511 | << MSCVersion->getValue(); | 
|  | 3512 | return getMSCompatibilityVersion(Version); | 
|  | 3513 | } | 
|  | 3514 |  | 
|  | 3515 | unsigned Major, Minor, Micro; | 
|  | 3516 | Triple.getEnvironmentVersion(Major, Minor, Micro); | 
|  | 3517 | if (Major || Minor || Micro) | 
|  | 3518 | return VersionTuple(Major, Minor, Micro); | 
|  | 3519 |  | 
| Adrian McCarthy | e4b26fc | 2016-05-13 23:20:11 +0000 | [diff] [blame] | 3520 | if (IsWindowsMSVC) { | 
|  | 3521 | VersionTuple MSVT = TC.getMSVCVersionFromExe(); | 
|  | 3522 | if (!MSVT.empty()) | 
|  | 3523 | return MSVT; | 
|  | 3524 |  | 
|  | 3525 | // FIXME: Consider bumping this to 19 (MSVC2015) soon. | 
|  | 3526 | return VersionTuple(18); | 
|  | 3527 | } | 
| David Majnemer | e11d373 | 2015-06-08 00:22:46 +0000 | [diff] [blame] | 3528 | } | 
|  | 3529 | return VersionTuple(); | 
|  | 3530 | } | 
|  | 3531 |  | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3532 | static void addPGOAndCoverageFlags(Compilation &C, const Driver &D, | 
|  | 3533 | const InputInfo &Output, const ArgList &Args, | 
|  | 3534 | ArgStringList &CmdArgs) { | 
| Sean Silva | a834ff2 | 2016-07-16 02:54:58 +0000 | [diff] [blame] | 3535 |  | 
|  | 3536 | auto *PGOGenerateArg = Args.getLastArg(options::OPT_fprofile_generate, | 
|  | 3537 | options::OPT_fprofile_generate_EQ, | 
|  | 3538 | options::OPT_fno_profile_generate); | 
|  | 3539 | if (PGOGenerateArg && | 
|  | 3540 | PGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate)) | 
|  | 3541 | PGOGenerateArg = nullptr; | 
|  | 3542 |  | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3543 | auto *ProfileGenerateArg = Args.getLastArg( | 
|  | 3544 | options::OPT_fprofile_instr_generate, | 
| Sean Silva | a834ff2 | 2016-07-16 02:54:58 +0000 | [diff] [blame] | 3545 | options::OPT_fprofile_instr_generate_EQ, | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3546 | options::OPT_fno_profile_instr_generate); | 
|  | 3547 | if (ProfileGenerateArg && | 
|  | 3548 | ProfileGenerateArg->getOption().matches( | 
|  | 3549 | options::OPT_fno_profile_instr_generate)) | 
|  | 3550 | ProfileGenerateArg = nullptr; | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3551 |  | 
| Sean Silva | a834ff2 | 2016-07-16 02:54:58 +0000 | [diff] [blame] | 3552 | if (PGOGenerateArg && ProfileGenerateArg) | 
|  | 3553 | D.Diag(diag::err_drv_argument_not_allowed_with) | 
|  | 3554 | << PGOGenerateArg->getSpelling() << ProfileGenerateArg->getSpelling(); | 
|  | 3555 |  | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3556 | auto *ProfileUseArg = Args.getLastArg( | 
|  | 3557 | options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ, | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3558 | options::OPT_fprofile_use, options::OPT_fprofile_use_EQ, | 
|  | 3559 | options::OPT_fno_profile_instr_use); | 
|  | 3560 | if (ProfileUseArg && | 
|  | 3561 | ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use)) | 
|  | 3562 | ProfileUseArg = nullptr; | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3563 |  | 
| Sean Silva | a834ff2 | 2016-07-16 02:54:58 +0000 | [diff] [blame] | 3564 | if (PGOGenerateArg && ProfileUseArg) | 
|  | 3565 | D.Diag(diag::err_drv_argument_not_allowed_with) | 
|  | 3566 | << ProfileUseArg->getSpelling() << PGOGenerateArg->getSpelling(); | 
|  | 3567 |  | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3568 | if (ProfileGenerateArg && ProfileUseArg) | 
|  | 3569 | D.Diag(diag::err_drv_argument_not_allowed_with) | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 3570 | << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling(); | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3571 |  | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3572 | if (ProfileGenerateArg) { | 
|  | 3573 | if (ProfileGenerateArg->getOption().matches( | 
|  | 3574 | options::OPT_fprofile_instr_generate_EQ)) | 
| Rong Xu | 9837ef5 | 2016-02-04 18:39:09 +0000 | [diff] [blame] | 3575 | CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") + | 
|  | 3576 | ProfileGenerateArg->getValue())); | 
| Sean Silva | a834ff2 | 2016-07-16 02:54:58 +0000 | [diff] [blame] | 3577 | // The default is to use Clang Instrumentation. | 
|  | 3578 | CmdArgs.push_back("-fprofile-instrument=clang"); | 
|  | 3579 | } | 
|  | 3580 |  | 
|  | 3581 | if (PGOGenerateArg) { | 
|  | 3582 | CmdArgs.push_back("-fprofile-instrument=llvm"); | 
|  | 3583 | if (PGOGenerateArg->getOption().matches( | 
|  | 3584 | options::OPT_fprofile_generate_EQ)) { | 
|  | 3585 | SmallString<128> Path(PGOGenerateArg->getValue()); | 
| Xinliang David Li | b7b335a | 2016-07-22 22:25:01 +0000 | [diff] [blame] | 3586 | llvm::sys::path::append(Path, "default_%m.profraw"); | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3587 | CmdArgs.push_back( | 
| Rong Xu | 9837ef5 | 2016-02-04 18:39:09 +0000 | [diff] [blame] | 3588 | Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path)); | 
|  | 3589 | } | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3590 | } | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3591 |  | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3592 | if (ProfileUseArg) { | 
|  | 3593 | if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ)) | 
| Rong Xu | 9c6f153 | 2016-03-02 20:59:36 +0000 | [diff] [blame] | 3594 | CmdArgs.push_back(Args.MakeArgString( | 
|  | 3595 | Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue())); | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3596 | else if ((ProfileUseArg->getOption().matches( | 
|  | 3597 | options::OPT_fprofile_use_EQ) || | 
|  | 3598 | ProfileUseArg->getOption().matches( | 
|  | 3599 | options::OPT_fprofile_instr_use))) { | 
|  | 3600 | SmallString<128> Path( | 
|  | 3601 | ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue()); | 
|  | 3602 | if (Path.empty() || llvm::sys::fs::is_directory(Path)) | 
|  | 3603 | llvm::sys::path::append(Path, "default.profdata"); | 
|  | 3604 | CmdArgs.push_back( | 
| Rong Xu | 9c6f153 | 2016-03-02 20:59:36 +0000 | [diff] [blame] | 3605 | Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path)); | 
| Diego Novillo | 758f3f5 | 2015-08-05 21:49:51 +0000 | [diff] [blame] | 3606 | } | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3607 | } | 
|  | 3608 |  | 
|  | 3609 | if (Args.hasArg(options::OPT_ftest_coverage) || | 
|  | 3610 | Args.hasArg(options::OPT_coverage)) | 
|  | 3611 | CmdArgs.push_back("-femit-coverage-notes"); | 
|  | 3612 | if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs, | 
|  | 3613 | false) || | 
|  | 3614 | Args.hasArg(options::OPT_coverage)) | 
|  | 3615 | CmdArgs.push_back("-femit-coverage-data"); | 
|  | 3616 |  | 
| Diego Novillo | c4b94da | 2015-08-05 23:27:40 +0000 | [diff] [blame] | 3617 | if (Args.hasFlag(options::OPT_fcoverage_mapping, | 
|  | 3618 | options::OPT_fno_coverage_mapping, false) && | 
|  | 3619 | !ProfileGenerateArg) | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3620 | D.Diag(diag::err_drv_argument_only_allowed_with) | 
|  | 3621 | << "-fcoverage-mapping" | 
|  | 3622 | << "-fprofile-instr-generate"; | 
|  | 3623 |  | 
| Diego Novillo | c4b94da | 2015-08-05 23:27:40 +0000 | [diff] [blame] | 3624 | if (Args.hasFlag(options::OPT_fcoverage_mapping, | 
|  | 3625 | options::OPT_fno_coverage_mapping, false)) | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 3626 | CmdArgs.push_back("-fcoverage-mapping"); | 
|  | 3627 |  | 
|  | 3628 | if (C.getArgs().hasArg(options::OPT_c) || | 
|  | 3629 | C.getArgs().hasArg(options::OPT_S)) { | 
|  | 3630 | if (Output.isFilename()) { | 
|  | 3631 | CmdArgs.push_back("-coverage-file"); | 
|  | 3632 | SmallString<128> CoverageFilename; | 
|  | 3633 | if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) { | 
|  | 3634 | CoverageFilename = FinalOutput->getValue(); | 
|  | 3635 | } else { | 
|  | 3636 | CoverageFilename = llvm::sys::path::filename(Output.getBaseInput()); | 
|  | 3637 | } | 
|  | 3638 | if (llvm::sys::path::is_relative(CoverageFilename)) { | 
|  | 3639 | SmallString<128> Pwd; | 
|  | 3640 | if (!llvm::sys::fs::current_path(Pwd)) { | 
|  | 3641 | llvm::sys::path::append(Pwd, CoverageFilename); | 
|  | 3642 | CoverageFilename.swap(Pwd); | 
|  | 3643 | } | 
|  | 3644 | } | 
|  | 3645 | CmdArgs.push_back(Args.MakeArgString(CoverageFilename)); | 
|  | 3646 | } | 
|  | 3647 | } | 
|  | 3648 | } | 
|  | 3649 |  | 
| Paul Robinson | d083b9a | 2015-12-16 17:25:27 +0000 | [diff] [blame] | 3650 | static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args, | 
|  | 3651 | ArgStringList &CmdArgs) { | 
|  | 3652 | if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs, | 
|  | 3653 | false) || | 
|  | 3654 | Args.hasFlag(options::OPT_fprofile_generate, | 
|  | 3655 | options::OPT_fno_profile_instr_generate, false) || | 
|  | 3656 | Args.hasFlag(options::OPT_fprofile_generate_EQ, | 
|  | 3657 | options::OPT_fno_profile_instr_generate, false) || | 
|  | 3658 | Args.hasFlag(options::OPT_fprofile_instr_generate, | 
|  | 3659 | options::OPT_fno_profile_instr_generate, false) || | 
|  | 3660 | Args.hasFlag(options::OPT_fprofile_instr_generate_EQ, | 
|  | 3661 | options::OPT_fno_profile_instr_generate, false) || | 
|  | 3662 | Args.hasArg(options::OPT_fcreate_profile) || | 
|  | 3663 | Args.hasArg(options::OPT_coverage))) | 
|  | 3664 | CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a"); | 
|  | 3665 | } | 
|  | 3666 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3667 | /// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments.  Then, | 
|  | 3668 | /// smooshes them together with platform defaults, to decide whether | 
|  | 3669 | /// this compile should be using PIC mode or not. Returns a tuple of | 
|  | 3670 | /// (RelocationModel, PICLevel, IsPIE). | 
|  | 3671 | static std::tuple<llvm::Reloc::Model, unsigned, bool> | 
|  | 3672 | ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple, | 
|  | 3673 | const ArgList &Args) { | 
|  | 3674 | // FIXME: why does this code...and so much everywhere else, use both | 
|  | 3675 | // ToolChain.getTriple() and Triple? | 
|  | 3676 | bool PIE = ToolChain.isPIEDefault(); | 
|  | 3677 | bool PIC = PIE || ToolChain.isPICDefault(); | 
| Bob Wilson | 0a15e6c | 2016-01-13 01:19:02 +0000 | [diff] [blame] | 3678 | // The Darwin/MachO default to use PIC does not apply when using -static. | 
|  | 3679 | if (ToolChain.getTriple().isOSBinFormatMachO() && | 
|  | 3680 | Args.hasArg(options::OPT_static)) | 
| Bob Wilson | 2b2a0ae | 2015-12-18 20:37:54 +0000 | [diff] [blame] | 3681 | PIE = PIC = false; | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3682 | bool IsPICLevelTwo = PIC; | 
|  | 3683 |  | 
|  | 3684 | bool KernelOrKext = | 
|  | 3685 | Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); | 
|  | 3686 |  | 
|  | 3687 | // Android-specific defaults for PIC/PIE | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 3688 | if (ToolChain.getTriple().isAndroid()) { | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3689 | switch (ToolChain.getArch()) { | 
|  | 3690 | case llvm::Triple::arm: | 
|  | 3691 | case llvm::Triple::armeb: | 
|  | 3692 | case llvm::Triple::thumb: | 
|  | 3693 | case llvm::Triple::thumbeb: | 
|  | 3694 | case llvm::Triple::aarch64: | 
|  | 3695 | case llvm::Triple::mips: | 
|  | 3696 | case llvm::Triple::mipsel: | 
|  | 3697 | case llvm::Triple::mips64: | 
|  | 3698 | case llvm::Triple::mips64el: | 
|  | 3699 | PIC = true; // "-fpic" | 
|  | 3700 | break; | 
|  | 3701 |  | 
|  | 3702 | case llvm::Triple::x86: | 
|  | 3703 | case llvm::Triple::x86_64: | 
|  | 3704 | PIC = true; // "-fPIC" | 
|  | 3705 | IsPICLevelTwo = true; | 
|  | 3706 | break; | 
|  | 3707 |  | 
|  | 3708 | default: | 
|  | 3709 | break; | 
|  | 3710 | } | 
|  | 3711 | } | 
|  | 3712 |  | 
|  | 3713 | // OpenBSD-specific defaults for PIE | 
|  | 3714 | if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) { | 
|  | 3715 | switch (ToolChain.getArch()) { | 
|  | 3716 | case llvm::Triple::mips64: | 
|  | 3717 | case llvm::Triple::mips64el: | 
|  | 3718 | case llvm::Triple::sparcel: | 
|  | 3719 | case llvm::Triple::x86: | 
|  | 3720 | case llvm::Triple::x86_64: | 
|  | 3721 | IsPICLevelTwo = false; // "-fpie" | 
|  | 3722 | break; | 
|  | 3723 |  | 
|  | 3724 | case llvm::Triple::ppc: | 
|  | 3725 | case llvm::Triple::sparc: | 
|  | 3726 | case llvm::Triple::sparcv9: | 
|  | 3727 | IsPICLevelTwo = true; // "-fPIE" | 
|  | 3728 | break; | 
|  | 3729 |  | 
|  | 3730 | default: | 
|  | 3731 | break; | 
|  | 3732 | } | 
|  | 3733 | } | 
|  | 3734 |  | 
|  | 3735 | // The last argument relating to either PIC or PIE wins, and no | 
|  | 3736 | // other argument is used. If the last argument is any flavor of the | 
|  | 3737 | // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE | 
|  | 3738 | // option implicitly enables PIC at the same level. | 
|  | 3739 | Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC, | 
|  | 3740 | options::OPT_fpic, options::OPT_fno_pic, | 
|  | 3741 | options::OPT_fPIE, options::OPT_fno_PIE, | 
|  | 3742 | options::OPT_fpie, options::OPT_fno_pie); | 
|  | 3743 | // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness | 
|  | 3744 | // is forced, then neither PIC nor PIE flags will have no effect. | 
|  | 3745 | if (!ToolChain.isPICDefaultForced()) { | 
|  | 3746 | if (LastPICArg) { | 
|  | 3747 | Option O = LastPICArg->getOption(); | 
|  | 3748 | if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || | 
|  | 3749 | O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) { | 
|  | 3750 | PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie); | 
|  | 3751 | PIC = | 
|  | 3752 | PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic); | 
|  | 3753 | IsPICLevelTwo = | 
|  | 3754 | O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC); | 
|  | 3755 | } else { | 
|  | 3756 | PIE = PIC = false; | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 3757 | if (Triple.isPS4CPU()) { | 
|  | 3758 | Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ); | 
|  | 3759 | StringRef Model = ModelArg ? ModelArg->getValue() : ""; | 
|  | 3760 | if (Model != "kernel") { | 
|  | 3761 | PIC = true; | 
|  | 3762 | ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic) | 
|  | 3763 | << LastPICArg->getSpelling(); | 
|  | 3764 | } | 
|  | 3765 | } | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3766 | } | 
|  | 3767 | } | 
|  | 3768 | } | 
|  | 3769 |  | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 3770 | // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the | 
|  | 3771 | // PIC level would've been set to level 1, force it back to level 2 PIC | 
|  | 3772 | // instead. | 
|  | 3773 | if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU())) | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3774 | IsPICLevelTwo |= ToolChain.isPICDefault(); | 
|  | 3775 |  | 
| James Y Knight | c4015d3 | 2015-08-21 04:14:55 +0000 | [diff] [blame] | 3776 | // This kernel flags are a trump-card: they will disable PIC/PIE | 
|  | 3777 | // generation, independent of the argument order. | 
| Tim Northover | 6f3ff22 | 2015-10-30 16:30:27 +0000 | [diff] [blame] | 3778 | if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) && | 
|  | 3779 | !Triple.isWatchOS())) | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3780 | PIC = PIE = false; | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3781 |  | 
|  | 3782 | if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) { | 
|  | 3783 | // This is a very special mode. It trumps the other modes, almost no one | 
|  | 3784 | // uses it, and it isn't even valid on any OS but Darwin. | 
|  | 3785 | if (!ToolChain.getTriple().isOSDarwin()) | 
|  | 3786 | ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target) | 
|  | 3787 | << A->getSpelling() << ToolChain.getTriple().str(); | 
|  | 3788 |  | 
|  | 3789 | // FIXME: Warn when this flag trumps some other PIC or PIE flag. | 
|  | 3790 |  | 
|  | 3791 | // Only a forced PIC mode can cause the actual compile to have PIC defines | 
|  | 3792 | // etc., no flags are sufficient. This behavior was selected to closely | 
|  | 3793 | // match that of llvm-gcc and Apple GCC before that. | 
|  | 3794 | PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced(); | 
|  | 3795 |  | 
| Vedant Kumar | ae7e39a | 2016-07-27 03:43:34 +0000 | [diff] [blame] | 3796 | return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0U, false); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3797 | } | 
|  | 3798 |  | 
| Oliver Stannard | 218c4cb | 2016-08-08 15:28:40 +0000 | [diff] [blame] | 3799 | bool EmbeddedPISupported; | 
|  | 3800 | switch (ToolChain.getArch()) { | 
|  | 3801 | case llvm::Triple::arm: | 
|  | 3802 | case llvm::Triple::armeb: | 
|  | 3803 | case llvm::Triple::thumb: | 
|  | 3804 | case llvm::Triple::thumbeb: | 
|  | 3805 | EmbeddedPISupported = true; | 
|  | 3806 | break; | 
|  | 3807 | default: | 
|  | 3808 | EmbeddedPISupported = false; | 
|  | 3809 | break; | 
|  | 3810 | } | 
|  | 3811 |  | 
|  | 3812 | bool ROPI = false, RWPI = false; | 
|  | 3813 | Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi); | 
|  | 3814 | if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) { | 
|  | 3815 | if (!EmbeddedPISupported) | 
|  | 3816 | ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target) | 
|  | 3817 | << LastROPIArg->getSpelling() << ToolChain.getTriple().str(); | 
|  | 3818 | ROPI = true; | 
|  | 3819 | } | 
|  | 3820 | Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi); | 
|  | 3821 | if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) { | 
|  | 3822 | if (!EmbeddedPISupported) | 
|  | 3823 | ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target) | 
|  | 3824 | << LastRWPIArg->getSpelling() << ToolChain.getTriple().str(); | 
|  | 3825 | RWPI = true; | 
|  | 3826 | } | 
|  | 3827 |  | 
|  | 3828 | // ROPI and RWPI are not comaptible with PIC or PIE. | 
|  | 3829 | if ((ROPI || RWPI) && (PIC || PIE)) { | 
|  | 3830 | ToolChain.getDriver().Diag(diag::err_drv_ropi_rwpi_incompatible_with_pic); | 
|  | 3831 | } | 
|  | 3832 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3833 | if (PIC) | 
| Vedant Kumar | ae7e39a | 2016-07-27 03:43:34 +0000 | [diff] [blame] | 3834 | return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3835 |  | 
| Oliver Stannard | 218c4cb | 2016-08-08 15:28:40 +0000 | [diff] [blame] | 3836 | llvm::Reloc::Model RelocM = llvm::Reloc::Static; | 
|  | 3837 | if (ROPI && RWPI) | 
|  | 3838 | RelocM = llvm::Reloc::ROPI_RWPI; | 
|  | 3839 | else if (ROPI) | 
|  | 3840 | RelocM = llvm::Reloc::ROPI; | 
|  | 3841 | else if (RWPI) | 
|  | 3842 | RelocM = llvm::Reloc::RWPI; | 
|  | 3843 |  | 
|  | 3844 | return std::make_tuple(RelocM, 0U, false); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3845 | } | 
|  | 3846 |  | 
|  | 3847 | static const char *RelocationModelName(llvm::Reloc::Model Model) { | 
|  | 3848 | switch (Model) { | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3849 | case llvm::Reloc::Static: | 
|  | 3850 | return "static"; | 
|  | 3851 | case llvm::Reloc::PIC_: | 
|  | 3852 | return "pic"; | 
|  | 3853 | case llvm::Reloc::DynamicNoPIC: | 
|  | 3854 | return "dynamic-no-pic"; | 
| Oliver Stannard | 218c4cb | 2016-08-08 15:28:40 +0000 | [diff] [blame] | 3855 | case llvm::Reloc::ROPI: | 
|  | 3856 | return "ropi"; | 
|  | 3857 | case llvm::Reloc::RWPI: | 
|  | 3858 | return "rwpi"; | 
|  | 3859 | case llvm::Reloc::ROPI_RWPI: | 
|  | 3860 | return "ropi-rwpi"; | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3861 | } | 
| Aaron Ballman | 2ec4928 | 2015-08-20 13:31:16 +0000 | [diff] [blame] | 3862 | llvm_unreachable("Unknown Reloc::Model kind"); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 3863 | } | 
|  | 3864 |  | 
|  | 3865 | static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args, | 
|  | 3866 | ArgStringList &CmdArgs) { | 
|  | 3867 | llvm::Reloc::Model RelocationModel; | 
|  | 3868 | unsigned PICLevel; | 
|  | 3869 | bool IsPIE; | 
|  | 3870 | std::tie(RelocationModel, PICLevel, IsPIE) = | 
|  | 3871 | ParsePICArgs(ToolChain, ToolChain.getTriple(), Args); | 
|  | 3872 |  | 
|  | 3873 | if (RelocationModel != llvm::Reloc::Static) | 
|  | 3874 | CmdArgs.push_back("-KPIC"); | 
|  | 3875 | } | 
|  | 3876 |  | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 3877 | void Clang::ConstructJob(Compilation &C, const JobAction &JA, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3878 | const InputInfo &Output, const InputInfoList &Inputs, | 
|  | 3879 | const ArgList &Args, const char *LinkingOutput) const { | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 3880 | const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); | 
|  | 3881 | const std::string &TripleStr = Triple.getTriple(); | 
| James Y Knight | 2db38f3 | 2015-08-15 03:45:25 +0000 | [diff] [blame] | 3882 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3883 | bool KernelOrKext = | 
|  | 3884 | Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext); | 
| Daniel Dunbar | 083edf7 | 2009-12-21 18:54:17 +0000 | [diff] [blame] | 3885 | const Driver &D = getToolChain().getDriver(); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 3886 | ArgStringList CmdArgs; | 
|  | 3887 |  | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 3888 | bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment(); | 
| Nico Weber | e8e5311 | 2014-05-11 01:04:02 +0000 | [diff] [blame] | 3889 | bool IsWindowsCygnus = | 
|  | 3890 | getToolChain().getTriple().isWindowsCygwinEnvironment(); | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 3891 | bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment(); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 3892 | bool IsPS4CPU = getToolChain().getTriple().isPS4CPU(); | 
| Andrey Turetskiy | 4798eb6 | 2016-06-16 10:36:09 +0000 | [diff] [blame] | 3893 | bool IsIAMCU = getToolChain().getTriple().isOSIAMCU(); | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 3894 |  | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 3895 | // Check number of inputs for sanity. We need at least one input. | 
|  | 3896 | assert(Inputs.size() >= 1 && "Must have at least one input."); | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 3897 | const InputInfo &Input = Inputs[0]; | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 3898 | // CUDA compilation may have multiple inputs (source file + results of | 
|  | 3899 | // device-side compilations). All other jobs are expected to have exactly one | 
|  | 3900 | // input. | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 3901 | bool IsCuda = JA.isOffloading(Action::OFK_Cuda); | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 3902 | assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs."); | 
| Daniel Dunbar | e521a89 | 2009-03-31 20:53:55 +0000 | [diff] [blame] | 3903 |  | 
| Andrey Turetskiy | 4798eb6 | 2016-06-16 10:36:09 +0000 | [diff] [blame] | 3904 | // C++ is not supported for IAMCU. | 
|  | 3905 | if (IsIAMCU && types::isCXX(Input.getType())) | 
|  | 3906 | D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU"; | 
|  | 3907 |  | 
| Daniel Dunbar | 6c536aa | 2009-12-11 23:00:49 +0000 | [diff] [blame] | 3908 | // Invoke ourselves in -cc1 mode. | 
|  | 3909 | // | 
|  | 3910 | // FIXME: Implement custom jobs for internal actions. | 
|  | 3911 | CmdArgs.push_back("-cc1"); | 
|  | 3912 |  | 
| Daniel Dunbar | 624c21b | 2009-10-30 18:12:20 +0000 | [diff] [blame] | 3913 | // Add the "effective" target triple. | 
| Daniel Dunbar | d640be2 | 2009-03-31 17:35:15 +0000 | [diff] [blame] | 3914 | CmdArgs.push_back("-triple"); | 
| Daniel Dunbar | 624c21b | 2009-10-30 18:12:20 +0000 | [diff] [blame] | 3915 | CmdArgs.push_back(Args.MakeArgString(TripleStr)); | 
| Daniel Dunbar | fb58b0a | 2009-09-10 06:49:20 +0000 | [diff] [blame] | 3916 |  | 
| Artem Belevich | 5e2a3ec | 2015-11-17 22:28:40 +0000 | [diff] [blame] | 3917 | if (IsCuda) { | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 3918 | // We have to pass the triple of the host if compiling for a CUDA device and | 
|  | 3919 | // vice-versa. | 
| Samuel Antao | 2f7b339 | 2016-07-16 00:15:56 +0000 | [diff] [blame] | 3920 | std::string NormalizedTriple; | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 3921 | if (JA.isDeviceOffloading(Action::OFK_Cuda)) | 
|  | 3922 | NormalizedTriple = C.getSingleOffloadToolChain<Action::OFK_Host>() | 
|  | 3923 | ->getTriple() | 
|  | 3924 | .normalize(); | 
| Artem Belevich | 5e2a3ec | 2015-11-17 22:28:40 +0000 | [diff] [blame] | 3925 | else | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 3926 | NormalizedTriple = C.getSingleOffloadToolChain<Action::OFK_Cuda>() | 
|  | 3927 | ->getTriple() | 
|  | 3928 | .normalize(); | 
|  | 3929 |  | 
| Artem Belevich | 5e2a3ec | 2015-11-17 22:28:40 +0000 | [diff] [blame] | 3930 | CmdArgs.push_back("-aux-triple"); | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 3931 | CmdArgs.push_back(Args.MakeArgString(NormalizedTriple)); | 
| Artem Belevich | 5e2a3ec | 2015-11-17 22:28:40 +0000 | [diff] [blame] | 3932 | } | 
|  | 3933 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3934 | if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm || | 
|  | 3935 | Triple.getArch() == llvm::Triple::thumb)) { | 
|  | 3936 | unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6; | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 3937 | unsigned Version; | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3938 | Triple.getArchName().substr(Offset).getAsInteger(10, Version); | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 3939 | if (Version < 7) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 3940 | D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() | 
| Nico Weber | e8e5311 | 2014-05-11 01:04:02 +0000 | [diff] [blame] | 3941 | << TripleStr; | 
| Saleem Abdulrasool | f4c9e49 | 2014-04-04 20:31:19 +0000 | [diff] [blame] | 3942 | } | 
|  | 3943 |  | 
| Tim Northover | 336f189 | 2014-03-29 13:16:12 +0000 | [diff] [blame] | 3944 | // Push all default warning arguments that are specific to | 
|  | 3945 | // the given target.  These come before user provided warning options | 
|  | 3946 | // are provided. | 
|  | 3947 | getToolChain().addClangWarningOptions(CmdArgs); | 
|  | 3948 |  | 
| Daniel Dunbar | 624c21b | 2009-10-30 18:12:20 +0000 | [diff] [blame] | 3949 | // Select the appropriate action. | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 3950 | RewriteKind rewriteKind = RK_None; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3951 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3952 | if (isa<AnalyzeJobAction>(JA)) { | 
|  | 3953 | assert(JA.getType() == types::TY_Plist && "Invalid output type."); | 
|  | 3954 | CmdArgs.push_back("-analyze"); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 3955 | } else if (isa<MigrateJobAction>(JA)) { | 
|  | 3956 | CmdArgs.push_back("-migrate"); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3957 | } else if (isa<PreprocessJobAction>(JA)) { | 
| Daniel Dunbar | d67a322 | 2009-03-30 06:36:42 +0000 | [diff] [blame] | 3958 | if (Output.getType() == types::TY_Dependencies) | 
|  | 3959 | CmdArgs.push_back("-Eonly"); | 
| Fariborz Jahanian | e0a75d6 | 2013-03-18 19:41:18 +0000 | [diff] [blame] | 3960 | else { | 
| Daniel Dunbar | d67a322 | 2009-03-30 06:36:42 +0000 | [diff] [blame] | 3961 | CmdArgs.push_back("-E"); | 
| Fariborz Jahanian | e0a75d6 | 2013-03-18 19:41:18 +0000 | [diff] [blame] | 3962 | if (Args.hasArg(options::OPT_rewrite_objc) && | 
|  | 3963 | !Args.hasArg(options::OPT_g_Group)) | 
|  | 3964 | CmdArgs.push_back("-P"); | 
|  | 3965 | } | 
| Daniel Dunbar | c434394 | 2010-02-03 03:07:56 +0000 | [diff] [blame] | 3966 | } else if (isa<AssembleJobAction>(JA)) { | 
|  | 3967 | CmdArgs.push_back("-emit-obj"); | 
| Daniel Dunbar | 06e2cc3 | 2010-05-27 06:18:05 +0000 | [diff] [blame] | 3968 |  | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 3969 | CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D); | 
| Daniel Dunbar | 7c87433 | 2010-11-19 16:23:35 +0000 | [diff] [blame] | 3970 |  | 
|  | 3971 | // Also ignore explicit -force_cpusubtype_ALL option. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 3972 | (void)Args.hasArg(options::OPT_force__cpusubtype__ALL); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3973 | } else if (isa<PrecompileJobAction>(JA)) { | 
| Argyrios Kyrtzidis | 90bdfbb | 2010-08-11 23:27:58 +0000 | [diff] [blame] | 3974 | // Use PCH if the user requested it. | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 3975 | bool UsePCH = D.CCCUsePCH; | 
| Daniel Dunbar | cbc34b7 | 2009-10-15 20:02:44 +0000 | [diff] [blame] | 3976 |  | 
| Aaron Ballman | 1f10cc5 | 2012-07-31 01:21:00 +0000 | [diff] [blame] | 3977 | if (JA.getType() == types::TY_Nothing) | 
|  | 3978 | CmdArgs.push_back("-fsyntax-only"); | 
|  | 3979 | else if (UsePCH) | 
| Douglas Gregor | 111af7d | 2009-04-18 00:34:01 +0000 | [diff] [blame] | 3980 | CmdArgs.push_back("-emit-pch"); | 
|  | 3981 | else | 
|  | 3982 | CmdArgs.push_back("-emit-pth"); | 
| Ben Langmuir | 9b9a8d3 | 2014-02-06 18:53:25 +0000 | [diff] [blame] | 3983 | } else if (isa<VerifyPCHJobAction>(JA)) { | 
|  | 3984 | CmdArgs.push_back("-verify-pch"); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3985 | } else { | 
| Bob Wilson | 23a55f1 | 2014-12-21 07:00:00 +0000 | [diff] [blame] | 3986 | assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) && | 
|  | 3987 | "Invalid action for clang tool."); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3988 | if (JA.getType() == types::TY_Nothing) { | 
| Ben Langmuir | 9b9a8d3 | 2014-02-06 18:53:25 +0000 | [diff] [blame] | 3989 | CmdArgs.push_back("-fsyntax-only"); | 
| Daniel Dunbar | 24e5299 | 2010-06-07 23:28:45 +0000 | [diff] [blame] | 3990 | } else if (JA.getType() == types::TY_LLVM_IR || | 
|  | 3991 | JA.getType() == types::TY_LTO_IR) { | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3992 | CmdArgs.push_back("-emit-llvm"); | 
| Daniel Dunbar | 24e5299 | 2010-06-07 23:28:45 +0000 | [diff] [blame] | 3993 | } else if (JA.getType() == types::TY_LLVM_BC || | 
|  | 3994 | JA.getType() == types::TY_LTO_BC) { | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 3995 | CmdArgs.push_back("-emit-llvm-bc"); | 
|  | 3996 | } else if (JA.getType() == types::TY_PP_Asm) { | 
| Daniel Dunbar | d112f10 | 2009-09-17 00:47:53 +0000 | [diff] [blame] | 3997 | CmdArgs.push_back("-S"); | 
| Daniel Dunbar | 6cdf83c | 2009-09-01 16:57:46 +0000 | [diff] [blame] | 3998 | } else if (JA.getType() == types::TY_AST) { | 
|  | 3999 | CmdArgs.push_back("-emit-pch"); | 
| Douglas Gregor | bf7fc9c | 2013-03-27 16:47:18 +0000 | [diff] [blame] | 4000 | } else if (JA.getType() == types::TY_ModuleFile) { | 
|  | 4001 | CmdArgs.push_back("-module-file-info"); | 
| Daniel Dunbar | aeea8ac | 2010-02-11 03:16:21 +0000 | [diff] [blame] | 4002 | } else if (JA.getType() == types::TY_RewrittenObjC) { | 
|  | 4003 | CmdArgs.push_back("-rewrite-objc"); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 4004 | rewriteKind = RK_NonFragile; | 
| Fariborz Jahanian | 73223bb | 2012-04-02 15:59:19 +0000 | [diff] [blame] | 4005 | } else if (JA.getType() == types::TY_RewrittenLegacyObjC) { | 
|  | 4006 | CmdArgs.push_back("-rewrite-objc"); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 4007 | rewriteKind = RK_Fragile; | 
| Daniel Dunbar | aeea8ac | 2010-02-11 03:16:21 +0000 | [diff] [blame] | 4008 | } else { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4009 | assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!"); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4010 | } | 
| Duncan P. N. Exon Smith | d863f6f | 2015-04-14 18:30:13 +0000 | [diff] [blame] | 4011 |  | 
|  | 4012 | // Preserve use-list order by default when emitting bitcode, so that | 
|  | 4013 | // loading the bitcode up in 'opt' or 'llc' and running passes gives the | 
|  | 4014 | // same result as running passes here.  For LTO, we don't need to preserve | 
|  | 4015 | // the use-list order, since serialization to bitcode is part of the flow. | 
| Duncan P. N. Exon Smith | bb61825 | 2015-04-15 01:16:18 +0000 | [diff] [blame] | 4016 | if (JA.getType() == types::TY_LLVM_BC) | 
|  | 4017 | CmdArgs.push_back("-emit-llvm-uselists"); | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 4018 |  | 
|  | 4019 | if (D.isUsingLTO()) | 
|  | 4020 | Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 4021 | } | 
|  | 4022 |  | 
| Teresa Johnson | aff2232 | 2015-12-07 19:21:34 +0000 | [diff] [blame] | 4023 | if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) { | 
|  | 4024 | if (!types::isLLVMIR(Input.getType())) | 
|  | 4025 | D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) | 
|  | 4026 | << "-x ir"; | 
|  | 4027 | Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ); | 
|  | 4028 | } | 
|  | 4029 |  | 
| Steven Wu | 574b0f2 | 2016-03-01 01:07:58 +0000 | [diff] [blame] | 4030 | // Embed-bitcode option. | 
|  | 4031 | if (C.getDriver().embedBitcodeEnabled() && | 
|  | 4032 | (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) { | 
|  | 4033 | // Add flags implied by -fembed-bitcode. | 
| Steven Wu | 27fb522 | 2016-05-11 16:26:03 +0000 | [diff] [blame] | 4034 | Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ); | 
| Steven Wu | 574b0f2 | 2016-03-01 01:07:58 +0000 | [diff] [blame] | 4035 | // Disable all llvm IR level optimizations. | 
|  | 4036 | CmdArgs.push_back("-disable-llvm-optzns"); | 
|  | 4037 | } | 
|  | 4038 | if (C.getDriver().embedBitcodeMarkerOnly()) | 
| Steven Wu | 27fb522 | 2016-05-11 16:26:03 +0000 | [diff] [blame] | 4039 | CmdArgs.push_back("-fembed-bitcode=marker"); | 
| Steven Wu | 574b0f2 | 2016-03-01 01:07:58 +0000 | [diff] [blame] | 4040 |  | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 4041 | // We normally speed up the clang process a bit by skipping destructors at | 
|  | 4042 | // exit, but when we're generating diagnostics we can rely on some of the | 
|  | 4043 | // cleanup. | 
|  | 4044 | if (!C.isForDiagnostics()) | 
|  | 4045 | CmdArgs.push_back("-disable-free"); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4046 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4047 | // Disable the verification pass in -asserts builds. | 
| John McCall | bb79b5f | 2010-02-13 03:50:24 +0000 | [diff] [blame] | 4048 | #ifdef NDEBUG | 
|  | 4049 | CmdArgs.push_back("-disable-llvm-verifier"); | 
| Mehdi Amini | 557c20a | 2016-03-13 21:05:23 +0000 | [diff] [blame] | 4050 | // Discard LLVM value names in -asserts builds. | 
|  | 4051 | CmdArgs.push_back("-discard-value-names"); | 
| John McCall | bb79b5f | 2010-02-13 03:50:24 +0000 | [diff] [blame] | 4052 | #endif | 
|  | 4053 |  | 
| Daniel Dunbar | 3b358a3 | 2009-04-08 05:11:16 +0000 | [diff] [blame] | 4054 | // Set the main file name, so that debug info works even with | 
|  | 4055 | // -save-temps. | 
|  | 4056 | CmdArgs.push_back("-main-file-name"); | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 4057 | CmdArgs.push_back(getBaseInputName(Args, Input)); | 
| Daniel Dunbar | 3b358a3 | 2009-04-08 05:11:16 +0000 | [diff] [blame] | 4058 |  | 
| Daniel Dunbar | 17ddaa6 | 2009-04-08 18:03:55 +0000 | [diff] [blame] | 4059 | // Some flags which affect the language (via preprocessor | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 4060 | // defines). | 
| Daniel Dunbar | 17ddaa6 | 2009-04-08 18:03:55 +0000 | [diff] [blame] | 4061 | if (Args.hasArg(options::OPT_static)) | 
|  | 4062 | CmdArgs.push_back("-static-define"); | 
|  | 4063 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4064 | if (isa<AnalyzeJobAction>(JA)) { | 
| Ted Kremenek | 05e6f5b | 2009-09-25 05:55:59 +0000 | [diff] [blame] | 4065 | // Enable region store model by default. | 
|  | 4066 | CmdArgs.push_back("-analyzer-store=region"); | 
|  | 4067 |  | 
| Ted Kremenek | 7bea9a1 | 2009-12-07 22:26:14 +0000 | [diff] [blame] | 4068 | // Treat blocks as analysis entry points. | 
|  | 4069 | CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks"); | 
|  | 4070 |  | 
| Ted Kremenek | 49c7979 | 2011-03-24 00:28:47 +0000 | [diff] [blame] | 4071 | CmdArgs.push_back("-analyzer-eagerly-assume"); | 
|  | 4072 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4073 | // Add default argument set. | 
| Daniel Dunbar | 58f345ce | 2009-05-22 00:38:15 +0000 | [diff] [blame] | 4074 | if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { | 
| Argyrios Kyrtzidis | a6d04d5 | 2011-02-15 07:42:33 +0000 | [diff] [blame] | 4075 | CmdArgs.push_back("-analyzer-checker=core"); | 
| Ted Kremenek | 49c7979 | 2011-03-24 00:28:47 +0000 | [diff] [blame] | 4076 |  | 
| Devin Coughlin | 65c7708 | 2016-01-21 20:09:49 +0000 | [diff] [blame] | 4077 | if (!IsWindowsMSVC) { | 
|  | 4078 | CmdArgs.push_back("-analyzer-checker=unix"); | 
|  | 4079 | } else { | 
|  | 4080 | // Enable "unix" checkers that also work on Windows. | 
|  | 4081 | CmdArgs.push_back("-analyzer-checker=unix.API"); | 
|  | 4082 | CmdArgs.push_back("-analyzer-checker=unix.Malloc"); | 
|  | 4083 | CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof"); | 
|  | 4084 | CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator"); | 
|  | 4085 | CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg"); | 
|  | 4086 | CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg"); | 
|  | 4087 | } | 
| Ted Kremenek | 49c7979 | 2011-03-24 00:28:47 +0000 | [diff] [blame] | 4088 |  | 
| Sean Eveson | b38c32b | 2016-01-06 10:03:58 +0000 | [diff] [blame] | 4089 | // Disable some unix checkers for PS4. | 
|  | 4090 | if (IsPS4CPU) { | 
|  | 4091 | CmdArgs.push_back("-analyzer-disable-checker=unix.API"); | 
|  | 4092 | CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork"); | 
|  | 4093 | } | 
|  | 4094 |  | 
| Argyrios Kyrtzidis | a6d04d5 | 2011-02-15 07:42:33 +0000 | [diff] [blame] | 4095 | if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) | 
| Ted Kremenek | 49c7979 | 2011-03-24 00:28:47 +0000 | [diff] [blame] | 4096 | CmdArgs.push_back("-analyzer-checker=osx"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4097 |  | 
| Ted Kremenek | b9ff6b2 | 2012-01-20 06:00:17 +0000 | [diff] [blame] | 4098 | CmdArgs.push_back("-analyzer-checker=deadcode"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4099 |  | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 4100 | if (types::isCXX(Input.getType())) | 
| Jordan Rose | 10ad081 | 2013-04-05 17:55:07 +0000 | [diff] [blame] | 4101 | CmdArgs.push_back("-analyzer-checker=cplusplus"); | 
|  | 4102 |  | 
| Sean Eveson | b38c32b | 2016-01-06 10:03:58 +0000 | [diff] [blame] | 4103 | if (!IsPS4CPU) { | 
|  | 4104 | CmdArgs.push_back( | 
|  | 4105 | "-analyzer-checker=security.insecureAPI.UncheckedReturn"); | 
|  | 4106 | CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw"); | 
|  | 4107 | CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets"); | 
|  | 4108 | CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp"); | 
|  | 4109 | CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp"); | 
|  | 4110 | CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork"); | 
|  | 4111 | } | 
| Gabor Horvath | e308599 | 2015-09-14 20:34:06 +0000 | [diff] [blame] | 4112 |  | 
|  | 4113 | // Default nullability checks. | 
|  | 4114 | CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull"); | 
|  | 4115 | CmdArgs.push_back( | 
|  | 4116 | "-analyzer-checker=nullability.NullReturnedFromNonnull"); | 
| Daniel Dunbar | 58f345ce | 2009-05-22 00:38:15 +0000 | [diff] [blame] | 4117 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 4118 |  | 
| Daniel Dunbar | 58f345ce | 2009-05-22 00:38:15 +0000 | [diff] [blame] | 4119 | // Set the output format. The default is plist, for (lame) historical | 
|  | 4120 | // reasons. | 
|  | 4121 | CmdArgs.push_back("-analyzer-output"); | 
|  | 4122 | if (Arg *A = Args.getLastArg(options::OPT__analyzer_output)) | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4123 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 58f345ce | 2009-05-22 00:38:15 +0000 | [diff] [blame] | 4124 | else | 
|  | 4125 | CmdArgs.push_back("plist"); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4126 |  | 
| Ted Kremenek | fe449a2 | 2010-03-22 22:32:05 +0000 | [diff] [blame] | 4127 | // Disable the presentation of standard compiler warnings when | 
|  | 4128 | // using --analyze.  We only want to show static analyzer diagnostics | 
|  | 4129 | // or frontend errors. | 
|  | 4130 | CmdArgs.push_back("-w"); | 
|  | 4131 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4132 | // Add -Xanalyzer arguments when running as analyzer. | 
|  | 4133 | Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer); | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 4134 | } | 
|  | 4135 |  | 
| Daniel Dunbar | 4eadb60 | 2009-09-10 01:21:12 +0000 | [diff] [blame] | 4136 | CheckCodeGenerationOptions(D, Args); | 
|  | 4137 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 4138 | llvm::Reloc::Model RelocationModel; | 
|  | 4139 | unsigned PICLevel; | 
|  | 4140 | bool IsPIE; | 
|  | 4141 | std::tie(RelocationModel, PICLevel, IsPIE) = | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4142 | ParsePICArgs(getToolChain(), Triple, Args); | 
| Peter Collingbourne | 54d770c | 2013-04-09 04:35:11 +0000 | [diff] [blame] | 4143 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 4144 | const char *RMName = RelocationModelName(RelocationModel); | 
| Oliver Stannard | 218c4cb | 2016-08-08 15:28:40 +0000 | [diff] [blame] | 4145 |  | 
|  | 4146 | if ((RelocationModel == llvm::Reloc::ROPI || | 
|  | 4147 | RelocationModel == llvm::Reloc::ROPI_RWPI) && | 
|  | 4148 | types::isCXX(Input.getType()) && | 
|  | 4149 | !Args.hasArg(options::OPT_fallow_unsupported)) | 
|  | 4150 | D.Diag(diag::err_drv_ropi_incompatible_with_cxx); | 
|  | 4151 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 4152 | if (RMName) { | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4153 | CmdArgs.push_back("-mrelocation-model"); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 4154 | CmdArgs.push_back(RMName); | 
|  | 4155 | } | 
|  | 4156 | if (PICLevel > 0) { | 
|  | 4157 | CmdArgs.push_back("-pic-level"); | 
|  | 4158 | CmdArgs.push_back(PICLevel == 1 ? "1" : "2"); | 
| Rafael Espindola | c9d336e | 2016-06-23 15:07:32 +0000 | [diff] [blame] | 4159 | if (IsPIE) | 
|  | 4160 | CmdArgs.push_back("-pic-is-pie"); | 
| Daniel Dunbar | 44e7122 | 2009-04-29 18:32:25 +0000 | [diff] [blame] | 4161 | } | 
| Chandler Carruth | c0c0455 | 2012-04-08 16:40:35 +0000 | [diff] [blame] | 4162 |  | 
| Renato Golin | 4854d80 | 2015-11-09 12:40:41 +0000 | [diff] [blame] | 4163 | if (Arg *A = Args.getLastArg(options::OPT_meabi)) { | 
|  | 4164 | CmdArgs.push_back("-meabi"); | 
|  | 4165 | CmdArgs.push_back(A->getValue()); | 
|  | 4166 | } | 
|  | 4167 |  | 
| Jonathan Roelofs | b140a10 | 2014-10-03 21:57:44 +0000 | [diff] [blame] | 4168 | CmdArgs.push_back("-mthread-model"); | 
|  | 4169 | if (Arg *A = Args.getLastArg(options::OPT_mthread_model)) | 
|  | 4170 | CmdArgs.push_back(A->getValue()); | 
|  | 4171 | else | 
|  | 4172 | CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel())); | 
|  | 4173 |  | 
| Michael Zolotukhin | c888dd0 | 2015-03-17 20:03:11 +0000 | [diff] [blame] | 4174 | Args.AddLastArg(CmdArgs, options::OPT_fveclib); | 
|  | 4175 |  | 
| Tanya Lattner | f9d41df | 2009-11-04 01:18:09 +0000 | [diff] [blame] | 4176 | if (!Args.hasFlag(options::OPT_fmerge_all_constants, | 
|  | 4177 | options::OPT_fno_merge_all_constants)) | 
| Chris Lattner | 9242b33 | 2011-04-08 18:06:54 +0000 | [diff] [blame] | 4178 | CmdArgs.push_back("-fno-merge-all-constants"); | 
| Daniel Dunbar | 306945d | 2009-09-16 06:17:29 +0000 | [diff] [blame] | 4179 |  | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4180 | // LLVM Code Generator Options. | 
|  | 4181 |  | 
| Saleem Abdulrasool | 76a4b95 | 2015-01-09 05:10:20 +0000 | [diff] [blame] | 4182 | if (Args.hasArg(options::OPT_frewrite_map_file) || | 
|  | 4183 | Args.hasArg(options::OPT_frewrite_map_file_EQ)) { | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 4184 | for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file, | 
|  | 4185 | options::OPT_frewrite_map_file_EQ)) { | 
| Saleem Abdulrasool | 76a4b95 | 2015-01-09 05:10:20 +0000 | [diff] [blame] | 4186 | CmdArgs.push_back("-frewrite-map-file"); | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 4187 | CmdArgs.push_back(A->getValue()); | 
|  | 4188 | A->claim(); | 
| Saleem Abdulrasool | 76a4b95 | 2015-01-09 05:10:20 +0000 | [diff] [blame] | 4189 | } | 
|  | 4190 | } | 
|  | 4191 |  | 
| Alp Toker | fb8d02b | 2014-06-05 22:10:59 +0000 | [diff] [blame] | 4192 | if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) { | 
|  | 4193 | StringRef v = A->getValue(); | 
|  | 4194 | CmdArgs.push_back("-mllvm"); | 
|  | 4195 | CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v)); | 
|  | 4196 | A->claim(); | 
|  | 4197 | } | 
|  | 4198 |  | 
| Nirav Dave | d2f44d8 | 2016-04-05 17:50:43 +0000 | [diff] [blame] | 4199 | if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables, | 
|  | 4200 | true)) | 
|  | 4201 | CmdArgs.push_back("-fno-jump-tables"); | 
|  | 4202 |  | 
| Nirav Dave | 993a139 | 2016-07-27 19:57:40 +0000 | [diff] [blame] | 4203 | if (!Args.hasFlag(options::OPT_fpreserve_as_comments, | 
|  | 4204 | options::OPT_fno_preserve_as_comments, true)) | 
|  | 4205 | CmdArgs.push_back("-fno-preserve-as-comments"); | 
|  | 4206 |  | 
| Daniel Dunbar | 0bb0331 | 2011-02-09 17:54:19 +0000 | [diff] [blame] | 4207 | if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) { | 
|  | 4208 | CmdArgs.push_back("-mregparm"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4209 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 0bb0331 | 2011-02-09 17:54:19 +0000 | [diff] [blame] | 4210 | } | 
|  | 4211 |  | 
| Nick Lewycky | d3f3e4f | 2013-06-25 01:49:44 +0000 | [diff] [blame] | 4212 | if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return, | 
|  | 4213 | options::OPT_freg_struct_return)) { | 
| Eli Bendersky | d4a6aec | 2013-07-24 22:20:49 +0000 | [diff] [blame] | 4214 | if (getToolChain().getArch() != llvm::Triple::x86) { | 
| John McCall | 1fe2a8c | 2013-06-18 02:46:29 +0000 | [diff] [blame] | 4215 | D.Diag(diag::err_drv_unsupported_opt_for_target) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4216 | << A->getSpelling() << getToolChain().getTriple().str(); | 
| John McCall | 1fe2a8c | 2013-06-18 02:46:29 +0000 | [diff] [blame] | 4217 | } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) { | 
|  | 4218 | CmdArgs.push_back("-fpcc-struct-return"); | 
|  | 4219 | } else { | 
|  | 4220 | assert(A->getOption().matches(options::OPT_freg_struct_return)); | 
|  | 4221 | CmdArgs.push_back("-freg-struct-return"); | 
|  | 4222 | } | 
|  | 4223 | } | 
|  | 4224 |  | 
| Roman Divacky | 65b88cd | 2011-03-01 17:40:53 +0000 | [diff] [blame] | 4225 | if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false)) | 
| Alexey Bataev | a754718 | 2016-05-18 09:06:38 +0000 | [diff] [blame] | 4226 | CmdArgs.push_back("-fdefault-calling-conv=stdcall"); | 
| Roman Divacky | 65b88cd | 2011-03-01 17:40:53 +0000 | [diff] [blame] | 4227 |  | 
| Rafael Espindola | 224dd63 | 2011-12-14 21:02:23 +0000 | [diff] [blame] | 4228 | if (shouldUseFramePointer(Args, getToolChain().getTriple())) | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4229 | CmdArgs.push_back("-mdisable-fp-elim"); | 
|  | 4230 | if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss, | 
|  | 4231 | options::OPT_fno_zero_initialized_in_bss)) | 
|  | 4232 | CmdArgs.push_back("-mno-zero-initialized-in-bss"); | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4233 |  | 
|  | 4234 | bool OFastEnabled = isOptimizationLevelFast(Args); | 
|  | 4235 | // If -Ofast is the optimization level, then -fstrict-aliasing should be | 
|  | 4236 | // enabled.  This alias option is being used to simplify the hasFlag logic. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4237 | OptSpecifier StrictAliasingAliasOption = | 
|  | 4238 | OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing; | 
| Reid Kleckner | 2a24e3a | 2014-04-09 20:07:39 +0000 | [diff] [blame] | 4239 | // We turn strict aliasing off by default if we're in CL mode, since MSVC | 
|  | 4240 | // doesn't do any TBAA. | 
|  | 4241 | bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode(); | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4242 | if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption, | 
| Reid Kleckner | 2a24e3a | 2014-04-09 20:07:39 +0000 | [diff] [blame] | 4243 | options::OPT_fno_strict_aliasing, TBAAOnByDefault)) | 
| Dan Gohman | 10169b9 | 2010-10-14 22:36:56 +0000 | [diff] [blame] | 4244 | CmdArgs.push_back("-relaxed-aliasing"); | 
| Manman Ren | f5d9d34 | 2013-10-11 20:48:38 +0000 | [diff] [blame] | 4245 | if (!Args.hasFlag(options::OPT_fstruct_path_tbaa, | 
|  | 4246 | options::OPT_fno_struct_path_tbaa)) | 
|  | 4247 | CmdArgs.push_back("-no-struct-path-tbaa"); | 
| Chandler Carruth | 8b4140d | 2012-03-27 23:58:37 +0000 | [diff] [blame] | 4248 | if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums, | 
|  | 4249 | false)) | 
|  | 4250 | CmdArgs.push_back("-fstrict-enums"); | 
| Piotr Padlewski | 338c9d0 | 2015-09-15 21:46:47 +0000 | [diff] [blame] | 4251 | if (Args.hasFlag(options::OPT_fstrict_vtable_pointers, | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4252 | options::OPT_fno_strict_vtable_pointers, | 
|  | 4253 | false)) | 
| Piotr Padlewski | 338c9d0 | 2015-09-15 21:46:47 +0000 | [diff] [blame] | 4254 | CmdArgs.push_back("-fstrict-vtable-pointers"); | 
| Nick Lewycky | 1c8c436 | 2012-01-23 08:29:12 +0000 | [diff] [blame] | 4255 | if (!Args.hasFlag(options::OPT_foptimize_sibling_calls, | 
|  | 4256 | options::OPT_fno_optimize_sibling_calls)) | 
|  | 4257 | CmdArgs.push_back("-mdisable-tail-calls"); | 
| Daniel Dunbar | 0d8ca9e | 2010-05-14 22:00:22 +0000 | [diff] [blame] | 4258 |  | 
| Eric Christopher | 006208c | 2013-04-04 06:29:47 +0000 | [diff] [blame] | 4259 | // Handle segmented stacks. | 
|  | 4260 | if (Args.hasArg(options::OPT_fsplit_stack)) | 
|  | 4261 | CmdArgs.push_back("-split-stacks"); | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4262 |  | 
|  | 4263 | // If -Ofast is the optimization level, then -ffast-math should be enabled. | 
|  | 4264 | // This alias option is being used to simplify the getLastArg logic. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4265 | OptSpecifier FastMathAliasOption = | 
|  | 4266 | OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math; | 
|  | 4267 |  | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4268 | // Handle various floating point optimization flags, mapping them to the | 
|  | 4269 | // appropriate LLVM code generation flags. The pattern for all of these is to | 
|  | 4270 | // default off the codegen optimizations, and if any flag enables them and no | 
|  | 4271 | // flag disables them after the flag enabling them, enable the codegen | 
|  | 4272 | // optimization. This is complicated by several "umbrella" flags. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4273 | if (Arg *A = Args.getLastArg( | 
|  | 4274 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4275 | options::OPT_fno_fast_math, options::OPT_ffinite_math_only, | 
|  | 4276 | options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities, | 
|  | 4277 | options::OPT_fno_honor_infinities)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4278 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4279 | A->getOption().getID() != options::OPT_fno_finite_math_only && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4280 | A->getOption().getID() != options::OPT_fhonor_infinities) | 
|  | 4281 | CmdArgs.push_back("-menable-no-infs"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4282 | if (Arg *A = Args.getLastArg( | 
|  | 4283 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4284 | options::OPT_fno_fast_math, options::OPT_ffinite_math_only, | 
|  | 4285 | options::OPT_fno_finite_math_only, options::OPT_fhonor_nans, | 
|  | 4286 | options::OPT_fno_honor_nans)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4287 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4288 | A->getOption().getID() != options::OPT_fno_finite_math_only && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4289 | A->getOption().getID() != options::OPT_fhonor_nans) | 
|  | 4290 | CmdArgs.push_back("-menable-no-nans"); | 
|  | 4291 |  | 
| Benjamin Kramer | c242ef2 | 2012-05-02 14:55:48 +0000 | [diff] [blame] | 4292 | // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes. | 
|  | 4293 | bool MathErrno = getToolChain().IsMathErrnoDefault(); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4294 | if (Arg *A = | 
|  | 4295 | Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4296 | options::OPT_fno_fast_math, options::OPT_fmath_errno, | 
|  | 4297 | options::OPT_fno_math_errno)) { | 
| Chandler Carruth | 0d4b9e6 | 2013-05-18 20:47:36 +0000 | [diff] [blame] | 4298 | // Turning on -ffast_math (with either flag) removes the need for MathErrno. | 
|  | 4299 | // However, turning *off* -ffast_math merely restores the toolchain default | 
|  | 4300 | // (which may be false). | 
|  | 4301 | if (A->getOption().getID() == options::OPT_fno_math_errno || | 
|  | 4302 | A->getOption().getID() == options::OPT_ffast_math || | 
|  | 4303 | A->getOption().getID() == options::OPT_Ofast) | 
|  | 4304 | MathErrno = false; | 
|  | 4305 | else if (A->getOption().getID() == options::OPT_fmath_errno) | 
|  | 4306 | MathErrno = true; | 
|  | 4307 | } | 
| Chandler Carruth | 3634c66 | 2012-04-26 02:10:51 +0000 | [diff] [blame] | 4308 | if (MathErrno) | 
|  | 4309 | CmdArgs.push_back("-fmath-errno"); | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4310 |  | 
|  | 4311 | // There are several flags which require disabling very specific | 
|  | 4312 | // optimizations. Any of these being disabled forces us to turn off the | 
|  | 4313 | // entire set of LLVM optimizations, so collect them through all the flag | 
|  | 4314 | // madness. | 
|  | 4315 | bool AssociativeMath = false; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4316 | if (Arg *A = Args.getLastArg( | 
|  | 4317 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4318 | options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, | 
|  | 4319 | options::OPT_fno_unsafe_math_optimizations, | 
|  | 4320 | options::OPT_fassociative_math, options::OPT_fno_associative_math)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4321 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4322 | A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4323 | A->getOption().getID() != options::OPT_fno_associative_math) | 
|  | 4324 | AssociativeMath = true; | 
|  | 4325 | bool ReciprocalMath = false; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4326 | if (Arg *A = Args.getLastArg( | 
|  | 4327 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4328 | options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, | 
|  | 4329 | options::OPT_fno_unsafe_math_optimizations, | 
|  | 4330 | options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4331 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4332 | A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4333 | A->getOption().getID() != options::OPT_fno_reciprocal_math) | 
|  | 4334 | ReciprocalMath = true; | 
|  | 4335 | bool SignedZeros = true; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4336 | if (Arg *A = Args.getLastArg( | 
|  | 4337 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4338 | options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, | 
|  | 4339 | options::OPT_fno_unsafe_math_optimizations, | 
|  | 4340 | options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4341 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4342 | A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4343 | A->getOption().getID() != options::OPT_fsigned_zeros) | 
|  | 4344 | SignedZeros = false; | 
|  | 4345 | bool TrappingMath = true; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4346 | if (Arg *A = Args.getLastArg( | 
|  | 4347 | options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4348 | options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations, | 
|  | 4349 | options::OPT_fno_unsafe_math_optimizations, | 
|  | 4350 | options::OPT_ftrapping_math, options::OPT_fno_trapping_math)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4351 | if (A->getOption().getID() != options::OPT_fno_fast_math && | 
|  | 4352 | A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations && | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4353 | A->getOption().getID() != options::OPT_ftrapping_math) | 
|  | 4354 | TrappingMath = false; | 
|  | 4355 | if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros && | 
|  | 4356 | !TrappingMath) | 
|  | 4357 | CmdArgs.push_back("-menable-unsafe-fp-math"); | 
|  | 4358 |  | 
| Sanjay Patel | 76c9e09 | 2015-01-23 16:40:50 +0000 | [diff] [blame] | 4359 | if (!SignedZeros) | 
|  | 4360 | CmdArgs.push_back("-fno-signed-zeros"); | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4361 |  | 
| Sanjay Patel | 359b105 | 2015-04-09 15:03:23 +0000 | [diff] [blame] | 4362 | if (ReciprocalMath) | 
|  | 4363 | CmdArgs.push_back("-freciprocal-math"); | 
|  | 4364 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4365 | // Validate and pass through -fp-contract option. | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4366 | if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4367 | options::OPT_fno_fast_math, | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4368 | options::OPT_ffp_contract)) { | 
|  | 4369 | if (A->getOption().getID() == options::OPT_ffp_contract) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4370 | StringRef Val = A->getValue(); | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4371 | if (Val == "fast" || Val == "on" || Val == "off") { | 
|  | 4372 | CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val)); | 
|  | 4373 | } else { | 
|  | 4374 | D.Diag(diag::err_drv_unsupported_option_argument) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4375 | << A->getOption().getName() << Val; | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4376 | } | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4377 | } else if (A->getOption().matches(options::OPT_ffast_math) || | 
|  | 4378 | (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) { | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4379 | // If fast-math is set then set the fp-contract mode to fast. | 
|  | 4380 | CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast")); | 
|  | 4381 | } | 
|  | 4382 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4383 |  | 
| Sanjay Patel | 2987c29 | 2015-06-11 14:53:41 +0000 | [diff] [blame] | 4384 | ParseMRecip(getToolChain().getDriver(), Args, CmdArgs); | 
| Lang Hames | aa53b93 | 2012-07-06 00:59:19 +0000 | [diff] [blame] | 4385 |  | 
| Bob Wilson | 6a03916 | 2012-07-19 03:52:53 +0000 | [diff] [blame] | 4386 | // We separately look for the '-ffast-math' and '-ffinite-math-only' flags, | 
|  | 4387 | // and if we find them, tell the frontend to provide the appropriate | 
|  | 4388 | // preprocessor macros. This is distinct from enabling any optimizations as | 
|  | 4389 | // these options induce language changes which must survive serialization | 
|  | 4390 | // and deserialization, etc. | 
| Chad Rosier | b71f6aa | 2013-04-24 18:09:54 +0000 | [diff] [blame] | 4391 | if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption, | 
|  | 4392 | options::OPT_fno_fast_math)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4393 | if (!A->getOption().matches(options::OPT_fno_fast_math)) | 
|  | 4394 | CmdArgs.push_back("-ffast-math"); | 
| Nico Weber | e8e5311 | 2014-05-11 01:04:02 +0000 | [diff] [blame] | 4395 | if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only, | 
|  | 4396 | options::OPT_fno_fast_math)) | 
| Chad Rosier | c30eb1c | 2012-09-25 22:03:25 +0000 | [diff] [blame] | 4397 | if (A->getOption().matches(options::OPT_ffinite_math_only)) | 
|  | 4398 | CmdArgs.push_back("-ffinite-math-only"); | 
| Chandler Carruth | 306bd2c | 2012-01-02 14:19:45 +0000 | [diff] [blame] | 4399 |  | 
| Daniel Dunbar | 0d8ca9e | 2010-05-14 22:00:22 +0000 | [diff] [blame] | 4400 | // Decide whether to use verbose asm. Verbose assembly is the default on | 
|  | 4401 | // toolchains which have the integrated assembler on by default. | 
| Saleem Abdulrasool | 42e4b59 | 2014-02-22 23:37:58 +0000 | [diff] [blame] | 4402 | bool IsIntegratedAssemblerDefault = | 
|  | 4403 | getToolChain().IsIntegratedAssemblerDefault(); | 
| Daniel Dunbar | 0d8ca9e | 2010-05-14 22:00:22 +0000 | [diff] [blame] | 4404 | if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, | 
| Saleem Abdulrasool | 42e4b59 | 2014-02-22 23:37:58 +0000 | [diff] [blame] | 4405 | IsIntegratedAssemblerDefault) || | 
| Daniel Dunbar | 0d8ca9e | 2010-05-14 22:00:22 +0000 | [diff] [blame] | 4406 | Args.hasArg(options::OPT_dA)) | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4407 | CmdArgs.push_back("-masm-verbose"); | 
| Daniel Dunbar | 0d8ca9e | 2010-05-14 22:00:22 +0000 | [diff] [blame] | 4408 |  | 
| Rafael Espindola | b8a1293 | 2015-05-22 20:44:03 +0000 | [diff] [blame] | 4409 | if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as, | 
|  | 4410 | IsIntegratedAssemblerDefault)) | 
| Saleem Abdulrasool | 42e4b59 | 2014-02-22 23:37:58 +0000 | [diff] [blame] | 4411 | CmdArgs.push_back("-no-integrated-as"); | 
|  | 4412 |  | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4413 | if (Args.hasArg(options::OPT_fdebug_pass_structure)) { | 
|  | 4414 | CmdArgs.push_back("-mdebug-pass"); | 
|  | 4415 | CmdArgs.push_back("Structure"); | 
|  | 4416 | } | 
|  | 4417 | if (Args.hasArg(options::OPT_fdebug_pass_arguments)) { | 
|  | 4418 | CmdArgs.push_back("-mdebug-pass"); | 
|  | 4419 | CmdArgs.push_back("Arguments"); | 
|  | 4420 | } | 
|  | 4421 |  | 
| Justin Lebar | 710a35f | 2016-01-25 22:36:35 +0000 | [diff] [blame] | 4422 | // Enable -mconstructor-aliases except on darwin, where we have to work around | 
|  | 4423 | // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where | 
|  | 4424 | // aliases aren't supported. | 
|  | 4425 | if (!getToolChain().getTriple().isOSDarwin() && | 
|  | 4426 | !getToolChain().getTriple().isNVPTX()) | 
| John McCall | 8517abc | 2010-02-19 02:45:38 +0000 | [diff] [blame] | 4427 | CmdArgs.push_back("-mconstructor-aliases"); | 
| NAKAMURA Takumi | 029d74b | 2011-02-17 08:50:50 +0000 | [diff] [blame] | 4428 |  | 
| John McCall | 7ef5cb3 | 2011-03-18 02:56:14 +0000 | [diff] [blame] | 4429 | // Darwin's kernel doesn't support guard variables; just die if we | 
|  | 4430 | // try to use them. | 
| Bob Wilson | 6524dd3 | 2011-10-14 05:03:44 +0000 | [diff] [blame] | 4431 | if (KernelOrKext && getToolChain().getTriple().isOSDarwin()) | 
| John McCall | 7ef5cb3 | 2011-03-18 02:56:14 +0000 | [diff] [blame] | 4432 | CmdArgs.push_back("-fforbid-guard-variables"); | 
|  | 4433 |  | 
| Akira Hatanaka | 0202848 | 2015-11-12 17:21:22 +0000 | [diff] [blame] | 4434 | if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields, | 
|  | 4435 | false)) { | 
| Douglas Gregor | dbe3927 | 2011-02-01 15:15:22 +0000 | [diff] [blame] | 4436 | CmdArgs.push_back("-mms-bitfields"); | 
|  | 4437 | } | 
| John McCall | 8517abc | 2010-02-19 02:45:38 +0000 | [diff] [blame] | 4438 |  | 
| Daniel Dunbar | 306945d | 2009-09-16 06:17:29 +0000 | [diff] [blame] | 4439 | // This is a coarse approximation of what llvm-gcc actually does, both | 
|  | 4440 | // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more | 
|  | 4441 | // complicated ways. | 
|  | 4442 | bool AsynchronousUnwindTables = | 
| Evgeniy Stepanov | 7429c59 | 2014-02-14 08:56:25 +0000 | [diff] [blame] | 4443 | Args.hasFlag(options::OPT_fasynchronous_unwind_tables, | 
|  | 4444 | options::OPT_fno_asynchronous_unwind_tables, | 
|  | 4445 | (getToolChain().IsUnwindTablesDefault() || | 
|  | 4446 | getToolChain().getSanitizerArgs().needsUnwindTables()) && | 
|  | 4447 | !KernelOrKext); | 
| Daniel Dunbar | 306945d | 2009-09-16 06:17:29 +0000 | [diff] [blame] | 4448 | if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables, | 
|  | 4449 | AsynchronousUnwindTables)) | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4450 | CmdArgs.push_back("-munwind-tables"); | 
|  | 4451 |  | 
| Chandler Carruth | 05fb585 | 2012-11-21 23:40:23 +0000 | [diff] [blame] | 4452 | getToolChain().addClangTargetOptions(Args, CmdArgs); | 
| Rafael Espindola | 66aa045 | 2012-06-19 01:26:10 +0000 | [diff] [blame] | 4453 |  | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4454 | if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) { | 
|  | 4455 | CmdArgs.push_back("-mlimit-float-precision"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4456 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4457 | } | 
| Daniel Dunbar | 44e7122 | 2009-04-29 18:32:25 +0000 | [diff] [blame] | 4458 |  | 
| Daniel Dunbar | 4dbaaa6 | 2009-05-06 03:16:41 +0000 | [diff] [blame] | 4459 | // FIXME: Handle -mtune=. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4460 | (void)Args.hasArg(options::OPT_mtune_EQ); | 
| Daniel Dunbar | 44e7122 | 2009-04-29 18:32:25 +0000 | [diff] [blame] | 4461 |  | 
| Benjamin Kramer | cf4371a | 2009-08-05 14:30:52 +0000 | [diff] [blame] | 4462 | if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) { | 
| Daniel Dunbar | a1b02a2 | 2009-11-29 07:18:39 +0000 | [diff] [blame] | 4463 | CmdArgs.push_back("-mcode-model"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4464 | CmdArgs.push_back(A->getValue()); | 
| Benjamin Kramer | cf4371a | 2009-08-05 14:30:52 +0000 | [diff] [blame] | 4465 | } | 
|  | 4466 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 4467 | // Add the target cpu | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4468 | std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false); | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 4469 | if (!CPU.empty()) { | 
|  | 4470 | CmdArgs.push_back("-target-cpu"); | 
|  | 4471 | CmdArgs.push_back(Args.MakeArgString(CPU)); | 
|  | 4472 | } | 
|  | 4473 |  | 
| Rafael Espindola | eb26547 | 2013-08-21 21:59:03 +0000 | [diff] [blame] | 4474 | if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) { | 
|  | 4475 | CmdArgs.push_back("-mfpmath"); | 
|  | 4476 | CmdArgs.push_back(A->getValue()); | 
|  | 4477 | } | 
|  | 4478 |  | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 4479 | // Add the target features | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4480 | getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false); | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 4481 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 4482 | // Add target specific flags. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4483 | switch (getToolChain().getArch()) { | 
| Daniel Dunbar | 3b3191f | 2009-09-09 22:33:08 +0000 | [diff] [blame] | 4484 | default: | 
|  | 4485 | break; | 
| Daniel Dunbar | 4dbaaa6 | 2009-05-06 03:16:41 +0000 | [diff] [blame] | 4486 |  | 
| Daniel Dunbar | 0f5c542 | 2009-09-10 04:57:17 +0000 | [diff] [blame] | 4487 | case llvm::Triple::arm: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 4488 | case llvm::Triple::armeb: | 
| Daniel Dunbar | 0f5c542 | 2009-09-10 04:57:17 +0000 | [diff] [blame] | 4489 | case llvm::Triple::thumb: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 4490 | case llvm::Triple::thumbeb: | 
| Saleem Abdulrasool | ce63ce9 | 2015-09-19 18:19:44 +0000 | [diff] [blame] | 4491 | // Use the effective triple, which takes into account the deployment target. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4492 | AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext); | 
| Daniel Dunbar | 0f5c542 | 2009-09-10 04:57:17 +0000 | [diff] [blame] | 4493 | break; | 
|  | 4494 |  | 
| Tim Northover | 573cbee | 2014-05-24 12:52:07 +0000 | [diff] [blame] | 4495 | case llvm::Triple::aarch64: | 
|  | 4496 | case llvm::Triple::aarch64_be: | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4497 | AddAArch64TargetArgs(Args, CmdArgs); | 
| Tim Northover | a2ee433 | 2014-03-29 15:09:45 +0000 | [diff] [blame] | 4498 | break; | 
|  | 4499 |  | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 4500 | case llvm::Triple::mips: | 
|  | 4501 | case llvm::Triple::mipsel: | 
| Akira Hatanaka | 94ab554 | 2011-09-21 02:13:07 +0000 | [diff] [blame] | 4502 | case llvm::Triple::mips64: | 
|  | 4503 | case llvm::Triple::mips64el: | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 4504 | AddMIPSTargetArgs(Args, CmdArgs); | 
|  | 4505 | break; | 
|  | 4506 |  | 
| Ulrich Weigand | 8afad61 | 2014-07-28 13:17:52 +0000 | [diff] [blame] | 4507 | case llvm::Triple::ppc: | 
|  | 4508 | case llvm::Triple::ppc64: | 
|  | 4509 | case llvm::Triple::ppc64le: | 
|  | 4510 | AddPPCTargetArgs(Args, CmdArgs); | 
|  | 4511 | break; | 
|  | 4512 |  | 
| Bruno Cardoso Lopes | e7f211c | 2010-11-09 17:21:19 +0000 | [diff] [blame] | 4513 | case llvm::Triple::sparc: | 
| Douglas Katzman | f36dddf | 2015-05-11 15:21:44 +0000 | [diff] [blame] | 4514 | case llvm::Triple::sparcel: | 
| Brad Smith | 10cd0f4 | 2014-07-11 20:12:08 +0000 | [diff] [blame] | 4515 | case llvm::Triple::sparcv9: | 
| Bruno Cardoso Lopes | e7f211c | 2010-11-09 17:21:19 +0000 | [diff] [blame] | 4516 | AddSparcTargetArgs(Args, CmdArgs); | 
|  | 4517 | break; | 
|  | 4518 |  | 
| Marcin Koscielnicki | b31ee6d | 2016-05-04 23:37:40 +0000 | [diff] [blame] | 4519 | case llvm::Triple::systemz: | 
|  | 4520 | AddSystemZTargetArgs(Args, CmdArgs); | 
|  | 4521 | break; | 
|  | 4522 |  | 
| Daniel Dunbar | 3b3191f | 2009-09-09 22:33:08 +0000 | [diff] [blame] | 4523 | case llvm::Triple::x86: | 
|  | 4524 | case llvm::Triple::x86_64: | 
|  | 4525 | AddX86TargetArgs(Args, CmdArgs); | 
|  | 4526 | break; | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 4527 |  | 
| Jacques Pienaar | d964cc2 | 2016-03-28 21:02:54 +0000 | [diff] [blame] | 4528 | case llvm::Triple::lanai: | 
|  | 4529 | AddLanaiTargetArgs(Args, CmdArgs); | 
|  | 4530 | break; | 
|  | 4531 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 4532 | case llvm::Triple::hexagon: | 
|  | 4533 | AddHexagonTargetArgs(Args, CmdArgs); | 
|  | 4534 | break; | 
| Dan Gohman | e3d71e1 | 2016-01-07 01:00:21 +0000 | [diff] [blame] | 4535 |  | 
|  | 4536 | case llvm::Triple::wasm32: | 
|  | 4537 | case llvm::Triple::wasm64: | 
|  | 4538 | AddWebAssemblyTargetArgs(Args, CmdArgs); | 
|  | 4539 | break; | 
| Daniel Dunbar | 44e7122 | 2009-04-29 18:32:25 +0000 | [diff] [blame] | 4540 | } | 
|  | 4541 |  | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4542 | // The 'g' groups options involve a somewhat intricate sequence of decisions | 
|  | 4543 | // about what to pass from the driver to the frontend, but by the time they | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4544 | // reach cc1 they've been factored into three well-defined orthogonal choices: | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4545 | //  * what level of debug info to generate | 
|  | 4546 | //  * what dwarf version to write | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4547 | //  * what debugger tuning to use | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4548 | // This avoids having to monkey around further in cc1 other than to disable | 
|  | 4549 | // codeview if not running in a Windows environment. Perhaps even that | 
|  | 4550 | // decision should be made in the driver as well though. | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4551 | unsigned DwarfVersion = 0; | 
|  | 4552 | llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning(); | 
|  | 4553 | // These two are potentially updated by AddClangCLArgs. | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 4554 | codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo; | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4555 | bool EmitCodeView = false; | 
|  | 4556 |  | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 4557 | // Add clang-cl arguments. | 
| David Majnemer | cd5855e | 2016-02-29 01:40:36 +0000 | [diff] [blame] | 4558 | types::ID InputType = Input.getType(); | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 4559 | if (getToolChain().getDriver().IsCLMode()) | 
| David Majnemer | cd5855e | 2016-02-29 01:40:36 +0000 | [diff] [blame] | 4560 | AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView); | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 4561 |  | 
| Daniel Dunbar | 976a2f5 | 2010-08-11 23:07:47 +0000 | [diff] [blame] | 4562 | // Pass the linker version in use. | 
|  | 4563 | if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { | 
|  | 4564 | CmdArgs.push_back("-target-linker-version"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4565 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 976a2f5 | 2010-08-11 23:07:47 +0000 | [diff] [blame] | 4566 | } | 
|  | 4567 |  | 
| Eric Christopher | b7d97e9 | 2013-04-03 01:58:53 +0000 | [diff] [blame] | 4568 | if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple())) | 
| Daniel Dunbar | bb7ac52 | 2010-07-01 01:31:45 +0000 | [diff] [blame] | 4569 | CmdArgs.push_back("-momit-leaf-frame-pointer"); | 
|  | 4570 |  | 
| Daniel Dunbar | fcc49a8 | 2010-05-12 18:19:58 +0000 | [diff] [blame] | 4571 | // Explicitly error on some things we know we don't support and can't just | 
|  | 4572 | // ignore. | 
| Daniel Dunbar | 4ed214a | 2010-09-24 19:39:37 +0000 | [diff] [blame] | 4573 | if (!Args.hasArg(options::OPT_fallow_unsupported)) { | 
|  | 4574 | Arg *Unsupported; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4575 | if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() && | 
| Eli Bendersky | d4a6aec | 2013-07-24 22:20:49 +0000 | [diff] [blame] | 4576 | getToolChain().getArch() == llvm::Triple::x86) { | 
| Bob Wilson | 0d45f58 | 2011-08-13 23:48:55 +0000 | [diff] [blame] | 4577 | if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) || | 
|  | 4578 | (Unsupported = Args.getLastArg(options::OPT_mkernel))) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 4579 | D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4580 | << Unsupported->getOption().getName(); | 
| Daniel Dunbar | 4ed214a | 2010-09-24 19:39:37 +0000 | [diff] [blame] | 4581 | } | 
| Daniel Dunbar | fcc49a8 | 2010-05-12 18:19:58 +0000 | [diff] [blame] | 4582 | } | 
|  | 4583 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4584 | Args.AddAllArgs(CmdArgs, options::OPT_v); | 
| Daniel Dunbar | d435275 | 2010-08-24 22:44:13 +0000 | [diff] [blame] | 4585 | Args.AddLastArg(CmdArgs, options::OPT_H); | 
| Chad Rosier | be10f98 | 2011-08-02 17:58:04 +0000 | [diff] [blame] | 4586 | if (D.CCPrintHeaders && !D.CCGenDiagnostics) { | 
| Daniel Dunbar | ac540b3 | 2011-02-02 21:11:35 +0000 | [diff] [blame] | 4587 | CmdArgs.push_back("-header-include-file"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4588 | CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename | 
|  | 4589 | : "-"); | 
| Daniel Dunbar | ac540b3 | 2011-02-02 21:11:35 +0000 | [diff] [blame] | 4590 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4591 | Args.AddLastArg(CmdArgs, options::OPT_P); | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 4592 | Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4593 |  | 
| Chad Rosier | be10f98 | 2011-08-02 17:58:04 +0000 | [diff] [blame] | 4594 | if (D.CCLogDiagnostics && !D.CCGenDiagnostics) { | 
| Daniel Dunbar | 529c03b | 2011-04-07 18:01:20 +0000 | [diff] [blame] | 4595 | CmdArgs.push_back("-diagnostic-log-file"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4596 | CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename | 
|  | 4597 | : "-"); | 
| Daniel Dunbar | 529c03b | 2011-04-07 18:01:20 +0000 | [diff] [blame] | 4598 | } | 
|  | 4599 |  | 
| David Blaikie | 3d0a039 | 2016-08-24 23:22:36 +0000 | [diff] [blame] | 4600 | bool splitDwarfInlining = | 
|  | 4601 | Args.hasFlag(options::OPT_fsplit_dwarf_inlining, | 
|  | 4602 | options::OPT_fno_split_dwarf_inlining, true); | 
|  | 4603 | if (!splitDwarfInlining) | 
|  | 4604 | CmdArgs.push_back("-fno-split-dwarf-inlining"); | 
|  | 4605 |  | 
| Rafael Espindola | 08a692a | 2010-03-07 04:46:18 +0000 | [diff] [blame] | 4606 | Args.ClaimAllArgs(options::OPT_g_Group); | 
| David Blaikie | ce3e7a6 | 2015-07-30 21:42:22 +0000 | [diff] [blame] | 4607 | Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf); | 
| Alexey Samsonov | dda3a7f | 2012-05-29 08:10:34 +0000 | [diff] [blame] | 4608 | if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4609 | // If the last option explicitly specified a debug-info level, use it. | 
|  | 4610 | if (A->getOption().matches(options::OPT_gN_Group)) { | 
|  | 4611 | DebugInfoKind = DebugLevelToInfoKind(*A); | 
|  | 4612 | // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses. | 
|  | 4613 | // But -gsplit-dwarf is not a g_group option, hence we have to check the | 
|  | 4614 | // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.) | 
| David Blaikie | 3d0a039 | 2016-08-24 23:22:36 +0000 | [diff] [blame] | 4615 | // This gets a bit more complicated if you've disabled inline info in the | 
|  | 4616 | // skeleton CUs (splitDwarfInlining) - then there's value in composing | 
|  | 4617 | // split-dwarf and line-tables-only, so let those compose naturally in | 
|  | 4618 | // that case. | 
|  | 4619 | // And if you just turned off debug info, (-gsplit-dwarf -g0) - do that. | 
|  | 4620 | if (SplitDwarfArg && A->getIndex() > SplitDwarfArg->getIndex() && | 
|  | 4621 | ((DebugInfoKind == codegenoptions::DebugLineTablesOnly && | 
|  | 4622 | splitDwarfInlining) || | 
|  | 4623 | DebugInfoKind == codegenoptions::NoDebugInfo)) | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4624 | SplitDwarfArg = nullptr; | 
|  | 4625 | } else | 
|  | 4626 | // For any other 'g' option, use Limited. | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 4627 | DebugInfoKind = codegenoptions::LimitedDebugInfo; | 
| Alexey Samsonov | dda3a7f | 2012-05-29 08:10:34 +0000 | [diff] [blame] | 4628 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4629 |  | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4630 | // If a debugger tuning argument appeared, remember it. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4631 | if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, | 
|  | 4632 | options::OPT_ggdbN_Group)) { | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4633 | if (A->getOption().matches(options::OPT_glldb)) | 
|  | 4634 | DebuggerTuning = llvm::DebuggerKind::LLDB; | 
|  | 4635 | else if (A->getOption().matches(options::OPT_gsce)) | 
|  | 4636 | DebuggerTuning = llvm::DebuggerKind::SCE; | 
|  | 4637 | else | 
|  | 4638 | DebuggerTuning = llvm::DebuggerKind::GDB; | 
|  | 4639 | } | 
|  | 4640 |  | 
|  | 4641 | // If a -gdwarf argument appeared, remember it. | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4642 | if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3, | 
| Eric Christopher | 3cb592d | 2015-12-28 19:58:44 +0000 | [diff] [blame] | 4643 | options::OPT_gdwarf_4, options::OPT_gdwarf_5)) | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4644 | DwarfVersion = DwarfVersionNum(A->getSpelling()); | 
|  | 4645 |  | 
| Reid Kleckner | bab5a5d | 2016-08-09 17:23:56 +0000 | [diff] [blame] | 4646 | // Forward -gcodeview. EmitCodeView might have been set by CL-compatibility | 
|  | 4647 | // argument parsing. | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4648 | if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) { | 
|  | 4649 | // DwarfVersion remains at 0 if no explicit choice was made. | 
|  | 4650 | CmdArgs.push_back("-gcodeview"); | 
|  | 4651 | } else if (DwarfVersion == 0 && | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 4652 | DebugInfoKind != codegenoptions::NoDebugInfo) { | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4653 | DwarfVersion = getToolChain().GetDefaultDwarfVersion(); | 
|  | 4654 | } | 
| Reid Kleckner | 124955a | 2015-08-05 18:51:13 +0000 | [diff] [blame] | 4655 |  | 
| Alexey Samsonov | f50a9ff | 2012-06-21 08:22:39 +0000 | [diff] [blame] | 4656 | // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now. | 
|  | 4657 | Args.ClaimAllArgs(options::OPT_g_flags_Group); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 4658 |  | 
| Adrian McCarthy | 084148f | 2016-08-25 18:24:35 +0000 | [diff] [blame] | 4659 | // Column info is included by default for everything except PS4 and CodeView. | 
|  | 4660 | // Clang doesn't track end columns, just starting columns, which, in theory, | 
|  | 4661 | // is fine for CodeView (and PDB).  In practice, however, the Microsoft | 
|  | 4662 | // debuggers don't handle missing end columns well, so it's better not to | 
|  | 4663 | // include any column info. | 
| Diego Novillo | 94b276d | 2014-07-10 23:29:28 +0000 | [diff] [blame] | 4664 | if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info, | 
| Adrian McCarthy | 084148f | 2016-08-25 18:24:35 +0000 | [diff] [blame] | 4665 | /*Default=*/ !IsPS4CPU && !(IsWindowsMSVC && EmitCodeView))) | 
| Eric Christopher | a2f7eb7 | 2012-10-18 21:52:18 +0000 | [diff] [blame] | 4666 | CmdArgs.push_back("-dwarf-column-info"); | 
| Alexey Samsonov | f50a9ff | 2012-06-21 08:22:39 +0000 | [diff] [blame] | 4667 |  | 
| Eric Christopher | 138c32b | 2013-09-13 22:37:55 +0000 | [diff] [blame] | 4668 | // FIXME: Move backend command line options to the module. | 
| Adrian Prantl | 6b21ab2 | 2015-08-27 19:46:20 +0000 | [diff] [blame] | 4669 | if (Args.hasArg(options::OPT_gmodules)) { | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 4670 | DebugInfoKind = codegenoptions::LimitedDebugInfo; | 
| Adrian Prantl | 6b21ab2 | 2015-08-27 19:46:20 +0000 | [diff] [blame] | 4671 | CmdArgs.push_back("-dwarf-ext-refs"); | 
|  | 4672 | CmdArgs.push_back("-fmodule-format=obj"); | 
|  | 4673 | } | 
|  | 4674 |  | 
| Eric Christopher | 2ba5fcb | 2013-02-05 07:29:57 +0000 | [diff] [blame] | 4675 | // -gsplit-dwarf should turn on -g and enable the backend dwarf | 
|  | 4676 | // splitting and extraction. | 
| Eric Christopher | d42fb73 | 2013-02-21 22:35:05 +0000 | [diff] [blame] | 4677 | // FIXME: Currently only works on Linux. | 
| David Blaikie | ce3e7a6 | 2015-07-30 21:42:22 +0000 | [diff] [blame] | 4678 | if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) { | 
| David Blaikie | 3d0a039 | 2016-08-24 23:22:36 +0000 | [diff] [blame] | 4679 | if (splitDwarfInlining) | 
|  | 4680 | DebugInfoKind = codegenoptions::LimitedDebugInfo; | 
| Eric Christopher | 2ba5fcb | 2013-02-05 07:29:57 +0000 | [diff] [blame] | 4681 | CmdArgs.push_back("-backend-option"); | 
|  | 4682 | CmdArgs.push_back("-split-dwarf=Enable"); | 
|  | 4683 | } | 
|  | 4684 |  | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4685 | // After we've dealt with all combinations of things that could | 
|  | 4686 | // make DebugInfoKind be other than None or DebugLineTablesOnly, | 
|  | 4687 | // figure out if we need to "upgrade" it to standalone debug info. | 
|  | 4688 | // We parse these two '-f' options whether or not they will be used, | 
|  | 4689 | // to claim them even if you wrote "-fstandalone-debug -gline-tables-only" | 
|  | 4690 | bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug, | 
|  | 4691 | options::OPT_fno_standalone_debug, | 
|  | 4692 | getToolChain().GetDefaultStandaloneDebug()); | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 4693 | if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug) | 
|  | 4694 | DebugInfoKind = codegenoptions::FullDebugInfo; | 
| Paul Robinson | 0334a04 | 2015-12-19 19:41:48 +0000 | [diff] [blame] | 4695 | RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion, | 
|  | 4696 | DebuggerTuning); | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 4697 |  | 
| Eric Christopher | 138c32b | 2013-09-13 22:37:55 +0000 | [diff] [blame] | 4698 | // -ggnu-pubnames turns on gnu style pubnames in the backend. | 
|  | 4699 | if (Args.hasArg(options::OPT_ggnu_pubnames)) { | 
|  | 4700 | CmdArgs.push_back("-backend-option"); | 
|  | 4701 | CmdArgs.push_back("-generate-gnu-dwarf-pub-sections"); | 
|  | 4702 | } | 
| Eric Christopher | eec89c2 | 2013-06-18 00:03:50 +0000 | [diff] [blame] | 4703 |  | 
| Eric Christopher | 0d403d2 | 2014-02-14 01:27:03 +0000 | [diff] [blame] | 4704 | // -gdwarf-aranges turns on the emission of the aranges section in the | 
|  | 4705 | // backend. | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 4706 | // Always enabled on the PS4. | 
|  | 4707 | if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) { | 
| Eric Christopher | 0d403d2 | 2014-02-14 01:27:03 +0000 | [diff] [blame] | 4708 | CmdArgs.push_back("-backend-option"); | 
|  | 4709 | CmdArgs.push_back("-generate-arange-section"); | 
|  | 4710 | } | 
|  | 4711 |  | 
| David Blaikie | f36d9ba | 2014-01-27 18:52:43 +0000 | [diff] [blame] | 4712 | if (Args.hasFlag(options::OPT_fdebug_types_section, | 
|  | 4713 | options::OPT_fno_debug_types_section, false)) { | 
| David Blaikie | d74be70 | 2014-01-18 02:02:06 +0000 | [diff] [blame] | 4714 | CmdArgs.push_back("-backend-option"); | 
|  | 4715 | CmdArgs.push_back("-generate-type-units"); | 
|  | 4716 | } | 
| Eric Christopher | eec89c2 | 2013-06-18 00:03:50 +0000 | [diff] [blame] | 4717 |  | 
| Dan Gohman | a5b804b | 2016-01-07 00:50:27 +0000 | [diff] [blame] | 4718 | // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by | 
|  | 4719 | // default. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 4720 | bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI || | 
|  | 4721 | Triple.getArch() == llvm::Triple::wasm32 || | 
|  | 4722 | Triple.getArch() == llvm::Triple::wasm64; | 
| Ed Schouten | 6e57615 | 2015-03-26 17:50:28 +0000 | [diff] [blame] | 4723 |  | 
| Evgeniy Stepanov | 9e7cb33 | 2014-02-03 11:11:37 +0000 | [diff] [blame] | 4724 | if (Args.hasFlag(options::OPT_ffunction_sections, | 
| Ed Schouten | 6e57615 | 2015-03-26 17:50:28 +0000 | [diff] [blame] | 4725 | options::OPT_fno_function_sections, UseSeparateSections)) { | 
| Evgeniy Stepanov | 9e7cb33 | 2014-02-03 11:11:37 +0000 | [diff] [blame] | 4726 | CmdArgs.push_back("-ffunction-sections"); | 
|  | 4727 | } | 
|  | 4728 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4729 | if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections, | 
|  | 4730 | UseSeparateSections)) { | 
| Evgeniy Stepanov | 9e7cb33 | 2014-02-03 11:11:37 +0000 | [diff] [blame] | 4731 | CmdArgs.push_back("-fdata-sections"); | 
|  | 4732 | } | 
| Rafael Espindola | 66bfb275 | 2010-05-06 21:06:04 +0000 | [diff] [blame] | 4733 |  | 
| Rafael Espindola | 6b07a1c | 2015-02-20 18:08:57 +0000 | [diff] [blame] | 4734 | if (!Args.hasFlag(options::OPT_funique_section_names, | 
| Rafael Espindola | b8a1293 | 2015-05-22 20:44:03 +0000 | [diff] [blame] | 4735 | options::OPT_fno_unique_section_names, true)) | 
| Rafael Espindola | 6b07a1c | 2015-02-20 18:08:57 +0000 | [diff] [blame] | 4736 | CmdArgs.push_back("-fno-unique-section-names"); | 
|  | 4737 |  | 
| Chris Lattner | 3c77a35 | 2010-06-22 00:03:40 +0000 | [diff] [blame] | 4738 | Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions); | 
|  | 4739 |  | 
| Dean Michael Berris | 25a1564 | 2016-07-14 06:37:46 +0000 | [diff] [blame] | 4740 | if (Args.hasFlag(options::OPT_fxray_instrument, | 
|  | 4741 | options::OPT_fnoxray_instrument, false)) { | 
| Dean Michael Berris | 39baab9 | 2016-07-14 04:58:44 +0000 | [diff] [blame] | 4742 | CmdArgs.push_back("-fxray-instrument"); | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 4743 | if (const Arg *A = | 
|  | 4744 | Args.getLastArg(options::OPT_fxray_instruction_threshold_, | 
|  | 4745 | options::OPT_fxray_instruction_threshold_EQ)) { | 
|  | 4746 | CmdArgs.push_back("-fxray-instruction-threshold"); | 
|  | 4747 | CmdArgs.push_back(A->getValue()); | 
|  | 4748 | } | 
|  | 4749 | } | 
|  | 4750 |  | 
| Diego Novillo | a054596 | 2015-07-10 18:00:07 +0000 | [diff] [blame] | 4751 | addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs); | 
| Nick Lewycky | 480cb99 | 2011-05-04 20:46:58 +0000 | [diff] [blame] | 4752 |  | 
| Paul Robinson | d083b9a | 2015-12-16 17:25:27 +0000 | [diff] [blame] | 4753 | // Add runtime flag for PS4 when PGO or Coverage are enabled. | 
|  | 4754 | if (getToolChain().getTriple().isPS4CPU()) | 
|  | 4755 | addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs); | 
|  | 4756 |  | 
| Daniel Dunbar | b25bfde | 2011-10-11 18:20:10 +0000 | [diff] [blame] | 4757 | // Pass options for controlling the default header search paths. | 
|  | 4758 | if (Args.hasArg(options::OPT_nostdinc)) { | 
|  | 4759 | CmdArgs.push_back("-nostdsysteminc"); | 
|  | 4760 | CmdArgs.push_back("-nobuiltininc"); | 
|  | 4761 | } else { | 
| Daniel Dunbar | 0f41eee | 2011-10-11 18:20:16 +0000 | [diff] [blame] | 4762 | if (Args.hasArg(options::OPT_nostdlibinc)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4763 | CmdArgs.push_back("-nostdsysteminc"); | 
| Daniel Dunbar | b25bfde | 2011-10-11 18:20:10 +0000 | [diff] [blame] | 4764 | Args.AddLastArg(CmdArgs, options::OPT_nostdincxx); | 
|  | 4765 | Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc); | 
|  | 4766 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4767 |  | 
| Daniel Dunbar | 34e0b8c | 2009-12-15 01:02:52 +0000 | [diff] [blame] | 4768 | // Pass the path to compiler resource files. | 
| Daniel Dunbar | 34e0b8c | 2009-12-15 01:02:52 +0000 | [diff] [blame] | 4769 | CmdArgs.push_back("-resource-dir"); | 
| Daniel Dunbar | 3f3e2cd | 2010-01-20 02:35:16 +0000 | [diff] [blame] | 4770 | CmdArgs.push_back(D.ResourceDir.c_str()); | 
| Daniel Dunbar | 9dc82a2 | 2009-04-07 21:42:00 +0000 | [diff] [blame] | 4771 |  | 
| Argyrios Kyrtzidis | 71731d6 | 2010-11-03 22:45:23 +0000 | [diff] [blame] | 4772 | Args.AddLastArg(CmdArgs, options::OPT_working_directory); | 
|  | 4773 |  | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4774 | bool ARCMTEnabled = false; | 
| Argyrios Kyrtzidis | 85230d5 | 2013-09-17 19:14:29 +0000 | [diff] [blame] | 4775 | if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) { | 
| Argyrios Kyrtzidis | c44b93d | 2011-07-07 04:00:39 +0000 | [diff] [blame] | 4776 | if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check, | 
| Argyrios Kyrtzidis | 7fbd97f | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 4777 | options::OPT_ccc_arcmt_modify, | 
|  | 4778 | options::OPT_ccc_arcmt_migrate)) { | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4779 | ARCMTEnabled = true; | 
| John McCall | d70fb98 | 2011-06-15 23:25:17 +0000 | [diff] [blame] | 4780 | switch (A->getOption().getID()) { | 
|  | 4781 | default: | 
|  | 4782 | llvm_unreachable("missed a case"); | 
| Argyrios Kyrtzidis | c44b93d | 2011-07-07 04:00:39 +0000 | [diff] [blame] | 4783 | case options::OPT_ccc_arcmt_check: | 
| John McCall | d70fb98 | 2011-06-15 23:25:17 +0000 | [diff] [blame] | 4784 | CmdArgs.push_back("-arcmt-check"); | 
|  | 4785 | break; | 
| Argyrios Kyrtzidis | c44b93d | 2011-07-07 04:00:39 +0000 | [diff] [blame] | 4786 | case options::OPT_ccc_arcmt_modify: | 
| John McCall | d70fb98 | 2011-06-15 23:25:17 +0000 | [diff] [blame] | 4787 | CmdArgs.push_back("-arcmt-modify"); | 
|  | 4788 | break; | 
| Argyrios Kyrtzidis | 7fbd97f | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 4789 | case options::OPT_ccc_arcmt_migrate: | 
|  | 4790 | CmdArgs.push_back("-arcmt-migrate"); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4791 | CmdArgs.push_back("-mt-migrate-directory"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4792 | CmdArgs.push_back(A->getValue()); | 
| Argyrios Kyrtzidis | d571363 | 2011-07-19 17:20:03 +0000 | [diff] [blame] | 4793 |  | 
|  | 4794 | Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output); | 
|  | 4795 | Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors); | 
| Argyrios Kyrtzidis | 7fbd97f | 2011-07-09 20:00:58 +0000 | [diff] [blame] | 4796 | break; | 
| John McCall | d70fb98 | 2011-06-15 23:25:17 +0000 | [diff] [blame] | 4797 | } | 
|  | 4798 | } | 
| Argyrios Kyrtzidis | b11a192 | 2013-06-24 19:01:18 +0000 | [diff] [blame] | 4799 | } else { | 
|  | 4800 | Args.ClaimAllArgs(options::OPT_ccc_arcmt_check); | 
|  | 4801 | Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify); | 
|  | 4802 | Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate); | 
| John McCall | d70fb98 | 2011-06-15 23:25:17 +0000 | [diff] [blame] | 4803 | } | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 4804 |  | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4805 | if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) { | 
|  | 4806 | if (ARCMTEnabled) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4807 | D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) | 
|  | 4808 | << "-ccc-arcmt-migrate"; | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4809 | } | 
|  | 4810 | CmdArgs.push_back("-mt-migrate-directory"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4811 | CmdArgs.push_back(A->getValue()); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4812 |  | 
|  | 4813 | if (!Args.hasArg(options::OPT_objcmt_migrate_literals, | 
| Fariborz Jahanian | d83ef84 | 2013-07-09 16:59:14 +0000 | [diff] [blame] | 4814 | options::OPT_objcmt_migrate_subscripting, | 
|  | 4815 | options::OPT_objcmt_migrate_property)) { | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4816 | // None specified, means enable them all. | 
|  | 4817 | CmdArgs.push_back("-objcmt-migrate-literals"); | 
|  | 4818 | CmdArgs.push_back("-objcmt-migrate-subscripting"); | 
| Fariborz Jahanian | d83ef84 | 2013-07-09 16:59:14 +0000 | [diff] [blame] | 4819 | CmdArgs.push_back("-objcmt-migrate-property"); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4820 | } else { | 
|  | 4821 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); | 
|  | 4822 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); | 
| Fariborz Jahanian | d83ef84 | 2013-07-09 16:59:14 +0000 | [diff] [blame] | 4823 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4824 | } | 
| Argyrios Kyrtzidis | 55ecf99 | 2013-11-13 23:38:20 +0000 | [diff] [blame] | 4825 | } else { | 
|  | 4826 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals); | 
|  | 4827 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting); | 
|  | 4828 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property); | 
|  | 4829 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all); | 
|  | 4830 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property); | 
|  | 4831 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property); | 
| Fariborz Jahanian | 773fa2c | 2015-03-03 17:15:38 +0000 | [diff] [blame] | 4832 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax); | 
| Argyrios Kyrtzidis | 55ecf99 | 2013-11-13 23:38:20 +0000 | [diff] [blame] | 4833 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation); | 
|  | 4834 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype); | 
|  | 4835 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros); | 
|  | 4836 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance); | 
|  | 4837 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property); | 
|  | 4838 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property); | 
|  | 4839 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly); | 
| Argyrios Kyrtzidis | 74aa0256 | 2013-12-11 01:29:48 +0000 | [diff] [blame] | 4840 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init); | 
| Argyrios Kyrtzidis | d5ba86b | 2013-12-10 18:36:53 +0000 | [diff] [blame] | 4841 | Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path); | 
| Ted Kremenek | f7639e1 | 2012-03-06 20:06:33 +0000 | [diff] [blame] | 4842 | } | 
|  | 4843 |  | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 4844 | // Add preprocessing options like -I, -D, etc. if we are using the | 
|  | 4845 | // preprocessor. | 
|  | 4846 | // | 
|  | 4847 | // FIXME: Support -fpreprocessed | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 4848 | if (types::getPreprocessedType(InputType) != types::TY_INVALID) | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 4849 | AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4850 |  | 
| Rafael Espindola | a743192 | 2011-07-21 23:40:37 +0000 | [diff] [blame] | 4851 | // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes | 
|  | 4852 | // that "The compiler can only warn and ignore the option if not recognized". | 
|  | 4853 | // When building with ccache, it will pass -D options to clang even on | 
|  | 4854 | // preprocessed inputs and configure concludes that -fPIC is not supported. | 
|  | 4855 | Args.ClaimAllArgs(options::OPT_D); | 
|  | 4856 |  | 
| Alp Toker | 7874bdc | 2013-11-15 20:40:58 +0000 | [diff] [blame] | 4857 | // Manually translate -O4 to -O3; let clang reject others. | 
| Rafael Espindola | ad70d96 | 2013-08-27 16:58:15 +0000 | [diff] [blame] | 4858 | if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { | 
|  | 4859 | if (A->getOption().matches(options::OPT_O4)) { | 
|  | 4860 | CmdArgs.push_back("-O3"); | 
|  | 4861 | D.Diag(diag::warn_O4_is_O3); | 
|  | 4862 | } else { | 
|  | 4863 | A->render(Args, CmdArgs); | 
|  | 4864 | } | 
|  | 4865 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4866 |  | 
| Sylvestre Ledru | 2fe501e | 2014-07-11 11:43:57 +0000 | [diff] [blame] | 4867 | // Warn about ignored options to clang. | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 4868 | for (const Arg *A : | 
|  | 4869 | Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) { | 
|  | 4870 | D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args); | 
| Douglas Katzman | 8b50e01 | 2015-08-05 18:03:47 +0000 | [diff] [blame] | 4871 | A->claim(); | 
| Sylvestre Ledru | 2fe501e | 2014-07-11 11:43:57 +0000 | [diff] [blame] | 4872 | } | 
|  | 4873 |  | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 4874 | claimNoWarnArgs(Args); | 
| Chad Rosier | 86b8208 | 2012-12-12 20:06:31 +0000 | [diff] [blame] | 4875 |  | 
| Richard Smith | 3be1cb2 | 2014-08-07 00:24:21 +0000 | [diff] [blame] | 4876 | Args.AddAllArgs(CmdArgs, options::OPT_R_Group); | 
| Daniel Dunbar | 945577c | 2009-10-29 02:24:45 +0000 | [diff] [blame] | 4877 | Args.AddAllArgs(CmdArgs, options::OPT_W_Group); | 
| Ted Kremenek | b22ea2a | 2012-07-07 05:53:30 +0000 | [diff] [blame] | 4878 | if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false)) | 
|  | 4879 | CmdArgs.push_back("-pedantic"); | 
| Daniel Dunbar | 945577c | 2009-10-29 02:24:45 +0000 | [diff] [blame] | 4880 | Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4881 | Args.AddLastArg(CmdArgs, options::OPT_w); | 
| Daniel Dunbar | c44b4cc | 2009-04-07 22:13:21 +0000 | [diff] [blame] | 4882 |  | 
|  | 4883 | // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} | 
| Hans Wennborg | ec99382 | 2013-07-31 16:57:56 +0000 | [diff] [blame] | 4884 | // (-ansi is equivalent to -std=c89 or -std=c++98). | 
| Daniel Dunbar | c44b4cc | 2009-04-07 22:13:21 +0000 | [diff] [blame] | 4885 | // | 
|  | 4886 | // If a std is supplied, only add -trigraphs if it follows the | 
|  | 4887 | // option. | 
| David Majnemer | 8db9176 | 2015-05-18 04:49:30 +0000 | [diff] [blame] | 4888 | bool ImplyVCPPCXXVer = false; | 
| Daniel Dunbar | c44b4cc | 2009-04-07 22:13:21 +0000 | [diff] [blame] | 4889 | if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) { | 
|  | 4890 | if (Std->getOption().matches(options::OPT_ansi)) | 
| Nuno Lopes | 275225d | 2009-10-16 14:28:06 +0000 | [diff] [blame] | 4891 | if (types::isCXX(InputType)) | 
| Daniel Dunbar | 1c7577c | 2009-11-04 06:24:38 +0000 | [diff] [blame] | 4892 | CmdArgs.push_back("-std=c++98"); | 
| Nuno Lopes | 275225d | 2009-10-16 14:28:06 +0000 | [diff] [blame] | 4893 | else | 
| Daniel Dunbar | 1c7577c | 2009-11-04 06:24:38 +0000 | [diff] [blame] | 4894 | CmdArgs.push_back("-std=c89"); | 
| Daniel Dunbar | c44b4cc | 2009-04-07 22:13:21 +0000 | [diff] [blame] | 4895 | else | 
|  | 4896 | Std->render(Args, CmdArgs); | 
|  | 4897 |  | 
| Nico Weber | 0072150 | 2014-12-23 22:32:37 +0000 | [diff] [blame] | 4898 | // If -f(no-)trigraphs appears after the language standard flag, honor it. | 
| Daniel Dunbar | 3f1a1ff | 2010-06-14 21:23:08 +0000 | [diff] [blame] | 4899 | if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi, | 
| Nico Weber | 0072150 | 2014-12-23 22:32:37 +0000 | [diff] [blame] | 4900 | options::OPT_ftrigraphs, | 
|  | 4901 | options::OPT_fno_trigraphs)) | 
| Daniel Dunbar | 3f1a1ff | 2010-06-14 21:23:08 +0000 | [diff] [blame] | 4902 | if (A != Std) | 
| Daniel Dunbar | c44b4cc | 2009-04-07 22:13:21 +0000 | [diff] [blame] | 4903 | A->render(Args, CmdArgs); | 
| Daniel Dunbar | 72a6090 | 2009-04-26 01:10:38 +0000 | [diff] [blame] | 4904 | } else { | 
|  | 4905 | // Honor -std-default. | 
| Daniel Dunbar | 1299819 | 2010-01-29 21:03:02 +0000 | [diff] [blame] | 4906 | // | 
|  | 4907 | // FIXME: Clang doesn't correctly handle -std= when the input language | 
|  | 4908 | // doesn't match. For the time being just ignore this for C++ inputs; | 
|  | 4909 | // eventually we want to do all the standard defaulting here instead of | 
|  | 4910 | // splitting it between the driver and clang -cc1. | 
|  | 4911 | if (!types::isCXX(InputType)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 4912 | Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=", | 
|  | 4913 | /*Joined=*/true); | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 4914 | else if (IsWindowsMSVC) | 
| David Majnemer | 8db9176 | 2015-05-18 04:49:30 +0000 | [diff] [blame] | 4915 | ImplyVCPPCXXVer = true; | 
| Nico Weber | 723b4f0 | 2012-08-30 02:08:31 +0000 | [diff] [blame] | 4916 |  | 
| Nico Weber | 0072150 | 2014-12-23 22:32:37 +0000 | [diff] [blame] | 4917 | Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs, | 
|  | 4918 | options::OPT_fno_trigraphs); | 
| Daniel Dunbar | 72a6090 | 2009-04-26 01:10:38 +0000 | [diff] [blame] | 4919 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 4920 |  | 
| Richard Smith | 282b449 | 2013-09-04 22:50:31 +0000 | [diff] [blame] | 4921 | // GCC's behavior for -Wwrite-strings is a bit strange: | 
|  | 4922 | //  * In C, this "warning flag" changes the types of string literals from | 
|  | 4923 | //    'char[N]' to 'const char[N]', and thus triggers an unrelated warning | 
|  | 4924 | //    for the discarded qualifier. | 
|  | 4925 | //  * In C++, this is just a normal warning flag. | 
|  | 4926 | // | 
|  | 4927 | // Implementing this warning correctly in C is hard, so we follow GCC's | 
|  | 4928 | // behavior for now. FIXME: Directly diagnose uses of a string literal as | 
|  | 4929 | // a non-const char* in C, rather than using this crude hack. | 
|  | 4930 | if (!types::isCXX(InputType)) { | 
| Argyrios Kyrtzidis | 25f2afde | 2014-02-07 08:33:28 +0000 | [diff] [blame] | 4931 | // FIXME: This should behave just like a warning flag, and thus should also | 
|  | 4932 | // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on. | 
|  | 4933 | Arg *WriteStrings = | 
|  | 4934 | Args.getLastArg(options::OPT_Wwrite_strings, | 
|  | 4935 | options::OPT_Wno_write_strings, options::OPT_w); | 
|  | 4936 | if (WriteStrings && | 
|  | 4937 | WriteStrings->getOption().matches(options::OPT_Wwrite_strings)) | 
| Richard Smith | 282b449 | 2013-09-04 22:50:31 +0000 | [diff] [blame] | 4938 | CmdArgs.push_back("-fconst-strings"); | 
| Chandler Carruth | b009b14 | 2011-04-23 06:30:43 +0000 | [diff] [blame] | 4939 | } | 
|  | 4940 |  | 
| Chandler Carruth | 61fbf62 | 2011-04-23 09:27:53 +0000 | [diff] [blame] | 4941 | // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active | 
| Chandler Carruth | 30483fb | 2011-04-23 19:48:40 +0000 | [diff] [blame] | 4942 | // during C++ compilation, which it is by default. GCC keeps this define even | 
|  | 4943 | // in the presence of '-w', match this behavior bug-for-bug. | 
|  | 4944 | if (types::isCXX(InputType) && | 
|  | 4945 | Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated, | 
|  | 4946 | true)) { | 
|  | 4947 | CmdArgs.push_back("-fdeprecated-macro"); | 
| Chandler Carruth | 61fbf62 | 2011-04-23 09:27:53 +0000 | [diff] [blame] | 4948 | } | 
|  | 4949 |  | 
| Chandler Carruth | e039148 | 2010-05-22 02:21:53 +0000 | [diff] [blame] | 4950 | // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. | 
|  | 4951 | if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { | 
|  | 4952 | if (Asm->getOption().matches(options::OPT_fasm)) | 
|  | 4953 | CmdArgs.push_back("-fgnu-keywords"); | 
|  | 4954 | else | 
|  | 4955 | CmdArgs.push_back("-fno-gnu-keywords"); | 
|  | 4956 | } | 
|  | 4957 |  | 
| Nick Lewycky | 1d617ac | 2011-10-17 23:05:52 +0000 | [diff] [blame] | 4958 | if (ShouldDisableDwarfDirectory(Args, getToolChain())) | 
|  | 4959 | CmdArgs.push_back("-fno-dwarf-directory-asm"); | 
|  | 4960 |  | 
| Daniel Dunbar | e246fbe | 2013-04-16 18:21:19 +0000 | [diff] [blame] | 4961 | if (ShouldDisableAutolink(Args, getToolChain())) | 
|  | 4962 | CmdArgs.push_back("-fno-autolink"); | 
|  | 4963 |  | 
| Chandler Carruth | 4d5e1a9 | 2012-12-17 21:40:04 +0000 | [diff] [blame] | 4964 | // Add in -fdebug-compilation-dir if necessary. | 
|  | 4965 | addDebugCompDirArg(Args, CmdArgs); | 
| Nick Lewycky | ba743b7 | 2011-10-21 02:32:14 +0000 | [diff] [blame] | 4966 |  | 
| Saleem Abdulrasool | 436256a | 2015-10-12 20:21:08 +0000 | [diff] [blame] | 4967 | for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) { | 
|  | 4968 | StringRef Map = A->getValue(); | 
|  | 4969 | if (Map.find('=') == StringRef::npos) | 
|  | 4970 | D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map; | 
|  | 4971 | else | 
|  | 4972 | CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map)); | 
|  | 4973 | A->claim(); | 
|  | 4974 | } | 
|  | 4975 |  | 
| Richard Smith | 9a56882 | 2011-11-21 19:36:32 +0000 | [diff] [blame] | 4976 | if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_, | 
|  | 4977 | options::OPT_ftemplate_depth_EQ)) { | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4978 | CmdArgs.push_back("-ftemplate-depth"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4979 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 4980 | } | 
|  | 4981 |  | 
| Richard Smith | 79c927b | 2013-11-06 19:31:51 +0000 | [diff] [blame] | 4982 | if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) { | 
|  | 4983 | CmdArgs.push_back("-foperator-arrow-depth"); | 
|  | 4984 | CmdArgs.push_back(A->getValue()); | 
|  | 4985 | } | 
|  | 4986 |  | 
| Richard Smith | 9a56882 | 2011-11-21 19:36:32 +0000 | [diff] [blame] | 4987 | if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) { | 
|  | 4988 | CmdArgs.push_back("-fconstexpr-depth"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 4989 | CmdArgs.push_back(A->getValue()); | 
| Richard Smith | 9a56882 | 2011-11-21 19:36:32 +0000 | [diff] [blame] | 4990 | } | 
|  | 4991 |  | 
| Richard Smith | a3d3bd2 | 2013-05-08 02:12:03 +0000 | [diff] [blame] | 4992 | if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) { | 
|  | 4993 | CmdArgs.push_back("-fconstexpr-steps"); | 
|  | 4994 | CmdArgs.push_back(A->getValue()); | 
|  | 4995 | } | 
|  | 4996 |  | 
| Richard Smith | b3a1452 | 2013-02-22 01:59:51 +0000 | [diff] [blame] | 4997 | if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) { | 
|  | 4998 | CmdArgs.push_back("-fbracket-depth"); | 
|  | 4999 | CmdArgs.push_back(A->getValue()); | 
|  | 5000 | } | 
|  | 5001 |  | 
| Argyrios Kyrtzidis | ef6c8da | 2010-11-18 00:20:36 +0000 | [diff] [blame] | 5002 | if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ, | 
|  | 5003 | options::OPT_Wlarge_by_value_copy_def)) { | 
| Jean-Daniel Dupas | 73d801c | 2012-05-04 08:08:37 +0000 | [diff] [blame] | 5004 | if (A->getNumValues()) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5005 | StringRef bytes = A->getValue(); | 
| Jean-Daniel Dupas | 73d801c | 2012-05-04 08:08:37 +0000 | [diff] [blame] | 5006 | CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes)); | 
|  | 5007 | } else | 
|  | 5008 | CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value | 
| Argyrios Kyrtzidis | af84ec0 | 2010-11-17 23:11:54 +0000 | [diff] [blame] | 5009 | } | 
|  | 5010 |  | 
| Michael J. Spencer | 929fccd | 2012-10-22 22:13:48 +0000 | [diff] [blame] | 5011 | if (Args.hasArg(options::OPT_relocatable_pch)) | 
| Daniel Dunbar | 8bed86c | 2009-11-20 22:21:36 +0000 | [diff] [blame] | 5012 | CmdArgs.push_back("-relocatable-pch"); | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5013 |  | 
| Daniel Dunbar | 1c7577c | 2009-11-04 06:24:38 +0000 | [diff] [blame] | 5014 | if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) { | 
|  | 5015 | CmdArgs.push_back("-fconstant-string-class"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5016 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 1c7577c | 2009-11-04 06:24:38 +0000 | [diff] [blame] | 5017 | } | 
| David Chisnall | 5778fce | 2009-08-31 16:41:57 +0000 | [diff] [blame] | 5018 |  | 
| Chris Lattner | e23003d | 2010-01-09 21:54:33 +0000 | [diff] [blame] | 5019 | if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) { | 
|  | 5020 | CmdArgs.push_back("-ftabstop"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5021 | CmdArgs.push_back(A->getValue()); | 
| Chris Lattner | e23003d | 2010-01-09 21:54:33 +0000 | [diff] [blame] | 5022 | } | 
|  | 5023 |  | 
| Chris Lattner | b35583d | 2010-04-07 20:49:23 +0000 | [diff] [blame] | 5024 | CmdArgs.push_back("-ferror-limit"); | 
|  | 5025 | if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ)) | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5026 | CmdArgs.push_back(A->getValue()); | 
| Chris Lattner | b35583d | 2010-04-07 20:49:23 +0000 | [diff] [blame] | 5027 | else | 
|  | 5028 | CmdArgs.push_back("19"); | 
| Douglas Gregor | ffed1cb | 2010-04-20 07:18:24 +0000 | [diff] [blame] | 5029 |  | 
| Chandler Carruth | a77a727 | 2010-05-06 04:55:18 +0000 | [diff] [blame] | 5030 | if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) { | 
|  | 5031 | CmdArgs.push_back("-fmacro-backtrace-limit"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5032 | CmdArgs.push_back(A->getValue()); | 
| Chandler Carruth | a77a727 | 2010-05-06 04:55:18 +0000 | [diff] [blame] | 5033 | } | 
|  | 5034 |  | 
|  | 5035 | if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) { | 
|  | 5036 | CmdArgs.push_back("-ftemplate-backtrace-limit"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5037 | CmdArgs.push_back(A->getValue()); | 
| Chandler Carruth | a77a727 | 2010-05-06 04:55:18 +0000 | [diff] [blame] | 5038 | } | 
|  | 5039 |  | 
| Richard Smith | f6f003a | 2011-12-16 19:06:07 +0000 | [diff] [blame] | 5040 | if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) { | 
|  | 5041 | CmdArgs.push_back("-fconstexpr-backtrace-limit"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5042 | CmdArgs.push_back(A->getValue()); | 
| Richard Smith | f6f003a | 2011-12-16 19:06:07 +0000 | [diff] [blame] | 5043 | } | 
|  | 5044 |  | 
| Nick Lewycky | 2465326 | 2014-12-16 21:39:02 +0000 | [diff] [blame] | 5045 | if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) { | 
|  | 5046 | CmdArgs.push_back("-fspell-checking-limit"); | 
|  | 5047 | CmdArgs.push_back(A->getValue()); | 
|  | 5048 | } | 
|  | 5049 |  | 
| Daniel Dunbar | 2c97847 | 2009-11-04 06:24:47 +0000 | [diff] [blame] | 5050 | // Pass -fmessage-length=. | 
| Daniel Dunbar | 84bb793 | 2009-11-30 08:40:54 +0000 | [diff] [blame] | 5051 | CmdArgs.push_back("-fmessage-length"); | 
| Daniel Dunbar | 2c97847 | 2009-11-04 06:24:47 +0000 | [diff] [blame] | 5052 | if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5053 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 2c97847 | 2009-11-04 06:24:47 +0000 | [diff] [blame] | 5054 | } else { | 
|  | 5055 | // If -fmessage-length=N was not specified, determine whether this is a | 
|  | 5056 | // terminal and, if so, implicitly define -fmessage-length appropriately. | 
|  | 5057 | unsigned N = llvm::sys::Process::StandardErrColumns(); | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 5058 | CmdArgs.push_back(Args.MakeArgString(Twine(N))); | 
| Daniel Dunbar | 2c97847 | 2009-11-04 06:24:47 +0000 | [diff] [blame] | 5059 | } | 
|  | 5060 |  | 
| John McCall | b4a99d3 | 2013-02-19 01:57:35 +0000 | [diff] [blame] | 5061 | // -fvisibility= and -fvisibility-ms-compat are of a piece. | 
|  | 5062 | if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ, | 
|  | 5063 | options::OPT_fvisibility_ms_compat)) { | 
|  | 5064 | if (A->getOption().matches(options::OPT_fvisibility_EQ)) { | 
|  | 5065 | CmdArgs.push_back("-fvisibility"); | 
|  | 5066 | CmdArgs.push_back(A->getValue()); | 
|  | 5067 | } else { | 
|  | 5068 | assert(A->getOption().matches(options::OPT_fvisibility_ms_compat)); | 
|  | 5069 | CmdArgs.push_back("-fvisibility"); | 
|  | 5070 | CmdArgs.push_back("hidden"); | 
|  | 5071 | CmdArgs.push_back("-ftype-visibility"); | 
|  | 5072 | CmdArgs.push_back("default"); | 
|  | 5073 | } | 
| Daniel Dunbar | e357d56 | 2009-12-03 18:42:11 +0000 | [diff] [blame] | 5074 | } | 
|  | 5075 |  | 
| Douglas Gregor | 0832963 | 2010-06-15 17:05:35 +0000 | [diff] [blame] | 5076 | Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden); | 
| Michael J. Spencer | 4c0ffa8 | 2010-10-21 03:16:25 +0000 | [diff] [blame] | 5077 |  | 
| Hans Wennborg | f60f6af | 2012-06-28 08:01:44 +0000 | [diff] [blame] | 5078 | Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ); | 
|  | 5079 |  | 
| Daniel Dunbar | e46b52a | 2010-03-20 04:52:14 +0000 | [diff] [blame] | 5080 | // -fhosted is default. | 
| Chad Rosier | 4fab82c | 2012-03-26 22:04:46 +0000 | [diff] [blame] | 5081 | if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) || | 
|  | 5082 | KernelOrKext) | 
| Daniel Dunbar | e46b52a | 2010-03-20 04:52:14 +0000 | [diff] [blame] | 5083 | CmdArgs.push_back("-ffreestanding"); | 
|  | 5084 |  | 
| Daniel Dunbar | e357d56 | 2009-12-03 18:42:11 +0000 | [diff] [blame] | 5085 | // Forward -f (flag) options which we can pass directly. | 
| Daniel Dunbar | 3a148f2 | 2009-04-07 21:51:40 +0000 | [diff] [blame] | 5086 | Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls); | 
| Daniel Dunbar | 3a148f2 | 2009-04-07 21:51:40 +0000 | [diff] [blame] | 5087 | Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions); | 
| Eric Christopher | 8605082 | 2011-10-25 07:13:06 +0000 | [diff] [blame] | 5088 | Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names); | 
| Chih-Hung Hsieh | 2c656c9 | 2015-07-28 16:27:56 +0000 | [diff] [blame] | 5089 | // Emulated TLS is enabled by default on Android, and can be enabled manually | 
|  | 5090 | // with -femulated-tls. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5091 | bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment(); | 
| Chih-Hung Hsieh | 2c656c9 | 2015-07-28 16:27:56 +0000 | [diff] [blame] | 5092 | if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls, | 
|  | 5093 | EmulatedTLSDefault)) | 
|  | 5094 | CmdArgs.push_back("-femulated-tls"); | 
| Ulrich Weigand | 3c5038a | 2015-07-30 14:08:36 +0000 | [diff] [blame] | 5095 | // AltiVec-like language extensions aren't relevant for assembling. | 
|  | 5096 | if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) { | 
| Bill Schmidt | b3b804e | 2013-07-03 15:36:02 +0000 | [diff] [blame] | 5097 | Args.AddLastArg(CmdArgs, options::OPT_faltivec); | 
| Ulrich Weigand | 3c5038a | 2015-07-30 14:08:36 +0000 | [diff] [blame] | 5098 | Args.AddLastArg(CmdArgs, options::OPT_fzvector); | 
|  | 5099 | } | 
| Richard Trieu | 9184423 | 2012-06-26 18:18:47 +0000 | [diff] [blame] | 5100 | Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree); | 
|  | 5101 | Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type); | 
| Chad Rosier | 864dfe1 | 2012-03-13 23:45:51 +0000 | [diff] [blame] | 5102 |  | 
| Samuel Antao | db5f02b | 2016-07-28 14:29:18 +0000 | [diff] [blame] | 5103 | // Forward flags for OpenMP. We don't do this if the current action is an | 
|  | 5104 | // device offloading action. | 
|  | 5105 | // | 
|  | 5106 | // TODO: Allow OpenMP offload actions when they become available. | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 5107 | if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, | 
| Samuel Antao | db5f02b | 2016-07-28 14:29:18 +0000 | [diff] [blame] | 5108 | options::OPT_fno_openmp, false) && | 
|  | 5109 | JA.isDeviceOffloading(Action::OFK_None)) { | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 5110 | switch (getOpenMPRuntime(getToolChain(), Args)) { | 
|  | 5111 | case OMPRT_OMP: | 
|  | 5112 | case OMPRT_IOMP5: | 
|  | 5113 | // Clang can generate useful OpenMP code for these two runtime libraries. | 
|  | 5114 | CmdArgs.push_back("-fopenmp"); | 
| Samuel Antao | f8b5012 | 2015-07-13 22:54:53 +0000 | [diff] [blame] | 5115 |  | 
|  | 5116 | // If no option regarding the use of TLS in OpenMP codegeneration is | 
|  | 5117 | // given, decide a default based on the target. Otherwise rely on the | 
|  | 5118 | // options and pass the right information to the frontend. | 
|  | 5119 | if (!Args.hasFlag(options::OPT_fopenmp_use_tls, | 
| Alexey Bataev | 6a43c00 | 2015-09-10 12:06:58 +0000 | [diff] [blame] | 5120 | options::OPT_fnoopenmp_use_tls, /*Default=*/true)) | 
| Samuel Antao | f8b5012 | 2015-07-13 22:54:53 +0000 | [diff] [blame] | 5121 | CmdArgs.push_back("-fnoopenmp-use-tls"); | 
| Alexey Bataev | 18c4852 | 2016-05-27 04:13:39 +0000 | [diff] [blame] | 5122 | Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ); | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 5123 | break; | 
|  | 5124 | default: | 
|  | 5125 | // By default, if Clang doesn't know how to generate useful OpenMP code | 
|  | 5126 | // for a specific runtime library, we just don't pass the '-fopenmp' flag | 
|  | 5127 | // down to the actual compilation. | 
|  | 5128 | // FIXME: It would be better to have a mode which *only* omits IR | 
|  | 5129 | // generation based on the OpenMP support so that we get consistent | 
|  | 5130 | // semantic analysis, etc. | 
|  | 5131 | break; | 
|  | 5132 | } | 
| Alexey Bataev | c6bd891 | 2016-05-26 11:10:11 +0000 | [diff] [blame] | 5133 | } | 
| Alexey Bataev | db39021 | 2015-05-20 04:24:19 +0000 | [diff] [blame] | 5134 |  | 
| Peter Collingbourne | 3270164 | 2013-11-01 18:16:25 +0000 | [diff] [blame] | 5135 | const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5136 | Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType); | 
| Richard Smith | 52be619 | 2012-11-05 22:04:41 +0000 | [diff] [blame] | 5137 |  | 
| Eric Christopher | 459d271 | 2013-02-19 06:16:53 +0000 | [diff] [blame] | 5138 | // Report an error for -faltivec on anything other than PowerPC. | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 5139 | if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) { | 
|  | 5140 | const llvm::Triple::ArchType Arch = getToolChain().getArch(); | 
|  | 5141 | if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 || | 
|  | 5142 | Arch == llvm::Triple::ppc64le)) | 
|  | 5143 | D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) | 
|  | 5144 | << "ppc/ppc64/ppc64le"; | 
|  | 5145 | } | 
| Chad Rosier | 864dfe1 | 2012-03-13 23:45:51 +0000 | [diff] [blame] | 5146 |  | 
| Ulrich Weigand | 3c5038a | 2015-07-30 14:08:36 +0000 | [diff] [blame] | 5147 | // -fzvector is incompatible with -faltivec. | 
|  | 5148 | if (Arg *A = Args.getLastArg(options::OPT_fzvector)) | 
|  | 5149 | if (Args.hasArg(options::OPT_faltivec)) | 
|  | 5150 | D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) | 
|  | 5151 | << "-faltivec"; | 
|  | 5152 |  | 
| Daniel Dunbar | 733b0f8 | 2011-03-01 18:49:30 +0000 | [diff] [blame] | 5153 | if (getToolChain().SupportsProfiling()) | 
|  | 5154 | Args.AddLastArg(CmdArgs, options::OPT_pg); | 
| Daniel Dunbar | 35621a9 | 2010-03-16 16:57:46 +0000 | [diff] [blame] | 5155 |  | 
|  | 5156 | // -flax-vector-conversions is default. | 
|  | 5157 | if (!Args.hasFlag(options::OPT_flax_vector_conversions, | 
|  | 5158 | options::OPT_fno_lax_vector_conversions)) | 
|  | 5159 | CmdArgs.push_back("-fno-lax-vector-conversions"); | 
|  | 5160 |  | 
| John Brawn | a7b4ec0 | 2015-08-10 11:11:28 +0000 | [diff] [blame] | 5161 | if (Args.getLastArg(options::OPT_fapple_kext) || | 
|  | 5162 | (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType))) | 
| Fariborz Jahanian | a4cfff8 | 2011-01-07 01:05:02 +0000 | [diff] [blame] | 5163 | CmdArgs.push_back("-fapple-kext"); | 
|  | 5164 |  | 
| Fariborz Jahanian | a4404f2 | 2009-05-22 20:17:16 +0000 | [diff] [blame] | 5165 | Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch); | 
| Chris Lattner | 6968641 | 2009-04-21 05:34:31 +0000 | [diff] [blame] | 5166 | Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info); | 
| Douglas Gregor | eec975c | 2010-08-19 20:24:43 +0000 | [diff] [blame] | 5167 | Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits); | 
| Daniel Dunbar | 3a148f2 | 2009-04-07 21:51:40 +0000 | [diff] [blame] | 5168 | Args.AddLastArg(CmdArgs, options::OPT_ftime_report); | 
|  | 5169 | Args.AddLastArg(CmdArgs, options::OPT_ftrapv); | 
| David Chisnall | dd84ef1 | 2010-09-17 18:29:54 +0000 | [diff] [blame] | 5170 |  | 
|  | 5171 | if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) { | 
|  | 5172 | CmdArgs.push_back("-ftrapv-handler"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5173 | CmdArgs.push_back(A->getValue()); | 
| David Chisnall | dd84ef1 | 2010-09-17 18:29:54 +0000 | [diff] [blame] | 5174 | } | 
|  | 5175 |  | 
| Bob Wilson | 14adb36 | 2012-02-03 06:27:22 +0000 | [diff] [blame] | 5176 | Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ); | 
| Evan Cheng | 04c9429 | 2011-04-08 21:37:45 +0000 | [diff] [blame] | 5177 |  | 
| Chandler Carruth | 6e50103 | 2011-03-27 00:04:55 +0000 | [diff] [blame] | 5178 | // -fno-strict-overflow implies -fwrapv if it isn't disabled, but | 
|  | 5179 | // -fstrict-overflow won't turn off an explicitly enabled -fwrapv. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5180 | if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) { | 
| Chandler Carruth | 6e50103 | 2011-03-27 00:04:55 +0000 | [diff] [blame] | 5181 | if (A->getOption().matches(options::OPT_fwrapv)) | 
|  | 5182 | CmdArgs.push_back("-fwrapv"); | 
|  | 5183 | } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow, | 
|  | 5184 | options::OPT_fno_strict_overflow)) { | 
|  | 5185 | if (A->getOption().matches(options::OPT_fno_strict_overflow)) | 
|  | 5186 | CmdArgs.push_back("-fwrapv"); | 
|  | 5187 | } | 
| Hal Finkel | ce0697f | 2013-11-17 16:03:29 +0000 | [diff] [blame] | 5188 |  | 
|  | 5189 | if (Arg *A = Args.getLastArg(options::OPT_freroll_loops, | 
|  | 5190 | options::OPT_fno_reroll_loops)) | 
|  | 5191 | if (A->getOption().matches(options::OPT_freroll_loops)) | 
|  | 5192 | CmdArgs.push_back("-freroll-loops"); | 
|  | 5193 |  | 
| Daniel Dunbar | 3a148f2 | 2009-04-07 21:51:40 +0000 | [diff] [blame] | 5194 | Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings); | 
| Chandler Carruth | 54c2910 | 2013-08-08 08:34:35 +0000 | [diff] [blame] | 5195 | Args.AddLastArg(CmdArgs, options::OPT_funroll_loops, | 
|  | 5196 | options::OPT_fno_unroll_loops); | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 5197 |  | 
| Daniel Dunbar | a77eaeb | 2009-09-03 04:54:28 +0000 | [diff] [blame] | 5198 | Args.AddLastArg(CmdArgs, options::OPT_pthread); | 
|  | 5199 |  | 
| Daniel Dunbar | 4930e33 | 2009-11-17 08:07:36 +0000 | [diff] [blame] | 5200 | // -stack-protector=0 is default. | 
|  | 5201 | unsigned StackProtectorLevel = 0; | 
| Evgeniy Stepanov | 368d307 | 2016-04-11 22:27:55 +0000 | [diff] [blame] | 5202 | if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector, | 
|  | 5203 | options::OPT_fstack_protector_all, | 
|  | 5204 | options::OPT_fstack_protector_strong, | 
|  | 5205 | options::OPT_fstack_protector)) { | 
| Rafael Espindola | ce5c609 | 2014-05-22 22:57:39 +0000 | [diff] [blame] | 5206 | if (A->getOption().matches(options::OPT_fstack_protector)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5207 | StackProtectorLevel = std::max<unsigned>( | 
|  | 5208 | LangOptions::SSPOn, | 
|  | 5209 | getToolChain().GetDefaultStackProtectorLevel(KernelOrKext)); | 
| Rafael Espindola | ce5c609 | 2014-05-22 22:57:39 +0000 | [diff] [blame] | 5210 | } else if (A->getOption().matches(options::OPT_fstack_protector_strong)) | 
| Josh Magee | e0fc1a8 | 2014-02-11 01:35:14 +0000 | [diff] [blame] | 5211 | StackProtectorLevel = LangOptions::SSPStrong; | 
| Daniel Dunbar | 4930e33 | 2009-11-17 08:07:36 +0000 | [diff] [blame] | 5212 | else if (A->getOption().matches(options::OPT_fstack_protector_all)) | 
| Josh Magee | e0fc1a8 | 2014-02-11 01:35:14 +0000 | [diff] [blame] | 5213 | StackProtectorLevel = LangOptions::SSPReq; | 
| Nico Weber | dd47363 | 2011-08-23 07:38:27 +0000 | [diff] [blame] | 5214 | } else { | 
|  | 5215 | StackProtectorLevel = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5216 | getToolChain().GetDefaultStackProtectorLevel(KernelOrKext); | 
| Nico Weber | dd47363 | 2011-08-23 07:38:27 +0000 | [diff] [blame] | 5217 | } | 
| Daniel Dunbar | 4930e33 | 2009-11-17 08:07:36 +0000 | [diff] [blame] | 5218 | if (StackProtectorLevel) { | 
|  | 5219 | CmdArgs.push_back("-stack-protector"); | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 5220 | CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel))); | 
| Joerg Sonnenberger | 85e2bbc | 2012-09-12 13:51:14 +0000 | [diff] [blame] | 5221 | } | 
| Chad Rosier | db3da83 | 2012-08-21 16:16:06 +0000 | [diff] [blame] | 5222 |  | 
| Joerg Sonnenberger | 85e2bbc | 2012-09-12 13:51:14 +0000 | [diff] [blame] | 5223 | // --param ssp-buffer-size= | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 5224 | for (const Arg *A : Args.filtered(options::OPT__param)) { | 
|  | 5225 | StringRef Str(A->getValue()); | 
| Joerg Sonnenberger | 85e2bbc | 2012-09-12 13:51:14 +0000 | [diff] [blame] | 5226 | if (Str.startswith("ssp-buffer-size=")) { | 
|  | 5227 | if (StackProtectorLevel) { | 
| Chad Rosier | db3da83 | 2012-08-21 16:16:06 +0000 | [diff] [blame] | 5228 | CmdArgs.push_back("-stack-protector-buffer-size"); | 
|  | 5229 | // FIXME: Verify the argument is a valid integer. | 
|  | 5230 | CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16))); | 
| Chad Rosier | db3da83 | 2012-08-21 16:16:06 +0000 | [diff] [blame] | 5231 | } | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 5232 | A->claim(); | 
| Chad Rosier | db3da83 | 2012-08-21 16:16:06 +0000 | [diff] [blame] | 5233 | } | 
| Bill Wendling | d63bbad | 2009-06-28 07:36:13 +0000 | [diff] [blame] | 5234 | } | 
|  | 5235 |  | 
| Nick Lewycky | f4d3f7a | 2011-12-06 03:33:03 +0000 | [diff] [blame] | 5236 | // Translate -mstackrealign | 
|  | 5237 | if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign, | 
| Akira Hatanaka | aecca04 | 2015-09-11 18:55:09 +0000 | [diff] [blame] | 5238 | false)) | 
| Nick Lewycky | f4d3f7a | 2011-12-06 03:33:03 +0000 | [diff] [blame] | 5239 | CmdArgs.push_back(Args.MakeArgString("-mstackrealign")); | 
| Nick Lewycky | f4d3f7a | 2011-12-06 03:33:03 +0000 | [diff] [blame] | 5240 |  | 
| Joerg Sonnenberger | db66ed0 | 2011-12-05 23:05:23 +0000 | [diff] [blame] | 5241 | if (Args.hasArg(options::OPT_mstack_alignment)) { | 
|  | 5242 | StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment); | 
|  | 5243 | CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment)); | 
| Eric Christopher | d5c45f6 | 2011-05-02 21:18:22 +0000 | [diff] [blame] | 5244 | } | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 5245 |  | 
| Hans Wennborg | 77dc236 | 2015-01-20 19:45:50 +0000 | [diff] [blame] | 5246 | if (Args.hasArg(options::OPT_mstack_probe_size)) { | 
|  | 5247 | StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size); | 
|  | 5248 |  | 
|  | 5249 | if (!Size.empty()) | 
|  | 5250 | CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size)); | 
|  | 5251 | else | 
|  | 5252 | CmdArgs.push_back("-mstack-probe-size=0"); | 
|  | 5253 | } | 
|  | 5254 |  | 
| Oliver Stannard | dc2854c | 2015-09-03 12:40:58 +0000 | [diff] [blame] | 5255 | switch (getToolChain().getArch()) { | 
|  | 5256 | case llvm::Triple::aarch64: | 
|  | 5257 | case llvm::Triple::aarch64_be: | 
|  | 5258 | case llvm::Triple::arm: | 
|  | 5259 | case llvm::Triple::armeb: | 
|  | 5260 | case llvm::Triple::thumb: | 
|  | 5261 | case llvm::Triple::thumbeb: | 
| Oliver Stannard | ed8ecc8 | 2014-08-27 16:31:57 +0000 | [diff] [blame] | 5262 | CmdArgs.push_back("-fallow-half-arguments-and-returns"); | 
| Oliver Stannard | dc2854c | 2015-09-03 12:40:58 +0000 | [diff] [blame] | 5263 | break; | 
|  | 5264 |  | 
|  | 5265 | default: | 
|  | 5266 | break; | 
|  | 5267 | } | 
| Oliver Stannard | ed8ecc8 | 2014-08-27 16:31:57 +0000 | [diff] [blame] | 5268 |  | 
| Weiming Zhao | 580dcfb | 2013-11-13 18:31:23 +0000 | [diff] [blame] | 5269 | if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it, | 
|  | 5270 | options::OPT_mno_restrict_it)) { | 
|  | 5271 | if (A->getOption().matches(options::OPT_mrestrict_it)) { | 
|  | 5272 | CmdArgs.push_back("-backend-option"); | 
|  | 5273 | CmdArgs.push_back("-arm-restrict-it"); | 
|  | 5274 | } else { | 
|  | 5275 | CmdArgs.push_back("-backend-option"); | 
|  | 5276 | CmdArgs.push_back("-arm-no-restrict-it"); | 
|  | 5277 | } | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5278 | } else if (Triple.isOSWindows() && | 
|  | 5279 | (Triple.getArch() == llvm::Triple::arm || | 
|  | 5280 | Triple.getArch() == llvm::Triple::thumb)) { | 
| Saleem Abdulrasool | 6deb816 | 2014-05-18 06:42:02 +0000 | [diff] [blame] | 5281 | // Windows on ARM expects restricted IT blocks | 
|  | 5282 | CmdArgs.push_back("-backend-option"); | 
|  | 5283 | CmdArgs.push_back("-arm-restrict-it"); | 
| Weiming Zhao | 580dcfb | 2013-11-13 18:31:23 +0000 | [diff] [blame] | 5284 | } | 
|  | 5285 |  | 
| Yaxun Liu | b5f176e | 2016-06-29 19:39:32 +0000 | [diff] [blame] | 5286 | // Forward -cl options to -cc1 | 
|  | 5287 | if (Args.getLastArg(options::OPT_cl_opt_disable)) { | 
|  | 5288 | CmdArgs.push_back("-cl-opt-disable"); | 
|  | 5289 | } | 
|  | 5290 | if (Args.getLastArg(options::OPT_cl_strict_aliasing)) { | 
|  | 5291 | CmdArgs.push_back("-cl-strict-aliasing"); | 
|  | 5292 | } | 
|  | 5293 | if (Args.getLastArg(options::OPT_cl_single_precision_constant)) { | 
|  | 5294 | CmdArgs.push_back("-cl-single-precision-constant"); | 
|  | 5295 | } | 
|  | 5296 | if (Args.getLastArg(options::OPT_cl_finite_math_only)) { | 
|  | 5297 | CmdArgs.push_back("-cl-finite-math-only"); | 
|  | 5298 | } | 
|  | 5299 | if (Args.getLastArg(options::OPT_cl_kernel_arg_info)) { | 
|  | 5300 | CmdArgs.push_back("-cl-kernel-arg-info"); | 
|  | 5301 | } | 
|  | 5302 | if (Args.getLastArg(options::OPT_cl_unsafe_math_optimizations)) { | 
|  | 5303 | CmdArgs.push_back("-cl-unsafe-math-optimizations"); | 
|  | 5304 | } | 
|  | 5305 | if (Args.getLastArg(options::OPT_cl_fast_relaxed_math)) { | 
|  | 5306 | CmdArgs.push_back("-cl-fast-relaxed-math"); | 
|  | 5307 | } | 
|  | 5308 | if (Args.getLastArg(options::OPT_cl_mad_enable)) { | 
|  | 5309 | CmdArgs.push_back("-cl-mad-enable"); | 
|  | 5310 | } | 
| Yaxun Liu | 79c99fb | 2016-07-08 20:28:29 +0000 | [diff] [blame] | 5311 | if (Args.getLastArg(options::OPT_cl_no_signed_zeros)) { | 
|  | 5312 | CmdArgs.push_back("-cl-no-signed-zeros"); | 
|  | 5313 | } | 
| Yaxun Liu | b5f176e | 2016-06-29 19:39:32 +0000 | [diff] [blame] | 5314 | if (Arg *A = Args.getLastArg(options::OPT_cl_std_EQ)) { | 
|  | 5315 | std::string CLStdStr = "-cl-std="; | 
|  | 5316 | CLStdStr += A->getValue(); | 
|  | 5317 | CmdArgs.push_back(Args.MakeArgString(CLStdStr)); | 
|  | 5318 | } | 
|  | 5319 | if (Args.getLastArg(options::OPT_cl_denorms_are_zero)) { | 
|  | 5320 | CmdArgs.push_back("-cl-denorms-are-zero"); | 
|  | 5321 | } | 
| Yaxun Liu | ffb6090 | 2016-08-09 20:10:18 +0000 | [diff] [blame] | 5322 | if (Args.getLastArg(options::OPT_cl_fp32_correctly_rounded_divide_sqrt)) { | 
|  | 5323 | CmdArgs.push_back("-cl-fp32-correctly-rounded-divide-sqrt"); | 
|  | 5324 | } | 
| Yaxun Liu | b5f176e | 2016-06-29 19:39:32 +0000 | [diff] [blame] | 5325 |  | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5326 | // Forward -f options with positive and negative forms; we translate | 
|  | 5327 | // these by hand. | 
| Diego Novillo | 5c29705 | 2013-11-13 12:22:39 +0000 | [diff] [blame] | 5328 | if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) { | 
|  | 5329 | StringRef fname = A->getValue(); | 
|  | 5330 | if (!llvm::sys::fs::exists(fname)) | 
|  | 5331 | D.Diag(diag::err_drv_no_such_file) << fname; | 
|  | 5332 | else | 
|  | 5333 | A->render(Args, CmdArgs); | 
|  | 5334 | } | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5335 |  | 
| Chad Rosier | 7dbc9cf | 2016-01-06 14:35:46 +0000 | [diff] [blame] | 5336 | // -fbuiltin is default unless -mkernel is used. | 
|  | 5337 | bool UseBuiltins = | 
|  | 5338 | Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin, | 
|  | 5339 | !Args.hasArg(options::OPT_mkernel)); | 
|  | 5340 | if (!UseBuiltins) | 
| Daniel Dunbar | 484afa2 | 2009-11-19 04:55:23 +0000 | [diff] [blame] | 5341 | CmdArgs.push_back("-fno-builtin"); | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5342 |  | 
| Chad Rosier | 7dbc9cf | 2016-01-06 14:35:46 +0000 | [diff] [blame] | 5343 | // -ffreestanding implies -fno-builtin. | 
|  | 5344 | if (Args.hasArg(options::OPT_ffreestanding)) | 
|  | 5345 | UseBuiltins = false; | 
|  | 5346 |  | 
|  | 5347 | // Process the -fno-builtin-* options. | 
|  | 5348 | for (const auto &Arg : Args) { | 
|  | 5349 | const Option &O = Arg->getOption(); | 
|  | 5350 | if (!O.matches(options::OPT_fno_builtin_)) | 
|  | 5351 | continue; | 
|  | 5352 |  | 
|  | 5353 | Arg->claim(); | 
|  | 5354 | // If -fno-builtin is specified, then there's no need to pass the option to | 
|  | 5355 | // the frontend. | 
|  | 5356 | if (!UseBuiltins) | 
|  | 5357 | continue; | 
|  | 5358 |  | 
|  | 5359 | StringRef FuncName = Arg->getValue(); | 
|  | 5360 | CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName)); | 
|  | 5361 | } | 
|  | 5362 |  | 
| Nuno Lopes | 13c88c7 | 2009-12-16 16:59:22 +0000 | [diff] [blame] | 5363 | if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, | 
|  | 5364 | options::OPT_fno_assume_sane_operator_new)) | 
|  | 5365 | CmdArgs.push_back("-fno-assume-sane-operator-new"); | 
|  | 5366 |  | 
| Daniel Dunbar | 4930e33 | 2009-11-17 08:07:36 +0000 | [diff] [blame] | 5367 | // -fblocks=0 is default. | 
|  | 5368 | if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks, | 
| David Chisnall | da20991 | 2011-02-28 17:11:43 +0000 | [diff] [blame] | 5369 | getToolChain().IsBlocksDefault()) || | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5370 | (Args.hasArg(options::OPT_fgnu_runtime) && | 
|  | 5371 | Args.hasArg(options::OPT_fobjc_nonfragile_abi) && | 
|  | 5372 | !Args.hasArg(options::OPT_fno_blocks))) { | 
| Daniel Dunbar | 4930e33 | 2009-11-17 08:07:36 +0000 | [diff] [blame] | 5373 | CmdArgs.push_back("-fblocks"); | 
| John McCall | 7959fee | 2011-09-09 20:41:01 +0000 | [diff] [blame] | 5374 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5375 | if (!Args.hasArg(options::OPT_fgnu_runtime) && | 
| John McCall | 7959fee | 2011-09-09 20:41:01 +0000 | [diff] [blame] | 5376 | !getToolChain().hasBlocksRuntime()) | 
|  | 5377 | CmdArgs.push_back("-fblocks-runtime-optional"); | 
| David Chisnall | 950a951 | 2009-11-17 19:33:30 +0000 | [diff] [blame] | 5378 | } | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5379 |  | 
| Richard Smith | 47972af | 2015-06-16 00:08:24 +0000 | [diff] [blame] | 5380 | // -fmodules enables the use of precompiled modules (off by default). | 
| Richard Smith | ffb6508 | 2014-09-30 23:10:19 +0000 | [diff] [blame] | 5381 | // Users can pass -fno-cxx-modules to turn off modules support for | 
| Richard Smith | 47972af | 2015-06-16 00:08:24 +0000 | [diff] [blame] | 5382 | // C++/Objective-C++ programs. | 
| Douglas Gregor | c60437f | 2013-01-16 01:23:41 +0000 | [diff] [blame] | 5383 | bool HaveModules = false; | 
| Douglas Gregor | 226173a | 2012-01-18 15:19:58 +0000 | [diff] [blame] | 5384 | if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5385 | bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules, | 
|  | 5386 | options::OPT_fno_cxx_modules, true); | 
| Douglas Gregor | c60437f | 2013-01-16 01:23:41 +0000 | [diff] [blame] | 5387 | if (AllowedInCXX || !types::isCXX(InputType)) { | 
| Douglas Gregor | 226173a | 2012-01-18 15:19:58 +0000 | [diff] [blame] | 5388 | CmdArgs.push_back("-fmodules"); | 
| Douglas Gregor | c60437f | 2013-01-16 01:23:41 +0000 | [diff] [blame] | 5389 | HaveModules = true; | 
|  | 5390 | } | 
|  | 5391 | } | 
|  | 5392 |  | 
| Richard Smith | 47972af | 2015-06-16 00:08:24 +0000 | [diff] [blame] | 5393 | // -fmodule-maps enables implicit reading of module map files. By default, | 
|  | 5394 | // this is enabled if we are using precompiled modules. | 
| Richard Smith | cf18b79 | 2015-06-16 00:20:23 +0000 | [diff] [blame] | 5395 | if (Args.hasFlag(options::OPT_fimplicit_module_maps, | 
|  | 5396 | options::OPT_fno_implicit_module_maps, HaveModules)) { | 
| Richard Smith | 47972af | 2015-06-16 00:08:24 +0000 | [diff] [blame] | 5397 | CmdArgs.push_back("-fimplicit-module-maps"); | 
| Daniel Jasper | 07e6c40 | 2013-08-05 20:26:17 +0000 | [diff] [blame] | 5398 | } | 
|  | 5399 |  | 
| Daniel Jasper | ac42b75 | 2013-10-21 06:34:34 +0000 | [diff] [blame] | 5400 | // -fmodules-decluse checks that modules used are declared so (off by | 
|  | 5401 | // default). | 
| Daniel Jasper | ba7f2f7 | 2013-09-24 09:14:14 +0000 | [diff] [blame] | 5402 | if (Args.hasFlag(options::OPT_fmodules_decluse, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5403 | options::OPT_fno_modules_decluse, false)) { | 
| Daniel Jasper | 6e16d54 | 2013-09-29 12:40:54 +0000 | [diff] [blame] | 5404 | CmdArgs.push_back("-fmodules-decluse"); | 
| Daniel Jasper | ba7f2f7 | 2013-09-24 09:14:14 +0000 | [diff] [blame] | 5405 | } | 
|  | 5406 |  | 
| Daniel Jasper | 962b38e | 2014-04-11 11:47:45 +0000 | [diff] [blame] | 5407 | // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that | 
|  | 5408 | // all #included headers are part of modules. | 
|  | 5409 | if (Args.hasFlag(options::OPT_fmodules_strict_decluse, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5410 | options::OPT_fno_modules_strict_decluse, false)) { | 
| Daniel Jasper | 962b38e | 2014-04-11 11:47:45 +0000 | [diff] [blame] | 5411 | CmdArgs.push_back("-fmodules-strict-decluse"); | 
|  | 5412 | } | 
|  | 5413 |  | 
| Manuel Klimek | d2e8b04 | 2015-02-20 11:44:41 +0000 | [diff] [blame] | 5414 | // -fno-implicit-modules turns off implicitly compiling modules on demand. | 
|  | 5415 | if (!Args.hasFlag(options::OPT_fimplicit_modules, | 
|  | 5416 | options::OPT_fno_implicit_modules)) { | 
|  | 5417 | CmdArgs.push_back("-fno-implicit-modules"); | 
| Richard Smith | 8d83d6d | 2016-03-21 19:06:06 +0000 | [diff] [blame] | 5418 | } else if (HaveModules) { | 
|  | 5419 | // -fmodule-cache-path specifies where our implicitly-built module files | 
|  | 5420 | // should be written. | 
|  | 5421 | SmallString<128> Path; | 
|  | 5422 | if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path)) | 
|  | 5423 | Path = A->getValue(); | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5424 | if (C.isForDiagnostics()) { | 
|  | 5425 | // When generating crash reports, we want to emit the modules along with | 
|  | 5426 | // the reproduction sources, so we ignore any provided module path. | 
| Daniel Jasper | 7450f91 | 2015-07-10 08:25:54 +0000 | [diff] [blame] | 5427 | Path = Output.getFilename(); | 
|  | 5428 | llvm::sys::path::replace_extension(Path, ".cache"); | 
|  | 5429 | llvm::sys::path::append(Path, "modules"); | 
|  | 5430 | } else if (Path.empty()) { | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5431 | // No module path was provided: use the default. | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 5432 | llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path); | 
| Daniel Jasper | 7450f91 | 2015-07-10 08:25:54 +0000 | [diff] [blame] | 5433 | llvm::sys::path::append(Path, "org.llvm.clang."); | 
|  | 5434 | appendUserToPath(Path); | 
|  | 5435 | llvm::sys::path::append(Path, "ModuleCache"); | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5436 | } | 
| Douglas Gregor | 4bedb49 | 2013-02-07 22:59:12 +0000 | [diff] [blame] | 5437 | const char Arg[] = "-fmodules-cache-path="; | 
| Daniel Jasper | 7450f91 | 2015-07-10 08:25:54 +0000 | [diff] [blame] | 5438 | Path.insert(Path.begin(), Arg, Arg + strlen(Arg)); | 
|  | 5439 | CmdArgs.push_back(Args.MakeArgString(Path)); | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5440 | } | 
|  | 5441 |  | 
| Manman Ren | 11f2a47 | 2016-08-18 17:42:15 +0000 | [diff] [blame] | 5442 | if (HaveModules) { | 
|  | 5443 | // -fprebuilt-module-path specifies where to load the prebuilt module files. | 
|  | 5444 | for (const Arg *A : Args.filtered(options::OPT_fprebuilt_module_path)) | 
|  | 5445 | CmdArgs.push_back(Args.MakeArgString( | 
|  | 5446 | std::string("-fprebuilt-module-path=") + A->getValue())); | 
|  | 5447 | } | 
|  | 5448 |  | 
| Richard Smith | 8d83d6d | 2016-03-21 19:06:06 +0000 | [diff] [blame] | 5449 | // -fmodule-name specifies the module that is currently being built (or | 
|  | 5450 | // used for header checking by -fmodule-maps). | 
|  | 5451 | Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ); | 
|  | 5452 |  | 
|  | 5453 | // -fmodule-map-file can be used to specify files containing module | 
|  | 5454 | // definitions. | 
|  | 5455 | Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file); | 
|  | 5456 |  | 
|  | 5457 | // -fmodule-file can be used to specify files containing precompiled modules. | 
|  | 5458 | if (HaveModules) | 
|  | 5459 | Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file); | 
|  | 5460 | else | 
|  | 5461 | Args.ClaimAllArgs(options::OPT_fmodule_file); | 
|  | 5462 |  | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5463 | // When building modules and generating crashdumps, we need to dump a module | 
|  | 5464 | // dependency VFS alongside the output. | 
|  | 5465 | if (HaveModules && C.isForDiagnostics()) { | 
|  | 5466 | SmallString<128> VFSDir(Output.getFilename()); | 
|  | 5467 | llvm::sys::path::replace_extension(VFSDir, ".cache"); | 
| Justin Bogner | 659ecc3 | 2014-10-20 22:47:23 +0000 | [diff] [blame] | 5468 | // Add the cache directory as a temp so the crash diagnostics pick it up. | 
|  | 5469 | C.addTempFile(Args.MakeArgString(VFSDir)); | 
|  | 5470 |  | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 5471 | llvm::sys::path::append(VFSDir, "vfs"); | 
|  | 5472 | CmdArgs.push_back("-module-dependency-dir"); | 
|  | 5473 | CmdArgs.push_back(Args.MakeArgString(VFSDir)); | 
| Douglas Gregor | 35b04d6 | 2013-02-07 19:01:24 +0000 | [diff] [blame] | 5474 | } | 
|  | 5475 |  | 
| Richard Smith | 9887d79 | 2014-10-17 01:42:53 +0000 | [diff] [blame] | 5476 | if (HaveModules) | 
|  | 5477 | Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path); | 
| Argyrios Kyrtzidis | 1594c15 | 2014-03-03 08:12:05 +0000 | [diff] [blame] | 5478 |  | 
| Douglas Gregor | 35b04d6 | 2013-02-07 19:01:24 +0000 | [diff] [blame] | 5479 | // Pass through all -fmodules-ignore-macro arguments. | 
|  | 5480 | Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro); | 
| Douglas Gregor | 527b1c9 | 2013-03-25 21:19:16 +0000 | [diff] [blame] | 5481 | Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval); | 
|  | 5482 | Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after); | 
| Douglas Gregor | 35b04d6 | 2013-02-07 19:01:24 +0000 | [diff] [blame] | 5483 |  | 
| Dmitri Gribenko | f430da4 | 2014-02-12 10:33:14 +0000 | [diff] [blame] | 5484 | Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp); | 
|  | 5485 |  | 
| Ben Langmuir | 19e6acb | 2014-08-01 22:12:21 +0000 | [diff] [blame] | 5486 | if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) { | 
|  | 5487 | if (Args.hasArg(options::OPT_fbuild_session_timestamp)) | 
|  | 5488 | D.Diag(diag::err_drv_argument_not_allowed_with) | 
|  | 5489 | << A->getAsString(Args) << "-fbuild-session-timestamp"; | 
|  | 5490 |  | 
|  | 5491 | llvm::sys::fs::file_status Status; | 
|  | 5492 | if (llvm::sys::fs::status(A->getValue(), Status)) | 
|  | 5493 | D.Diag(diag::err_drv_no_such_file) << A->getValue(); | 
| Benjamin Kramer | 320fc26 | 2015-02-14 18:19:55 +0000 | [diff] [blame] | 5494 | CmdArgs.push_back(Args.MakeArgString( | 
|  | 5495 | "-fbuild-session-timestamp=" + | 
|  | 5496 | Twine((uint64_t)Status.getLastModificationTime().toEpochTime()))); | 
| Ben Langmuir | 19e6acb | 2014-08-01 22:12:21 +0000 | [diff] [blame] | 5497 | } | 
|  | 5498 |  | 
| Dmitri Gribenko | f430da4 | 2014-02-12 10:33:14 +0000 | [diff] [blame] | 5499 | if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) { | 
| Ben Langmuir | 19e6acb | 2014-08-01 22:12:21 +0000 | [diff] [blame] | 5500 | if (!Args.getLastArg(options::OPT_fbuild_session_timestamp, | 
|  | 5501 | options::OPT_fbuild_session_file)) | 
| Dmitri Gribenko | f430da4 | 2014-02-12 10:33:14 +0000 | [diff] [blame] | 5502 | D.Diag(diag::err_drv_modules_validate_once_requires_timestamp); | 
|  | 5503 |  | 
|  | 5504 | Args.AddLastArg(CmdArgs, | 
|  | 5505 | options::OPT_fmodules_validate_once_per_build_session); | 
|  | 5506 | } | 
|  | 5507 |  | 
| Ben Langmuir | dcf7386 | 2014-03-12 00:06:17 +0000 | [diff] [blame] | 5508 | Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers); | 
| Manman Ren | 4482b2a | 2016-07-26 19:56:12 +0000 | [diff] [blame] | 5509 | Args.AddLastArg(CmdArgs, options::OPT_fmodules_disable_diagnostic_validation); | 
| Ben Langmuir | dcf7386 | 2014-03-12 00:06:17 +0000 | [diff] [blame] | 5510 |  | 
| John McCall | dfea998 | 2010-04-09 19:12:06 +0000 | [diff] [blame] | 5511 | // -faccess-control is default. | 
| John McCall | 3155f57 | 2010-04-09 19:03:51 +0000 | [diff] [blame] | 5512 | if (Args.hasFlag(options::OPT_fno_access_control, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5513 | options::OPT_faccess_control, false)) | 
| John McCall | 3155f57 | 2010-04-09 19:03:51 +0000 | [diff] [blame] | 5514 | CmdArgs.push_back("-fno-access-control"); | 
| John McCall | 59bb1d4 | 2010-03-17 01:32:13 +0000 | [diff] [blame] | 5515 |  | 
| Anders Carlsson | d470fef | 2010-11-21 00:09:52 +0000 | [diff] [blame] | 5516 | // -felide-constructors is the default. | 
|  | 5517 | if (Args.hasFlag(options::OPT_fno_elide_constructors, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5518 | options::OPT_felide_constructors, false)) | 
| Anders Carlsson | d470fef | 2010-11-21 00:09:52 +0000 | [diff] [blame] | 5519 | CmdArgs.push_back("-fno-elide-constructors"); | 
|  | 5520 |  | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 5521 | ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode(); | 
| Filipe Cabecinhas | 28f353c | 2015-01-29 23:56:43 +0000 | [diff] [blame] | 5522 |  | 
| Filipe Cabecinhas | c473255 | 2015-03-20 23:51:15 +0000 | [diff] [blame] | 5523 | if (KernelOrKext || (types::isCXX(InputType) && | 
|  | 5524 | (RTTIMode == ToolChain::RM_DisabledExplicitly || | 
|  | 5525 | RTTIMode == ToolChain::RM_DisabledImplicitly))) | 
| Filipe Cabecinhas | ec5d0e6 | 2015-02-19 01:04:49 +0000 | [diff] [blame] | 5526 | CmdArgs.push_back("-fno-rtti"); | 
| Richard Smith | 52be619 | 2012-11-05 22:04:41 +0000 | [diff] [blame] | 5527 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 5528 | // -fshort-enums=0 is default for all architectures except Hexagon. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5529 | if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums, | 
|  | 5530 | getToolChain().getArch() == llvm::Triple::hexagon)) | 
| Argyrios Kyrtzidis | 74825bc | 2010-10-08 00:25:19 +0000 | [diff] [blame] | 5531 | CmdArgs.push_back("-fshort-enums"); | 
|  | 5532 |  | 
| Daniel Dunbar | d609b7b | 2009-11-17 06:37:03 +0000 | [diff] [blame] | 5533 | // -fsigned-char is default. | 
| David Majnemer | c3658d2 | 2015-05-23 18:48:37 +0000 | [diff] [blame] | 5534 | if (Arg *A = Args.getLastArg( | 
|  | 5535 | options::OPT_fsigned_char, options::OPT_fno_signed_char, | 
|  | 5536 | options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) { | 
|  | 5537 | if (A->getOption().matches(options::OPT_funsigned_char) || | 
|  | 5538 | A->getOption().matches(options::OPT_fno_signed_char)) { | 
|  | 5539 | CmdArgs.push_back("-fno-signed-char"); | 
|  | 5540 | } | 
|  | 5541 | } else if (!isSignedCharDefault(getToolChain().getTriple())) { | 
| Daniel Dunbar | 5fe0866 | 2009-11-29 02:39:08 +0000 | [diff] [blame] | 5542 | CmdArgs.push_back("-fno-signed-char"); | 
| David Majnemer | c3658d2 | 2015-05-23 18:48:37 +0000 | [diff] [blame] | 5543 | } | 
| Eli Friedman | 327f0b5 | 2009-06-05 07:21:14 +0000 | [diff] [blame] | 5544 |  | 
| Daniel Dunbar | fe06df4 | 2010-03-20 04:15:41 +0000 | [diff] [blame] | 5545 | // -fuse-cxa-atexit is default. | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 5546 | if (!Args.hasFlag( | 
|  | 5547 | options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit, | 
|  | 5548 | !IsWindowsCygnus && !IsWindowsGNU && | 
|  | 5549 | getToolChain().getTriple().getOS() != llvm::Triple::Solaris && | 
|  | 5550 | getToolChain().getArch() != llvm::Triple::hexagon && | 
|  | 5551 | getToolChain().getArch() != llvm::Triple::xcore && | 
|  | 5552 | ((getToolChain().getTriple().getVendor() != | 
|  | 5553 | llvm::Triple::MipsTechnologies) || | 
|  | 5554 | getToolChain().getTriple().hasEnvironment())) || | 
| Chad Rosier | 4fab82c | 2012-03-26 22:04:46 +0000 | [diff] [blame] | 5555 | KernelOrKext) | 
| Daniel Dunbar | fe06df4 | 2010-03-20 04:15:41 +0000 | [diff] [blame] | 5556 | CmdArgs.push_back("-fno-use-cxa-atexit"); | 
|  | 5557 |  | 
| Daniel Dunbar | 0730e4f | 2009-11-17 07:06:20 +0000 | [diff] [blame] | 5558 | // -fms-extensions=0 is default. | 
| Daniel Dunbar | 5bdd299 | 2009-11-25 10:14:30 +0000 | [diff] [blame] | 5559 | if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions, | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 5560 | IsWindowsMSVC)) | 
| Daniel Dunbar | 0730e4f | 2009-11-17 07:06:20 +0000 | [diff] [blame] | 5561 | CmdArgs.push_back("-fms-extensions"); | 
|  | 5562 |  | 
| Reid Kleckner | 1df0fea | 2015-02-26 00:17:25 +0000 | [diff] [blame] | 5563 | // -fno-use-line-directives is default. | 
|  | 5564 | if (Args.hasFlag(options::OPT_fuse_line_directives, | 
|  | 5565 | options::OPT_fno_use_line_directives, false)) | 
|  | 5566 | CmdArgs.push_back("-fuse-line-directives"); | 
|  | 5567 |  | 
| Francois Pichet | 1b4f163 | 2011-09-17 04:32:15 +0000 | [diff] [blame] | 5568 | // -fms-compatibility=0 is default. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5569 | if (Args.hasFlag(options::OPT_fms_compatibility, | 
| Douglas Gregor | 2b4907e | 2011-10-24 15:49:38 +0000 | [diff] [blame] | 5570 | options::OPT_fno_ms_compatibility, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5571 | (IsWindowsMSVC && | 
|  | 5572 | Args.hasFlag(options::OPT_fms_extensions, | 
|  | 5573 | options::OPT_fno_ms_extensions, true)))) | 
| Francois Pichet | 1b4f163 | 2011-09-17 04:32:15 +0000 | [diff] [blame] | 5574 | CmdArgs.push_back("-fms-compatibility"); | 
|  | 5575 |  | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 5576 | // -fms-compatibility-version=18.00 is default. | 
| David Majnemer | e11d373 | 2015-06-08 00:22:46 +0000 | [diff] [blame] | 5577 | VersionTuple MSVT = visualstudio::getMSVCVersion( | 
| Adrian McCarthy | e4b26fc | 2016-05-13 23:20:11 +0000 | [diff] [blame] | 5578 | &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC); | 
| David Majnemer | e11d373 | 2015-06-08 00:22:46 +0000 | [diff] [blame] | 5579 | if (!MSVT.empty()) | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 5580 | CmdArgs.push_back( | 
|  | 5581 | Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString())); | 
| Michael J. Spencer | 4992ca4b | 2010-10-21 05:21:48 +0000 | [diff] [blame] | 5582 |  | 
| David Majnemer | 8db9176 | 2015-05-18 04:49:30 +0000 | [diff] [blame] | 5583 | bool IsMSVC2015Compatible = MSVT.getMajor() >= 19; | 
|  | 5584 | if (ImplyVCPPCXXVer) { | 
| David Majnemer | 093012b | 2016-06-27 02:32:12 +0000 | [diff] [blame] | 5585 | StringRef LanguageStandard; | 
|  | 5586 | if (const Arg *StdArg = Args.getLastArg(options::OPT__SLASH_std)) { | 
|  | 5587 | LanguageStandard = llvm::StringSwitch<StringRef>(StdArg->getValue()) | 
|  | 5588 | .Case("c++14", "-std=c++14") | 
|  | 5589 | .Case("c++latest", "-std=c++1z") | 
|  | 5590 | .Default(""); | 
|  | 5591 | if (LanguageStandard.empty()) | 
|  | 5592 | D.Diag(clang::diag::warn_drv_unused_argument) | 
|  | 5593 | << StdArg->getAsString(Args); | 
|  | 5594 | } | 
|  | 5595 |  | 
|  | 5596 | if (LanguageStandard.empty()) { | 
|  | 5597 | if (IsMSVC2015Compatible) | 
|  | 5598 | LanguageStandard = "-std=c++14"; | 
|  | 5599 | else | 
|  | 5600 | LanguageStandard = "-std=c++11"; | 
|  | 5601 | } | 
|  | 5602 |  | 
|  | 5603 | CmdArgs.push_back(LanguageStandard.data()); | 
| David Majnemer | 8db9176 | 2015-05-18 04:49:30 +0000 | [diff] [blame] | 5604 | } | 
|  | 5605 |  | 
| Eric Christopher | 5ecce12 | 2013-02-18 00:38:31 +0000 | [diff] [blame] | 5606 | // -fno-borland-extensions is default. | 
| Dawn Perchik | 68bb1b4 | 2010-09-02 23:59:25 +0000 | [diff] [blame] | 5607 | if (Args.hasFlag(options::OPT_fborland_extensions, | 
|  | 5608 | options::OPT_fno_borland_extensions, false)) | 
|  | 5609 | CmdArgs.push_back("-fborland-extensions"); | 
|  | 5610 |  | 
| Saleem Abdulrasool | d170c4b | 2015-10-04 17:51:05 +0000 | [diff] [blame] | 5611 | // -fno-declspec is default, except for PS4. | 
|  | 5612 | if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec, | 
|  | 5613 | getToolChain().getTriple().isPS4())) | 
|  | 5614 | CmdArgs.push_back("-fdeclspec"); | 
|  | 5615 | else if (Args.hasArg(options::OPT_fno_declspec)) | 
|  | 5616 | CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec. | 
|  | 5617 |  | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 5618 | // -fthreadsafe-static is default, except for MSVC compatibility versions less | 
|  | 5619 | // than 19. | 
|  | 5620 | if (!Args.hasFlag(options::OPT_fthreadsafe_statics, | 
|  | 5621 | options::OPT_fno_threadsafe_statics, | 
| David Majnemer | 8db9176 | 2015-05-18 04:49:30 +0000 | [diff] [blame] | 5622 | !IsWindowsMSVC || IsMSVC2015Compatible)) | 
| David Majnemer | c371ff0 | 2015-03-22 08:39:22 +0000 | [diff] [blame] | 5623 | CmdArgs.push_back("-fno-threadsafe-statics"); | 
|  | 5624 |  | 
| Francois Pichet | 0274487 | 2011-09-01 16:38:08 +0000 | [diff] [blame] | 5625 | // -fno-delayed-template-parsing is default, except for Windows where MSVC STL | 
|  | 5626 | // needs it. | 
| Francois Pichet | 1c229c0 | 2011-04-22 22:18:13 +0000 | [diff] [blame] | 5627 | if (Args.hasFlag(options::OPT_fdelayed_template_parsing, | 
| Saleem Abdulrasool | 377066a | 2014-03-27 22:50:18 +0000 | [diff] [blame] | 5628 | options::OPT_fno_delayed_template_parsing, IsWindowsMSVC)) | 
| Francois Pichet | 35bc5de | 2011-08-26 00:22:34 +0000 | [diff] [blame] | 5629 | CmdArgs.push_back("-fdelayed-template-parsing"); | 
| Francois Pichet | 1c229c0 | 2011-04-22 22:18:13 +0000 | [diff] [blame] | 5630 |  | 
| Chandler Carruth | e03aa55 | 2010-04-17 20:17:31 +0000 | [diff] [blame] | 5631 | // -fgnu-keywords default varies depending on language; only pass if | 
|  | 5632 | // specified. | 
|  | 5633 | if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords, | 
| Daniel Dunbar | db05959 | 2010-04-24 17:56:39 +0000 | [diff] [blame] | 5634 | options::OPT_fno_gnu_keywords)) | 
|  | 5635 | A->render(Args, CmdArgs); | 
| Chandler Carruth | e03aa55 | 2010-04-17 20:17:31 +0000 | [diff] [blame] | 5636 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5637 | if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline, | 
| Rafael Espindola | 922a624 | 2011-06-02 17:30:53 +0000 | [diff] [blame] | 5638 | false)) | 
| Rafael Espindola | fb2af64 | 2011-06-02 16:13:27 +0000 | [diff] [blame] | 5639 | CmdArgs.push_back("-fgnu89-inline"); | 
|  | 5640 |  | 
| Chad Rosier | 9c76d24 | 2012-03-15 22:31:42 +0000 | [diff] [blame] | 5641 | if (Args.hasArg(options::OPT_fno_inline)) | 
|  | 5642 | CmdArgs.push_back("-fno-inline"); | 
|  | 5643 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5644 | if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions, | 
| Hans Wennborg | 44d061a | 2016-06-22 16:56:16 +0000 | [diff] [blame] | 5645 | options::OPT_finline_hint_functions, | 
| Hans Wennborg | 7a00888 | 2016-05-24 20:40:51 +0000 | [diff] [blame] | 5646 | options::OPT_fno_inline_functions)) | 
|  | 5647 | InlineArg->render(Args, CmdArgs); | 
| Chad Rosier | 8060318 | 2012-03-06 18:49:20 +0000 | [diff] [blame] | 5648 |  | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 5649 | ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind); | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5650 |  | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 5651 | // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and | 
| Fariborz Jahanian | 15f60cb | 2014-01-20 19:32:33 +0000 | [diff] [blame] | 5652 | // legacy is the default. Except for deployment taget of 10.5, | 
|  | 5653 | // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch | 
|  | 5654 | // gets ignored silently. | 
|  | 5655 | if (objcRuntime.isNonFragile()) { | 
| David Chisnall | 3154e68 | 2011-09-30 13:32:35 +0000 | [diff] [blame] | 5656 | if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch, | 
|  | 5657 | options::OPT_fno_objc_legacy_dispatch, | 
| David Chisnall | da22535 | 2012-07-04 11:52:24 +0000 | [diff] [blame] | 5658 | objcRuntime.isLegacyDispatchDefaultForArch( | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5659 | getToolChain().getArch()))) { | 
| David Chisnall | 3154e68 | 2011-09-30 13:32:35 +0000 | [diff] [blame] | 5660 | if (getToolChain().UseObjCMixedDispatch()) | 
|  | 5661 | CmdArgs.push_back("-fobjc-dispatch-method=mixed"); | 
|  | 5662 | else | 
|  | 5663 | CmdArgs.push_back("-fobjc-dispatch-method=non-legacy"); | 
|  | 5664 | } | 
|  | 5665 | } | 
| Rafael Espindola | b44676c | 2013-11-12 04:33:56 +0000 | [diff] [blame] | 5666 |  | 
| Fariborz Jahanian | fd4ce19 | 2013-11-12 17:08:46 +0000 | [diff] [blame] | 5667 | // When ObjectiveC legacy runtime is in effect on MacOSX, | 
|  | 5668 | // turn on the option to do Array/Dictionary subscripting | 
|  | 5669 | // by default. | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 5670 | if (getToolChain().getArch() == llvm::Triple::x86 && | 
| Fariborz Jahanian | ff6c97c | 2013-11-12 20:50:26 +0000 | [diff] [blame] | 5671 | getToolChain().getTriple().isMacOSX() && | 
|  | 5672 | !getToolChain().getTriple().isMacOSXVersionLT(10, 7) && | 
|  | 5673 | objcRuntime.getKind() == ObjCRuntime::FragileMacOSX && | 
| Fariborz Jahanian | fd4ce19 | 2013-11-12 17:08:46 +0000 | [diff] [blame] | 5674 | objcRuntime.isNeXTFamily()) | 
|  | 5675 | CmdArgs.push_back("-fobjc-subscripting-legacy-runtime"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5676 |  | 
| Fariborz Jahanian | 0e3043b | 2012-11-15 19:02:45 +0000 | [diff] [blame] | 5677 | // -fencode-extended-block-signature=1 is default. | 
|  | 5678 | if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) { | 
|  | 5679 | CmdArgs.push_back("-fencode-extended-block-signature"); | 
|  | 5680 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5681 |  | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5682 | // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc. | 
|  | 5683 | // NOTE: This logic is duplicated in ToolChains.cpp. | 
|  | 5684 | bool ARC = isObjCAutoRefCount(Args); | 
|  | 5685 | if (ARC) { | 
| John McCall | 3deb1ad | 2012-08-21 02:47:43 +0000 | [diff] [blame] | 5686 | getToolChain().CheckObjCARC(); | 
| Argyrios Kyrtzidis | 3dbeb55 | 2012-02-29 03:43:52 +0000 | [diff] [blame] | 5687 |  | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5688 | CmdArgs.push_back("-fobjc-arc"); | 
|  | 5689 |  | 
| Chandler Carruth | 491db32 | 2011-11-04 07:34:47 +0000 | [diff] [blame] | 5690 | // FIXME: It seems like this entire block, and several around it should be | 
|  | 5691 | // wrapped in isObjC, but for now we just use it here as this is where it | 
|  | 5692 | // was being used previously. | 
|  | 5693 | if (types::isCXX(InputType) && types::isObjC(InputType)) { | 
|  | 5694 | if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) | 
|  | 5695 | CmdArgs.push_back("-fobjc-arc-cxxlib=libc++"); | 
|  | 5696 | else | 
|  | 5697 | CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++"); | 
|  | 5698 | } | 
|  | 5699 |  | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5700 | // Allow the user to enable full exceptions code emission. | 
|  | 5701 | // We define off for Objective-CC, on for Objective-C++. | 
|  | 5702 | if (Args.hasFlag(options::OPT_fobjc_arc_exceptions, | 
|  | 5703 | options::OPT_fno_objc_arc_exceptions, | 
|  | 5704 | /*default*/ types::isCXX(InputType))) | 
|  | 5705 | CmdArgs.push_back("-fobjc-arc-exceptions"); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5706 |  | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5707 | } | 
|  | 5708 |  | 
|  | 5709 | // -fobjc-infer-related-result-type is the default, except in the Objective-C | 
|  | 5710 | // rewriter. | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 5711 | if (rewriteKind != RK_None) | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5712 | CmdArgs.push_back("-fno-objc-infer-related-result-type"); | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 5713 |  | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5714 | // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only | 
|  | 5715 | // takes precedence. | 
|  | 5716 | const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only); | 
|  | 5717 | if (!GCArg) | 
|  | 5718 | GCArg = Args.getLastArg(options::OPT_fobjc_gc); | 
|  | 5719 | if (GCArg) { | 
|  | 5720 | if (ARC) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5721 | D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args); | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5722 | } else if (getToolChain().SupportsObjCGC()) { | 
|  | 5723 | GCArg->render(Args, CmdArgs); | 
|  | 5724 | } else { | 
|  | 5725 | // FIXME: We should move this to a hard error. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5726 | D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args); | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 5727 | } | 
|  | 5728 | } | 
|  | 5729 |  | 
| John McCall | fbe5ed7 | 2015-11-05 19:19:56 +0000 | [diff] [blame] | 5730 | // Pass down -fobjc-weak or -fno-objc-weak if present. | 
|  | 5731 | if (types::isObjC(InputType)) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5732 | auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak, | 
|  | 5733 | options::OPT_fno_objc_weak); | 
| John McCall | fbe5ed7 | 2015-11-05 19:19:56 +0000 | [diff] [blame] | 5734 | if (!WeakArg) { | 
|  | 5735 | // nothing to do | 
|  | 5736 | } else if (GCArg) { | 
|  | 5737 | if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) | 
|  | 5738 | D.Diag(diag::err_objc_weak_with_gc); | 
|  | 5739 | } else if (!objcRuntime.allowsWeak()) { | 
|  | 5740 | if (WeakArg->getOption().matches(options::OPT_fobjc_weak)) | 
|  | 5741 | D.Diag(diag::err_objc_weak_unsupported); | 
|  | 5742 | } else { | 
|  | 5743 | WeakArg->render(Args, CmdArgs); | 
|  | 5744 | } | 
|  | 5745 | } | 
|  | 5746 |  | 
| Bob Wilson | b111ec9 | 2015-03-02 19:01:14 +0000 | [diff] [blame] | 5747 | if (Args.hasFlag(options::OPT_fapplication_extension, | 
|  | 5748 | options::OPT_fno_application_extension, false)) | 
|  | 5749 | CmdArgs.push_back("-fapplication-extension"); | 
|  | 5750 |  | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 5751 | // Handle GCC-style exception args. | 
|  | 5752 | if (!C.getDriver().IsCLMode()) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5753 | addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime, | 
|  | 5754 | CmdArgs); | 
| John McCall | b5f652e | 2011-06-22 00:53:57 +0000 | [diff] [blame] | 5755 |  | 
| Saleem Abdulrasool | 094f17b | 2016-06-10 20:12:00 +0000 | [diff] [blame] | 5756 | if (Args.hasArg(options::OPT_fsjlj_exceptions) || | 
|  | 5757 | getToolChain().UseSjLjExceptions(Args)) | 
| John McCall | b5f652e | 2011-06-22 00:53:57 +0000 | [diff] [blame] | 5758 | CmdArgs.push_back("-fsjlj-exceptions"); | 
|  | 5759 |  | 
|  | 5760 | // C++ "sane" operator new. | 
| Daniel Dunbar | 2e3f2c8 | 2010-02-01 21:07:25 +0000 | [diff] [blame] | 5761 | if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, | 
|  | 5762 | options::OPT_fno_assume_sane_operator_new)) | 
|  | 5763 | CmdArgs.push_back("-fno-assume-sane-operator-new"); | 
|  | 5764 |  | 
| Reid Kleckner | 7ffc3fb | 2015-03-20 00:31:07 +0000 | [diff] [blame] | 5765 | // -fsized-deallocation is off by default, as it is an ABI-breaking change for | 
|  | 5766 | // most platforms. | 
|  | 5767 | if (Args.hasFlag(options::OPT_fsized_deallocation, | 
|  | 5768 | options::OPT_fno_sized_deallocation, false)) | 
|  | 5769 | CmdArgs.push_back("-fsized-deallocation"); | 
|  | 5770 |  | 
| Daniel Dunbar | 34d7a99 | 2010-04-27 15:34:57 +0000 | [diff] [blame] | 5771 | // -fconstant-cfstrings is default, and may be subject to argument translation | 
|  | 5772 | // on Darwin. | 
|  | 5773 | if (!Args.hasFlag(options::OPT_fconstant_cfstrings, | 
|  | 5774 | options::OPT_fno_constant_cfstrings) || | 
|  | 5775 | !Args.hasFlag(options::OPT_mconstant_cfstrings, | 
|  | 5776 | options::OPT_mno_constant_cfstrings)) | 
|  | 5777 | CmdArgs.push_back("-fno-constant-cfstrings"); | 
|  | 5778 |  | 
| John Thompson | ed4e295 | 2009-11-05 20:14:16 +0000 | [diff] [blame] | 5779 | // -fshort-wchar default varies depending on platform; only | 
|  | 5780 | // pass if specified. | 
| Richard Barton | c9b5f35 | 2014-02-24 18:43:28 +0000 | [diff] [blame] | 5781 | if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar, | 
|  | 5782 | options::OPT_fno_short_wchar)) | 
| Daniel Dunbar | 2cb4e7a | 2010-04-27 15:35:03 +0000 | [diff] [blame] | 5783 | A->render(Args, CmdArgs); | 
| John Thompson | ed4e295 | 2009-11-05 20:14:16 +0000 | [diff] [blame] | 5784 |  | 
| Hans Wennborg | 28c9631 | 2013-07-31 23:39:13 +0000 | [diff] [blame] | 5785 | // -fno-pascal-strings is default, only pass non-default. | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 5786 | if (Args.hasFlag(options::OPT_fpascal_strings, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5787 | options::OPT_fno_pascal_strings, false)) | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5788 | CmdArgs.push_back("-fpascal-strings"); | 
| NAKAMURA Takumi | 029d74b | 2011-02-17 08:50:50 +0000 | [diff] [blame] | 5789 |  | 
| Daniel Dunbar | 096ed29 | 2011-10-05 21:04:55 +0000 | [diff] [blame] | 5790 | // Honor -fpack-struct= and -fpack-struct, if given. Note that | 
|  | 5791 | // -fno-pack-struct doesn't apply to -fpack-struct=. | 
|  | 5792 | if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) { | 
| James Molloy | cebf75e | 2012-05-02 07:56:14 +0000 | [diff] [blame] | 5793 | std::string PackStructStr = "-fpack-struct="; | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5794 | PackStructStr += A->getValue(); | 
| James Molloy | cebf75e | 2012-05-02 07:56:14 +0000 | [diff] [blame] | 5795 | CmdArgs.push_back(Args.MakeArgString(PackStructStr)); | 
| Daniel Dunbar | 096ed29 | 2011-10-05 21:04:55 +0000 | [diff] [blame] | 5796 | } else if (Args.hasFlag(options::OPT_fpack_struct, | 
|  | 5797 | options::OPT_fno_pack_struct, false)) { | 
| James Molloy | cebf75e | 2012-05-02 07:56:14 +0000 | [diff] [blame] | 5798 | CmdArgs.push_back("-fpack-struct=1"); | 
| Daniel Dunbar | 096ed29 | 2011-10-05 21:04:55 +0000 | [diff] [blame] | 5799 | } | 
|  | 5800 |  | 
| Fariborz Jahanian | bcd82af | 2014-08-05 18:37:48 +0000 | [diff] [blame] | 5801 | // Handle -fmax-type-align=N and -fno-type-align | 
|  | 5802 | bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align); | 
|  | 5803 | if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) { | 
|  | 5804 | if (!SkipMaxTypeAlign) { | 
|  | 5805 | std::string MaxTypeAlignStr = "-fmax-type-align="; | 
|  | 5806 | MaxTypeAlignStr += A->getValue(); | 
|  | 5807 | CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr)); | 
|  | 5808 | } | 
|  | 5809 | } else if (getToolChain().getTriple().isOSDarwin()) { | 
|  | 5810 | if (!SkipMaxTypeAlign) { | 
|  | 5811 | std::string MaxTypeAlignStr = "-fmax-type-align=16"; | 
|  | 5812 | CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr)); | 
|  | 5813 | } | 
|  | 5814 | } | 
|  | 5815 |  | 
| John Brawn | a7b4ec0 | 2015-08-10 11:11:28 +0000 | [diff] [blame] | 5816 | // -fcommon is the default unless compiling kernel code or the target says so | 
|  | 5817 | bool NoCommonDefault = | 
|  | 5818 | KernelOrKext || isNoCommonDefault(getToolChain().getTriple()); | 
|  | 5819 | if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common, | 
|  | 5820 | !NoCommonDefault)) | 
| Daniel Dunbar | d18049a | 2009-04-07 21:16:11 +0000 | [diff] [blame] | 5821 | CmdArgs.push_back("-fno-common"); | 
|  | 5822 |  | 
| Daniel Dunbar | 2edd923 | 2009-04-15 02:37:43 +0000 | [diff] [blame] | 5823 | // -fsigned-bitfields is default, and clang doesn't yet support | 
| Daniel Dunbar | 6358d68 | 2010-10-15 22:30:42 +0000 | [diff] [blame] | 5824 | // -funsigned-bitfields. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5825 | if (!Args.hasFlag(options::OPT_fsigned_bitfields, | 
| Daniel Dunbar | 2edd923 | 2009-04-15 02:37:43 +0000 | [diff] [blame] | 5826 | options::OPT_funsigned_bitfields)) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 5827 | D.Diag(diag::warn_drv_clang_unsupported) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5828 | << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args); | 
| Daniel Dunbar | 2edd923 | 2009-04-15 02:37:43 +0000 | [diff] [blame] | 5829 |  | 
| Daniel Dunbar | 6358d68 | 2010-10-15 22:30:42 +0000 | [diff] [blame] | 5830 | // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5831 | if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope)) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 5832 | D.Diag(diag::err_drv_clang_unsupported) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5833 | << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args); | 
| Daniel Dunbar | 6358d68 | 2010-10-15 22:30:42 +0000 | [diff] [blame] | 5834 |  | 
| Sylvestre Ledru | 91f380a | 2014-07-01 17:24:27 +0000 | [diff] [blame] | 5835 | // -finput_charset=UTF-8 is default. Reject others | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5836 | if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) { | 
|  | 5837 | StringRef value = inputCharset->getValue(); | 
| Nico Weber | ebe8d62 | 2016-08-26 21:11:43 +0000 | [diff] [blame^] | 5838 | if (!value.equals_lower("utf-8")) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5839 | D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args) | 
|  | 5840 | << value; | 
| Sylvestre Ledru | 91f380a | 2014-07-01 17:24:27 +0000 | [diff] [blame] | 5841 | } | 
|  | 5842 |  | 
| Sylvestre Ledru | b8198f022 | 2014-08-11 18:09:03 +0000 | [diff] [blame] | 5843 | // -fexec_charset=UTF-8 is default. Reject others | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5844 | if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) { | 
|  | 5845 | StringRef value = execCharset->getValue(); | 
| Nico Weber | ebe8d62 | 2016-08-26 21:11:43 +0000 | [diff] [blame^] | 5846 | if (!value.equals_lower("utf-8")) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5847 | D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args) | 
|  | 5848 | << value; | 
| Sylvestre Ledru | b8198f022 | 2014-08-11 18:09:03 +0000 | [diff] [blame] | 5849 | } | 
|  | 5850 |  | 
| Jeffrey Yasskin | 460aa54 | 2010-06-08 04:56:20 +0000 | [diff] [blame] | 5851 | // -fcaret-diagnostics is default. | 
|  | 5852 | if (!Args.hasFlag(options::OPT_fcaret_diagnostics, | 
|  | 5853 | options::OPT_fno_caret_diagnostics, true)) | 
|  | 5854 | CmdArgs.push_back("-fno-caret-diagnostics"); | 
|  | 5855 |  | 
| Daniel Dunbar | 8281bde | 2009-04-19 21:09:34 +0000 | [diff] [blame] | 5856 | // -fdiagnostics-fixit-info is default, only pass non-default. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5857 | if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info, | 
| Daniel Dunbar | 8281bde | 2009-04-19 21:09:34 +0000 | [diff] [blame] | 5858 | options::OPT_fno_diagnostics_fixit_info)) | 
|  | 5859 | CmdArgs.push_back("-fno-diagnostics-fixit-info"); | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 5860 |  | 
| Daniel Dunbar | 092f0cc | 2009-04-16 06:32:38 +0000 | [diff] [blame] | 5861 | // Enable -fdiagnostics-show-option by default. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5862 | if (Args.hasFlag(options::OPT_fdiagnostics_show_option, | 
| Daniel Dunbar | 092f0cc | 2009-04-16 06:32:38 +0000 | [diff] [blame] | 5863 | options::OPT_fno_diagnostics_show_option)) | 
|  | 5864 | CmdArgs.push_back("-fdiagnostics-show-option"); | 
| Daniel Dunbar | 5ec9502 | 2009-11-04 06:24:57 +0000 | [diff] [blame] | 5865 |  | 
| Chris Lattner | bf6fac8 | 2010-05-04 21:55:25 +0000 | [diff] [blame] | 5866 | if (const Arg *A = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5867 | Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) { | 
| Chris Lattner | bf6fac8 | 2010-05-04 21:55:25 +0000 | [diff] [blame] | 5868 | CmdArgs.push_back("-fdiagnostics-show-category"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5869 | CmdArgs.push_back(A->getValue()); | 
| Chris Lattner | bf6fac8 | 2010-05-04 21:55:25 +0000 | [diff] [blame] | 5870 | } | 
| Daniel Dunbar | fe6c97b | 2010-08-24 16:47:49 +0000 | [diff] [blame] | 5871 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5872 | if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) { | 
| Douglas Gregor | 643c922 | 2011-05-21 17:07:29 +0000 | [diff] [blame] | 5873 | CmdArgs.push_back("-fdiagnostics-format"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 5874 | CmdArgs.push_back(A->getValue()); | 
| Douglas Gregor | 643c922 | 2011-05-21 17:07:29 +0000 | [diff] [blame] | 5875 | } | 
|  | 5876 |  | 
| Chandler Carruth | b6766f0 | 2011-03-27 01:50:55 +0000 | [diff] [blame] | 5877 | if (Arg *A = Args.getLastArg( | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5878 | options::OPT_fdiagnostics_show_note_include_stack, | 
|  | 5879 | options::OPT_fno_diagnostics_show_note_include_stack)) { | 
| Chandler Carruth | b6766f0 | 2011-03-27 01:50:55 +0000 | [diff] [blame] | 5880 | if (A->getOption().matches( | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5881 | options::OPT_fdiagnostics_show_note_include_stack)) | 
| Chandler Carruth | b6766f0 | 2011-03-27 01:50:55 +0000 | [diff] [blame] | 5882 | CmdArgs.push_back("-fdiagnostics-show-note-include-stack"); | 
|  | 5883 | else | 
|  | 5884 | CmdArgs.push_back("-fno-diagnostics-show-note-include-stack"); | 
|  | 5885 | } | 
|  | 5886 |  | 
| Bruno Cardoso Lopes | 681d717 | 2016-05-27 20:43:00 +0000 | [diff] [blame] | 5887 | // Color diagnostics are parsed by the driver directly from argv | 
|  | 5888 | // and later re-parsed to construct this job; claim any possible | 
|  | 5889 | // color diagnostic here to avoid warn_drv_unused_argument and | 
|  | 5890 | // diagnose bad OPT_fdiagnostics_color_EQ values. | 
|  | 5891 | for (Arg *A : Args) { | 
|  | 5892 | const Option &O = A->getOption(); | 
| Nico Weber | 7e2da79 | 2013-04-17 21:52:44 +0000 | [diff] [blame] | 5893 | if (!O.matches(options::OPT_fcolor_diagnostics) && | 
|  | 5894 | !O.matches(options::OPT_fdiagnostics_color) && | 
|  | 5895 | !O.matches(options::OPT_fno_color_diagnostics) && | 
|  | 5896 | !O.matches(options::OPT_fno_diagnostics_color) && | 
|  | 5897 | !O.matches(options::OPT_fdiagnostics_color_EQ)) | 
|  | 5898 | continue; | 
| Bruno Cardoso Lopes | 681d717 | 2016-05-27 20:43:00 +0000 | [diff] [blame] | 5899 | if (O.matches(options::OPT_fdiagnostics_color_EQ)) { | 
|  | 5900 | StringRef Value(A->getValue()); | 
|  | 5901 | if (Value != "always" && Value != "never" && Value != "auto") | 
| Nico Weber | 7e2da79 | 2013-04-17 21:52:44 +0000 | [diff] [blame] | 5902 | getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 5903 | << ("-fdiagnostics-color=" + Value).str(); | 
| Nico Weber | 7e2da79 | 2013-04-17 21:52:44 +0000 | [diff] [blame] | 5904 | } | 
| Bruno Cardoso Lopes | 681d717 | 2016-05-27 20:43:00 +0000 | [diff] [blame] | 5905 | A->claim(); | 
| Nico Weber | 7e2da79 | 2013-04-17 21:52:44 +0000 | [diff] [blame] | 5906 | } | 
| Bruno Cardoso Lopes | 681d717 | 2016-05-27 20:43:00 +0000 | [diff] [blame] | 5907 | if (D.getDiags().getDiagnosticOptions().ShowColors) | 
| Daniel Dunbar | 5ec9502 | 2009-11-04 06:24:57 +0000 | [diff] [blame] | 5908 | CmdArgs.push_back("-fcolor-diagnostics"); | 
|  | 5909 |  | 
| Nico Rieck | 7857d46 | 2013-09-11 00:38:02 +0000 | [diff] [blame] | 5910 | if (Args.hasArg(options::OPT_fansi_escape_codes)) | 
|  | 5911 | CmdArgs.push_back("-fansi-escape-codes"); | 
|  | 5912 |  | 
| Daniel Dunbar | db09702 | 2009-06-08 21:13:54 +0000 | [diff] [blame] | 5913 | if (!Args.hasFlag(options::OPT_fshow_source_location, | 
|  | 5914 | options::OPT_fno_show_source_location)) | 
|  | 5915 | CmdArgs.push_back("-fno-show-source-location"); | 
| Daniel Dunbar | 092f0cc | 2009-04-16 06:32:38 +0000 | [diff] [blame] | 5916 |  | 
| Hans Wennborg | b30f437 | 2016-08-26 15:45:36 +0000 | [diff] [blame] | 5917 | if (Args.hasArg(options::OPT_fdiagnostics_absolute_paths)) | 
|  | 5918 | CmdArgs.push_back("-fdiagnostics-absolute-paths"); | 
|  | 5919 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5920 | if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column, | 
| Douglas Gregor | 643c922 | 2011-05-21 17:07:29 +0000 | [diff] [blame] | 5921 | true)) | 
|  | 5922 | CmdArgs.push_back("-fno-show-column"); | 
|  | 5923 |  | 
| Douglas Gregor | 8ed0c0b | 2010-07-09 17:35:33 +0000 | [diff] [blame] | 5924 | if (!Args.hasFlag(options::OPT_fspell_checking, | 
|  | 5925 | options::OPT_fno_spell_checking)) | 
|  | 5926 | CmdArgs.push_back("-fno-spell-checking"); | 
| Daniel Dunbar | fe6c97b | 2010-08-24 16:47:49 +0000 | [diff] [blame] | 5927 |  | 
| Chad Rosier | c8e56e8 | 2012-12-05 21:08:21 +0000 | [diff] [blame] | 5928 | // -fno-asm-blocks is default. | 
|  | 5929 | if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks, | 
|  | 5930 | false)) | 
|  | 5931 | CmdArgs.push_back("-fasm-blocks"); | 
| Daniel Dunbar | 473f8a6 | 2010-10-18 22:49:46 +0000 | [diff] [blame] | 5932 |  | 
| Steven Wu | cb0d13f | 2015-01-16 23:05:28 +0000 | [diff] [blame] | 5933 | // -fgnu-inline-asm is default. | 
|  | 5934 | if (!Args.hasFlag(options::OPT_fgnu_inline_asm, | 
|  | 5935 | options::OPT_fno_gnu_inline_asm, true)) | 
|  | 5936 | CmdArgs.push_back("-fno-gnu-inline-asm"); | 
|  | 5937 |  | 
| Arnold Schwaighofer | 7f994ce | 2013-08-13 15:46:23 +0000 | [diff] [blame] | 5938 | // Enable vectorization per default according to the optimization level | 
|  | 5939 | // selected. For optimization levels that want vectorization we use the alias | 
|  | 5940 | // option to simplify the hasFlag logic. | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 5941 | bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5942 | OptSpecifier VectorizeAliasOption = | 
|  | 5943 | EnableVec ? options::OPT_O_Group : options::OPT_fvectorize; | 
| Chad Rosier | 679b075 | 2013-04-24 18:29:59 +0000 | [diff] [blame] | 5944 | if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption, | 
| Hal Finkel | 108c46a | 2013-08-28 05:21:45 +0000 | [diff] [blame] | 5945 | options::OPT_fno_vectorize, EnableVec)) | 
| Chad Rosier | 0d3ed6f | 2012-12-11 17:12:28 +0000 | [diff] [blame] | 5946 | CmdArgs.push_back("-vectorize-loops"); | 
| Chad Rosier | 0d3ed6f | 2012-12-11 17:12:28 +0000 | [diff] [blame] | 5947 |  | 
| Chad Rosier | 136d67d | 2014-04-28 19:30:57 +0000 | [diff] [blame] | 5948 | // -fslp-vectorize is enabled based on the optimization level selected. | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 5949 | bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5950 | OptSpecifier SLPVectAliasOption = | 
|  | 5951 | EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize; | 
| Chad Rosier | 136d67d | 2014-04-28 19:30:57 +0000 | [diff] [blame] | 5952 | if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption, | 
| Chad Rosier | 3ba81bd | 2014-05-02 18:41:57 +0000 | [diff] [blame] | 5953 | options::OPT_fno_slp_vectorize, EnableSLPVec)) | 
| Nadav Rotem | 0a2604d | 2013-04-15 04:57:18 +0000 | [diff] [blame] | 5954 | CmdArgs.push_back("-vectorize-slp"); | 
| Hal Finkel | 061f165 | 2012-12-11 19:59:32 +0000 | [diff] [blame] | 5955 |  | 
| Nadav Rotem | 6a0dd6b | 2013-04-15 05:38:41 +0000 | [diff] [blame] | 5956 | // -fno-slp-vectorize-aggressive is default. | 
|  | 5957 | if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive, | 
| Nick Lewycky | d3f3e4f | 2013-06-25 01:49:44 +0000 | [diff] [blame] | 5958 | options::OPT_fno_slp_vectorize_aggressive, false)) | 
| Nadav Rotem | 6a0dd6b | 2013-04-15 05:38:41 +0000 | [diff] [blame] | 5959 | CmdArgs.push_back("-vectorize-slp-aggressive"); | 
| Nadav Rotem | 6a0dd6b | 2013-04-15 05:38:41 +0000 | [diff] [blame] | 5960 |  | 
| Jeffrey Yasskin | 2b99c6f | 2010-06-11 05:57:47 +0000 | [diff] [blame] | 5961 | if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ)) | 
|  | 5962 | A->render(Args, CmdArgs); | 
|  | 5963 |  | 
| Filipe Cabecinhas | ab731f7 | 2016-05-12 16:51:36 +0000 | [diff] [blame] | 5964 | if (Arg *A = Args.getLastArg( | 
|  | 5965 | options::OPT_fsanitize_undefined_strip_path_components_EQ)) | 
|  | 5966 | A->render(Args, CmdArgs); | 
|  | 5967 |  | 
| Daniel Dunbar | f5e9b1f | 2009-04-19 21:20:32 +0000 | [diff] [blame] | 5968 | // -fdollars-in-identifiers default varies depending on platform and | 
|  | 5969 | // language; only pass if specified. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5970 | if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers, | 
| Daniel Dunbar | f5e9b1f | 2009-04-19 21:20:32 +0000 | [diff] [blame] | 5971 | options::OPT_fno_dollars_in_identifiers)) { | 
|  | 5972 | if (A->getOption().matches(options::OPT_fdollars_in_identifiers)) | 
| Daniel Dunbar | 15cef0e | 2009-12-16 20:10:18 +0000 | [diff] [blame] | 5973 | CmdArgs.push_back("-fdollars-in-identifiers"); | 
| Daniel Dunbar | f5e9b1f | 2009-04-19 21:20:32 +0000 | [diff] [blame] | 5974 | else | 
| Daniel Dunbar | 15cef0e | 2009-12-16 20:10:18 +0000 | [diff] [blame] | 5975 | CmdArgs.push_back("-fno-dollars-in-identifiers"); | 
| Daniel Dunbar | f5e9b1f | 2009-04-19 21:20:32 +0000 | [diff] [blame] | 5976 | } | 
|  | 5977 |  | 
| Daniel Dunbar | adeeb05 | 2009-05-22 19:02:20 +0000 | [diff] [blame] | 5978 | // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for | 
|  | 5979 | // practical purposes. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 5980 | if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time, | 
| Daniel Dunbar | adeeb05 | 2009-05-22 19:02:20 +0000 | [diff] [blame] | 5981 | options::OPT_fno_unit_at_a_time)) { | 
|  | 5982 | if (A->getOption().matches(options::OPT_fno_unit_at_a_time)) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 5983 | D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args); | 
| Daniel Dunbar | adeeb05 | 2009-05-22 19:02:20 +0000 | [diff] [blame] | 5984 | } | 
| Eli Friedman | bb0d9a5 | 2009-07-14 21:58:17 +0000 | [diff] [blame] | 5985 |  | 
| Eli Friedman | 055c970 | 2011-11-02 01:53:16 +0000 | [diff] [blame] | 5986 | if (Args.hasFlag(options::OPT_fapple_pragma_pack, | 
|  | 5987 | options::OPT_fno_apple_pragma_pack, false)) | 
|  | 5988 | CmdArgs.push_back("-fapple-pragma-pack"); | 
|  | 5989 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5990 | // le32-specific flags: | 
| Eli Bendersky | c95cfe8 | 2013-07-24 18:20:14 +0000 | [diff] [blame] | 5991 | //  -fno-math-builtin: clang should not convert math builtins to intrinsics | 
|  | 5992 | //                     by default. | 
| Chad Rosier | f662fb3 | 2016-01-26 16:16:53 +0000 | [diff] [blame] | 5993 | if (getToolChain().getArch() == llvm::Triple::le32) { | 
| Eli Bendersky | c95cfe8 | 2013-07-24 18:20:14 +0000 | [diff] [blame] | 5994 | CmdArgs.push_back("-fno-math-builtin"); | 
| Chad Rosier | f662fb3 | 2016-01-26 16:16:53 +0000 | [diff] [blame] | 5995 | } | 
| Eli Bendersky | c95cfe8 | 2013-07-24 18:20:14 +0000 | [diff] [blame] | 5996 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 5997 | // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM. | 
|  | 5998 | // | 
| Chad Rosier | 38fd54e | 2016-01-26 15:46:29 +0000 | [diff] [blame] | 5999 | // FIXME: Now that PR4941 has been fixed this can be enabled. | 
| Daniel Dunbar | 4fa0811 | 2009-09-10 04:57:27 +0000 | [diff] [blame] | 6000 | #if 0 | 
| Bob Wilson | 6524dd3 | 2011-10-14 05:03:44 +0000 | [diff] [blame] | 6001 | if (getToolChain().getTriple().isOSDarwin() && | 
| Eli Bendersky | d4a6aec | 2013-07-24 22:20:49 +0000 | [diff] [blame] | 6002 | (getToolChain().getArch() == llvm::Triple::arm || | 
|  | 6003 | getToolChain().getArch() == llvm::Triple::thumb)) { | 
| Daniel Dunbar | 2ffe029 | 2009-09-10 03:37:02 +0000 | [diff] [blame] | 6004 | if (!Args.hasArg(options::OPT_fbuiltin_strcat)) | 
|  | 6005 | CmdArgs.push_back("-fno-builtin-strcat"); | 
|  | 6006 | if (!Args.hasArg(options::OPT_fbuiltin_strcpy)) | 
|  | 6007 | CmdArgs.push_back("-fno-builtin-strcpy"); | 
|  | 6008 | } | 
| Daniel Dunbar | 4fa0811 | 2009-09-10 04:57:27 +0000 | [diff] [blame] | 6009 | #endif | 
| Daniel Dunbar | 2ffe029 | 2009-09-10 03:37:02 +0000 | [diff] [blame] | 6010 |  | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 6011 | // Enable rewrite includes if the user's asked for it or if we're generating | 
|  | 6012 | // diagnostics. | 
|  | 6013 | // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be | 
|  | 6014 | // nice to enable this when doing a crashdump for modules as well. | 
| Justin Bogner | 332a5e5 | 2014-06-20 22:16:00 +0000 | [diff] [blame] | 6015 | if (Args.hasFlag(options::OPT_frewrite_includes, | 
|  | 6016 | options::OPT_fno_rewrite_includes, false) || | 
| Justin Bogner | a88f012 | 2014-06-20 22:59:50 +0000 | [diff] [blame] | 6017 | (C.isForDiagnostics() && !HaveModules)) | 
| Justin Bogner | 332a5e5 | 2014-06-20 22:16:00 +0000 | [diff] [blame] | 6018 | CmdArgs.push_back("-frewrite-includes"); | 
|  | 6019 |  | 
| Daniel Dunbar | 8c3d735 | 2011-03-18 21:23:40 +0000 | [diff] [blame] | 6020 | // Only allow -traditional or -traditional-cpp outside in preprocessing modes. | 
| Mike Stump | 11289f4 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 6021 | if (Arg *A = Args.getLastArg(options::OPT_traditional, | 
| Daniel Dunbar | 8c3d735 | 2011-03-18 21:23:40 +0000 | [diff] [blame] | 6022 | options::OPT_traditional_cpp)) { | 
|  | 6023 | if (isa<PreprocessJobAction>(JA)) | 
|  | 6024 | CmdArgs.push_back("-traditional-cpp"); | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 6025 | else | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 6026 | D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); | 
| Daniel Dunbar | 8c3d735 | 2011-03-18 21:23:40 +0000 | [diff] [blame] | 6027 | } | 
| Eli Friedman | bb0d9a5 | 2009-07-14 21:58:17 +0000 | [diff] [blame] | 6028 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 6029 | Args.AddLastArg(CmdArgs, options::OPT_dM); | 
| Chris Lattner | cac63f3 | 2009-04-12 01:56:53 +0000 | [diff] [blame] | 6030 | Args.AddLastArg(CmdArgs, options::OPT_dD); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6031 |  | 
| Ted Kremenek | e73d9ed | 2011-11-11 00:07:43 +0000 | [diff] [blame] | 6032 | // Handle serialized diagnostics. | 
|  | 6033 | if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) { | 
|  | 6034 | CmdArgs.push_back("-serialize-diagnostic-file"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 6035 | CmdArgs.push_back(Args.MakeArgString(A->getValue())); | 
| Ted Kremenek | e73d9ed | 2011-11-11 00:07:43 +0000 | [diff] [blame] | 6036 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 6037 |  | 
| Ted Kremenek | b47e6bc | 2012-09-13 06:41:18 +0000 | [diff] [blame] | 6038 | if (Args.hasArg(options::OPT_fretain_comments_from_system_headers)) | 
|  | 6039 | CmdArgs.push_back("-fretain-comments-from-system-headers"); | 
|  | 6040 |  | 
| Dmitri Gribenko | acf2e78 | 2013-02-22 14:21:27 +0000 | [diff] [blame] | 6041 | // Forward -fcomment-block-commands to -cc1. | 
|  | 6042 | Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands); | 
| Dmitri Gribenko | a7d16ce | 2013-04-10 15:35:17 +0000 | [diff] [blame] | 6043 | // Forward -fparse-all-comments to -cc1. | 
|  | 6044 | Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments); | 
| Dmitri Gribenko | acf2e78 | 2013-02-22 14:21:27 +0000 | [diff] [blame] | 6045 |  | 
| John Brawn | ad31ace | 2015-09-23 13:55:40 +0000 | [diff] [blame] | 6046 | // Turn -fplugin=name.so into -load name.so | 
|  | 6047 | for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) { | 
|  | 6048 | CmdArgs.push_back("-load"); | 
|  | 6049 | CmdArgs.push_back(A->getValue()); | 
|  | 6050 | A->claim(); | 
|  | 6051 | } | 
|  | 6052 |  | 
| Daniel Dunbar | 76fa840 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 6053 | // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option | 
|  | 6054 | // parser. | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 6055 | Args.AddAllArgValues(CmdArgs, options::OPT_Xclang); | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 6056 | for (const Arg *A : Args.filtered(options::OPT_mllvm)) { | 
|  | 6057 | A->claim(); | 
| Daniel Dunbar | 88534f4 | 2010-04-17 06:10:00 +0000 | [diff] [blame] | 6058 |  | 
| Daniel Dunbar | 76fa840 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 6059 | // We translate this by hand to the -cc1 argument, since nightly test uses | 
|  | 6060 | // it and developers have been trained to spell it with -mllvm. | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 6061 | if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") { | 
| Daniel Dunbar | 76fa840 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 6062 | CmdArgs.push_back("-disable-llvm-optzns"); | 
| Bob Wilson | 23a55f1 | 2014-12-21 07:00:00 +0000 | [diff] [blame] | 6063 | } else | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 6064 | A->render(Args, CmdArgs); | 
| Daniel Dunbar | 76fa840 | 2010-04-15 06:09:03 +0000 | [diff] [blame] | 6065 | } | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 6066 |  | 
| Bob Wilson | 23a55f1 | 2014-12-21 07:00:00 +0000 | [diff] [blame] | 6067 | // With -save-temps, we want to save the unoptimized bitcode output from the | 
| Steven Wu | 546a196 | 2015-07-17 20:09:56 +0000 | [diff] [blame] | 6068 | // CompileJobAction, use -disable-llvm-passes to get pristine IR generated | 
|  | 6069 | // by the frontend. | 
| Steven Wu | 27fb522 | 2016-05-11 16:26:03 +0000 | [diff] [blame] | 6070 | // When -fembed-bitcode is enabled, optimized bitcode is emitted because it | 
|  | 6071 | // has slightly different breakdown between stages. | 
|  | 6072 | // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of | 
|  | 6073 | // pristine IR generated by the frontend. Ideally, a new compile action should | 
|  | 6074 | // be added so both IR can be captured. | 
|  | 6075 | if (C.getDriver().isSaveTempsEnabled() && | 
|  | 6076 | !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA)) | 
| Steven Wu | 546a196 | 2015-07-17 20:09:56 +0000 | [diff] [blame] | 6077 | CmdArgs.push_back("-disable-llvm-passes"); | 
| Bob Wilson | 23a55f1 | 2014-12-21 07:00:00 +0000 | [diff] [blame] | 6078 |  | 
| Daniel Dunbar | d67a322 | 2009-03-30 06:36:42 +0000 | [diff] [blame] | 6079 | if (Output.getType() == types::TY_Dependencies) { | 
|  | 6080 | // Handled with other dependency code. | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6081 | } else if (Output.isFilename()) { | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6082 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6083 | CmdArgs.push_back(Output.getFilename()); | 
|  | 6084 | } else { | 
|  | 6085 | assert(Output.isNothing() && "Invalid output."); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6086 | } | 
|  | 6087 |  | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 6088 | addDashXForInput(Args, Input, CmdArgs); | 
| Ben Langmuir | 2cb4a78 | 2014-02-05 22:21:15 +0000 | [diff] [blame] | 6089 |  | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 6090 | if (Input.isFilename()) | 
|  | 6091 | CmdArgs.push_back(Input.getFilename()); | 
|  | 6092 | else | 
|  | 6093 | Input.getInputArg().renderAsInput(Args, CmdArgs); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 6094 |  | 
| Chris Lattner | e9d7d78 | 2009-11-03 19:50:27 +0000 | [diff] [blame] | 6095 | Args.AddAllArgs(CmdArgs, options::OPT_undef); | 
|  | 6096 |  | 
| Daniel Dunbar | b31b76f | 2010-07-18 21:16:15 +0000 | [diff] [blame] | 6097 | const char *Exec = getToolChain().getDriver().getClangProgramPath(); | 
| Daniel Dunbar | 24c7f5e | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 6098 |  | 
|  | 6099 | // Optionally embed the -cc1 level arguments into the debug info, for build | 
|  | 6100 | // analysis. | 
|  | 6101 | if (getToolChain().UseDwarfDebugFlags()) { | 
| Daniel Dunbar | 7f3d950 | 2010-06-04 18:47:06 +0000 | [diff] [blame] | 6102 | ArgStringList OriginalArgs; | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6103 | for (const auto &Arg : Args) | 
|  | 6104 | Arg->render(Args, OriginalArgs); | 
| Daniel Dunbar | fe6c97b | 2010-08-24 16:47:49 +0000 | [diff] [blame] | 6105 |  | 
| Dylan Noblesmith | 2c1dd27 | 2012-02-05 02:13:05 +0000 | [diff] [blame] | 6106 | SmallString<256> Flags; | 
| Daniel Dunbar | 24c7f5e | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 6107 | Flags += Exec; | 
| Douglas Katzman | 6bbffc4 | 2015-06-25 18:51:37 +0000 | [diff] [blame] | 6108 | for (const char *OriginalArg : OriginalArgs) { | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 6109 | SmallString<128> EscapedArg; | 
| Douglas Katzman | 6bbffc4 | 2015-06-25 18:51:37 +0000 | [diff] [blame] | 6110 | EscapeSpacesAndBackslashes(OriginalArg, EscapedArg); | 
| Daniel Dunbar | 24c7f5e | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 6111 | Flags += " "; | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 6112 | Flags += EscapedArg; | 
| Daniel Dunbar | 24c7f5e | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 6113 | } | 
|  | 6114 | CmdArgs.push_back("-dwarf-debug-flags"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 6115 | CmdArgs.push_back(Args.MakeArgString(Flags)); | 
| Daniel Dunbar | 24c7f5e | 2009-12-18 02:43:17 +0000 | [diff] [blame] | 6116 | } | 
|  | 6117 |  | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 6118 | // Add the split debug info name to the command lines here so we | 
|  | 6119 | // can propagate it to the backend. | 
| David Blaikie | ce3e7a6 | 2015-07-30 21:42:22 +0000 | [diff] [blame] | 6120 | bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() && | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6121 | (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) || | 
|  | 6122 | isa<BackendJobAction>(JA)); | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 6123 | const char *SplitDwarfOut; | 
|  | 6124 | if (SplitDwarf) { | 
|  | 6125 | CmdArgs.push_back("-split-dwarf-file"); | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 6126 | SplitDwarfOut = SplitDebugName(Args, Input); | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 6127 | CmdArgs.push_back(SplitDwarfOut); | 
|  | 6128 | } | 
|  | 6129 |  | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 6130 | // Host-side cuda compilation receives device-side outputs as Inputs[1...]. | 
|  | 6131 | // Include them with -fcuda-include-gpubinary. | 
|  | 6132 | if (IsCuda && Inputs.size() > 1) | 
| Artem Belevich | 5bde4e0 | 2015-07-20 20:02:54 +0000 | [diff] [blame] | 6133 | for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) { | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 6134 | CmdArgs.push_back("-fcuda-include-gpubinary"); | 
| Artem Belevich | 5bde4e0 | 2015-07-20 20:02:54 +0000 | [diff] [blame] | 6135 | CmdArgs.push_back(I->getFilename()); | 
| Artem Belevich | 0ff05cd | 2015-07-13 23:27:56 +0000 | [diff] [blame] | 6136 | } | 
|  | 6137 |  | 
| Peter Collingbourne | 3afb266 | 2016-04-28 17:09:37 +0000 | [diff] [blame] | 6138 | bool WholeProgramVTables = | 
|  | 6139 | Args.hasFlag(options::OPT_fwhole_program_vtables, | 
|  | 6140 | options::OPT_fno_whole_program_vtables, false); | 
|  | 6141 | if (WholeProgramVTables) { | 
|  | 6142 | if (!D.isUsingLTO()) | 
|  | 6143 | D.Diag(diag::err_drv_argument_only_allowed_with) | 
|  | 6144 | << "-fwhole-program-vtables" | 
|  | 6145 | << "-flto"; | 
|  | 6146 | CmdArgs.push_back("-fwhole-program-vtables"); | 
|  | 6147 | } | 
|  | 6148 |  | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 6149 | // Finally add the compile command to the compilation. | 
| Hans Wennborg | 859422a | 2014-01-13 22:24:42 +0000 | [diff] [blame] | 6150 | if (Args.hasArg(options::OPT__SLASH_fallback) && | 
| Hans Wennborg | 26a4430 | 2014-04-25 16:44:17 +0000 | [diff] [blame] | 6151 | Output.getType() == types::TY_Object && | 
|  | 6152 | (InputType == types::TY_C || InputType == types::TY_CXX)) { | 
| David Blaikie | c11bf80 | 2014-09-04 16:04:28 +0000 | [diff] [blame] | 6153 | auto CLCommand = | 
|  | 6154 | getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 6155 | C.addCommand(llvm::make_unique<FallbackCommand>( | 
|  | 6156 | JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand))); | 
| Nico Weber | 2ca4be9 | 2016-03-01 23:16:44 +0000 | [diff] [blame] | 6157 | } else if (Args.hasArg(options::OPT__SLASH_fallback) && | 
|  | 6158 | isa<PrecompileJobAction>(JA)) { | 
|  | 6159 | // In /fallback builds, run the main compilation even if the pch generation | 
|  | 6160 | // fails, so that the main compilation's fallback to cl.exe runs. | 
|  | 6161 | C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec, | 
|  | 6162 | CmdArgs, Inputs)); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 6163 | } else { | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 6164 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 6165 | } | 
|  | 6166 |  | 
| Eric Christopher | f154583 | 2013-02-22 23:50:16 +0000 | [diff] [blame] | 6167 | // Handle the debug info splitting at object creation time if we're | 
|  | 6168 | // creating an object. | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 6169 | // TODO: Currently only works on linux with newer objcopy. | 
| Eric Christopher | 0945a64 | 2016-03-24 00:34:02 +0000 | [diff] [blame] | 6170 | if (SplitDwarf && Output.getType() == types::TY_Object) | 
| Eric Christopher | d380400 | 2013-02-22 20:12:52 +0000 | [diff] [blame] | 6171 | SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut); | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 6172 |  | 
| Roman Divacky | 178e0160 | 2011-02-10 16:52:03 +0000 | [diff] [blame] | 6173 | if (Arg *A = Args.getLastArg(options::OPT_pg)) | 
|  | 6174 | if (Args.hasArg(options::OPT_fomit_frame_pointer)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6175 | D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer" | 
|  | 6176 | << A->getAsString(Args); | 
| Michael J. Spencer | 4c0ffa8 | 2010-10-21 03:16:25 +0000 | [diff] [blame] | 6177 |  | 
| Daniel Dunbar | c2a7189 | 2009-04-03 20:51:31 +0000 | [diff] [blame] | 6178 | // Claim some arguments which clang supports automatically. | 
|  | 6179 |  | 
| Daniel Dunbar | 3e0cac6 | 2010-04-15 06:18:42 +0000 | [diff] [blame] | 6180 | // -fpch-preprocess is used with gcc to add a special marker in the output to | 
|  | 6181 | // include the PCH file. Clang's PTH solution is completely transparent, so we | 
|  | 6182 | // do not need to deal with it at all. | 
| Daniel Dunbar | c2a7189 | 2009-04-03 20:51:31 +0000 | [diff] [blame] | 6183 | Args.ClaimAllArgs(options::OPT_fpch_preprocess); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 6184 |  | 
| Daniel Dunbar | 1773177 | 2009-03-23 19:03:36 +0000 | [diff] [blame] | 6185 | // Claim some arguments which clang doesn't support, but we don't | 
|  | 6186 | // care to warn the user about. | 
| Daniel Dunbar | 44b36ee | 2009-11-25 11:53:23 +0000 | [diff] [blame] | 6187 | Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group); | 
|  | 6188 | Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group); | 
| Rafael Espindola | 22f60303 | 2011-02-28 23:29:45 +0000 | [diff] [blame] | 6189 |  | 
| Rafael Espindola | b0092d7 | 2013-09-04 19:37:35 +0000 | [diff] [blame] | 6190 | // Disable warnings for clang -E -emit-llvm foo.c | 
| Rafael Espindola | d95a812 | 2011-03-01 05:25:27 +0000 | [diff] [blame] | 6191 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 6192 | } | 
|  | 6193 |  | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6194 | /// Add options related to the Objective-C runtime/ABI. | 
|  | 6195 | /// | 
|  | 6196 | /// Returns true if the runtime is non-fragile. | 
|  | 6197 | ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args, | 
|  | 6198 | ArgStringList &cmdArgs, | 
|  | 6199 | RewriteKind rewriteKind) const { | 
|  | 6200 | // Look for the controlling runtime option. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6201 | Arg *runtimeArg = | 
|  | 6202 | args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime, | 
|  | 6203 | options::OPT_fobjc_runtime_EQ); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6204 |  | 
|  | 6205 | // Just forward -fobjc-runtime= to the frontend.  This supercedes | 
|  | 6206 | // options about fragility. | 
|  | 6207 | if (runtimeArg && | 
|  | 6208 | runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) { | 
|  | 6209 | ObjCRuntime runtime; | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 6210 | StringRef value = runtimeArg->getValue(); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6211 | if (runtime.tryParse(value)) { | 
|  | 6212 | getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6213 | << value; | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6214 | } | 
|  | 6215 |  | 
|  | 6216 | runtimeArg->render(args, cmdArgs); | 
|  | 6217 | return runtime; | 
|  | 6218 | } | 
|  | 6219 |  | 
|  | 6220 | // Otherwise, we'll need the ABI "version".  Version numbers are | 
|  | 6221 | // slightly confusing for historical reasons: | 
|  | 6222 | //   1 - Traditional "fragile" ABI | 
|  | 6223 | //   2 - Non-fragile ABI, version 1 | 
|  | 6224 | //   3 - Non-fragile ABI, version 2 | 
|  | 6225 | unsigned objcABIVersion = 1; | 
|  | 6226 | // If -fobjc-abi-version= is present, use that to set the version. | 
|  | 6227 | if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 6228 | StringRef value = abiArg->getValue(); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6229 | if (value == "1") | 
|  | 6230 | objcABIVersion = 1; | 
|  | 6231 | else if (value == "2") | 
|  | 6232 | objcABIVersion = 2; | 
|  | 6233 | else if (value == "3") | 
|  | 6234 | objcABIVersion = 3; | 
|  | 6235 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6236 | getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value; | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6237 | } else { | 
|  | 6238 | // Otherwise, determine if we are using the non-fragile ABI. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6239 | bool nonFragileABIIsDefault = | 
|  | 6240 | (rewriteKind == RK_NonFragile || | 
|  | 6241 | (rewriteKind == RK_None && | 
|  | 6242 | getToolChain().IsObjCNonFragileABIDefault())); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6243 | if (args.hasFlag(options::OPT_fobjc_nonfragile_abi, | 
|  | 6244 | options::OPT_fno_objc_nonfragile_abi, | 
|  | 6245 | nonFragileABIIsDefault)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6246 | // Determine the non-fragile ABI version to use. | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6247 | #ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO | 
|  | 6248 | unsigned nonFragileABIVersion = 1; | 
|  | 6249 | #else | 
|  | 6250 | unsigned nonFragileABIVersion = 2; | 
|  | 6251 | #endif | 
|  | 6252 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6253 | if (Arg *abiArg = | 
|  | 6254 | args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 6255 | StringRef value = abiArg->getValue(); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6256 | if (value == "1") | 
|  | 6257 | nonFragileABIVersion = 1; | 
|  | 6258 | else if (value == "2") | 
|  | 6259 | nonFragileABIVersion = 2; | 
|  | 6260 | else | 
|  | 6261 | getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6262 | << value; | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6263 | } | 
|  | 6264 |  | 
|  | 6265 | objcABIVersion = 1 + nonFragileABIVersion; | 
|  | 6266 | } else { | 
|  | 6267 | objcABIVersion = 1; | 
|  | 6268 | } | 
|  | 6269 | } | 
|  | 6270 |  | 
|  | 6271 | // We don't actually care about the ABI version other than whether | 
|  | 6272 | // it's non-fragile. | 
|  | 6273 | bool isNonFragile = objcABIVersion != 1; | 
|  | 6274 |  | 
|  | 6275 | // If we have no runtime argument, ask the toolchain for its default runtime. | 
|  | 6276 | // However, the rewriter only really supports the Mac runtime, so assume that. | 
|  | 6277 | ObjCRuntime runtime; | 
|  | 6278 | if (!runtimeArg) { | 
|  | 6279 | switch (rewriteKind) { | 
|  | 6280 | case RK_None: | 
|  | 6281 | runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); | 
|  | 6282 | break; | 
|  | 6283 | case RK_Fragile: | 
|  | 6284 | runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple()); | 
|  | 6285 | break; | 
|  | 6286 | case RK_NonFragile: | 
|  | 6287 | runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); | 
|  | 6288 | break; | 
|  | 6289 | } | 
|  | 6290 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6291 | // -fnext-runtime | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6292 | } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) { | 
|  | 6293 | // On Darwin, make this use the default behavior for the toolchain. | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 6294 | if (getToolChain().getTriple().isOSDarwin()) { | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6295 | runtime = getToolChain().getDefaultObjCRuntime(isNonFragile); | 
|  | 6296 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6297 | // Otherwise, build for a generic macosx port. | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6298 | } else { | 
|  | 6299 | runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple()); | 
|  | 6300 | } | 
|  | 6301 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6302 | // -fgnu-runtime | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6303 | } else { | 
|  | 6304 | assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime)); | 
| Eric Christopher | bce2788 | 2015-12-28 21:57:05 +0000 | [diff] [blame] | 6305 | // Legacy behaviour is to target the gnustep runtime if we are in | 
| David Chisnall | 314896c | 2012-07-04 10:37:03 +0000 | [diff] [blame] | 6306 | // non-fragile mode or the GCC runtime in fragile mode. | 
|  | 6307 | if (isNonFragile) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6308 | runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6)); | 
| David Chisnall | 314896c | 2012-07-04 10:37:03 +0000 | [diff] [blame] | 6309 | else | 
|  | 6310 | runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple()); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6311 | } | 
|  | 6312 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6313 | cmdArgs.push_back( | 
|  | 6314 | args.MakeArgString("-fobjc-runtime=" + runtime.getAsString())); | 
| John McCall | 5fb5df9 | 2012-06-20 06:18:46 +0000 | [diff] [blame] | 6315 | return runtime; | 
|  | 6316 | } | 
|  | 6317 |  | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6318 | static bool maybeConsumeDash(const std::string &EH, size_t &I) { | 
|  | 6319 | bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-'); | 
|  | 6320 | I += HaveDash; | 
|  | 6321 | return !HaveDash; | 
| Chandler Carruth | 095b696 | 2014-06-29 22:42:51 +0000 | [diff] [blame] | 6322 | } | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6323 |  | 
| Benjamin Kramer | e003ca2 | 2015-10-28 13:54:16 +0000 | [diff] [blame] | 6324 | namespace { | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6325 | struct EHFlags { | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 6326 | bool Synch = false; | 
|  | 6327 | bool Asynch = false; | 
|  | 6328 | bool NoUnwindC = false; | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6329 | }; | 
| Benjamin Kramer | e003ca2 | 2015-10-28 13:54:16 +0000 | [diff] [blame] | 6330 | } // end anonymous namespace | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6331 |  | 
|  | 6332 | /// /EH controls whether to run destructor cleanups when exceptions are | 
|  | 6333 | /// thrown.  There are three modifiers: | 
|  | 6334 | /// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions. | 
|  | 6335 | /// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions. | 
|  | 6336 | ///      The 'a' modifier is unimplemented and fundamentally hard in LLVM IR. | 
| David Majnemer | 960813e | 2016-02-20 09:23:47 +0000 | [diff] [blame] | 6337 | /// - c: Assume that extern "C" functions are implicitly nounwind. | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6338 | /// The default is /EHs-c-, meaning cleanups are disabled. | 
|  | 6339 | static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) { | 
|  | 6340 | EHFlags EH; | 
| Reid Kleckner | 0bb1fc4 | 2015-07-10 22:25:44 +0000 | [diff] [blame] | 6341 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6342 | std::vector<std::string> EHArgs = | 
|  | 6343 | Args.getAllArgValues(options::OPT__SLASH_EH); | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6344 | for (auto EHVal : EHArgs) { | 
|  | 6345 | for (size_t I = 0, E = EHVal.size(); I != E; ++I) { | 
|  | 6346 | switch (EHVal[I]) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6347 | case 'a': | 
|  | 6348 | EH.Asynch = maybeConsumeDash(EHVal, I); | 
| David Majnemer | 387fccd | 2016-02-29 01:40:30 +0000 | [diff] [blame] | 6349 | if (EH.Asynch) | 
|  | 6350 | EH.Synch = false; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6351 | continue; | 
|  | 6352 | case 'c': | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 6353 | EH.NoUnwindC = maybeConsumeDash(EHVal, I); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6354 | continue; | 
|  | 6355 | case 's': | 
|  | 6356 | EH.Synch = maybeConsumeDash(EHVal, I); | 
| David Majnemer | 387fccd | 2016-02-29 01:40:30 +0000 | [diff] [blame] | 6357 | if (EH.Synch) | 
|  | 6358 | EH.Asynch = false; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6359 | continue; | 
|  | 6360 | default: | 
|  | 6361 | break; | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6362 | } | 
|  | 6363 | D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal; | 
|  | 6364 | break; | 
|  | 6365 | } | 
|  | 6366 | } | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 6367 | // The /GX, /GX- flags are only processed if there are not /EH flags. | 
| David Majnemer | a7bdc5a | 2016-02-22 17:44:51 +0000 | [diff] [blame] | 6368 | // The default is that /GX is not specified. | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 6369 | if (EHArgs.empty() && | 
| David Majnemer | a7bdc5a | 2016-02-22 17:44:51 +0000 | [diff] [blame] | 6370 | Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_, | 
|  | 6371 | /*default=*/false)) { | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 6372 | EH.Synch = true; | 
|  | 6373 | EH.NoUnwindC = true; | 
|  | 6374 | } | 
| Reid Kleckner | 0bb1fc4 | 2015-07-10 22:25:44 +0000 | [diff] [blame] | 6375 |  | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6376 | return EH; | 
|  | 6377 | } | 
|  | 6378 |  | 
| David Majnemer | cd5855e | 2016-02-29 01:40:36 +0000 | [diff] [blame] | 6379 | void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, | 
|  | 6380 | ArgStringList &CmdArgs, | 
| Benjamin Kramer | 8c30592 | 2016-02-02 11:06:51 +0000 | [diff] [blame] | 6381 | codegenoptions::DebugInfoKind *DebugInfoKind, | 
| Douglas Katzman | 3459ce2 | 2015-10-08 04:24:12 +0000 | [diff] [blame] | 6382 | bool *EmitCodeView) const { | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6383 | unsigned RTOptionID = options::OPT__SLASH_MT; | 
|  | 6384 |  | 
| Hans Wennborg | f1a7425 | 2013-09-10 20:18:04 +0000 | [diff] [blame] | 6385 | if (Args.hasArg(options::OPT__SLASH_LDd)) | 
|  | 6386 | // The /LDd option implies /MTd. The dependent lib part can be overridden, | 
|  | 6387 | // but defining _DEBUG is sticky. | 
|  | 6388 | RTOptionID = options::OPT__SLASH_MTd; | 
|  | 6389 |  | 
| Hans Wennborg | 9cb7d9ba | 2013-09-18 22:26:39 +0000 | [diff] [blame] | 6390 | if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group)) | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6391 | RTOptionID = A->getOption().getID(); | 
| Hans Wennborg | d9ad068 | 2013-09-11 16:38:41 +0000 | [diff] [blame] | 6392 |  | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6393 | StringRef FlagForCRT; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6394 | switch (RTOptionID) { | 
|  | 6395 | case options::OPT__SLASH_MD: | 
|  | 6396 | if (Args.hasArg(options::OPT__SLASH_LDd)) | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6397 | CmdArgs.push_back("-D_DEBUG"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6398 | CmdArgs.push_back("-D_MT"); | 
|  | 6399 | CmdArgs.push_back("-D_DLL"); | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6400 | FlagForCRT = "--dependent-lib=msvcrt"; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6401 | break; | 
|  | 6402 | case options::OPT__SLASH_MDd: | 
|  | 6403 | CmdArgs.push_back("-D_DEBUG"); | 
|  | 6404 | CmdArgs.push_back("-D_MT"); | 
|  | 6405 | CmdArgs.push_back("-D_DLL"); | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6406 | FlagForCRT = "--dependent-lib=msvcrtd"; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6407 | break; | 
|  | 6408 | case options::OPT__SLASH_MT: | 
|  | 6409 | if (Args.hasArg(options::OPT__SLASH_LDd)) | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6410 | CmdArgs.push_back("-D_DEBUG"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6411 | CmdArgs.push_back("-D_MT"); | 
| Peter Collingbourne | 3afb266 | 2016-04-28 17:09:37 +0000 | [diff] [blame] | 6412 | CmdArgs.push_back("-flto-visibility-public-std"); | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6413 | FlagForCRT = "--dependent-lib=libcmt"; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6414 | break; | 
|  | 6415 | case options::OPT__SLASH_MTd: | 
|  | 6416 | CmdArgs.push_back("-D_DEBUG"); | 
|  | 6417 | CmdArgs.push_back("-D_MT"); | 
| Peter Collingbourne | 3afb266 | 2016-04-28 17:09:37 +0000 | [diff] [blame] | 6418 | CmdArgs.push_back("-flto-visibility-public-std"); | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6419 | FlagForCRT = "--dependent-lib=libcmtd"; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6420 | break; | 
|  | 6421 | default: | 
|  | 6422 | llvm_unreachable("Unexpected option ID."); | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6423 | } | 
|  | 6424 |  | 
| David Majnemer | e2afb47 | 2015-07-24 06:49:13 +0000 | [diff] [blame] | 6425 | if (Args.hasArg(options::OPT__SLASH_Zl)) { | 
|  | 6426 | CmdArgs.push_back("-D_VC_NODEFAULTLIB"); | 
|  | 6427 | } else { | 
|  | 6428 | CmdArgs.push_back(FlagForCRT.data()); | 
|  | 6429 |  | 
|  | 6430 | // This provides POSIX compatibility (maps 'open' to '_open'), which most | 
|  | 6431 | // users want.  The /Za flag to cl.exe turns this off, but it's not | 
|  | 6432 | // implemented in clang. | 
|  | 6433 | CmdArgs.push_back("--dependent-lib=oldnames"); | 
|  | 6434 | } | 
| Hans Wennborg | 614f707 | 2013-08-08 19:54:30 +0000 | [diff] [blame] | 6435 |  | 
| Hans Wennborg | 8858a03 | 2014-07-21 23:42:07 +0000 | [diff] [blame] | 6436 | // Both /showIncludes and /E (and /EP) write to stdout. Allowing both | 
|  | 6437 | // would produce interleaved output, so ignore /showIncludes in such cases. | 
|  | 6438 | if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP)) | 
|  | 6439 | if (Arg *A = Args.getLastArg(options::OPT_show_includes)) | 
|  | 6440 | A->render(Args, CmdArgs); | 
| Hans Wennborg | 81f7448 | 2013-09-10 01:07:07 +0000 | [diff] [blame] | 6441 |  | 
| David Majnemer | f607234 | 2014-07-01 22:24:56 +0000 | [diff] [blame] | 6442 | // This controls whether or not we emit RTTI data for polymorphic types. | 
|  | 6443 | if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR, | 
|  | 6444 | /*default=*/false)) | 
|  | 6445 | CmdArgs.push_back("-fno-rtti-data"); | 
| Hans Wennborg | 7b0dcef | 2014-02-25 18:36:22 +0000 | [diff] [blame] | 6446 |  | 
| Etienne Bergeron | e28e7f2 | 2016-06-15 20:34:33 +0000 | [diff] [blame] | 6447 | // This controls whether or not we emit stack-protector instrumentation. | 
|  | 6448 | // In MSVC, Buffer Security Check (/GS) is on by default. | 
|  | 6449 | if (Args.hasFlag(options::OPT__SLASH_GS, options::OPT__SLASH_GS_, | 
|  | 6450 | /*default=*/true)) { | 
|  | 6451 | CmdArgs.push_back("-stack-protector"); | 
|  | 6452 | CmdArgs.push_back(Args.MakeArgString(Twine(LangOptions::SSPStrong))); | 
|  | 6453 | } | 
|  | 6454 |  | 
| Reid Kleckner | bab5a5d | 2016-08-09 17:23:56 +0000 | [diff] [blame] | 6455 | // Emit CodeView if -Z7, -Zd, or -gline-tables-only are present. | 
| David Majnemer | 58fab35 | 2016-07-09 21:49:16 +0000 | [diff] [blame] | 6456 | if (Arg *DebugInfoArg = | 
| Reid Kleckner | bab5a5d | 2016-08-09 17:23:56 +0000 | [diff] [blame] | 6457 | Args.getLastArg(options::OPT__SLASH_Z7, options::OPT__SLASH_Zd, | 
|  | 6458 | options::OPT_gline_tables_only)) { | 
| David Majnemer | 58fab35 | 2016-07-09 21:49:16 +0000 | [diff] [blame] | 6459 | *EmitCodeView = true; | 
|  | 6460 | if (DebugInfoArg->getOption().matches(options::OPT__SLASH_Z7)) | 
|  | 6461 | *DebugInfoKind = codegenoptions::LimitedDebugInfo; | 
|  | 6462 | else | 
|  | 6463 | *DebugInfoKind = codegenoptions::DebugLineTablesOnly; | 
| Reid Kleckner | 124955a | 2015-08-05 18:51:13 +0000 | [diff] [blame] | 6464 | CmdArgs.push_back("-gcodeview"); | 
| David Majnemer | 58fab35 | 2016-07-09 21:49:16 +0000 | [diff] [blame] | 6465 | } else { | 
|  | 6466 | *EmitCodeView = false; | 
|  | 6467 | } | 
| Reid Kleckner | 124955a | 2015-08-05 18:51:13 +0000 | [diff] [blame] | 6468 |  | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6469 | const Driver &D = getToolChain().getDriver(); | 
|  | 6470 | EHFlags EH = parseClangCLEHFlags(D, Args); | 
| Reid Kleckner | deeddec | 2015-02-05 18:56:03 +0000 | [diff] [blame] | 6471 | if (EH.Synch || EH.Asynch) { | 
| David Majnemer | cd5855e | 2016-02-29 01:40:36 +0000 | [diff] [blame] | 6472 | if (types::isCXX(InputType)) | 
|  | 6473 | CmdArgs.push_back("-fcxx-exceptions"); | 
| Reid Kleckner | deeddec | 2015-02-05 18:56:03 +0000 | [diff] [blame] | 6474 | CmdArgs.push_back("-fexceptions"); | 
|  | 6475 | } | 
| David Majnemer | cd5855e | 2016-02-29 01:40:36 +0000 | [diff] [blame] | 6476 | if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC) | 
|  | 6477 | CmdArgs.push_back("-fexternc-nounwind"); | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 6478 |  | 
| Hans Wennborg | e50cec3 | 2014-06-13 20:59:54 +0000 | [diff] [blame] | 6479 | // /EP should expand to -E -P. | 
|  | 6480 | if (Args.hasArg(options::OPT__SLASH_EP)) { | 
|  | 6481 | CmdArgs.push_back("-E"); | 
|  | 6482 | CmdArgs.push_back("-P"); | 
|  | 6483 | } | 
|  | 6484 |  | 
| David Majnemer | a5b195a | 2015-02-14 01:35:12 +0000 | [diff] [blame] | 6485 | unsigned VolatileOptionID; | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 6486 | if (getToolChain().getArch() == llvm::Triple::x86_64 || | 
|  | 6487 | getToolChain().getArch() == llvm::Triple::x86) | 
| David Majnemer | a5b195a | 2015-02-14 01:35:12 +0000 | [diff] [blame] | 6488 | VolatileOptionID = options::OPT__SLASH_volatile_ms; | 
|  | 6489 | else | 
|  | 6490 | VolatileOptionID = options::OPT__SLASH_volatile_iso; | 
|  | 6491 |  | 
|  | 6492 | if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group)) | 
|  | 6493 | VolatileOptionID = A->getOption().getID(); | 
|  | 6494 |  | 
|  | 6495 | if (VolatileOptionID == options::OPT__SLASH_volatile_ms) | 
|  | 6496 | CmdArgs.push_back("-fms-volatile"); | 
|  | 6497 |  | 
| David Majnemer | 86c318f | 2014-02-11 21:05:00 +0000 | [diff] [blame] | 6498 | Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg); | 
|  | 6499 | Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb); | 
|  | 6500 | if (MostGeneralArg && BestCaseArg) | 
|  | 6501 | D.Diag(clang::diag::err_drv_argument_not_allowed_with) | 
|  | 6502 | << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args); | 
|  | 6503 |  | 
|  | 6504 | if (MostGeneralArg) { | 
|  | 6505 | Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms); | 
|  | 6506 | Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm); | 
|  | 6507 | Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv); | 
|  | 6508 |  | 
|  | 6509 | Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg; | 
|  | 6510 | Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg; | 
|  | 6511 | if (FirstConflict && SecondConflict && FirstConflict != SecondConflict) | 
|  | 6512 | D.Diag(clang::diag::err_drv_argument_not_allowed_with) | 
|  | 6513 | << FirstConflict->getAsString(Args) | 
|  | 6514 | << SecondConflict->getAsString(Args); | 
|  | 6515 |  | 
|  | 6516 | if (SingleArg) | 
|  | 6517 | CmdArgs.push_back("-fms-memptr-rep=single"); | 
|  | 6518 | else if (MultipleArg) | 
|  | 6519 | CmdArgs.push_back("-fms-memptr-rep=multiple"); | 
|  | 6520 | else | 
|  | 6521 | CmdArgs.push_back("-fms-memptr-rep=virtual"); | 
|  | 6522 | } | 
|  | 6523 |  | 
| Alexey Bataev | a754718 | 2016-05-18 09:06:38 +0000 | [diff] [blame] | 6524 | if (Args.getLastArg(options::OPT__SLASH_Gd)) | 
|  | 6525 | CmdArgs.push_back("-fdefault-calling-conv=cdecl"); | 
|  | 6526 | else if (Args.getLastArg(options::OPT__SLASH_Gr)) | 
|  | 6527 | CmdArgs.push_back("-fdefault-calling-conv=fastcall"); | 
|  | 6528 | else if (Args.getLastArg(options::OPT__SLASH_Gz)) | 
|  | 6529 | CmdArgs.push_back("-fdefault-calling-conv=stdcall"); | 
|  | 6530 | else if (Args.getLastArg(options::OPT__SLASH_Gv)) | 
|  | 6531 | CmdArgs.push_back("-fdefault-calling-conv=vectorcall"); | 
|  | 6532 |  | 
| Reid Kleckner | c0dca6d | 2014-02-12 23:50:26 +0000 | [diff] [blame] | 6533 | if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) | 
|  | 6534 | A->render(Args, CmdArgs); | 
|  | 6535 |  | 
| Hans Wennborg | 81f7448 | 2013-09-10 01:07:07 +0000 | [diff] [blame] | 6536 | if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) { | 
|  | 6537 | CmdArgs.push_back("-fdiagnostics-format"); | 
| Hans Wennborg | f4aee18 | 2013-09-24 00:08:55 +0000 | [diff] [blame] | 6538 | if (Args.hasArg(options::OPT__SLASH_fallback)) | 
|  | 6539 | CmdArgs.push_back("msvc-fallback"); | 
|  | 6540 | else | 
|  | 6541 | CmdArgs.push_back("msvc"); | 
| Hans Wennborg | 81f7448 | 2013-09-10 01:07:07 +0000 | [diff] [blame] | 6542 | } | 
| Hans Wennborg | 75958c4 | 2013-08-08 00:17:41 +0000 | [diff] [blame] | 6543 | } | 
|  | 6544 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6545 | visualstudio::Compiler *Clang::getCLFallback() const { | 
| Hans Wennborg | 1da044a | 2014-06-26 19:59:02 +0000 | [diff] [blame] | 6546 | if (!CLFallback) | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6547 | CLFallback.reset(new visualstudio::Compiler(getToolChain())); | 
| Hans Wennborg | 1da044a | 2014-06-26 19:59:02 +0000 | [diff] [blame] | 6548 | return CLFallback.get(); | 
|  | 6549 | } | 
|  | 6550 |  | 
| Daniel Sanders | 7f933f4 | 2015-01-30 17:35:23 +0000 | [diff] [blame] | 6551 | void ClangAs::AddMIPSTargetArgs(const ArgList &Args, | 
|  | 6552 | ArgStringList &CmdArgs) const { | 
|  | 6553 | StringRef CPUName; | 
|  | 6554 | StringRef ABIName; | 
|  | 6555 | const llvm::Triple &Triple = getToolChain().getTriple(); | 
|  | 6556 | mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); | 
|  | 6557 |  | 
|  | 6558 | CmdArgs.push_back("-target-abi"); | 
|  | 6559 | CmdArgs.push_back(ABIName.data()); | 
|  | 6560 | } | 
|  | 6561 |  | 
| Yunzhong Gao | fc61113 | 2016-07-18 18:44:51 +0000 | [diff] [blame] | 6562 | void ClangAs::AddX86TargetArgs(const ArgList &Args, | 
|  | 6563 | ArgStringList &CmdArgs) const { | 
|  | 6564 | if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) { | 
|  | 6565 | StringRef Value = A->getValue(); | 
|  | 6566 | if (Value == "intel" || Value == "att") { | 
|  | 6567 | CmdArgs.push_back("-mllvm"); | 
|  | 6568 | CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value)); | 
|  | 6569 | } else { | 
|  | 6570 | getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument) | 
|  | 6571 | << A->getOption().getName() << Value; | 
|  | 6572 | } | 
|  | 6573 | } | 
|  | 6574 | } | 
|  | 6575 |  | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6576 | void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6577 | const InputInfo &Output, const InputInfoList &Inputs, | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6578 | const ArgList &Args, | 
|  | 6579 | const char *LinkingOutput) const { | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6580 | ArgStringList CmdArgs; | 
|  | 6581 |  | 
|  | 6582 | assert(Inputs.size() == 1 && "Unexpected number of inputs."); | 
|  | 6583 | const InputInfo &Input = Inputs[0]; | 
|  | 6584 |  | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 6585 | const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); | 
|  | 6586 | const std::string &TripleStr = Triple.getTriple(); | 
| James Y Knight | 2db38f3 | 2015-08-15 03:45:25 +0000 | [diff] [blame] | 6587 |  | 
| Rafael Espindola | cfaadda | 2010-11-17 22:13:25 +0000 | [diff] [blame] | 6588 | // Don't warn about "clang -w -c foo.s" | 
|  | 6589 | Args.ClaimAllArgs(options::OPT_w); | 
| Rafael Espindola | d95a812 | 2011-03-01 05:25:27 +0000 | [diff] [blame] | 6590 | // and "clang -emit-llvm -c foo.s" | 
|  | 6591 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
| Rafael Espindola | cfaadda | 2010-11-17 22:13:25 +0000 | [diff] [blame] | 6592 |  | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 6593 | claimNoWarnArgs(Args); | 
| Rafael Espindola | 16042fc | 2015-01-02 23:23:52 +0000 | [diff] [blame] | 6594 |  | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6595 | // Invoke ourselves in -cc1as mode. | 
|  | 6596 | // | 
|  | 6597 | // FIXME: Implement custom jobs for internal actions. | 
|  | 6598 | CmdArgs.push_back("-cc1as"); | 
|  | 6599 |  | 
|  | 6600 | // Add the "effective" target triple. | 
|  | 6601 | CmdArgs.push_back("-triple"); | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6602 | CmdArgs.push_back(Args.MakeArgString(TripleStr)); | 
|  | 6603 |  | 
|  | 6604 | // Set the output mode, we currently only expect to be used as a real | 
|  | 6605 | // assembler. | 
|  | 6606 | CmdArgs.push_back("-filetype"); | 
|  | 6607 | CmdArgs.push_back("obj"); | 
|  | 6608 |  | 
| Eric Christopher | 45f2e71 | 2012-12-18 00:31:10 +0000 | [diff] [blame] | 6609 | // Set the main file name, so that debug info works even with | 
|  | 6610 | // -save-temps or preprocessed assembly. | 
|  | 6611 | CmdArgs.push_back("-main-file-name"); | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 6612 | CmdArgs.push_back(Clang::getBaseInputName(Args, Input)); | 
| Eric Christopher | 45f2e71 | 2012-12-18 00:31:10 +0000 | [diff] [blame] | 6613 |  | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 6614 | // Add the target cpu | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 6615 | std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true); | 
| Rafael Espindola | 22ce34a | 2013-08-20 22:12:08 +0000 | [diff] [blame] | 6616 | if (!CPU.empty()) { | 
|  | 6617 | CmdArgs.push_back("-target-cpu"); | 
|  | 6618 | CmdArgs.push_back(Args.MakeArgString(CPU)); | 
|  | 6619 | } | 
|  | 6620 |  | 
| Rafael Espindola | 28e1f4b | 2013-08-21 16:39:20 +0000 | [diff] [blame] | 6621 | // Add the target features | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 6622 | getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true); | 
| Jim Grosbach | 576452b | 2012-02-10 20:37:10 +0000 | [diff] [blame] | 6623 |  | 
| Daniel Dunbar | 1d733e2 | 2011-03-17 17:37:29 +0000 | [diff] [blame] | 6624 | // Ignore explicit -force_cpusubtype_ALL option. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6625 | (void)Args.hasArg(options::OPT_force__cpusubtype__ALL); | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6626 |  | 
| Jim Grosbach | c78c2bc | 2015-06-23 18:20:13 +0000 | [diff] [blame] | 6627 | // Pass along any -I options so we get proper .include search paths. | 
|  | 6628 | Args.AddAllArgs(CmdArgs, options::OPT_I_Group); | 
|  | 6629 |  | 
| Eric Christopher | fc3ee56 | 2012-01-10 00:38:01 +0000 | [diff] [blame] | 6630 | // Determine the original source input. | 
|  | 6631 | const Action *SourceAction = &JA; | 
|  | 6632 | while (SourceAction->getKind() != Action::InputClass) { | 
|  | 6633 | assert(!SourceAction->getInputs().empty() && "unexpected root action!"); | 
|  | 6634 | SourceAction = SourceAction->getInputs()[0]; | 
|  | 6635 | } | 
|  | 6636 |  | 
| Chandler Carruth | 4d5e1a9 | 2012-12-17 21:40:04 +0000 | [diff] [blame] | 6637 | // Forward -g and handle debug info related flags, assuming we are dealing | 
|  | 6638 | // with an actual assembly file. | 
| Douglas Katzman | 3103f25 | 2016-04-19 18:55:53 +0000 | [diff] [blame] | 6639 | bool WantDebug = false; | 
|  | 6640 | unsigned DwarfVersion = 0; | 
|  | 6641 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 6642 | if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { | 
|  | 6643 | WantDebug = !A->getOption().matches(options::OPT_g0) && | 
|  | 6644 | !A->getOption().matches(options::OPT_ggdb0); | 
|  | 6645 | if (WantDebug) | 
|  | 6646 | DwarfVersion = DwarfVersionNum(A->getSpelling()); | 
|  | 6647 | } | 
|  | 6648 | if (DwarfVersion == 0) | 
|  | 6649 | DwarfVersion = getToolChain().GetDefaultDwarfVersion(); | 
|  | 6650 |  | 
|  | 6651 | codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo; | 
|  | 6652 |  | 
| Eric Christopher | fc3ee56 | 2012-01-10 00:38:01 +0000 | [diff] [blame] | 6653 | if (SourceAction->getType() == types::TY_Asm || | 
|  | 6654 | SourceAction->getType() == types::TY_PP_Asm) { | 
| Douglas Katzman | 3103f25 | 2016-04-19 18:55:53 +0000 | [diff] [blame] | 6655 | // You might think that it would be ok to set DebugInfoKind outside of | 
|  | 6656 | // the guard for source type, however there is a test which asserts | 
|  | 6657 | // that some assembler invocation receives no -debug-info-kind, | 
|  | 6658 | // and it's not clear whether that test is just overly restrictive. | 
|  | 6659 | DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo | 
|  | 6660 | : codegenoptions::NoDebugInfo); | 
| Chandler Carruth | 4d5e1a9 | 2012-12-17 21:40:04 +0000 | [diff] [blame] | 6661 | // Add the -fdebug-compilation-dir flag if needed. | 
|  | 6662 | addDebugCompDirArg(Args, CmdArgs); | 
| Kevin Enderby | ae2ec47 | 2013-01-17 21:38:06 +0000 | [diff] [blame] | 6663 |  | 
|  | 6664 | // Set the AT_producer to the clang version when using the integrated | 
|  | 6665 | // assembler on assembly source files. | 
|  | 6666 | CmdArgs.push_back("-dwarf-debug-producer"); | 
| Bruno Cardoso Lopes | 34c549e | 2016-05-02 20:20:49 +0000 | [diff] [blame] | 6667 | CmdArgs.push_back(Args.MakeArgString(getClangFullVersion())); | 
| Renato Golin | a74bbc7 | 2015-07-22 15:32:36 +0000 | [diff] [blame] | 6668 |  | 
|  | 6669 | // And pass along -I options | 
|  | 6670 | Args.AddAllArgs(CmdArgs, options::OPT_I); | 
| Eric Christopher | fc3ee56 | 2012-01-10 00:38:01 +0000 | [diff] [blame] | 6671 | } | 
| Douglas Katzman | 3103f25 | 2016-04-19 18:55:53 +0000 | [diff] [blame] | 6672 | RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion, | 
|  | 6673 | llvm::DebuggerKind::Default); | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6674 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 6675 | // Handle -fPIC et al -- the relocation-model affects the assembler | 
|  | 6676 | // for some targets. | 
|  | 6677 | llvm::Reloc::Model RelocationModel; | 
|  | 6678 | unsigned PICLevel; | 
|  | 6679 | bool IsPIE; | 
|  | 6680 | std::tie(RelocationModel, PICLevel, IsPIE) = | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 6681 | ParsePICArgs(getToolChain(), Triple, Args); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 6682 |  | 
|  | 6683 | const char *RMName = RelocationModelName(RelocationModel); | 
|  | 6684 | if (RMName) { | 
|  | 6685 | CmdArgs.push_back("-mrelocation-model"); | 
|  | 6686 | CmdArgs.push_back(RMName); | 
|  | 6687 | } | 
|  | 6688 |  | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6689 | // Optionally embed the -cc1as level arguments into the debug info, for build | 
|  | 6690 | // analysis. | 
|  | 6691 | if (getToolChain().UseDwarfDebugFlags()) { | 
|  | 6692 | ArgStringList OriginalArgs; | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6693 | for (const auto &Arg : Args) | 
|  | 6694 | Arg->render(Args, OriginalArgs); | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6695 |  | 
| Dylan Noblesmith | 2c1dd27 | 2012-02-05 02:13:05 +0000 | [diff] [blame] | 6696 | SmallString<256> Flags; | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6697 | const char *Exec = getToolChain().getDriver().getClangProgramPath(); | 
|  | 6698 | Flags += Exec; | 
| Douglas Katzman | 6bbffc4 | 2015-06-25 18:51:37 +0000 | [diff] [blame] | 6699 | for (const char *OriginalArg : OriginalArgs) { | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 6700 | SmallString<128> EscapedArg; | 
| Douglas Katzman | 6bbffc4 | 2015-06-25 18:51:37 +0000 | [diff] [blame] | 6701 | EscapeSpacesAndBackslashes(OriginalArg, EscapedArg); | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6702 | Flags += " "; | 
| Bob Wilson | d5aad2a | 2014-11-04 22:28:48 +0000 | [diff] [blame] | 6703 | Flags += EscapedArg; | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6704 | } | 
|  | 6705 | CmdArgs.push_back("-dwarf-debug-flags"); | 
| Yaron Keren | 92e1b62 | 2015-03-18 10:17:07 +0000 | [diff] [blame] | 6706 | CmdArgs.push_back(Args.MakeArgString(Flags)); | 
| Kevin Enderby | 292dc08 | 2011-12-22 19:31:58 +0000 | [diff] [blame] | 6707 | } | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6708 |  | 
|  | 6709 | // FIXME: Add -static support, once we have it. | 
|  | 6710 |  | 
| Daniel Sanders | 7f933f4 | 2015-01-30 17:35:23 +0000 | [diff] [blame] | 6711 | // Add target specific flags. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6712 | switch (getToolChain().getArch()) { | 
| Daniel Sanders | 7f933f4 | 2015-01-30 17:35:23 +0000 | [diff] [blame] | 6713 | default: | 
|  | 6714 | break; | 
|  | 6715 |  | 
|  | 6716 | case llvm::Triple::mips: | 
|  | 6717 | case llvm::Triple::mipsel: | 
|  | 6718 | case llvm::Triple::mips64: | 
|  | 6719 | case llvm::Triple::mips64el: | 
|  | 6720 | AddMIPSTargetArgs(Args, CmdArgs); | 
|  | 6721 | break; | 
| Adrian McCarthy | 084148f | 2016-08-25 18:24:35 +0000 | [diff] [blame] | 6722 |  | 
| Yunzhong Gao | fc61113 | 2016-07-18 18:44:51 +0000 | [diff] [blame] | 6723 | case llvm::Triple::x86: | 
|  | 6724 | case llvm::Triple::x86_64: | 
|  | 6725 | AddX86TargetArgs(Args, CmdArgs); | 
|  | 6726 | break; | 
| Daniel Sanders | 7f933f4 | 2015-01-30 17:35:23 +0000 | [diff] [blame] | 6727 | } | 
|  | 6728 |  | 
| David Blaikie | 372d950 | 2014-01-17 03:17:40 +0000 | [diff] [blame] | 6729 | // Consume all the warning flags. Usually this would be handled more | 
|  | 6730 | // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as | 
|  | 6731 | // doesn't handle that so rather than warning about unused flags that are | 
|  | 6732 | // actually used, we'll lie by omission instead. | 
|  | 6733 | // FIXME: Stop lying and consume only the appropriate driver flags | 
| Eric Christopher | 5d1caa5 | 2016-01-07 02:00:55 +0000 | [diff] [blame] | 6734 | Args.ClaimAllArgs(options::OPT_W_Group); | 
| David Blaikie | 372d950 | 2014-01-17 03:17:40 +0000 | [diff] [blame] | 6735 |  | 
| David Blaikie | 9260ed6 | 2013-07-25 21:19:01 +0000 | [diff] [blame] | 6736 | CollectArgsForIntegratedAssembler(C, Args, CmdArgs, | 
|  | 6737 | getToolChain().getDriver()); | 
|  | 6738 |  | 
| Daniel Dunbar | 252e8f9 | 2011-04-29 17:53:18 +0000 | [diff] [blame] | 6739 | Args.AddAllArgs(CmdArgs, options::OPT_mllvm); | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6740 |  | 
|  | 6741 | assert(Output.isFilename() && "Unexpected lipo output."); | 
|  | 6742 | CmdArgs.push_back("-o"); | 
|  | 6743 | CmdArgs.push_back(Output.getFilename()); | 
|  | 6744 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 6745 | assert(Input.isFilename() && "Invalid input."); | 
|  | 6746 | CmdArgs.push_back(Input.getFilename()); | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6747 |  | 
| Daniel Dunbar | b31b76f | 2010-07-18 21:16:15 +0000 | [diff] [blame] | 6748 | const char *Exec = getToolChain().getDriver().getClangProgramPath(); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 6749 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Eric Christopher | a75018a | 2013-04-10 21:30:40 +0000 | [diff] [blame] | 6750 |  | 
|  | 6751 | // Handle the debug info splitting at object creation time if we're | 
|  | 6752 | // creating an object. | 
|  | 6753 | // TODO: Currently only works on linux with newer objcopy. | 
|  | 6754 | if (Args.hasArg(options::OPT_gsplit_dwarf) && | 
| Cameron Esfahani | 556d91e | 2013-09-14 01:09:11 +0000 | [diff] [blame] | 6755 | getToolChain().getTriple().isOSLinux()) | 
| Eric Christopher | a75018a | 2013-04-10 21:30:40 +0000 | [diff] [blame] | 6756 | SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 6757 | SplitDebugName(Args, Input)); | 
| Daniel Dunbar | 4f5e79c | 2010-05-20 21:30:13 +0000 | [diff] [blame] | 6758 | } | 
|  | 6759 |  | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 6760 | void GnuTool::anchor() {} | 
|  | 6761 |  | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6762 | void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6763 | const InputInfo &Output, | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 6764 | const InputInfoList &Inputs, const ArgList &Args, | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6765 | const char *LinkingOutput) const { | 
| Daniel Dunbar | 083edf7 | 2009-12-21 18:54:17 +0000 | [diff] [blame] | 6766 | const Driver &D = getToolChain().getDriver(); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6767 | ArgStringList CmdArgs; | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 6768 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6769 | for (const auto &A : Args) { | 
| Michael J. Spencer | 66e2b20 | 2012-10-19 22:37:06 +0000 | [diff] [blame] | 6770 | if (forwardToGCC(A->getOption())) { | 
| Eric Christopher | 3f07d85 | 2016-01-07 09:03:42 +0000 | [diff] [blame] | 6771 | // It is unfortunate that we have to claim here, as this means | 
|  | 6772 | // we will basically never report anything interesting for | 
|  | 6773 | // platforms using a generic gcc, even if we are just using gcc | 
|  | 6774 | // to get to the assembler. | 
|  | 6775 | A->claim(); | 
|  | 6776 |  | 
| Daniel Dunbar | 939c121 | 2010-08-03 16:14:14 +0000 | [diff] [blame] | 6777 | // Don't forward any -g arguments to assembly steps. | 
|  | 6778 | if (isa<AssembleJobAction>(JA) && | 
|  | 6779 | A->getOption().matches(options::OPT_g_Group)) | 
|  | 6780 | continue; | 
|  | 6781 |  | 
| NAKAMURA Takumi | 053704f | 2013-08-19 11:51:51 +0000 | [diff] [blame] | 6782 | // Don't forward any -W arguments to assembly and link steps. | 
|  | 6783 | if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) && | 
|  | 6784 | A->getOption().matches(options::OPT_W_Group)) | 
|  | 6785 | continue; | 
|  | 6786 |  | 
| Daniel Dunbar | a2aedc6 | 2009-03-18 10:01:51 +0000 | [diff] [blame] | 6787 | A->render(Args, CmdArgs); | 
| Daniel Dunbar | 2da0272 | 2009-03-19 07:55:12 +0000 | [diff] [blame] | 6788 | } | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6789 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 6790 |  | 
| Daniel Dunbar | 4e29505 | 2010-01-25 22:35:08 +0000 | [diff] [blame] | 6791 | RenderExtraToolArgs(JA, CmdArgs); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6792 |  | 
|  | 6793 | // If using a driver driver, force the arch. | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 6794 | if (getToolChain().getTriple().isOSDarwin()) { | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6795 | CmdArgs.push_back("-arch"); | 
| Rafael Espindola | ed1233e | 2014-08-28 21:23:05 +0000 | [diff] [blame] | 6796 | CmdArgs.push_back( | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6797 | Args.MakeArgString(getToolChain().getDefaultUniversalArchName())); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6798 | } | 
|  | 6799 |  | 
| Daniel Dunbar | 5716d87 | 2009-05-02 21:41:52 +0000 | [diff] [blame] | 6800 | // Try to force gcc to match the tool chain we want, if we recognize | 
|  | 6801 | // the arch. | 
| Daniel Dunbar | 5bbebfe | 2009-05-22 02:21:04 +0000 | [diff] [blame] | 6802 | // | 
|  | 6803 | // FIXME: The triple class should directly provide the information we want | 
|  | 6804 | // here. | 
| Douglas Katzman | 3885755 | 2015-08-20 18:32:26 +0000 | [diff] [blame] | 6805 | switch (getToolChain().getArch()) { | 
|  | 6806 | default: | 
|  | 6807 | break; | 
|  | 6808 | case llvm::Triple::x86: | 
|  | 6809 | case llvm::Triple::ppc: | 
| Daniel Dunbar | 5716d87 | 2009-05-02 21:41:52 +0000 | [diff] [blame] | 6810 | CmdArgs.push_back("-m32"); | 
| Douglas Katzman | 3885755 | 2015-08-20 18:32:26 +0000 | [diff] [blame] | 6811 | break; | 
|  | 6812 | case llvm::Triple::x86_64: | 
|  | 6813 | case llvm::Triple::ppc64: | 
|  | 6814 | case llvm::Triple::ppc64le: | 
| Daniel Dunbar | 5716d87 | 2009-05-02 21:41:52 +0000 | [diff] [blame] | 6815 | CmdArgs.push_back("-m64"); | 
| Douglas Katzman | 3885755 | 2015-08-20 18:32:26 +0000 | [diff] [blame] | 6816 | break; | 
|  | 6817 | case llvm::Triple::sparcel: | 
|  | 6818 | CmdArgs.push_back("-EL"); | 
|  | 6819 | break; | 
|  | 6820 | } | 
| Daniel Dunbar | 5716d87 | 2009-05-02 21:41:52 +0000 | [diff] [blame] | 6821 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 6822 | if (Output.isFilename()) { | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6823 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6824 | CmdArgs.push_back(Output.getFilename()); | 
|  | 6825 | } else { | 
|  | 6826 | assert(Output.isNothing() && "Unexpected output"); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6827 | CmdArgs.push_back("-fsyntax-only"); | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6828 | } | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6829 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6830 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6831 |  | 
|  | 6832 | // Only pass -x if gcc will understand it; otherwise hope gcc | 
|  | 6833 | // understands the suffix correctly. The main use case this would go | 
|  | 6834 | // wrong in is for linker inputs if they happened to have an odd | 
|  | 6835 | // suffix; really the only way to get this to happen is a command | 
|  | 6836 | // like '-x foobar a.c' which will treat a.c like a linker input. | 
|  | 6837 | // | 
|  | 6838 | // FIXME: For the linker case specifically, can we safely convert | 
|  | 6839 | // inputs into '-Wl,' options? | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6840 | for (const auto &II : Inputs) { | 
| Daniel Dunbar | 6cdf83c | 2009-09-01 16:57:46 +0000 | [diff] [blame] | 6841 | // Don't try to pass LLVM or AST inputs to a generic gcc. | 
| Eric Christopher | c198407 | 2015-12-08 02:10:19 +0000 | [diff] [blame] | 6842 | if (types::isLLVMIR(II.getType())) | 
| Chris Lattner | 0e62c1c | 2011-07-23 10:55:15 +0000 | [diff] [blame] | 6843 | D.Diag(diag::err_drv_no_linker_llvm_support) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6844 | << getToolChain().getTripleString(); | 
| Daniel Dunbar | 6cdf83c | 2009-09-01 16:57:46 +0000 | [diff] [blame] | 6845 | else if (II.getType() == types::TY_AST) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6846 | D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString(); | 
| Douglas Gregor | bf7fc9c | 2013-03-27 16:47:18 +0000 | [diff] [blame] | 6847 | else if (II.getType() == types::TY_ModuleFile) | 
|  | 6848 | D.Diag(diag::err_drv_no_module_support) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6849 | << getToolChain().getTripleString(); | 
| Daniel Dunbar | e3e263f | 2009-05-02 20:14:53 +0000 | [diff] [blame] | 6850 |  | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6851 | if (types::canTypeBeUserSpecified(II.getType())) { | 
|  | 6852 | CmdArgs.push_back("-x"); | 
|  | 6853 | CmdArgs.push_back(types::getTypeName(II.getType())); | 
|  | 6854 | } | 
|  | 6855 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 6856 | if (II.isFilename()) | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6857 | CmdArgs.push_back(II.getFilename()); | 
| Daniel Dunbar | f247675 | 2010-09-25 18:10:05 +0000 | [diff] [blame] | 6858 | else { | 
|  | 6859 | const Arg &A = II.getInputArg(); | 
|  | 6860 |  | 
|  | 6861 | // Reverse translate some rewritten options. | 
|  | 6862 | if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { | 
|  | 6863 | CmdArgs.push_back("-lstdc++"); | 
|  | 6864 | continue; | 
|  | 6865 | } | 
|  | 6866 |  | 
| Daniel Dunbar | 5cdf3e0 | 2009-03-19 07:29:38 +0000 | [diff] [blame] | 6867 | // Don't render as input, we need gcc to do the translations. | 
| Daniel Dunbar | f247675 | 2010-09-25 18:10:05 +0000 | [diff] [blame] | 6868 | A.render(Args, CmdArgs); | 
|  | 6869 | } | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6870 | } | 
|  | 6871 |  | 
| Benjamin Kramer | 2e018ef | 2016-05-27 13:36:58 +0000 | [diff] [blame] | 6872 | const std::string &customGCCName = D.getCCCGenericGCCName(); | 
| Dylan Noblesmith | 70e73a3 | 2011-04-09 13:31:59 +0000 | [diff] [blame] | 6873 | const char *GCCName; | 
|  | 6874 | if (!customGCCName.empty()) | 
|  | 6875 | GCCName = customGCCName.c_str(); | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 6876 | else if (D.CCCIsCXX()) { | 
| Dylan Noblesmith | 70e73a3 | 2011-04-09 13:31:59 +0000 | [diff] [blame] | 6877 | GCCName = "g++"; | 
| Dylan Noblesmith | 70e73a3 | 2011-04-09 13:31:59 +0000 | [diff] [blame] | 6878 | } else | 
|  | 6879 | GCCName = "gcc"; | 
|  | 6880 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6881 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName)); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 6882 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 6883 | } | 
|  | 6884 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6885 | void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA, | 
|  | 6886 | ArgStringList &CmdArgs) const { | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6887 | CmdArgs.push_back("-E"); | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 6888 | } | 
|  | 6889 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6890 | void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA, | 
|  | 6891 | ArgStringList &CmdArgs) const { | 
| Daniel Dunbar | aeea8ac | 2010-02-11 03:16:21 +0000 | [diff] [blame] | 6892 | const Driver &D = getToolChain().getDriver(); | 
|  | 6893 |  | 
| Eric Christopher | cc7ff50 | 2015-01-29 00:56:17 +0000 | [diff] [blame] | 6894 | switch (JA.getType()) { | 
| Daniel Dunbar | 4e29505 | 2010-01-25 22:35:08 +0000 | [diff] [blame] | 6895 | // If -flto, etc. are present then make sure not to force assembly output. | 
| Eric Christopher | cc7ff50 | 2015-01-29 00:56:17 +0000 | [diff] [blame] | 6896 | case types::TY_LLVM_IR: | 
|  | 6897 | case types::TY_LTO_IR: | 
|  | 6898 | case types::TY_LLVM_BC: | 
|  | 6899 | case types::TY_LTO_BC: | 
| Daniel Dunbar | 4e29505 | 2010-01-25 22:35:08 +0000 | [diff] [blame] | 6900 | CmdArgs.push_back("-c"); | 
| Eric Christopher | cc7ff50 | 2015-01-29 00:56:17 +0000 | [diff] [blame] | 6901 | break; | 
| Eric Christopher | 29a50bc | 2016-01-06 07:24:45 +0000 | [diff] [blame] | 6902 | // We assume we've got an "integrated" assembler in that gcc will produce an | 
|  | 6903 | // object file itself. | 
|  | 6904 | case types::TY_Object: | 
|  | 6905 | CmdArgs.push_back("-c"); | 
|  | 6906 | break; | 
| Eric Christopher | cc7ff50 | 2015-01-29 00:56:17 +0000 | [diff] [blame] | 6907 | case types::TY_PP_Asm: | 
| Daniel Dunbar | 4e29505 | 2010-01-25 22:35:08 +0000 | [diff] [blame] | 6908 | CmdArgs.push_back("-S"); | 
| Eric Christopher | 58c2199 | 2015-01-30 18:22:23 +0000 | [diff] [blame] | 6909 | break; | 
| Eric Christopher | cc7ff50 | 2015-01-29 00:56:17 +0000 | [diff] [blame] | 6910 | case types::TY_Nothing: | 
|  | 6911 | CmdArgs.push_back("-fsyntax-only"); | 
|  | 6912 | break; | 
|  | 6913 | default: | 
|  | 6914 | D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType()); | 
| Daniel Dunbar | aeea8ac | 2010-02-11 03:16:21 +0000 | [diff] [blame] | 6915 | } | 
| Daniel Dunbar | 1a093d2 | 2009-03-18 06:00:36 +0000 | [diff] [blame] | 6916 | } | 
|  | 6917 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6918 | void gcc::Linker::RenderExtraToolArgs(const JobAction &JA, | 
|  | 6919 | ArgStringList &CmdArgs) const { | 
| Daniel Dunbar | a3246a0 | 2009-03-18 08:07:30 +0000 | [diff] [blame] | 6920 | // The types are (hopefully) good enough. | 
|  | 6921 | } | 
|  | 6922 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6923 | // Hexagon tools start. | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6924 | void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA, | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6925 | ArgStringList &CmdArgs) const { | 
|  | 6926 | } | 
|  | 6927 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6928 | void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 6929 | const InputInfo &Output, | 
|  | 6930 | const InputInfoList &Inputs, | 
|  | 6931 | const ArgList &Args, | 
|  | 6932 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 6933 | claimNoWarnArgs(Args); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6934 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6935 | auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain()); | 
|  | 6936 | const Driver &D = HTC.getDriver(); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6937 | ArgStringList CmdArgs; | 
|  | 6938 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6939 | std::string MArchString = "-march=hexagon"; | 
|  | 6940 | CmdArgs.push_back(Args.MakeArgString(MArchString)); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6941 |  | 
|  | 6942 | RenderExtraToolArgs(JA, CmdArgs); | 
|  | 6943 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6944 | std::string AsName = "hexagon-llvm-mc"; | 
|  | 6945 | std::string MCpuString = "-mcpu=hexagon" + | 
|  | 6946 | toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); | 
|  | 6947 | CmdArgs.push_back("-filetype=obj"); | 
|  | 6948 | CmdArgs.push_back(Args.MakeArgString(MCpuString)); | 
|  | 6949 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6950 | if (Output.isFilename()) { | 
|  | 6951 | CmdArgs.push_back("-o"); | 
|  | 6952 | CmdArgs.push_back(Output.getFilename()); | 
|  | 6953 | } else { | 
|  | 6954 | assert(Output.isNothing() && "Unexpected output"); | 
|  | 6955 | CmdArgs.push_back("-fsyntax-only"); | 
|  | 6956 | } | 
|  | 6957 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6958 | if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { | 
|  | 6959 | std::string N = llvm::utostr(G.getValue()); | 
|  | 6960 | CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N)); | 
|  | 6961 | } | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6962 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6963 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Matthew Curtis | e5df381 | 2012-12-07 17:23:04 +0000 | [diff] [blame] | 6964 |  | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6965 | // Only pass -x if gcc will understand it; otherwise hope gcc | 
|  | 6966 | // understands the suffix correctly. The main use case this would go | 
|  | 6967 | // wrong in is for linker inputs if they happened to have an odd | 
|  | 6968 | // suffix; really the only way to get this to happen is a command | 
|  | 6969 | // like '-x foobar a.c' which will treat a.c like a linker input. | 
|  | 6970 | // | 
|  | 6971 | // FIXME: For the linker case specifically, can we safely convert | 
|  | 6972 | // inputs into '-Wl,' options? | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6973 | for (const auto &II : Inputs) { | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6974 | // Don't try to pass LLVM or AST inputs to a generic gcc. | 
| Eric Christopher | c198407 | 2015-12-08 02:10:19 +0000 | [diff] [blame] | 6975 | if (types::isLLVMIR(II.getType())) | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6976 | D.Diag(clang::diag::err_drv_no_linker_llvm_support) | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6977 | << HTC.getTripleString(); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6978 | else if (II.getType() == types::TY_AST) | 
|  | 6979 | D.Diag(clang::diag::err_drv_no_ast_support) | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6980 | << HTC.getTripleString(); | 
| Douglas Gregor | bf7fc9c | 2013-03-27 16:47:18 +0000 | [diff] [blame] | 6981 | else if (II.getType() == types::TY_ModuleFile) | 
|  | 6982 | D.Diag(diag::err_drv_no_module_support) | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6983 | << HTC.getTripleString(); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6984 |  | 
|  | 6985 | if (II.isFilename()) | 
|  | 6986 | CmdArgs.push_back(II.getFilename()); | 
|  | 6987 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 6988 | // Don't render as input, we need gcc to do the translations. | 
| Eric Christopher | b0a44f7 | 2015-12-08 01:59:51 +0000 | [diff] [blame] | 6989 | // FIXME: What is this? | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6990 | II.getInputArg().render(Args, CmdArgs); | 
|  | 6991 | } | 
|  | 6992 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 6993 | auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str())); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 6994 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6995 | } | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 6996 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 6997 | void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA, | 
|  | 6998 | ArgStringList &CmdArgs) const { | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 6999 | } | 
|  | 7000 |  | 
| Douglas Katzman | 5436607 | 2015-07-27 16:53:08 +0000 | [diff] [blame] | 7001 | static void | 
|  | 7002 | constructHexagonLinkArgs(Compilation &C, const JobAction &JA, | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7003 | const toolchains::HexagonToolChain &HTC, | 
| Douglas Katzman | 5436607 | 2015-07-27 16:53:08 +0000 | [diff] [blame] | 7004 | const InputInfo &Output, const InputInfoList &Inputs, | 
|  | 7005 | const ArgList &Args, ArgStringList &CmdArgs, | 
|  | 7006 | const char *LinkingOutput) { | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7007 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7008 | const Driver &D = HTC.getDriver(); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7009 |  | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7010 | //---------------------------------------------------------------------------- | 
|  | 7011 | // | 
|  | 7012 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7013 | bool IsStatic = Args.hasArg(options::OPT_static); | 
|  | 7014 | bool IsShared = Args.hasArg(options::OPT_shared); | 
|  | 7015 | bool IsPIE = Args.hasArg(options::OPT_pie); | 
|  | 7016 | bool IncStdLib = !Args.hasArg(options::OPT_nostdlib); | 
|  | 7017 | bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles); | 
|  | 7018 | bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs); | 
|  | 7019 | bool UseG0 = false; | 
|  | 7020 | bool UseShared = IsShared && !IsStatic; | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7021 |  | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7022 | //---------------------------------------------------------------------------- | 
|  | 7023 | // Silence warnings for various options | 
|  | 7024 | //---------------------------------------------------------------------------- | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7025 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 7026 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 7027 | Args.ClaimAllArgs(options::OPT_w); // Other warning options are already | 
|  | 7028 | // handled somewhere else. | 
|  | 7029 | Args.ClaimAllArgs(options::OPT_static_libgcc); | 
|  | 7030 |  | 
|  | 7031 | //---------------------------------------------------------------------------- | 
|  | 7032 | // | 
|  | 7033 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7034 | if (Args.hasArg(options::OPT_s)) | 
|  | 7035 | CmdArgs.push_back("-s"); | 
|  | 7036 |  | 
|  | 7037 | if (Args.hasArg(options::OPT_r)) | 
|  | 7038 | CmdArgs.push_back("-r"); | 
|  | 7039 |  | 
|  | 7040 | for (const auto &Opt : HTC.ExtraOpts) | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 7041 | CmdArgs.push_back(Opt.c_str()); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7042 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7043 | CmdArgs.push_back("-march=hexagon"); | 
|  | 7044 | std::string CpuVer = | 
|  | 7045 | toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str(); | 
|  | 7046 | std::string MCpuString = "-mcpu=hexagon" + CpuVer; | 
|  | 7047 | CmdArgs.push_back(Args.MakeArgString(MCpuString)); | 
| Sebastian Pop | 8650028 | 2012-01-13 20:37:10 +0000 | [diff] [blame] | 7048 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7049 | if (IsShared) { | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7050 | CmdArgs.push_back("-shared"); | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7051 | // The following should be the default, but doing as hexagon-gcc does. | 
|  | 7052 | CmdArgs.push_back("-call_shared"); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7053 | } | 
|  | 7054 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7055 | if (IsStatic) | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7056 | CmdArgs.push_back("-static"); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7057 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7058 | if (IsPIE && !IsShared) | 
| Matthew Curtis | e8f80a1 | 2012-12-06 17:49:03 +0000 | [diff] [blame] | 7059 | CmdArgs.push_back("-pie"); | 
|  | 7060 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7061 | if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) { | 
|  | 7062 | std::string N = llvm::utostr(G.getValue()); | 
|  | 7063 | CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N)); | 
|  | 7064 | UseG0 = G.getValue() == 0; | 
| Matthew Curtis | e8f80a1 | 2012-12-06 17:49:03 +0000 | [diff] [blame] | 7065 | } | 
|  | 7066 |  | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7067 | //---------------------------------------------------------------------------- | 
|  | 7068 | // | 
|  | 7069 | //---------------------------------------------------------------------------- | 
|  | 7070 | CmdArgs.push_back("-o"); | 
|  | 7071 | CmdArgs.push_back(Output.getFilename()); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7072 |  | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7073 | //---------------------------------------------------------------------------- | 
|  | 7074 | // moslib | 
|  | 7075 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7076 | std::vector<std::string> OsLibs; | 
|  | 7077 | bool HasStandalone = false; | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7078 |  | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 7079 | for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) { | 
|  | 7080 | A->claim(); | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7081 | OsLibs.emplace_back(A->getValue()); | 
|  | 7082 | HasStandalone = HasStandalone || (OsLibs.back() == "standalone"); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7083 | } | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7084 | if (OsLibs.empty()) { | 
|  | 7085 | OsLibs.push_back("standalone"); | 
|  | 7086 | HasStandalone = true; | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7087 | } | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7088 |  | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7089 | //---------------------------------------------------------------------------- | 
|  | 7090 | // Start Files | 
|  | 7091 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7092 | const std::string MCpuSuffix = "/" + CpuVer; | 
|  | 7093 | const std::string MCpuG0Suffix = MCpuSuffix + "/G0"; | 
|  | 7094 | const std::string RootDir = | 
|  | 7095 | HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/"; | 
|  | 7096 | const std::string StartSubDir = | 
|  | 7097 | "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7098 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7099 | auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir, | 
|  | 7100 | const char *Name) -> std::string { | 
|  | 7101 | std::string RelName = SubDir + Name; | 
|  | 7102 | std::string P = HTC.GetFilePath(RelName.c_str()); | 
|  | 7103 | if (llvm::sys::fs::exists(P)) | 
|  | 7104 | return P; | 
|  | 7105 | return RootDir + RelName; | 
|  | 7106 | }; | 
|  | 7107 |  | 
|  | 7108 | if (IncStdLib && IncStartFiles) { | 
|  | 7109 | if (!IsShared) { | 
|  | 7110 | if (HasStandalone) { | 
|  | 7111 | std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o"); | 
|  | 7112 | CmdArgs.push_back(Args.MakeArgString(Crt0SA)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7113 | } | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7114 | std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o"); | 
|  | 7115 | CmdArgs.push_back(Args.MakeArgString(Crt0)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7116 | } | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7117 | std::string Init = UseShared | 
|  | 7118 | ? Find(RootDir, StartSubDir + "/pic", "/initS.o") | 
|  | 7119 | : Find(RootDir, StartSubDir, "/init.o"); | 
|  | 7120 | CmdArgs.push_back(Args.MakeArgString(Init)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7121 | } | 
|  | 7122 |  | 
|  | 7123 | //---------------------------------------------------------------------------- | 
|  | 7124 | // Library Search Paths | 
|  | 7125 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7126 | const ToolChain::path_list &LibPaths = HTC.getFilePaths(); | 
|  | 7127 | for (const auto &LibPath : LibPaths) | 
|  | 7128 | CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7129 |  | 
|  | 7130 | //---------------------------------------------------------------------------- | 
|  | 7131 | // | 
|  | 7132 | //---------------------------------------------------------------------------- | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 7133 | Args.AddAllArgs(CmdArgs, | 
|  | 7134 | {options::OPT_T_Group, options::OPT_e, options::OPT_s, | 
|  | 7135 | options::OPT_t, options::OPT_u_Group}); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7136 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7137 | AddLinkerInputs(HTC, Inputs, Args, CmdArgs); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7138 |  | 
|  | 7139 | //---------------------------------------------------------------------------- | 
|  | 7140 | // Libraries | 
|  | 7141 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7142 | if (IncStdLib && IncDefLibs) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 7143 | if (D.CCCIsCXX()) { | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7144 | HTC.AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7145 | CmdArgs.push_back("-lm"); | 
|  | 7146 | } | 
|  | 7147 |  | 
|  | 7148 | CmdArgs.push_back("--start-group"); | 
|  | 7149 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7150 | if (!IsShared) { | 
|  | 7151 | for (const std::string &Lib : OsLibs) | 
| Douglas Katzman | 2675d01 | 2015-06-29 19:12:56 +0000 | [diff] [blame] | 7152 | CmdArgs.push_back(Args.MakeArgString("-l" + Lib)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7153 | CmdArgs.push_back("-lc"); | 
|  | 7154 | } | 
|  | 7155 | CmdArgs.push_back("-lgcc"); | 
|  | 7156 |  | 
|  | 7157 | CmdArgs.push_back("--end-group"); | 
|  | 7158 | } | 
|  | 7159 |  | 
|  | 7160 | //---------------------------------------------------------------------------- | 
|  | 7161 | // End files | 
|  | 7162 | //---------------------------------------------------------------------------- | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7163 | if (IncStdLib && IncStartFiles) { | 
|  | 7164 | std::string Fini = UseShared | 
|  | 7165 | ? Find(RootDir, StartSubDir + "/pic", "/finiS.o") | 
|  | 7166 | : Find(RootDir, StartSubDir, "/fini.o"); | 
|  | 7167 | CmdArgs.push_back(Args.MakeArgString(Fini)); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7168 | } | 
| Ikhlas Ajbar | 71d19f3 | 2015-05-09 02:13:25 +0000 | [diff] [blame] | 7169 | } | 
|  | 7170 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7171 | void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7172 | const InputInfo &Output, | 
|  | 7173 | const InputInfoList &Inputs, | 
|  | 7174 | const ArgList &Args, | 
|  | 7175 | const char *LinkingOutput) const { | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7176 | auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain()); | 
| Ikhlas Ajbar | 71d19f3 | 2015-05-09 02:13:25 +0000 | [diff] [blame] | 7177 |  | 
|  | 7178 | ArgStringList CmdArgs; | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7179 | constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs, | 
| Ikhlas Ajbar | 71d19f3 | 2015-05-09 02:13:25 +0000 | [diff] [blame] | 7180 | LinkingOutput); | 
| Matthew Curtis | e689b05 | 2012-12-06 15:46:07 +0000 | [diff] [blame] | 7181 |  | 
| Krzysztof Parzyszek | 1e6e3c6 | 2015-12-14 15:03:57 +0000 | [diff] [blame] | 7182 | std::string Linker = HTC.GetProgramPath("hexagon-link"); | 
| David Blaikie | c11bf80 | 2014-09-04 16:04:28 +0000 | [diff] [blame] | 7183 | C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 7184 | CmdArgs, Inputs)); | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7185 | } | 
|  | 7186 | // Hexagon tools end. | 
|  | 7187 |  | 
| Tom Stellard | 8fa3309 | 2015-07-18 01:49:05 +0000 | [diff] [blame] | 7188 | void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7189 | const InputInfo &Output, | 
|  | 7190 | const InputInfoList &Inputs, | 
|  | 7191 | const ArgList &Args, | 
|  | 7192 | const char *LinkingOutput) const { | 
|  | 7193 |  | 
|  | 7194 | std::string Linker = getToolChain().GetProgramPath(getShortName()); | 
|  | 7195 | ArgStringList CmdArgs; | 
| Tom Stellard | 8fa3309 | 2015-07-18 01:49:05 +0000 | [diff] [blame] | 7196 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
| Tom Stellard | f6699f5 | 2016-05-05 17:03:41 +0000 | [diff] [blame] | 7197 | CmdArgs.push_back("-shared"); | 
|  | 7198 | CmdArgs.push_back("-o"); | 
| Tom Stellard | 8fa3309 | 2015-07-18 01:49:05 +0000 | [diff] [blame] | 7199 | CmdArgs.push_back(Output.getFilename()); | 
|  | 7200 | C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker), | 
|  | 7201 | CmdArgs, Inputs)); | 
|  | 7202 | } | 
|  | 7203 | // AMDGPU tools end. | 
|  | 7204 |  | 
| Dan Gohman | 5281686 | 2015-12-16 23:30:41 +0000 | [diff] [blame] | 7205 | wasm::Linker::Linker(const ToolChain &TC) | 
|  | 7206 | : GnuTool("wasm::Linker", "lld", TC) {} | 
|  | 7207 |  | 
|  | 7208 | bool wasm::Linker::isLinkJob() const { | 
|  | 7209 | return true; | 
|  | 7210 | } | 
|  | 7211 |  | 
|  | 7212 | bool wasm::Linker::hasIntegratedCPP() const { | 
|  | 7213 | return false; | 
|  | 7214 | } | 
|  | 7215 |  | 
|  | 7216 | void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7217 | const InputInfo &Output, | 
|  | 7218 | const InputInfoList &Inputs, | 
|  | 7219 | const ArgList &Args, | 
|  | 7220 | const char *LinkingOutput) const { | 
| Dan Gohman | 57b62c5 | 2016-02-22 19:26:15 +0000 | [diff] [blame] | 7221 |  | 
|  | 7222 | const ToolChain &ToolChain = getToolChain(); | 
|  | 7223 | const Driver &D = ToolChain.getDriver(); | 
|  | 7224 | const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath()); | 
| Dan Gohman | 5281686 | 2015-12-16 23:30:41 +0000 | [diff] [blame] | 7225 | ArgStringList CmdArgs; | 
|  | 7226 | CmdArgs.push_back("-flavor"); | 
|  | 7227 | CmdArgs.push_back("ld"); | 
| Dan Gohman | 1aa5828 | 2016-01-06 19:43:32 +0000 | [diff] [blame] | 7228 |  | 
|  | 7229 | // Enable garbage collection of unused input sections by default, since code | 
| Dan Gohman | a5b804b | 2016-01-07 00:50:27 +0000 | [diff] [blame] | 7230 | // size is of particular importance. This is significantly facilitated by | 
|  | 7231 | // the enabling of -ffunction-sections and -fdata-sections in | 
|  | 7232 | // Clang::ConstructJob. | 
| Dan Gohman | 4e48020 | 2016-01-07 00:32:04 +0000 | [diff] [blame] | 7233 | if (areOptimizationsEnabled(Args)) | 
|  | 7234 | CmdArgs.push_back("--gc-sections"); | 
| Dan Gohman | 1aa5828 | 2016-01-06 19:43:32 +0000 | [diff] [blame] | 7235 |  | 
| Dan Gohman | 57b62c5 | 2016-02-22 19:26:15 +0000 | [diff] [blame] | 7236 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 7237 | CmdArgs.push_back("-export-dynamic"); | 
|  | 7238 | if (Args.hasArg(options::OPT_s)) | 
|  | 7239 | CmdArgs.push_back("--strip-all"); | 
|  | 7240 | if (Args.hasArg(options::OPT_shared)) | 
|  | 7241 | CmdArgs.push_back("-shared"); | 
|  | 7242 | if (Args.hasArg(options::OPT_static)) | 
|  | 7243 | CmdArgs.push_back("-Bstatic"); | 
|  | 7244 |  | 
|  | 7245 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
|  | 7246 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
|  | 7247 |  | 
|  | 7248 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
|  | 7249 | if (Args.hasArg(options::OPT_shared)) | 
|  | 7250 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o"))); | 
|  | 7251 | else if (Args.hasArg(options::OPT_pie)) | 
|  | 7252 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o"))); | 
|  | 7253 | else | 
|  | 7254 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); | 
|  | 7255 |  | 
|  | 7256 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); | 
|  | 7257 | } | 
|  | 7258 |  | 
|  | 7259 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
|  | 7260 |  | 
|  | 7261 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
|  | 7262 | if (D.CCCIsCXX()) | 
|  | 7263 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 7264 |  | 
|  | 7265 | if (Args.hasArg(options::OPT_pthread)) | 
|  | 7266 | CmdArgs.push_back("-lpthread"); | 
|  | 7267 |  | 
|  | 7268 | CmdArgs.push_back("-lc"); | 
|  | 7269 | CmdArgs.push_back("-lcompiler_rt"); | 
|  | 7270 | } | 
|  | 7271 |  | 
|  | 7272 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) | 
|  | 7273 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); | 
|  | 7274 |  | 
| Dan Gohman | 5281686 | 2015-12-16 23:30:41 +0000 | [diff] [blame] | 7275 | CmdArgs.push_back("-o"); | 
|  | 7276 | CmdArgs.push_back(Output.getFilename()); | 
| Dan Gohman | 57b62c5 | 2016-02-22 19:26:15 +0000 | [diff] [blame] | 7277 |  | 
| Dan Gohman | 5281686 | 2015-12-16 23:30:41 +0000 | [diff] [blame] | 7278 | C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs)); | 
|  | 7279 | } | 
|  | 7280 |  | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 7281 | const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) { | 
| Gabor Ballabas | cebcb3b | 2015-06-11 12:29:56 +0000 | [diff] [blame] | 7282 | std::string MArch; | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 7283 | if (!Arch.empty()) | 
|  | 7284 | MArch = Arch; | 
|  | 7285 | else | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7286 | MArch = Triple.getArchName(); | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 7287 | MArch = StringRef(MArch).split("+").first.lower(); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7288 |  | 
|  | 7289 | // Handle -march=native. | 
|  | 7290 | if (MArch == "native") { | 
|  | 7291 | std::string CPU = llvm::sys::getHostCPUName(); | 
|  | 7292 | if (CPU != "generic") { | 
|  | 7293 | // Translate the native cpu into the architecture suffix for that CPU. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 7294 | StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7295 | // If there is no valid architecture suffix for this CPU we don't know how | 
|  | 7296 | // to handle it, so return no architecture. | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7297 | if (Suffix.empty()) | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7298 | MArch = ""; | 
|  | 7299 | else | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7300 | MArch = std::string("arm") + Suffix.str(); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7301 | } | 
|  | 7302 | } | 
|  | 7303 |  | 
| Vladimir Sukharev | c6dab75 | 2015-05-14 08:25:18 +0000 | [diff] [blame] | 7304 | return MArch; | 
|  | 7305 | } | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7306 |  | 
| Vladimir Sukharev | c6dab75 | 2015-05-14 08:25:18 +0000 | [diff] [blame] | 7307 | /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting. | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7308 | StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) { | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 7309 | std::string MArch = getARMArch(Arch, Triple); | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7310 | // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch | 
|  | 7311 | // here means an -march=native that we can't handle, so instead return no CPU. | 
|  | 7312 | if (MArch.empty()) | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7313 | return StringRef(); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7314 |  | 
| John Brawn | a95c1a8 | 2015-05-08 12:52:18 +0000 | [diff] [blame] | 7315 | // We need to return an empty string here on invalid MArch values as the | 
|  | 7316 | // various places that call this function can't cope with a null result. | 
| Chandler Carruth | d96f37a | 2015-08-30 07:51:18 +0000 | [diff] [blame] | 7317 | return Triple.getARMCPUForArch(MArch); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7318 | } | 
|  | 7319 |  | 
|  | 7320 | /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 7321 | std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch, | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7322 | const llvm::Triple &Triple) { | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7323 | // FIXME: Warn on inconsistent use of -mcpu and -march. | 
|  | 7324 | // If we have -mcpu=, use that. | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 7325 | if (!CPU.empty()) { | 
| Bradley Smith | bbf5a00 | 2015-11-18 16:33:48 +0000 | [diff] [blame] | 7326 | std::string MCPU = StringRef(CPU).split("+").first.lower(); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7327 | // Handle -mcpu=native. | 
|  | 7328 | if (MCPU == "native") | 
| Rafael Espindola | 9c5ef12 | 2013-12-12 15:39:05 +0000 | [diff] [blame] | 7329 | return llvm::sys::getHostCPUName(); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7330 | else | 
| Rafael Espindola | 80d333b | 2013-12-12 15:48:19 +0000 | [diff] [blame] | 7331 | return MCPU; | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7332 | } | 
|  | 7333 |  | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 7334 | return getARMCPUForMArch(Arch, Triple); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7335 | } | 
|  | 7336 |  | 
|  | 7337 | /// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular | 
| Vladimir Sukharev | c6dab75 | 2015-05-14 08:25:18 +0000 | [diff] [blame] | 7338 | /// CPU  (or Arch, if CPU is generic). | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7339 | // FIXME: This is redundant with -mcpu, why does LLVM use this. | 
| Vladimir Sukharev | 64f6824 | 2015-09-23 09:29:32 +0000 | [diff] [blame] | 7340 | StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch, | 
|  | 7341 | const llvm::Triple &Triple) { | 
|  | 7342 | unsigned ArchKind; | 
| Vladimir Sukharev | 64f6824 | 2015-09-23 09:29:32 +0000 | [diff] [blame] | 7343 | if (CPU == "generic") { | 
| Vladimir Sukharev | a317dfb | 2015-09-24 10:06:44 +0000 | [diff] [blame] | 7344 | std::string ARMArch = tools::arm::getARMArch(Arch, Triple); | 
| Vladimir Sukharev | 2eef4b5 | 2015-09-24 09:55:08 +0000 | [diff] [blame] | 7345 | ArchKind = llvm::ARM::parseArch(ARMArch); | 
| Vladimir Sukharev | 64f6824 | 2015-09-23 09:29:32 +0000 | [diff] [blame] | 7346 | if (ArchKind == llvm::ARM::AK_INVALID) | 
|  | 7347 | // In case of generic Arch, i.e. "arm", | 
|  | 7348 | // extract arch from default cpu of the Triple | 
| Vladimir Sukharev | 2eef4b5 | 2015-09-24 09:55:08 +0000 | [diff] [blame] | 7349 | ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch)); | 
| Vladimir Sukharev | 64f6824 | 2015-09-23 09:29:32 +0000 | [diff] [blame] | 7350 | } else { | 
| Tim Northover | 6f3ff22 | 2015-10-30 16:30:27 +0000 | [diff] [blame] | 7351 | // FIXME: horrible hack to get around the fact that Cortex-A7 is only an | 
|  | 7352 | // armv7k triple if it's actually been specified via "-arch armv7k". | 
|  | 7353 | ArchKind = (Arch == "armv7k" || Arch == "thumbv7k") | 
| Aaron Ballman | 4305910 | 2015-11-04 14:43:43 +0000 | [diff] [blame] | 7354 | ? (unsigned)llvm::ARM::AK_ARMV7K | 
| Tim Northover | 6f3ff22 | 2015-10-30 16:30:27 +0000 | [diff] [blame] | 7355 | : llvm::ARM::parseCPUArch(CPU); | 
| Vladimir Sukharev | 64f6824 | 2015-09-23 09:29:32 +0000 | [diff] [blame] | 7356 | } | 
| Renato Golin | 3c00725 | 2015-05-28 15:05:53 +0000 | [diff] [blame] | 7357 | if (ArchKind == llvm::ARM::AK_INVALID) | 
|  | 7358 | return ""; | 
| Chandler Carruth | aa0caeb | 2015-08-30 02:16:36 +0000 | [diff] [blame] | 7359 | return llvm::ARM::getSubArch(ArchKind); | 
| Bernard Ogden | 3156176 | 2013-12-12 13:27:11 +0000 | [diff] [blame] | 7360 | } | 
|  | 7361 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7362 | void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs, | 
| Vladimir Sukharev | c6dab75 | 2015-05-14 08:25:18 +0000 | [diff] [blame] | 7363 | const llvm::Triple &Triple) { | 
| Joerg Sonnenberger | 1689d3f | 2015-01-28 23:30:39 +0000 | [diff] [blame] | 7364 | if (Args.hasArg(options::OPT_r)) | 
|  | 7365 | return; | 
|  | 7366 |  | 
| John Brawn | 94fd963 | 2015-05-21 12:19:49 +0000 | [diff] [blame] | 7367 | // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker | 
|  | 7368 | // to generate BE-8 executables. | 
|  | 7369 | if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple)) | 
|  | 7370 | CmdArgs.push_back("--be8"); | 
| Joerg Sonnenberger | 1689d3f | 2015-01-28 23:30:39 +0000 | [diff] [blame] | 7371 | } | 
|  | 7372 |  | 
| Petar Jovanovic | 1dbc317 | 2015-04-14 12:49:08 +0000 | [diff] [blame] | 7373 | mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) { | 
| Daniel Sanders | e0395a7 | 2015-09-24 10:22:17 +0000 | [diff] [blame] | 7374 | // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008 | 
|  | 7375 | // was first introduced in Release 3. However, other compilers have | 
|  | 7376 | // traditionally allowed it for Release 2 so we should do the same. | 
| Petar Jovanovic | 1dbc317 | 2015-04-14 12:49:08 +0000 | [diff] [blame] | 7377 | return (NanEncoding)llvm::StringSwitch<int>(CPU) | 
|  | 7378 | .Case("mips1", NanLegacy) | 
|  | 7379 | .Case("mips2", NanLegacy) | 
|  | 7380 | .Case("mips3", NanLegacy) | 
|  | 7381 | .Case("mips4", NanLegacy) | 
|  | 7382 | .Case("mips5", NanLegacy) | 
|  | 7383 | .Case("mips32", NanLegacy) | 
| Daniel Sanders | e0395a7 | 2015-09-24 10:22:17 +0000 | [diff] [blame] | 7384 | .Case("mips32r2", NanLegacy | Nan2008) | 
| Petar Jovanovic | 1dbc317 | 2015-04-14 12:49:08 +0000 | [diff] [blame] | 7385 | .Case("mips32r3", NanLegacy | Nan2008) | 
|  | 7386 | .Case("mips32r5", NanLegacy | Nan2008) | 
|  | 7387 | .Case("mips32r6", Nan2008) | 
|  | 7388 | .Case("mips64", NanLegacy) | 
| Daniel Sanders | e0395a7 | 2015-09-24 10:22:17 +0000 | [diff] [blame] | 7389 | .Case("mips64r2", NanLegacy | Nan2008) | 
| Petar Jovanovic | 1dbc317 | 2015-04-14 12:49:08 +0000 | [diff] [blame] | 7390 | .Case("mips64r3", NanLegacy | Nan2008) | 
|  | 7391 | .Case("mips64r5", NanLegacy | Nan2008) | 
|  | 7392 | .Case("mips64r6", Nan2008) | 
|  | 7393 | .Default(NanLegacy); | 
|  | 7394 | } | 
|  | 7395 |  | 
| Simon Dardis | d0e83ba | 2016-05-27 15:13:31 +0000 | [diff] [blame] | 7396 | bool mips::hasCompactBranches(StringRef &CPU) { | 
|  | 7397 | // mips32r6 and mips64r6 have compact branches. | 
|  | 7398 | return llvm::StringSwitch<bool>(CPU) | 
|  | 7399 | .Case("mips32r6", true) | 
|  | 7400 | .Case("mips64r6", true) | 
|  | 7401 | .Default(false); | 
|  | 7402 | } | 
|  | 7403 |  | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 7404 | bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) { | 
|  | 7405 | Arg *A = Args.getLastArg(options::OPT_mabi_EQ); | 
|  | 7406 | return A && (A->getValue() == StringRef(Value)); | 
|  | 7407 | } | 
|  | 7408 |  | 
| Simon Atanasyan | d95c67d | 2014-08-13 14:34:14 +0000 | [diff] [blame] | 7409 | bool mips::isUCLibc(const ArgList &Args) { | 
|  | 7410 | Arg *A = Args.getLastArg(options::OPT_m_libc_Group); | 
| Rafael Espindola | d3d657c | 2014-08-13 17:15:42 +0000 | [diff] [blame] | 7411 | return A && A->getOption().matches(options::OPT_muclibc); | 
| Simon Atanasyan | d95c67d | 2014-08-13 14:34:14 +0000 | [diff] [blame] | 7412 | } | 
|  | 7413 |  | 
| Daniel Sanders | 2bf1366 | 2014-07-10 14:40:57 +0000 | [diff] [blame] | 7414 | bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) { | 
| Daniel Sanders | 3b92c5b | 2014-06-24 15:04:16 +0000 | [diff] [blame] | 7415 | if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ)) | 
|  | 7416 | return llvm::StringSwitch<bool>(NaNArg->getValue()) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7417 | .Case("2008", true) | 
|  | 7418 | .Case("legacy", false) | 
|  | 7419 | .Default(false); | 
| Daniel Sanders | 3b92c5b | 2014-06-24 15:04:16 +0000 | [diff] [blame] | 7420 |  | 
|  | 7421 | // NaN2008 is the default for MIPS32r6/MIPS64r6. | 
| Daniel Sanders | 2bf1366 | 2014-07-10 14:40:57 +0000 | [diff] [blame] | 7422 | return llvm::StringSwitch<bool>(getCPUName(Args, Triple)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7423 | .Cases("mips32r6", "mips64r6", true) | 
|  | 7424 | .Default(false); | 
| Daniel Sanders | 3b92c5b | 2014-06-24 15:04:16 +0000 | [diff] [blame] | 7425 |  | 
|  | 7426 | return false; | 
|  | 7427 | } | 
|  | 7428 |  | 
| Petar Jovanovic | 3ca1622 | 2016-05-18 12:46:06 +0000 | [diff] [blame] | 7429 | bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) { | 
|  | 7430 | if (!Triple.isAndroid()) | 
|  | 7431 | return false; | 
|  | 7432 |  | 
|  | 7433 | // Android MIPS32R6 defaults to FP64A. | 
|  | 7434 | return llvm::StringSwitch<bool>(CPUName) | 
|  | 7435 | .Case("mips32r6", true) | 
|  | 7436 | .Default(false); | 
|  | 7437 | } | 
|  | 7438 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 7439 | bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName, | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 7440 | StringRef ABIName, mips::FloatABI FloatABI) { | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 7441 | if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies && | 
| Petar Jovanovic | 3ca1622 | 2016-05-18 12:46:06 +0000 | [diff] [blame] | 7442 | Triple.getVendor() != llvm::Triple::MipsTechnologies && | 
|  | 7443 | !Triple.isAndroid()) | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 7444 | return false; | 
|  | 7445 |  | 
|  | 7446 | if (ABIName != "32") | 
|  | 7447 | return false; | 
|  | 7448 |  | 
| Toma Tabacu | 94ea686 | 2015-06-16 13:54:13 +0000 | [diff] [blame] | 7449 | // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is | 
|  | 7450 | // present. | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 7451 | if (FloatABI == mips::FloatABI::Soft) | 
| Toma Tabacu | 94ea686 | 2015-06-16 13:54:13 +0000 | [diff] [blame] | 7452 | return false; | 
|  | 7453 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 7454 | return llvm::StringSwitch<bool>(CPUName) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7455 | .Cases("mips2", "mips3", "mips4", "mips5", true) | 
|  | 7456 | .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true) | 
|  | 7457 | .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true) | 
|  | 7458 | .Default(false); | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 7459 | } | 
|  | 7460 |  | 
| Toma Tabacu | 94ea686 | 2015-06-16 13:54:13 +0000 | [diff] [blame] | 7461 | bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple, | 
|  | 7462 | StringRef CPUName, StringRef ABIName, | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 7463 | mips::FloatABI FloatABI) { | 
| Toma Tabacu | 94ea686 | 2015-06-16 13:54:13 +0000 | [diff] [blame] | 7464 | bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI); | 
|  | 7465 |  | 
|  | 7466 | // FPXX shouldn't be used if -msingle-float is present. | 
|  | 7467 | if (Arg *A = Args.getLastArg(options::OPT_msingle_float, | 
|  | 7468 | options::OPT_mdouble_float)) | 
|  | 7469 | if (A->getOption().matches(options::OPT_msingle_float)) | 
|  | 7470 | UseFPXX = false; | 
|  | 7471 |  | 
|  | 7472 | return UseFPXX; | 
|  | 7473 | } | 
|  | 7474 |  | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7475 | llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) { | 
| Rafael Espindola | dcbf698 | 2012-10-31 18:51:07 +0000 | [diff] [blame] | 7476 | // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for | 
|  | 7477 | // archs which Darwin doesn't use. | 
|  | 7478 |  | 
|  | 7479 | // The matching this routine does is fairly pointless, since it is neither the | 
|  | 7480 | // complete architecture list, nor a reasonable subset. The problem is that | 
|  | 7481 | // historically the driver driver accepts this and also ties its -march= | 
|  | 7482 | // handling to the architecture name, so we need to be careful before removing | 
|  | 7483 | // support for it. | 
|  | 7484 |  | 
|  | 7485 | // This code must be kept in sync with Clang's Darwin specific argument | 
|  | 7486 | // translation. | 
|  | 7487 |  | 
|  | 7488 | return llvm::StringSwitch<llvm::Triple::ArchType>(Str) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7489 | .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc) | 
|  | 7490 | .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc) | 
|  | 7491 | .Case("ppc64", llvm::Triple::ppc64) | 
|  | 7492 | .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86) | 
|  | 7493 | .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4", | 
|  | 7494 | llvm::Triple::x86) | 
|  | 7495 | .Cases("x86_64", "x86_64h", llvm::Triple::x86_64) | 
|  | 7496 | // This is derived from the driver driver. | 
|  | 7497 | .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm) | 
|  | 7498 | .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm) | 
|  | 7499 | .Cases("armv7s", "xscale", llvm::Triple::arm) | 
|  | 7500 | .Case("arm64", llvm::Triple::aarch64) | 
|  | 7501 | .Case("r600", llvm::Triple::r600) | 
|  | 7502 | .Case("amdgcn", llvm::Triple::amdgcn) | 
|  | 7503 | .Case("nvptx", llvm::Triple::nvptx) | 
|  | 7504 | .Case("nvptx64", llvm::Triple::nvptx64) | 
|  | 7505 | .Case("amdil", llvm::Triple::amdil) | 
|  | 7506 | .Case("spir", llvm::Triple::spir) | 
|  | 7507 | .Default(llvm::Triple::UnknownArch); | 
| Rafael Espindola | dcbf698 | 2012-10-31 18:51:07 +0000 | [diff] [blame] | 7508 | } | 
| Tony Linthicum | 76329bf | 2011-12-12 21:14:55 +0000 | [diff] [blame] | 7509 |  | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7510 | void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) { | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 7511 | const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str); | 
| Zijiao Ma | 56a8372 | 2016-08-17 02:13:33 +0000 | [diff] [blame] | 7512 | unsigned ArchKind = llvm::ARM::parseArch(Str); | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7513 | T.setArch(Arch); | 
|  | 7514 |  | 
|  | 7515 | if (Str == "x86_64h") | 
|  | 7516 | T.setArchName(Str); | 
| Zijiao Ma | 56a8372 | 2016-08-17 02:13:33 +0000 | [diff] [blame] | 7517 | else if (ArchKind == llvm::ARM::AK_ARMV6M || | 
|  | 7518 | ArchKind == llvm::ARM::AK_ARMV7M || | 
|  | 7519 | ArchKind == llvm::ARM::AK_ARMV7EM) { | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7520 | T.setOS(llvm::Triple::UnknownOS); | 
| Saleem Abdulrasool | 29b82b6 | 2014-03-06 20:47:19 +0000 | [diff] [blame] | 7521 | T.setObjectFormat(llvm::Triple::MachO); | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7522 | } | 
|  | 7523 | } | 
|  | 7524 |  | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 7525 | const char *Clang::getBaseInputName(const ArgList &Args, | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 7526 | const InputInfo &Input) { | 
|  | 7527 | return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput())); | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7528 | } | 
|  | 7529 |  | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 7530 | const char *Clang::getBaseInputStem(const ArgList &Args, | 
|  | 7531 | const InputInfoList &Inputs) { | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 7532 | const char *Str = getBaseInputName(Args, Inputs[0]); | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7533 |  | 
| Chris Lattner | 906bb90 | 2011-01-16 08:14:11 +0000 | [diff] [blame] | 7534 | if (const char *End = strrchr(Str, '.')) | 
| Daniel Dunbar | 1c28f1e | 2009-09-09 22:32:48 +0000 | [diff] [blame] | 7535 | return Args.MakeArgString(std::string(Str, End)); | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7536 |  | 
|  | 7537 | return Str; | 
|  | 7538 | } | 
|  | 7539 |  | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 7540 | const char *Clang::getDependencyFileName(const ArgList &Args, | 
|  | 7541 | const InputInfoList &Inputs) { | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7542 | // FIXME: Think about this more. | 
|  | 7543 | std::string Res; | 
|  | 7544 |  | 
|  | 7545 | if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) { | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 7546 | std::string Str(OutputOpt->getValue()); | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7547 | Res = Str.substr(0, Str.rfind('.')); | 
| Chad Rosier | 6fdf38b | 2011-08-17 23:08:45 +0000 | [diff] [blame] | 7548 | } else { | 
| Bob Wilson | decc03e | 2012-11-23 06:14:39 +0000 | [diff] [blame] | 7549 | Res = getBaseInputStem(Args, Inputs); | 
| Chad Rosier | 6fdf38b | 2011-08-17 23:08:45 +0000 | [diff] [blame] | 7550 | } | 
| Daniel Dunbar | 1c28f1e | 2009-09-09 22:32:48 +0000 | [diff] [blame] | 7551 | return Args.MakeArgString(Res + ".d"); | 
| Daniel Dunbar | afec1f5 | 2009-03-29 18:40:18 +0000 | [diff] [blame] | 7552 | } | 
|  | 7553 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7554 | void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7555 | const InputInfo &Output, | 
|  | 7556 | const InputInfoList &Inputs, | 
|  | 7557 | const ArgList &Args, | 
|  | 7558 | const char *LinkingOutput) const { | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7559 | const ToolChain &ToolChain = getToolChain(); | 
|  | 7560 | const Driver &D = ToolChain.getDriver(); | 
|  | 7561 | ArgStringList CmdArgs; | 
|  | 7562 |  | 
|  | 7563 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 7564 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 7565 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 7566 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 7567 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 7568 | // handled somewhere else. | 
|  | 7569 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 7570 |  | 
|  | 7571 | if (!D.SysRoot.empty()) | 
|  | 7572 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 7573 |  | 
|  | 7574 | // CloudABI only supports static linkage. | 
|  | 7575 | CmdArgs.push_back("-Bstatic"); | 
| Ed Schouten | 506f295 | 2016-04-06 15:37:06 +0000 | [diff] [blame] | 7576 | CmdArgs.push_back("--no-dynamic-linker"); | 
| Ed Schouten | 610adae | 2016-08-11 20:03:22 +0000 | [diff] [blame] | 7577 |  | 
|  | 7578 | // Provide PIE linker flags in case PIE is default for the architecture. | 
|  | 7579 | if (ToolChain.isPIEDefault()) { | 
|  | 7580 | CmdArgs.push_back("-pie"); | 
|  | 7581 | CmdArgs.push_back("-zrelro"); | 
|  | 7582 | } | 
| Ed Schouten | 506f295 | 2016-04-06 15:37:06 +0000 | [diff] [blame] | 7583 |  | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7584 | CmdArgs.push_back("--eh-frame-hdr"); | 
|  | 7585 | CmdArgs.push_back("--gc-sections"); | 
|  | 7586 |  | 
|  | 7587 | if (Output.isFilename()) { | 
|  | 7588 | CmdArgs.push_back("-o"); | 
|  | 7589 | CmdArgs.push_back(Output.getFilename()); | 
|  | 7590 | } else { | 
|  | 7591 | assert(Output.isNothing() && "Invalid output."); | 
|  | 7592 | } | 
|  | 7593 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 7594 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7595 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); | 
|  | 7596 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o"))); | 
|  | 7597 | } | 
|  | 7598 |  | 
|  | 7599 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 7600 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 7601 | Args.AddAllArgs(CmdArgs, | 
|  | 7602 | {options::OPT_T_Group, options::OPT_e, options::OPT_s, | 
|  | 7603 | options::OPT_t, options::OPT_Z_Flag, options::OPT_r}); | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7604 |  | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 7605 | if (D.isUsingLTO()) | 
|  | 7606 | AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7607 |  | 
|  | 7608 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
|  | 7609 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 7610 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7611 | if (D.CCCIsCXX()) | 
|  | 7612 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 7613 | CmdArgs.push_back("-lc"); | 
|  | 7614 | CmdArgs.push_back("-lcompiler_rt"); | 
|  | 7615 | } | 
|  | 7616 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 7617 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7618 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); | 
|  | 7619 |  | 
|  | 7620 | const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 7621 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Ed Schouten | 3c3e58c | 2015-03-26 11:13:44 +0000 | [diff] [blame] | 7622 | } | 
|  | 7623 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7624 | void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7625 | const InputInfo &Output, | 
|  | 7626 | const InputInfoList &Inputs, | 
|  | 7627 | const ArgList &Args, | 
|  | 7628 | const char *LinkingOutput) const { | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7629 | ArgStringList CmdArgs; | 
|  | 7630 |  | 
|  | 7631 | assert(Inputs.size() == 1 && "Unexpected number of inputs."); | 
|  | 7632 | const InputInfo &Input = Inputs[0]; | 
|  | 7633 |  | 
| Daniel Dunbar | dc8355e | 2011-04-12 23:59:20 +0000 | [diff] [blame] | 7634 | // Determine the original source input. | 
|  | 7635 | const Action *SourceAction = &JA; | 
|  | 7636 | while (SourceAction->getKind() != Action::InputClass) { | 
|  | 7637 | assert(!SourceAction->getInputs().empty() && "unexpected root action!"); | 
|  | 7638 | SourceAction = SourceAction->getInputs()[0]; | 
|  | 7639 | } | 
|  | 7640 |  | 
| Eric Christopher | f5a8f49 | 2015-12-08 00:10:10 +0000 | [diff] [blame] | 7641 | // If -fno-integrated-as is used add -Q to the darwin assember driver to make | 
| Kevin Enderby | 319baa4 | 2013-11-18 23:30:29 +0000 | [diff] [blame] | 7642 | // sure it runs its system assembler not clang's integrated assembler. | 
| David Fang | 073a7c9 | 2013-12-10 22:51:25 +0000 | [diff] [blame] | 7643 | // Applicable to darwin11+ and Xcode 4+.  darwin<10 lacked integrated-as. | 
|  | 7644 | // FIXME: at run-time detect assembler capabilities or rely on version | 
| Eric Christopher | f5a8f49 | 2015-12-08 00:10:10 +0000 | [diff] [blame] | 7645 | // information forwarded by -target-assembler-version. | 
| Saleem Abdulrasool | cfeb90d | 2014-02-23 00:40:30 +0000 | [diff] [blame] | 7646 | if (Args.hasArg(options::OPT_fno_integrated_as)) { | 
| David Fang | adcdde0 | 2013-12-10 23:13:11 +0000 | [diff] [blame] | 7647 | const llvm::Triple &T(getToolChain().getTriple()); | 
|  | 7648 | if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7))) | 
| David Fang | 073a7c9 | 2013-12-10 22:51:25 +0000 | [diff] [blame] | 7649 | CmdArgs.push_back("-Q"); | 
|  | 7650 | } | 
| Kevin Enderby | 319baa4 | 2013-11-18 23:30:29 +0000 | [diff] [blame] | 7651 |  | 
| Daniel Dunbar | dc8355e | 2011-04-12 23:59:20 +0000 | [diff] [blame] | 7652 | // Forward -g, assuming we are dealing with an actual assembly file. | 
| Eric Christopher | 84fbdb4 | 2011-08-19 00:30:14 +0000 | [diff] [blame] | 7653 | if (SourceAction->getType() == types::TY_Asm || | 
| Daniel Dunbar | dc8355e | 2011-04-12 23:59:20 +0000 | [diff] [blame] | 7654 | SourceAction->getType() == types::TY_PP_Asm) { | 
| Daniel Dunbar | 5c9c118 | 2009-04-01 00:27:44 +0000 | [diff] [blame] | 7655 | if (Args.hasArg(options::OPT_gstabs)) | 
|  | 7656 | CmdArgs.push_back("--gstabs"); | 
|  | 7657 | else if (Args.hasArg(options::OPT_g_Group)) | 
| Bob Wilson | 126c491 | 2011-11-02 05:10:45 +0000 | [diff] [blame] | 7658 | CmdArgs.push_back("-g"); | 
| Daniel Dunbar | 5c9c118 | 2009-04-01 00:27:44 +0000 | [diff] [blame] | 7659 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7660 |  | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7661 | // Derived from asm spec. | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7662 | AddMachOArch(Args, CmdArgs); | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7663 |  | 
| Daniel Dunbar | 6d48476 | 2010-07-22 01:47:22 +0000 | [diff] [blame] | 7664 | // Use -force_cpusubtype_ALL on x86 by default. | 
| Eli Bendersky | d4a6aec | 2013-07-24 22:20:49 +0000 | [diff] [blame] | 7665 | if (getToolChain().getArch() == llvm::Triple::x86 || | 
|  | 7666 | getToolChain().getArch() == llvm::Triple::x86_64 || | 
| Daniel Dunbar | 3571dd9 | 2009-09-09 18:36:27 +0000 | [diff] [blame] | 7667 | Args.hasArg(options::OPT_force__cpusubtype__ALL)) | 
|  | 7668 | CmdArgs.push_back("-force_cpusubtype_ALL"); | 
|  | 7669 |  | 
| Eli Bendersky | d4a6aec | 2013-07-24 22:20:49 +0000 | [diff] [blame] | 7670 | if (getToolChain().getArch() != llvm::Triple::x86_64 && | 
| Daniel Dunbar | bd847cc | 2012-10-15 22:23:53 +0000 | [diff] [blame] | 7671 | (((Args.hasArg(options::OPT_mkernel) || | 
| Eric Christopher | 248357f | 2013-02-21 22:35:01 +0000 | [diff] [blame] | 7672 | Args.hasArg(options::OPT_fapple_kext)) && | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7673 | getMachOToolChain().isKernelStatic()) || | 
| Daniel Dunbar | bd847cc | 2012-10-15 22:23:53 +0000 | [diff] [blame] | 7674 | Args.hasArg(options::OPT_static))) | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7675 | CmdArgs.push_back("-static"); | 
|  | 7676 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7677 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7678 |  | 
|  | 7679 | assert(Output.isFilename() && "Unexpected lipo output."); | 
|  | 7680 | CmdArgs.push_back("-o"); | 
|  | 7681 | CmdArgs.push_back(Output.getFilename()); | 
|  | 7682 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 7683 | assert(Input.isFilename() && "Invalid input."); | 
|  | 7684 | CmdArgs.push_back(Input.getFilename()); | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7685 |  | 
|  | 7686 | // asm_final spec is empty. | 
|  | 7687 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7688 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 7689 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | be22084 | 2009-03-20 16:06:39 +0000 | [diff] [blame] | 7690 | } | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 7691 |  | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7692 | void darwin::MachOTool::anchor() {} | 
| David Blaikie | 68e081d | 2011-12-20 02:48:34 +0000 | [diff] [blame] | 7693 |  | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7694 | void darwin::MachOTool::AddMachOArch(const ArgList &Args, | 
|  | 7695 | ArgStringList &CmdArgs) const { | 
|  | 7696 | StringRef ArchName = getMachOToolChain().getMachOArchName(Args); | 
| Daniel Dunbar | dcc3b65 | 2010-01-22 02:04:58 +0000 | [diff] [blame] | 7697 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7698 | // Derived from darwin_arch spec. | 
|  | 7699 | CmdArgs.push_back("-arch"); | 
| Daniel Dunbar | dcc3b65 | 2010-01-22 02:04:58 +0000 | [diff] [blame] | 7700 | CmdArgs.push_back(Args.MakeArgString(ArchName)); | 
| Daniel Dunbar | 91dbfd6 | 2009-09-04 18:35:31 +0000 | [diff] [blame] | 7701 |  | 
| Daniel Dunbar | dcc3b65 | 2010-01-22 02:04:58 +0000 | [diff] [blame] | 7702 | // FIXME: Is this needed anymore? | 
|  | 7703 | if (ArchName == "arm") | 
| Daniel Dunbar | 91dbfd6 | 2009-09-04 18:35:31 +0000 | [diff] [blame] | 7704 | CmdArgs.push_back("-force_cpusubtype_ALL"); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7705 | } | 
|  | 7706 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7707 | bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const { | 
| Bill Wendling | 3b2000f | 2012-10-02 18:02:50 +0000 | [diff] [blame] | 7708 | // We only need to generate a temp path for LTO if we aren't compiling object | 
|  | 7709 | // files. When compiling source files, we run 'dsymutil' after linking. We | 
|  | 7710 | // don't run 'dsymutil' when compiling object files. | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 7711 | for (const auto &Input : Inputs) | 
|  | 7712 | if (Input.getType() != types::TY_Object) | 
| Bill Wendling | 3b2000f | 2012-10-02 18:02:50 +0000 | [diff] [blame] | 7713 | return true; | 
|  | 7714 |  | 
|  | 7715 | return false; | 
|  | 7716 | } | 
|  | 7717 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7718 | void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args, | 
|  | 7719 | ArgStringList &CmdArgs, | 
|  | 7720 | const InputInfoList &Inputs) const { | 
| Daniel Dunbar | 083edf7 | 2009-12-21 18:54:17 +0000 | [diff] [blame] | 7721 | const Driver &D = getToolChain().getDriver(); | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7722 | const toolchains::MachO &MachOTC = getMachOToolChain(); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7723 |  | 
| Bruno Cardoso Lopes | 8ed5cac | 2016-03-31 02:45:46 +0000 | [diff] [blame] | 7724 | unsigned Version[5] = {0, 0, 0, 0, 0}; | 
| Daniel Dunbar | cacb0e2 | 2010-08-11 23:07:50 +0000 | [diff] [blame] | 7725 | if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) { | 
| Bruno Cardoso Lopes | 8ed5cac | 2016-03-31 02:45:46 +0000 | [diff] [blame] | 7726 | if (!Driver::GetReleaseVersion(A->getValue(), Version)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7727 | D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args); | 
| Daniel Dunbar | cacb0e2 | 2010-08-11 23:07:50 +0000 | [diff] [blame] | 7728 | } | 
|  | 7729 |  | 
| Bob Wilson | 5a4f3ea | 2014-01-14 01:56:31 +0000 | [diff] [blame] | 7730 | // Newer linkers support -demangle. Pass it if supported and not disabled by | 
| Daniel Dunbar | cacb0e2 | 2010-08-11 23:07:50 +0000 | [diff] [blame] | 7731 | // the user. | 
| Bob Wilson | 5a4f3ea | 2014-01-14 01:56:31 +0000 | [diff] [blame] | 7732 | if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) | 
|  | 7733 | CmdArgs.push_back("-demangle"); | 
| Daniel Dunbar | cacb0e2 | 2010-08-11 23:07:50 +0000 | [diff] [blame] | 7734 |  | 
| Bob Wilson | 3d27dad | 2013-08-02 22:25:34 +0000 | [diff] [blame] | 7735 | if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137) | 
|  | 7736 | CmdArgs.push_back("-export_dynamic"); | 
|  | 7737 |  | 
| Bob Wilson | b111ec9 | 2015-03-02 19:01:14 +0000 | [diff] [blame] | 7738 | // If we are using App Extension restrictions, pass a flag to the linker | 
|  | 7739 | // telling it that the compiled code has been audited. | 
|  | 7740 | if (Args.hasFlag(options::OPT_fapplication_extension, | 
|  | 7741 | options::OPT_fno_application_extension, false)) | 
|  | 7742 | CmdArgs.push_back("-application_extension"); | 
|  | 7743 |  | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 7744 | if (D.isUsingLTO()) { | 
| Bruno Cardoso Lopes | a5efe3a | 2015-10-02 15:10:33 +0000 | [diff] [blame] | 7745 | // If we are using LTO, then automatically create a temporary file path for | 
|  | 7746 | // the linker to use, so that it's lifetime will extend past a possible | 
|  | 7747 | // dsymutil step. | 
|  | 7748 | if (Version[0] >= 116 && NeedsTempPath(Inputs)) { | 
|  | 7749 | const char *TmpPath = C.getArgs().MakeArgString( | 
|  | 7750 | D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); | 
|  | 7751 | C.addTempFile(TmpPath); | 
|  | 7752 | CmdArgs.push_back("-object_path_lto"); | 
|  | 7753 | CmdArgs.push_back(TmpPath); | 
|  | 7754 | } | 
|  | 7755 |  | 
|  | 7756 | // Use -lto_library option to specify the libLTO.dylib path. Try to find | 
|  | 7757 | // it in clang installed libraries. If not found, the option is not used | 
|  | 7758 | // and 'ld' will use its default mechanism to search for libLTO.dylib. | 
|  | 7759 | if (Version[0] >= 133) { | 
|  | 7760 | // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib | 
|  | 7761 | StringRef P = llvm::sys::path::parent_path(D.getInstalledDir()); | 
|  | 7762 | SmallString<128> LibLTOPath(P); | 
|  | 7763 | llvm::sys::path::append(LibLTOPath, "lib"); | 
|  | 7764 | llvm::sys::path::append(LibLTOPath, "libLTO.dylib"); | 
|  | 7765 | if (llvm::sys::fs::exists(LibLTOPath)) { | 
|  | 7766 | CmdArgs.push_back("-lto_library"); | 
|  | 7767 | CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath)); | 
|  | 7768 | } else { | 
|  | 7769 | D.Diag(diag::warn_drv_lto_libpath); | 
|  | 7770 | } | 
|  | 7771 | } | 
| Daniel Dunbar | ef889c7 | 2011-06-21 20:55:11 +0000 | [diff] [blame] | 7772 | } | 
|  | 7773 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7774 | // Derived from the "link" spec. | 
|  | 7775 | Args.AddAllArgs(CmdArgs, options::OPT_static); | 
|  | 7776 | if (!Args.hasArg(options::OPT_static)) | 
|  | 7777 | CmdArgs.push_back("-dynamic"); | 
|  | 7778 | if (Args.hasArg(options::OPT_fgnu_runtime)) { | 
|  | 7779 | // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu | 
|  | 7780 | // here. How do we wish to handle such things? | 
|  | 7781 | } | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7782 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7783 | if (!Args.hasArg(options::OPT_dynamiclib)) { | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7784 | AddMachOArch(Args, CmdArgs); | 
| Daniel Dunbar | a48823f | 2010-01-22 02:04:52 +0000 | [diff] [blame] | 7785 | // FIXME: Why do this only on this path? | 
| Daniel Dunbar | 93d7acf | 2010-01-22 03:37:33 +0000 | [diff] [blame] | 7786 | Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7787 |  | 
|  | 7788 | Args.AddLastArg(CmdArgs, options::OPT_bundle); | 
|  | 7789 | Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader); | 
|  | 7790 | Args.AddAllArgs(CmdArgs, options::OPT_client__name); | 
|  | 7791 |  | 
|  | 7792 | Arg *A; | 
|  | 7793 | if ((A = Args.getLastArg(options::OPT_compatibility__version)) || | 
|  | 7794 | (A = Args.getLastArg(options::OPT_current__version)) || | 
|  | 7795 | (A = Args.getLastArg(options::OPT_install__name))) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7796 | D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args) | 
|  | 7797 | << "-dynamiclib"; | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7798 |  | 
|  | 7799 | Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace); | 
|  | 7800 | Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs); | 
|  | 7801 | Args.AddLastArg(CmdArgs, options::OPT_private__bundle); | 
|  | 7802 | } else { | 
|  | 7803 | CmdArgs.push_back("-dylib"); | 
|  | 7804 |  | 
|  | 7805 | Arg *A; | 
|  | 7806 | if ((A = Args.getLastArg(options::OPT_bundle)) || | 
|  | 7807 | (A = Args.getLastArg(options::OPT_bundle__loader)) || | 
|  | 7808 | (A = Args.getLastArg(options::OPT_client__name)) || | 
|  | 7809 | (A = Args.getLastArg(options::OPT_force__flat__namespace)) || | 
|  | 7810 | (A = Args.getLastArg(options::OPT_keep__private__externs)) || | 
|  | 7811 | (A = Args.getLastArg(options::OPT_private__bundle))) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7812 | D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) | 
|  | 7813 | << "-dynamiclib"; | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7814 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7815 | Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version, | 
|  | 7816 | "-dylib_compatibility_version"); | 
|  | 7817 | Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version, | 
|  | 7818 | "-dylib_current_version"); | 
|  | 7819 |  | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7820 | AddMachOArch(Args, CmdArgs); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7821 |  | 
|  | 7822 | Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name, | 
|  | 7823 | "-dylib_install_name"); | 
|  | 7824 | } | 
|  | 7825 |  | 
|  | 7826 | Args.AddLastArg(CmdArgs, options::OPT_all__load); | 
|  | 7827 | Args.AddAllArgs(CmdArgs, options::OPT_allowable__client); | 
|  | 7828 | Args.AddLastArg(CmdArgs, options::OPT_bind__at__load); | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7829 | if (MachOTC.isTargetIOSBased()) | 
| Daniel Dunbar | 2b5f681 | 2009-09-04 18:35:41 +0000 | [diff] [blame] | 7830 | Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7831 | Args.AddLastArg(CmdArgs, options::OPT_dead__strip); | 
|  | 7832 | Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms); | 
|  | 7833 | Args.AddAllArgs(CmdArgs, options::OPT_dylib__file); | 
|  | 7834 | Args.AddLastArg(CmdArgs, options::OPT_dynamic); | 
|  | 7835 | Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list); | 
|  | 7836 | Args.AddLastArg(CmdArgs, options::OPT_flat__namespace); | 
| Daniel Dunbar | 044a390 | 2011-06-28 20:16:02 +0000 | [diff] [blame] | 7837 | Args.AddAllArgs(CmdArgs, options::OPT_force__load); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7838 | Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names); | 
|  | 7839 | Args.AddAllArgs(CmdArgs, options::OPT_image__base); | 
|  | 7840 | Args.AddAllArgs(CmdArgs, options::OPT_init); | 
|  | 7841 |  | 
| Daniel Dunbar | c44d313 | 2011-04-28 21:23:41 +0000 | [diff] [blame] | 7842 | // Add the deployment target. | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7843 | MachOTC.addMinVersionArgs(Args, CmdArgs); | 
| Daniel Dunbar | c44d313 | 2011-04-28 21:23:41 +0000 | [diff] [blame] | 7844 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7845 | Args.AddLastArg(CmdArgs, options::OPT_nomultidefs); | 
|  | 7846 | Args.AddLastArg(CmdArgs, options::OPT_multi__module); | 
|  | 7847 | Args.AddLastArg(CmdArgs, options::OPT_single__module); | 
|  | 7848 | Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined); | 
|  | 7849 | Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7850 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7851 | if (const Arg *A = | 
|  | 7852 | Args.getLastArg(options::OPT_fpie, options::OPT_fPIE, | 
|  | 7853 | options::OPT_fno_pie, options::OPT_fno_PIE)) { | 
| Daniel Dunbar | af68a88 | 2010-07-13 23:31:40 +0000 | [diff] [blame] | 7854 | if (A->getOption().matches(options::OPT_fpie) || | 
|  | 7855 | A->getOption().matches(options::OPT_fPIE)) | 
|  | 7856 | CmdArgs.push_back("-pie"); | 
|  | 7857 | else | 
|  | 7858 | CmdArgs.push_back("-no_pie"); | 
|  | 7859 | } | 
| Steven Wu | 574b0f2 | 2016-03-01 01:07:58 +0000 | [diff] [blame] | 7860 | // for embed-bitcode, use -bitcode_bundle in linker command | 
|  | 7861 | if (C.getDriver().embedBitcodeEnabled() || | 
|  | 7862 | C.getDriver().embedBitcodeMarkerOnly()) { | 
|  | 7863 | // Check if the toolchain supports bitcode build flow. | 
|  | 7864 | if (MachOTC.SupportsEmbeddedBitcode()) | 
|  | 7865 | CmdArgs.push_back("-bitcode_bundle"); | 
|  | 7866 | else | 
|  | 7867 | D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain); | 
|  | 7868 | } | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7869 |  | 
|  | 7870 | Args.AddLastArg(CmdArgs, options::OPT_prebind); | 
|  | 7871 | Args.AddLastArg(CmdArgs, options::OPT_noprebind); | 
|  | 7872 | Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding); | 
|  | 7873 | Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules); | 
|  | 7874 | Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs); | 
|  | 7875 | Args.AddAllArgs(CmdArgs, options::OPT_sectcreate); | 
|  | 7876 | Args.AddAllArgs(CmdArgs, options::OPT_sectorder); | 
|  | 7877 | Args.AddAllArgs(CmdArgs, options::OPT_seg1addr); | 
|  | 7878 | Args.AddAllArgs(CmdArgs, options::OPT_segprot); | 
|  | 7879 | Args.AddAllArgs(CmdArgs, options::OPT_segaddr); | 
|  | 7880 | Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr); | 
|  | 7881 | Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr); | 
|  | 7882 | Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table); | 
|  | 7883 | Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename); | 
|  | 7884 | Args.AddAllArgs(CmdArgs, options::OPT_sub__library); | 
|  | 7885 | Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella); | 
| Daniel Dunbar | 2b5f681 | 2009-09-04 18:35:41 +0000 | [diff] [blame] | 7886 |  | 
| Daniel Dunbar | 8438464 | 2011-05-02 21:03:47 +0000 | [diff] [blame] | 7887 | // Give --sysroot= preference, over the Apple specific behavior to also use | 
|  | 7888 | // --isysroot as the syslibroot. | 
| Sebastian Pop | 980920a | 2012-04-16 04:16:43 +0000 | [diff] [blame] | 7889 | StringRef sysroot = C.getSysRoot(); | 
|  | 7890 | if (sysroot != "") { | 
| Daniel Dunbar | 8438464 | 2011-05-02 21:03:47 +0000 | [diff] [blame] | 7891 | CmdArgs.push_back("-syslibroot"); | 
| Sebastian Pop | 980920a | 2012-04-16 04:16:43 +0000 | [diff] [blame] | 7892 | CmdArgs.push_back(C.getArgs().MakeArgString(sysroot)); | 
| Daniel Dunbar | 8438464 | 2011-05-02 21:03:47 +0000 | [diff] [blame] | 7893 | } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) { | 
|  | 7894 | CmdArgs.push_back("-syslibroot"); | 
| Richard Smith | bd55daf | 2012-11-01 04:30:05 +0000 | [diff] [blame] | 7895 | CmdArgs.push_back(A->getValue()); | 
| Daniel Dunbar | 2b5f681 | 2009-09-04 18:35:41 +0000 | [diff] [blame] | 7896 | } | 
|  | 7897 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7898 | Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace); | 
|  | 7899 | Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints); | 
|  | 7900 | Args.AddAllArgs(CmdArgs, options::OPT_umbrella); | 
|  | 7901 | Args.AddAllArgs(CmdArgs, options::OPT_undefined); | 
|  | 7902 | Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list); | 
| Daniel Dunbar | 2b5f681 | 2009-09-04 18:35:41 +0000 | [diff] [blame] | 7903 | Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7904 | Args.AddLastArg(CmdArgs, options::OPT_X_Flag); | 
|  | 7905 | Args.AddAllArgs(CmdArgs, options::OPT_y); | 
|  | 7906 | Args.AddLastArg(CmdArgs, options::OPT_w); | 
|  | 7907 | Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size); | 
|  | 7908 | Args.AddAllArgs(CmdArgs, options::OPT_segs__read__); | 
|  | 7909 | Args.AddLastArg(CmdArgs, options::OPT_seglinkedit); | 
|  | 7910 | Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit); | 
|  | 7911 | Args.AddAllArgs(CmdArgs, options::OPT_sectalign); | 
|  | 7912 | Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols); | 
|  | 7913 | Args.AddAllArgs(CmdArgs, options::OPT_segcreate); | 
|  | 7914 | Args.AddLastArg(CmdArgs, options::OPT_whyload); | 
|  | 7915 | Args.AddLastArg(CmdArgs, options::OPT_whatsloaded); | 
|  | 7916 | Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name); | 
|  | 7917 | Args.AddLastArg(CmdArgs, options::OPT_dylinker); | 
|  | 7918 | Args.AddLastArg(CmdArgs, options::OPT_Mach); | 
|  | 7919 | } | 
|  | 7920 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 7921 | void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 7922 | const InputInfo &Output, | 
|  | 7923 | const InputInfoList &Inputs, | 
|  | 7924 | const ArgList &Args, | 
|  | 7925 | const char *LinkingOutput) const { | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7926 | assert(Output.getType() == types::TY_Image && "Invalid linker output type."); | 
| Daniel Dunbar | c09988d | 2009-09-08 16:39:16 +0000 | [diff] [blame] | 7927 |  | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 7928 | // If the number of arguments surpasses the system limits, we will encode the | 
|  | 7929 | // input files in a separate file, shortening the command line. To this end, | 
|  | 7930 | // build a list of input file names that can be passed via a file with the | 
|  | 7931 | // -filelist linker option. | 
|  | 7932 | llvm::opt::ArgStringList InputFileList; | 
|  | 7933 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7934 | // The logic here is derived from gcc's behavior; most of which | 
|  | 7935 | // comes from specs (starting with link_command). Consult gcc for | 
|  | 7936 | // more information. | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7937 | ArgStringList CmdArgs; | 
|  | 7938 |  | 
| Argyrios Kyrtzidis | 741fab1 | 2011-10-07 22:58:08 +0000 | [diff] [blame] | 7939 | /// Hack(tm) to ignore linking errors when we are doing ARC migration. | 
|  | 7940 | if (Args.hasArg(options::OPT_ccc_arcmt_check, | 
|  | 7941 | options::OPT_ccc_arcmt_migrate)) { | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 7942 | for (const auto &Arg : Args) | 
|  | 7943 | Arg->claim(); | 
| Argyrios Kyrtzidis | 741fab1 | 2011-10-07 22:58:08 +0000 | [diff] [blame] | 7944 | const char *Exec = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 7945 | Args.MakeArgString(getToolChain().GetProgramPath("touch")); | 
| Argyrios Kyrtzidis | 741fab1 | 2011-10-07 22:58:08 +0000 | [diff] [blame] | 7946 | CmdArgs.push_back(Output.getFilename()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 7947 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None)); | 
| Argyrios Kyrtzidis | 741fab1 | 2011-10-07 22:58:08 +0000 | [diff] [blame] | 7948 | return; | 
|  | 7949 | } | 
|  | 7950 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7951 | // I'm not sure why this particular decomposition exists in gcc, but | 
|  | 7952 | // we follow suite for ease of comparison. | 
| Bill Wendling | 3b2000f | 2012-10-02 18:02:50 +0000 | [diff] [blame] | 7953 | AddLinkArgs(C, Args, CmdArgs, Inputs); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7954 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 7955 | // It seems that the 'e' option is completely ignored for dynamic executables | 
|  | 7956 | // (the default), and with static executables, the last one wins, as expected. | 
|  | 7957 | Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t, | 
|  | 7958 | options::OPT_Z_Flag, options::OPT_u_Group, | 
|  | 7959 | options::OPT_e, options::OPT_r}); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7960 |  | 
| Daniel Dunbar | 767bbab | 2010-10-18 22:08:36 +0000 | [diff] [blame] | 7961 | // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading | 
|  | 7962 | // members of static archive libraries which implement Objective-C classes or | 
|  | 7963 | // categories. | 
|  | 7964 | if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX)) | 
|  | 7965 | CmdArgs.push_back("-ObjC"); | 
| Michael J. Spencer | 4c0ffa8 | 2010-10-21 03:16:25 +0000 | [diff] [blame] | 7966 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7967 | CmdArgs.push_back("-o"); | 
|  | 7968 | CmdArgs.push_back(Output.getFilename()); | 
|  | 7969 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 7970 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 7971 | getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7972 |  | 
| Peter Collingbourne | c4122c1 | 2015-06-15 21:08:13 +0000 | [diff] [blame] | 7973 | // SafeStack requires its own runtime libraries | 
|  | 7974 | // These libraries should be linked first, to make sure the | 
|  | 7975 | // __safestack_init constructor executes before everything else | 
|  | 7976 | if (getToolChain().getSanitizerArgs().needsSafeStackRt()) { | 
|  | 7977 | getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs, | 
|  | 7978 | "libclang_rt.safestack_osx.a", | 
|  | 7979 | /*AlwaysLink=*/true); | 
|  | 7980 | } | 
|  | 7981 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 7982 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 7983 |  | 
| Douglas Gregor | 9295df0 | 2012-05-15 21:00:27 +0000 | [diff] [blame] | 7984 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 7985 | // Build the input file for -filelist (list of linker input files) in case we | 
|  | 7986 | // need it later | 
|  | 7987 | for (const auto &II : Inputs) { | 
|  | 7988 | if (!II.isFilename()) { | 
|  | 7989 | // This is a linker input argument. | 
|  | 7990 | // We cannot mix input arguments and file names in a -filelist input, thus | 
|  | 7991 | // we prematurely stop our list (remaining files shall be passed as | 
|  | 7992 | // arguments). | 
|  | 7993 | if (InputFileList.size() > 0) | 
|  | 7994 | break; | 
|  | 7995 |  | 
|  | 7996 | continue; | 
|  | 7997 | } | 
|  | 7998 |  | 
|  | 7999 | InputFileList.push_back(II.getFilename()); | 
|  | 8000 | } | 
|  | 8001 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8002 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) | 
| Joerg Sonnenberger | 5c3f9d5 | 2015-09-23 20:07:56 +0000 | [diff] [blame] | 8003 | addOpenMPRuntime(CmdArgs, getToolChain(), Args); | 
|  | 8004 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8005 | if (isObjCRuntimeLinked(Args) && | 
|  | 8006 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Tim Northover | 157d911 | 2014-01-16 08:48:16 +0000 | [diff] [blame] | 8007 | // We use arclite library for both ARC and subscripting support. | 
|  | 8008 | getMachOToolChain().AddLinkARCArgs(Args, CmdArgs); | 
|  | 8009 |  | 
| Bob Wilson | 7dda0cd | 2012-04-21 00:21:42 +0000 | [diff] [blame] | 8010 | CmdArgs.push_back("-framework"); | 
|  | 8011 | CmdArgs.push_back("Foundation"); | 
| Ted Kremenek | e65b086 | 2012-03-06 20:05:56 +0000 | [diff] [blame] | 8012 | // Link libobj. | 
|  | 8013 | CmdArgs.push_back("-lobjc"); | 
| John McCall | 24fc0de | 2011-07-06 00:26:06 +0000 | [diff] [blame] | 8014 | } | 
| John McCall | 31168b0 | 2011-06-15 23:02:42 +0000 | [diff] [blame] | 8015 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8016 | if (LinkingOutput) { | 
|  | 8017 | CmdArgs.push_back("-arch_multiple"); | 
|  | 8018 | CmdArgs.push_back("-final_output"); | 
|  | 8019 | CmdArgs.push_back(LinkingOutput); | 
|  | 8020 | } | 
|  | 8021 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8022 | if (Args.hasArg(options::OPT_fnested_functions)) | 
|  | 8023 | CmdArgs.push_back("-allow_stack_execute"); | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 8024 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8025 | getMachOToolChain().addProfileRTLibs(Args, CmdArgs); | 
| Justin Bogner | c770124 | 2015-05-12 05:44:36 +0000 | [diff] [blame] | 8026 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8027 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 8028 | if (getToolChain().getDriver().CCCIsCXX()) | 
| Daniel Dunbar | 3f7796f | 2010-09-17 01:20:05 +0000 | [diff] [blame] | 8029 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Daniel Dunbar | ad0f62b | 2009-04-08 06:06:21 +0000 | [diff] [blame] | 8030 |  | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8031 | // link_ssp spec is empty. | 
|  | 8032 |  | 
| Daniel Dunbar | 26d482a | 2009-09-18 08:15:03 +0000 | [diff] [blame] | 8033 | // Let the tool chain choose which runtime library to link. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8034 | getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8035 | } | 
|  | 8036 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8037 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8038 | // endfile_spec is empty. | 
|  | 8039 | } | 
|  | 8040 |  | 
|  | 8041 | Args.AddAllArgs(CmdArgs, options::OPT_T_Group); | 
|  | 8042 | Args.AddAllArgs(CmdArgs, options::OPT_F); | 
|  | 8043 |  | 
| Steven Wu | 3ffb61b | 2015-02-06 18:08:29 +0000 | [diff] [blame] | 8044 | // -iframework should be forwarded as -F. | 
| Sean Silva | 14facf3 | 2015-06-09 01:57:17 +0000 | [diff] [blame] | 8045 | for (const Arg *A : Args.filtered(options::OPT_iframework)) | 
|  | 8046 | CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue())); | 
| Steven Wu | 3ffb61b | 2015-02-06 18:08:29 +0000 | [diff] [blame] | 8047 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8048 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Michael Zolotukhin | d0cf6c8 | 2015-03-17 22:13:05 +0000 | [diff] [blame] | 8049 | if (Arg *A = Args.getLastArg(options::OPT_fveclib)) { | 
|  | 8050 | if (A->getValue() == StringRef("Accelerate")) { | 
|  | 8051 | CmdArgs.push_back("-framework"); | 
|  | 8052 | CmdArgs.push_back("Accelerate"); | 
|  | 8053 | } | 
|  | 8054 | } | 
|  | 8055 | } | 
|  | 8056 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8057 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 8058 | std::unique_ptr<Command> Cmd = | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8059 | llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs); | 
| Reid Kleckner | 0290c9c | 2014-09-15 17:45:39 +0000 | [diff] [blame] | 8060 | Cmd->setInputFileList(std::move(InputFileList)); | 
|  | 8061 | C.addCommand(std::move(Cmd)); | 
| Daniel Dunbar | c196421 | 2009-03-26 16:23:12 +0000 | [diff] [blame] | 8062 | } | 
|  | 8063 |  | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 8064 | void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA, | 
| Daniel Dunbar | 7fbaf53 | 2010-08-02 02:38:28 +0000 | [diff] [blame] | 8065 | const InputInfo &Output, | 
| Daniel Dunbar | d067f7f | 2009-04-08 23:54:23 +0000 | [diff] [blame] | 8066 | const InputInfoList &Inputs, | 
|  | 8067 | const ArgList &Args, | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 8068 | const char *LinkingOutput) const { | 
|  | 8069 | ArgStringList CmdArgs; | 
|  | 8070 |  | 
|  | 8071 | CmdArgs.push_back("-create"); | 
|  | 8072 | assert(Output.isFilename() && "Unexpected lipo output."); | 
| Daniel Dunbar | 06686ab | 2009-03-24 00:24:37 +0000 | [diff] [blame] | 8073 |  | 
|  | 8074 | CmdArgs.push_back("-output"); | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 8075 | CmdArgs.push_back(Output.getFilename()); | 
| Daniel Dunbar | 06686ab | 2009-03-24 00:24:37 +0000 | [diff] [blame] | 8076 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8077 | for (const auto &II : Inputs) { | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 8078 | assert(II.isFilename() && "Unexpected lipo input."); | 
|  | 8079 | CmdArgs.push_back(II.getFilename()); | 
|  | 8080 | } | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8081 |  | 
|  | 8082 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8083 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 64ed5e3 | 2009-03-20 00:52:38 +0000 | [diff] [blame] | 8084 | } | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8085 |  | 
| Daniel Dunbar | 8829962 | 2010-06-04 18:28:36 +0000 | [diff] [blame] | 8086 | void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA, | 
| Daniel Dunbar | 7fbaf53 | 2010-08-02 02:38:28 +0000 | [diff] [blame] | 8087 | const InputInfo &Output, | 
| Daniel Dunbar | 8829962 | 2010-06-04 18:28:36 +0000 | [diff] [blame] | 8088 | const InputInfoList &Inputs, | 
|  | 8089 | const ArgList &Args, | 
|  | 8090 | const char *LinkingOutput) const { | 
|  | 8091 | ArgStringList CmdArgs; | 
|  | 8092 |  | 
| Daniel Dunbar | eb86b04 | 2011-05-09 17:23:16 +0000 | [diff] [blame] | 8093 | CmdArgs.push_back("-o"); | 
|  | 8094 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8095 |  | 
| Daniel Dunbar | 8829962 | 2010-06-04 18:28:36 +0000 | [diff] [blame] | 8096 | assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); | 
|  | 8097 | const InputInfo &Input = Inputs[0]; | 
|  | 8098 | assert(Input.isFilename() && "Unexpected dsymutil input."); | 
|  | 8099 | CmdArgs.push_back(Input.getFilename()); | 
|  | 8100 |  | 
| Daniel Dunbar | 8829962 | 2010-06-04 18:28:36 +0000 | [diff] [blame] | 8101 | const char *Exec = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8102 | Args.MakeArgString(getToolChain().GetProgramPath("dsymutil")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8103 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 8829962 | 2010-06-04 18:28:36 +0000 | [diff] [blame] | 8104 | } | 
|  | 8105 |  | 
| Eric Christopher | 551ef45 | 2011-08-23 17:56:55 +0000 | [diff] [blame] | 8106 | void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA, | 
| Eric Christopher | 45f2e71 | 2012-12-18 00:31:10 +0000 | [diff] [blame] | 8107 | const InputInfo &Output, | 
|  | 8108 | const InputInfoList &Inputs, | 
|  | 8109 | const ArgList &Args, | 
|  | 8110 | const char *LinkingOutput) const { | 
| Eric Christopher | 551ef45 | 2011-08-23 17:56:55 +0000 | [diff] [blame] | 8111 | ArgStringList CmdArgs; | 
|  | 8112 | CmdArgs.push_back("--verify"); | 
| Eric Christopher | 3622221 | 2012-02-06 19:13:09 +0000 | [diff] [blame] | 8113 | CmdArgs.push_back("--debug-info"); | 
|  | 8114 | CmdArgs.push_back("--eh-frame"); | 
| Eric Christopher | 65c05fa | 2012-02-06 19:43:51 +0000 | [diff] [blame] | 8115 | CmdArgs.push_back("--quiet"); | 
| Eric Christopher | 551ef45 | 2011-08-23 17:56:55 +0000 | [diff] [blame] | 8116 |  | 
|  | 8117 | assert(Inputs.size() == 1 && "Unable to handle multiple inputs."); | 
|  | 8118 | const InputInfo &Input = Inputs[0]; | 
|  | 8119 | assert(Input.isFilename() && "Unexpected verify input"); | 
|  | 8120 |  | 
|  | 8121 | // Grabbing the output of the earlier dsymutil run. | 
|  | 8122 | CmdArgs.push_back(Input.getFilename()); | 
|  | 8123 |  | 
|  | 8124 | const char *Exec = | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8125 | Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8126 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Eric Christopher | 551ef45 | 2011-08-23 17:56:55 +0000 | [diff] [blame] | 8127 | } | 
|  | 8128 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8129 | void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8130 | const InputInfo &Output, | 
|  | 8131 | const InputInfoList &Inputs, | 
|  | 8132 | const ArgList &Args, | 
|  | 8133 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 8134 | claimNoWarnArgs(Args); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8135 | ArgStringList CmdArgs; | 
|  | 8136 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8137 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8138 |  | 
|  | 8139 | CmdArgs.push_back("-o"); | 
|  | 8140 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8141 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8142 | for (const auto &II : Inputs) | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8143 | CmdArgs.push_back(II.getFilename()); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8144 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8145 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8146 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8147 | } | 
|  | 8148 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8149 | void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8150 | const InputInfo &Output, | 
|  | 8151 | const InputInfoList &Inputs, | 
|  | 8152 | const ArgList &Args, | 
|  | 8153 | const char *LinkingOutput) const { | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8154 | ArgStringList CmdArgs; | 
|  | 8155 |  | 
| David Chisnall | 272a071 | 2012-02-29 15:06:12 +0000 | [diff] [blame] | 8156 | // Demangle C++ names in errors | 
|  | 8157 | CmdArgs.push_back("-C"); | 
|  | 8158 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8159 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8160 | CmdArgs.push_back("-e"); | 
|  | 8161 | CmdArgs.push_back("_start"); | 
|  | 8162 | } | 
|  | 8163 |  | 
|  | 8164 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8165 | CmdArgs.push_back("-Bstatic"); | 
|  | 8166 | CmdArgs.push_back("-dn"); | 
|  | 8167 | } else { | 
|  | 8168 | CmdArgs.push_back("-Bdynamic"); | 
|  | 8169 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 8170 | CmdArgs.push_back("-shared"); | 
|  | 8171 | } else { | 
|  | 8172 | CmdArgs.push_back("--dynamic-linker"); | 
| Rafael Espindola | c53c5b1 | 2015-08-31 19:17:51 +0000 | [diff] [blame] | 8173 | CmdArgs.push_back( | 
|  | 8174 | Args.MakeArgString(getToolChain().GetFilePath("ld.so.1"))); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8175 | } | 
|  | 8176 | } | 
|  | 8177 |  | 
|  | 8178 | if (Output.isFilename()) { | 
|  | 8179 | CmdArgs.push_back("-o"); | 
|  | 8180 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8181 | } else { | 
|  | 8182 | assert(Output.isNothing() && "Invalid output."); | 
|  | 8183 | } | 
|  | 8184 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8185 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Rafael Espindola | c53c5b1 | 2015-08-31 19:17:51 +0000 | [diff] [blame] | 8186 | if (!Args.hasArg(options::OPT_shared)) | 
|  | 8187 | CmdArgs.push_back( | 
|  | 8188 | Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); | 
|  | 8189 |  | 
|  | 8190 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); | 
|  | 8191 | CmdArgs.push_back( | 
|  | 8192 | Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o"))); | 
|  | 8193 | CmdArgs.push_back( | 
|  | 8194 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8195 | } | 
|  | 8196 |  | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 8197 | getToolChain().AddFilePathLibArgs(Args, CmdArgs); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8198 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 8199 | Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, | 
|  | 8200 | options::OPT_e, options::OPT_r}); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8201 |  | 
|  | 8202 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
|  | 8203 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8204 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 8205 | if (getToolChain().getDriver().CCCIsCXX()) | 
| David Chisnall | 3d127c7 | 2012-04-10 11:49:50 +0000 | [diff] [blame] | 8206 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
| David Chisnall | 1026fb0 | 2012-02-15 18:24:31 +0000 | [diff] [blame] | 8207 | CmdArgs.push_back("-lgcc_s"); | 
| Rafael Espindola | 8d4d9d2f | 2015-09-14 19:30:53 +0000 | [diff] [blame] | 8208 | CmdArgs.push_back("-lc"); | 
| David Chisnall | 0c52c0f | 2012-02-28 17:10:04 +0000 | [diff] [blame] | 8209 | if (!Args.hasArg(options::OPT_shared)) { | 
|  | 8210 | CmdArgs.push_back("-lgcc"); | 
| David Chisnall | c73fb89 | 2012-02-28 20:06:45 +0000 | [diff] [blame] | 8211 | CmdArgs.push_back("-lm"); | 
| David Chisnall | 0c52c0f | 2012-02-28 17:10:04 +0000 | [diff] [blame] | 8212 | } | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8213 | } | 
|  | 8214 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8215 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Rafael Espindola | c53c5b1 | 2015-08-31 19:17:51 +0000 | [diff] [blame] | 8216 | CmdArgs.push_back( | 
|  | 8217 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8218 | } | 
| Rafael Espindola | c53c5b1 | 2015-08-31 19:17:51 +0000 | [diff] [blame] | 8219 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8220 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8221 | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8222 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8223 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8224 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| David Chisnall | f571cde | 2012-02-15 13:39:01 +0000 | [diff] [blame] | 8225 | } | 
|  | 8226 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8227 | void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8228 | const InputInfo &Output, | 
|  | 8229 | const InputInfoList &Inputs, | 
|  | 8230 | const ArgList &Args, | 
|  | 8231 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 8232 | claimNoWarnArgs(Args); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8233 | ArgStringList CmdArgs; | 
|  | 8234 |  | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8235 | switch (getToolChain().getArch()) { | 
|  | 8236 | case llvm::Triple::x86: | 
|  | 8237 | // When building 32-bit code on OpenBSD/amd64, we have to explicitly | 
|  | 8238 | // instruct as in the base system to assemble 32-bit code. | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8239 | CmdArgs.push_back("--32"); | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8240 | break; | 
|  | 8241 |  | 
|  | 8242 | case llvm::Triple::ppc: | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8243 | CmdArgs.push_back("-mppc"); | 
|  | 8244 | CmdArgs.push_back("-many"); | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8245 | break; | 
|  | 8246 |  | 
|  | 8247 | case llvm::Triple::sparc: | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8248 | case llvm::Triple::sparcel: { | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8249 | CmdArgs.push_back("-32"); | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8250 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 8251 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
|  | 8252 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8253 | break; | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8254 | } | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8255 |  | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8256 | case llvm::Triple::sparcv9: { | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8257 | CmdArgs.push_back("-64"); | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8258 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 8259 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
|  | 8260 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8261 | break; | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8262 | } | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8263 |  | 
|  | 8264 | case llvm::Triple::mips64: | 
|  | 8265 | case llvm::Triple::mips64el: { | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8266 | StringRef CPUName; | 
|  | 8267 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 8268 | mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8269 |  | 
|  | 8270 | CmdArgs.push_back("-mabi"); | 
|  | 8271 | CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); | 
|  | 8272 |  | 
|  | 8273 | if (getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8274 | CmdArgs.push_back("-EB"); | 
|  | 8275 | else | 
|  | 8276 | CmdArgs.push_back("-EL"); | 
|  | 8277 |  | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8278 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8279 | break; | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8280 | } | 
|  | 8281 |  | 
| Rafael Espindola | cc12627 | 2014-02-28 01:55:21 +0000 | [diff] [blame] | 8282 | default: | 
|  | 8283 | break; | 
|  | 8284 | } | 
|  | 8285 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8286 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8287 |  | 
|  | 8288 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8289 | CmdArgs.push_back(Output.getFilename()); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8290 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8291 | for (const auto &II : Inputs) | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8292 | CmdArgs.push_back(II.getFilename()); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8293 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8294 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8295 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8296 | } | 
|  | 8297 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8298 | void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8299 | const InputInfo &Output, | 
|  | 8300 | const InputInfoList &Inputs, | 
|  | 8301 | const ArgList &Args, | 
|  | 8302 | const char *LinkingOutput) const { | 
| Daniel Dunbar | 083edf7 | 2009-12-21 18:54:17 +0000 | [diff] [blame] | 8303 | const Driver &D = getToolChain().getDriver(); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8304 | ArgStringList CmdArgs; | 
|  | 8305 |  | 
| Rafael Espindola | aadd30e | 2012-12-31 22:41:36 +0000 | [diff] [blame] | 8306 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 8307 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 8308 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 8309 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 8310 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 8311 | // handled somewhere else. | 
|  | 8312 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 8313 |  | 
| Joerg Sonnenberger | ee3b2da | 2013-12-07 00:57:46 +0000 | [diff] [blame] | 8314 | if (getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8315 | CmdArgs.push_back("-EB"); | 
|  | 8316 | else if (getToolChain().getArch() == llvm::Triple::mips64el) | 
|  | 8317 | CmdArgs.push_back("-EL"); | 
|  | 8318 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8319 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8320 | CmdArgs.push_back("-e"); | 
|  | 8321 | CmdArgs.push_back("__start"); | 
|  | 8322 | } | 
|  | 8323 |  | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8324 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8325 | CmdArgs.push_back("-Bstatic"); | 
|  | 8326 | } else { | 
| Rafael Espindola | 7ba97af | 2010-11-11 02:17:51 +0000 | [diff] [blame] | 8327 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 8328 | CmdArgs.push_back("-export-dynamic"); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8329 | CmdArgs.push_back("--eh-frame-hdr"); | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8330 | CmdArgs.push_back("-Bdynamic"); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8331 | if (Args.hasArg(options::OPT_shared)) { | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8332 | CmdArgs.push_back("-shared"); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8333 | } else { | 
|  | 8334 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 8335 | CmdArgs.push_back("/usr/libexec/ld.so"); | 
|  | 8336 | } | 
|  | 8337 | } | 
|  | 8338 |  | 
| Rafael Espindola | 044f783 | 2013-06-05 04:28:55 +0000 | [diff] [blame] | 8339 | if (Args.hasArg(options::OPT_nopie)) | 
|  | 8340 | CmdArgs.push_back("-nopie"); | 
|  | 8341 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8342 | if (Output.isFilename()) { | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8343 | CmdArgs.push_back("-o"); | 
|  | 8344 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8345 | } else { | 
|  | 8346 | assert(Output.isNothing() && "Invalid output."); | 
|  | 8347 | } | 
|  | 8348 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8349 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8350 | if (!Args.hasArg(options::OPT_shared)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8351 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8352 | CmdArgs.push_back( | 
|  | 8353 | Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); | 
| Eli Friedman | 3715d1f | 2011-12-15 02:15:56 +0000 | [diff] [blame] | 8354 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8355 | CmdArgs.push_back( | 
|  | 8356 | Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); | 
|  | 8357 | CmdArgs.push_back( | 
|  | 8358 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8359 | } else { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8360 | CmdArgs.push_back( | 
|  | 8361 | Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8362 | } | 
|  | 8363 | } | 
|  | 8364 |  | 
| Edward O'Callaghan | 5c52146 | 2009-10-28 15:13:08 +0000 | [diff] [blame] | 8365 | std::string Triple = getToolChain().getTripleString(); | 
|  | 8366 | if (Triple.substr(0, 6) == "x86_64") | 
| Daniel Dunbar | 1c7577c | 2009-11-04 06:24:38 +0000 | [diff] [blame] | 8367 | Triple.replace(0, 6, "amd64"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8368 | CmdArgs.push_back( | 
|  | 8369 | Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1")); | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8370 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 8371 | Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, | 
|  | 8372 | options::OPT_e, options::OPT_s, options::OPT_t, | 
|  | 8373 | options::OPT_Z_Flag, options::OPT_r}); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8374 |  | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 8375 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8376 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8377 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 8378 | if (D.CCCIsCXX()) { | 
| Daniel Dunbar | 3f7796f | 2010-09-17 01:20:05 +0000 | [diff] [blame] | 8379 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8380 | if (Args.hasArg(options::OPT_pg)) | 
| Eli Friedman | 3715d1f | 2011-12-15 02:15:56 +0000 | [diff] [blame] | 8381 | CmdArgs.push_back("-lm_p"); | 
|  | 8382 | else | 
|  | 8383 | CmdArgs.push_back("-lm"); | 
| Daniel Dunbar | ea3813f | 2010-08-01 23:13:54 +0000 | [diff] [blame] | 8384 | } | 
|  | 8385 |  | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8386 | // FIXME: For some reason GCC passes -lgcc before adding | 
|  | 8387 | // the default system libraries. Just mimic this for now. | 
|  | 8388 | CmdArgs.push_back("-lgcc"); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8389 |  | 
| Eric Christopher | 17674ec | 2012-09-13 06:32:34 +0000 | [diff] [blame] | 8390 | if (Args.hasArg(options::OPT_pthread)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8391 | if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg)) | 
|  | 8392 | CmdArgs.push_back("-lpthread_p"); | 
| Eric Christopher | 17674ec | 2012-09-13 06:32:34 +0000 | [diff] [blame] | 8393 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8394 | CmdArgs.push_back("-lpthread"); | 
| Eric Christopher | 17674ec | 2012-09-13 06:32:34 +0000 | [diff] [blame] | 8395 | } | 
|  | 8396 |  | 
| Chandler Carruth | 4566165 | 2011-12-17 22:32:42 +0000 | [diff] [blame] | 8397 | if (!Args.hasArg(options::OPT_shared)) { | 
| Eric Christopher | 17674ec | 2012-09-13 06:32:34 +0000 | [diff] [blame] | 8398 | if (Args.hasArg(options::OPT_pg)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8399 | CmdArgs.push_back("-lc_p"); | 
| Eli Friedman | 3715d1f | 2011-12-15 02:15:56 +0000 | [diff] [blame] | 8400 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8401 | CmdArgs.push_back("-lc"); | 
| Chandler Carruth | 4566165 | 2011-12-17 22:32:42 +0000 | [diff] [blame] | 8402 | } | 
| Eric Christopher | 17674ec | 2012-09-13 06:32:34 +0000 | [diff] [blame] | 8403 |  | 
| Daniel Dunbar | a8888ac | 2009-08-03 01:28:59 +0000 | [diff] [blame] | 8404 | CmdArgs.push_back("-lgcc"); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8405 | } | 
|  | 8406 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8407 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8408 | if (!Args.hasArg(options::OPT_shared)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8409 | CmdArgs.push_back( | 
|  | 8410 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8411 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8412 | CmdArgs.push_back( | 
|  | 8413 | Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8414 | } | 
|  | 8415 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8416 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8417 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 10de9e6 | 2009-06-29 20:52:51 +0000 | [diff] [blame] | 8418 | } | 
| Ed Schouten | e33194b | 2009-04-02 19:13:12 +0000 | [diff] [blame] | 8419 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8420 | void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8421 | const InputInfo &Output, | 
|  | 8422 | const InputInfoList &Inputs, | 
|  | 8423 | const ArgList &Args, | 
|  | 8424 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 8425 | claimNoWarnArgs(Args); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8426 | ArgStringList CmdArgs; | 
|  | 8427 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8428 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8429 |  | 
|  | 8430 | CmdArgs.push_back("-o"); | 
|  | 8431 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8432 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8433 | for (const auto &II : Inputs) | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8434 | CmdArgs.push_back(II.getFilename()); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8435 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8436 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8437 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8438 | } | 
|  | 8439 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8440 | void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8441 | const InputInfo &Output, | 
|  | 8442 | const InputInfoList &Inputs, | 
|  | 8443 | const ArgList &Args, | 
|  | 8444 | const char *LinkingOutput) const { | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8445 | const Driver &D = getToolChain().getDriver(); | 
|  | 8446 | ArgStringList CmdArgs; | 
|  | 8447 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8448 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) { | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8449 | CmdArgs.push_back("-e"); | 
|  | 8450 | CmdArgs.push_back("__start"); | 
|  | 8451 | } | 
|  | 8452 |  | 
|  | 8453 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8454 | CmdArgs.push_back("-Bstatic"); | 
|  | 8455 | } else { | 
|  | 8456 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 8457 | CmdArgs.push_back("-export-dynamic"); | 
|  | 8458 | CmdArgs.push_back("--eh-frame-hdr"); | 
|  | 8459 | CmdArgs.push_back("-Bdynamic"); | 
|  | 8460 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 8461 | CmdArgs.push_back("-shared"); | 
|  | 8462 | } else { | 
|  | 8463 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 8464 | CmdArgs.push_back("/usr/libexec/ld.so"); | 
|  | 8465 | } | 
|  | 8466 | } | 
|  | 8467 |  | 
|  | 8468 | if (Output.isFilename()) { | 
|  | 8469 | CmdArgs.push_back("-o"); | 
|  | 8470 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8471 | } else { | 
|  | 8472 | assert(Output.isNothing() && "Invalid output."); | 
|  | 8473 | } | 
|  | 8474 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8475 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8476 | if (!Args.hasArg(options::OPT_shared)) { | 
|  | 8477 | if (Args.hasArg(options::OPT_pg)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8478 | CmdArgs.push_back( | 
|  | 8479 | Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o"))); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8480 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8481 | CmdArgs.push_back( | 
|  | 8482 | Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); | 
|  | 8483 | CmdArgs.push_back( | 
|  | 8484 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8485 | } else { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8486 | CmdArgs.push_back( | 
|  | 8487 | Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8488 | } | 
|  | 8489 | } | 
|  | 8490 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 8491 | Args.AddAllArgs(CmdArgs, | 
|  | 8492 | {options::OPT_L, options::OPT_T_Group, options::OPT_e}); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8493 |  | 
|  | 8494 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
|  | 8495 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8496 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 8497 | if (D.CCCIsCXX()) { | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8498 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 8499 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8500 | CmdArgs.push_back("-lm_p"); | 
|  | 8501 | else | 
|  | 8502 | CmdArgs.push_back("-lm"); | 
|  | 8503 | } | 
|  | 8504 |  | 
| Rafael Espindola | 1ad26f0 | 2012-10-23 17:07:31 +0000 | [diff] [blame] | 8505 | if (Args.hasArg(options::OPT_pthread)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8506 | if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg)) | 
| Rafael Espindola | 1ad26f0 | 2012-10-23 17:07:31 +0000 | [diff] [blame] | 8507 | CmdArgs.push_back("-lpthread_p"); | 
|  | 8508 | else | 
|  | 8509 | CmdArgs.push_back("-lpthread"); | 
|  | 8510 | } | 
|  | 8511 |  | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8512 | if (!Args.hasArg(options::OPT_shared)) { | 
|  | 8513 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8514 | CmdArgs.push_back("-lc_p"); | 
|  | 8515 | else | 
|  | 8516 | CmdArgs.push_back("-lc"); | 
|  | 8517 | } | 
|  | 8518 |  | 
| Benjamin Kramer | b2ccade | 2013-10-21 12:33:55 +0000 | [diff] [blame] | 8519 | StringRef MyArch; | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8520 | switch (getToolChain().getArch()) { | 
| Benjamin Kramer | b2ccade | 2013-10-21 12:33:55 +0000 | [diff] [blame] | 8521 | case llvm::Triple::arm: | 
|  | 8522 | MyArch = "arm"; | 
|  | 8523 | break; | 
|  | 8524 | case llvm::Triple::x86: | 
|  | 8525 | MyArch = "i386"; | 
|  | 8526 | break; | 
|  | 8527 | case llvm::Triple::x86_64: | 
|  | 8528 | MyArch = "amd64"; | 
|  | 8529 | break; | 
|  | 8530 | default: | 
|  | 8531 | llvm_unreachable("Unsupported architecture"); | 
|  | 8532 | } | 
|  | 8533 | CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch)); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8534 | } | 
|  | 8535 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8536 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8537 | if (!Args.hasArg(options::OPT_shared)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8538 | CmdArgs.push_back( | 
|  | 8539 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8540 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8541 | CmdArgs.push_back( | 
|  | 8542 | Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8543 | } | 
| Eli Friedman | 5bb2ba0 | 2012-08-09 22:42:04 +0000 | [diff] [blame] | 8544 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8545 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8546 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Eli Friedman | 9fa2885 | 2012-08-08 23:57:20 +0000 | [diff] [blame] | 8547 | } | 
|  | 8548 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8549 | void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8550 | const InputInfo &Output, | 
|  | 8551 | const InputInfoList &Inputs, | 
|  | 8552 | const ArgList &Args, | 
|  | 8553 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 8554 | claimNoWarnArgs(Args); | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8555 | ArgStringList CmdArgs; | 
|  | 8556 |  | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8557 | // When building 32-bit code on FreeBSD/amd64, we have to explicitly | 
|  | 8558 | // instruct as in the base system to assemble 32-bit code. | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8559 | switch (getToolChain().getArch()) { | 
|  | 8560 | default: | 
|  | 8561 | break; | 
|  | 8562 | case llvm::Triple::x86: | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8563 | CmdArgs.push_back("--32"); | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8564 | break; | 
|  | 8565 | case llvm::Triple::ppc: | 
| Roman Divacky | 00859c2 | 2011-06-04 07:37:31 +0000 | [diff] [blame] | 8566 | CmdArgs.push_back("-a32"); | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8567 | break; | 
|  | 8568 | case llvm::Triple::mips: | 
|  | 8569 | case llvm::Triple::mipsel: | 
|  | 8570 | case llvm::Triple::mips64: | 
|  | 8571 | case llvm::Triple::mips64el: { | 
| Eric Christopher | c0f1a5e | 2012-09-05 21:32:44 +0000 | [diff] [blame] | 8572 | StringRef CPUName; | 
|  | 8573 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 8574 | mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); | 
| Michael J. Spencer | 4c0ffa8 | 2010-10-21 03:16:25 +0000 | [diff] [blame] | 8575 |  | 
| Eric Christopher | c0f1a5e | 2012-09-05 21:32:44 +0000 | [diff] [blame] | 8576 | CmdArgs.push_back("-march"); | 
|  | 8577 | CmdArgs.push_back(CPUName.data()); | 
|  | 8578 |  | 
| Eric Christopher | c0f1a5e | 2012-09-05 21:32:44 +0000 | [diff] [blame] | 8579 | CmdArgs.push_back("-mabi"); | 
| Simon Atanasyan | 0da400c | 2013-02-27 14:55:49 +0000 | [diff] [blame] | 8580 | CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); | 
| Eric Christopher | c0f1a5e | 2012-09-05 21:32:44 +0000 | [diff] [blame] | 8581 |  | 
|  | 8582 | if (getToolChain().getArch() == llvm::Triple::mips || | 
|  | 8583 | getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8584 | CmdArgs.push_back("-EB"); | 
|  | 8585 | else | 
|  | 8586 | CmdArgs.push_back("-EL"); | 
|  | 8587 |  | 
| Dimitry Andric | 46f338c | 2015-12-27 10:36:44 +0000 | [diff] [blame] | 8588 | if (Arg *A = Args.getLastArg(options::OPT_G)) { | 
|  | 8589 | StringRef v = A->getValue(); | 
|  | 8590 | CmdArgs.push_back(Args.MakeArgString("-G" + v)); | 
|  | 8591 | A->claim(); | 
|  | 8592 | } | 
|  | 8593 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 8594 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8595 | break; | 
|  | 8596 | } | 
|  | 8597 | case llvm::Triple::arm: | 
|  | 8598 | case llvm::Triple::armeb: | 
|  | 8599 | case llvm::Triple::thumb: | 
|  | 8600 | case llvm::Triple::thumbeb: { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8601 | arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args); | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 8602 |  | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 8603 | if (ABI == arm::FloatABI::Hard) | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 8604 | CmdArgs.push_back("-mfpu=vfp"); | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 8605 | else | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 8606 | CmdArgs.push_back("-mfpu=softvfp"); | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 8607 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8608 | switch (getToolChain().getTriple().getEnvironment()) { | 
| Renato Golin | f4421f7 | 2014-02-19 10:44:07 +0000 | [diff] [blame] | 8609 | case llvm::Triple::GNUEABIHF: | 
| Rafael Espindola | 0f207ed | 2012-12-13 04:17:14 +0000 | [diff] [blame] | 8610 | case llvm::Triple::GNUEABI: | 
|  | 8611 | case llvm::Triple::EABI: | 
| Anton Korobeynikov | 2bed847 | 2013-03-18 07:59:20 +0000 | [diff] [blame] | 8612 | CmdArgs.push_back("-meabi=5"); | 
| Rafael Espindola | 0f207ed | 2012-12-13 04:17:14 +0000 | [diff] [blame] | 8613 | break; | 
|  | 8614 |  | 
|  | 8615 | default: | 
|  | 8616 | CmdArgs.push_back("-matpcs"); | 
|  | 8617 | } | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8618 | break; | 
|  | 8619 | } | 
|  | 8620 | case llvm::Triple::sparc: | 
|  | 8621 | case llvm::Triple::sparcel: | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8622 | case llvm::Triple::sparcv9: { | 
|  | 8623 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 8624 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 8625 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Joerg Sonnenberger | 9d3e4f6 | 2015-11-10 00:23:12 +0000 | [diff] [blame] | 8626 | break; | 
| Eric Christopher | c0f1a5e | 2012-09-05 21:32:44 +0000 | [diff] [blame] | 8627 | } | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 8628 | } | 
| Eric Christopher | 0b26a61 | 2010-03-02 02:41:08 +0000 | [diff] [blame] | 8629 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8630 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8631 |  | 
|  | 8632 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8633 | CmdArgs.push_back(Output.getFilename()); | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8634 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8635 | for (const auto &II : Inputs) | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8636 | CmdArgs.push_back(II.getFilename()); | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8637 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8638 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8639 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | 8eb473c | 2009-03-31 17:45:15 +0000 | [diff] [blame] | 8640 | } | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8641 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8642 | void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8643 | const InputInfo &Output, | 
|  | 8644 | const InputInfoList &Inputs, | 
|  | 8645 | const ArgList &Args, | 
|  | 8646 | const char *LinkingOutput) const { | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8647 | const toolchains::FreeBSD &ToolChain = | 
|  | 8648 | static_cast<const toolchains::FreeBSD &>(getToolChain()); | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8649 | const Driver &D = ToolChain.getDriver(); | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8650 | const llvm::Triple::ArchType Arch = ToolChain.getArch(); | 
| Alexey Samsonov | e65ceb9 | 2014-02-25 13:26:03 +0000 | [diff] [blame] | 8651 | const bool IsPIE = | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8652 | !Args.hasArg(options::OPT_shared) && | 
|  | 8653 | (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault()); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8654 | ArgStringList CmdArgs; | 
| David Chisnall | 5f99f48 | 2012-07-29 15:24:44 +0000 | [diff] [blame] | 8655 |  | 
|  | 8656 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 8657 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 8658 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 8659 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 8660 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 8661 | // handled somewhere else. | 
|  | 8662 | Args.ClaimAllArgs(options::OPT_w); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8663 |  | 
| Joerg Sonnenberger | 6165ab1 | 2011-03-21 13:51:29 +0000 | [diff] [blame] | 8664 | if (!D.SysRoot.empty()) | 
|  | 8665 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 8666 |  | 
| Alexey Samsonov | e65ceb9 | 2014-02-25 13:26:03 +0000 | [diff] [blame] | 8667 | if (IsPIE) | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8668 | CmdArgs.push_back("-pie"); | 
|  | 8669 |  | 
| Ed Maste | 1bc232d | 2016-04-12 21:11:46 +0000 | [diff] [blame] | 8670 | CmdArgs.push_back("--eh-frame-hdr"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8671 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8672 | CmdArgs.push_back("-Bstatic"); | 
|  | 8673 | } else { | 
| Rafael Espindola | 7ba97af | 2010-11-11 02:17:51 +0000 | [diff] [blame] | 8674 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 8675 | CmdArgs.push_back("-export-dynamic"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8676 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 8677 | CmdArgs.push_back("-Bshareable"); | 
|  | 8678 | } else { | 
|  | 8679 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 8680 | CmdArgs.push_back("/libexec/ld-elf.so.1"); | 
|  | 8681 | } | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8682 | if (ToolChain.getTriple().getOSMajorVersion() >= 9) { | 
| David Chisnall | 5f99f48 | 2012-07-29 15:24:44 +0000 | [diff] [blame] | 8683 | if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc || | 
|  | 8684 | Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) { | 
|  | 8685 | CmdArgs.push_back("--hash-style=both"); | 
|  | 8686 | } | 
|  | 8687 | } | 
|  | 8688 | CmdArgs.push_back("--enable-new-dtags"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8689 | } | 
|  | 8690 |  | 
|  | 8691 | // When building 32-bit code on FreeBSD/amd64, we have to explicitly | 
|  | 8692 | // instruct ld in the base system to link 32-bit code. | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8693 | if (Arch == llvm::Triple::x86) { | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8694 | CmdArgs.push_back("-m"); | 
|  | 8695 | CmdArgs.push_back("elf_i386_fbsd"); | 
|  | 8696 | } | 
|  | 8697 |  | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 8698 | if (Arch == llvm::Triple::ppc) { | 
| Roman Divacky | 5e300b8 | 2011-06-04 07:40:24 +0000 | [diff] [blame] | 8699 | CmdArgs.push_back("-m"); | 
| Roman Divacky | d150ad3 | 2011-11-21 16:50:32 +0000 | [diff] [blame] | 8700 | CmdArgs.push_back("elf32ppc_fbsd"); | 
| Roman Divacky | 5e300b8 | 2011-06-04 07:40:24 +0000 | [diff] [blame] | 8701 | } | 
|  | 8702 |  | 
| Dimitry Andric | 904895f | 2015-12-27 06:47:09 +0000 | [diff] [blame] | 8703 | if (Arg *A = Args.getLastArg(options::OPT_G)) { | 
|  | 8704 | if (ToolChain.getArch() == llvm::Triple::mips || | 
|  | 8705 | ToolChain.getArch() == llvm::Triple::mipsel || | 
|  | 8706 | ToolChain.getArch() == llvm::Triple::mips64 || | 
|  | 8707 | ToolChain.getArch() == llvm::Triple::mips64el) { | 
|  | 8708 | StringRef v = A->getValue(); | 
|  | 8709 | CmdArgs.push_back(Args.MakeArgString("-G" + v)); | 
|  | 8710 | A->claim(); | 
|  | 8711 | } | 
|  | 8712 | } | 
|  | 8713 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 8714 | if (Output.isFilename()) { | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8715 | CmdArgs.push_back("-o"); | 
|  | 8716 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8717 | } else { | 
|  | 8718 | assert(Output.isNothing() && "Invalid output."); | 
|  | 8719 | } | 
|  | 8720 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8721 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 8722 | const char *crt1 = nullptr; | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8723 | if (!Args.hasArg(options::OPT_shared)) { | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8724 | if (Args.hasArg(options::OPT_pg)) | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8725 | crt1 = "gcrt1.o"; | 
| Alexey Samsonov | e65ceb9 | 2014-02-25 13:26:03 +0000 | [diff] [blame] | 8726 | else if (IsPIE) | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8727 | crt1 = "Scrt1.o"; | 
|  | 8728 | else | 
|  | 8729 | crt1 = "crt1.o"; | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8730 | } | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8731 | if (crt1) | 
|  | 8732 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); | 
|  | 8733 |  | 
|  | 8734 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); | 
|  | 8735 |  | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 8736 | const char *crtbegin = nullptr; | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8737 | if (Args.hasArg(options::OPT_static)) | 
|  | 8738 | crtbegin = "crtbeginT.o"; | 
| Alexey Samsonov | e65ceb9 | 2014-02-25 13:26:03 +0000 | [diff] [blame] | 8739 | else if (Args.hasArg(options::OPT_shared) || IsPIE) | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8740 | crtbegin = "crtbeginS.o"; | 
|  | 8741 | else | 
|  | 8742 | crtbegin = "crtbegin.o"; | 
|  | 8743 |  | 
|  | 8744 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8745 | } | 
|  | 8746 |  | 
|  | 8747 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 8748 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8749 | Args.AddAllArgs(CmdArgs, options::OPT_T_Group); | 
|  | 8750 | Args.AddAllArgs(CmdArgs, options::OPT_e); | 
| David Chisnall | 589a494 | 2010-08-15 22:58:12 +0000 | [diff] [blame] | 8751 | Args.AddAllArgs(CmdArgs, options::OPT_s); | 
|  | 8752 | Args.AddAllArgs(CmdArgs, options::OPT_t); | 
|  | 8753 | Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); | 
|  | 8754 | Args.AddAllArgs(CmdArgs, options::OPT_r); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8755 |  | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 8756 | if (D.isUsingLTO()) | 
|  | 8757 | AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); | 
| Roman Divacky | f0d7f94 | 2013-11-10 09:31:43 +0000 | [diff] [blame] | 8758 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8759 | bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8760 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8761 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8762 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Dimitry Andric | 0cc6f47 | 2015-10-18 13:32:20 +0000 | [diff] [blame] | 8763 | addOpenMPRuntime(CmdArgs, ToolChain, Args); | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 8764 | if (D.CCCIsCXX()) { | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8765 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8766 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8767 | CmdArgs.push_back("-lm_p"); | 
|  | 8768 | else | 
|  | 8769 | CmdArgs.push_back("-lm"); | 
| Daniel Dunbar | 4b8ef28 | 2010-02-17 08:07:51 +0000 | [diff] [blame] | 8770 | } | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 8771 | if (NeedsSanitizerDeps) | 
|  | 8772 | linkSanitizerRuntimeDeps(ToolChain, CmdArgs); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8773 | // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding | 
|  | 8774 | // the default system libraries. Just mimic this for now. | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8775 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8776 | CmdArgs.push_back("-lgcc_p"); | 
|  | 8777 | else | 
|  | 8778 | CmdArgs.push_back("-lgcc"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8779 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8780 | CmdArgs.push_back("-lgcc_eh"); | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8781 | } else if (Args.hasArg(options::OPT_pg)) { | 
|  | 8782 | CmdArgs.push_back("-lgcc_eh_p"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8783 | } else { | 
|  | 8784 | CmdArgs.push_back("--as-needed"); | 
|  | 8785 | CmdArgs.push_back("-lgcc_s"); | 
|  | 8786 | CmdArgs.push_back("--no-as-needed"); | 
|  | 8787 | } | 
|  | 8788 |  | 
| Matt Beaumont-Gay | 1fe4915 | 2011-02-10 20:35:01 +0000 | [diff] [blame] | 8789 | if (Args.hasArg(options::OPT_pthread)) { | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8790 | if (Args.hasArg(options::OPT_pg)) | 
|  | 8791 | CmdArgs.push_back("-lpthread_p"); | 
|  | 8792 | else | 
|  | 8793 | CmdArgs.push_back("-lpthread"); | 
| Matt Beaumont-Gay | 1fe4915 | 2011-02-10 20:35:01 +0000 | [diff] [blame] | 8794 | } | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8795 |  | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8796 | if (Args.hasArg(options::OPT_pg)) { | 
|  | 8797 | if (Args.hasArg(options::OPT_shared)) | 
|  | 8798 | CmdArgs.push_back("-lc"); | 
|  | 8799 | else | 
|  | 8800 | CmdArgs.push_back("-lc_p"); | 
|  | 8801 | CmdArgs.push_back("-lgcc_p"); | 
|  | 8802 | } else { | 
|  | 8803 | CmdArgs.push_back("-lc"); | 
|  | 8804 | CmdArgs.push_back("-lgcc"); | 
|  | 8805 | } | 
|  | 8806 |  | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8807 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8808 | CmdArgs.push_back("-lgcc_eh"); | 
| Roman Divacky | 66f2276 | 2011-02-10 16:59:40 +0000 | [diff] [blame] | 8809 | } else if (Args.hasArg(options::OPT_pg)) { | 
|  | 8810 | CmdArgs.push_back("-lgcc_eh_p"); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8811 | } else { | 
|  | 8812 | CmdArgs.push_back("--as-needed"); | 
|  | 8813 | CmdArgs.push_back("-lgcc_s"); | 
|  | 8814 | CmdArgs.push_back("--no-as-needed"); | 
|  | 8815 | } | 
|  | 8816 | } | 
|  | 8817 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 8818 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Alexey Samsonov | e65ceb9 | 2014-02-25 13:26:03 +0000 | [diff] [blame] | 8819 | if (Args.hasArg(options::OPT_shared) || IsPIE) | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8820 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); | 
| Roman Divacky | a3c5024 | 2012-09-07 13:36:21 +0000 | [diff] [blame] | 8821 | else | 
|  | 8822 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); | 
| Roman Divacky | afe2f23 | 2012-08-28 15:09:03 +0000 | [diff] [blame] | 8823 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8824 | } | 
|  | 8825 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 8826 | ToolChain.addProfileRTLibs(Args, CmdArgs); | 
| Nick Lewycky | 82fe5f4 | 2011-05-24 21:54:59 +0000 | [diff] [blame] | 8827 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8828 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8829 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | d854c8d | 2009-04-01 19:36:32 +0000 | [diff] [blame] | 8830 | } | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 8831 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8832 | void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8833 | const InputInfo &Output, | 
|  | 8834 | const InputInfoList &Inputs, | 
|  | 8835 | const ArgList &Args, | 
|  | 8836 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 8837 | claimNoWarnArgs(Args); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8838 | ArgStringList CmdArgs; | 
|  | 8839 |  | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8840 | // GNU as needs different flags for creating the correct output format | 
|  | 8841 | // on architectures with different ABIs or optional feature sets. | 
|  | 8842 | switch (getToolChain().getArch()) { | 
|  | 8843 | case llvm::Triple::x86: | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8844 | CmdArgs.push_back("--32"); | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8845 | break; | 
|  | 8846 | case llvm::Triple::arm: | 
| Christian Pirker | f01cd6f | 2014-03-28 14:40:46 +0000 | [diff] [blame] | 8847 | case llvm::Triple::armeb: | 
|  | 8848 | case llvm::Triple::thumb: | 
|  | 8849 | case llvm::Triple::thumbeb: { | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 8850 | StringRef MArch, MCPU; | 
| Renato Golin | 7c542b4 | 2015-07-27 23:44:45 +0000 | [diff] [blame] | 8851 | getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true); | 
|  | 8852 | std::string Arch = | 
|  | 8853 | arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple()); | 
| Renato Golin | e17c580 | 2015-07-27 23:44:42 +0000 | [diff] [blame] | 8854 | CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch)); | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8855 | break; | 
| Joerg Sonnenberger | 1f94da5 | 2013-12-05 21:07:29 +0000 | [diff] [blame] | 8856 | } | 
|  | 8857 |  | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8858 | case llvm::Triple::mips: | 
|  | 8859 | case llvm::Triple::mipsel: | 
|  | 8860 | case llvm::Triple::mips64: | 
|  | 8861 | case llvm::Triple::mips64el: { | 
| Joerg Sonnenberger | 21baded | 2013-12-08 13:54:58 +0000 | [diff] [blame] | 8862 | StringRef CPUName; | 
|  | 8863 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 8864 | mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); | 
| Joerg Sonnenberger | 21baded | 2013-12-08 13:54:58 +0000 | [diff] [blame] | 8865 |  | 
|  | 8866 | CmdArgs.push_back("-march"); | 
|  | 8867 | CmdArgs.push_back(CPUName.data()); | 
|  | 8868 |  | 
|  | 8869 | CmdArgs.push_back("-mabi"); | 
|  | 8870 | CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data()); | 
|  | 8871 |  | 
|  | 8872 | if (getToolChain().getArch() == llvm::Triple::mips || | 
|  | 8873 | getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8874 | CmdArgs.push_back("-EB"); | 
|  | 8875 | else | 
|  | 8876 | CmdArgs.push_back("-EL"); | 
|  | 8877 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 8878 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8879 | break; | 
|  | 8880 | } | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8881 |  | 
|  | 8882 | case llvm::Triple::sparc: | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8883 | case llvm::Triple::sparcel: { | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8884 | CmdArgs.push_back("-32"); | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8885 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 8886 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 8887 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8888 | break; | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8889 | } | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8890 |  | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8891 | case llvm::Triple::sparcv9: { | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8892 | CmdArgs.push_back("-64"); | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8893 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 8894 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 8895 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8896 | break; | 
| Joerg Sonnenberger | ec353d3 | 2015-11-09 23:39:45 +0000 | [diff] [blame] | 8897 | } | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 8898 |  | 
| Joerg Sonnenberger | 25e1817 | 2014-02-19 22:16:19 +0000 | [diff] [blame] | 8899 | default: | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8900 | break; | 
| Joerg Sonnenberger | 21baded | 2013-12-08 13:54:58 +0000 | [diff] [blame] | 8901 | } | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8902 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8903 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8904 |  | 
|  | 8905 | CmdArgs.push_back("-o"); | 
|  | 8906 | CmdArgs.push_back(Output.getFilename()); | 
|  | 8907 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 8908 | for (const auto &II : Inputs) | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8909 | CmdArgs.push_back(II.getFilename()); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8910 |  | 
| David Chisnall | ddbd68f | 2011-09-27 22:03:18 +0000 | [diff] [blame] | 8911 | const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as"))); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 8912 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8913 | } | 
|  | 8914 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 8915 | void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 8916 | const InputInfo &Output, | 
|  | 8917 | const InputInfoList &Inputs, | 
|  | 8918 | const ArgList &Args, | 
|  | 8919 | const char *LinkingOutput) const { | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8920 | const Driver &D = getToolChain().getDriver(); | 
|  | 8921 | ArgStringList CmdArgs; | 
|  | 8922 |  | 
| Joerg Sonnenberger | 6165ab1 | 2011-03-21 13:51:29 +0000 | [diff] [blame] | 8923 | if (!D.SysRoot.empty()) | 
|  | 8924 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 8925 |  | 
| Joerg Sonnenberger | 52be0b4 | 2014-03-13 00:42:01 +0000 | [diff] [blame] | 8926 | CmdArgs.push_back("--eh-frame-hdr"); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8927 | if (Args.hasArg(options::OPT_static)) { | 
|  | 8928 | CmdArgs.push_back("-Bstatic"); | 
|  | 8929 | } else { | 
|  | 8930 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 8931 | CmdArgs.push_back("-export-dynamic"); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8932 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 8933 | CmdArgs.push_back("-Bshareable"); | 
|  | 8934 | } else { | 
| Joerg Sonnenberger | b8650ad | 2016-06-04 20:03:26 +0000 | [diff] [blame] | 8935 | Args.AddAllArgs(CmdArgs, options::OPT_pie); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8936 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 8937 | CmdArgs.push_back("/libexec/ld.elf_so"); | 
|  | 8938 | } | 
|  | 8939 | } | 
|  | 8940 |  | 
| Joerg Sonnenberger | 6cd7deb | 2014-02-02 22:50:34 +0000 | [diff] [blame] | 8941 | // Many NetBSD architectures support more than one ABI. | 
|  | 8942 | // Determine the correct emulation for ld. | 
|  | 8943 | switch (getToolChain().getArch()) { | 
|  | 8944 | case llvm::Triple::x86: | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 8945 | CmdArgs.push_back("-m"); | 
|  | 8946 | CmdArgs.push_back("elf_i386"); | 
| Joerg Sonnenberger | 6cd7deb | 2014-02-02 22:50:34 +0000 | [diff] [blame] | 8947 | break; | 
|  | 8948 | case llvm::Triple::arm: | 
|  | 8949 | case llvm::Triple::thumb: | 
| Joerg Sonnenberger | 25de31d | 2014-02-02 22:47:37 +0000 | [diff] [blame] | 8950 | CmdArgs.push_back("-m"); | 
|  | 8951 | switch (getToolChain().getTriple().getEnvironment()) { | 
|  | 8952 | case llvm::Triple::EABI: | 
| Joerg Sonnenberger | 25de31d | 2014-02-02 22:47:37 +0000 | [diff] [blame] | 8953 | case llvm::Triple::GNUEABI: | 
| Joerg Sonnenberger | 25de31d | 2014-02-02 22:47:37 +0000 | [diff] [blame] | 8954 | CmdArgs.push_back("armelf_nbsd_eabi"); | 
|  | 8955 | break; | 
| Joerg Sonnenberger | 83a33c0 | 2014-02-06 21:04:32 +0000 | [diff] [blame] | 8956 | case llvm::Triple::EABIHF: | 
|  | 8957 | case llvm::Triple::GNUEABIHF: | 
|  | 8958 | CmdArgs.push_back("armelf_nbsd_eabihf"); | 
|  | 8959 | break; | 
| Joerg Sonnenberger | 25de31d | 2014-02-02 22:47:37 +0000 | [diff] [blame] | 8960 | default: | 
|  | 8961 | CmdArgs.push_back("armelf_nbsd"); | 
|  | 8962 | break; | 
|  | 8963 | } | 
| Joerg Sonnenberger | 6cd7deb | 2014-02-02 22:50:34 +0000 | [diff] [blame] | 8964 | break; | 
| Joerg Sonnenberger | b704534 | 2014-08-14 19:12:41 +0000 | [diff] [blame] | 8965 | case llvm::Triple::armeb: | 
|  | 8966 | case llvm::Triple::thumbeb: | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 8967 | arm::appendEBLinkFlags(Args, CmdArgs, getToolChain().getEffectiveTriple()); | 
| Joerg Sonnenberger | b704534 | 2014-08-14 19:12:41 +0000 | [diff] [blame] | 8968 | CmdArgs.push_back("-m"); | 
|  | 8969 | switch (getToolChain().getTriple().getEnvironment()) { | 
|  | 8970 | case llvm::Triple::EABI: | 
|  | 8971 | case llvm::Triple::GNUEABI: | 
|  | 8972 | CmdArgs.push_back("armelfb_nbsd_eabi"); | 
|  | 8973 | break; | 
|  | 8974 | case llvm::Triple::EABIHF: | 
|  | 8975 | case llvm::Triple::GNUEABIHF: | 
|  | 8976 | CmdArgs.push_back("armelfb_nbsd_eabihf"); | 
|  | 8977 | break; | 
|  | 8978 | default: | 
|  | 8979 | CmdArgs.push_back("armelfb_nbsd"); | 
|  | 8980 | break; | 
|  | 8981 | } | 
|  | 8982 | break; | 
| Joerg Sonnenberger | e7f9759 | 2014-02-02 22:59:16 +0000 | [diff] [blame] | 8983 | case llvm::Triple::mips64: | 
|  | 8984 | case llvm::Triple::mips64el: | 
| Jonathan Roelofs | 2cea1be | 2014-02-12 03:21:20 +0000 | [diff] [blame] | 8985 | if (mips::hasMipsAbiArg(Args, "32")) { | 
| Joerg Sonnenberger | e7f9759 | 2014-02-02 22:59:16 +0000 | [diff] [blame] | 8986 | CmdArgs.push_back("-m"); | 
|  | 8987 | if (getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8988 | CmdArgs.push_back("elf32btsmip"); | 
|  | 8989 | else | 
|  | 8990 | CmdArgs.push_back("elf32ltsmip"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 8991 | } else if (mips::hasMipsAbiArg(Args, "64")) { | 
|  | 8992 | CmdArgs.push_back("-m"); | 
|  | 8993 | if (getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 8994 | CmdArgs.push_back("elf64btsmip"); | 
|  | 8995 | else | 
|  | 8996 | CmdArgs.push_back("elf64ltsmip"); | 
|  | 8997 | } | 
|  | 8998 | break; | 
| Joerg Sonnenberger | dd13b30 | 2014-08-13 14:17:32 +0000 | [diff] [blame] | 8999 | case llvm::Triple::ppc: | 
|  | 9000 | CmdArgs.push_back("-m"); | 
|  | 9001 | CmdArgs.push_back("elf32ppc_nbsd"); | 
|  | 9002 | break; | 
|  | 9003 |  | 
|  | 9004 | case llvm::Triple::ppc64: | 
|  | 9005 | case llvm::Triple::ppc64le: | 
|  | 9006 | CmdArgs.push_back("-m"); | 
|  | 9007 | CmdArgs.push_back("elf64ppc"); | 
|  | 9008 | break; | 
| Joerg Sonnenberger | ed3f069 | 2014-02-19 22:40:18 +0000 | [diff] [blame] | 9009 |  | 
|  | 9010 | case llvm::Triple::sparc: | 
|  | 9011 | CmdArgs.push_back("-m"); | 
|  | 9012 | CmdArgs.push_back("elf32_sparc"); | 
|  | 9013 | break; | 
|  | 9014 |  | 
|  | 9015 | case llvm::Triple::sparcv9: | 
|  | 9016 | CmdArgs.push_back("-m"); | 
|  | 9017 | CmdArgs.push_back("elf64_sparc"); | 
|  | 9018 | break; | 
|  | 9019 |  | 
| Joerg Sonnenberger | 6cd7deb | 2014-02-02 22:50:34 +0000 | [diff] [blame] | 9020 | default: | 
|  | 9021 | break; | 
| Joerg Sonnenberger | 25de31d | 2014-02-02 22:47:37 +0000 | [diff] [blame] | 9022 | } | 
|  | 9023 |  | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9024 | if (Output.isFilename()) { | 
|  | 9025 | CmdArgs.push_back("-o"); | 
|  | 9026 | CmdArgs.push_back(Output.getFilename()); | 
|  | 9027 | } else { | 
|  | 9028 | assert(Output.isNothing() && "Invalid output."); | 
|  | 9029 | } | 
|  | 9030 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9031 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9032 | if (!Args.hasArg(options::OPT_shared)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9033 | CmdArgs.push_back( | 
|  | 9034 | Args.MakeArgString(getToolChain().GetFilePath("crt0.o"))); | 
| Joerg Sonnenberger | b8650ad | 2016-06-04 20:03:26 +0000 | [diff] [blame] | 9035 | } | 
|  | 9036 | CmdArgs.push_back( | 
|  | 9037 | Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); | 
|  | 9038 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9039 | CmdArgs.push_back( | 
|  | 9040 | Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); | 
| Joerg Sonnenberger | b8650ad | 2016-06-04 20:03:26 +0000 | [diff] [blame] | 9041 | } else { | 
|  | 9042 | CmdArgs.push_back( | 
|  | 9043 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9044 | } | 
|  | 9045 | } | 
|  | 9046 |  | 
|  | 9047 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
|  | 9048 | Args.AddAllArgs(CmdArgs, options::OPT_T_Group); | 
|  | 9049 | Args.AddAllArgs(CmdArgs, options::OPT_e); | 
|  | 9050 | Args.AddAllArgs(CmdArgs, options::OPT_s); | 
|  | 9051 | Args.AddAllArgs(CmdArgs, options::OPT_t); | 
|  | 9052 | Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag); | 
|  | 9053 | Args.AddAllArgs(CmdArgs, options::OPT_r); | 
|  | 9054 |  | 
|  | 9055 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
|  | 9056 |  | 
| Joerg Sonnenberger | a443563 | 2013-10-14 20:13:05 +0000 | [diff] [blame] | 9057 | unsigned Major, Minor, Micro; | 
|  | 9058 | getToolChain().getTriple().getOSVersion(Major, Minor, Micro); | 
|  | 9059 | bool useLibgcc = true; | 
| Joerg Sonnenberger | 21156e8 | 2016-02-11 23:35:03 +0000 | [diff] [blame] | 9060 | if (Major >= 7 || Major == 0) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9061 | switch (getToolChain().getArch()) { | 
| Joerg Sonnenberger | 323cea9 | 2014-08-09 18:28:36 +0000 | [diff] [blame] | 9062 | case llvm::Triple::aarch64: | 
| Joerg Sonnenberger | 1ea6647 | 2014-05-07 08:45:26 +0000 | [diff] [blame] | 9063 | case llvm::Triple::arm: | 
|  | 9064 | case llvm::Triple::armeb: | 
|  | 9065 | case llvm::Triple::thumb: | 
|  | 9066 | case llvm::Triple::thumbeb: | 
| Joerg Sonnenberger | c888757 | 2014-07-25 20:57:24 +0000 | [diff] [blame] | 9067 | case llvm::Triple::ppc: | 
| Joerg Sonnenberger | dd13b30 | 2014-08-13 14:17:32 +0000 | [diff] [blame] | 9068 | case llvm::Triple::ppc64: | 
|  | 9069 | case llvm::Triple::ppc64le: | 
| Joerg Sonnenberger | 059613c | 2016-02-11 23:18:36 +0000 | [diff] [blame] | 9070 | case llvm::Triple::sparc: | 
|  | 9071 | case llvm::Triple::sparcv9: | 
| Joerg Sonnenberger | d769a1e | 2014-01-18 00:50:49 +0000 | [diff] [blame] | 9072 | case llvm::Triple::x86: | 
|  | 9073 | case llvm::Triple::x86_64: | 
| Joerg Sonnenberger | a443563 | 2013-10-14 20:13:05 +0000 | [diff] [blame] | 9074 | useLibgcc = false; | 
| Joerg Sonnenberger | d769a1e | 2014-01-18 00:50:49 +0000 | [diff] [blame] | 9075 | break; | 
|  | 9076 | default: | 
|  | 9077 | break; | 
|  | 9078 | } | 
| Joerg Sonnenberger | a443563 | 2013-10-14 20:13:05 +0000 | [diff] [blame] | 9079 | } | 
|  | 9080 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9081 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Joerg Sonnenberger | 27a69a2 | 2015-09-23 20:11:00 +0000 | [diff] [blame] | 9082 | addOpenMPRuntime(CmdArgs, getToolChain(), Args); | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 9083 | if (D.CCCIsCXX()) { | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9084 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 9085 | CmdArgs.push_back("-lm"); | 
|  | 9086 | } | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9087 | if (Args.hasArg(options::OPT_pthread)) | 
|  | 9088 | CmdArgs.push_back("-lpthread"); | 
|  | 9089 | CmdArgs.push_back("-lc"); | 
|  | 9090 |  | 
| Joerg Sonnenberger | a443563 | 2013-10-14 20:13:05 +0000 | [diff] [blame] | 9091 | if (useLibgcc) { | 
|  | 9092 | if (Args.hasArg(options::OPT_static)) { | 
|  | 9093 | // libgcc_eh depends on libc, so resolve as much as possible, | 
|  | 9094 | // pull in any new requirements from libc and then get the rest | 
|  | 9095 | // of libgcc. | 
|  | 9096 | CmdArgs.push_back("-lgcc_eh"); | 
|  | 9097 | CmdArgs.push_back("-lc"); | 
|  | 9098 | CmdArgs.push_back("-lgcc"); | 
|  | 9099 | } else { | 
|  | 9100 | CmdArgs.push_back("-lgcc"); | 
|  | 9101 | CmdArgs.push_back("--as-needed"); | 
|  | 9102 | CmdArgs.push_back("-lgcc_s"); | 
|  | 9103 | CmdArgs.push_back("--no-as-needed"); | 
|  | 9104 | } | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9105 | } | 
|  | 9106 | } | 
|  | 9107 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9108 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Joerg Sonnenberger | b8650ad | 2016-06-04 20:03:26 +0000 | [diff] [blame] | 9109 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9110 | CmdArgs.push_back( | 
|  | 9111 | Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); | 
| Joerg Sonnenberger | b8650ad | 2016-06-04 20:03:26 +0000 | [diff] [blame] | 9112 | else | 
|  | 9113 | CmdArgs.push_back( | 
|  | 9114 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9115 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9116 | } | 
|  | 9117 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9118 | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
| Nick Lewycky | 82fe5f4 | 2011-05-24 21:54:59 +0000 | [diff] [blame] | 9119 |  | 
| Logan Chien | eb9162f | 2014-06-26 14:23:45 +0000 | [diff] [blame] | 9120 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 9121 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Benjamin Kramer | 24f1d3e | 2011-02-02 18:59:27 +0000 | [diff] [blame] | 9122 | } | 
|  | 9123 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9124 | void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9125 | const InputInfo &Output, | 
|  | 9126 | const InputInfoList &Inputs, | 
|  | 9127 | const ArgList &Args, | 
|  | 9128 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 9129 | claimNoWarnArgs(Args); | 
|  | 9130 |  | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 9131 | const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9132 |  | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9133 | ArgStringList CmdArgs; | 
|  | 9134 |  | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 9135 | llvm::Reloc::Model RelocationModel; | 
|  | 9136 | unsigned PICLevel; | 
|  | 9137 | bool IsPIE; | 
|  | 9138 | std::tie(RelocationModel, PICLevel, IsPIE) = | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9139 | ParsePICArgs(getToolChain(), Triple, Args); | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 9140 |  | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9141 | switch (getToolChain().getArch()) { | 
|  | 9142 | default: | 
|  | 9143 | break; | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9144 | // Add --32/--64 to make sure we get the format we want. | 
|  | 9145 | // This is incomplete | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9146 | case llvm::Triple::x86: | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9147 | CmdArgs.push_back("--32"); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9148 | break; | 
|  | 9149 | case llvm::Triple::x86_64: | 
| Zinovy Nis | 1db9573 | 2014-07-10 15:27:19 +0000 | [diff] [blame] | 9150 | if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32) | 
|  | 9151 | CmdArgs.push_back("--x32"); | 
|  | 9152 | else | 
|  | 9153 | CmdArgs.push_back("--64"); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9154 | break; | 
|  | 9155 | case llvm::Triple::ppc: | 
| Eli Friedman | 4a4932c | 2011-11-28 23:46:52 +0000 | [diff] [blame] | 9156 | CmdArgs.push_back("-a32"); | 
|  | 9157 | CmdArgs.push_back("-mppc"); | 
|  | 9158 | CmdArgs.push_back("-many"); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9159 | break; | 
|  | 9160 | case llvm::Triple::ppc64: | 
| Eli Friedman | 4a4932c | 2011-11-28 23:46:52 +0000 | [diff] [blame] | 9161 | CmdArgs.push_back("-a64"); | 
|  | 9162 | CmdArgs.push_back("-mppc64"); | 
|  | 9163 | CmdArgs.push_back("-many"); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9164 | break; | 
|  | 9165 | case llvm::Triple::ppc64le: | 
| Bill Schmidt | 778d387 | 2013-07-26 01:36:11 +0000 | [diff] [blame] | 9166 | CmdArgs.push_back("-a64"); | 
| Will Schmidt | c1fc190 | 2014-03-24 17:10:37 +0000 | [diff] [blame] | 9167 | CmdArgs.push_back("-mppc64"); | 
| Bill Schmidt | 778d387 | 2013-07-26 01:36:11 +0000 | [diff] [blame] | 9168 | CmdArgs.push_back("-many"); | 
| Will Schmidt | c1fc190 | 2014-03-24 17:10:37 +0000 | [diff] [blame] | 9169 | CmdArgs.push_back("-mlittle-endian"); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9170 | break; | 
|  | 9171 | case llvm::Triple::sparc: | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9172 | case llvm::Triple::sparcel: { | 
| Jakob Stoklund Olesen | 2490e55 | 2014-01-10 03:51:29 +0000 | [diff] [blame] | 9173 | CmdArgs.push_back("-32"); | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9174 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 9175 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
|  | 9176 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9177 | break; | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9178 | } | 
|  | 9179 | case llvm::Triple::sparcv9: { | 
| Jakob Stoklund Olesen | 2490e55 | 2014-01-10 03:51:29 +0000 | [diff] [blame] | 9180 | CmdArgs.push_back("-64"); | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9181 | std::string CPU = getCPUName(Args, getToolChain().getTriple()); | 
|  | 9182 | CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple())); | 
|  | 9183 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9184 | break; | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9185 | } | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9186 | case llvm::Triple::arm: | 
|  | 9187 | case llvm::Triple::armeb: | 
|  | 9188 | case llvm::Triple::thumb: | 
|  | 9189 | case llvm::Triple::thumbeb: { | 
| James Y Knight | 2db38f3 | 2015-08-15 03:45:25 +0000 | [diff] [blame] | 9190 | const llvm::Triple &Triple2 = getToolChain().getTriple(); | 
|  | 9191 | switch (Triple2.getSubArch()) { | 
| Scott Douglass | 3205f52 | 2015-03-23 10:54:24 +0000 | [diff] [blame] | 9192 | case llvm::Triple::ARMSubArch_v7: | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9193 | CmdArgs.push_back("-mfpu=neon"); | 
| Scott Douglass | 3205f52 | 2015-03-23 10:54:24 +0000 | [diff] [blame] | 9194 | break; | 
|  | 9195 | case llvm::Triple::ARMSubArch_v8: | 
| Bernard Ogden | a58ef05 | 2013-10-24 18:32:41 +0000 | [diff] [blame] | 9196 | CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8"); | 
| Scott Douglass | 3205f52 | 2015-03-23 10:54:24 +0000 | [diff] [blame] | 9197 | break; | 
|  | 9198 | default: | 
|  | 9199 | break; | 
|  | 9200 | } | 
| Evgeniy Stepanov | ed943f6 | 2012-04-20 09:03:40 +0000 | [diff] [blame] | 9201 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9202 | switch (arm::getARMFloatABI(getToolChain(), Args)) { | 
| Saleem Abdulrasool | eee54b4 | 2015-09-18 05:32:23 +0000 | [diff] [blame] | 9203 | case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!"); | 
|  | 9204 | case arm::FloatABI::Soft: | 
|  | 9205 | CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft")); | 
|  | 9206 | break; | 
|  | 9207 | case arm::FloatABI::SoftFP: | 
|  | 9208 | CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp")); | 
|  | 9209 | break; | 
|  | 9210 | case arm::FloatABI::Hard: | 
|  | 9211 | CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard")); | 
|  | 9212 | break; | 
|  | 9213 | } | 
| Evgeniy Stepanov | 582911a | 2012-04-24 09:05:31 +0000 | [diff] [blame] | 9214 |  | 
|  | 9215 | Args.AddLastArg(CmdArgs, options::OPT_march_EQ); | 
| Ana Pazos | dd6068d | 2013-12-06 22:43:17 +0000 | [diff] [blame] | 9216 |  | 
|  | 9217 | // FIXME: remove krait check when GNU tools support krait cpu | 
| Stephen Hines | e3f91e3 | 2016-03-04 20:57:22 +0000 | [diff] [blame] | 9218 | // for now replace it with -mcpu=cortex-a15 to avoid a lower | 
| Ana Pazos | dd6068d | 2013-12-06 22:43:17 +0000 | [diff] [blame] | 9219 | // march from being picked in the absence of a cpu flag. | 
|  | 9220 | Arg *A; | 
|  | 9221 | if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) && | 
| Nico Weber | ebe8d62 | 2016-08-26 21:11:43 +0000 | [diff] [blame^] | 9222 | StringRef(A->getValue()).equals_lower("krait")) | 
| Stephen Hines | e3f91e3 | 2016-03-04 20:57:22 +0000 | [diff] [blame] | 9223 | CmdArgs.push_back("-mcpu=cortex-a15"); | 
| Ana Pazos | dd6068d | 2013-12-06 22:43:17 +0000 | [diff] [blame] | 9224 | else | 
|  | 9225 | Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ); | 
| Evgeniy Stepanov | 582911a | 2012-04-24 09:05:31 +0000 | [diff] [blame] | 9226 | Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9227 | break; | 
|  | 9228 | } | 
|  | 9229 | case llvm::Triple::mips: | 
|  | 9230 | case llvm::Triple::mipsel: | 
|  | 9231 | case llvm::Triple::mips64: | 
|  | 9232 | case llvm::Triple::mips64el: { | 
| Simon Atanasyan | 571d7bd | 2012-04-07 22:31:29 +0000 | [diff] [blame] | 9233 | StringRef CPUName; | 
|  | 9234 | StringRef ABIName; | 
| Simon Atanasyan | 7018e1d | 2014-07-16 12:29:22 +0000 | [diff] [blame] | 9235 | mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName); | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9236 | ABIName = getGnuCompatibleMipsABIName(ABIName); | 
| Akira Hatanaka | 5e9dde3 | 2011-11-30 19:31:38 +0000 | [diff] [blame] | 9237 |  | 
| Simon Atanasyan | 571d7bd | 2012-04-07 22:31:29 +0000 | [diff] [blame] | 9238 | CmdArgs.push_back("-march"); | 
|  | 9239 | CmdArgs.push_back(CPUName.data()); | 
|  | 9240 |  | 
| Simon Atanasyan | 571d7bd | 2012-04-07 22:31:29 +0000 | [diff] [blame] | 9241 | CmdArgs.push_back("-mabi"); | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9242 | CmdArgs.push_back(ABIName.data()); | 
|  | 9243 |  | 
| Daniel Sanders | 54d8ee6 | 2014-07-23 12:06:13 +0000 | [diff] [blame] | 9244 | // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE, | 
|  | 9245 | // or -mshared (not implemented) is in effect. | 
| James Y Knight | 5bdf7ab | 2015-08-19 15:12:02 +0000 | [diff] [blame] | 9246 | if (RelocationModel == llvm::Reloc::Static) | 
| Daniel Sanders | 54d8ee6 | 2014-07-23 12:06:13 +0000 | [diff] [blame] | 9247 | CmdArgs.push_back("-mno-shared"); | 
|  | 9248 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9249 | // LLVM doesn't support -mplt yet and acts as if it is always given. | 
|  | 9250 | // However, -mplt has no effect with the N64 ABI. | 
|  | 9251 | CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic"); | 
| Simon Atanasyan | 2390aa1 | 2012-04-06 19:15:24 +0000 | [diff] [blame] | 9252 |  | 
|  | 9253 | if (getToolChain().getArch() == llvm::Triple::mips || | 
|  | 9254 | getToolChain().getArch() == llvm::Triple::mips64) | 
|  | 9255 | CmdArgs.push_back("-EB"); | 
|  | 9256 | else | 
|  | 9257 | CmdArgs.push_back("-EL"); | 
| Simon Atanasyan | 217dc2d | 2012-05-29 19:07:33 +0000 | [diff] [blame] | 9258 |  | 
| Simon Atanasyan | 22127ce | 2013-09-24 09:09:16 +0000 | [diff] [blame] | 9259 | if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) { | 
|  | 9260 | if (StringRef(A->getValue()) == "2008") | 
|  | 9261 | CmdArgs.push_back(Args.MakeArgString("-mnan=2008")); | 
|  | 9262 | } | 
|  | 9263 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9264 | // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default. | 
|  | 9265 | if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx, | 
|  | 9266 | options::OPT_mfp64)) { | 
|  | 9267 | A->claim(); | 
|  | 9268 | A->render(Args, CmdArgs); | 
| Saleem Abdulrasool | d5556e3 | 2015-09-19 04:33:38 +0000 | [diff] [blame] | 9269 | } else if (mips::shouldUseFPXX( | 
|  | 9270 | Args, getToolChain().getTriple(), CPUName, ABIName, | 
|  | 9271 | getMipsFloatABI(getToolChain().getDriver(), Args))) | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9272 | CmdArgs.push_back("-mfpxx"); | 
|  | 9273 |  | 
|  | 9274 | // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of | 
|  | 9275 | // -mno-mips16 is actually -no-mips16. | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9276 | if (Arg *A = | 
|  | 9277 | Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) { | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9278 | if (A->getOption().matches(options::OPT_mips16)) { | 
|  | 9279 | A->claim(); | 
|  | 9280 | A->render(Args, CmdArgs); | 
|  | 9281 | } else { | 
|  | 9282 | A->claim(); | 
|  | 9283 | CmdArgs.push_back("-no-mips16"); | 
|  | 9284 | } | 
|  | 9285 | } | 
|  | 9286 |  | 
| Simon Atanasyan | 036d16d | 2013-04-30 07:47:13 +0000 | [diff] [blame] | 9287 | Args.AddLastArg(CmdArgs, options::OPT_mmicromips, | 
|  | 9288 | options::OPT_mno_micromips); | 
|  | 9289 | Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp); | 
|  | 9290 | Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2); | 
|  | 9291 |  | 
| Simon Atanasyan | bd98663 | 2013-11-26 11:58:04 +0000 | [diff] [blame] | 9292 | if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) { | 
|  | 9293 | // Do not use AddLastArg because not all versions of MIPS assembler | 
|  | 9294 | // support -mmsa / -mno-msa options. | 
|  | 9295 | if (A->getOption().matches(options::OPT_mmsa)) | 
|  | 9296 | CmdArgs.push_back(Args.MakeArgString("-mmsa")); | 
|  | 9297 | } | 
|  | 9298 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9299 | Args.AddLastArg(CmdArgs, options::OPT_mhard_float, | 
|  | 9300 | options::OPT_msoft_float); | 
|  | 9301 |  | 
| Toma Tabacu | b36d610 | 2015-06-11 12:13:18 +0000 | [diff] [blame] | 9302 | Args.AddLastArg(CmdArgs, options::OPT_mdouble_float, | 
|  | 9303 | options::OPT_msingle_float); | 
|  | 9304 |  | 
| Daniel Sanders | 379d44b | 2014-07-16 11:52:23 +0000 | [diff] [blame] | 9305 | Args.AddLastArg(CmdArgs, options::OPT_modd_spreg, | 
|  | 9306 | options::OPT_mno_odd_spreg); | 
|  | 9307 |  | 
| Joerg Sonnenberger | 5c1ac90 | 2015-11-10 00:40:29 +0000 | [diff] [blame] | 9308 | AddAssemblerKPIC(getToolChain(), Args, CmdArgs); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9309 | break; | 
|  | 9310 | } | 
|  | 9311 | case llvm::Triple::systemz: { | 
| Jakob Stoklund Olesen | 8d7f506 | 2014-01-12 04:53:36 +0000 | [diff] [blame] | 9312 | // Always pass an -march option, since our default of z10 is later | 
|  | 9313 | // than the GNU assembler's default. | 
|  | 9314 | StringRef CPUName = getSystemZTargetCPU(Args); | 
|  | 9315 | CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName)); | 
| Scott Douglass | d4cfffc | 2015-03-23 10:46:28 +0000 | [diff] [blame] | 9316 | break; | 
|  | 9317 | } | 
| Jakob Stoklund Olesen | 8d7f506 | 2014-01-12 04:53:36 +0000 | [diff] [blame] | 9318 | } | 
|  | 9319 |  | 
| Renato Golin | a74bbc7 | 2015-07-22 15:32:36 +0000 | [diff] [blame] | 9320 | Args.AddAllArgs(CmdArgs, options::OPT_I); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9321 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9322 |  | 
|  | 9323 | CmdArgs.push_back("-o"); | 
|  | 9324 | CmdArgs.push_back(Output.getFilename()); | 
|  | 9325 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9326 | for (const auto &II : Inputs) | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9327 | CmdArgs.push_back(II.getFilename()); | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9328 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9329 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 9330 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Eric Christopher | 30aa6b6 | 2013-06-05 23:58:15 +0000 | [diff] [blame] | 9331 |  | 
|  | 9332 | // Handle the debug info splitting at object creation time if we're | 
|  | 9333 | // creating an object. | 
|  | 9334 | // TODO: Currently only works on linux with newer objcopy. | 
|  | 9335 | if (Args.hasArg(options::OPT_gsplit_dwarf) && | 
| Cameron Esfahani | 556d91e | 2013-09-14 01:09:11 +0000 | [diff] [blame] | 9336 | getToolChain().getTriple().isOSLinux()) | 
| Eric Christopher | 30aa6b6 | 2013-06-05 23:58:15 +0000 | [diff] [blame] | 9337 | SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, | 
| Artem Belevich | ba55895 | 2015-05-06 18:20:23 +0000 | [diff] [blame] | 9338 | SplitDebugName(Args, Inputs[0])); | 
| Rafael Espindola | 92b0093 | 2010-08-10 00:25:48 +0000 | [diff] [blame] | 9339 | } | 
|  | 9340 |  | 
| Benjamin Kramer | 9299637dc | 2014-03-04 19:31:42 +0000 | [diff] [blame] | 9341 | static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9342 | ArgStringList &CmdArgs, const ArgList &Args) { | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 9343 | bool isAndroid = Triple.isAndroid(); | 
| Reid Kleckner | 0213a47 | 2015-07-22 16:01:38 +0000 | [diff] [blame] | 9344 | bool isCygMing = Triple.isOSCygMing(); | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9345 | bool IsIAMCU = Triple.isOSIAMCU(); | 
| Chandler Carruth | 58d6eb6 | 2013-03-04 02:07:55 +0000 | [diff] [blame] | 9346 | bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || | 
|  | 9347 | Args.hasArg(options::OPT_static); | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 9348 | if (!D.CCCIsCXX()) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9349 | CmdArgs.push_back("-lgcc"); | 
|  | 9350 |  | 
| Logan Chien | 3d3373c | 2012-11-19 12:04:11 +0000 | [diff] [blame] | 9351 | if (StaticLibgcc || isAndroid) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 9352 | if (D.CCCIsCXX()) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9353 | CmdArgs.push_back("-lgcc"); | 
|  | 9354 | } else { | 
| Reid Kleckner | 0213a47 | 2015-07-22 16:01:38 +0000 | [diff] [blame] | 9355 | if (!D.CCCIsCXX() && !isCygMing) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9356 | CmdArgs.push_back("--as-needed"); | 
|  | 9357 | CmdArgs.push_back("-lgcc_s"); | 
| Reid Kleckner | 0213a47 | 2015-07-22 16:01:38 +0000 | [diff] [blame] | 9358 | if (!D.CCCIsCXX() && !isCygMing) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9359 | CmdArgs.push_back("--no-as-needed"); | 
|  | 9360 | } | 
|  | 9361 |  | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9362 | if (StaticLibgcc && !isAndroid && !IsIAMCU) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9363 | CmdArgs.push_back("-lgcc_eh"); | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 9364 | else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX()) | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9365 | CmdArgs.push_back("-lgcc"); | 
| Logan Chien | 3d3373c | 2012-11-19 12:04:11 +0000 | [diff] [blame] | 9366 |  | 
|  | 9367 | // According to Android ABI, we have to link with libdl if we are | 
|  | 9368 | // linking with non-static libgcc. | 
|  | 9369 | // | 
|  | 9370 | // NOTE: This fixes a link error on Android MIPS as well.  The non-static | 
|  | 9371 | // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl. | 
|  | 9372 | if (isAndroid && !StaticLibgcc) | 
|  | 9373 | CmdArgs.push_back("-ldl"); | 
| Rafael Espindola | cc35432 | 2011-10-17 21:39:04 +0000 | [diff] [blame] | 9374 | } | 
|  | 9375 |  | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9376 | static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, | 
| Saleem Abdulrasool | 2e46ebe | 2014-12-30 22:52:06 +0000 | [diff] [blame] | 9377 | ArgStringList &CmdArgs, const ArgList &Args) { | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9378 | // Make use of compiler-rt if --rtlib option is used | 
|  | 9379 | ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args); | 
|  | 9380 |  | 
| Saleem Abdulrasool | 8d7ade7 | 2014-12-30 02:10:36 +0000 | [diff] [blame] | 9381 | switch (RLT) { | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9382 | case ToolChain::RLT_CompilerRT: | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 9383 | switch (TC.getTriple().getOS()) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9384 | default: | 
|  | 9385 | llvm_unreachable("unsupported OS"); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 9386 | case llvm::Triple::Win32: | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 9387 | case llvm::Triple::Linux: | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9388 | addClangRT(TC, Args, CmdArgs); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 9389 | break; | 
|  | 9390 | } | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9391 | break; | 
|  | 9392 | case ToolChain::RLT_Libgcc: | 
| Andrey Turetskiy | a486857 | 2016-03-14 11:19:43 +0000 | [diff] [blame] | 9393 | // Make sure libgcc is not used under MSVC environment by default | 
|  | 9394 | if (TC.getTriple().isKnownWindowsMSVCEnvironment()) { | 
|  | 9395 | // Issue error diagnostic if libgcc is explicitly specified | 
|  | 9396 | // through command line as --rtlib option argument. | 
|  | 9397 | if (Args.hasArg(options::OPT_rtlib_EQ)) { | 
|  | 9398 | TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) | 
|  | 9399 | << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC"; | 
|  | 9400 | } | 
|  | 9401 | } else | 
|  | 9402 | AddLibgcc(TC.getTriple(), D, CmdArgs, Args); | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9403 | break; | 
| Renato Golin | c4b4924 | 2014-02-13 10:01:16 +0000 | [diff] [blame] | 9404 | } | 
|  | 9405 | } | 
|  | 9406 |  | 
| Rafael Espindola | 1e08577 | 2014-08-15 17:14:35 +0000 | [diff] [blame] | 9407 | static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { | 
|  | 9408 | switch (T.getArch()) { | 
|  | 9409 | case llvm::Triple::x86: | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9410 | if (T.isOSIAMCU()) | 
|  | 9411 | return "elf_iamcu"; | 
| Rafael Espindola | 1e08577 | 2014-08-15 17:14:35 +0000 | [diff] [blame] | 9412 | return "elf_i386"; | 
|  | 9413 | case llvm::Triple::aarch64: | 
|  | 9414 | return "aarch64linux"; | 
|  | 9415 | case llvm::Triple::aarch64_be: | 
|  | 9416 | return "aarch64_be_linux"; | 
|  | 9417 | case llvm::Triple::arm: | 
|  | 9418 | case llvm::Triple::thumb: | 
|  | 9419 | return "armelf_linux_eabi"; | 
|  | 9420 | case llvm::Triple::armeb: | 
|  | 9421 | case llvm::Triple::thumbeb: | 
| Strahinja Petrovic | b859896 | 2016-06-10 16:09:20 +0000 | [diff] [blame] | 9422 | return "armelfb_linux_eabi"; | 
| Rafael Espindola | 1e08577 | 2014-08-15 17:14:35 +0000 | [diff] [blame] | 9423 | case llvm::Triple::ppc: | 
|  | 9424 | return "elf32ppclinux"; | 
|  | 9425 | case llvm::Triple::ppc64: | 
|  | 9426 | return "elf64ppc"; | 
|  | 9427 | case llvm::Triple::ppc64le: | 
|  | 9428 | return "elf64lppc"; | 
|  | 9429 | case llvm::Triple::sparc: | 
| Douglas Katzman | f36dddf | 2015-05-11 15:21:44 +0000 | [diff] [blame] | 9430 | case llvm::Triple::sparcel: | 
| Rafael Espindola | 1e08577 | 2014-08-15 17:14:35 +0000 | [diff] [blame] | 9431 | return "elf32_sparc"; | 
|  | 9432 | case llvm::Triple::sparcv9: | 
|  | 9433 | return "elf64_sparc"; | 
|  | 9434 | case llvm::Triple::mips: | 
|  | 9435 | return "elf32btsmip"; | 
|  | 9436 | case llvm::Triple::mipsel: | 
|  | 9437 | return "elf32ltsmip"; | 
|  | 9438 | case llvm::Triple::mips64: | 
|  | 9439 | if (mips::hasMipsAbiArg(Args, "n32")) | 
|  | 9440 | return "elf32btsmipn32"; | 
|  | 9441 | return "elf64btsmip"; | 
|  | 9442 | case llvm::Triple::mips64el: | 
|  | 9443 | if (mips::hasMipsAbiArg(Args, "n32")) | 
|  | 9444 | return "elf32ltsmipn32"; | 
|  | 9445 | return "elf64ltsmip"; | 
|  | 9446 | case llvm::Triple::systemz: | 
|  | 9447 | return "elf64_s390"; | 
|  | 9448 | case llvm::Triple::x86_64: | 
|  | 9449 | if (T.getEnvironment() == llvm::Triple::GNUX32) | 
|  | 9450 | return "elf32_x86_64"; | 
|  | 9451 | return "elf_x86_64"; | 
|  | 9452 | default: | 
|  | 9453 | llvm_unreachable("Unexpected arch"); | 
|  | 9454 | } | 
|  | 9455 | } | 
|  | 9456 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9457 | void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9458 | const InputInfo &Output, | 
|  | 9459 | const InputInfoList &Inputs, | 
|  | 9460 | const ArgList &Args, | 
|  | 9461 | const char *LinkingOutput) const { | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9462 | const toolchains::Linux &ToolChain = | 
|  | 9463 | static_cast<const toolchains::Linux &>(getToolChain()); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9464 | const Driver &D = ToolChain.getDriver(); | 
| James Y Knight | 2db38f3 | 2015-08-15 03:45:25 +0000 | [diff] [blame] | 9465 |  | 
| Vedant Kumar | 18286cf | 2016-07-27 23:02:20 +0000 | [diff] [blame] | 9466 | const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9467 |  | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9468 | const llvm::Triple::ArchType Arch = ToolChain.getArch(); | 
| Evgeniy Stepanov | 14deb7b | 2015-10-08 21:21:44 +0000 | [diff] [blame] | 9469 | const bool isAndroid = ToolChain.getTriple().isAndroid(); | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9470 | const bool IsIAMCU = ToolChain.getTriple().isOSIAMCU(); | 
| Peter Collingbourne | 54d770c | 2013-04-09 04:35:11 +0000 | [diff] [blame] | 9471 | const bool IsPIE = | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9472 | !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) && | 
|  | 9473 | (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault()); | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 9474 | const bool HasCRTBeginEndFiles = | 
|  | 9475 | ToolChain.getTriple().hasEnvironment() || | 
|  | 9476 | (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies); | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9477 |  | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9478 | ArgStringList CmdArgs; | 
|  | 9479 |  | 
| Rafael Espindola | d1002f6 | 2010-11-15 18:28:16 +0000 | [diff] [blame] | 9480 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 9481 | Args.ClaimAllArgs(options::OPT_g_Group); | 
| Rafael Espindola | d95a812 | 2011-03-01 05:25:27 +0000 | [diff] [blame] | 9482 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 9483 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
| David Chisnall | 5f99f48 | 2012-07-29 15:24:44 +0000 | [diff] [blame] | 9484 | // and for "clang -w foo.o -o foo". Other warning options are already | 
| Rafael Espindola | f92614c | 2010-11-17 20:37:10 +0000 | [diff] [blame] | 9485 | // handled somewhere else. | 
|  | 9486 | Args.ClaimAllArgs(options::OPT_w); | 
| Rafael Espindola | d1002f6 | 2010-11-15 18:28:16 +0000 | [diff] [blame] | 9487 |  | 
| Peter Collingbourne | 39719a7 | 2015-11-20 20:49:39 +0000 | [diff] [blame] | 9488 | const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); | 
|  | 9489 | if (llvm::sys::path::filename(Exec) == "lld") { | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 9490 | CmdArgs.push_back("-flavor"); | 
| Rafael Espindola | 156aac0 | 2015-11-16 09:12:12 +0000 | [diff] [blame] | 9491 | CmdArgs.push_back("old-gnu"); | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 9492 | CmdArgs.push_back("-target"); | 
|  | 9493 | CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString())); | 
|  | 9494 | } | 
|  | 9495 |  | 
| Joerg Sonnenberger | 6165ab1 | 2011-03-21 13:51:29 +0000 | [diff] [blame] | 9496 | if (!D.SysRoot.empty()) | 
|  | 9497 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9498 |  | 
| Peter Collingbourne | 54d770c | 2013-04-09 04:35:11 +0000 | [diff] [blame] | 9499 | if (IsPIE) | 
| Rafael Espindola | d47ac23 | 2010-11-17 22:26:15 +0000 | [diff] [blame] | 9500 | CmdArgs.push_back("-pie"); | 
|  | 9501 |  | 
| Rafael Espindola | 1c76c59 | 2010-11-07 22:57:16 +0000 | [diff] [blame] | 9502 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 9503 | CmdArgs.push_back("-export-dynamic"); | 
|  | 9504 |  | 
| Rafael Espindola | 34d77dc | 2010-11-11 19:34:42 +0000 | [diff] [blame] | 9505 | if (Args.hasArg(options::OPT_s)) | 
|  | 9506 | CmdArgs.push_back("-s"); | 
|  | 9507 |  | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9508 | if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9509 | arm::appendEBLinkFlags(Args, CmdArgs, Triple); | 
| Joerg Sonnenberger | 1689d3f | 2015-01-28 23:30:39 +0000 | [diff] [blame] | 9510 |  | 
| NAKAMURA Takumi | 557fb62 | 2014-06-29 16:00:11 +0000 | [diff] [blame] | 9511 | for (const auto &Opt : ToolChain.ExtraOpts) | 
|  | 9512 | CmdArgs.push_back(Opt.c_str()); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9513 |  | 
|  | 9514 | if (!Args.hasArg(options::OPT_static)) { | 
|  | 9515 | CmdArgs.push_back("--eh-frame-hdr"); | 
|  | 9516 | } | 
|  | 9517 |  | 
|  | 9518 | CmdArgs.push_back("-m"); | 
| Rafael Espindola | 1e08577 | 2014-08-15 17:14:35 +0000 | [diff] [blame] | 9519 | CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args)); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9520 |  | 
|  | 9521 | if (Args.hasArg(options::OPT_static)) { | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9522 | if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb || | 
|  | 9523 | Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb) | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9524 | CmdArgs.push_back("-Bstatic"); | 
|  | 9525 | else | 
|  | 9526 | CmdArgs.push_back("-static"); | 
|  | 9527 | } else if (Args.hasArg(options::OPT_shared)) { | 
|  | 9528 | CmdArgs.push_back("-shared"); | 
|  | 9529 | } | 
|  | 9530 |  | 
| Saleem Abdulrasool | f56c6d8 | 2016-02-07 06:03:38 +0000 | [diff] [blame] | 9531 | if (!Args.hasArg(options::OPT_static)) { | 
|  | 9532 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 9533 | CmdArgs.push_back("-export-dynamic"); | 
|  | 9534 |  | 
|  | 9535 | if (!Args.hasArg(options::OPT_shared)) { | 
|  | 9536 | const std::string Loader = | 
| Saleem Abdulrasool | 783fc63 | 2016-05-22 03:12:19 +0000 | [diff] [blame] | 9537 | D.DyldPrefix + ToolChain.getDynamicLinker(Args); | 
| Saleem Abdulrasool | f56c6d8 | 2016-02-07 06:03:38 +0000 | [diff] [blame] | 9538 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 9539 | CmdArgs.push_back(Args.MakeArgString(Loader)); | 
|  | 9540 | } | 
| NAKAMURA Takumi | 557fb62 | 2014-06-29 16:00:11 +0000 | [diff] [blame] | 9541 | } | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9542 |  | 
|  | 9543 | CmdArgs.push_back("-o"); | 
|  | 9544 | CmdArgs.push_back(Output.getFilename()); | 
|  | 9545 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9546 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9547 | if (!isAndroid && !IsIAMCU) { | 
| Craig Topper | 92fc2df | 2014-05-17 16:56:41 +0000 | [diff] [blame] | 9548 | const char *crt1 = nullptr; | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9549 | if (!Args.hasArg(options::OPT_shared)) { | 
| Eric Christopher | ac02174 | 2013-06-07 23:25:01 +0000 | [diff] [blame] | 9550 | if (Args.hasArg(options::OPT_pg)) | 
|  | 9551 | crt1 = "gcrt1.o"; | 
|  | 9552 | else if (IsPIE) | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9553 | crt1 = "Scrt1.o"; | 
|  | 9554 | else | 
|  | 9555 | crt1 = "crt1.o"; | 
|  | 9556 | } | 
|  | 9557 | if (crt1) | 
|  | 9558 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9559 |  | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9560 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); | 
|  | 9561 | } | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9562 |  | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9563 | if (IsIAMCU) | 
|  | 9564 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o"))); | 
|  | 9565 | else { | 
|  | 9566 | const char *crtbegin; | 
|  | 9567 | if (Args.hasArg(options::OPT_static)) | 
|  | 9568 | crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o"; | 
|  | 9569 | else if (Args.hasArg(options::OPT_shared)) | 
|  | 9570 | crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o"; | 
|  | 9571 | else if (IsPIE) | 
|  | 9572 | crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o"; | 
|  | 9573 | else | 
|  | 9574 | crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o"; | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 9575 |  | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9576 | if (HasCRTBeginEndFiles) | 
|  | 9577 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); | 
|  | 9578 | } | 
| Benjamin Kramer | 058666a | 2012-10-04 19:42:20 +0000 | [diff] [blame] | 9579 |  | 
|  | 9580 | // Add crtfastmath.o if available and fast math is enabled. | 
|  | 9581 | ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs); | 
| Rafael Espindola | 9aa60e9 | 2010-11-12 03:00:39 +0000 | [diff] [blame] | 9582 | } | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9583 |  | 
|  | 9584 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Reid Kleckner | 6907144 | 2014-06-26 01:08:54 +0000 | [diff] [blame] | 9585 | Args.AddAllArgs(CmdArgs, options::OPT_u); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9586 |  | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 9587 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9588 |  | 
| Teresa Johnson | 945bc50 | 2015-10-15 20:35:53 +0000 | [diff] [blame] | 9589 | if (D.isUsingLTO()) | 
|  | 9590 | AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin); | 
| Chandler Carruth | 953fb08 | 2013-01-13 11:46:33 +0000 | [diff] [blame] | 9591 |  | 
| Nick Lewycky | 2fe6aab | 2012-08-17 03:39:16 +0000 | [diff] [blame] | 9592 | if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) | 
|  | 9593 | CmdArgs.push_back("--no-demangle"); | 
|  | 9594 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9595 | bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs); | 
|  | 9596 | bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9597 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
| Chandler Carruth | e4458b3 | 2013-06-24 09:38:45 +0000 | [diff] [blame] | 9598 | // The profile runtime also needs access to system libraries. | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9599 | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
| Chandler Carruth | e4458b3 | 2013-06-24 09:38:45 +0000 | [diff] [blame] | 9600 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9601 | if (D.CCCIsCXX() && | 
|  | 9602 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Rafael Espindola | 70b8d76 | 2011-10-17 22:14:51 +0000 | [diff] [blame] | 9603 | bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9604 | !Args.hasArg(options::OPT_static); | 
| Rafael Espindola | 70b8d76 | 2011-10-17 22:14:51 +0000 | [diff] [blame] | 9605 | if (OnlyLibstdcxxStatic) | 
|  | 9606 | CmdArgs.push_back("-Bstatic"); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9607 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Rafael Espindola | 70b8d76 | 2011-10-17 22:14:51 +0000 | [diff] [blame] | 9608 | if (OnlyLibstdcxxStatic) | 
|  | 9609 | CmdArgs.push_back("-Bdynamic"); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9610 | CmdArgs.push_back("-lm"); | 
|  | 9611 | } | 
| Chandler Carruth | 7e7dd47 | 2015-03-07 10:01:29 +0000 | [diff] [blame] | 9612 | // Silence warnings when linking C code with a C++ '-stdlib' argument. | 
|  | 9613 | Args.ClaimAllArgs(options::OPT_stdlib_EQ); | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9614 |  | 
| Rafael Espindola | 9aa60e9 | 2010-11-12 03:00:39 +0000 | [diff] [blame] | 9615 | if (!Args.hasArg(options::OPT_nostdlib)) { | 
| Chandler Carruth | 94a3201 | 2012-05-14 18:31:18 +0000 | [diff] [blame] | 9616 | if (!Args.hasArg(options::OPT_nodefaultlibs)) { | 
|  | 9617 | if (Args.hasArg(options::OPT_static)) | 
|  | 9618 | CmdArgs.push_back("--start-group"); | 
| Nick Lewycky | 97864da | 2011-06-04 06:27:06 +0000 | [diff] [blame] | 9619 |  | 
| Alexey Samsonov | 5255034 | 2014-09-15 19:58:40 +0000 | [diff] [blame] | 9620 | if (NeedsSanitizerDeps) | 
|  | 9621 | linkSanitizerRuntimeDeps(ToolChain, CmdArgs); | 
|  | 9622 |  | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 9623 | if (NeedsXRayDeps) | 
| Dean Michael Berris | 39baab9 | 2016-07-14 04:58:44 +0000 | [diff] [blame] | 9624 | linkXRayRuntimeDeps(ToolChain, Args, CmdArgs); | 
| Aaron Ballman | 7d2aecb | 2016-07-13 22:32:15 +0000 | [diff] [blame] | 9625 |  | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 9626 | bool WantPthread = Args.hasArg(options::OPT_pthread) || | 
|  | 9627 | Args.hasArg(options::OPT_pthreads); | 
|  | 9628 |  | 
|  | 9629 | if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, | 
|  | 9630 | options::OPT_fno_openmp, false)) { | 
|  | 9631 | // OpenMP runtimes implies pthreads when using the GNU toolchain. | 
|  | 9632 | // FIXME: Does this really make sense for all GNU toolchains? | 
|  | 9633 | WantPthread = true; | 
|  | 9634 |  | 
|  | 9635 | // Also link the particular OpenMP runtimes. | 
|  | 9636 | switch (getOpenMPRuntime(ToolChain, Args)) { | 
|  | 9637 | case OMPRT_OMP: | 
|  | 9638 | CmdArgs.push_back("-lomp"); | 
|  | 9639 | break; | 
|  | 9640 | case OMPRT_GOMP: | 
| Richard Smith | 31d1de2 | 2015-05-20 22:48:44 +0000 | [diff] [blame] | 9641 | CmdArgs.push_back("-lgomp"); | 
|  | 9642 |  | 
|  | 9643 | // FIXME: Exclude this for platforms with libgomp that don't require | 
|  | 9644 | // librt. Most modern Linux platforms require it, but some may not. | 
|  | 9645 | CmdArgs.push_back("-lrt"); | 
|  | 9646 | break; | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 9647 | case OMPRT_IOMP5: | 
| Richard Smith | 31d1de2 | 2015-05-20 22:48:44 +0000 | [diff] [blame] | 9648 | CmdArgs.push_back("-liomp5"); | 
|  | 9649 | break; | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 9650 | case OMPRT_Unknown: | 
|  | 9651 | // Already diagnosed. | 
| Richard Smith | 31d1de2 | 2015-05-20 22:48:44 +0000 | [diff] [blame] | 9652 | break; | 
|  | 9653 | } | 
| Chandler Carruth | 0153800 | 2013-01-17 13:19:29 +0000 | [diff] [blame] | 9654 | } | 
| Chandler Carruth | 9c6b4f8 | 2015-05-28 01:52:38 +0000 | [diff] [blame] | 9655 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9656 | AddRunTimeLibs(ToolChain, D, CmdArgs, Args); | 
| Rafael Espindola | 9aa60e9 | 2010-11-12 03:00:39 +0000 | [diff] [blame] | 9657 |  | 
| Richard Smith | 31d1de2 | 2015-05-20 22:48:44 +0000 | [diff] [blame] | 9658 | if (WantPthread && !isAndroid) | 
| Chandler Carruth | 94a3201 | 2012-05-14 18:31:18 +0000 | [diff] [blame] | 9659 | CmdArgs.push_back("-lpthread"); | 
|  | 9660 |  | 
| Rafael Espindola | b17bc53 | 2016-01-25 18:29:16 +0000 | [diff] [blame] | 9661 | if (Args.hasArg(options::OPT_fsplit_stack)) | 
|  | 9662 | CmdArgs.push_back("--wrap=pthread_create"); | 
|  | 9663 |  | 
| Chandler Carruth | 94a3201 | 2012-05-14 18:31:18 +0000 | [diff] [blame] | 9664 | CmdArgs.push_back("-lc"); | 
|  | 9665 |  | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9666 | // Add IAMCU specific libs, if needed. | 
|  | 9667 | if (IsIAMCU) | 
|  | 9668 | CmdArgs.push_back("-lgloss"); | 
|  | 9669 |  | 
| Chandler Carruth | 94a3201 | 2012-05-14 18:31:18 +0000 | [diff] [blame] | 9670 | if (Args.hasArg(options::OPT_static)) | 
|  | 9671 | CmdArgs.push_back("--end-group"); | 
|  | 9672 | else | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9673 | AddRunTimeLibs(ToolChain, D, CmdArgs, Args); | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9674 |  | 
|  | 9675 | // Add IAMCU specific libs (outside the group), if needed. | 
|  | 9676 | if (IsIAMCU) { | 
|  | 9677 | CmdArgs.push_back("--as-needed"); | 
|  | 9678 | CmdArgs.push_back("-lsoftfp"); | 
|  | 9679 | CmdArgs.push_back("--no-as-needed"); | 
|  | 9680 | } | 
| Chandler Carruth | 94a3201 | 2012-05-14 18:31:18 +0000 | [diff] [blame] | 9681 | } | 
| Rafael Espindola | d47ac23 | 2010-11-17 22:26:15 +0000 | [diff] [blame] | 9682 |  | 
| Andrey Turetskiy | c410548 | 2016-06-16 10:49:27 +0000 | [diff] [blame] | 9683 | if (!Args.hasArg(options::OPT_nostartfiles) && !IsIAMCU) { | 
| Rafael Espindola | 81937ec | 2010-12-01 01:52:43 +0000 | [diff] [blame] | 9684 | const char *crtend; | 
| Evgeniy Stepanov | c9cde48 | 2012-09-10 10:30:12 +0000 | [diff] [blame] | 9685 | if (Args.hasArg(options::OPT_shared)) | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9686 | crtend = isAndroid ? "crtend_so.o" : "crtendS.o"; | 
| Peter Collingbourne | 54d770c | 2013-04-09 04:35:11 +0000 | [diff] [blame] | 9687 | else if (IsPIE) | 
| Evgeniy Stepanov | c9cde48 | 2012-09-10 10:30:12 +0000 | [diff] [blame] | 9688 | crtend = isAndroid ? "crtend_android.o" : "crtendS.o"; | 
| Rafael Espindola | 81937ec | 2010-12-01 01:52:43 +0000 | [diff] [blame] | 9689 | else | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9690 | crtend = isAndroid ? "crtend_android.o" : "crtend.o"; | 
| Rafael Espindola | 9aa60e9 | 2010-11-12 03:00:39 +0000 | [diff] [blame] | 9691 |  | 
| Vasileios Kalintiris | c744e12 | 2015-11-12 15:26:54 +0000 | [diff] [blame] | 9692 | if (HasCRTBeginEndFiles) | 
|  | 9693 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); | 
| Evgeniy Stepanov | 7786671 | 2012-04-25 08:59:22 +0000 | [diff] [blame] | 9694 | if (!isAndroid) | 
|  | 9695 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); | 
| Rafael Espindola | 81937ec | 2010-12-01 01:52:43 +0000 | [diff] [blame] | 9696 | } | 
| Sumanth Gundapaneni | b79fdff | 2015-12-02 19:12:41 +0000 | [diff] [blame] | 9697 | } | 
| Rafael Espindola | c8f008f | 2010-11-07 20:14:31 +0000 | [diff] [blame] | 9698 |  | 
| Peter Collingbourne | 39719a7 | 2015-11-20 20:49:39 +0000 | [diff] [blame] | 9699 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Saleem Abdulrasool | a4a474b | 2014-06-29 06:11:14 +0000 | [diff] [blame] | 9700 | } | 
|  | 9701 |  | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9702 | // NaCl ARM assembly (inline or standalone) can be written with a set of macros | 
|  | 9703 | // for the various SFI requirements like register masking. The assembly tool | 
|  | 9704 | // inserts the file containing the macros as an input into all the assembly | 
|  | 9705 | // jobs. | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9706 | void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9707 | const InputInfo &Output, | 
|  | 9708 | const InputInfoList &Inputs, | 
|  | 9709 | const ArgList &Args, | 
|  | 9710 | const char *LinkingOutput) const { | 
| Douglas Katzman | 5436607 | 2015-07-27 16:53:08 +0000 | [diff] [blame] | 9711 | const toolchains::NaClToolChain &ToolChain = | 
|  | 9712 | static_cast<const toolchains::NaClToolChain &>(getToolChain()); | 
| Justin Lebar | d98cea8 | 2016-01-11 23:15:21 +0000 | [diff] [blame] | 9713 | InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(), | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9714 | "nacl-arm-macros.s"); | 
|  | 9715 | InputInfoList NewInputs; | 
|  | 9716 | NewInputs.push_back(NaClMacros); | 
|  | 9717 | NewInputs.append(Inputs.begin(), Inputs.end()); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9718 | gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args, | 
|  | 9719 | LinkingOutput); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9720 | } | 
|  | 9721 |  | 
| Douglas Katzman | 750cfc5 | 2015-06-29 18:42:16 +0000 | [diff] [blame] | 9722 | // This is quite similar to gnutools::Linker::ConstructJob with changes that | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9723 | // we use static by default, do not yet support sanitizers or LTO, and a few | 
|  | 9724 | // others. Eventually we can support more of that and hopefully migrate back | 
| Douglas Katzman | 750cfc5 | 2015-06-29 18:42:16 +0000 | [diff] [blame] | 9725 | // to gnutools::Linker. | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9726 | void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9727 | const InputInfo &Output, | 
|  | 9728 | const InputInfoList &Inputs, | 
|  | 9729 | const ArgList &Args, | 
|  | 9730 | const char *LinkingOutput) const { | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9731 |  | 
| Douglas Katzman | 5436607 | 2015-07-27 16:53:08 +0000 | [diff] [blame] | 9732 | const toolchains::NaClToolChain &ToolChain = | 
|  | 9733 | static_cast<const toolchains::NaClToolChain &>(getToolChain()); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9734 | const Driver &D = ToolChain.getDriver(); | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9735 | const llvm::Triple::ArchType Arch = ToolChain.getArch(); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9736 | const bool IsStatic = | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9737 | !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9738 |  | 
|  | 9739 | ArgStringList CmdArgs; | 
|  | 9740 |  | 
|  | 9741 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 9742 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 9743 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 9744 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 9745 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 9746 | // handled somewhere else. | 
|  | 9747 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 9748 |  | 
|  | 9749 | if (!D.SysRoot.empty()) | 
|  | 9750 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 9751 |  | 
|  | 9752 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 9753 | CmdArgs.push_back("-export-dynamic"); | 
|  | 9754 |  | 
|  | 9755 | if (Args.hasArg(options::OPT_s)) | 
|  | 9756 | CmdArgs.push_back("-s"); | 
|  | 9757 |  | 
| Douglas Katzman | 5436607 | 2015-07-27 16:53:08 +0000 | [diff] [blame] | 9758 | // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag | 
|  | 9759 | // from there is --build-id, which we do want. | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9760 | CmdArgs.push_back("--build-id"); | 
|  | 9761 |  | 
|  | 9762 | if (!IsStatic) | 
|  | 9763 | CmdArgs.push_back("--eh-frame-hdr"); | 
|  | 9764 |  | 
|  | 9765 | CmdArgs.push_back("-m"); | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9766 | if (Arch == llvm::Triple::x86) | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9767 | CmdArgs.push_back("elf_i386_nacl"); | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9768 | else if (Arch == llvm::Triple::arm) | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9769 | CmdArgs.push_back("armelf_nacl"); | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9770 | else if (Arch == llvm::Triple::x86_64) | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9771 | CmdArgs.push_back("elf_x86_64_nacl"); | 
| Petar Jovanovic | 26a4a40 | 2015-07-08 13:07:31 +0000 | [diff] [blame] | 9772 | else if (Arch == llvm::Triple::mipsel) | 
|  | 9773 | CmdArgs.push_back("mipselelf_nacl"); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9774 | else | 
| Douglas Katzman | fe77e0d | 2015-06-04 00:15:00 +0000 | [diff] [blame] | 9775 | D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() | 
|  | 9776 | << "Native Client"; | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9777 |  | 
|  | 9778 | if (IsStatic) | 
|  | 9779 | CmdArgs.push_back("-static"); | 
|  | 9780 | else if (Args.hasArg(options::OPT_shared)) | 
|  | 9781 | CmdArgs.push_back("-shared"); | 
|  | 9782 |  | 
|  | 9783 | CmdArgs.push_back("-o"); | 
|  | 9784 | CmdArgs.push_back(Output.getFilename()); | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9785 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9786 | if (!Args.hasArg(options::OPT_shared)) | 
|  | 9787 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o"))); | 
|  | 9788 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); | 
|  | 9789 |  | 
|  | 9790 | const char *crtbegin; | 
|  | 9791 | if (IsStatic) | 
|  | 9792 | crtbegin = "crtbeginT.o"; | 
|  | 9793 | else if (Args.hasArg(options::OPT_shared)) | 
|  | 9794 | crtbegin = "crtbeginS.o"; | 
|  | 9795 | else | 
|  | 9796 | crtbegin = "crtbegin.o"; | 
|  | 9797 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); | 
|  | 9798 | } | 
|  | 9799 |  | 
|  | 9800 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
|  | 9801 | Args.AddAllArgs(CmdArgs, options::OPT_u); | 
|  | 9802 |  | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 9803 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9804 |  | 
|  | 9805 | if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) | 
|  | 9806 | CmdArgs.push_back("--no-demangle"); | 
|  | 9807 |  | 
|  | 9808 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
|  | 9809 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9810 | if (D.CCCIsCXX() && | 
|  | 9811 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9812 | bool OnlyLibstdcxxStatic = | 
|  | 9813 | Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic; | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9814 | if (OnlyLibstdcxxStatic) | 
|  | 9815 | CmdArgs.push_back("-Bstatic"); | 
|  | 9816 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 9817 | if (OnlyLibstdcxxStatic) | 
|  | 9818 | CmdArgs.push_back("-Bdynamic"); | 
|  | 9819 | CmdArgs.push_back("-lm"); | 
|  | 9820 | } | 
|  | 9821 |  | 
|  | 9822 | if (!Args.hasArg(options::OPT_nostdlib)) { | 
|  | 9823 | if (!Args.hasArg(options::OPT_nodefaultlibs)) { | 
|  | 9824 | // Always use groups, since it has no effect on dynamic libraries. | 
|  | 9825 | CmdArgs.push_back("--start-group"); | 
|  | 9826 | CmdArgs.push_back("-lc"); | 
|  | 9827 | // NaCl's libc++ currently requires libpthread, so just always include it | 
|  | 9828 | // in the group for C++. | 
|  | 9829 | if (Args.hasArg(options::OPT_pthread) || | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9830 | Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) { | 
| Petar Jovanovic | 26a4a40 | 2015-07-08 13:07:31 +0000 | [diff] [blame] | 9831 | // Gold, used by Mips, handles nested groups differently than ld, and | 
|  | 9832 | // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a, | 
|  | 9833 | // which is not a desired behaviour here. | 
|  | 9834 | // See https://sourceware.org/ml/binutils/2015-03/msg00034.html | 
|  | 9835 | if (getToolChain().getArch() == llvm::Triple::mipsel) | 
|  | 9836 | CmdArgs.push_back("-lnacl"); | 
|  | 9837 |  | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9838 | CmdArgs.push_back("-lpthread"); | 
|  | 9839 | } | 
|  | 9840 |  | 
|  | 9841 | CmdArgs.push_back("-lgcc"); | 
|  | 9842 | CmdArgs.push_back("--as-needed"); | 
|  | 9843 | if (IsStatic) | 
|  | 9844 | CmdArgs.push_back("-lgcc_eh"); | 
|  | 9845 | else | 
|  | 9846 | CmdArgs.push_back("-lgcc_s"); | 
|  | 9847 | CmdArgs.push_back("--no-as-needed"); | 
| Petar Jovanovic | 26a4a40 | 2015-07-08 13:07:31 +0000 | [diff] [blame] | 9848 |  | 
|  | 9849 | // Mips needs to create and use pnacl_legacy library that contains | 
|  | 9850 | // definitions from bitcode/pnaclmm.c and definitions for | 
|  | 9851 | // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset(). | 
|  | 9852 | if (getToolChain().getArch() == llvm::Triple::mipsel) | 
|  | 9853 | CmdArgs.push_back("-lpnacl_legacy"); | 
|  | 9854 |  | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9855 | CmdArgs.push_back("--end-group"); | 
|  | 9856 | } | 
|  | 9857 |  | 
|  | 9858 | if (!Args.hasArg(options::OPT_nostartfiles)) { | 
|  | 9859 | const char *crtend; | 
|  | 9860 | if (Args.hasArg(options::OPT_shared)) | 
|  | 9861 | crtend = "crtendS.o"; | 
|  | 9862 | else | 
|  | 9863 | crtend = "crtend.o"; | 
|  | 9864 |  | 
|  | 9865 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend))); | 
|  | 9866 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); | 
|  | 9867 | } | 
|  | 9868 | } | 
|  | 9869 |  | 
| Peter Collingbourne | 39719a7 | 2015-11-20 20:49:39 +0000 | [diff] [blame] | 9870 | const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath()); | 
|  | 9871 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Derek Schuff | 6ab52fa | 2015-03-30 20:31:33 +0000 | [diff] [blame] | 9872 | } | 
|  | 9873 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9874 | void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9875 | const InputInfo &Output, | 
|  | 9876 | const InputInfoList &Inputs, | 
|  | 9877 | const ArgList &Args, | 
|  | 9878 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 9879 | claimNoWarnArgs(Args); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9880 | ArgStringList CmdArgs; | 
|  | 9881 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9882 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9883 |  | 
|  | 9884 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 9885 | CmdArgs.push_back(Output.getFilename()); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9886 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9887 | for (const auto &II : Inputs) | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 9888 | CmdArgs.push_back(II.getFilename()); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9889 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9890 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 9891 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9892 | } | 
|  | 9893 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9894 | void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9895 | const InputInfo &Output, | 
|  | 9896 | const InputInfoList &Inputs, | 
|  | 9897 | const ArgList &Args, | 
|  | 9898 | const char *LinkingOutput) const { | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9899 | const Driver &D = getToolChain().getDriver(); | 
|  | 9900 | ArgStringList CmdArgs; | 
|  | 9901 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 9902 | if (Output.isFilename()) { | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9903 | CmdArgs.push_back("-o"); | 
|  | 9904 | CmdArgs.push_back(Output.getFilename()); | 
|  | 9905 | } else { | 
|  | 9906 | assert(Output.isNothing() && "Invalid output."); | 
|  | 9907 | } | 
|  | 9908 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9909 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9910 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); | 
|  | 9911 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); | 
|  | 9912 | CmdArgs.push_back( | 
|  | 9913 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
|  | 9914 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); | 
| Eli Friedman | 83de513 | 2011-12-08 23:54:21 +0000 | [diff] [blame] | 9915 | } | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9916 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 9917 | Args.AddAllArgs(CmdArgs, | 
|  | 9918 | {options::OPT_L, options::OPT_T_Group, options::OPT_e}); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9919 |  | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 9920 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9921 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 9922 | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
| Eli Friedman | 83de513 | 2011-12-08 23:54:21 +0000 | [diff] [blame] | 9923 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9924 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 9925 | if (D.CCCIsCXX()) { | 
| Daniel Dunbar | 3f7796f | 2010-09-17 01:20:05 +0000 | [diff] [blame] | 9926 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9927 | CmdArgs.push_back("-lm"); | 
|  | 9928 | } | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9929 | } | 
|  | 9930 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 9931 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Eli Friedman | 83de513 | 2011-12-08 23:54:21 +0000 | [diff] [blame] | 9932 | if (Args.hasArg(options::OPT_pthread)) | 
|  | 9933 | CmdArgs.push_back("-lpthread"); | 
|  | 9934 | CmdArgs.push_back("-lc"); | 
|  | 9935 | CmdArgs.push_back("-lCompilerRT-Generic"); | 
|  | 9936 | CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib"); | 
|  | 9937 | CmdArgs.push_back( | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 9938 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9939 | } | 
|  | 9940 |  | 
| Logan Chien | eb9162f | 2014-06-26 14:23:45 +0000 | [diff] [blame] | 9941 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 9942 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Chris Lattner | 3e2ee14 | 2010-07-07 16:01:42 +0000 | [diff] [blame] | 9943 | } | 
|  | 9944 |  | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9945 | /// DragonFly Tools | 
|  | 9946 |  | 
|  | 9947 | // For now, DragonFly Assemble does just about the same as for | 
|  | 9948 | // FreeBSD, but this may change soon. | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9949 | void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9950 | const InputInfo &Output, | 
|  | 9951 | const InputInfoList &Inputs, | 
|  | 9952 | const ArgList &Args, | 
|  | 9953 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 9954 | claimNoWarnArgs(Args); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9955 | ArgStringList CmdArgs; | 
|  | 9956 |  | 
|  | 9957 | // When building 32-bit code on DragonFly/pc64, we have to explicitly | 
|  | 9958 | // instruct as in the base system to assemble 32-bit code. | 
| Rafael Espindola | 35ca7d9 | 2012-10-07 04:44:33 +0000 | [diff] [blame] | 9959 | if (getToolChain().getArch() == llvm::Triple::x86) | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9960 | CmdArgs.push_back("--32"); | 
|  | 9961 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9962 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9963 |  | 
|  | 9964 | CmdArgs.push_back("-o"); | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 9965 | CmdArgs.push_back(Output.getFilename()); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9966 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9967 | for (const auto &II : Inputs) | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 9968 | CmdArgs.push_back(II.getFilename()); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9969 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 9970 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 9971 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9972 | } | 
|  | 9973 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 9974 | void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 9975 | const InputInfo &Output, | 
|  | 9976 | const InputInfoList &Inputs, | 
|  | 9977 | const ArgList &Args, | 
|  | 9978 | const char *LinkingOutput) const { | 
| Daniel Dunbar | 083edf7 | 2009-12-21 18:54:17 +0000 | [diff] [blame] | 9979 | const Driver &D = getToolChain().getDriver(); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9980 | ArgStringList CmdArgs; | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 9981 |  | 
| Joerg Sonnenberger | 6165ab1 | 2011-03-21 13:51:29 +0000 | [diff] [blame] | 9982 | if (!D.SysRoot.empty()) | 
|  | 9983 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 9984 |  | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 9985 | CmdArgs.push_back("--eh-frame-hdr"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9986 | if (Args.hasArg(options::OPT_static)) { | 
|  | 9987 | CmdArgs.push_back("-Bstatic"); | 
|  | 9988 | } else { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 9989 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 9990 | CmdArgs.push_back("-export-dynamic"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9991 | if (Args.hasArg(options::OPT_shared)) | 
|  | 9992 | CmdArgs.push_back("-Bshareable"); | 
|  | 9993 | else { | 
|  | 9994 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 9995 | CmdArgs.push_back("/usr/libexec/ld-elf.so.2"); | 
|  | 9996 | } | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 9997 | CmdArgs.push_back("--hash-style=gnu"); | 
|  | 9998 | CmdArgs.push_back("--enable-new-dtags"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 9999 | } | 
|  | 10000 |  | 
|  | 10001 | // When building 32-bit code on DragonFly/pc64, we have to explicitly | 
|  | 10002 | // instruct ld in the base system to link 32-bit code. | 
| Rafael Espindola | 35ca7d9 | 2012-10-07 04:44:33 +0000 | [diff] [blame] | 10003 | if (getToolChain().getArch() == llvm::Triple::x86) { | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10004 | CmdArgs.push_back("-m"); | 
|  | 10005 | CmdArgs.push_back("elf_i386"); | 
|  | 10006 | } | 
|  | 10007 |  | 
| Daniel Dunbar | b440f56 | 2010-08-02 02:38:21 +0000 | [diff] [blame] | 10008 | if (Output.isFilename()) { | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10009 | CmdArgs.push_back("-o"); | 
|  | 10010 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10011 | } else { | 
|  | 10012 | assert(Output.isNothing() && "Invalid output."); | 
|  | 10013 | } | 
|  | 10014 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10015 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10016 | if (!Args.hasArg(options::OPT_shared)) { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10017 | if (Args.hasArg(options::OPT_pg)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10018 | CmdArgs.push_back( | 
|  | 10019 | Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10020 | else { | 
|  | 10021 | if (Args.hasArg(options::OPT_pie)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10022 | CmdArgs.push_back( | 
|  | 10023 | Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10024 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10025 | CmdArgs.push_back( | 
|  | 10026 | Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10027 | } | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10028 | } | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10029 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10030 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10031 | CmdArgs.push_back( | 
|  | 10032 | Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10033 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10034 | CmdArgs.push_back( | 
|  | 10035 | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10036 | } | 
|  | 10037 |  | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 10038 | Args.AddAllArgs(CmdArgs, | 
|  | 10039 | {options::OPT_L, options::OPT_T_Group, options::OPT_e}); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10040 |  | 
| Daniel Dunbar | 54423b2 | 2010-09-17 00:24:54 +0000 | [diff] [blame] | 10041 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10042 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10043 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 10044 | CmdArgs.push_back("-L/usr/lib/gcc50"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10045 |  | 
|  | 10046 | if (!Args.hasArg(options::OPT_static)) { | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 10047 | CmdArgs.push_back("-rpath"); | 
|  | 10048 | CmdArgs.push_back("/usr/lib/gcc50"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10049 | } | 
|  | 10050 |  | 
| Hans Wennborg | 70850d8 | 2013-07-18 20:29:38 +0000 | [diff] [blame] | 10051 | if (D.CCCIsCXX()) { | 
| Daniel Dunbar | 3f7796f | 2010-09-17 01:20:05 +0000 | [diff] [blame] | 10052 | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
| Rafael Espindola | 38360b3 | 2010-07-20 12:59:03 +0000 | [diff] [blame] | 10053 | CmdArgs.push_back("-lm"); | 
|  | 10054 | } | 
|  | 10055 |  | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10056 | if (Args.hasArg(options::OPT_pthread)) | 
| Mike Stump | 0a65b63 | 2009-10-31 20:11:46 +0000 | [diff] [blame] | 10057 | CmdArgs.push_back("-lpthread"); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10058 |  | 
|  | 10059 | if (!Args.hasArg(options::OPT_nolibc)) { | 
|  | 10060 | CmdArgs.push_back("-lc"); | 
|  | 10061 | } | 
|  | 10062 |  | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 10063 | if (Args.hasArg(options::OPT_static) || | 
|  | 10064 | Args.hasArg(options::OPT_static_libgcc)) { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10065 | CmdArgs.push_back("-lgcc"); | 
|  | 10066 | CmdArgs.push_back("-lgcc_eh"); | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 10067 | } else { | 
|  | 10068 | if (Args.hasArg(options::OPT_shared_libgcc)) { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10069 | CmdArgs.push_back("-lgcc_pic"); | 
|  | 10070 | if (!Args.hasArg(options::OPT_shared)) | 
|  | 10071 | CmdArgs.push_back("-lgcc"); | 
| Dimitry Andric | f59a2b3 | 2015-12-27 10:01:44 +0000 | [diff] [blame] | 10072 | } else { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10073 | CmdArgs.push_back("-lgcc"); | 
|  | 10074 | CmdArgs.push_back("--as-needed"); | 
|  | 10075 | CmdArgs.push_back("-lgcc_pic"); | 
|  | 10076 | CmdArgs.push_back("--no-as-needed"); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10077 | } | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10078 | } | 
|  | 10079 | } | 
|  | 10080 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10081 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10082 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10083 | CmdArgs.push_back( | 
|  | 10084 | Args.MakeArgString(getToolChain().GetFilePath("crtendS.o"))); | 
| John McCall | 65b8da0 | 2013-04-11 22:55:55 +0000 | [diff] [blame] | 10085 | else | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10086 | CmdArgs.push_back( | 
|  | 10087 | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
|  | 10088 | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10089 | } | 
|  | 10090 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10091 | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
| Nick Lewycky | 82fe5f4 | 2011-05-24 21:54:59 +0000 | [diff] [blame] | 10092 |  | 
| Logan Chien | eb9162f | 2014-06-26 14:23:45 +0000 | [diff] [blame] | 10093 | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10094 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Daniel Dunbar | cc91234 | 2009-05-02 18:28:39 +0000 | [diff] [blame] | 10095 | } | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10096 |  | 
| Zachary Turner | 0eaf8fc | 2014-10-22 20:40:28 +0000 | [diff] [blame] | 10097 | // Try to find Exe from a Visual Studio distribution.  This first tries to find | 
|  | 10098 | // an installed copy of Visual Studio and, failing that, looks in the PATH, | 
|  | 10099 | // making sure that whatever executable that's found is not a same-named exe | 
|  | 10100 | // from clang itself to prevent clang from falling back to itself. | 
|  | 10101 | static std::string FindVisualStudioExecutable(const ToolChain &TC, | 
|  | 10102 | const char *Exe, | 
|  | 10103 | const char *ClangProgramPath) { | 
|  | 10104 | const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); | 
|  | 10105 | std::string visualStudioBinDir; | 
|  | 10106 | if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath, | 
|  | 10107 | visualStudioBinDir)) { | 
|  | 10108 | SmallString<128> FilePath(visualStudioBinDir); | 
|  | 10109 | llvm::sys::path::append(FilePath, Exe); | 
|  | 10110 | if (llvm::sys::fs::can_execute(FilePath.c_str())) | 
|  | 10111 | return FilePath.str(); | 
|  | 10112 | } | 
|  | 10113 |  | 
|  | 10114 | return Exe; | 
|  | 10115 | } | 
|  | 10116 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10117 | void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10118 | const InputInfo &Output, | 
|  | 10119 | const InputInfoList &Inputs, | 
|  | 10120 | const ArgList &Args, | 
|  | 10121 | const char *LinkingOutput) const { | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10122 | ArgStringList CmdArgs; | 
| Saleem Abdulrasool | 21b1876 | 2014-12-19 23:56:28 +0000 | [diff] [blame] | 10123 | const ToolChain &TC = getToolChain(); | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10124 |  | 
| Saleem Abdulrasool | 9a21546 | 2014-12-19 23:56:31 +0000 | [diff] [blame] | 10125 | assert((Output.isFilename() || Output.isNothing()) && "invalid output"); | 
|  | 10126 | if (Output.isFilename()) | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10127 | CmdArgs.push_back( | 
|  | 10128 | Args.MakeArgString(std::string("-out:") + Output.getFilename())); | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10129 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10130 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) && | 
|  | 10131 | !C.getDriver().IsCLMode()) | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10132 | CmdArgs.push_back("-defaultlib:libcmt"); | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10133 |  | 
| Zachary Turner | 10d75b2 | 2014-10-22 20:40:43 +0000 | [diff] [blame] | 10134 | if (!llvm::sys::Process::GetEnv("LIB")) { | 
|  | 10135 | // If the VC environment hasn't been configured (perhaps because the user | 
|  | 10136 | // did not run vcvarsall), try to build a consistent link environment.  If | 
| Nico Weber | e93bcd1 | 2015-03-11 00:05:26 +0000 | [diff] [blame] | 10137 | // the environment variable is set however, assume the user knows what | 
|  | 10138 | // they're doing. | 
| Zachary Turner | 10d75b2 | 2014-10-22 20:40:43 +0000 | [diff] [blame] | 10139 | std::string VisualStudioDir; | 
| Saleem Abdulrasool | 21b1876 | 2014-12-19 23:56:28 +0000 | [diff] [blame] | 10140 | const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC); | 
| Zachary Turner | 10d75b2 | 2014-10-22 20:40:43 +0000 | [diff] [blame] | 10141 | if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) { | 
|  | 10142 | SmallString<128> LibDir(VisualStudioDir); | 
|  | 10143 | llvm::sys::path::append(LibDir, "VC", "lib"); | 
|  | 10144 | switch (MSVC.getArch()) { | 
|  | 10145 | case llvm::Triple::x86: | 
|  | 10146 | // x86 just puts the libraries directly in lib | 
|  | 10147 | break; | 
|  | 10148 | case llvm::Triple::x86_64: | 
|  | 10149 | llvm::sys::path::append(LibDir, "amd64"); | 
|  | 10150 | break; | 
|  | 10151 | case llvm::Triple::arm: | 
|  | 10152 | llvm::sys::path::append(LibDir, "arm"); | 
|  | 10153 | break; | 
|  | 10154 | default: | 
|  | 10155 | break; | 
|  | 10156 | } | 
|  | 10157 | CmdArgs.push_back( | 
|  | 10158 | Args.MakeArgString(std::string("-libpath:") + LibDir.c_str())); | 
| Reid Kleckner | 7531f7d | 2015-09-11 00:09:39 +0000 | [diff] [blame] | 10159 |  | 
|  | 10160 | if (MSVC.useUniversalCRT(VisualStudioDir)) { | 
|  | 10161 | std::string UniversalCRTLibPath; | 
|  | 10162 | if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath)) | 
|  | 10163 | CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + | 
|  | 10164 | UniversalCRTLibPath.c_str())); | 
|  | 10165 | } | 
| Zachary Turner | 10d75b2 | 2014-10-22 20:40:43 +0000 | [diff] [blame] | 10166 | } | 
|  | 10167 |  | 
|  | 10168 | std::string WindowsSdkLibPath; | 
|  | 10169 | if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath)) | 
|  | 10170 | CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + | 
|  | 10171 | WindowsSdkLibPath.c_str())); | 
|  | 10172 | } | 
|  | 10173 |  | 
| Saleem Abdulrasool | 1f5ceb0 | 2016-07-01 15:36:31 +0000 | [diff] [blame] | 10174 | if (!C.getDriver().IsCLMode() && Args.hasArg(options::OPT_L)) | 
|  | 10175 | for (const auto &LibPath : Args.getAllArgValues(options::OPT_L)) | 
|  | 10176 | CmdArgs.push_back(Args.MakeArgString("-libpath:" + LibPath)); | 
|  | 10177 |  | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10178 | CmdArgs.push_back("-nologo"); | 
|  | 10179 |  | 
| David Majnemer | 58fab35 | 2016-07-09 21:49:16 +0000 | [diff] [blame] | 10180 | if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7, | 
|  | 10181 | options::OPT__SLASH_Zd)) | 
| Hans Wennborg | bbb5f07 | 2014-04-25 16:24:19 +0000 | [diff] [blame] | 10182 | CmdArgs.push_back("-debug"); | 
| Hans Wennborg | bbb5f07 | 2014-04-25 16:24:19 +0000 | [diff] [blame] | 10183 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10184 | bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd, | 
| Hans Wennborg | e4c47f2 | 2015-03-04 23:16:21 +0000 | [diff] [blame] | 10185 | options::OPT_shared); | 
| Hans Wennborg | f1a7425 | 2013-09-10 20:18:04 +0000 | [diff] [blame] | 10186 | if (DLL) { | 
|  | 10187 | CmdArgs.push_back(Args.MakeArgString("-dll")); | 
|  | 10188 |  | 
|  | 10189 | SmallString<128> ImplibName(Output.getFilename()); | 
|  | 10190 | llvm::sys::path::replace_extension(ImplibName, "lib"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10191 | CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName)); | 
| Hans Wennborg | f1a7425 | 2013-09-10 20:18:04 +0000 | [diff] [blame] | 10192 | } | 
|  | 10193 |  | 
| Saleem Abdulrasool | 21b1876 | 2014-12-19 23:56:28 +0000 | [diff] [blame] | 10194 | if (TC.getSanitizerArgs().needsAsanRt()) { | 
| Hans Wennborg | 0517e75 | 2013-08-28 17:36:07 +0000 | [diff] [blame] | 10195 | CmdArgs.push_back(Args.MakeArgString("-debug")); | 
| Hans Wennborg | d024c1c | 2013-08-30 10:50:52 +0000 | [diff] [blame] | 10196 | CmdArgs.push_back(Args.MakeArgString("-incremental:no")); | 
| Timur Iskhodzhanov | 6903e10 | 2014-08-26 10:08:24 +0000 | [diff] [blame] | 10197 | if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) { | 
| Saleem Abdulrasool | b48f1fe | 2015-10-29 03:36:42 +0000 | [diff] [blame] | 10198 | for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"}) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10199 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); | 
| Timur Iskhodzhanov | 651725e | 2014-09-12 14:01:30 +0000 | [diff] [blame] | 10200 | // Make sure the dynamic runtime thunk is not optimized out at link time | 
|  | 10201 | // to ensure proper SEH handling. | 
|  | 10202 | CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor")); | 
| Timur Iskhodzhanov | 6903e10 | 2014-08-26 10:08:24 +0000 | [diff] [blame] | 10203 | } else if (DLL) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10204 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk")); | 
| Alexey Samsonov | 6424e02 | 2014-05-12 20:20:20 +0000 | [diff] [blame] | 10205 | } else { | 
| Saleem Abdulrasool | b48f1fe | 2015-10-29 03:36:42 +0000 | [diff] [blame] | 10206 | for (const auto &Lib : {"asan", "asan_cxx"}) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10207 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); | 
| Alexey Samsonov | 6424e02 | 2014-05-12 20:20:20 +0000 | [diff] [blame] | 10208 | } | 
| Hans Wennborg | 65f1752 | 2013-08-27 18:10:21 +0000 | [diff] [blame] | 10209 | } | 
|  | 10210 |  | 
| Hans Wennborg | 2e27459 | 2013-08-13 23:38:57 +0000 | [diff] [blame] | 10211 | Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link); | 
| Michael J. Spencer | e2f4936 | 2012-06-18 16:56:04 +0000 | [diff] [blame] | 10212 |  | 
| Alexey Bataev | c7e8435 | 2015-08-19 04:49:01 +0000 | [diff] [blame] | 10213 | if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ, | 
|  | 10214 | options::OPT_fno_openmp, false)) { | 
|  | 10215 | CmdArgs.push_back("-nodefaultlib:vcomp.lib"); | 
|  | 10216 | CmdArgs.push_back("-nodefaultlib:vcompd.lib"); | 
|  | 10217 | CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") + | 
|  | 10218 | TC.getDriver().Dir + "/../lib")); | 
|  | 10219 | switch (getOpenMPRuntime(getToolChain(), Args)) { | 
|  | 10220 | case OMPRT_OMP: | 
|  | 10221 | CmdArgs.push_back("-defaultlib:libomp.lib"); | 
|  | 10222 | break; | 
|  | 10223 | case OMPRT_IOMP5: | 
|  | 10224 | CmdArgs.push_back("-defaultlib:libiomp5md.lib"); | 
|  | 10225 | break; | 
|  | 10226 | case OMPRT_GOMP: | 
|  | 10227 | break; | 
|  | 10228 | case OMPRT_Unknown: | 
|  | 10229 | // Already diagnosed. | 
|  | 10230 | break; | 
|  | 10231 | } | 
|  | 10232 | } | 
|  | 10233 |  | 
| Andrey Turetskiy | a486857 | 2016-03-14 11:19:43 +0000 | [diff] [blame] | 10234 | // Add compiler-rt lib in case if it was explicitly | 
|  | 10235 | // specified as an argument for --rtlib option. | 
|  | 10236 | if (!Args.hasArg(options::OPT_nostdlib)) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10237 | AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args); | 
| Andrey Turetskiy | a486857 | 2016-03-14 11:19:43 +0000 | [diff] [blame] | 10238 | } | 
|  | 10239 |  | 
| Reid Kleckner | 337188f | 2014-09-16 19:22:00 +0000 | [diff] [blame] | 10240 | // Add filenames, libraries, and other linker inputs. | 
|  | 10241 | for (const auto &Input : Inputs) { | 
|  | 10242 | if (Input.isFilename()) { | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 10243 | CmdArgs.push_back(Input.getFilename()); | 
| Reid Kleckner | 337188f | 2014-09-16 19:22:00 +0000 | [diff] [blame] | 10244 | continue; | 
|  | 10245 | } | 
|  | 10246 |  | 
|  | 10247 | const Arg &A = Input.getInputArg(); | 
|  | 10248 |  | 
|  | 10249 | // Render -l options differently for the MSVC linker. | 
|  | 10250 | if (A.getOption().matches(options::OPT_l)) { | 
|  | 10251 | StringRef Lib = A.getValue(); | 
|  | 10252 | const char *LinkLibArg; | 
|  | 10253 | if (Lib.endswith(".lib")) | 
|  | 10254 | LinkLibArg = Args.MakeArgString(Lib); | 
|  | 10255 | else | 
|  | 10256 | LinkLibArg = Args.MakeArgString(Lib + ".lib"); | 
|  | 10257 | CmdArgs.push_back(LinkLibArg); | 
|  | 10258 | continue; | 
|  | 10259 | } | 
|  | 10260 |  | 
|  | 10261 | // Otherwise, this is some other kind of linker input option like -Wl, -z, | 
|  | 10262 | // or -L. Render it, even if MSVC doesn't understand it. | 
|  | 10263 | A.renderAsInput(Args, CmdArgs); | 
|  | 10264 | } | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10265 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10266 | TC.addProfileRTLibs(Args, CmdArgs); | 
| Nathan Slingerland | e8ddf9e | 2016-01-05 18:27:06 +0000 | [diff] [blame] | 10267 |  | 
| Zachary Turner | 719f58c | 2014-12-01 23:06:47 +0000 | [diff] [blame] | 10268 | // We need to special case some linker paths.  In the case of lld, we need to | 
|  | 10269 | // translate 'lld' into 'lld-link', and in the case of the regular msvc | 
|  | 10270 | // linker, we need to use a special search algorithm. | 
|  | 10271 | llvm::SmallString<128> linkPath; | 
|  | 10272 | StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link"); | 
|  | 10273 | if (Linker.equals_lower("lld")) | 
|  | 10274 | Linker = "lld-link"; | 
|  | 10275 |  | 
|  | 10276 | if (Linker.equals_lower("link")) { | 
|  | 10277 | // If we're using the MSVC linker, it's not sufficient to just use link | 
|  | 10278 | // from the program PATH, because other environments like GnuWin32 install | 
|  | 10279 | // their own link.exe which may come first. | 
| Saleem Abdulrasool | 21b1876 | 2014-12-19 23:56:28 +0000 | [diff] [blame] | 10280 | linkPath = FindVisualStudioExecutable(TC, "link.exe", | 
| Zachary Turner | 719f58c | 2014-12-01 23:06:47 +0000 | [diff] [blame] | 10281 | C.getDriver().getClangProgramPath()); | 
|  | 10282 | } else { | 
|  | 10283 | linkPath = Linker; | 
|  | 10284 | llvm::sys::path::replace_extension(linkPath, "exe"); | 
| Saleem Abdulrasool | 21b1876 | 2014-12-19 23:56:28 +0000 | [diff] [blame] | 10285 | linkPath = TC.GetProgramPath(linkPath.c_str()); | 
| Zachary Turner | 719f58c | 2014-12-01 23:06:47 +0000 | [diff] [blame] | 10286 | } | 
|  | 10287 |  | 
| Zachary Turner | 0eaf8fc | 2014-10-22 20:40:28 +0000 | [diff] [blame] | 10288 | const char *Exec = Args.MakeArgString(linkPath); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10289 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Michael J. Spencer | b186bc3 | 2010-08-21 21:55:07 +0000 | [diff] [blame] | 10290 | } | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10291 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10292 | void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10293 | const InputInfo &Output, | 
|  | 10294 | const InputInfoList &Inputs, | 
|  | 10295 | const ArgList &Args, | 
|  | 10296 | const char *LinkingOutput) const { | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10297 | C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput)); | 
|  | 10298 | } | 
|  | 10299 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10300 | std::unique_ptr<Command> visualstudio::Compiler::GetCommand( | 
| David Blaikie | c11bf80 | 2014-09-04 16:04:28 +0000 | [diff] [blame] | 10301 | Compilation &C, const JobAction &JA, const InputInfo &Output, | 
|  | 10302 | const InputInfoList &Inputs, const ArgList &Args, | 
|  | 10303 | const char *LinkingOutput) const { | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10304 | ArgStringList CmdArgs; | 
| Hans Wennborg | 263c213 | 2013-09-24 17:36:21 +0000 | [diff] [blame] | 10305 | CmdArgs.push_back("/nologo"); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10306 | CmdArgs.push_back("/c");  // Compile only. | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10307 | CmdArgs.push_back("/W0"); // No warnings. | 
|  | 10308 |  | 
|  | 10309 | // The goal is to be able to invoke this tool correctly based on | 
|  | 10310 | // any flag accepted by clang-cl. | 
|  | 10311 |  | 
|  | 10312 | // These are spelled the same way in clang and cl.exe,. | 
| Douglas Katzman | 57a9c7e | 2015-07-29 18:39:14 +0000 | [diff] [blame] | 10313 | Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I}); | 
| Hans Wennborg | b6331dc | 2013-09-24 18:17:21 +0000 | [diff] [blame] | 10314 |  | 
|  | 10315 | // Optimization level. | 
| David Majnemer | 015ce0f | 2015-07-27 07:32:11 +0000 | [diff] [blame] | 10316 | if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin)) | 
|  | 10317 | CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi" | 
|  | 10318 | : "/Oi-"); | 
| Hans Wennborg | b6331dc | 2013-09-24 18:17:21 +0000 | [diff] [blame] | 10319 | if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) { | 
|  | 10320 | if (A->getOption().getID() == options::OPT_O0) { | 
|  | 10321 | CmdArgs.push_back("/Od"); | 
|  | 10322 | } else { | 
| David Majnemer | 015ce0f | 2015-07-27 07:32:11 +0000 | [diff] [blame] | 10323 | CmdArgs.push_back("/Og"); | 
|  | 10324 |  | 
| Hans Wennborg | b6331dc | 2013-09-24 18:17:21 +0000 | [diff] [blame] | 10325 | StringRef OptLevel = A->getValue(); | 
| David Majnemer | 015ce0f | 2015-07-27 07:32:11 +0000 | [diff] [blame] | 10326 | if (OptLevel == "s" || OptLevel == "z") | 
|  | 10327 | CmdArgs.push_back("/Os"); | 
|  | 10328 | else | 
|  | 10329 | CmdArgs.push_back("/Ot"); | 
|  | 10330 |  | 
|  | 10331 | CmdArgs.push_back("/Ob2"); | 
| Hans Wennborg | b6331dc | 2013-09-24 18:17:21 +0000 | [diff] [blame] | 10332 | } | 
|  | 10333 | } | 
| David Majnemer | 015ce0f | 2015-07-27 07:32:11 +0000 | [diff] [blame] | 10334 | if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer, | 
|  | 10335 | options::OPT_fno_omit_frame_pointer)) | 
|  | 10336 | CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer | 
|  | 10337 | ? "/Oy" | 
|  | 10338 | : "/Oy-"); | 
|  | 10339 | if (!Args.hasArg(options::OPT_fwritable_strings)) | 
|  | 10340 | CmdArgs.push_back("/GF"); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10341 |  | 
| Nico Weber | 3f8dafb | 2015-03-12 19:37:10 +0000 | [diff] [blame] | 10342 | // Flags for which clang-cl has an alias. | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10343 | // FIXME: How can we ensure this stays in sync with relevant clang-cl options? | 
|  | 10344 |  | 
| David Majnemer | f607234 | 2014-07-01 22:24:56 +0000 | [diff] [blame] | 10345 | if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR, | 
|  | 10346 | /*default=*/false)) | 
|  | 10347 | CmdArgs.push_back("/GR-"); | 
| Etienne Bergeron | e28e7f2 | 2016-06-15 20:34:33 +0000 | [diff] [blame] | 10348 |  | 
|  | 10349 | if (Args.hasFlag(options::OPT__SLASH_GS_, options::OPT__SLASH_GS, | 
|  | 10350 | /*default=*/false)) | 
|  | 10351 | CmdArgs.push_back("/GS-"); | 
|  | 10352 |  | 
| Hans Wennborg | 5149a3b | 2014-03-25 14:48:54 +0000 | [diff] [blame] | 10353 | if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections, | 
|  | 10354 | options::OPT_fno_function_sections)) | 
|  | 10355 | CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections | 
|  | 10356 | ? "/Gy" | 
|  | 10357 | : "/Gy-"); | 
| David Majnemer | dc7a47c | 2014-04-07 16:14:38 +0000 | [diff] [blame] | 10358 | if (Arg *A = Args.getLastArg(options::OPT_fdata_sections, | 
|  | 10359 | options::OPT_fno_data_sections)) | 
| David Majnemer | 6c684a7 | 2014-04-07 16:19:27 +0000 | [diff] [blame] | 10360 | CmdArgs.push_back( | 
|  | 10361 | A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-"); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10362 | if (Args.hasArg(options::OPT_fsyntax_only)) | 
|  | 10363 | CmdArgs.push_back("/Zs"); | 
| Reid Kleckner | 124955a | 2015-08-05 18:51:13 +0000 | [diff] [blame] | 10364 | if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only, | 
|  | 10365 | options::OPT__SLASH_Z7)) | 
| Reid Kleckner | c688daf | 2014-02-19 22:05:59 +0000 | [diff] [blame] | 10366 | CmdArgs.push_back("/Z7"); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10367 |  | 
| Nico Weber | 3f8dafb | 2015-03-12 19:37:10 +0000 | [diff] [blame] | 10368 | std::vector<std::string> Includes = | 
|  | 10369 | Args.getAllArgValues(options::OPT_include); | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 10370 | for (const auto &Include : Includes) | 
|  | 10371 | CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include)); | 
| Hans Wennborg | 260ff40 | 2013-09-27 17:54:18 +0000 | [diff] [blame] | 10372 |  | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10373 | // Flags that can simply be passed through. | 
|  | 10374 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD); | 
|  | 10375 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd); | 
| David Majnemer | b880909 | 2016-02-20 09:23:44 +0000 | [diff] [blame] | 10376 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX); | 
|  | 10377 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_); | 
| Reid Kleckner | c542d37 | 2014-06-27 17:02:02 +0000 | [diff] [blame] | 10378 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH); | 
| David Majnemer | bac941c | 2015-07-25 06:07:59 +0000 | [diff] [blame] | 10379 | Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10380 |  | 
|  | 10381 | // The order of these flags is relevant, so pick the last one. | 
|  | 10382 | if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd, | 
|  | 10383 | options::OPT__SLASH_MT, options::OPT__SLASH_MTd)) | 
|  | 10384 | A->render(Args, CmdArgs); | 
|  | 10385 |  | 
| Ehsan Akhgari | d851833 | 2016-01-25 21:14:52 +0000 | [diff] [blame] | 10386 | // Pass through all unknown arguments so that the fallback command can see | 
|  | 10387 | // them too. | 
|  | 10388 | Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN); | 
|  | 10389 |  | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10390 | // Input filename. | 
|  | 10391 | assert(Inputs.size() == 1); | 
|  | 10392 | const InputInfo &II = Inputs[0]; | 
|  | 10393 | assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX); | 
|  | 10394 | CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp"); | 
|  | 10395 | if (II.isFilename()) | 
|  | 10396 | CmdArgs.push_back(II.getFilename()); | 
|  | 10397 | else | 
|  | 10398 | II.getInputArg().renderAsInput(Args, CmdArgs); | 
|  | 10399 |  | 
|  | 10400 | // Output filename. | 
|  | 10401 | assert(Output.getType() == types::TY_Object); | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10402 | const char *Fo = | 
|  | 10403 | Args.MakeArgString(std::string("/Fo") + Output.getFilename()); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10404 | CmdArgs.push_back(Fo); | 
|  | 10405 |  | 
| Hans Wennborg | 188382e | 2013-09-20 18:16:35 +0000 | [diff] [blame] | 10406 | const Driver &D = getToolChain().getDriver(); | 
| Zachary Turner | 0eaf8fc | 2014-10-22 20:40:28 +0000 | [diff] [blame] | 10407 | std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe", | 
|  | 10408 | D.getClangProgramPath()); | 
| David Blaikie | c11bf80 | 2014-09-04 16:04:28 +0000 | [diff] [blame] | 10409 | return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10410 | CmdArgs, Inputs); | 
| Hans Wennborg | 87cfa71 | 2013-09-19 20:32:16 +0000 | [diff] [blame] | 10411 | } | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10412 |  | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10413 | /// MinGW Tools | 
|  | 10414 | void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10415 | const InputInfo &Output, | 
|  | 10416 | const InputInfoList &Inputs, | 
|  | 10417 | const ArgList &Args, | 
|  | 10418 | const char *LinkingOutput) const { | 
|  | 10419 | claimNoWarnArgs(Args); | 
|  | 10420 | ArgStringList CmdArgs; | 
|  | 10421 |  | 
|  | 10422 | if (getToolChain().getArch() == llvm::Triple::x86) { | 
|  | 10423 | CmdArgs.push_back("--32"); | 
|  | 10424 | } else if (getToolChain().getArch() == llvm::Triple::x86_64) { | 
|  | 10425 | CmdArgs.push_back("--64"); | 
|  | 10426 | } | 
|  | 10427 |  | 
|  | 10428 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
|  | 10429 |  | 
|  | 10430 | CmdArgs.push_back("-o"); | 
|  | 10431 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10432 |  | 
|  | 10433 | for (const auto &II : Inputs) | 
|  | 10434 | CmdArgs.push_back(II.getFilename()); | 
|  | 10435 |  | 
|  | 10436 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10437 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10438 |  | 
|  | 10439 | if (Args.hasArg(options::OPT_gsplit_dwarf)) | 
|  | 10440 | SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, | 
|  | 10441 | SplitDebugName(Args, Inputs[0])); | 
|  | 10442 | } | 
|  | 10443 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10444 | void MinGW::Linker::AddLibGCC(const ArgList &Args, | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10445 | ArgStringList &CmdArgs) const { | 
|  | 10446 | if (Args.hasArg(options::OPT_mthreads)) | 
|  | 10447 | CmdArgs.push_back("-lmingwthrd"); | 
|  | 10448 | CmdArgs.push_back("-lmingw32"); | 
| Reid Kleckner | 0213a47 | 2015-07-22 16:01:38 +0000 | [diff] [blame] | 10449 |  | 
| Yaron Keren | aa28133 | 2015-08-09 00:24:07 +0000 | [diff] [blame] | 10450 | // Make use of compiler-rt if --rtlib option is used | 
|  | 10451 | ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args); | 
|  | 10452 | if (RLT == ToolChain::RLT_Libgcc) { | 
|  | 10453 | bool Static = Args.hasArg(options::OPT_static_libgcc) || | 
|  | 10454 | Args.hasArg(options::OPT_static); | 
|  | 10455 | bool Shared = Args.hasArg(options::OPT_shared); | 
|  | 10456 | bool CXX = getToolChain().getDriver().CCCIsCXX(); | 
|  | 10457 |  | 
|  | 10458 | if (Static || (!CXX && !Shared)) { | 
|  | 10459 | CmdArgs.push_back("-lgcc"); | 
|  | 10460 | CmdArgs.push_back("-lgcc_eh"); | 
|  | 10461 | } else { | 
|  | 10462 | CmdArgs.push_back("-lgcc_s"); | 
|  | 10463 | CmdArgs.push_back("-lgcc"); | 
|  | 10464 | } | 
|  | 10465 | } else { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10466 | AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args); | 
| Yaron Keren | aa28133 | 2015-08-09 00:24:07 +0000 | [diff] [blame] | 10467 | } | 
| Reid Kleckner | 0213a47 | 2015-07-22 16:01:38 +0000 | [diff] [blame] | 10468 |  | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10469 | CmdArgs.push_back("-lmoldname"); | 
|  | 10470 | CmdArgs.push_back("-lmingwex"); | 
|  | 10471 | CmdArgs.push_back("-lmsvcrt"); | 
|  | 10472 | } | 
|  | 10473 |  | 
|  | 10474 | void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10475 | const InputInfo &Output, | 
|  | 10476 | const InputInfoList &Inputs, | 
|  | 10477 | const ArgList &Args, | 
|  | 10478 | const char *LinkingOutput) const { | 
|  | 10479 | const ToolChain &TC = getToolChain(); | 
|  | 10480 | const Driver &D = TC.getDriver(); | 
|  | 10481 | // const SanitizerArgs &Sanitize = TC.getSanitizerArgs(); | 
|  | 10482 |  | 
|  | 10483 | ArgStringList CmdArgs; | 
|  | 10484 |  | 
|  | 10485 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 10486 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 10487 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 10488 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 10489 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 10490 | // handled somewhere else. | 
|  | 10491 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 10492 |  | 
| Yaron Keren | 2ffb36e | 2015-07-14 05:23:34 +0000 | [diff] [blame] | 10493 | StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld"); | 
|  | 10494 | if (LinkerName.equals_lower("lld")) { | 
|  | 10495 | CmdArgs.push_back("-flavor"); | 
| Martell Malone | aac044e | 2015-11-22 05:40:06 +0000 | [diff] [blame] | 10496 | CmdArgs.push_back("gnu"); | 
| Yaron Keren | a7fa79f | 2015-11-15 08:06:27 +0000 | [diff] [blame] | 10497 | } else if (!LinkerName.equals_lower("ld")) { | 
|  | 10498 | D.Diag(diag::err_drv_unsupported_linker) << LinkerName; | 
| Yaron Keren | 2ffb36e | 2015-07-14 05:23:34 +0000 | [diff] [blame] | 10499 | } | 
|  | 10500 |  | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10501 | if (!D.SysRoot.empty()) | 
|  | 10502 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 10503 |  | 
|  | 10504 | if (Args.hasArg(options::OPT_s)) | 
|  | 10505 | CmdArgs.push_back("-s"); | 
|  | 10506 |  | 
|  | 10507 | CmdArgs.push_back("-m"); | 
|  | 10508 | if (TC.getArch() == llvm::Triple::x86) | 
|  | 10509 | CmdArgs.push_back("i386pe"); | 
|  | 10510 | if (TC.getArch() == llvm::Triple::x86_64) | 
|  | 10511 | CmdArgs.push_back("i386pep"); | 
| Yaron Keren | 2ffb36e | 2015-07-14 05:23:34 +0000 | [diff] [blame] | 10512 | if (TC.getArch() == llvm::Triple::arm) | 
|  | 10513 | CmdArgs.push_back("thumb2pe"); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10514 |  | 
|  | 10515 | if (Args.hasArg(options::OPT_mwindows)) { | 
|  | 10516 | CmdArgs.push_back("--subsystem"); | 
|  | 10517 | CmdArgs.push_back("windows"); | 
|  | 10518 | } else if (Args.hasArg(options::OPT_mconsole)) { | 
|  | 10519 | CmdArgs.push_back("--subsystem"); | 
|  | 10520 | CmdArgs.push_back("console"); | 
|  | 10521 | } | 
|  | 10522 |  | 
|  | 10523 | if (Args.hasArg(options::OPT_static)) | 
|  | 10524 | CmdArgs.push_back("-Bstatic"); | 
|  | 10525 | else { | 
|  | 10526 | if (Args.hasArg(options::OPT_mdll)) | 
|  | 10527 | CmdArgs.push_back("--dll"); | 
|  | 10528 | else if (Args.hasArg(options::OPT_shared)) | 
|  | 10529 | CmdArgs.push_back("--shared"); | 
|  | 10530 | CmdArgs.push_back("-Bdynamic"); | 
|  | 10531 | if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) { | 
|  | 10532 | CmdArgs.push_back("-e"); | 
|  | 10533 | if (TC.getArch() == llvm::Triple::x86) | 
|  | 10534 | CmdArgs.push_back("_DllMainCRTStartup@12"); | 
|  | 10535 | else | 
|  | 10536 | CmdArgs.push_back("DllMainCRTStartup"); | 
|  | 10537 | CmdArgs.push_back("--enable-auto-image-base"); | 
|  | 10538 | } | 
|  | 10539 | } | 
|  | 10540 |  | 
|  | 10541 | CmdArgs.push_back("-o"); | 
|  | 10542 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10543 |  | 
|  | 10544 | Args.AddAllArgs(CmdArgs, options::OPT_e); | 
|  | 10545 | // FIXME: add -N, -n flags | 
|  | 10546 | Args.AddLastArg(CmdArgs, options::OPT_r); | 
|  | 10547 | Args.AddLastArg(CmdArgs, options::OPT_s); | 
|  | 10548 | Args.AddLastArg(CmdArgs, options::OPT_t); | 
|  | 10549 | Args.AddAllArgs(CmdArgs, options::OPT_u_Group); | 
|  | 10550 | Args.AddLastArg(CmdArgs, options::OPT_Z_Flag); | 
|  | 10551 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10552 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10553 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) { | 
|  | 10554 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o"))); | 
|  | 10555 | } else { | 
|  | 10556 | if (Args.hasArg(options::OPT_municode)) | 
|  | 10557 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o"))); | 
|  | 10558 | else | 
|  | 10559 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o"))); | 
|  | 10560 | } | 
|  | 10561 | if (Args.hasArg(options::OPT_pg)) | 
|  | 10562 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o"))); | 
|  | 10563 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o"))); | 
|  | 10564 | } | 
|  | 10565 |  | 
|  | 10566 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 10567 | TC.AddFilePathLibArgs(Args, CmdArgs); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10568 | AddLinkerInputs(TC, Inputs, Args, CmdArgs); | 
|  | 10569 |  | 
|  | 10570 | // TODO: Add ASan stuff here | 
|  | 10571 |  | 
|  | 10572 | // TODO: Add profile stuff here | 
|  | 10573 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10574 | if (D.CCCIsCXX() && | 
|  | 10575 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10576 | bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) && | 
|  | 10577 | !Args.hasArg(options::OPT_static); | 
|  | 10578 | if (OnlyLibstdcxxStatic) | 
|  | 10579 | CmdArgs.push_back("-Bstatic"); | 
|  | 10580 | TC.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 10581 | if (OnlyLibstdcxxStatic) | 
|  | 10582 | CmdArgs.push_back("-Bdynamic"); | 
|  | 10583 | } | 
|  | 10584 |  | 
|  | 10585 | if (!Args.hasArg(options::OPT_nostdlib)) { | 
|  | 10586 | if (!Args.hasArg(options::OPT_nodefaultlibs)) { | 
|  | 10587 | if (Args.hasArg(options::OPT_static)) | 
|  | 10588 | CmdArgs.push_back("--start-group"); | 
|  | 10589 |  | 
|  | 10590 | if (Args.hasArg(options::OPT_fstack_protector) || | 
|  | 10591 | Args.hasArg(options::OPT_fstack_protector_strong) || | 
|  | 10592 | Args.hasArg(options::OPT_fstack_protector_all)) { | 
|  | 10593 | CmdArgs.push_back("-lssp_nonshared"); | 
|  | 10594 | CmdArgs.push_back("-lssp"); | 
|  | 10595 | } | 
|  | 10596 | if (Args.hasArg(options::OPT_fopenmp)) | 
|  | 10597 | CmdArgs.push_back("-lgomp"); | 
|  | 10598 |  | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10599 | AddLibGCC(Args, CmdArgs); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10600 |  | 
|  | 10601 | if (Args.hasArg(options::OPT_pg)) | 
|  | 10602 | CmdArgs.push_back("-lgmon"); | 
|  | 10603 |  | 
| Yaron Keren | adce68e | 2015-07-06 18:52:19 +0000 | [diff] [blame] | 10604 | if (Args.hasArg(options::OPT_pthread)) | 
|  | 10605 | CmdArgs.push_back("-lpthread"); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10606 |  | 
|  | 10607 | // add system libraries | 
|  | 10608 | if (Args.hasArg(options::OPT_mwindows)) { | 
|  | 10609 | CmdArgs.push_back("-lgdi32"); | 
|  | 10610 | CmdArgs.push_back("-lcomdlg32"); | 
|  | 10611 | } | 
|  | 10612 | CmdArgs.push_back("-ladvapi32"); | 
|  | 10613 | CmdArgs.push_back("-lshell32"); | 
|  | 10614 | CmdArgs.push_back("-luser32"); | 
|  | 10615 | CmdArgs.push_back("-lkernel32"); | 
|  | 10616 |  | 
|  | 10617 | if (Args.hasArg(options::OPT_static)) | 
|  | 10618 | CmdArgs.push_back("--end-group"); | 
| Yaron Keren | 2ffb36e | 2015-07-14 05:23:34 +0000 | [diff] [blame] | 10619 | else if (!LinkerName.equals_lower("lld")) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10620 | AddLibGCC(Args, CmdArgs); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10621 | } | 
|  | 10622 |  | 
|  | 10623 | if (!Args.hasArg(options::OPT_nostartfiles)) { | 
|  | 10624 | // Add crtfastmath.o if available and fast math is enabled. | 
|  | 10625 | TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs); | 
|  | 10626 |  | 
|  | 10627 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o"))); | 
|  | 10628 | } | 
|  | 10629 | } | 
| Yaron Keren | 2ffb36e | 2015-07-14 05:23:34 +0000 | [diff] [blame] | 10630 | const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data())); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10631 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Yaron Keren | 1c0070c | 2015-07-02 04:45:27 +0000 | [diff] [blame] | 10632 | } | 
|  | 10633 |  | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10634 | /// XCore Tools | 
|  | 10635 | // We pass assemble and link construction to the xcc tool. | 
|  | 10636 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10637 | void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10638 | const InputInfo &Output, | 
|  | 10639 | const InputInfoList &Inputs, | 
|  | 10640 | const ArgList &Args, | 
|  | 10641 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 10642 | claimNoWarnArgs(Args); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10643 | ArgStringList CmdArgs; | 
|  | 10644 |  | 
|  | 10645 | CmdArgs.push_back("-o"); | 
|  | 10646 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10647 |  | 
|  | 10648 | CmdArgs.push_back("-c"); | 
|  | 10649 |  | 
| Robert Lytton | 9e8c1a4 | 2014-02-13 10:40:12 +0000 | [diff] [blame] | 10650 | if (Args.hasArg(options::OPT_v)) | 
|  | 10651 | CmdArgs.push_back("-v"); | 
|  | 10652 |  | 
| Robert Lytton | 894d25c | 2014-05-02 09:33:25 +0000 | [diff] [blame] | 10653 | if (Arg *A = Args.getLastArg(options::OPT_g_Group)) | 
|  | 10654 | if (!A->getOption().matches(options::OPT_g0)) | 
|  | 10655 | CmdArgs.push_back("-g"); | 
| Robert Lytton | 9e8c1a4 | 2014-02-13 10:40:12 +0000 | [diff] [blame] | 10656 |  | 
| Robert Lytton | 8e95d4e | 2014-02-11 10:34:45 +0000 | [diff] [blame] | 10657 | if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm, | 
|  | 10658 | false)) | 
|  | 10659 | CmdArgs.push_back("-fverbose-asm"); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10660 |  | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10661 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10662 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 10663 | for (const auto &II : Inputs) | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10664 | CmdArgs.push_back(II.getFilename()); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10665 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 10666 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10667 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10668 | } | 
|  | 10669 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10670 | void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10671 | const InputInfo &Output, | 
|  | 10672 | const InputInfoList &Inputs, | 
|  | 10673 | const ArgList &Args, | 
|  | 10674 | const char *LinkingOutput) const { | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10675 | ArgStringList CmdArgs; | 
|  | 10676 |  | 
|  | 10677 | if (Output.isFilename()) { | 
|  | 10678 | CmdArgs.push_back("-o"); | 
|  | 10679 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10680 | } else { | 
|  | 10681 | assert(Output.isNothing() && "Invalid output."); | 
|  | 10682 | } | 
|  | 10683 |  | 
| Robert Lytton | 9e8c1a4 | 2014-02-13 10:40:12 +0000 | [diff] [blame] | 10684 | if (Args.hasArg(options::OPT_v)) | 
|  | 10685 | CmdArgs.push_back("-v"); | 
|  | 10686 |  | 
| Reid Kleckner | 0bb1fc4 | 2015-07-10 22:25:44 +0000 | [diff] [blame] | 10687 | // Pass -fexceptions through to the linker if it was present. | 
|  | 10688 | if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, | 
|  | 10689 | false)) | 
| Robert Lytton | f7e03c1 | 2014-02-13 10:34:44 +0000 | [diff] [blame] | 10690 | CmdArgs.push_back("-fexceptions"); | 
|  | 10691 |  | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10692 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
|  | 10693 |  | 
| Saleem Abdulrasool | 2456cea | 2014-06-12 02:08:04 +0000 | [diff] [blame] | 10694 | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10695 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Robert Lytton | cf1dd69 | 2013-10-11 10:29:40 +0000 | [diff] [blame] | 10696 | } | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10697 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10698 | void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10699 | const InputInfo &Output, | 
|  | 10700 | const InputInfoList &Inputs, | 
|  | 10701 | const ArgList &Args, | 
|  | 10702 | const char *LinkingOutput) const { | 
| Rafael Espindola | 577637a | 2015-01-03 00:06:04 +0000 | [diff] [blame] | 10703 | claimNoWarnArgs(Args); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10704 | const auto &TC = | 
|  | 10705 | static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain()); | 
|  | 10706 | ArgStringList CmdArgs; | 
|  | 10707 | const char *Exec; | 
|  | 10708 |  | 
|  | 10709 | switch (TC.getArch()) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10710 | default: | 
|  | 10711 | llvm_unreachable("unsupported architecture"); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10712 | case llvm::Triple::arm: | 
|  | 10713 | case llvm::Triple::thumb: | 
|  | 10714 | break; | 
|  | 10715 | case llvm::Triple::x86: | 
|  | 10716 | CmdArgs.push_back("--32"); | 
|  | 10717 | break; | 
|  | 10718 | case llvm::Triple::x86_64: | 
|  | 10719 | CmdArgs.push_back("--64"); | 
|  | 10720 | break; | 
|  | 10721 | } | 
|  | 10722 |  | 
|  | 10723 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
|  | 10724 |  | 
|  | 10725 | CmdArgs.push_back("-o"); | 
|  | 10726 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10727 |  | 
|  | 10728 | for (const auto &Input : Inputs) | 
|  | 10729 | CmdArgs.push_back(Input.getFilename()); | 
|  | 10730 |  | 
|  | 10731 | const std::string Assembler = TC.GetProgramPath("as"); | 
|  | 10732 | Exec = Args.MakeArgString(Assembler); | 
|  | 10733 |  | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10734 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10735 | } | 
|  | 10736 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10737 | void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10738 | const InputInfo &Output, | 
|  | 10739 | const InputInfoList &Inputs, | 
|  | 10740 | const ArgList &Args, | 
|  | 10741 | const char *LinkingOutput) const { | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10742 | const auto &TC = | 
|  | 10743 | static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain()); | 
|  | 10744 | const llvm::Triple &T = TC.getTriple(); | 
|  | 10745 | const Driver &D = TC.getDriver(); | 
|  | 10746 | SmallString<128> EntryPoint; | 
|  | 10747 | ArgStringList CmdArgs; | 
|  | 10748 | const char *Exec; | 
|  | 10749 |  | 
|  | 10750 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 10751 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 10752 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 10753 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 10754 | // and for "clang -w foo.o -o foo" | 
|  | 10755 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 10756 | // Other warning options are already handled somewhere else. | 
|  | 10757 |  | 
|  | 10758 | if (!D.SysRoot.empty()) | 
|  | 10759 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 10760 |  | 
|  | 10761 | if (Args.hasArg(options::OPT_pie)) | 
|  | 10762 | CmdArgs.push_back("-pie"); | 
|  | 10763 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 10764 | CmdArgs.push_back("-export-dynamic"); | 
|  | 10765 | if (Args.hasArg(options::OPT_s)) | 
|  | 10766 | CmdArgs.push_back("--strip-all"); | 
|  | 10767 |  | 
|  | 10768 | CmdArgs.push_back("-m"); | 
|  | 10769 | switch (TC.getArch()) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10770 | default: | 
|  | 10771 | llvm_unreachable("unsupported architecture"); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10772 | case llvm::Triple::arm: | 
|  | 10773 | case llvm::Triple::thumb: | 
|  | 10774 | // FIXME: this is incorrect for WinCE | 
|  | 10775 | CmdArgs.push_back("thumb2pe"); | 
|  | 10776 | break; | 
|  | 10777 | case llvm::Triple::x86: | 
|  | 10778 | CmdArgs.push_back("i386pe"); | 
|  | 10779 | EntryPoint.append("_"); | 
|  | 10780 | break; | 
|  | 10781 | case llvm::Triple::x86_64: | 
|  | 10782 | CmdArgs.push_back("i386pep"); | 
|  | 10783 | break; | 
|  | 10784 | } | 
|  | 10785 |  | 
|  | 10786 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 10787 | switch (T.getArch()) { | 
| Douglas Katzman | a67e50c | 2015-06-26 15:47:46 +0000 | [diff] [blame] | 10788 | default: | 
|  | 10789 | llvm_unreachable("unsupported architecture"); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10790 | case llvm::Triple::arm: | 
|  | 10791 | case llvm::Triple::thumb: | 
|  | 10792 | case llvm::Triple::x86_64: | 
|  | 10793 | EntryPoint.append("_DllMainCRTStartup"); | 
|  | 10794 | break; | 
|  | 10795 | case llvm::Triple::x86: | 
|  | 10796 | EntryPoint.append("_DllMainCRTStartup@12"); | 
|  | 10797 | break; | 
|  | 10798 | } | 
|  | 10799 |  | 
|  | 10800 | CmdArgs.push_back("-shared"); | 
|  | 10801 | CmdArgs.push_back("-Bdynamic"); | 
|  | 10802 |  | 
|  | 10803 | CmdArgs.push_back("--enable-auto-image-base"); | 
|  | 10804 |  | 
|  | 10805 | CmdArgs.push_back("--entry"); | 
|  | 10806 | CmdArgs.push_back(Args.MakeArgString(EntryPoint)); | 
|  | 10807 | } else { | 
|  | 10808 | EntryPoint.append("mainCRTStartup"); | 
|  | 10809 |  | 
|  | 10810 | CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic" | 
|  | 10811 | : "-Bdynamic"); | 
|  | 10812 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10813 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10814 | CmdArgs.push_back("--entry"); | 
|  | 10815 | CmdArgs.push_back(Args.MakeArgString(EntryPoint)); | 
|  | 10816 | } | 
|  | 10817 |  | 
|  | 10818 | // FIXME: handle subsystem | 
|  | 10819 | } | 
|  | 10820 |  | 
|  | 10821 | // NOTE: deal with multiple definitions on Windows (e.g. COMDAT) | 
| Saleem Abdulrasool | 56dd1ac | 2014-10-28 03:15:02 +0000 | [diff] [blame] | 10822 | CmdArgs.push_back("--allow-multiple-definition"); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10823 |  | 
|  | 10824 | CmdArgs.push_back("-o"); | 
|  | 10825 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10826 |  | 
|  | 10827 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) { | 
|  | 10828 | SmallString<261> ImpLib(Output.getFilename()); | 
|  | 10829 | llvm::sys::path::replace_extension(ImpLib, ".lib"); | 
|  | 10830 |  | 
|  | 10831 | CmdArgs.push_back("--out-implib"); | 
|  | 10832 | CmdArgs.push_back(Args.MakeArgString(ImpLib)); | 
|  | 10833 | } | 
|  | 10834 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10835 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10836 | const std::string CRTPath(D.SysRoot + "/usr/lib/"); | 
|  | 10837 | const char *CRTBegin; | 
|  | 10838 |  | 
|  | 10839 | CRTBegin = | 
|  | 10840 | Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj"; | 
|  | 10841 | CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin)); | 
|  | 10842 | } | 
|  | 10843 |  | 
|  | 10844 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 10845 | TC.AddFilePathLibArgs(Args, CmdArgs); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10846 | AddLinkerInputs(TC, Inputs, Args, CmdArgs); | 
|  | 10847 |  | 
|  | 10848 | if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) && | 
|  | 10849 | !Args.hasArg(options::OPT_nodefaultlibs)) { | 
|  | 10850 | bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) && | 
|  | 10851 | !Args.hasArg(options::OPT_static); | 
|  | 10852 | if (StaticCXX) | 
|  | 10853 | CmdArgs.push_back("-Bstatic"); | 
|  | 10854 | TC.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 10855 | if (StaticCXX) | 
|  | 10856 | CmdArgs.push_back("-Bdynamic"); | 
|  | 10857 | } | 
|  | 10858 |  | 
|  | 10859 | if (!Args.hasArg(options::OPT_nostdlib)) { | 
|  | 10860 | if (!Args.hasArg(options::OPT_nodefaultlibs)) { | 
|  | 10861 | // TODO handle /MT[d] /MD[d] | 
|  | 10862 | CmdArgs.push_back("-lmsvcrt"); | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10863 | AddRunTimeLibs(TC, D, CmdArgs, Args); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10864 | } | 
|  | 10865 | } | 
|  | 10866 |  | 
| Saleem Abdulrasool | bb2e5e4 | 2015-10-29 03:36:45 +0000 | [diff] [blame] | 10867 | if (TC.getSanitizerArgs().needsAsanRt()) { | 
|  | 10868 | // TODO handle /MT[d] /MD[d] | 
|  | 10869 | if (Args.hasArg(options::OPT_shared)) { | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10870 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk")); | 
| Saleem Abdulrasool | bb2e5e4 | 2015-10-29 03:36:45 +0000 | [diff] [blame] | 10871 | } else { | 
|  | 10872 | for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"}) | 
| Vedant Kumar | 5fb00e4 | 2016-07-27 23:01:55 +0000 | [diff] [blame] | 10873 | CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib)); | 
| Marcin Koscielnicki | 1072143 | 2016-05-12 10:27:59 +0000 | [diff] [blame] | 10874 | // Make sure the dynamic runtime thunk is not optimized out at link time | 
|  | 10875 | // to ensure proper SEH handling. | 
|  | 10876 | CmdArgs.push_back(Args.MakeArgString("--undefined")); | 
|  | 10877 | CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86 | 
|  | 10878 | ? "___asan_seh_interceptor" | 
|  | 10879 | : "__asan_seh_interceptor")); | 
| Saleem Abdulrasool | bb2e5e4 | 2015-10-29 03:36:45 +0000 | [diff] [blame] | 10880 | } | 
|  | 10881 | } | 
|  | 10882 |  | 
| Saleem Abdulrasool | fd80f83 | 2015-10-28 04:45:58 +0000 | [diff] [blame] | 10883 | Exec = Args.MakeArgString(TC.GetLinkerPath()); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10884 |  | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10885 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
| Saleem Abdulrasool | 543a78b | 2014-10-24 03:13:37 +0000 | [diff] [blame] | 10886 | } | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10887 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10888 | void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10889 | const InputInfo &Output, | 
|  | 10890 | const InputInfoList &Inputs, | 
|  | 10891 | const ArgList &Args, | 
|  | 10892 | const char *LinkingOutput) const { | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10893 | ArgStringList CmdArgs; | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10894 | assert(Inputs.size() == 1); | 
|  | 10895 | const InputInfo &II = Inputs[0]; | 
| Douglas Katzman | 9dc4c62 | 2015-11-20 04:58:12 +0000 | [diff] [blame] | 10896 | assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX || | 
|  | 10897 | II.getType() == types::TY_PP_CXX); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10898 |  | 
| Douglas Katzman | 9dc4c62 | 2015-11-20 04:58:12 +0000 | [diff] [blame] | 10899 | if (JA.getKind() == Action::PreprocessJobClass) { | 
|  | 10900 | Args.ClaimAllArgs(); | 
|  | 10901 | CmdArgs.push_back("-E"); | 
|  | 10902 | } else { | 
|  | 10903 | assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm. | 
|  | 10904 | CmdArgs.push_back("-S"); | 
|  | 10905 | CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified. | 
|  | 10906 | } | 
| Douglas Katzman | 9dc4c62 | 2015-11-20 04:58:12 +0000 | [diff] [blame] | 10907 | CmdArgs.push_back("-DMYRIAD2"); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10908 |  | 
| Douglas Katzman | f607111 | 2015-08-03 14:34:22 +0000 | [diff] [blame] | 10909 | // Append all -I, -iquote, -isystem paths, defines/undefines, | 
|  | 10910 | // 'f' flags, optimize flags, and warning options. | 
|  | 10911 | // These are spelled the same way in clang and moviCompile. | 
| Douglas Katzman | 38dca88 | 2015-09-08 19:29:55 +0000 | [diff] [blame] | 10912 | Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group, | 
| Douglas Katzman | 642e5f9 | 2015-11-16 15:38:40 +0000 | [diff] [blame] | 10913 | options::OPT_std_EQ, options::OPT_D, options::OPT_U, | 
| Douglas Katzman | 38dca88 | 2015-09-08 19:29:55 +0000 | [diff] [blame] | 10914 | options::OPT_f_Group, options::OPT_f_clang_Group, | 
|  | 10915 | options::OPT_g_Group, options::OPT_M_Group, | 
| Douglas Katzman | 4c12508 | 2016-03-15 16:41:31 +0000 | [diff] [blame] | 10916 | options::OPT_O_Group, options::OPT_W_Group, | 
|  | 10917 | options::OPT_mcpu_EQ}); | 
| Douglas Katzman | 38dca88 | 2015-09-08 19:29:55 +0000 | [diff] [blame] | 10918 |  | 
|  | 10919 | // If we're producing a dependency file, and assembly is the final action, | 
|  | 10920 | // then the name of the target in the dependency file should be the '.o' | 
|  | 10921 | // file, not the '.s' file produced by this step. For example, instead of | 
|  | 10922 | //  /tmp/mumble.s: mumble.c .../someheader.h | 
|  | 10923 | // the filename on the lefthand side should be "mumble.o" | 
|  | 10924 | if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) && | 
|  | 10925 | C.getActions().size() == 1 && | 
|  | 10926 | C.getActions()[0]->getKind() == Action::AssembleJobClass) { | 
|  | 10927 | Arg *A = Args.getLastArg(options::OPT_o); | 
|  | 10928 | if (A) { | 
|  | 10929 | CmdArgs.push_back("-MT"); | 
|  | 10930 | CmdArgs.push_back(Args.MakeArgString(A->getValue())); | 
|  | 10931 | } | 
|  | 10932 | } | 
|  | 10933 |  | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10934 | CmdArgs.push_back(II.getFilename()); | 
|  | 10935 | CmdArgs.push_back("-o"); | 
|  | 10936 | CmdArgs.push_back(Output.getFilename()); | 
|  | 10937 |  | 
|  | 10938 | std::string Exec = | 
|  | 10939 | Args.MakeArgString(getToolChain().GetProgramPath("moviCompile")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10940 | C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), | 
|  | 10941 | CmdArgs, Inputs)); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10942 | } | 
|  | 10943 |  | 
| Douglas Katzman | 9535429 | 2015-06-23 20:42:09 +0000 | [diff] [blame] | 10944 | void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10945 | const InputInfo &Output, | 
|  | 10946 | const InputInfoList &Inputs, | 
|  | 10947 | const ArgList &Args, | 
|  | 10948 | const char *LinkingOutput) const { | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10949 | ArgStringList CmdArgs; | 
|  | 10950 |  | 
|  | 10951 | assert(Inputs.size() == 1); | 
|  | 10952 | const InputInfo &II = Inputs[0]; | 
|  | 10953 | assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input. | 
|  | 10954 | assert(Output.getType() == types::TY_Object); | 
|  | 10955 |  | 
|  | 10956 | CmdArgs.push_back("-no6thSlotCompression"); | 
| Douglas Katzman | 4c12508 | 2016-03-15 16:41:31 +0000 | [diff] [blame] | 10957 | const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ); | 
|  | 10958 | if (CPUArg) | 
|  | 10959 | CmdArgs.push_back( | 
|  | 10960 | Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue()))); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10961 | CmdArgs.push_back("-noSPrefixing"); | 
|  | 10962 | CmdArgs.push_back("-a"); // Mystery option. | 
| Douglas Katzman | ae2f358 | 2015-09-11 21:13:46 +0000 | [diff] [blame] | 10963 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
|  | 10964 | for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) { | 
|  | 10965 | A->claim(); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10966 | CmdArgs.push_back( | 
| Douglas Katzman | ae2f358 | 2015-09-11 21:13:46 +0000 | [diff] [blame] | 10967 | Args.MakeArgString(std::string("-i:") + A->getValue(0))); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10968 | } | 
|  | 10969 | CmdArgs.push_back("-elf"); // Output format. | 
|  | 10970 | CmdArgs.push_back(II.getFilename()); | 
|  | 10971 | CmdArgs.push_back( | 
|  | 10972 | Args.MakeArgString(std::string("-o:") + Output.getFilename())); | 
|  | 10973 |  | 
|  | 10974 | std::string Exec = | 
|  | 10975 | Args.MakeArgString(getToolChain().GetProgramPath("moviAsm")); | 
| Justin Bogner | d3371d8 | 2015-07-17 03:35:54 +0000 | [diff] [blame] | 10976 | C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), | 
|  | 10977 | CmdArgs, Inputs)); | 
| Douglas Katzman | 84a7564 | 2015-06-19 14:55:19 +0000 | [diff] [blame] | 10978 | } | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 10979 |  | 
|  | 10980 | void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 10981 | const InputInfo &Output, | 
|  | 10982 | const InputInfoList &Inputs, | 
|  | 10983 | const ArgList &Args, | 
|  | 10984 | const char *LinkingOutput) const { | 
|  | 10985 | const auto &TC = | 
|  | 10986 | static_cast<const toolchains::MyriadToolChain &>(getToolChain()); | 
|  | 10987 | const llvm::Triple &T = TC.getTriple(); | 
|  | 10988 | ArgStringList CmdArgs; | 
| Eric Christopher | 3f5d2bc | 2015-12-08 00:10:13 +0000 | [diff] [blame] | 10989 | bool UseStartfiles = | 
|  | 10990 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles); | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 10991 | bool UseDefaultLibs = | 
|  | 10992 | !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs); | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 10993 |  | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 10994 | if (T.getArch() == llvm::Triple::sparc) | 
|  | 10995 | CmdArgs.push_back("-EB"); | 
|  | 10996 | else // SHAVE assumes little-endian, and sparcel is expressly so. | 
|  | 10997 | CmdArgs.push_back("-EL"); | 
|  | 10998 |  | 
|  | 10999 | // The remaining logic is mostly like gnutools::Linker::ConstructJob, | 
|  | 11000 | // but we never pass through a --sysroot option and various other bits. | 
|  | 11001 | // For example, there are no sanitizers (yet) nor gold linker. | 
|  | 11002 |  | 
|  | 11003 | // Eat some arguments that may be present but have no effect. | 
|  | 11004 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 11005 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 11006 | Args.ClaimAllArgs(options::OPT_static_libgcc); | 
|  | 11007 |  | 
|  | 11008 | if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option. | 
|  | 11009 | CmdArgs.push_back("-s"); | 
|  | 11010 |  | 
|  | 11011 | CmdArgs.push_back("-o"); | 
|  | 11012 | CmdArgs.push_back(Output.getFilename()); | 
|  | 11013 |  | 
|  | 11014 | if (UseStartfiles) { | 
|  | 11015 | // If you want startfiles, it means you want the builtin crti and crtbegin, | 
|  | 11016 | // but not crt0. Myriad link commands provide their own crt0.o as needed. | 
| Douglas Katzman | 674a312 | 2015-11-18 16:24:46 +0000 | [diff] [blame] | 11017 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o"))); | 
|  | 11018 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o"))); | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 11019 | } | 
|  | 11020 |  | 
|  | 11021 | Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, | 
|  | 11022 | options::OPT_e, options::OPT_s, options::OPT_t, | 
|  | 11023 | options::OPT_Z_Flag, options::OPT_r}); | 
|  | 11024 |  | 
| Douglas Katzman | 674a312 | 2015-11-18 16:24:46 +0000 | [diff] [blame] | 11025 | TC.AddFilePathLibArgs(Args, CmdArgs); | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 11026 |  | 
|  | 11027 | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs); | 
|  | 11028 |  | 
| Douglas Katzman | 9e31cb9 | 2015-10-02 18:39:08 +0000 | [diff] [blame] | 11029 | if (UseDefaultLibs) { | 
| Douglas Katzman | 795f57f | 2015-10-09 20:26:20 +0000 | [diff] [blame] | 11030 | if (C.getDriver().CCCIsCXX()) | 
|  | 11031 | CmdArgs.push_back("-lstdc++"); | 
| Douglas Katzman | 9e31cb9 | 2015-10-02 18:39:08 +0000 | [diff] [blame] | 11032 | if (T.getOS() == llvm::Triple::RTEMS) { | 
|  | 11033 | CmdArgs.push_back("--start-group"); | 
|  | 11034 | CmdArgs.push_back("-lc"); | 
|  | 11035 | // You must provide your own "-L" option to enable finding these. | 
|  | 11036 | CmdArgs.push_back("-lrtemscpu"); | 
|  | 11037 | CmdArgs.push_back("-lrtemsbsp"); | 
|  | 11038 | CmdArgs.push_back("--end-group"); | 
|  | 11039 | } else { | 
|  | 11040 | CmdArgs.push_back("-lc"); | 
|  | 11041 | } | 
| Douglas Katzman | 9e31cb9 | 2015-10-02 18:39:08 +0000 | [diff] [blame] | 11042 | CmdArgs.push_back("-lgcc"); | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 11043 | } | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 11044 | if (UseStartfiles) { | 
| Douglas Katzman | 674a312 | 2015-11-18 16:24:46 +0000 | [diff] [blame] | 11045 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o"))); | 
|  | 11046 | CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o"))); | 
| Douglas Katzman | d6e597c | 2015-09-17 19:56:40 +0000 | [diff] [blame] | 11047 | } | 
|  | 11048 |  | 
|  | 11049 | std::string Exec = | 
|  | 11050 | Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld")); | 
|  | 11051 | C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec), | 
|  | 11052 | CmdArgs, Inputs)); | 
|  | 11053 | } | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11054 |  | 
|  | 11055 | void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 11056 | const InputInfo &Output, | 
|  | 11057 | const InputInfoList &Inputs, | 
|  | 11058 | const ArgList &Args, | 
|  | 11059 | const char *LinkingOutput) const { | 
|  | 11060 | claimNoWarnArgs(Args); | 
|  | 11061 | ArgStringList CmdArgs; | 
|  | 11062 |  | 
|  | 11063 | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
|  | 11064 |  | 
|  | 11065 | CmdArgs.push_back("-o"); | 
|  | 11066 | CmdArgs.push_back(Output.getFilename()); | 
|  | 11067 |  | 
|  | 11068 | assert(Inputs.size() == 1 && "Unexpected number of inputs."); | 
|  | 11069 | const InputInfo &Input = Inputs[0]; | 
|  | 11070 | assert(Input.isFilename() && "Invalid input."); | 
|  | 11071 | CmdArgs.push_back(Input.getFilename()); | 
|  | 11072 |  | 
|  | 11073 | const char *Exec = | 
| Paul Robinson | 9d61361 | 2016-05-16 17:22:25 +0000 | [diff] [blame] | 11074 | Args.MakeArgString(getToolChain().GetProgramPath("orbis-as")); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11075 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
|  | 11076 | } | 
|  | 11077 |  | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11078 | static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) { | 
|  | 11079 | const SanitizerArgs &SanArgs = TC.getSanitizerArgs(); | 
|  | 11080 | if (SanArgs.needsUbsanRt()) { | 
|  | 11081 | CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak"); | 
|  | 11082 | } | 
|  | 11083 | if (SanArgs.needsAsanRt()) { | 
|  | 11084 | CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak"); | 
|  | 11085 | } | 
|  | 11086 | } | 
|  | 11087 |  | 
|  | 11088 | static void ConstructPS4LinkJob(const Tool &T, Compilation &C, | 
|  | 11089 | const JobAction &JA, const InputInfo &Output, | 
|  | 11090 | const InputInfoList &Inputs, | 
|  | 11091 | const ArgList &Args, | 
|  | 11092 | const char *LinkingOutput) { | 
|  | 11093 | const toolchains::FreeBSD &ToolChain = | 
|  | 11094 | static_cast<const toolchains::FreeBSD &>(T.getToolChain()); | 
|  | 11095 | const Driver &D = ToolChain.getDriver(); | 
|  | 11096 | ArgStringList CmdArgs; | 
|  | 11097 |  | 
|  | 11098 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 11099 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 11100 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 11101 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 11102 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 11103 | // handled somewhere else. | 
|  | 11104 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 11105 |  | 
|  | 11106 | if (!D.SysRoot.empty()) | 
|  | 11107 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 11108 |  | 
|  | 11109 | if (Args.hasArg(options::OPT_pie)) | 
|  | 11110 | CmdArgs.push_back("-pie"); | 
|  | 11111 |  | 
|  | 11112 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 11113 | CmdArgs.push_back("-export-dynamic"); | 
|  | 11114 | if (Args.hasArg(options::OPT_shared)) | 
|  | 11115 | CmdArgs.push_back("--oformat=so"); | 
|  | 11116 |  | 
|  | 11117 | if (Output.isFilename()) { | 
|  | 11118 | CmdArgs.push_back("-o"); | 
|  | 11119 | CmdArgs.push_back(Output.getFilename()); | 
|  | 11120 | } else { | 
|  | 11121 | assert(Output.isNothing() && "Invalid output."); | 
|  | 11122 | } | 
|  | 11123 |  | 
| Filipe Cabecinhas | 82cd6af | 2015-10-16 15:07:48 +0000 | [diff] [blame] | 11124 | AddPS4SanitizerArgs(ToolChain, CmdArgs); | 
|  | 11125 |  | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11126 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
|  | 11127 | Args.AddAllArgs(CmdArgs, options::OPT_T_Group); | 
|  | 11128 | Args.AddAllArgs(CmdArgs, options::OPT_e); | 
|  | 11129 | Args.AddAllArgs(CmdArgs, options::OPT_s); | 
|  | 11130 | Args.AddAllArgs(CmdArgs, options::OPT_t); | 
|  | 11131 | Args.AddAllArgs(CmdArgs, options::OPT_r); | 
|  | 11132 |  | 
|  | 11133 | if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) | 
|  | 11134 | CmdArgs.push_back("--no-demangle"); | 
|  | 11135 |  | 
|  | 11136 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
|  | 11137 |  | 
|  | 11138 | if (Args.hasArg(options::OPT_pthread)) { | 
|  | 11139 | CmdArgs.push_back("-lpthread"); | 
|  | 11140 | } | 
|  | 11141 |  | 
| Paul Robinson | 9d61361 | 2016-05-16 17:22:25 +0000 | [diff] [blame] | 11142 | const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld")); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11143 |  | 
|  | 11144 | C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs)); | 
|  | 11145 | } | 
|  | 11146 |  | 
|  | 11147 | static void ConstructGoldLinkJob(const Tool &T, Compilation &C, | 
|  | 11148 | const JobAction &JA, const InputInfo &Output, | 
|  | 11149 | const InputInfoList &Inputs, | 
|  | 11150 | const ArgList &Args, | 
|  | 11151 | const char *LinkingOutput) { | 
|  | 11152 | const toolchains::FreeBSD &ToolChain = | 
|  | 11153 | static_cast<const toolchains::FreeBSD &>(T.getToolChain()); | 
|  | 11154 | const Driver &D = ToolChain.getDriver(); | 
|  | 11155 | ArgStringList CmdArgs; | 
|  | 11156 |  | 
|  | 11157 | // Silence warning for "clang -g foo.o -o foo" | 
|  | 11158 | Args.ClaimAllArgs(options::OPT_g_Group); | 
|  | 11159 | // and "clang -emit-llvm foo.o -o foo" | 
|  | 11160 | Args.ClaimAllArgs(options::OPT_emit_llvm); | 
|  | 11161 | // and for "clang -w foo.o -o foo". Other warning options are already | 
|  | 11162 | // handled somewhere else. | 
|  | 11163 | Args.ClaimAllArgs(options::OPT_w); | 
|  | 11164 |  | 
|  | 11165 | if (!D.SysRoot.empty()) | 
|  | 11166 | CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot)); | 
|  | 11167 |  | 
|  | 11168 | if (Args.hasArg(options::OPT_pie)) | 
|  | 11169 | CmdArgs.push_back("-pie"); | 
|  | 11170 |  | 
|  | 11171 | if (Args.hasArg(options::OPT_static)) { | 
|  | 11172 | CmdArgs.push_back("-Bstatic"); | 
|  | 11173 | } else { | 
|  | 11174 | if (Args.hasArg(options::OPT_rdynamic)) | 
|  | 11175 | CmdArgs.push_back("-export-dynamic"); | 
|  | 11176 | CmdArgs.push_back("--eh-frame-hdr"); | 
|  | 11177 | if (Args.hasArg(options::OPT_shared)) { | 
|  | 11178 | CmdArgs.push_back("-Bshareable"); | 
|  | 11179 | } else { | 
|  | 11180 | CmdArgs.push_back("-dynamic-linker"); | 
|  | 11181 | CmdArgs.push_back("/libexec/ld-elf.so.1"); | 
|  | 11182 | } | 
|  | 11183 | CmdArgs.push_back("--enable-new-dtags"); | 
|  | 11184 | } | 
|  | 11185 |  | 
|  | 11186 | if (Output.isFilename()) { | 
|  | 11187 | CmdArgs.push_back("-o"); | 
|  | 11188 | CmdArgs.push_back(Output.getFilename()); | 
|  | 11189 | } else { | 
|  | 11190 | assert(Output.isNothing() && "Invalid output."); | 
|  | 11191 | } | 
|  | 11192 |  | 
| Filipe Cabecinhas | 82cd6af | 2015-10-16 15:07:48 +0000 | [diff] [blame] | 11193 | AddPS4SanitizerArgs(ToolChain, CmdArgs); | 
|  | 11194 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 11195 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Eugene Zelenko | d4304d2 | 2015-11-04 21:37:17 +0000 | [diff] [blame] | 11196 | const char *crt1 = nullptr; | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11197 | if (!Args.hasArg(options::OPT_shared)) { | 
|  | 11198 | if (Args.hasArg(options::OPT_pg)) | 
|  | 11199 | crt1 = "gcrt1.o"; | 
|  | 11200 | else if (Args.hasArg(options::OPT_pie)) | 
|  | 11201 | crt1 = "Scrt1.o"; | 
|  | 11202 | else | 
|  | 11203 | crt1 = "crt1.o"; | 
|  | 11204 | } | 
|  | 11205 | if (crt1) | 
|  | 11206 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1))); | 
|  | 11207 |  | 
|  | 11208 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o"))); | 
|  | 11209 |  | 
| Eugene Zelenko | d4304d2 | 2015-11-04 21:37:17 +0000 | [diff] [blame] | 11210 | const char *crtbegin = nullptr; | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11211 | if (Args.hasArg(options::OPT_static)) | 
|  | 11212 | crtbegin = "crtbeginT.o"; | 
|  | 11213 | else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) | 
|  | 11214 | crtbegin = "crtbeginS.o"; | 
|  | 11215 | else | 
|  | 11216 | crtbegin = "crtbegin.o"; | 
|  | 11217 |  | 
|  | 11218 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin))); | 
|  | 11219 | } | 
|  | 11220 |  | 
|  | 11221 | Args.AddAllArgs(CmdArgs, options::OPT_L); | 
| Douglas Katzman | 6059ef9 | 2015-11-17 17:41:23 +0000 | [diff] [blame] | 11222 | ToolChain.AddFilePathLibArgs(Args, CmdArgs); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11223 | Args.AddAllArgs(CmdArgs, options::OPT_T_Group); | 
|  | 11224 | Args.AddAllArgs(CmdArgs, options::OPT_e); | 
|  | 11225 | Args.AddAllArgs(CmdArgs, options::OPT_s); | 
|  | 11226 | Args.AddAllArgs(CmdArgs, options::OPT_t); | 
|  | 11227 | Args.AddAllArgs(CmdArgs, options::OPT_r); | 
|  | 11228 |  | 
|  | 11229 | if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle)) | 
|  | 11230 | CmdArgs.push_back("--no-demangle"); | 
|  | 11231 |  | 
|  | 11232 | AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs); | 
|  | 11233 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 11234 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11235 | // For PS4, we always want to pass libm, libstdc++ and libkernel | 
|  | 11236 | // libraries for both C and C++ compilations. | 
|  | 11237 | CmdArgs.push_back("-lkernel"); | 
|  | 11238 | if (D.CCCIsCXX()) { | 
|  | 11239 | ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | 11240 | if (Args.hasArg(options::OPT_pg)) | 
|  | 11241 | CmdArgs.push_back("-lm_p"); | 
|  | 11242 | else | 
|  | 11243 | CmdArgs.push_back("-lm"); | 
|  | 11244 | } | 
|  | 11245 | // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding | 
|  | 11246 | // the default system libraries. Just mimic this for now. | 
|  | 11247 | if (Args.hasArg(options::OPT_pg)) | 
|  | 11248 | CmdArgs.push_back("-lgcc_p"); | 
|  | 11249 | else | 
|  | 11250 | CmdArgs.push_back("-lcompiler_rt"); | 
|  | 11251 | if (Args.hasArg(options::OPT_static)) { | 
|  | 11252 | CmdArgs.push_back("-lstdc++"); | 
|  | 11253 | } else if (Args.hasArg(options::OPT_pg)) { | 
|  | 11254 | CmdArgs.push_back("-lgcc_eh_p"); | 
|  | 11255 | } else { | 
|  | 11256 | CmdArgs.push_back("--as-needed"); | 
|  | 11257 | CmdArgs.push_back("-lstdc++"); | 
|  | 11258 | CmdArgs.push_back("--no-as-needed"); | 
|  | 11259 | } | 
|  | 11260 |  | 
|  | 11261 | if (Args.hasArg(options::OPT_pthread)) { | 
|  | 11262 | if (Args.hasArg(options::OPT_pg)) | 
|  | 11263 | CmdArgs.push_back("-lpthread_p"); | 
|  | 11264 | else | 
|  | 11265 | CmdArgs.push_back("-lpthread"); | 
|  | 11266 | } | 
|  | 11267 |  | 
|  | 11268 | if (Args.hasArg(options::OPT_pg)) { | 
|  | 11269 | if (Args.hasArg(options::OPT_shared)) | 
|  | 11270 | CmdArgs.push_back("-lc"); | 
|  | 11271 | else { | 
|  | 11272 | if (Args.hasArg(options::OPT_static)) { | 
|  | 11273 | CmdArgs.push_back("--start-group"); | 
|  | 11274 | CmdArgs.push_back("-lc_p"); | 
|  | 11275 | CmdArgs.push_back("-lpthread_p"); | 
|  | 11276 | CmdArgs.push_back("--end-group"); | 
|  | 11277 | } else { | 
|  | 11278 | CmdArgs.push_back("-lc_p"); | 
|  | 11279 | } | 
|  | 11280 | } | 
|  | 11281 | CmdArgs.push_back("-lgcc_p"); | 
|  | 11282 | } else { | 
|  | 11283 | if (Args.hasArg(options::OPT_static)) { | 
|  | 11284 | CmdArgs.push_back("--start-group"); | 
|  | 11285 | CmdArgs.push_back("-lc"); | 
|  | 11286 | CmdArgs.push_back("-lpthread"); | 
|  | 11287 | CmdArgs.push_back("--end-group"); | 
|  | 11288 | } else { | 
|  | 11289 | CmdArgs.push_back("-lc"); | 
|  | 11290 | } | 
|  | 11291 | CmdArgs.push_back("-lcompiler_rt"); | 
|  | 11292 | } | 
|  | 11293 |  | 
|  | 11294 | if (Args.hasArg(options::OPT_static)) { | 
|  | 11295 | CmdArgs.push_back("-lstdc++"); | 
|  | 11296 | } else if (Args.hasArg(options::OPT_pg)) { | 
|  | 11297 | CmdArgs.push_back("-lgcc_eh_p"); | 
|  | 11298 | } else { | 
|  | 11299 | CmdArgs.push_back("--as-needed"); | 
|  | 11300 | CmdArgs.push_back("-lstdc++"); | 
|  | 11301 | CmdArgs.push_back("--no-as-needed"); | 
|  | 11302 | } | 
|  | 11303 | } | 
|  | 11304 |  | 
| Douglas Katzman | 78b37b0 | 2015-11-17 20:28:07 +0000 | [diff] [blame] | 11305 | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11306 | if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie)) | 
|  | 11307 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o"))); | 
|  | 11308 | else | 
|  | 11309 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o"))); | 
|  | 11310 | CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o"))); | 
|  | 11311 | } | 
|  | 11312 |  | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11313 | const char *Exec = | 
|  | 11314 | #ifdef LLVM_ON_WIN32 | 
| Paul Robinson | 9d61361 | 2016-05-16 17:22:25 +0000 | [diff] [blame] | 11315 | Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold")); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11316 | #else | 
| Paul Robinson | 9d61361 | 2016-05-16 17:22:25 +0000 | [diff] [blame] | 11317 | Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld")); | 
| Filipe Cabecinhas | c888e19 | 2015-10-14 12:25:43 +0000 | [diff] [blame] | 11318 | #endif | 
|  | 11319 |  | 
|  | 11320 | C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs)); | 
|  | 11321 | } | 
|  | 11322 |  | 
|  | 11323 | void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 11324 | const InputInfo &Output, | 
|  | 11325 | const InputInfoList &Inputs, | 
|  | 11326 | const ArgList &Args, | 
|  | 11327 | const char *LinkingOutput) const { | 
|  | 11328 | const toolchains::FreeBSD &ToolChain = | 
|  | 11329 | static_cast<const toolchains::FreeBSD &>(getToolChain()); | 
|  | 11330 | const Driver &D = ToolChain.getDriver(); | 
|  | 11331 | bool PS4Linker; | 
|  | 11332 | StringRef LinkerOptName; | 
|  | 11333 | if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) { | 
|  | 11334 | LinkerOptName = A->getValue(); | 
|  | 11335 | if (LinkerOptName != "ps4" && LinkerOptName != "gold") | 
|  | 11336 | D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName; | 
|  | 11337 | } | 
|  | 11338 |  | 
|  | 11339 | if (LinkerOptName == "gold") | 
|  | 11340 | PS4Linker = false; | 
|  | 11341 | else if (LinkerOptName == "ps4") | 
|  | 11342 | PS4Linker = true; | 
|  | 11343 | else | 
|  | 11344 | PS4Linker = !Args.hasArg(options::OPT_shared); | 
|  | 11345 |  | 
|  | 11346 | if (PS4Linker) | 
|  | 11347 | ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput); | 
|  | 11348 | else | 
|  | 11349 | ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput); | 
|  | 11350 | } | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11351 |  | 
|  | 11352 | void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 11353 | const InputInfo &Output, | 
|  | 11354 | const InputInfoList &Inputs, | 
|  | 11355 | const ArgList &Args, | 
|  | 11356 | const char *LinkingOutput) const { | 
|  | 11357 | const auto &TC = | 
|  | 11358 | static_cast<const toolchains::CudaToolChain &>(getToolChain()); | 
| Justin Lebar | b2db450 | 2016-01-23 21:28:08 +0000 | [diff] [blame] | 11359 | assert(TC.getTriple().isNVPTX() && "Wrong platform"); | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11360 |  | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 11361 | // Obtain architecture from the action. | 
|  | 11362 | CudaArch gpu_arch = StringToCudaArch(JA.getOffloadingArch()); | 
|  | 11363 | assert(gpu_arch != CudaArch::UNKNOWN && | 
|  | 11364 | "Device action expected to have an architecture."); | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11365 |  | 
| Justin Lebar | c43ad9e | 2016-07-07 18:17:52 +0000 | [diff] [blame] | 11366 | // Check that our installation's ptxas supports gpu_arch. | 
| Justin Lebar | f399771 | 2016-07-07 18:24:28 +0000 | [diff] [blame] | 11367 | if (!Args.hasArg(options::OPT_no_cuda_version_check)) { | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 11368 | TC.cudaInstallation().CheckCudaVersionSupportsArch(gpu_arch); | 
| Justin Lebar | c43ad9e | 2016-07-07 18:17:52 +0000 | [diff] [blame] | 11369 | } | 
|  | 11370 |  | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11371 | ArgStringList CmdArgs; | 
|  | 11372 | CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32"); | 
| Justin Lebar | b41f33c | 2016-04-19 02:27:11 +0000 | [diff] [blame] | 11373 | if (Args.hasFlag(options::OPT_cuda_noopt_device_debug, | 
|  | 11374 | options::OPT_no_cuda_noopt_device_debug, false)) { | 
| Artem Belevich | 0a0e54c | 2016-02-16 22:03:20 +0000 | [diff] [blame] | 11375 | // ptxas does not accept -g option if optimization is enabled, so | 
|  | 11376 | // we ignore the compiler's -O* options if we want debug info. | 
|  | 11377 | CmdArgs.push_back("-g"); | 
|  | 11378 | CmdArgs.push_back("--dont-merge-basicblocks"); | 
|  | 11379 | CmdArgs.push_back("--return-at-end"); | 
|  | 11380 | } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) { | 
|  | 11381 | // Map the -O we received to -O{0,1,2,3}. | 
|  | 11382 | // | 
|  | 11383 | // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's | 
|  | 11384 | // default, so it may correspond more closely to the spirit of clang -O2. | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11385 |  | 
| Justin Lebar | 2836dcd | 2016-01-19 19:52:21 +0000 | [diff] [blame] | 11386 | // -O3 seems like the least-bad option when -Osomething is specified to | 
|  | 11387 | // clang but it isn't handled below. | 
|  | 11388 | StringRef OOpt = "3"; | 
|  | 11389 | if (A->getOption().matches(options::OPT_O4) || | 
|  | 11390 | A->getOption().matches(options::OPT_Ofast)) | 
|  | 11391 | OOpt = "3"; | 
|  | 11392 | else if (A->getOption().matches(options::OPT_O0)) | 
|  | 11393 | OOpt = "0"; | 
|  | 11394 | else if (A->getOption().matches(options::OPT_O)) { | 
|  | 11395 | // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options. | 
|  | 11396 | OOpt = llvm::StringSwitch<const char *>(A->getValue()) | 
|  | 11397 | .Case("1", "1") | 
|  | 11398 | .Case("2", "2") | 
|  | 11399 | .Case("3", "3") | 
|  | 11400 | .Case("s", "2") | 
|  | 11401 | .Case("z", "2") | 
|  | 11402 | .Default("2"); | 
|  | 11403 | } | 
|  | 11404 | CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt)); | 
|  | 11405 | } else { | 
|  | 11406 | // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond | 
|  | 11407 | // to no optimizations, but ptxas's default is -O3. | 
|  | 11408 | CmdArgs.push_back("-O0"); | 
|  | 11409 | } | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11410 |  | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11411 | CmdArgs.push_back("--gpu-name"); | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 11412 | CmdArgs.push_back(Args.MakeArgString(CudaArchToString(gpu_arch))); | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11413 | CmdArgs.push_back("--output-file"); | 
|  | 11414 | CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); | 
|  | 11415 | for (const auto& II : Inputs) | 
|  | 11416 | CmdArgs.push_back(Args.MakeArgString(II.getFilename())); | 
|  | 11417 |  | 
|  | 11418 | for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas)) | 
|  | 11419 | CmdArgs.push_back(Args.MakeArgString(A)); | 
|  | 11420 |  | 
|  | 11421 | const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas")); | 
|  | 11422 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
|  | 11423 | } | 
|  | 11424 |  | 
|  | 11425 | // All inputs to this linker must be from CudaDeviceActions, as we need to look | 
|  | 11426 | // at the Inputs' Actions in order to figure out which GPU architecture they | 
|  | 11427 | // correspond to. | 
|  | 11428 | void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | 11429 | const InputInfo &Output, | 
|  | 11430 | const InputInfoList &Inputs, | 
|  | 11431 | const ArgList &Args, | 
|  | 11432 | const char *LinkingOutput) const { | 
|  | 11433 | const auto &TC = | 
|  | 11434 | static_cast<const toolchains::CudaToolChain &>(getToolChain()); | 
| Justin Lebar | b2db450 | 2016-01-23 21:28:08 +0000 | [diff] [blame] | 11435 | assert(TC.getTriple().isNVPTX() && "Wrong platform"); | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11436 |  | 
|  | 11437 | ArgStringList CmdArgs; | 
|  | 11438 | CmdArgs.push_back("--cuda"); | 
|  | 11439 | CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32"); | 
|  | 11440 | CmdArgs.push_back(Args.MakeArgString("--create")); | 
|  | 11441 | CmdArgs.push_back(Args.MakeArgString(Output.getFilename())); | 
|  | 11442 |  | 
|  | 11443 | for (const auto& II : Inputs) { | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 11444 | auto *A = II.getAction(); | 
|  | 11445 | assert(A->getInputs().size() == 1 && | 
|  | 11446 | "Device offload action is expected to have a single input"); | 
|  | 11447 | const char *gpu_arch_str = A->getOffloadingArch(); | 
|  | 11448 | assert(gpu_arch_str && | 
|  | 11449 | "Device action expected to have associated a GPU architecture!"); | 
|  | 11450 | CudaArch gpu_arch = StringToCudaArch(gpu_arch_str); | 
|  | 11451 |  | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11452 | // We need to pass an Arch of the form "sm_XX" for cubin files and | 
|  | 11453 | // "compute_XX" for ptx. | 
| Justin Lebar | 6290761 | 2016-07-06 21:21:39 +0000 | [diff] [blame] | 11454 | const char *Arch = | 
|  | 11455 | (II.getType() == types::TY_PP_Asm) | 
| Samuel Antao | d06239d | 2016-07-15 23:13:27 +0000 | [diff] [blame] | 11456 | ? CudaVirtualArchToString(VirtualArchForCudaArch(gpu_arch)) | 
|  | 11457 | : gpu_arch_str; | 
| Justin Lebar | 21e5d4f | 2016-01-14 21:41:27 +0000 | [diff] [blame] | 11458 | CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") + | 
|  | 11459 | Arch + ",file=" + II.getFilename())); | 
|  | 11460 | } | 
|  | 11461 |  | 
|  | 11462 | for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary)) | 
|  | 11463 | CmdArgs.push_back(Args.MakeArgString(A)); | 
|  | 11464 |  | 
|  | 11465 | const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary")); | 
|  | 11466 | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
|  | 11467 | } |