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

@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
mode: ["", tiny, rel] mode: ["", tiny, rel, tinylinux, optlinux]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3

View file

@ -275,6 +275,7 @@ SECTIONS {
} }
ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : APE_STACKSIZE; ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : APE_STACKSIZE;
ape_stack_memsz2 = ape_stack_memsz * 2;
_tls_size = _tbss_end - _tdata_start; _tls_size = _tbss_end - _tdata_start;
_tdata_size = _tdata_end - _tdata_start; _tdata_size = _tdata_end - _tdata_start;
_tbss_size = _tbss_end - _tbss_start; _tbss_size = _tbss_end - _tbss_start;

View file

@ -794,7 +794,7 @@ ape_loader_end:
.stub ape_stack_vaddr,quad // is mmap()'d with MAP_FIXED .stub ape_stack_vaddr,quad // is mmap()'d with MAP_FIXED
.stub ape_stack_paddr,quad // ignored .stub ape_stack_paddr,quad // ignored
.stub ape_stack_filesz,quad // ignored .stub ape_stack_filesz,quad // ignored
.stub ape_stack_memsz,quad // is mmap(size) argument .stub ape_stack_memsz2,quad // is mmap(size) argument
.stub ape_stack_align,quad // must be 16+ .stub ape_stack_align,quad // must be 16+
#if SupportsOpenbsd() || SupportsNetbsd() #if SupportsOpenbsd() || SupportsNetbsd()
@ -1718,7 +1718,7 @@ ape_grub_entry:
αcτµαlly pδrταblε εxεcµταblε § cosmopolitan libc runtime runtime αcτµαlly pδrταblε εxεcµταblε § cosmopolitan libc runtime runtime
*/ */
kernel: movabs $ape_stack_vaddr,%rsp kernel: movabs $ape_stack_vaddr,%rsp
add $ape_stack_memsz,%rsp add $ape_stack_memsz2,%rsp
movl $0,0x7b000 // unmap null 2mb movl $0,0x7b000 // unmap null 2mb
#if USE_SYMBOL_HACK #if USE_SYMBOL_HACK
.byte 0x0f,0x1f,0207 // nop rdi binbase .byte 0x0f,0x1f,0207 // nop rdi binbase

View file

