Added getDefaultSubtargetFeatures method to SubtargetFeatures class which returns...
authorViktor Kutuzov <vkutuzov@accesssoftek.com>
Wed, 18 Nov 2009 20:20:05 +0000 (20:20 +0000)
committerViktor Kutuzov <vkutuzov@accesssoftek.com>
Wed, 18 Nov 2009 20:20:05 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@89236 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/SubtargetFeature.h
lib/Target/SubtargetFeature.cpp
tools/lto/LTOCodeGenerator.cpp
tools/lto/LTOModule.cpp
tools/lto/LTOModule.h

index a709f523897c23972aed2c5a3a91780b1ac093b5..38a3cc2fefa4e626d0f9cadf09fc447149421f44 100644 (file)
@@ -21,6 +21,7 @@
 #include <string>
 #include <vector>
 #include <cstring>
+#include "llvm/ADT/Triple.h"
 #include "llvm/System/DataTypes.h"
 
 namespace llvm {
@@ -106,6 +107,10 @@ public:
   
   // Dump feature info.
   void dump() const;
+
+  /// Retrieve a formatted string of the default features for
+  /// the specified target triple.
+  static std::string getDefaultSubtargetFeatures(const Triple &Triple);
 };
 
 } // End namespace llvm
index 664a43cbcca7bfab28c78d35c972793002a4f777..590574ef3981cd680d7d85563c683527c41b0e86 100644 (file)
@@ -357,3 +357,30 @@ void SubtargetFeatures::print(raw_ostream &OS) const {
 void SubtargetFeatures::dump() const {
   print(errs());
 }
+
+/// getDefaultSubtargetFeatures - Return a string listing
+/// the features associated with the target triple.
+///
+/// FIXME: This is an inelegant way of specifying the features of a
+/// subtarget. It would be better if we could encode this information
+/// into the IR. See <rdar://5972456>.
+///
+std::string SubtargetFeatures::getDefaultSubtargetFeatures(
+                                               const Triple& Triple) {
+  switch (Triple.getVendor()) {
+  case Triple::Apple:
+    switch (Triple.getArch()) {
+    case Triple::ppc:   // powerpc-apple-*
+      return std::string("altivec");
+    case Triple::ppc64: // powerpc64-apple-*
+      return std::string("64bit,altivec");
+    default:
+      break;
+    }
+    break;
+  default:
+    break;
+  } 
+
+  return std::string("");
+}
index eb82f984d7bd811235da3ee4a57830d05381cd8f..0b9cb2952e83c9131a6bef0e32181793783b70cc 100644 (file)
@@ -305,7 +305,8 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg)
         }
 
         // construct LTModule, hand over ownership of module and target
-        std::string FeatureStr = getFeatureString(Triple.c_str());
+        const std::string FeatureStr = 
+            SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple));
         _target = march->createTargetMachine(Triple, FeatureStr);
     }
     return false;
index e1cf48d3c841fdd7bd2771b5170e7776da623f9b..bce416207c40dd527e11f3f65c93af8ae2056c80 100644 (file)
@@ -19,6 +19,7 @@
 #include "llvm/Module.h"
 #include "llvm/ModuleProvider.h"
 #include "llvm/ADT/OwningPtr.h"
+#include "llvm/ADT/Triple.h"
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Support/SystemUtils.h"
 #include "llvm/Support/Mangler.h"
@@ -120,27 +121,6 @@ LTOModule* LTOModule::makeLTOModule(const void* mem, size_t length,
     return makeLTOModule(buffer.get(), errMsg);
 }
 
-/// getFeatureString - Return a string listing the features associated with the
-/// target triple.
-///
-/// FIXME: This is an inelegant way of specifying the features of a
-/// subtarget. It would be better if we could encode this information into the
-/// IR. See <rdar://5972456>.
-std::string getFeatureString(const char *TargetTriple) {
-  InitializeAllTargets();
-
-  SubtargetFeatures Features;
-
-  if (strncmp(TargetTriple, "powerpc-apple-", 14) == 0) {
-    Features.AddFeature("altivec", true);
-  } else if (strncmp(TargetTriple, "powerpc64-apple-", 16) == 0) {
-    Features.AddFeature("64bit", true);
-    Features.AddFeature("altivec", true);
-  }
-
-  return Features.getString();
-}
-
 LTOModule* LTOModule::makeLTOModule(MemoryBuffer* buffer,
                                     std::string& errMsg)
 {
@@ -161,7 +141,8 @@ LTOModule* LTOModule::makeLTOModule(MemoryBuffer* buffer,
         return NULL;
 
     // construct LTModule, hand over ownership of module and target
-    std::string FeatureStr = getFeatureString(Triple.c_str());
+    const std::string FeatureStr = 
+        SubtargetFeatures::getDefaultSubtargetFeatures(llvm::Triple(Triple));
     TargetMachine* target = march->createTargetMachine(Triple, FeatureStr);
     return new LTOModule(m.take(), target);
 }
index 8fd3915e28ca46bf16ac91c34f86329462c7af0d..4019e015a5d88b50da808c3a80ddd4b03e8b6f9a 100644 (file)
@@ -107,7 +107,5 @@ private:
     llvm::StringMap<NameAndAttributes>      _undefines;
 };
 
-extern std::string getFeatureString(const char *TargetTriple);
-
 #endif // LTO_MODULE_H