Support -mcpu=cortex-a8 in ARM attributes - Has Fixme. 1 Test modified.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118422 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp
index 3908b1e..ba0fee9 100644
--- a/lib/Target/ARM/ARMAsmPrinter.cpp
+++ b/lib/Target/ARM/ARMAsmPrinter.cpp
@@ -74,6 +74,7 @@
   public:
     virtual void MaybeSwitchVendor(StringRef Vendor) = 0;
     virtual void EmitAttribute(unsigned Attribute, unsigned Value) = 0;
+    virtual void EmitTextAttribute(unsigned Attribute, StringRef String) = 0;
     virtual void Finish() = 0;
     virtual ~AttributeEmitter() {}
   };
@@ -90,6 +91,10 @@
                            Twine(Attribute) + ", " + Twine(Value));
     }
 
+    void EmitTextAttribute(unsigned Attribute, StringRef String) {
+      assert(0 && "Unsupported use of text attribute");
+    }
+
     void Finish() { }
   };
 
@@ -123,6 +128,12 @@
       Contents += Value;
     }
 
+    void EmitTextAttribute(unsigned Attribute, StringRef String) {
+      Contents += Attribute;
+      Contents += String;
+      Contents += 0;
+    }
+
     void Finish() {
       const size_t ContentsSize = Contents.size();
 
@@ -598,28 +609,51 @@
     if (CPUString != "generic")
       OutStreamer.EmitRawText(StringRef("\t.cpu ") + CPUString);
   } else {
-    assert(CPUString == "generic" && "Unsupported .cpu attribute for ELF/.o");
-    // FIXME: Why these defaults?
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v4T);
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use, 1);
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use, 1);
+    if (CPUString != "generic") {
+      if (CPUString == "cortex-a8") {
+        AttrEmitter->EmitTextAttribute(ARMBuildAttrs::CPU_name, "CORTEX-A8");
+        AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v7);
+        AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch_profile,
+                                   ARMBuildAttrs::ApplicationProfile);
+        AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use,
+                                   ARMBuildAttrs::Allowed);
+        AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use,
+                                   ARMBuildAttrs::AllowThumb32);
+        // Fixme: figure out when this is emitted.
+        //AttrEmitter->EmitAttribute(ARMBuildAttrs::WMMX_arch,
+        //                           ARMBuildAttrs::AllowWMMXv1);
+      }
+    } else {
+      // FIXME: Why these defaults?
+      AttrEmitter->EmitAttribute(ARMBuildAttrs::CPU_arch, ARMBuildAttrs::v4T);
+      AttrEmitter->EmitAttribute(ARMBuildAttrs::ARM_ISA_use,
+                                 ARMBuildAttrs::Allowed);
+      AttrEmitter->EmitAttribute(ARMBuildAttrs::THUMB_ISA_use,
+                                 ARMBuildAttrs::Allowed);
+    }
   }
 
   // FIXME: Emit FPU type
   if (Subtarget->hasVFP2())
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch, 2);
+    AttrEmitter->EmitAttribute(ARMBuildAttrs::VFP_arch,
+                               ARMBuildAttrs::AllowFPv2);
 
   // Signal various FP modes.
   if (!UnsafeFPMath) {
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_denormal, 1);
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_exceptions, 1);
+    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_denormal,
+                               ARMBuildAttrs::Allowed);
+    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_exceptions,
+                               ARMBuildAttrs::Allowed);
   }
 
   if (NoInfsFPMath && NoNaNsFPMath)
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model, 1);
+    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model,
+                               ARMBuildAttrs::Allowed);
   else
-    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model, 3);
+    AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_FP_number_model,
+                               ARMBuildAttrs::AllowIEE754);
 
+  // FIXME: add more flags to ARMBuildAttrs.h
   // 8-bytes alignment stuff.
   AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_align8_needed, 1);
   AttrEmitter->EmitAttribute(ARMBuildAttrs::ABI_align8_preserved, 1);