@ -317,7 +317,6 @@ SECTIONS {
__privileged_start = .; __privileged_start = .;
*(.privileged) *(.privileged)
__privileged_end = .; __privileged_end = .;
. += . > 0 ? CODE_GRANULE : 0;
KEEP(*(.ape.pad.text)) KEEP(*(.ape.pad.text))
. = ALIGN(CONSTANT(COMMONPAGESIZE)); . = ALIGN(CONSTANT(COMMONPAGESIZE));
@ -344,9 +343,11 @@ SECTIONS {
/*BEGIN: read-only data that's only needed for initialization */ /*BEGIN: read-only data that's only needed for initialization */
#if SupportsWindows()
/* Windows DLL Import Directory */ /* Windows DLL Import Directory */
KEEP(*(.idata.ro)); KEEP(*(.idata.ro));
KEEP(*(SORT_BY_NAME(.idata.ro.*))) KEEP(*(SORT_BY_NAME(.idata.ro.*)))
#endif
. = ALIGN(__SIZEOF_POINTER__); . = ALIGN(__SIZEOF_POINTER__);
__init_array_start = .; __init_array_start = .;
@ -405,7 +406,9 @@ SECTIONS {
.data . : { .data . : {
/*BEGIN: Read/Write Data */ /*BEGIN: Read/Write Data */
#if SupportsWindows()
KEEP(*(SORT_BY_NAME(.piro.data.sort.iat.*))) KEEP(*(SORT_BY_NAME(.piro.data.sort.iat.*)))
#endif
/*BEGIN: NT FORK COPYING */ /*BEGIN: NT FORK COPYING */
KEEP(*(.dataprologue)) KEEP(*(.dataprologue))
*(.data .data.*) *(.data .data.*)
@ -517,6 +520,11 @@ SECTIONS {
} }
/DISCARD/ : { /DISCARD/ : {
#if !SupportsWindows()
*(.idata.ro);
*(.idata.ro.*)
*(.piro.data.sort.iat.*)
#endif
*(__patchable_function_entries) *(__patchable_function_entries)
*(__mcount_loc) *(__mcount_loc)
*(.discard) *(.discard)
@ -569,6 +577,7 @@ ape_stack_vaddr = DEFINED(ape_stack_vaddr) ? ape_stack_vaddr : 0x700000000000;
ape_stack_paddr = ape_ram_paddr + ape_ram_filesz; ape_stack_paddr = ape_ram_paddr + ape_ram_filesz;
ape_stack_filesz = 0; ape_stack_filesz = 0;
ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : APE_STACKSIZE; ape_stack_memsz = DEFINED(ape_stack_memsz) ? ape_stack_memsz : APE_STACKSIZE;
ape_stack_memsz2 = ape_stack_memsz * 2;
ape_stack_align = 16; ape_stack_align = 16;
ape_note_offset = ape_cod_offset + (ape_note - ape_cod_vaddr); ape_note_offset = ape_cod_offset + (ape_note - ape_cod_vaddr);

Binary file not shown.

View file

@ -76,12 +76,13 @@ endif
ifeq ($(MODE), opt) ifeq ($(MODE), opt)
ENABLE_FTRACE = 1 ENABLE_FTRACE = 1
CONFIG_OFLAGS ?= -g CONFIG_OFLAGS ?= -g
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -msse2avx -Wa,-msse2avx CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG
CONFIG_CCFLAGS += $(BACKTRACES) -O3 -fmerge-all-constants CONFIG_CCFLAGS += $(BACKTRACES) -O3 -fmerge-all-constants
TARGET_ARCH ?= -march=skylake TARGET_ARCH ?= -march=native
endif endif
# Optimized Linux Mode # Optimized Linux Mode
# The Fastest Mode of All
# #
# - `make MODE=optlinux` # - `make MODE=optlinux`
# - Turns on red zone # - Turns on red zone
@ -91,8 +92,9 @@ endif
# - Turns off support for other operating systems # - Turns off support for other operating systems
# #
ifeq ($(MODE), optlinux) ifeq ($(MODE), optlinux)
ENABLE_FTRACE = 1
CONFIG_OFLAGS ?= -g CONFIG_OFLAGS ?= -g
CONFIG_CPPFLAGS += -DNDEBUG -msse2avx -Wa,-msse2avx -DSUPPORT_VECTOR=1 CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -DSUPPORT_VECTOR=1
CONFIG_CCFLAGS += -O3 -fmerge-all-constants CONFIG_CCFLAGS += -O3 -fmerge-all-constants
CONFIG_COPTS += -mred-zone CONFIG_COPTS += -mred-zone
TARGET_ARCH ?= -march=native TARGET_ARCH ?= -march=native
@ -114,7 +116,7 @@ endif
# - CHECK_xx() won't leak strings into binary # - CHECK_xx() won't leak strings into binary
# #
ifeq ($(MODE), rel) ifeq ($(MODE), rel)
CONFIG_CPPFLAGS += -DNDEBUG CONFIG_CPPFLAGS += -DNDEBUG -DDWARFLESS
CONFIG_CCFLAGS += $(BACKTRACES) -O2 CONFIG_CCFLAGS += $(BACKTRACES) -O2
TARGET_ARCH ?= -msse3 TARGET_ARCH ?= -msse3
PYFLAGS += -O1 PYFLAGS += -O1

View file

@ -55,8 +55,10 @@ static errno_t sys_clock_nanosleep(int clock, int flags,
rc = sys_clock_nanosleep_xnu(clock, flags, req, rem); rc = sys_clock_nanosleep_xnu(clock, flags, req, rem);
} else if (IsOpenbsd()) { } else if (IsOpenbsd()) {
rc = sys_clock_nanosleep_openbsd(clock, flags, req, rem); rc = sys_clock_nanosleep_openbsd(clock, flags, req, rem);
} else { } else if (IsWindows()) {
rc = sys_clock_nanosleep_nt(clock, flags, req, rem); rc = sys_clock_nanosleep_nt(clock, flags, req, rem);
} else {
rc = enosys();
} }
if (rc == -1) { if (rc == -1) {
rc = errno; rc = errno;

View file

@ -25,6 +25,7 @@
#include "libc/intrin/describeflags.internal.h" #include "libc/intrin/describeflags.internal.h"
#include "libc/intrin/strace.internal.h" #include "libc/intrin/strace.internal.h"
#include "libc/limits.h" #include "libc/limits.h"
#include "libc/sysv/errfuns.h"
/** /**
* Returns nice value of thing. * Returns nice value of thing.
@ -72,8 +73,10 @@ int getpriority(int which, unsigned who) {
errno = rc; errno = rc;
rc = -1; rc = -1;
} }
} else { } else if (IsWindows()) {
rc = sys_getpriority_nt(which, who); rc = sys_getpriority_nt(which, who);
} else {
rc = enosys();
} }
#else #else
rc = sys_getpriority(which, who); rc = sys_getpriority(which, who);

View file

@ -71,14 +71,15 @@ _start:
// align stack to GetStackSize() so GetStackAddr() is fast // align stack to GetStackSize() so GetStackAddr() is fast
.weak ape_stack_memsz .weak ape_stack_memsz
mov $ape_stack_memsz,%r9d mov $ape_stack_memsz,%r9d
mov $ape_stack_align,%r8d mov $16,%r8d
cmp $_HOSTLINUX,%cl test %r9d,%r9d
cmove %r9d,%r8d cmovnz %r9,%r8
neg %r8 neg %r8
and %r8,%rsp and %r8,%rsp
xor %ebp,%ebp xor %ebp,%ebp
// bofram 9f // bofram 9f
#if SupportsWindows()
// make win32 imps noop // make win32 imps noop
.weak ape_idata_iat .weak ape_idata_iat
.weak ape_idata_iatend .weak ape_idata_iatend
@ -88,6 +89,7 @@ _start:
sub %rdi,%rcx sub %rdi,%rcx
shr $3,%ecx shr $3,%ecx
rep stosq rep stosq
#endif
// scan through environment varis // scan through environment varis
// find start of auxiliary values // find start of auxiliary values

View file

@ -9,7 +9,7 @@ COSMOPOLITAN_C_START_
*/ */
#if defined(__GNUC__) && defined(__x86_64__) && defined(__MNO_RED_ZONE__) && \ #if defined(__GNUC__) && defined(__x86_64__) && defined(__MNO_RED_ZONE__) && \
!defined(__STRICT_ANSI__) !defined(__STRICT_ANSI__) && !defined(__cplusplus)
#define errno \ #define errno \
(*({ \ (*({ \
errno_t *_ep; \ errno_t *_ep; \

View file

@ -80,7 +80,7 @@
#define FRAMESIZE 0x10000 #define FRAMESIZE 0x10000
#define PAGESIZE 0x1000 /* i386+ */ #define PAGESIZE 0x1000 /* i386+ */
#else #else
#define APE_STACKSIZE 8388608 /* default 8mb stack */ #define APE_STACKSIZE 4194304 /* default 4mb stack */
#endif #endif
#define APE_PAGESIZE 0x10000 /* i386+ */ #define APE_PAGESIZE 0x10000 /* i386+ */
#define APE_GUARDSIZE 0x4000 /* b/c apple m1 */ #define APE_GUARDSIZE 0x4000 /* b/c apple m1 */

View file

@ -16,6 +16,7 @@
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE. PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "libc/dce.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
#include "libc/str/str.h" #include "libc/str/str.h"
@ -26,5 +27,6 @@
* @return 0 on success, or error code * @return 0 on success, or error code
*/ */
int strerror_r(int err, char *buf, size_t size) { int strerror_r(int err, char *buf, size_t size) {
return strerror_wr(err, GetLastError(), buf, size); int winerr = IsWindows() ? GetLastError() : 0;
return strerror_wr(err, winerr, buf, size);
} }

View file

@ -222,7 +222,9 @@ textstartup void __enable_tls(void) {
#ifdef __x86_64__ #ifdef __x86_64__
// rewrite the executable tls opcodes in memory // rewrite the executable tls opcodes in memory
if (IsWindows() || IsXnu()) {
__morph_tls(); __morph_tls();
}
#endif #endif
// we are now allowed to use tls // we are now allowed to use tls

View file

@ -76,7 +76,7 @@ _init_check_rdi_rsi:
jne 1b jne 1b
3: .endfn _init_check_rdi_rsi 3: .endfn _init_check_rdi_rsi
#endif #endif
_woot: leave leave
#elif defined(__aarch64__) #elif defined(__aarch64__)
ldp x29,x30,[sp],#16 ldp x29,x30,[sp],#16
#endif #endif

View file

@ -45,7 +45,6 @@ privileged void __morph_tls(void) {
// We check `_tls_content` which is generated by the linker script // We check `_tls_content` which is generated by the linker script
// since it lets us determine ahead of time if _Thread_local vars // since it lets us determine ahead of time if _Thread_local vars
// have actually been linked into this program. // have actually been linked into this program.
if (IsWindows() || IsXnu()) {
int n; int n;
uint64_t w; uint64_t w;
sigset_t mask; sigset_t mask;
@ -74,9 +73,9 @@ privileged void __morph_tls(void) {
// that way it'll take 1 ms to morph python.com // that way it'll take 1 ms to morph python.com
while (p + 9 + 16 <= __privileged_start) { while (p + 9 + 16 <= __privileged_start) {
if ((m = __builtin_ia32_pmovmskb128( if ((m = __builtin_ia32_pmovmskb128(
*(xmm_t *)p == (xmm_t){0144, 0144, 0144, 0144, 0144, 0144, *(xmm_t *)p == (xmm_t){0144, 0144, 0144, 0144, 0144, 0144, 0144,
0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144, 0144,
0144, 0144, 0144, 0144}))) { 0144, 0144}))) {
m = __builtin_ctzll(m); m = __builtin_ctzll(m);
p += m; p += m;
break; break;
@ -116,6 +115,5 @@ privileged void __morph_tls(void) {
} }
__morph_end(&mask); __morph_end(&mask);
}
#endif #endif
} }

View file

@ -1410,6 +1410,7 @@ err:
return -1; return -1;
} }
#if SupportsWindows()
textwindows int sys_close_epoll_nt(int fd) { textwindows int sys_close_epoll_nt(int fd) {
struct PortState *port_state; struct PortState *port_state;
struct TsTreeNode *tree_node; struct TsTreeNode *tree_node;
@ -1427,6 +1428,7 @@ err:
err_check_handle(g_fds.p[fd].handle); err_check_handle(g_fds.p[fd].handle);
return -1; return -1;
} }
#endif
/** /**
* Creates new epoll instance. * Creates new epoll instance.

View file

@ -223,7 +223,9 @@ void testlib_runtestcases(testfn_t *start, testfn_t *end, testfn_t warmup) {
if (_weaken(testlib_enable_tmp_setup_teardown)) SetupTmpDir(); if (_weaken(testlib_enable_tmp_setup_teardown)) SetupTmpDir();
if (_weaken(SetUp)) _weaken(SetUp)(); if (_weaken(SetUp)) _weaken(SetUp)();
errno = 0; errno = 0;
if (IsWindows()) {
SetLastError(0); SetLastError(0);
}
if (!IsWindows()) sys_getpid(); if (!IsWindows()) sys_getpid();
if (warmup) warmup(); if (warmup) warmup();
testlib_clearxmmregisters(); testlib_clearxmmregisters();

View file

@ -18,8 +18,10 @@
*/ */
#include "libc/calls/internal.h" #include "libc/calls/internal.h"
#include "libc/calls/syscall_support-nt.internal.h" #include "libc/calls/syscall_support-nt.internal.h"
#include "libc/dce.h"
#include "libc/mem/gc.internal.h" #include "libc/mem/gc.internal.h"
#include "libc/testlib/testlib.h" #include "libc/testlib/testlib.h"
#if SupportsWindows()
char16_t p[PATH_MAX]; char16_t p[PATH_MAX];
@ -48,3 +50,5 @@ TEST(mkntpath, testRemoveDoubleSlash) {
EXPECT_EQ(21, __mkntpath("C:\\Users\\jart\\\\.config", p)); EXPECT_EQ(21, __mkntpath("C:\\Users\\jart\\\\.config", p));
EXPECT_STREQ(u"C:\\Users\\jart\\.config", p); EXPECT_STREQ(u"C:\\Users\\jart\\.config", p);
} }
#endif /* SupportsWindows() */

View file

@ -100,13 +100,14 @@ TEST(pthread_setname_np, GetNameOfOtherThread) {
ASSERT_EQ(0, pthread_create(&id, 0, GetNameOfOtherThreadWorker, 0)); ASSERT_EQ(0, pthread_create(&id, 0, GetNameOfOtherThreadWorker, 0));
while (!atomic_load(&sync1)) pthread_yield(); while (!atomic_load(&sync1)) pthread_yield();
errno_t e = pthread_getname_np(id, me, sizeof(me)); errno_t e = pthread_getname_np(id, me, sizeof(me));
if (IsLinux() && e == ENOENT) return; // bah old kernel if (IsLinux() && e == ENOENT) goto GiveUp; // bah old kernel
if (IsLinux() && e == EACCES) return; // meh landlock if (IsLinux() && e == EACCES) goto GiveUp; // meh landlock
ASSERT_EQ(0, e); ASSERT_EQ(0, e);
EXPECT_STREQ("justine", me); EXPECT_STREQ("justine", me);
ASSERT_EQ(0, pthread_setname_np(id, "tunney")); ASSERT_EQ(0, pthread_setname_np(id, "tunney"));
ASSERT_EQ(0, pthread_getname_np(id, me, sizeof(me))); ASSERT_EQ(0, pthread_getname_np(id, me, sizeof(me)));
EXPECT_STREQ("tunney", me); EXPECT_STREQ("tunney", me);
GiveUp:
atomic_store(&sync2, 1); atomic_store(&sync2, 1);
ASSERT_EQ(0, pthread_join(id, 0)); ASSERT_EQ(0, pthread_join(id, 0));
} }

View file

@ -205,7 +205,7 @@ int LuaUnixSysretErrno(lua_State *L, const char *call, int olderr) {
struct UnixErrno *ep; struct UnixErrno *ep;
int i, unixerr, winerr; int i, unixerr, winerr;
unixerr = errno; unixerr = errno;
winerr = GetLastError(); winerr = IsWindows() ? GetLastError() : 0;
if (!IsTiny() && !(0 < unixerr && unixerr < (!IsWindows() ? 4096 : 65536))) { if (!IsTiny() && !(0 < unixerr && unixerr < (!IsWindows() ? 4096 : 65536))) {
WARNF("errno should not be %d", unixerr); WARNF("errno should not be %d", unixerr);
} }

View file

@ -664,10 +664,7 @@ def commonpath(paths):
try: try:
# GetFinalPathNameByHandle is available starting with Windows 6.0. # GetFinalPathNameByHandle is available starting with Windows 6.0.
# Windows XP and non-Windows OS'es will mock _getfinalpathname. # Windows XP and non-Windows OS'es will mock _getfinalpathname.
if sys.getwindowsversion()[:2] >= (6, 0):
_getfinalpathname = posix._getfinalpathname _getfinalpathname = posix._getfinalpathname
else:
raise ImportError
except (AttributeError, ImportError, OSError): except (AttributeError, ImportError, OSError):
# On Windows XP and earlier, two files are the same if their absolute # On Windows XP and earlier, two files are the same if their absolute
# pathnames are the same. # pathnames are the same.

View file

@ -946,6 +946,10 @@ os__getfinalpathname(PyObject *module, PyObject *arg)
PyObject *return_value = NULL; PyObject *return_value = NULL;
PyObject *path; PyObject *path;
if (!IsWindows()) {
Py_RETURN_NONE;
}
if (!PyArg_Parse(arg, "U:_getfinalpathname", &path)) { if (!PyArg_Parse(arg, "U:_getfinalpathname", &path)) {
goto exit; goto exit;
} }
@ -1037,6 +1041,9 @@ os__getvolumepathname_impl(PyObject *module, PyObject *path);
static PyObject * static PyObject *
os__getvolumepathname(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames) os__getvolumepathname(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{ {
if (!IsWindows()) {
Py_RETURN_NONE;
}
PyObject *return_value = NULL; PyObject *return_value = NULL;
static const char * const _keywords[] = {"path", NULL}; static const char * const _keywords[] = {"path", NULL};
static _PyArg_Parser _parser = {"U:_getvolumepathname", _keywords, 0}; static _PyArg_Parser _parser = {"U:_getvolumepathname", _keywords, 0};

View file

@ -4,6 +4,7 @@
Python 3 Python 3
https://docs.python.org/3/license.html │ https://docs.python.org/3/license.html │
*/ */
#include "libc/dce.h"
#include "libc/errno.h" #include "libc/errno.h"
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nt/enum/formatmessageflags.h" #include "libc/nt/enum/formatmessageflags.h"
@ -11,6 +12,7 @@
#include "libc/nt/memory.h" #include "libc/nt/memory.h"
#include "libc/nt/process.h" #include "libc/nt/process.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
#include "libc/runtime/runtime.h"
#include "libc/x/x.h" #include "libc/x/x.h"
#include "third_party/python/Include/abstract.h" #include "third_party/python/Include/abstract.h"
#include "third_party/python/Include/dictobject.h" #include "third_party/python/Include/dictobject.h"
@ -589,6 +591,10 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObjects(
PyObject *message; PyObject *message;
PyObject *args, *v; PyObject *args, *v;
uint32_t err = (uint32_t)ierr; uint32_t err = (uint32_t)ierr;
if (!IsWindows()) {
PyErr_SetString(PyExc_SystemError, "this is not windows");
return 0;
}
if (err==0) err = GetLastError(); if (err==0) err = GetLastError();
len = FormatMessage( len = FormatMessage(
/* Error API error */ /* Error API error */

View file

@ -1032,6 +1032,11 @@ sys_getwindowsversion(PyObject *self)
void *verblock; void *verblock;
uint32_t verblock_size; uint32_t verblock_size;
if (!IsWindows()) {
PyErr_SetString(PyExc_SystemError, "this is not windows");
return 0;
}
ver.dwOSVersionInfoSize = sizeof(ver); ver.dwOSVersionInfoSize = sizeof(ver);
if (!GetVersionEx(&ver)) if (!GetVersionEx(&ver))
return PyErr_SetFromWindowsErr(0); return PyErr_SetFromWindowsErr(0);

View file

@ -1420,8 +1420,8 @@ static int zipfileGetMode(
** Both (const char*) arguments point to nul-terminated strings. Argument ** Both (const char*) arguments point to nul-terminated strings. Argument
** nB is the value of strlen(zB). This function returns 0 if the strings are ** nB is the value of strlen(zB). This function returns 0 if the strings are
** identical, ignoring any trailing '/' character in either path. */ ** identical, ignoring any trailing '/' character in either path. */
static int zipfileComparePath(const char *zA, const char *zB, int nB){ static int zipfileComparePath(const char *zA, const char *zB, size_t nB){
int nA = (int)strlen(zA); size_t nA = strlen(zA);
if( nA>0 && zA[nA-1]=='/' ) nA--; if( nA>0 && zA[nA-1]=='/' ) nA--;
if( nB>0 && zB[nB-1]=='/' ) nB--; if( nB>0 && zB[nB-1]=='/' ) nB--;
if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0; if( nA==nB && memcmp(zA, zB, nA)==0 ) return 0;

View file

@ -82,10 +82,12 @@ extern "C" {
# define XXH_X86DISPATCH_ALLOW_AVX # define XXH_X86DISPATCH_ALLOW_AVX
#endif #endif
#if 0 /* [jart] be quiet */
#if defined(__AVX__) && !defined(XXH_X86DISPATCH_ALLOW_AVX) #if defined(__AVX__) && !defined(XXH_X86DISPATCH_ALLOW_AVX)
# error "Error: if xxh_x86dispatch.c is compiled with AVX enabled, the resulting binary will crash on sse2-only cpus !! " \ # error "Error: if xxh_x86dispatch.c is compiled with AVX enabled, the resulting binary will crash on sse2-only cpus !! " \
"If you nonetheless want to do that, please enable the XXH_X86DISPATCH_ALLOW_AVX build variable" "If you nonetheless want to do that, please enable the XXH_X86DISPATCH_ALLOW_AVX build variable"
#endif #endif
#endif
#ifdef __has_include #ifdef __has_include
# define XXH_HAS_INCLUDE(header) __has_include(header) # define XXH_HAS_INCLUDE(header) __has_include(header)

View file

@ -232,7 +232,7 @@ void Assimilate(void) {
kprintf("%s: fstat() failed: %m\n", prog); kprintf("%s: fstat() failed: %m\n", prog);
exit(14); exit(14);
} }
if (st.st_size < 8192) { if (st.st_size < 4096) {
kprintf("%s: ape binaries must be at least 4096 bytes\n", prog); kprintf("%s: ape binaries must be at least 4096 bytes\n", prog);
exit(15); exit(15);
} }

View file

@ -48,6 +48,7 @@
#include "libc/mem/mem.h" #include "libc/mem/mem.h"
#include "libc/nexgen32e/kcpuids.h" #include "libc/nexgen32e/kcpuids.h"
#include "libc/nexgen32e/x86feature.h" #include "libc/nexgen32e/x86feature.h"
#include "libc/nexgen32e/x86info.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/stdio/append.h" #include "libc/stdio/append.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
@ -911,10 +912,10 @@ int main(int argc, char *argv[]) {
} }
s = basename(strdup(cmd)); s = basename(strdup(cmd));
if (strstr(s, "gcc")) { if (strstr(s, "gcc") || strstr(s, "g++")) {
iscc = true; iscc = true;
isgcc = true; isgcc = true;
} else if (strstr(s, "clang")) { } else if (strstr(s, "clang") || strstr(s, "clang++")) {
iscc = true; iscc = true;
isclang = true; isclang = true;
} else if (strstr(s, "ld.bfd")) { } else if (strstr(s, "ld.bfd")) {
@ -1027,6 +1028,113 @@ int main(int argc, char *argv[]) {
if (isgcc) { if (isgcc) {
AddArg(argv[i]); 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")) { } else if (!strcmp(argv[i], "-fsanitize=address")) {
if (isgcc && ccversion >= 6) wantasan = true; if (isgcc && ccversion >= 6) wantasan = true;
} else if (!strcmp(argv[i], "-fsanitize=undefined")) { } else if (!strcmp(argv[i], "-fsanitize=undefined")) {

View file

@ -25,7 +25,7 @@
(require 'ld-script) (require 'ld-script)
(require 'make-mode) (require 'make-mode)
(setq cosmo-dbg-mode "zero") (setq cosmo-dbg-mode "dbg")
(setq cosmo-default-mode "") (setq cosmo-default-mode "")
(setq c-doc-comment-style 'javadown) (setq c-doc-comment-style 'javadown)

View file

@ -22,6 +22,8 @@
#include "libc/nt/enum/consolemodeflags.h" #include "libc/nt/enum/consolemodeflags.h"
#include "libc/nt/runtime.h" #include "libc/nt/runtime.h"
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h"
#if defined(__x86_64__) && SupportsWindows()
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
if (!IsWindows()) { if (!IsWindows()) {
@ -40,3 +42,11 @@ int main(int argc, char *argv[]) {
kNtEnableVirtualTerminalProcessing); kNtEnableVirtualTerminalProcessing);
_Exit(0); _Exit(0);
} }
#else
int main(int argc, char *argv[]) {
fprintf(stderr,
"fixconsole not supported on this cpu arch or build config\n");
return 1;
}
#endif /* __x86_64__ && SupportsWindows() */

View file

@ -41,7 +41,7 @@
#include "libc/time/time.h" #include "libc/time/time.h"
#include "tool/decode/lib/flagger.h" #include "tool/decode/lib/flagger.h"
#include "tool/decode/lib/idname.h" #include "tool/decode/lib/idname.h"
#ifdef __x86_64__ #if defined(__x86_64__) && SupportsWindows()
char *GetString(struct NtUnicodeString *s) { char *GetString(struct NtUnicodeString *s) {
static char buf[1024]; static char buf[1024];
@ -538,4 +538,9 @@ int main(int argc, char *argv[]) {
return 0; return 0;
} }
#endif /* __x86_64__ */ #else
int main(int argc, char *argv[]) {
fprintf(stderr, "printpeb not supported on this cpu arch or build config\n");
return 1;
}
#endif /* __x86_64__ && SupportsWindows() */

View file

@ -26,6 +26,7 @@
#include "libc/runtime/runtime.h" #include "libc/runtime/runtime.h"
#include "libc/stdio/stdio.h" #include "libc/stdio/stdio.h"
#include "libc/str/str.h" #include "libc/str/str.h"
#if defined(__x86_64__) && SupportsWindows()
/** /**
* @fileoverview WIN32 Virtual Memory Layout Dump Utility * @fileoverview WIN32 Virtual Memory Layout Dump Utility
@ -73,3 +74,11 @@ int main(int argc, char *argv[]) {
(DescribeNtPageFlags)(b[4], mi.Protect)); (DescribeNtPageFlags)(b[4], mi.Protect));
} }
} }
#else
int main(int argc, char *argv[]) {
fprintf(stderr,
"virtualquery not supported on this cpu arch or build config\n");
return 1;
}
#endif /* __x86_64__ && SupportsWindows() */