Abi: Only have one "generic" flavor

Replace GenericLinuxFlavor, GenericUnixFlavor, GenericDarwinFlavor,
GenericQnxFlavor and GenericBareMetalFlavor with GenericFlavor. They
can all be distinguished from each other by the OS property, so having
separate enum values for all of them is not necessary.

Remove a unit test that made sure that each flavor (with exceptions)
is only listed for one OS, which no longer is the case now.

Change-Id: I88dad5d37eaa4c288568e40b95337a39b78a8352
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Tobias Hunger
2018-06-14 16:13:46 +02:00
parent 4ceed778f8
commit 23e27ead9e
6 changed files with 49 additions and 102 deletions

View File

@@ -85,7 +85,7 @@ QList<Abi> IosQtVersion::detectQtAbis() const
for (int i = 0; i < abis.count(); ++i) {
abis[i] = Abi(abis.at(i).architecture(),
abis.at(i).os(),
Abi::GenericDarwinFlavor,
Abi::GenericFlavor,
abis.at(i).binaryFormat(),
abis.at(i).wordWidth());
}

View File

@@ -109,17 +109,17 @@ static quint32 getBEUint16(const QByteArray &ba, int pos)
static Abi macAbiForCpu(quint32 type) {
switch (type) {
case 7: // CPU_TYPE_X86, CPU_TYPE_I386
return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32);
return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32);
case 0x01000000 + 7: // CPU_TYPE_X86_64
return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 64);
return Abi(Abi::X86Architecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 64);
case 18: // CPU_TYPE_POWERPC
return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32);
return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32);
case 0x01000000 + 18: // CPU_TYPE_POWERPC64
return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32);
return Abi(Abi::PowerPCArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32);
case 12: // CPU_TYPE_ARM
return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 32);
return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 32);
case 0x01000000 + 12: // CPU_TYPE_ARM64
return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericDarwinFlavor, Abi::MachOFormat, 64);
return Abi(Abi::ArmArchitecture, Abi::DarwinOS, Abi::GenericFlavor, Abi::MachOFormat, 64);
default:
return Abi();
}
@@ -223,7 +223,7 @@ static QList<Abi> abiOf(const QByteArray &data)
quint8 osAbi = getUint8(data, 7);
Abi::OS os = Abi::UnixOS;
Abi::OSFlavor flavor = Abi::GenericUnixFlavor;
Abi::OSFlavor flavor = Abi::GenericFlavor;
// http://www.sco.com/developers/gabi/latest/ch4.eheader.html#elfid
switch (osAbi) {
#if defined(Q_OS_NETBSD)
@@ -242,7 +242,7 @@ static QList<Abi> abiOf(const QByteArray &data)
case 3: // Linux:
case 97: // ARM, also linux most of the time.
os = Abi::LinuxOS;
flavor = Abi::GenericLinuxFlavor;
flavor = Abi::GenericFlavor;
break;
case 6: // Solaris:
os = Abi::UnixOS;
@@ -347,7 +347,7 @@ Abi::Abi(const Architecture &a, const OS &o,
m_osFlavor = UnknownFlavor;
break;
case LinuxOS:
if (m_osFlavor < GenericLinuxFlavor || m_osFlavor > AndroidLinuxFlavor)
if (m_osFlavor != GenericFlavor && m_osFlavor != AndroidLinuxFlavor)
m_osFlavor = UnknownFlavor;
break;
case BsdOS:
@@ -355,11 +355,11 @@ Abi::Abi(const Architecture &a, const OS &o,
m_osFlavor = UnknownFlavor;
break;
case DarwinOS:
if (m_osFlavor < GenericDarwinFlavor || m_osFlavor > GenericDarwinFlavor)
if (m_osFlavor != GenericFlavor)
m_osFlavor = UnknownFlavor;
break;
case UnixOS:
if (m_osFlavor < GenericUnixFlavor || m_osFlavor > SolarisUnixFlavor)
if (m_osFlavor != GenericFlavor && m_osFlavor != SolarisUnixFlavor)
m_osFlavor = UnknownFlavor;
break;
case WindowsOS:
@@ -371,12 +371,12 @@ Abi::Abi(const Architecture &a, const OS &o,
m_osFlavor = VxWorksFlavor;
break;
case QnxOS:
if (m_osFlavor != GenericQnxFlavor)
if (m_osFlavor != GenericFlavor)
m_osFlavor = UnknownFlavor;
break;
case BareMetalOS:
if (m_osFlavor != GenericBareMetalFlavor)
m_osFlavor = GenericBareMetalFlavor;
if (m_osFlavor != GenericFlavor)
m_osFlavor = GenericFlavor;
break;
}
}
@@ -409,7 +409,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple)
} else if (p == "xtensa") {
arch = XtensaArchitecture;
os = BareMetalOS;
flavor = GenericBareMetalFlavor;
flavor = GenericFlavor;
format = ElfFormat;
width = 32;
} else if (p.startsWith("arm")) {
@@ -421,7 +421,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple)
} else if (p == "avr") {
arch = AvrArchitecture;
os = BareMetalOS;
flavor = GenericBareMetalFlavor;
flavor = GenericFlavor;
format = ElfFormat;
width = 16;
} else if (p.startsWith("mips")) {
@@ -439,7 +439,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple)
} else if (p == "linux" || p == "linux6e") {
os = LinuxOS;
if (flavor == UnknownFlavor)
flavor = GenericLinuxFlavor;
flavor = GenericFlavor;
format = ElfFormat;
} else if (p == "android") {
flavor = AndroidLinuxFlavor;
@@ -464,7 +464,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple)
format = PEFormat;
} else if (p == "apple") {
os = DarwinOS;
flavor = GenericDarwinFlavor;
flavor = GenericFlavor;
format = MachOFormat;
} else if (p == "darwin10") {
width = 64;
@@ -480,7 +480,7 @@ Abi Abi::abiFromTargetTriplet(const QString &triple)
format = ElfFormat;
} else if (p.startsWith("qnx")) {
os = QnxOS;
flavor = GenericQnxFlavor;
flavor = GenericFlavor;
format = ElfFormat;
} else {
++unknownCount;
@@ -527,7 +527,7 @@ bool Abi::isCompatibleWith(const Abi &other) const
// work for them.
if (!isCompat && (architecture() == other.architecture() || other.architecture() == UnknownArchitecture)
&& ((os() == other.os()) && (os() == LinuxOS))
&& (osFlavor() == GenericLinuxFlavor || other.osFlavor() == GenericLinuxFlavor)
&& (osFlavor() == GenericFlavor || other.osFlavor() == GenericFlavor)
&& (binaryFormat() == other.binaryFormat() || other.binaryFormat() == UnknownFormat)
&& ((wordWidth() == other.wordWidth() && wordWidth() != 0) || other.wordWidth() == 0)) {
isCompat = true;
@@ -619,11 +619,7 @@ QString Abi::toString(const OS &o)
QString Abi::toString(const OSFlavor &of)
{
switch (of) {
case GenericLinuxFlavor:
case GenericDarwinFlavor:
case GenericUnixFlavor:
case GenericBareMetalFlavor:
case GenericQnxFlavor:
case GenericFlavor:
return QLatin1String("generic");
case AndroidLinuxFlavor:
return QLatin1String("android");
@@ -782,25 +778,7 @@ Abi::OSFlavor Abi::osFlavorFromString(const QStringRef &of, const OS os)
{
Abi::OSFlavor result = UnknownFlavor;
if (of == "generic") {
switch (os) {
case LinuxOS:
result = GenericLinuxFlavor;
break;
case DarwinOS:
result = GenericDarwinFlavor;
break;
case UnixOS:
result = GenericUnixFlavor;
break;
case BareMetalOS:
result = GenericBareMetalFlavor;
break;
case QnxOS:
result = GenericQnxFlavor;
break;
default:
result = UnknownFlavor;
}
result = GenericFlavor;
} else if (of == "android") {
result = AndroidLinuxFlavor;
} else if (of == "freebsd") {
@@ -874,11 +852,11 @@ QList<Abi::OSFlavor> Abi::flavorsForOs(const Abi::OS &o)
case BsdOS:
return {FreeBsdFlavor, OpenBsdFlavor, NetBsdFlavor, UnknownFlavor};
case LinuxOS:
return {GenericLinuxFlavor, AndroidLinuxFlavor, UnknownFlavor};
return {GenericFlavor, AndroidLinuxFlavor, UnknownFlavor};
case DarwinOS:
return {GenericDarwinFlavor, UnknownFlavor};
return {GenericFlavor, UnknownFlavor};
case UnixOS:
return {GenericUnixFlavor, SolarisUnixFlavor, UnknownFlavor};
return {GenericFlavor, SolarisUnixFlavor, UnknownFlavor};
case WindowsOS:
return {WindowsMsvc2005Flavor, WindowsMsvc2008Flavor, WindowsMsvc2010Flavor,
WindowsMsvc2012Flavor, WindowsMsvc2013Flavor, WindowsMsvc2015Flavor,
@@ -886,9 +864,9 @@ QList<Abi::OSFlavor> Abi::flavorsForOs(const Abi::OS &o)
case VxWorks:
return {VxWorksFlavor, UnknownFlavor};
case QnxOS:
return {GenericQnxFlavor, UnknownFlavor};
return {GenericFlavor, UnknownFlavor};
case BareMetalOS:
return {GenericBareMetalFlavor, RtosFlavor, UnknownFlavor};
return {GenericFlavor, RtosFlavor, UnknownFlavor};
case UnknownOS:
return {UnknownFlavor};
}
@@ -934,11 +912,11 @@ Abi Abi::hostAbi()
format = PEFormat;
#elif defined (Q_OS_LINUX)
os = LinuxOS;
subos = GenericLinuxFlavor;
subos = GenericFlavor;
format = ElfFormat;
#elif defined (Q_OS_DARWIN)
os = DarwinOS;
subos = GenericDarwinFlavor;
subos = GenericFlavor;
format = MachOFormat;
#elif defined (Q_OS_BSD4)
os = BsdOS;
@@ -1034,11 +1012,7 @@ QList<Abi> Abi::abisOfBinary(const Utils::FileName &path)
static bool isGenericFlavor(ProjectExplorer::Abi::OSFlavor f)
{
return f == ProjectExplorer::Abi::GenericBareMetalFlavor
|| f == ProjectExplorer::Abi::GenericDarwinFlavor
|| f == ProjectExplorer::Abi::GenericLinuxFlavor
|| f == ProjectExplorer::Abi::GenericQnxFlavor
|| f == ProjectExplorer::Abi::GenericUnixFlavor;
return f == ProjectExplorer::Abi::GenericFlavor;
}
void ProjectExplorer::ProjectExplorerPlugin::testAbiRoundTrips()
@@ -1059,7 +1033,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiRoundTrips()
for (int os = 0; os <= Abi::UnknownOS; ++os) {
const Abi::OS osEnum = static_cast<Abi::OS>(os);
const Abi::OSFlavor flavor = Abi::osFlavorFromString(QStringRef(&string), osEnum);
if (isGenericFlavor(flavorEnum) && flavor != Abi::UnknownFlavor)
if (flavorEnum == Abi::GenericFlavor && flavor != Abi::UnknownFlavor)
QVERIFY(isGenericFlavor(flavor));
else if (flavor == Abi::UnknownFlavor && i != Abi::UnknownFlavor)
QVERIFY(!Abi::flavorsForOs(osEnum).contains(flavorEnum));
@@ -1220,25 +1194,6 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiOfBinary()
QCOMPARE(result.at(i).toString(), abis.at(i));
}
void ProjectExplorer::ProjectExplorerPlugin::testFlavorForOs()
{
QList<QList<Abi::OSFlavor> > flavorLists;
for (int i = 0; i != static_cast<int>(Abi::UnknownOS); ++i)
flavorLists.append(Abi::flavorsForOs(static_cast<Abi::OS>(i)));
int foundCounter = 0;
for (int i = 0; i != Abi::UnknownFlavor; ++i) {
foundCounter = 0;
// make sure i is in exactly on of the flavor lists!
foreach (const QList<Abi::OSFlavor> &l, flavorLists) {
QVERIFY(l.contains(Abi::UnknownFlavor));
if (l.contains(static_cast<Abi::OSFlavor>(i)))
++foundCounter;
}
QCOMPARE(foundCounter, 1);
}
}
void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
{
QTest::addColumn<int>("architecture");
@@ -1248,15 +1203,15 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
QTest::addColumn<int>("wordWidth");
QTest::newRow("x86_64-apple-darwin") << int(Abi::X86Architecture)
<< int(Abi::DarwinOS) << int(Abi::GenericDarwinFlavor)
<< int(Abi::DarwinOS) << int(Abi::GenericFlavor)
<< int(Abi::MachOFormat) << 64;
QTest::newRow("x86_64-apple-darwin12.5.0") << int(Abi::X86Architecture)
<< int(Abi::DarwinOS) << int(Abi::GenericDarwinFlavor)
<< int(Abi::DarwinOS) << int(Abi::GenericFlavor)
<< int(Abi::MachOFormat) << 64;
QTest::newRow("x86_64-linux-gnu") << int(Abi::X86Architecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 64;
QTest::newRow("x86_64-pc-mingw32msvc") << int(Abi::X86Architecture)
@@ -1268,7 +1223,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::PEFormat) << 32;
QTest::newRow("i686-linux-gnu") << int(Abi::X86Architecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 32;
QTest::newRow("i686-linux-android") << int(Abi::X86Architecture)
@@ -1312,7 +1267,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::ElfFormat) << 32;
QTest::newRow("arm-none-linux-gnueabi") << int(Abi::ArmArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 32;
QTest::newRow("mipsel-linux-android") << int(Abi::MipsArchitecture)
@@ -1324,7 +1279,7 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::ElfFormat) << 32;
QTest::newRow("mips-linux-gnu") << int(Abi::MipsArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 32;
QTest::newRow("mips64el-linux-android") << int(Abi::MipsArchitecture)
@@ -1336,11 +1291,11 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::ElfFormat) << 64;
QTest::newRow("mips64-linux-octeon-gnu") << int(Abi::MipsArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 64;
QTest::newRow("mips64el-linux-gnuabi") << int(Abi::MipsArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 64;
QTest::newRow("arm-wrs-vxworks") << int(Abi::ArmArchitecture)
@@ -1352,15 +1307,15 @@ void ProjectExplorer::ProjectExplorerPlugin::testAbiFromTargetTriplet_data()
<< int(Abi::ElfFormat) << 64;
QTest::newRow("aarch64-unknown-linux-gnu") << int(Abi::ArmArchitecture)
<< int(Abi::LinuxOS) << int(Abi::GenericLinuxFlavor)
<< int(Abi::LinuxOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 64;
QTest::newRow("xtensa-lx106-elf") << int(Abi::XtensaArchitecture)
<< int(Abi::BareMetalOS) << int(Abi::GenericBareMetalFlavor)
<< int(Abi::BareMetalOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 32;
// Yes, that's the entire triplet
QTest::newRow("avr") << int(Abi::AvrArchitecture)
<< int(Abi::BareMetalOS) << int(Abi::GenericBareMetalFlavor)
<< int(Abi::BareMetalOS) << int(Abi::GenericFlavor)
<< int(Abi::ElfFormat) << 16;
}

View File

@@ -72,14 +72,9 @@ public:
OpenBsdFlavor,
// Linux
GenericLinuxFlavor,
AndroidLinuxFlavor,
// Darwin
GenericDarwinFlavor,
// Unix
GenericUnixFlavor,
SolarisUnixFlavor,
// Windows
@@ -95,13 +90,12 @@ public:
// Embedded
VxWorksFlavor,
GenericQnxFlavor,
GenericBareMetalFlavor,
// Generic:
RtosFlavor,
GenericFlavor,
UnknownFlavor
UnknownFlavor // keep last in this enum!
};
enum BinaryFormat {

View File

@@ -707,7 +707,7 @@ FileNameList GccToolChain::suggestedMkspecList() const
}
if (abi.os() == Abi::LinuxOS) {
if (abi.osFlavor() != Abi::GenericLinuxFlavor)
if (abi.osFlavor() != Abi::GenericFlavor)
return FileNameList(); // most likely not a desktop, so leave the mkspec alone.
if (abi.wordWidth() == host.wordWidth()) {
// no need to explicitly set the word width, but provide that mkspec anyway to make sure

View File

@@ -225,7 +225,6 @@ private slots:
void testAbiRoundTrips();
void testAbiOfBinary_data();
void testAbiOfBinary();
void testFlavorForOs();
void testAbiFromTargetTriplet_data();
void testAbiFromTargetTriplet();

View File

@@ -241,15 +241,14 @@ QList<QnxTarget> QnxUtils::findTargets(const Utils::FileName &basePath)
Abi QnxUtils::convertAbi(const Abi &abi)
{
if (abi.os() == Abi::LinuxOS && abi.osFlavor() == Abi::GenericLinuxFlavor) {
if (abi.os() == Abi::LinuxOS && abi.osFlavor() == Abi::GenericFlavor) {
return Abi(abi.architecture(),
Abi::QnxOS,
Abi::GenericQnxFlavor,
Abi::GenericFlavor,
abi.binaryFormat(),
abi.wordWidth());
} else {
return abi;
}
return abi;
}
QList<Abi> QnxUtils::convertAbis(const QList<Abi> &abis)