mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-27 14:58:30 +00:00
finish intellisense support and sync with upstream
This commit is contained in:
commit
ec9bfd8c56
221 changed files with 2360 additions and 1439 deletions
|
@ -245,6 +245,10 @@ static long rombase;
|
|||
static long codesize;
|
||||
static int64_t opstart;
|
||||
static int64_t mapsstart;
|
||||
static uint64_t readaddr;
|
||||
static uint64_t readsize;
|
||||
static uint64_t writeaddr;
|
||||
static uint64_t writesize;
|
||||
static int64_t framesstart;
|
||||
static int64_t breakpointsstart;
|
||||
static uint64_t last_opcount;
|
||||
|
@ -424,6 +428,10 @@ static void OnSigBusted(void) {
|
|||
longjmp(onbusted, 1);
|
||||
}
|
||||
|
||||
static bool IsShadow(int64_t v) {
|
||||
return 0x7fff8000 <= v && v < 0x100080000000;
|
||||
}
|
||||
|
||||
static int VirtualBing(int64_t v) {
|
||||
int rc;
|
||||
uint8_t *p;
|
||||
|
@ -446,7 +454,7 @@ static int VirtualShadow(int64_t v) {
|
|||
int rc;
|
||||
char *p;
|
||||
jmp_buf busted;
|
||||
if (0x7fff8000 <= v && v < 0x100080000000) return -2;
|
||||
if (IsShadow(v)) return -2;
|
||||
onbusted = busted;
|
||||
if ((p = FindReal(m, (v >> 3) + 0x7fff8000))) {
|
||||
if (!setjmp(busted)) {
|
||||
|
@ -1171,11 +1179,12 @@ static void DrawSse(struct Panel *p) {
|
|||
}
|
||||
|
||||
static void ScrollMemoryView(struct Panel *p, struct MemoryView *v, int64_t a) {
|
||||
long i, n;
|
||||
long i, n, w;
|
||||
w = DUMPWIDTH * (1ull << v->zoom);
|
||||
n = p->bottom - p->top;
|
||||
i = a / (DUMPWIDTH * (1ull << v->zoom));
|
||||
i = a / w;
|
||||
if (!(v->start <= i && i < v->start + n)) {
|
||||
v->start = i;
|
||||
v->start = i - n / 4;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1194,8 +1203,8 @@ static void ZoomMemoryView(struct MemoryView *v, long y, long x, int dy) {
|
|||
|
||||
static void ScrollMemoryViews(void) {
|
||||
ScrollMemoryView(&pan.code, &codeview, GetIp());
|
||||
ScrollMemoryView(&pan.readdata, &readview, m->readaddr);
|
||||
ScrollMemoryView(&pan.writedata, &writeview, m->writeaddr);
|
||||
ScrollMemoryView(&pan.readdata, &readview, readaddr);
|
||||
ScrollMemoryView(&pan.writedata, &writeview, writeaddr);
|
||||
ScrollMemoryView(&pan.stack, &stackview, GetSp());
|
||||
}
|
||||
|
||||
|
@ -1299,9 +1308,9 @@ static void DrawMemoryUnzoomed(struct Panel *p, struct MemoryView *view,
|
|||
if (sc > 7) {
|
||||
x = 129; /* PURPLE: shadow corruption */
|
||||
} else if (sc == kAsanHeapFree) {
|
||||
x = 17; /* NAVYBLUE: heap freed */
|
||||
x = 20; /* BLUE: heap freed */
|
||||
} else if (sc == kAsanRelocated) {
|
||||
x = 18; /* DARKBLUE: heap relocated */
|
||||
x = 16; /* BLACK: heap relocated */
|
||||
} else if (sc == kAsanHeapUnderrun || sc == kAsanAllocaUnderrun) {
|
||||
x = 53; /* RED+PURPLETINGE: heap underrun */
|
||||
} else if (sc == kAsanHeapOverrun || sc == kAsanAllocaOverrun) {
|
||||
|
@ -1309,7 +1318,7 @@ static void DrawMemoryUnzoomed(struct Panel *p, struct MemoryView *view,
|
|||
} else if (sc < 0) {
|
||||
x = 52; /* RED: uncategorized invalid */
|
||||
} else if (sc > 0 && (k & 7) >= sc) {
|
||||
x = 54; /* REDPURP: invalid address (skew) */
|
||||
x = 88; /* BRIGHTRED: invalid address (skew) */
|
||||
} else if (!sc || (sc > 0 && (k & 7) < sc)) {
|
||||
x = 22; /* GREEN: valid address */
|
||||
} else {
|
||||
|
@ -1529,6 +1538,14 @@ static void PreventBufferbloat(void) {
|
|||
|
||||
static void Redraw(void) {
|
||||
int i, j;
|
||||
if (!IsShadow(m->readaddr) && !IsShadow(m->readaddr + m->readsize)) {
|
||||
readaddr = m->readaddr;
|
||||
readsize = m->readsize;
|
||||
}
|
||||
if (!IsShadow(m->writeaddr) && !IsShadow(m->writeaddr + m->writesize)) {
|
||||
writeaddr = m->writeaddr;
|
||||
writesize = m->writesize;
|
||||
}
|
||||
ScrollOp(&pan.disassembly, GetDisIndex());
|
||||
if (last_opcount) {
|
||||
ips = unsignedsubtract(opcount, last_opcount) / (nowl() - last_seconds);
|
||||
|
@ -1555,9 +1572,8 @@ static void Redraw(void) {
|
|||
DrawFrames(&pan.frames);
|
||||
DrawBreakpoints(&pan.breakpoints);
|
||||
DrawMemory(&pan.code, &codeview, GetIp(), GetIp() + m->xedd->length);
|
||||
DrawMemory(&pan.readdata, &readview, m->readaddr, m->readaddr + m->readsize);
|
||||
DrawMemory(&pan.writedata, &writeview, m->writeaddr,
|
||||
m->writeaddr + m->writesize);
|
||||
DrawMemory(&pan.readdata, &readview, readaddr, readaddr + readsize);
|
||||
DrawMemory(&pan.writedata, &writeview, writeaddr, writeaddr + writesize);
|
||||
DrawMemory(&pan.stack, &stackview, GetSp(), GetSp() + GetPointerWidth());
|
||||
DrawStatus(&pan.status);
|
||||
PreventBufferbloat();
|
||||
|
|
|
@ -28,7 +28,6 @@ TOOL_BUILD_DIRECTDEPS = \
|
|||
LIBC_ALG \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_CALLS_HEFTY \
|
||||
LIBC_DNS \
|
||||
LIBC_ELF \
|
||||
LIBC_FMT \
|
||||
|
|
|
@ -27,7 +27,6 @@ TOOL_BUILD_LIB_A_DIRECTDEPS = \
|
|||
LIBC_ALG \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_CALLS_HEFTY \
|
||||
LIBC_ELF \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
|
|
|
@ -8,6 +8,29 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
struct ElfWriterSyms {
|
||||
size_t i, n;
|
||||
Elf64_Sym *p;
|
||||
};
|
||||
|
||||
enum ElfWriterSymOrder {
|
||||
kElfWriterSymSection,
|
||||
kElfWriterSymLocal,
|
||||
kElfWriterSymGlobal
|
||||
};
|
||||
|
||||
struct ElfWriterSymRef {
|
||||
int slg;
|
||||
uint32_t sym;
|
||||
};
|
||||
|
||||
struct ElfWriterRela {
|
||||
uint64_t offset;
|
||||
struct ElfWriterSymRef symkey;
|
||||
uint32_t type;
|
||||
int64_t addend;
|
||||
};
|
||||
|
||||
struct ElfWriter {
|
||||
char *path;
|
||||
char *tmppath;
|
||||
|
@ -22,25 +45,10 @@ struct ElfWriter {
|
|||
size_t i, n;
|
||||
Elf64_Shdr *p;
|
||||
} shdrs[1];
|
||||
struct ElfWriterSyms {
|
||||
size_t i, n;
|
||||
Elf64_Sym *p;
|
||||
} syms[3][1];
|
||||
struct ElfWriterSyms syms[3][1];
|
||||
struct {
|
||||
size_t i, j, n;
|
||||
struct ElfWriterRela {
|
||||
uint64_t offset;
|
||||
struct ElfWriterSymRef {
|
||||
enum ElfWriterSymOrder {
|
||||
kElfWriterSymSection,
|
||||
kElfWriterSymLocal,
|
||||
kElfWriterSymGlobal
|
||||
} slg;
|
||||
uint32_t sym;
|
||||
} symkey;
|
||||
uint32_t type;
|
||||
int64_t addend;
|
||||
} * p;
|
||||
struct ElfWriterRela * p;
|
||||
} relas[1];
|
||||
struct Interner *strtab;
|
||||
struct Interner *shstrtab;
|
||||
|
|
|
@ -4,21 +4,27 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
struct MachineFdClosed {
|
||||
unsigned fd;
|
||||
struct MachineFdClosed *next;
|
||||
};
|
||||
|
||||
struct MachineFdCb {
|
||||
int (*close)(int);
|
||||
ssize_t (*readv)(int, const struct iovec *, int);
|
||||
ssize_t (*writev)(int, const struct iovec *, int);
|
||||
int (*ioctl)(int, uint64_t, void *);
|
||||
};
|
||||
|
||||
struct MachineFd {
|
||||
int fd;
|
||||
struct MachineFdCb * cb;
|
||||
};
|
||||
|
||||
struct MachineFds {
|
||||
size_t i, n;
|
||||
struct MachineFd {
|
||||
int fd;
|
||||
struct MachineFdCb {
|
||||
int (*close)(int);
|
||||
ssize_t (*readv)(int, const struct iovec *, int);
|
||||
ssize_t (*writev)(int, const struct iovec *, int);
|
||||
int (*ioctl)(int, uint64_t, void *);
|
||||
} * cb;
|
||||
} * p;
|
||||
struct MachineFdClosed {
|
||||
unsigned fd;
|
||||
struct MachineFdClosed *next;
|
||||
} * closed;
|
||||
struct MachineFd * p;
|
||||
struct MachineFdClosed * closed;
|
||||
};
|
||||
|
||||
int MachineFdAdd(struct MachineFds *);
|
||||
|
|
|
@ -3,17 +3,21 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
struct JavadownTag {
|
||||
char *tag;
|
||||
char *text;
|
||||
};
|
||||
|
||||
struct JavadownTags {
|
||||
size_t n;
|
||||
struct JavadownTag * p;
|
||||
};
|
||||
|
||||
struct Javadown {
|
||||
bool isfileoverview;
|
||||
char *title;
|
||||
char *text;
|
||||
struct JavadownTags {
|
||||
size_t n;
|
||||
struct JavadownTag {
|
||||
char *tag;
|
||||
char *text;
|
||||
} * p;
|
||||
} tags;
|
||||
struct JavadownTags tags;
|
||||
};
|
||||
|
||||
struct Javadown *ParseJavadown(const char *, size_t);
|
||||
|
|
|
@ -3,16 +3,18 @@
|
|||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||||
COSMOPOLITAN_C_START_
|
||||
|
||||
struct ObjectArrayParam {
|
||||
size_t len;
|
||||
size_t size;
|
||||
void *pp;
|
||||
};
|
||||
|
||||
struct ObjectParam {
|
||||
size_t size;
|
||||
void *p;
|
||||
uint32_t *magic;
|
||||
int32_t *abi;
|
||||
struct ObjectArrayParam {
|
||||
size_t len;
|
||||
size_t size;
|
||||
void *pp;
|
||||
} * arrays;
|
||||
struct ObjectArrayParam * arrays;
|
||||
};
|
||||
|
||||
void PersistObject(const char *, size_t, const struct ObjectParam *);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/internal.h"
|
||||
#include "libc/calls/ioctl.h"
|
||||
#include "libc/calls/struct/dirent.h"
|
||||
#include "libc/calls/struct/iovec.h"
|
||||
#include "libc/calls/struct/rusage.h"
|
||||
#include "libc/calls/struct/sigaction-linux.internal.h"
|
||||
|
@ -770,6 +771,30 @@ static ssize_t OpRead(struct Machine *m, int fd, int64_t addr, size_t size) {
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int OpGetdents(struct Machine *m, int dirfd, int64_t addr,
|
||||
uint32_t size) {
|
||||
int rc;
|
||||
DIR *dir;
|
||||
struct dirent *ent;
|
||||
if (size < sizeof(struct dirent)) return einval();
|
||||
if (0 <= dirfd && dirfd < m->fds.i) {
|
||||
if ((dir = fdopendir(m->fds.p[dirfd].fd))) {
|
||||
rc = 0;
|
||||
while (rc + sizeof(struct dirent) <= size) {
|
||||
if (!(ent = readdir(dir))) break;
|
||||
VirtualRecvWrite(m, addr + rc, ent, ent->d_reclen);
|
||||
rc += ent->d_reclen;
|
||||
}
|
||||
free(dir);
|
||||
} else {
|
||||
rc = -1;
|
||||
}
|
||||
} else {
|
||||
rc = ebadf();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
static ssize_t OpPread(struct Machine *m, int fd, int64_t addr, size_t size,
|
||||
int64_t offset) {
|
||||
ssize_t rc;
|
||||
|
@ -1011,6 +1036,10 @@ static int OpMkdir(struct Machine *m, int64_t path, int mode) {
|
|||
return mkdir(LoadStr(m, path), mode);
|
||||
}
|
||||
|
||||
static int OpMkdirat(struct Machine *m, int dirfd, int64_t path, int mode) {
|
||||
return mkdirat(XlatAfd(m, dirfd), LoadStr(m, path), mode);
|
||||
}
|
||||
|
||||
static int OpMknod(struct Machine *m, int64_t path, uint32_t mode,
|
||||
uint64_t dev) {
|
||||
return mknod(LoadStr(m, path), mode, dev);
|
||||
|
@ -1024,10 +1053,20 @@ static int OpUnlink(struct Machine *m, int64_t path) {
|
|||
return unlink(LoadStr(m, path));
|
||||
}
|
||||
|
||||
static int OpUnlinkat(struct Machine *m, int dirfd, int64_t path, int flags) {
|
||||
return unlinkat(XlatAfd(m, dirfd), LoadStr(m, path), XlatAtf(flags));
|
||||
}
|
||||
|
||||
static int OpRename(struct Machine *m, int64_t src, int64_t dst) {
|
||||
return rename(LoadStr(m, src), LoadStr(m, dst));
|
||||
}
|
||||
|
||||
static int OpRenameat(struct Machine *m, int srcdirfd, int64_t src,
|
||||
int dstdirfd, int64_t dst) {
|
||||
return renameat(XlatAfd(m, srcdirfd), LoadStr(m, src), XlatAfd(m, dstdirfd),
|
||||
LoadStr(m, dst));
|
||||
}
|
||||
|
||||
static int OpTruncate(struct Machine *m, int64_t path, uint64_t length) {
|
||||
return truncate(LoadStr(m, path), length);
|
||||
}
|
||||
|
@ -1381,15 +1420,16 @@ void OpSyscall(struct Machine *m, uint32_t rde) {
|
|||
SYSCALL(0x09E, OpArchPrctl(m, di, si));
|
||||
SYSCALL(0x0BA, OpGetTid(m));
|
||||
SYSCALL(0x0CB, sched_setaffinity(di, si, P(dx)));
|
||||
SYSCALL(0x0D9, OpGetdents(m, di, si, dx));
|
||||
SYSCALL(0x0DD, OpFadvise(m, di, si, dx, r0));
|
||||
SYSCALL(0x0E4, OpClockGettime(m, di, si));
|
||||
SYSCALL(0x101, OpOpenat(m, di, si, dx, r0));
|
||||
SYSCALL(0x102, mkdirat(XlatAfd(m, di), P(si), dx));
|
||||
SYSCALL(0x102, OpMkdirat(m, di, si, dx));
|
||||
SYSCALL(0x104, fchownat(XlatAfd(m, di), P(si), dx, r0, XlatAtf(r8)));
|
||||
SYSCALL(0x105, futimesat(XlatAfd(m, di), P(si), P(dx)));
|
||||
SYSCALL(0x106, OpFstatat(m, di, si, dx, r0));
|
||||
SYSCALL(0x107, unlinkat(XlatAfd(m, di), P(si), XlatAtf(dx)));
|
||||
SYSCALL(0x108, renameat(XlatAfd(m, di), P(si), XlatAfd(m, dx), P(r0)));
|
||||
SYSCALL(0x107, OpUnlinkat(m, di, si, dx));
|
||||
SYSCALL(0x108, OpRenameat(m, di, si, dx, r0));
|
||||
SYSCALL(0x10D, OpFaccessat(m, di, si, dx, r0));
|
||||
SYSCALL(0x113, splice(di, P(si), dx, P(r0), r8, XlatAtf(r9)));
|
||||
SYSCALL(0x115, sync_file_range(di, si, dx, XlatAtf(r0)));
|
||||
|
|
|
@ -259,6 +259,8 @@
|
|||
"__builtin_lrintf"
|
||||
"__builtin_lrintl"
|
||||
"__builtin_memcpy"
|
||||
"__builtin_mempcpy"
|
||||
"__builtin_memmove"
|
||||
"__builtin_memcmp"
|
||||
"__builtin_memset"
|
||||
"__builtin_strlen"))
|
||||
|
|
|
@ -176,6 +176,7 @@
|
|||
"interruptfn"
|
||||
"nocallback"
|
||||
"textstartup"
|
||||
"textsyscall"
|
||||
"warnifused"
|
||||
"attributeallocsize"
|
||||
"attributeallocalign"
|
||||
|
|
|
@ -441,7 +441,7 @@
|
|||
(cond ((not (eq 0 (logand 8 arg)))
|
||||
(cosmo--assembly (setq arg (logand (lognot 8)))
|
||||
"SILENT=0 OVERRIDE_COPTS='-fverbose-asm -fsanitize=address'"))
|
||||
(t (cosmo--assembly arg "SILENT=0 OVERRIDE_COPTS='-fverbose-asm -fsanitize=address' CPPFLAGS='-DSTACK_FRAME_UNLIMITED'"))))
|
||||
(t (cosmo--assembly arg "SILENT=0 OVERRIDE_COPTS='' CPPFLAGS='-DSTACK_FRAME_UNLIMITED'"))))
|
||||
|
||||
(defun cosmo-assembly-native (arg)
|
||||
(interactive "P")
|
||||
|
|
|
@ -22,7 +22,6 @@ TOOL_NET_DIRECTDEPS = \
|
|||
LIBC_ALG \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_CALLS_HEFTY \
|
||||
LIBC_DNS \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
|
|
|
@ -80,7 +80,7 @@ const struct IdName kNtStartfFlagNames[] = {
|
|||
{0, 0},
|
||||
};
|
||||
|
||||
void PrintStartupInfo(void) {
|
||||
noasan void PrintStartupInfo(void) {
|
||||
printf("\n\
|
||||
╔──────────────────────────────────────────────────────────────────────────────╗\n\
|
||||
│ new technology § startup info │\n\
|
||||
|
@ -155,7 +155,7 @@ void PrintStdioInfo(void) {
|
|||
ft2str(GetFileType(g_fds.p[2].handle)));
|
||||
}
|
||||
|
||||
void PrintTeb(void) {
|
||||
noasan void PrintTeb(void) {
|
||||
GetCurrentProcessId();
|
||||
SetLastError(0x1234);
|
||||
printf("\n\
|
||||
|
|
|
@ -1473,8 +1473,8 @@ int main(int argc, char *argv[]) {
|
|||
if (!tuned_) PickDefaults();
|
||||
if (optind == argc) PrintUsage(EX_USAGE, stderr);
|
||||
patharg_ = argv[optind];
|
||||
sox_ = commandvenv("SOX", "sox");
|
||||
ffplay_ = commandvenv("FFPLAY", "ffplay");
|
||||
sox_ = strdup(commandvenv("SOX", "sox"));
|
||||
ffplay_ = strdup(commandvenv("FFPLAY", "ffplay"));
|
||||
infd_ = STDIN_FILENO;
|
||||
outfd_ = STDOUT_FILENO;
|
||||
if (!setjmp(jb_)) {
|
||||
|
|
|
@ -22,7 +22,6 @@ TOOL_VIZ_DIRECTDEPS = \
|
|||
DSP_TTY \
|
||||
LIBC_BITS \
|
||||
LIBC_CALLS \
|
||||
LIBC_CALLS_HEFTY \
|
||||
LIBC_DNS \
|
||||
LIBC_FMT \
|
||||
LIBC_INTRIN \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue