finish intellisense support and sync with upstream

This commit is contained in:
Alexander Nicholi 2021-02-03 13:50:08 -05:00
commit ec9bfd8c56
No known key found for this signature in database
GPG key ID: B75B2EB05540F74C
221 changed files with 2360 additions and 1439 deletions

View file

@ -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();

View file

@ -28,7 +28,6 @@ TOOL_BUILD_DIRECTDEPS = \
LIBC_ALG \
LIBC_BITS \
LIBC_CALLS \
LIBC_CALLS_HEFTY \
LIBC_DNS \
LIBC_ELF \
LIBC_FMT \

View file

@ -27,7 +27,6 @@ TOOL_BUILD_LIB_A_DIRECTDEPS = \
LIBC_ALG \
LIBC_BITS \
LIBC_CALLS \
LIBC_CALLS_HEFTY \
LIBC_ELF \
LIBC_FMT \
LIBC_INTRIN \

View file

@ -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;

View file

@ -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 *);

View file

@ -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);

View file

@ -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 *);

View file

@ -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)));

View file

@ -259,6 +259,8 @@
"__builtin_lrintf"
"__builtin_lrintl"
"__builtin_memcpy"
"__builtin_mempcpy"
"__builtin_memmove"
"__builtin_memcmp"
"__builtin_memset"
"__builtin_strlen"))

View file

@ -176,6 +176,7 @@
"interruptfn"
"nocallback"
"textstartup"
"textsyscall"
"warnifused"
"attributeallocsize"
"attributeallocalign"

View file

@ -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")

View file

@ -22,7 +22,6 @@ TOOL_NET_DIRECTDEPS = \
LIBC_ALG \
LIBC_BITS \
LIBC_CALLS \
LIBC_CALLS_HEFTY \
LIBC_DNS \
LIBC_FMT \
LIBC_INTRIN \

View file

@ -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\

View file

@ -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_)) {

View file

@ -22,7 +22,6 @@ TOOL_VIZ_DIRECTDEPS = \
DSP_TTY \
LIBC_BITS \
LIBC_CALLS \
LIBC_CALLS_HEFTY \
LIBC_DNS \
LIBC_FMT \
LIBC_INTRIN \