[llvm-commits] [PATCH, Clang, ARM]: armv4 selection

John Tytgat john at bass-software.com
Tue Sep 28 16:52:12 PDT 2010


When Clang has host triple armv4-unknown-eabi we're actually wrongly
selecting armv4t architecture (resulting in unwanted BX usage) because in
getARMTargetCPU() MArch with value "armv4" wrongly results in CPU return
value "arm7tmdi" which later on in getLLVMArchSuffixForARM() gets back
converted in "v4t" architecture.

Patch attached to fix this, together with a couple of other corrections
based on ARM.td info (I've dropped armv2/armv2a/armv3/armv3m architectures
as we don't have support for those).

I've considered making direct use of ARM.td (triggered by the "FIXME:
tblgen this." oomment) but I'm not sure if that's public from Clang pov.
Or should we rather duplicate the ARM arch/cpu data from ARM.td in a
new tblgen file for Clang usage ?

John.
-- 
John Tytgat
John at bass-software.com
-------------- next part --------------
Index: lib/Driver/ToolChain.cpp
===================================================================
--- lib/Driver/ToolChain.cpp	(revision 114807)
+++ lib/Driver/ToolChain.cpp	(working copy)
@@ -67,13 +67,9 @@
     MArch = Triple.getArchName();
   }
 
-  if (MArch == "armv2" || MArch == "armv2a")
-    return "arm2";
-  if (MArch == "armv3")
-    return "arm6";
-  if (MArch == "armv3m")
-    return "arm7m";
-  if (MArch == "armv4" || MArch == "armv4t")
+  if (MArch == "armv4")
+    return "arm8";
+  if (MArch == "armv4t")
     return "arm7tdmi";
   if (MArch == "armv5" || MArch == "armv5t")
     return "arm10tdmi";
@@ -85,6 +81,8 @@
     return "arm1136jf-s";
   if (MArch == "armv6j")
     return "arm1136j-s";
+  if (MArch == "armv6m")
+    return "cortex-m0";
   if (MArch == "armv6z" || MArch == "armv6zk")
     return "arm1176jzf-s";
   if (MArch == "armv6t2")
@@ -112,6 +110,11 @@
 // FIXME: This is redundant with -mcpu, why does LLVM use this.
 // FIXME: tblgen this, or kill it!
 static const char *getLLVMArchSuffixForARM(llvm::StringRef CPU) {
+  if (CPU == "arm8" || CPU == "arm810" || CPU == "strongarm" ||
+      CPU == "strongarm110" || CPU == "strongarm1100" ||
+      CPU == "strongarm1110")
+    return "v4";
+
   if (CPU == "arm7tdmi" || CPU == "arm7tdmi-s" || CPU == "arm710t" ||
       CPU == "arm720t" || CPU == "arm9" || CPU == "arm9tdmi" ||
       CPU == "arm920" || CPU == "arm920t" || CPU == "arm922t" ||
@@ -131,12 +134,18 @@
       CPU == "arm1176jzf-s" || CPU == "mpcorenovfp" || CPU == "mpcore")
     return "v6";
 
+  if (CPU == "cortex-m0")
+    return "v6m";
+
   if (CPU == "arm1156t2-s" || CPU == "arm1156t2f-s")
     return "v6t2";
 
   if (CPU == "cortex-a8" || CPU == "cortex-a9")
     return "v7";
 
+  if (CPU == "cortex-m3" || CPU == "cortex-m4")
+    return "v7m";
+
   return "";
 }
 


More information about the llvm-commits mailing list