]> granicus.if.org Git - clang/commitdiff
Disallow using -fmodules with -no-integrated-as.
authorTed Kremenek <kremenek@apple.com>
Mon, 11 Mar 2013 20:51:52 +0000 (20:51 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 11 Mar 2013 20:51:52 +0000 (20:51 +0000)
Modules enables features such as auto-linking, and we simply do not want to
support a matrix of subtly enabled/disabled features depending on whether or
not a user is using the integrated assembler.

It isn't clear if this is the best place to do this check.  For one thing,
these kind of errors are not caught by the serialized diagnostics.

Fixes <rdar://problem/13289240>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176826 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticDriverKinds.td
lib/Driver/Tools.cpp
test/Driver/modules_integrated_as.c [new file with mode: 0644]

index 964d2bc193036d5c3915159587975457725b0727..469bae8dd44242af67d329a6149618bed7af8ea9 100644 (file)
@@ -75,7 +75,7 @@ def err_drv_invalid_libcxx_deployment : Error<
   "invalid deployment target for -stdlib=libc++ (requires %0 or later)">;
 def err_drv_invalid_feature : Error<
   "invalid feature '%0' for CPU '%1'">;
-
+  
 def err_drv_I_dash_not_supported : Error<
   "'%0' not supported, please use -iquote instead">;
 def err_drv_unknown_argument : Error<"unknown argument: '%0'">;
@@ -150,4 +150,9 @@ def err_analyzer_config_no_value : Error<
   "analyzer-config option '%0' has a key but no value">;
 def err_analyzer_config_multiple_values : Error<
   "analyzer-config option '%0' should contain only one '='">;
+  
+def err_drv_modules_integrated_as : Error<
+  "modules can only be used with the compiler's integrated assembler">;
+def note_drv_modules_integrated_as : Note<
+  "'-no-integrated-as' cannot be used with '-fmodules'">;
 }
index 62b1febd52919684a55677ad77ced471abbd15ab..ef759ff6d39e631457e45cf28d6b2d0c23d276ad 100644 (file)
@@ -1429,12 +1429,18 @@ static bool ShouldDisableCFI(const ArgList &Args,
                        Default);
 }
 
-static bool ShouldDisableDwarfDirectory(const ArgList &Args,
-                                        const ToolChain &TC) {
+static bool ShouldUseIntegratedAssembler(const ArgList &Args,
+                                         const ToolChain &TC) {
   bool IsIADefault = TC.IsIntegratedAssemblerDefault();
   bool UseIntegratedAs = Args.hasFlag(options::OPT_integrated_as,
                                       options::OPT_no_integrated_as,
                                       IsIADefault);
+  return UseIntegratedAs;
+}
+
+static bool ShouldDisableDwarfDirectory(const ArgList &Args,
+                                        const ToolChain &TC) {
+  bool UseIntegratedAs = ShouldUseIntegratedAssembler(Args, TC);
   bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
                                         options::OPT_fno_dwarf_directory_asm,
                                         UseIntegratedAs);
@@ -2778,6 +2784,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
       CmdArgs.push_back("-fmodules");
       HaveModules = true;
     }
+
+    if (HaveModules && !ShouldUseIntegratedAssembler(Args, getToolChain())) {
+      D.Diag(diag::err_drv_modules_integrated_as);
+      D.Diag(diag::note_drv_modules_integrated_as);
+      return;
+    }
   }
 
   // If a module path was provided, pass it along. Otherwise, use a temporary
diff --git a/test/Driver/modules_integrated_as.c b/test/Driver/modules_integrated_as.c
new file mode 100644 (file)
index 0000000..037cdd0
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: %clang -fmodules -no-integrated-as -fsyntax-only %s 2>&1 | FileCheck %s
+
+// CHECK: error: modules can only be used with the compiler's integrated assembler
+// CHECK note: '-no-integrated-as' cannot be used with '-fmodules'