Hi,

The attached patch changes the Linux and FreeBSD targetinfo classes to
be templates,
allowing them to be instantiated with any target.

Besides avoiding code duplication (the LinuxX86_32TargetInfo wasn't much
different from LinuxX64_TargetInfo except it inherited from a different
class),
it also makes it easier to add support for a new target for an already
supported OS.
It also avoids the need to create a new class for each OS / Target
combination.

Please review.

If this approach  is good, then maybe the other targets should be
changed to use templates (DragonFlyBSD and OpenBSD at least).
I guess Solaris and Darwin is fixed in the number of targets they support.

Best regards,
--Edwin
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 9ca014d..d0cd707 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -866,14 +866,15 @@ public:
 } // end anonymous namespace
 
 namespace {
-// x86-32 FreeBSD target
-class FreeBSDX86_32TargetInfo : public X86_32TargetInfo {
+// FreeBSD target
+template<typename Target>
+class FreeBSDTargetInfo : public Target {
 public:
-  FreeBSDX86_32TargetInfo(const std::string& triple) :
-      X86_32TargetInfo(triple) { }
+  FreeBSDTargetInfo(const std::string& triple) :
+      Target(triple) { }
   virtual void getTargetDefines(const LangOptions &Opts,
                                 std::vector<char> &Defines) const {
-    X86_32TargetInfo::getTargetDefines(Opts, Defines);
+    Target::getTargetDefines(Opts, Defines);
     getFreeBSDDefines(Opts, 0, getTargetTriple(), Defines);
   }
 };
@@ -894,15 +895,16 @@ public:
 } // end anonymous namespace
 
 namespace {
-// x86-32 Linux target
-class LinuxX86_32TargetInfo : public X86_32TargetInfo {
+// Linux target
+template<typename Target>
+class LinuxTargetInfo : public Target {
 public:
-  LinuxX86_32TargetInfo(const std::string& triple) : X86_32TargetInfo(triple) {
-    UserLabelPrefix = "";
+  LinuxTargetInfo(const std::string& triple) : Target(triple) {
+    this->UserLabelPrefix = "";
   }
   virtual void getTargetDefines(const LangOptions &Opts,
                                 std::vector<char> &Defines) const {
-    X86_32TargetInfo::getTargetDefines(Opts, Defines);
+    Target::getTargetDefines(Opts, Defines);
     getLinuxDefines(Opts, Defines);
   }
 };
@@ -987,35 +989,6 @@ public:
 } // end anonymous namespace
 
 namespace {
-// x86-64 FreeBSD target
-class FreeBSDX86_64TargetInfo : public X86_64TargetInfo {
-public:
-  FreeBSDX86_64TargetInfo(const std::string &triple)
-    : X86_64TargetInfo(triple) {}
-  virtual void getTargetDefines(const LangOptions &Opts,
-                                std::vector<char> &Defines) const {
-    X86_64TargetInfo::getTargetDefines(Opts, Defines);
-    getFreeBSDDefines(Opts, 1, getTargetTriple(), Defines);
-  }
-};
-} // end anonymous namespace
-
-namespace {
-// x86-64 Linux target
-class LinuxX86_64TargetInfo : public X86_64TargetInfo {
-public:
-  LinuxX86_64TargetInfo(const std::string& triple) : X86_64TargetInfo(triple) {
-    UserLabelPrefix = "";
-  }
-  virtual void getTargetDefines(const LangOptions &Opts,
-                                std::vector<char> &Defines) const {
-    X86_64TargetInfo::getTargetDefines(Opts, Defines);
-    getLinuxDefines(Opts, Defines);
-  }
-};
-} // end anonymous namespace
-
-namespace {
 // x86-64 Solaris target
 class SolarisX86_64TargetInfo : public X86_64TargetInfo {
 public:
@@ -1494,9 +1467,9 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
     if (isDarwin)
       return new DarwinX86_64TargetInfo(T);
     if (isLinux)
-      return new LinuxX86_64TargetInfo(T);
+      return new LinuxTargetInfo<X86_64TargetInfo>(T);
     if (isFreeBSD)
-      return new FreeBSDX86_64TargetInfo(T);
+      return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
     if (isSolaris)
       return new SolarisX86_64TargetInfo(T);
     return new X86_64TargetInfo(T);
@@ -1512,11 +1485,11 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
     if (isDarwin)
       return new DarwinI386TargetInfo(T);
     if (isLinux)
-      return new LinuxX86_32TargetInfo(T);
+      return new LinuxTargetInfo<X86_32TargetInfo>(T);
     if (isDragonFly)
       return new DragonFlyX86_32TargetInfo(T);
     if (isFreeBSD)
-      return new FreeBSDX86_32TargetInfo(T);
+      return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
     if (isSolaris)
       return new SolarisX86_32TargetInfo(T);
     if (isWindows)
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to