r176531 - PR 11326: Lack diagnosic message when ABI conflicts on ARM

Weiming Zhao weimingz at codeaurora.org
Tue Mar 5 15:27:21 PST 2013


Author: weimingz
Date: Tue Mar  5 17:27:21 2013
New Revision: 176531

URL: http://llvm.org/viewvc/llvm-project?rev=176531&view=rev
Log:
PR 11326: Lack diagnosic message when ABI conflicts on ARM

When both Triple and -mabi are used, it may result into conflicting ABI value.

Added:
    cfe/trunk/test/Driver/arm-mabi.c
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td?rev=176531&r1=176530&r2=176531&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticCommonKinds.td Tue Mar  5 17:27:21 2013
@@ -107,6 +107,8 @@ def err_target_unknown_cpu : Error<"unkn
 def err_target_unknown_abi : Error<"unknown target ABI '%0'">;
 def err_target_unknown_cxxabi : Error<"unknown C++ ABI '%0'">;
 def err_target_invalid_feature : Error<"invalid target feature '%0'">;
+def warn_target_override_abi: Warning<"unused environment '%0'">,
+  InGroup<Unused>;
 
 // Source manager
 def err_cannot_open_file : Error<"cannot open file '%0': %1">, DefaultFatal;

Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=176531&r1=176530&r2=176531&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue Mar  5 17:27:21 2013
@@ -1471,7 +1471,8 @@ static void ParsePreprocessorOutputArgs(
   Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes);
 }
 
-static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
+static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
+                            DiagnosticsEngine &Diags) {
   using namespace options;
   Opts.ABI = Args.getLastArgValue(OPT_target_abi);
   Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);
@@ -1483,6 +1484,21 @@ static void ParseTargetArgs(TargetOption
   // Use the default target triple if unspecified.
   if (Opts.Triple.empty())
     Opts.Triple = llvm::sys::getDefaultTargetTriple();
+
+  // Check if Opts.ABI conflicts with the environment of triple on ARM.
+  llvm::Triple T(Opts.Triple);
+  if (T.getArch() == llvm::Triple::arm && !Opts.ABI.empty() &&
+      !T.getEnvironmentName().empty()) {
+    llvm::Triple::EnvironmentType env = T.getEnvironment();
+    // Env and ABI (Triple::EnvironmentType and ARMABIInfo::ABIKind) are not
+    // 1-to-1 mapping. Later on, Env will be overrided by ABI option when
+    // computing ARMABIInfo.
+    bool isOpsEABI = StringRef(Opts.ABI).startswith("aapcs");
+    bool isEnvEABI = (env == llvm::Triple::GNUEABI || env == llvm::Triple::EABI
+        || env == llvm::Triple::Android);
+    if (isEnvEABI != isOpsEABI)
+      Diags.Report(diag::warn_target_override_abi) << T.getEnvironmentName();
+  }
 }
 
 //
@@ -1547,7 +1563,7 @@ bool CompilerInvocation::CreateFromArgs(
   ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, Diags);
   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args,
                               Res.getFrontendOpts().ProgramAction);
-  ParseTargetArgs(Res.getTargetOpts(), *Args);
+  ParseTargetArgs(Res.getTargetOpts(), *Args, Diags);
 
   return Success;
 }

Added: cfe/trunk/test/Driver/arm-mabi.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/arm-mabi.c?rev=176531&view=auto
==============================================================================
--- cfe/trunk/test/Driver/arm-mabi.c (added)
+++ cfe/trunk/test/Driver/arm-mabi.c Tue Mar  5 17:27:21 2013
@@ -0,0 +1,17 @@
+// Test -targat and -mabi.
+
+// RUN: %clang -target arm-none-none-gnu -mabi=aapcs %s -c -S -o %t.s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-WARN1 %s
+//CHECK-WARN1: warning: unused environment 'gnu'
+
+// RUN: %clang -target arm-none-none-gnueabi -mabi=apcs-gnu %s -c -S -o %t.s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-WARN2 %s
+// CHECK-WARN2: warning: unused environment 'gnueabi'
+
+// RUN: %clang -target arm-none-none-gnueabi -mabi=aapcs-gnu %s -c -S -o %t.s 2>&1 \
+// RUN:   | FileCheck %s
+// CHECK-NOT: warning: unused environment
+
+// RUN: %clang -target arm-none-none-gnu -mabi=apcs-gnu %s -c -S -o %t.s 2>&1 \
+// RUN:   | FileCheck %s
+// CHECK-NOT: warning: unused environment





More information about the cfe-commits mailing list