]> granicus.if.org Git - clang/commitdiff
Reject -no-integrated-as on windows.
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 24 Mar 2013 15:06:53 +0000 (15:06 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 24 Mar 2013 15:06:53 +0000 (15:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177840 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticDriverKinds.td
include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/ToolChain.cpp
lib/Driver/WindowsToolChain.cpp
test/Driver/inhibit-downstream-commands.c
test/Driver/no-integrated-as-win.c

index 964d2bc193036d5c3915159587975457725b0727..d14fe94d6c1fda083fe83dbe1257842f189960e3 100644 (file)
@@ -35,6 +35,8 @@ def err_drv_use_of_Z_option : Error<
   "unsupported use of internal gcc -Z option '%0'">;
 def err_drv_output_argument_with_multiple_files : Error<
   "cannot specify -o when generating multiple output files">;
+def err_no_external_windows_assembler : Error<
+  "there is no external assembler we can use on windows">;
 def err_drv_unable_to_remove_file : Error<
   "unable to remove file: %0">;
 def err_drv_command_failure : Error<
index 68d0db176dcda38e21fda70cf43caad1834c5a08..ae9e397644eff748012a007cc6f301c0627a1634 100644 (file)
@@ -127,7 +127,7 @@ public:
   }
 
   /// Choose a tool to use to handle the action \p JA.
-  Tool &SelectTool(const JobAction &JA) const;
+  Tool *SelectTool(const JobAction &JA) const;
 
   // Helper methods
 
index 689ecbcd79497972985f58129b47b40669900d32..706409d05d74fcfa806b221aec17e5b98ca70f6b 100644 (file)
@@ -1288,7 +1288,7 @@ void Driver::BuildJobs(Compilation &C) const {
   }
 }
 
-static const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
+static const Tool *SelectToolForJob(Compilation &C, const ToolChain *TC,
                                     const JobAction *JA,
                                     const ActionList *&Inputs) {
   const Tool *ToolForJob = 0;
@@ -1301,17 +1301,19 @@ static const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
       !C.getArgs().hasArg(options::OPT_save_temps) &&
       isa<AssembleJobAction>(JA) &&
       Inputs->size() == 1 && isa<CompileJobAction>(*Inputs->begin())) {
-    const Tool &Compiler =
+    const Tool *Compiler =
       TC->SelectTool(cast<JobAction>(**Inputs->begin()));
-    if (Compiler.hasIntegratedAssembler()) {
+    if (!Compiler)
+      return NULL;
+    if (Compiler->hasIntegratedAssembler()) {
       Inputs = &(*Inputs)[0]->getInputs();
-      ToolForJob = &Compiler;
+      ToolForJob = Compiler;
     }
   }
 
   // Otherwise use the tool for the current job.
   if (!ToolForJob)
-    ToolForJob = &TC->SelectTool(*JA);
+    ToolForJob = TC->SelectTool(*JA);
 
   // See if we should use an integrated preprocessor. We do so when we have
   // exactly one input, since this is the only use case we care about
@@ -1324,7 +1326,7 @@ static const Tool &SelectToolForJob(Compilation &C, const ToolChain *TC,
       ToolForJob->hasIntegratedCPP())
     Inputs = &(*Inputs)[0]->getInputs();
 
-  return *ToolForJob;
+  return ToolForJob;
 }
 
 void Driver::BuildJobsForAction(Compilation &C,
@@ -1366,7 +1368,9 @@ void Driver::BuildJobsForAction(Compilation &C,
   const ActionList *Inputs = &A->getInputs();
 
   const JobAction *JA = cast<JobAction>(A);
-  const Tool &T = SelectToolForJob(C, TC, JA, Inputs);
+  const Tool *T = SelectToolForJob(C, TC, JA, Inputs);
+  if (!T)
+    return;
 
   // Only use pipes when there is exactly one input.
   InputInfoList InputInfos;
@@ -1401,8 +1405,8 @@ void Driver::BuildJobsForAction(Compilation &C,
                        A->getType(), BaseInput);
 
   if (CCCPrintBindings && !CCGenDiagnostics) {
-    llvm::errs() << "# \"" << T.getToolChain().getTripleString() << '"'
-                 << " - \"" << T.getName() << "\", inputs: [";
+    llvm::errs() << "# \"" << T->getToolChain().getTripleString() << '"'
+                 << " - \"" << T->getName() << "\", inputs: [";
     for (unsigned i = 0, e = InputInfos.size(); i != e; ++i) {
       llvm::errs() << InputInfos[i].getAsString();
       if (i + 1 != e)
@@ -1410,8 +1414,8 @@ void Driver::BuildJobsForAction(Compilation &C,
     }
     llvm::errs() << "], output: " << Result.getAsString() << "\n";
   } else {
-    T.ConstructJob(C, *JA, Result, InputInfos,
-                   C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
+    T->ConstructJob(C, *JA, Result, InputInfos,
+                    C.getArgsForToolChain(TC, BoundArch), LinkingOutput);
   }
 }
 
index b24de5d132a5485d077f530cdc788a2645983adc..19270b2aa33fcde9a08da146d8eb9ccad34e28ea 100644 (file)
@@ -117,13 +117,13 @@ Tool *ToolChain::getTool(Action::ActionClass AC) const {
   llvm_unreachable("Invalid tool kind.");
 }
 
-Tool &ToolChain::SelectTool(const JobAction &JA) const {
+Tool *ToolChain::SelectTool(const JobAction &JA) const {
   if (getDriver().ShouldUseClangCompiler(JA))
-    return *getClang();
+    return getClang();
   Action::ActionClass AC = JA.getKind();
   if (AC == Action::AssembleJobClass && useIntegratedAs())
-    return *getClangAs();
-  return *getTool(AC);
+    return getClangAs();
+  return getTool(AC);
 }
 
 std::string ToolChain::GetFilePath(const char *Name) const {
index cc52c00710bd5446b9631583df7103a1069417c1..dac7e77d608ea499c195be933cecc6dbb1335e60 100644 (file)
@@ -14,6 +14,7 @@
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Compilation.h"
 #include "clang/Driver/Driver.h"
+#include "clang/Driver/DriverDiagnostic.h"
 #include "clang/Driver/Options.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Path.h"
@@ -43,10 +44,8 @@ Tool *Windows::buildLinker() const {
 Tool *Windows::buildAssembler() const {
   if (getTriple().getEnvironment() == llvm::Triple::MachO)
     return new tools::darwin::Assemble(*this);
-  else
-    // There no assembler we can use on windows other than the integrated
-    // assembler, so we ignore -no-integrated-as.
-    return ToolChain::buildAssembler();
+  getDriver().Diag(clang::diag::err_no_external_windows_assembler);
+  return NULL;
 }
 
 bool Windows::IsIntegratedAssemblerDefault() const {
index e06fdb1a3deb5e00e422fe812ca6c65839428058..5e46708cfe896e122c5b58f8af7e65938881b627 100644 (file)
@@ -2,4 +2,5 @@
 // CHECK: error: unknown type name 'invalid'
 // CHECK-NOT: clang: error: assembler command failed 
 // CHECK-NOT: clang: error: linker command failed
+// XFAIL: win32
 invalid C code!
index 298e885586a6b655018d9817604a199b74581a24..0d6c2958e57af3c14097ecb98079bb81624f2600 100644 (file)
@@ -1,3 +1,3 @@
 // RUN: %clang -target x86_64-pc-win32 -### -no-integrated-as %s -c 2>&1 | FileCheck %s
 
-// CHECK: cc1as" "-triple" "x86_64-pc-win32"
+// CHECK: there is no external assembler we can use on windows