]> granicus.if.org Git - clang/commitdiff
remove assertions in the Hexagon backend specific clang driver
authorSebastian Pop <spop@codeaurora.org>
Fri, 13 Jan 2012 20:37:10 +0000 (20:37 +0000)
committerSebastian Pop <spop@codeaurora.org>
Fri, 13 Jan 2012 20:37:10 +0000 (20:37 +0000)
Patch from Jyotsna Verma:

I have made the changes to remove assertions in the Hexagon backend
specific clang driver. Instead of asserting on invalid arch name, it has
been modified to use the default value.

I have changed the implementation of the CPU flag validation for the
Hexagon backend. Earlier, the clang driver performed the check and
asserted on invalid inputs. In the new implementation, the driver passes
the last CPU flag (or sets to "v4" if not specified) to the compiler (and
also to the assembler and linker which perform their own check) instead of
asserting on incorrect values. This patch changes the setCPU function for
the Hexagon backend in clang/lib/Basic/Targets.cpp which causes the
compiler to error out on incorrect CPU flag values.

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

include/clang/Driver/Options.td
lib/Basic/Targets.cpp
lib/Driver/Tools.cpp

index 3c4a73cc33500c0afed614ea1dda07bb40add932..90418ebf755b8ef0425438bf4d1795e708e53ab5 100644 (file)
@@ -575,9 +575,6 @@ def l : JoinedOrSeparate<"-l">, Flags<[LinkerInput, RenderJoined]>;
 def lazy__framework : Separate<"-lazy_framework">, Flags<[LinkerInput]>;
 def lazy__library : Separate<"-lazy_library">, Flags<[LinkerInput]>;
 def m32 : Flag<"-m32">, Group<m_Group>, Flags<[DriverOption]>;
-def mv2 : Flag<"-mv2">, Group<m_Group>, Flags<[DriverOption]>;
-def mv3 : Flag<"-mv3">, Group<m_Group>, Flags<[DriverOption]>;
-def mv4 : Flag<"-mv4">, Group<m_Group>, Flags<[DriverOption]>;
 def mqdsp6_compat : Flag<"-mqdsp6-compat">, Group<m_Group>, Flags<[DriverOption]>;
 def m3dnowa : Flag<"-m3dnowa">, Group<m_x86_Features_Group>;
 def m3dnow : Flag<"-m3dnow">, Group<m_x86_Features_Group>;
index b08a3d30f15bbe496b5177d13e36e16c7c52a5ec..47598f8152cf3570ba9f52335c370068a5e6d82b 100644 (file)
@@ -2963,7 +2963,19 @@ public:
   virtual const char *getClobbers() const {
     return "";
   }
+
+  static const char *getHexagonCPUSuffix(StringRef Name) {
+    return llvm::StringSwitch<const char*>(Name)
+      .Case("hexagonv2", "2")
+      .Case("hexagonv3", "3")
+      .Case("hexagonv4", "4")
+      .Default(0);
+  }
+
   virtual bool setCPU(const std::string &Name) {
+    if (!getHexagonCPUSuffix(Name))
+      return false;
+
     CPU = Name;
     return true;
   }
