114
static const QStringList gccPredefinedMacrosOptions()
116
return QStringList() << QLatin1String("-xc++") << QLatin1String("-E") << QLatin1String("-dM");
114
119
static QByteArray gccPredefinedMacros(const FileName &gcc, const QStringList &args, const QStringList &env)
116
QStringList arguments;
117
arguments << QLatin1String("-xc++")
118
<< QLatin1String("-E")
119
<< QLatin1String("-dM");
120
foreach (const QString &a, args) {
121
if (a == QLatin1String("-m128bit-long-double") || a == QLatin1String("-m32")
122
|| a == QLatin1String("-m3dnow") || a == QLatin1String("-m3dnowa")
123
|| a == QLatin1String("-m64") || a == QLatin1String("-m96bit-long-double")
124
|| a == QLatin1String("-mabm") || a == QLatin1String("-maes")
125
|| a.startsWith(QLatin1String("-march=")) || a == QLatin1String("-mavx")
126
|| a.startsWith(QLatin1String("-masm=")) || a == QLatin1String("-mcx16")
127
|| a == QLatin1String("-mfma") || a == QLatin1String("-mfma4")
128
|| a == QLatin1String("-mlwp") || a == QLatin1String("-mpclmul")
129
|| a == QLatin1String("-mpopcnt") || a == QLatin1String("-msse")
130
|| a == QLatin1String("-msse2") || a == QLatin1String("-msse2avx")
131
|| a == QLatin1String("-msse3") || a == QLatin1String("-msse4")
132
|| a == QLatin1String("-msse4.1") || a == QLatin1String("-msse4.2")
133
|| a == QLatin1String("-msse4a") || a == QLatin1String("-mssse3")
134
|| a.startsWith(QLatin1String("-mtune=")) || a == QLatin1String("-mxop")
135
|| a == QLatin1String("-Os") || a == QLatin1String("-O0") || a == QLatin1String("-O1")
136
|| a == QLatin1String("-O2") || a == QLatin1String("-O3")
137
|| a == QLatin1String("-ffinite-math-only") || a == QLatin1String("-fshort-double")
138
|| a == QLatin1String("-fshort-wchar") || a == QLatin1String("-fsignaling-nans")
139
|| a == QLatin1String("-fno-inline") || a == QLatin1String("-fno-exceptions")
140
|| a == QLatin1String("-fstack-protector") || a == QLatin1String("-fstack-protector-all")
141
|| a == QLatin1String("-fsanitize=address") || a == QLatin1String("-fno-rtti")
142
|| a.startsWith(QLatin1String("-std=")) || a.startsWith(QLatin1String("-stdlib="))
143
|| a.startsWith(QLatin1String("-specs="))
144
|| a == QLatin1String("-ansi") || a == QLatin1String("-undef")
145
|| a.startsWith(QLatin1String("-D")) || a.startsWith(QLatin1String("-U"))
146
|| a == QLatin1String("-fopenmp") || a == QLatin1String("-Wno-deprecated"))
121
QStringList arguments = args;
150
122
arguments << QLatin1String("-");
152
124
QByteArray predefinedMacros = runGcc(gcc, arguments, env);
153
125
// Sanity check in case we get an error message instead of real output:
154
QTC_CHECK(predefinedMacros.startsWith("#define "));
126
QTC_CHECK(predefinedMacros.isNull() || predefinedMacros.startsWith("#define "));
155
127
if (Utils::HostOsInfo::isMacHost()) {
156
128
// Turn off flag indicating Apple's blocks support
157
129
const QByteArray blocksDefine("#define __BLOCKS__ 1");
238
197
Abi::BinaryFormat format = guessed.binaryFormat();
239
198
int width = guessed.wordWidth();
241
if (os == Abi::MacOS && arch != Abi::ArmArchitecture) {
200
if (macros.contains("#define __SIZEOF_SIZE_T__ 8"))
202
else if (macros.contains("#define __SIZEOF_SIZE_T__ 4"))
205
if (os == Abi::MacOS) {
242
206
// Apple does PPC and x86!
243
207
abiList << Abi(arch, os, flavor, format, width);
244
208
abiList << Abi(arch, os, flavor, format, width == 64 ? 32 : 64);
245
abiList << Abi(arch == Abi::X86Architecture ? Abi::PowerPCArchitecture : Abi::X86Architecture, os, flavor, format, width);
246
abiList << Abi(arch == Abi::X86Architecture ? Abi::PowerPCArchitecture : Abi::X86Architecture, os, flavor, format, width == 64 ? 32 : 64);
247
209
} else if (arch == Abi::X86Architecture && (width == 0 || width == 64)) {
248
if (macros.contains("#define __x86_64 1"))
249
abiList << Abi(arch, os, flavor, format, 64);
210
abiList << Abi(arch, os, flavor, format, 64);
250
211
abiList << Abi(arch, os, flavor, format, 32);
252
213
abiList << Abi(arch, os, flavor, format, width);
370
363
QByteArray GccToolChain::predefinedMacros(const QStringList &cxxflags) const
372
365
QStringList allCxxflags = m_platformCodeGenFlags + cxxflags; // add only cxxflags is empty?
373
typedef QPair<QStringList, QByteArray> CacheItem;
375
for (GccCache::iterator it = m_predefinedMacros.begin(); it != m_predefinedMacros.end(); ++it)
376
if (it->first == allCxxflags) {
377
// Increase cached item priority
378
CacheItem pair = *it;
379
m_predefinedMacros.erase(it);
380
m_predefinedMacros.push_back(pair);
385
CacheItem runResults;
386
runResults.first = allCxxflags;
367
QByteArray macros = macroCache(allCxxflags);
368
if (!macros.isNull())
388
371
// Using a clean environment breaks ccache/distcc/etc.
389
372
Environment env = Environment::systemEnvironment();
390
373
addToEnvironment(env);
391
runResults.second = gccPredefinedMacros(m_compilerCommand, allCxxflags, env.toStringList());
393
m_predefinedMacros.push_back(runResults);
394
if (m_predefinedMacros.size() > PREDEFINED_MACROS_CACHE_SIZE)
395
m_predefinedMacros.pop_front();
397
return runResults.second;
374
QStringList arguments = gccPredefinedMacrosOptions();
375
for (int iArg = 0; iArg < allCxxflags.length(); ++iArg) {
376
const QString &a = allCxxflags.at(iArg);
377
if (a == QLatin1String("-arch") || a == QLatin1String("-sysroot")
378
|| a == QLatin1String("-isysroot")) {
379
if (++iArg < allCxxflags.length())
380
arguments << a << allCxxflags.at(iArg);
381
} else if (a == QLatin1String("-m128bit-long-double") || a == QLatin1String("-m32")
382
|| a == QLatin1String("-m3dnow") || a == QLatin1String("-m3dnowa")
383
|| a == QLatin1String("-m64") || a == QLatin1String("-m96bit-long-double")
384
|| a == QLatin1String("-mabm") || a == QLatin1String("-maes")
385
|| a.startsWith(QLatin1String("-march=")) || a == QLatin1String("-mavx")
386
|| a.startsWith(QLatin1String("-masm=")) || a == QLatin1String("-mcx16")
387
|| a == QLatin1String("-mfma") || a == QLatin1String("-mfma4")
388
|| a == QLatin1String("-mlwp") || a == QLatin1String("-mpclmul")
389
|| a == QLatin1String("-mpopcnt") || a == QLatin1String("-msse")
390
|| a == QLatin1String("-msse2") || a == QLatin1String("-msse2avx")
391
|| a == QLatin1String("-msse3") || a == QLatin1String("-msse4")
392
|| a == QLatin1String("-msse4.1") || a == QLatin1String("-msse4.2")
393
|| a == QLatin1String("-msse4a") || a == QLatin1String("-mssse3")
394
|| a.startsWith(QLatin1String("-mtune=")) || a == QLatin1String("-mxop")
395
|| a == QLatin1String("-Os") || a == QLatin1String("-O0") || a == QLatin1String("-O1")
396
|| a == QLatin1String("-O2") || a == QLatin1String("-O3")
397
|| a == QLatin1String("-ffinite-math-only") || a == QLatin1String("-fshort-double")
398
|| a == QLatin1String("-fshort-wchar") || a == QLatin1String("-fsignaling-nans")
399
|| a == QLatin1String("-fno-inline") || a == QLatin1String("-fno-exceptions")
400
|| a == QLatin1String("-fstack-protector") || a == QLatin1String("-fstack-protector-all")
401
|| a == QLatin1String("-fsanitize=address") || a == QLatin1String("-fno-rtti")
402
|| a.startsWith(QLatin1String("-std=")) || a.startsWith(QLatin1String("-stdlib="))
403
|| a.startsWith(QLatin1String("-specs="))
404
|| a == QLatin1String("-ansi") || a == QLatin1String("-undef")
405
|| a.startsWith(QLatin1String("-D")) || a.startsWith(QLatin1String("-U"))
406
|| a == QLatin1String("-fopenmp") || a == QLatin1String("-Wno-deprecated"))
409
macros = gccPredefinedMacros(m_compilerCommand, reinterpretOptions(arguments),
412
setMacroCache(allCxxflags, macros);
1357
1407
<< (QStringList());
1358
1408
QTest::newRow("empty input (with macros)")
1359
1409
<< QString::fromLatin1("")
1360
<< QByteArray("#define __x86_64 1\n#define __Something\n")
1410
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n#define __Something\n")
1361
1411
<< (QStringList());
1362
QTest::newRow("broken input")
1363
<< QString::fromLatin1("arm-none-foo-gnueabi")
1364
<< QByteArray("#define __ARM_64 1\n#define __Something\n")
1412
QTest::newRow("broken input -- 64bit")
1413
<< QString::fromLatin1("arm-none-foo-gnueabi")
1414
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n#define __Something\n")
1415
<< (QStringList() << QLatin1String("arm-unknown-unknown-unknown-64bit"));
1416
QTest::newRow("broken input -- 32bit")
1417
<< QString::fromLatin1("arm-none-foo-gnueabi")
1418
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n#define __Something\n")
1365
1419
<< (QStringList() << QLatin1String("arm-unknown-unknown-unknown-32bit"));
1366
QTest::newRow("totally broken input")
1420
QTest::newRow("totally broken input -- 32bit")
1367
1421
<< QString::fromLatin1("foo-bar-foo")
1368
<< QByteArray("#define __ARM_64 1\n#define __Something\n")
1422
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n#define __Something\n")
1369
1423
<< (QStringList());
1371
1425
QTest::newRow("Linux 1 (32bit intel)")
1372
1426
<< QString::fromLatin1("i686-linux-gnu")
1427
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1374
1428
<< (QStringList() << QLatin1String("x86-linux-generic-elf-32bit"));
1375
1429
QTest::newRow("Linux 2 (32bit intel)")
1376
1430
<< QString::fromLatin1("i486-linux-gnu")
1431
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1378
1432
<< (QStringList() << QLatin1String("x86-linux-generic-elf-32bit"));
1379
1433
QTest::newRow("Linux 3 (64bit intel)")
1380
1434
<< QString::fromLatin1("x86_64-linux-gnu")
1381
<< QByteArray("#define __x86_64 1\n")
1435
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1382
1436
<< (QStringList() << QLatin1String("x86-linux-generic-elf-64bit")
1383
1437
<< QLatin1String("x86-linux-generic-elf-32bit"));
1384
1438
QTest::newRow("Linux 3 (64bit intel -- non 64bit)")
1385
1439
<< QString::fromLatin1("x86_64-linux-gnu")
1440
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1387
1441
<< (QStringList() << QLatin1String("x86-linux-generic-elf-32bit"));
1388
1442
QTest::newRow("Linux 4 (32bit mips)")
1389
1443
<< QString::fromLatin1("mipsel-linux-uclibc")
1444
<< QByteArray("#define __SIZEOF_SIZE_T__ 4")
1391
1445
<< (QStringList() << QLatin1String("mips-linux-generic-elf-32bit"));
1392
1446
QTest::newRow("Linux 5 (QTCREATORBUG-4690)") // from QTCREATORBUG-4690
1393
1447
<< QString::fromLatin1("x86_64-redhat-linux6E")
1394
<< QByteArray("#define __x86_64 1\n")
1448
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1395
1449
<< (QStringList() << QLatin1String("x86-linux-generic-elf-64bit")
1396
1450
<< QLatin1String("x86-linux-generic-elf-32bit"));
1397
1451
QTest::newRow("Linux 6 (QTCREATORBUG-4690)") // from QTCREATORBUG-4690
1398
1452
<< QString::fromLatin1("x86_64-redhat-linux")
1399
<< QByteArray("#define __x86_64 1\n")
1453
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1400
1454
<< (QStringList() << QLatin1String("x86-linux-generic-elf-64bit")
1401
1455
<< QLatin1String("x86-linux-generic-elf-32bit"));
1402
1456
QTest::newRow("Linux 7 (arm)")
1403
1457
<< QString::fromLatin1("armv5tl-montavista-linux-gnueabi")
1458
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1405
1459
<< (QStringList() << QLatin1String("arm-linux-generic-elf-32bit"));
1406
1460
QTest::newRow("Linux 8 (arm)")
1407
1461
<< QString::fromLatin1("arm-angstrom-linux-gnueabi")
1462
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1409
1463
<< (QStringList() << QLatin1String("arm-linux-generic-elf-32bit"));
1410
1464
QTest::newRow("Linux 9 (ppc)")
1411
1465
<< QString::fromLatin1("powerpc-nsg-linux")
1466
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1413
1467
<< (QStringList() << QLatin1String("ppc-linux-generic-elf-32bit"));
1414
1468
QTest::newRow("Linux 10 (ppc 64bit)")
1415
1469
<< QString::fromLatin1("powerpc64-suse-linux")
1470
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1417
1471
<< (QStringList() << QLatin1String("ppc-linux-generic-elf-64bit"));
1419
1473
QTest::newRow("Mingw 1 (32bit)")
1420
1474
<< QString::fromLatin1("i686-w64-mingw32")
1475
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\r\n")
1422
1476
<< (QStringList() << QLatin1String("x86-windows-msys-pe-32bit"));
1423
1477
QTest::newRow("Mingw 2 (64bit)")
1424
1478
<< QString::fromLatin1("i686-w64-mingw32")
1425
<< QByteArray("#define __x86_64 1\r\n")
1479
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\r\n")
1426
1480
<< (QStringList() << QLatin1String("x86-windows-msys-pe-64bit")
1427
1481
<< QLatin1String("x86-windows-msys-pe-32bit"));
1428
1482
QTest::newRow("Mingw 3 (32 bit)")
1429
1483
<< QString::fromLatin1("mingw32")
1484
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\r\n")
1431
1485
<< (QStringList() << QLatin1String("x86-windows-msys-pe-32bit"));
1432
1486
QTest::newRow("Cross Mingw 1 (64bit)")
1433
1487
<< QString::fromLatin1("amd64-mingw32msvc")
1434
<< QByteArray("#define __x86_64 1\r\n")
1488
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\r\n")
1435
1489
<< (QStringList() << QLatin1String("x86-windows-msys-pe-64bit")
1436
1490
<< QLatin1String("x86-windows-msys-pe-32bit"));
1437
1491
QTest::newRow("Cross Mingw 2 (32bit)")
1438
1492
<< QString::fromLatin1("i586-mingw32msvc")
1493
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\r\n")
1440
1494
<< (QStringList() << QLatin1String("x86-windows-msys-pe-32bit"));
1441
1495
QTest::newRow("Clang 1: windows")
1442
1496
<< QString::fromLatin1("x86_64-pc-win32")
1443
<< QByteArray("#define __x86_64 1\r\n")
1497
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\r\n")
1444
1498
<< (QStringList() << QLatin1String("x86-windows-msys-pe-64bit")
1445
1499
<< QLatin1String("x86-windows-msys-pe-32bit"));
1446
1500
QTest::newRow("Clang 1: linux")
1447
1501
<< QString::fromLatin1("x86_64-unknown-linux-gnu")
1448
<< QByteArray("#define __x86_64 1\n")
1502
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1449
1503
<< (QStringList() << QLatin1String("x86-linux-generic-elf-64bit")
1450
1504
<< QLatin1String("x86-linux-generic-elf-32bit"));
1451
1505
QTest::newRow("Mac 1")
1452
1506
<< QString::fromLatin1("i686-apple-darwin10")
1453
<< QByteArray("#define __x86_64 1\n")
1507
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1454
1508
<< (QStringList() << QLatin1String("x86-macos-generic-mach_o-64bit")
1455
<< QLatin1String("x86-macos-generic-mach_o-32bit")
1456
<< QLatin1String("ppc-macos-generic-mach_o-64bit")
1457
<< QLatin1String("ppc-macos-generic-mach_o-32bit"));
1509
<< QLatin1String("x86-macos-generic-mach_o-32bit"));
1458
1510
QTest::newRow("Mac 2")
1459
1511
<< QString::fromLatin1("powerpc-apple-darwin10")
1460
<< QByteArray("#define __x86_64 1\n")
1512
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1461
1513
<< (QStringList() << QLatin1String("ppc-macos-generic-mach_o-64bit")
1462
<< QLatin1String("ppc-macos-generic-mach_o-32bit")
1463
<< QLatin1String("x86-macos-generic-mach_o-64bit")
1464
<< QLatin1String("x86-macos-generic-mach_o-32bit"));
1514
<< QLatin1String("ppc-macos-generic-mach_o-32bit"));
1465
1515
QTest::newRow("Mac 3")
1466
1516
<< QString::fromLatin1("i686-apple-darwin9")
1467
<< QByteArray("#define __x86_64 1\n")
1517
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1468
1518
<< (QStringList() << QLatin1String("x86-macos-generic-mach_o-32bit")
1469
<< QLatin1String("x86-macos-generic-mach_o-64bit")
1470
<< QLatin1String("ppc-macos-generic-mach_o-32bit")
1471
<< QLatin1String("ppc-macos-generic-mach_o-64bit"));
1519
<< QLatin1String("x86-macos-generic-mach_o-64bit"));
1472
1520
QTest::newRow("Mac IOS")
1473
1521
<< QString::fromLatin1("arm-apple-darwin9")
1475
<< (QStringList() << QLatin1String("arm-macos-generic-mach_o-32bit"));
1522
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1523
<< (QStringList() << QLatin1String("arm-macos-generic-mach_o-32bit")
1524
<< QLatin1String("arm-macos-generic-mach_o-64bit"));
1476
1525
QTest::newRow("Intel 1")
1477
1526
<< QString::fromLatin1("86_64 x86_64 GNU/Linux")
1478
<< QByteArray("#define __x86_64 1\n")
1527
<< QByteArray("#define __SIZEOF_SIZE_T__ 8\n")
1479
1528
<< (QStringList() << QLatin1String("x86-linux-generic-elf-64bit")
1480
1529
<< QLatin1String("x86-linux-generic-elf-32bit"));
1481
1530
QTest::newRow("FreeBSD 1")
1482
1531
<< QString::fromLatin1("i386-portbld-freebsd9.0")
1532
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1484
1533
<< (QStringList() << QLatin1String("x86-bsd-freebsd-elf-32bit"));
1485
1534
QTest::newRow("FreeBSD 2")
1486
1535
<< QString::fromLatin1("i386-undermydesk-freebsd")
1536
<< QByteArray("#define __SIZEOF_SIZE_T__ 4\n")
1488
1537
<< (QStringList() << QLatin1String("x86-bsd-freebsd-elf-32bit"));