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