index 6baf6a645365ee8f4f46b062e19a912838dcf329..39868c82366c160f168afa4c94717061761b5d86 100644 (file)
@@ -966,49 +966,39 @@ static Arg* getLastHexagonArchArg (const ArgList &Args)
 {
   Arg * A = NULL;
 
-  for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) {
-    if ((*it)->getOption().matches(options::OPT_mv2) ||
-        (*it)->getOption().matches(options::OPT_mv3) ||
-        (*it)->getOption().matches(options::OPT_mv4) ||
-        (*it)->getOption().matches(options::OPT_march_EQ) ||
+  for (ArgList::const_iterator it = Args.begin(), ie = Args.end();
+       it != ie; ++it) {
+    if ((*it)->getOption().matches(options::OPT_march_EQ) ||
         (*it)->getOption().matches(options::OPT_mcpu_EQ)) {
       A = *it;
       A->claim();
     }
+    else if ((*it)->getOption().matches(options::OPT_m_Joined)){
+      StringRef Value = (*it)->getValue(Args,0);
+      if (Value.startswith("v")) {
+        A = *it;
+        A->claim();
+      }
+    }
   }
   return A;
 }
 
-static const char *getHexagonTargetCPU(const ArgList &Args)
+static StringRef getHexagonTargetCPU(const ArgList &Args)
 {
   Arg *A;
   llvm::StringRef WhichHexagon;
 
+  // Select the default CPU (v4) if none was given or detection failed.
   if ((A = getLastHexagonArchArg (Args))) {
-    if ((A->getOption().matches(options::OPT_march_EQ)) ||
-        (A->getOption().matches(options::OPT_mcpu_EQ))) {
-      WhichHexagon = A->getValue(Args);
-      if (WhichHexagon == "v2")
-        return "hexagonv2";
-      else if (WhichHexagon == "v3")
-        return "hexagonv3";
-      else if (WhichHexagon == "v4")
-        return "hexagonv4";
-      else
-        assert (0 && "Unknown -march or -mcpu value");
-    }
-    else {
-      if (A->getOption().matches(options::OPT_mv2))
-        return "hexagonv2";
-      else if (A->getOption().matches(options::OPT_mv3))
-        return "hexagonv3";
-      else if (A->getOption().matches(options::OPT_mv4))
-        return "hexagonv4";
-      else
-        assert(0 && "Unknown -m argument.");
-    }
+    WhichHexagon = A->getValue(Args);
+    if (WhichHexagon == "")
+      return "v4";
+    else
+      return WhichHexagon;
   }
-  return "hexagonv2";
+  else
+    return "v4";
 }
 
 void Clang::AddHexagonTargetArgs(const ArgList &Args,
@@ -1016,7 +1006,7 @@ void Clang::AddHexagonTargetArgs(const ArgList &Args,
   llvm::Triple Triple = getToolChain().getTriple();
 
   CmdArgs.push_back("-target-cpu");
-  CmdArgs.push_back(getHexagonTargetCPU(Args));
+  CmdArgs.push_back(Args.MakeArgString("hexagon" + getHexagonTargetCPU(Args)));
   CmdArgs.push_back("-fno-signed-char");
   CmdArgs.push_back("-nobuiltininc");
 
@@ -2898,29 +2888,16 @@ void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
 
   // Add Arch Information
   Arg *A;
-  if ((A = getLastHexagonArchArg (Args))) {
-    if ((A->getOption().matches(options::OPT_march_EQ)) ||
-        (A->getOption().matches(options::OPT_mcpu_EQ))) {
-    llvm::StringRef WhichHexagon = A->getValue(Args);
-    if (WhichHexagon == "v2")
-      CmdArgs.push_back("-mv2");
-    else if (WhichHexagon == "v3")
-      CmdArgs.push_back ("-mv3");
-    else if (WhichHexagon == "v4")
-      CmdArgs.push_back ("-mv4");
+  if ((A = getLastHexagonArchArg(Args))) {
+    if (A->getOption().matches(options::OPT_m_Joined))
+      A->render(Args, CmdArgs);
     else
-      assert (0 && "Unknown -march or -mcpu value");
-    }
-    else {
-      if (A->getOption().matches(options::OPT_mv2) ||
-          A->getOption().matches(options::OPT_mv3) ||
-          A->getOption().matches(options::OPT_mv4))
-        A->render(Args, CmdArgs);
-      else
-        assert(0 && "Unknown -m argument.");
-    }
-
+      CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
   }
+  else {
+    CmdArgs.push_back (Args.MakeArgString("-m" + getHexagonTargetCPU(Args)));
+  }
+
   CmdArgs.push_back("-mqdsp6-compat");
 
   const char *GCCName;