OLD | NEW |
1 //===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===// | 1 //===--- Driver.cpp - Clang GCC Compatible Driver -------------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 | 9 |
10 #include "clang/Driver/Driver.h" | 10 #include "clang/Driver/Driver.h" |
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); | 1154 llvm::PrettyStackTraceString CrashInfo("Building compilation actions"); |
1155 | 1155 |
1156 if (!SuppressMissingInputWarning && Inputs.empty()) { | 1156 if (!SuppressMissingInputWarning && Inputs.empty()) { |
1157 Diag(clang::diag::err_drv_no_input_files); | 1157 Diag(clang::diag::err_drv_no_input_files); |
1158 return; | 1158 return; |
1159 } | 1159 } |
1160 | 1160 |
1161 Arg *FinalPhaseArg; | 1161 Arg *FinalPhaseArg; |
1162 phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg); | 1162 phases::ID FinalPhase = getFinalPhase(Args, &FinalPhaseArg); |
1163 | 1163 |
1164 if (FinalPhase == phases::Link && Args.hasArg(options::OPT_emit_llvm)) { | 1164 if (FinalPhase == phases::Link && Args.hasArg(options::OPT_emit_llvm) && |
| 1165 !TC.isBitcodeOnlyTarget()) { |
1165 Diag(clang::diag::err_drv_emit_llvm_link); | 1166 Diag(clang::diag::err_drv_emit_llvm_link); |
1166 } | 1167 } |
1167 | 1168 |
1168 // Reject -Z* at the top level, these options should never have been exposed | 1169 // Reject -Z* at the top level, these options should never have been exposed |
1169 // by gcc. | 1170 // by gcc. |
1170 if (Arg *A = Args.getLastArg(options::OPT_Z_Joined)) | 1171 if (Arg *A = Args.getLastArg(options::OPT_Z_Joined)) |
1171 Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args); | 1172 Diag(clang::diag::err_drv_use_of_Z_option) << A->getAsString(Args); |
1172 | 1173 |
1173 // Diagnose misuse of /Fo. | 1174 // Diagnose misuse of /Fo. |
1174 if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fo)) { | 1175 if (Arg *A = Args.getLastArg(options::OPT__SLASH_Fo)) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1259 if (Phase > FinalPhase) | 1260 if (Phase > FinalPhase) |
1260 break; | 1261 break; |
1261 | 1262 |
1262 // Queue linker inputs. | 1263 // Queue linker inputs. |
1263 if (Phase == phases::Link) { | 1264 if (Phase == phases::Link) { |
1264 assert((i + 1) == e && "linking must be final compilation step."); | 1265 assert((i + 1) == e && "linking must be final compilation step."); |
1265 LinkerInputs.push_back(Current.release()); | 1266 LinkerInputs.push_back(Current.release()); |
1266 break; | 1267 break; |
1267 } | 1268 } |
1268 | 1269 |
| 1270 // Virtual targets don't perform assembly step. |
| 1271 if (Phase == phases::Assemble && TC.isBitcodeOnlyTarget()) |
| 1272 continue; |
| 1273 |
1269 // Some types skip the assembler phase (e.g., llvm-bc), but we can't | 1274 // Some types skip the assembler phase (e.g., llvm-bc), but we can't |
1270 // encode this in the steps because the intermediate type depends on | 1275 // encode this in the steps because the intermediate type depends on |
1271 // arguments. Just special case here. | 1276 // arguments. Just special case here. |
1272 if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm) | 1277 if (Phase == phases::Assemble && Current->getType() != types::TY_PP_Asm) |
1273 continue; | 1278 continue; |
1274 | 1279 |
1275 // Otherwise construct the appropriate action. | 1280 // Otherwise construct the appropriate action. |
1276 Current = ConstructPhaseAction(TC, Args, Phase, std::move(Current)); | 1281 Current = ConstructPhaseAction(TC, Args, Phase, std::move(Current)); |
1277 if (Current->getType() == types::TY_Nothing) | 1282 if (Current->getType() == types::TY_Nothing) |
1278 break; | 1283 break; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1357 types::TY_Nothing); | 1362 types::TY_Nothing); |
1358 return llvm::make_unique<CompileJobAction>(std::move(Input), | 1363 return llvm::make_unique<CompileJobAction>(std::move(Input), |
1359 types::TY_LLVM_BC); | 1364 types::TY_LLVM_BC); |
1360 } | 1365 } |
1361 case phases::Backend: { | 1366 case phases::Backend: { |
1362 if (IsUsingLTO(TC, Args)) { | 1367 if (IsUsingLTO(TC, Args)) { |
1363 types::ID Output = | 1368 types::ID Output = |
1364 Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC; | 1369 Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC; |
1365 return llvm::make_unique<BackendJobAction>(std::move(Input), Output); | 1370 return llvm::make_unique<BackendJobAction>(std::move(Input), Output); |
1366 } | 1371 } |
1367 if (Args.hasArg(options::OPT_emit_llvm)) { | 1372 if (Args.hasArg(options::OPT_emit_llvm) || TC.isBitcodeOnlyTarget()) { |
1368 types::ID Output = | 1373 types::ID Output = |
1369 Args.hasArg(options::OPT_S) ? types::TY_LLVM_IR : types::TY_LLVM_BC; | 1374 Args.hasArg(options::OPT_S) ? types::TY_LLVM_IR : types::TY_LLVM_BC; |
1370 return llvm::make_unique<BackendJobAction>(std::move(Input), Output); | 1375 return llvm::make_unique<BackendJobAction>(std::move(Input), Output); |
1371 } | 1376 } |
1372 return llvm::make_unique<BackendJobAction>(std::move(Input), | 1377 return llvm::make_unique<BackendJobAction>(std::move(Input), |
1373 types::TY_PP_Asm); | 1378 types::TY_PP_Asm); |
1374 } | 1379 } |
1375 case phases::Assemble: | 1380 case phases::Assemble: |
1376 return llvm::make_unique<AssembleJobAction>(std::move(Input), | 1381 return llvm::make_unique<AssembleJobAction>(std::move(Input), |
1377 types::TY_Object); | 1382 types::TY_Object); |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2061 TC = new toolchains::Hexagon_TC(*this, Target, Args); | 2066 TC = new toolchains::Hexagon_TC(*this, Target, Args); |
2062 else | 2067 else |
2063 TC = new toolchains::Linux(*this, Target, Args); | 2068 TC = new toolchains::Linux(*this, Target, Args); |
2064 break; | 2069 break; |
2065 // @LOCALMOD-START Emscripten | 2070 // @LOCALMOD-START Emscripten |
2066 case llvm::Triple::Emscripten: | 2071 case llvm::Triple::Emscripten: |
2067 TC = new toolchains::EmscriptenToolChain(*this, Target, Args); | 2072 TC = new toolchains::EmscriptenToolChain(*this, Target, Args); |
2068 break; | 2073 break; |
2069 // @LOCALMOD-END Emscripten | 2074 // @LOCALMOD-END Emscripten |
2070 case llvm::Triple::NaCl: | 2075 case llvm::Triple::NaCl: |
2071 TC = new toolchains::NaCl_TC(*this, Target, Args); | 2076 if (Target.getArch() == llvm::Triple::le32) |
| 2077 TC = new toolchains::PNaClToolChain(*this, Target, Args); |
| 2078 else |
| 2079 TC = new toolchains::NaCl_TC(*this, Target, Args); |
2072 break; | 2080 break; |
2073 case llvm::Triple::Solaris: | 2081 case llvm::Triple::Solaris: |
2074 TC = new toolchains::Solaris(*this, Target, Args); | 2082 TC = new toolchains::Solaris(*this, Target, Args); |
2075 break; | 2083 break; |
2076 case llvm::Triple::Win32: | 2084 case llvm::Triple::Win32: |
2077 switch (Target.getEnvironment()) { | 2085 switch (Target.getEnvironment()) { |
2078 default: | 2086 default: |
2079 if (Target.isOSBinFormatELF()) | 2087 if (Target.isOSBinFormatELF()) |
2080 TC = new toolchains::Generic_ELF(*this, Target, Args); | 2088 TC = new toolchains::Generic_ELF(*this, Target, Args); |
2081 else if (Target.isOSBinFormatMachO()) | 2089 else if (Target.isOSBinFormatMachO()) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2194 } else { | 2202 } else { |
2195 ExcludedFlagsBitmask |= options::CLOption; | 2203 ExcludedFlagsBitmask |= options::CLOption; |
2196 } | 2204 } |
2197 | 2205 |
2198 return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask); | 2206 return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask); |
2199 } | 2207 } |
2200 | 2208 |
2201 bool clang::driver::isOptimizationLevelFast(const llvm::opt::ArgList &Args) { | 2209 bool clang::driver::isOptimizationLevelFast(const llvm::opt::ArgList &Args) { |
2202 return Args.hasFlag(options::OPT_Ofast, options::OPT_O_Group, false); | 2210 return Args.hasFlag(options::OPT_Ofast, options::OPT_O_Group, false); |
2203 } | 2211 } |
OLD | NEW |