Fix breakages in Linux-only build modes

- compile.com now polyfills -march=native which gcc/clang removed
- Guarantee zero Windows code is linked into non-Windows binaries
- MODE=tinylinux binaries are now back to being as tiny as ~4kb
- Improve the runtime's stack allocation / alignment hack
- GitHub Actions now tests Linux modes for assurance
This commit is contained in:
Justine Tunney 2023-07-09 19:47:46 -07:00
parent 0e4c828a8e
commit 3dc86ce154
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
32 changed files with 283 additions and 104 deletions

View file

@ -48,6 +48,7 @@
#include "libc/mem/mem.h"
#include "libc/nexgen32e/kcpuids.h"
#include "libc/nexgen32e/x86feature.h"
#include "libc/nexgen32e/x86info.h"
#include "libc/runtime/runtime.h"
#include "libc/stdio/append.h"
#include "libc/stdio/stdio.h"
@ -911,10 +912,10 @@ int main(int argc, char *argv[]) {
}
s = basename(strdup(cmd));
if (strstr(s, "gcc")) {
if (strstr(s, "gcc") || strstr(s, "g++")) {
iscc = true;
isgcc = true;
} else if (strstr(s, "clang")) {
} else if (strstr(s, "clang") || strstr(s, "clang++")) {
iscc = true;
isclang = true;
} else if (strstr(s, "ld.bfd")) {
@ -1027,6 +1028,113 @@ int main(int argc, char *argv[]) {
if (isgcc) {
AddArg(argv[i]);
}
#ifdef __x86_64__
} else if (!strcmp(argv[i], "-march=native")) {
struct X86ProcessorModel *model;
if (X86_HAVE(ABM)) AddArg("-mabm");
if (X86_HAVE(XOP)) AddArg("-mxop");
if (X86_HAVE(SSE4A)) AddArg("-msse4a");
if (X86_HAVE(SSE3)) AddArg("-msse3");
if (X86_HAVE(SSSE3)) AddArg("-mssse3");
if (X86_HAVE(SSE4_1)) AddArg("-msse4.1");
if (X86_HAVE(SSE4_2)) AddArg("-msse4.2");
if (X86_HAVE(AVX)) AddArg("-mavx");
if (X86_HAVE(AVX2)) {
AddArg("-mavx2");
if (isgcc) {
AddArg("-msse2avx");
AddArg("-Wa,-msse2avx");
}
}
if (X86_HAVE(AVX512F)) AddArg("-mavx512f");
if (X86_HAVE(AVX512PF)) AddArg("-mavx512pf");
if (X86_HAVE(AVX512ER)) AddArg("-mavx512er");
if (X86_HAVE(AVX512CD)) AddArg("-mavx512cd");
if (X86_HAVE(AVX512VL)) AddArg("-mavx512vl");
if (X86_HAVE(AVX512BW)) AddArg("-mavx512bw");
if (X86_HAVE(AVX512DQ)) AddArg("-mavx512dq");
if (X86_HAVE(AVX512IFMA)) AddArg("-mavx512ifma");
if (X86_HAVE(AVX512VBMI)) AddArg("-mavx512vbmi");
if (X86_HAVE(SHA)) AddArg("-msha");
if (X86_HAVE(AES)) AddArg("-maes");
if (X86_HAVE(VAES)) AddArg("-mvaes");
if (X86_HAVE(PCLMUL)) AddArg("-mpclmul");
if (X86_HAVE(FSGSBASE)) AddArg("-mfsgsbase");
if (X86_HAVE(F16C)) AddArg("-mf16c");
if (X86_HAVE(FMA)) AddArg("-mfma");
if (X86_HAVE(POPCNT)) AddArg("-mpopcnt");
if (X86_HAVE(BMI)) AddArg("-mbmi");
if (X86_HAVE(BMI2)) AddArg("-mbmi2");
if (X86_HAVE(ADX)) AddArg("-madx");
if (X86_HAVE(FXSR)) AddArg("-mfxsr");
if ((model = getx86processormodel(kX86ProcessorModelKey))) {
switch (model->march) {
case X86_MARCH_CORE2:
AddArg("-march=core2");
break;
case X86_MARCH_NEHALEM:
AddArg("-march=nehalem");
break;
case X86_MARCH_WESTMERE:
AddArg("-march=westmere");
break;
case X86_MARCH_SANDYBRIDGE:
AddArg("-march=sandybridge");
break;
case X86_MARCH_IVYBRIDGE:
AddArg("-march=ivybridge");
break;
case X86_MARCH_HASWELL:
AddArg("-march=haswell");
break;
case X86_MARCH_BROADWELL:
AddArg("-march=broadwell");
break;
case X86_MARCH_SKYLAKE:
case X86_MARCH_KABYLAKE:
AddArg("-march=skylake");
break;
case X86_MARCH_CANNONLAKE:
AddArg("-march=cannonlake");
break;
case X86_MARCH_ICELAKE:
if (model->grade >= X86_GRADE_SERVER) {
AddArg("-march=icelake-server");
} else {
AddArg("-march=icelake-client");
}
break;
case X86_MARCH_TIGERLAKE:
AddArg("-march=tigerlake");
break;
case X86_MARCH_BONNELL:
case X86_MARCH_SALTWELL:
AddArg("-march=bonnell");
break;
case X86_MARCH_SILVERMONT:
case X86_MARCH_AIRMONT:
AddArg("-march=silvermont");
break;
case X86_MARCH_GOLDMONT:
AddArg("-march=goldmont");
break;
case X86_MARCH_GOLDMONTPLUS:
AddArg("-march=goldmont-plus");
break;
case X86_MARCH_TREMONT:
AddArg("-march=tremont");
break;
case X86_MARCH_KNIGHTSLANDING:
AddArg("-march=knl");
break;
case X86_MARCH_KNIGHTSMILL:
AddArg("-march=knm");
break;
}
}
#endif /* __x86_64__ */
} else if (!strcmp(argv[i], "-fsanitize=address")) {
if (isgcc && ccversion >= 6) wantasan = true;
} else if (!strcmp(argv[i], "-fsanitize=undefined")) {