mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-26 20:40:28 +00:00
parent
a988896048
commit
f317a47cd8
15 changed files with 315 additions and 253 deletions
2
third_party/chibicc/asm.c
vendored
2
third_party/chibicc/asm.c
vendored
|
@ -285,7 +285,7 @@ static void CouldNotAllocateRegister(AsmOperand *op, const char *kind) {
|
|||
|
||||
static void PickAsmRegisters(Asm *a) {
|
||||
int i, j, m, pick, regset, xmmset, x87sts;
|
||||
regset = 0b1111111111000111; // exclude bx,sp,bp
|
||||
regset = 0b1111111111001111; // exclude bx,sp,bp
|
||||
xmmset = 0b1111111111111111;
|
||||
x87sts = 0b0000000011111111;
|
||||
regset ^= regset & a->regclob; // don't allocate from clobber list
|
||||
|
|
21
third_party/chibicc/chibicc.c
vendored
21
third_party/chibicc/chibicc.c
vendored
|
@ -1,6 +1,7 @@
|
|||
#include "libc/calls/calls.h"
|
||||
#include "libc/calls/struct/siginfo.h"
|
||||
#include "libc/calls/ucontext.h"
|
||||
#include "libc/intrin/kprintf.h"
|
||||
#include "libc/runtime/gc.internal.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/x/x.h"
|
||||
|
@ -264,9 +265,9 @@ static void parse_args(int argc, char **argv) {
|
|||
} else if (!strncmp(argv[i], "-x", 2)) {
|
||||
opt_x = parse_opt_x(argv[i] + 2);
|
||||
} else if (startswith(argv[i], "-Wa")) {
|
||||
strarray_push_comma(&as_extra_args, argv[i]);
|
||||
strarray_push_comma(&as_extra_args, argv[i] + 3);
|
||||
} else if (startswith(argv[i], "-Wl")) {
|
||||
strarray_push_comma(&ld_extra_args, argv[i]);
|
||||
strarray_push_comma(&ld_extra_args, argv[i] + 3);
|
||||
} else if (!strcmp(argv[i], "-Xassembler")) {
|
||||
strarray_push(&as_extra_args, argv[++i]);
|
||||
} else if (!strcmp(argv[i], "-Xlinker")) {
|
||||
|
@ -447,8 +448,7 @@ static bool run_subprocess(char **argv) {
|
|||
_Exit(1);
|
||||
}
|
||||
// Wait for the child process to finish.
|
||||
do
|
||||
rc = wait(&ws);
|
||||
do rc = wait(&ws);
|
||||
while (rc == -1 && errno == EINTR);
|
||||
return WIFEXITED(ws) && WEXITSTATUS(ws) == 0;
|
||||
}
|
||||
|
@ -657,27 +657,28 @@ static void run_linker(StringArray *inputs, char *output) {
|
|||
if (!ld || !*ld) ld = "ld";
|
||||
StringArray arr = {0};
|
||||
strarray_push(&arr, ld);
|
||||
strarray_push(&arr, "-o");
|
||||
strarray_push(&arr, output);
|
||||
strarray_push(&arr, "-m");
|
||||
strarray_push(&arr, "elf_x86_64");
|
||||
strarray_push(&arr, "-z");
|
||||
strarray_push(&arr, "max-page-size=0x1000");
|
||||
strarray_push(&arr, "-static");
|
||||
strarray_push(&arr, "-nostdlib");
|
||||
strarray_push(&arr, "--gc-sections");
|
||||
strarray_push(&arr, "--build-id=none");
|
||||
strarray_push(&arr, "--no-dynamic-linker");
|
||||
strarray_push(&arr, xasprintf("-Ttext-segment=%#x", IMAGE_BASE_VIRTUAL));
|
||||
strarray_push(&arr, "-T");
|
||||
strarray_push(&arr, LDS);
|
||||
strarray_push(&arr, APE);
|
||||
strarray_push(&arr, CRT);
|
||||
/* strarray_push(&arr, "-T"); */
|
||||
/* strarray_push(&arr, LDS); */
|
||||
/* strarray_push(&arr, APE); */
|
||||
/* strarray_push(&arr, CRT); */
|
||||
for (int i = 0; i < ld_extra_args.len; i++) {
|
||||
strarray_push(&arr, ld_extra_args.data[i]);
|
||||
}
|
||||
for (int i = 0; i < inputs->len; i++) {
|
||||
strarray_push(&arr, inputs->data[i]);
|
||||
}
|
||||
strarray_push(&arr, "-o");
|
||||
strarray_push(&arr, output);
|
||||
handle_exit(run_subprocess(arr.data));
|
||||
}
|
||||
|
||||
|
|
52
third_party/xed/x86.h
vendored
52
third_party/xed/x86.h
vendored
|
@ -202,31 +202,33 @@ struct XedDecodedInst {
|
|||
struct XedOperands op;
|
||||
};
|
||||
|
||||
forceinline void xed_operands_set_mode(struct XedOperands *p, int mmode) {
|
||||
p->realmode = false;
|
||||
switch (mmode) {
|
||||
default:
|
||||
case XED_MACHINE_MODE_LONG_64:
|
||||
p->mode = XED_MODE_LONG;
|
||||
return;
|
||||
case XED_MACHINE_MODE_LEGACY_32:
|
||||
case XED_MACHINE_MODE_LONG_COMPAT_32:
|
||||
p->mode = XED_MODE_LEGACY;
|
||||
break;
|
||||
case XED_MACHINE_MODE_REAL:
|
||||
p->realmode = true;
|
||||
p->mode = XED_MODE_REAL;
|
||||
break;
|
||||
case XED_MACHINE_MODE_UNREAL:
|
||||
p->realmode = true;
|
||||
p->mode = XED_MODE_LEGACY;
|
||||
break;
|
||||
case XED_MACHINE_MODE_LEGACY_16:
|
||||
case XED_MACHINE_MODE_LONG_COMPAT_16:
|
||||
p->mode = XED_MODE_REAL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#define xed_operands_set_mode(p, machine_mode) \
|
||||
do { \
|
||||
struct XedOperands *__p = p; \
|
||||
__p->realmode = false; \
|
||||
switch (machine_mode) { \
|
||||
default: \
|
||||
case XED_MACHINE_MODE_LONG_64: \
|
||||
__p->mode = XED_MODE_LONG; \
|
||||
break; \
|
||||
case XED_MACHINE_MODE_LEGACY_32: \
|
||||
case XED_MACHINE_MODE_LONG_COMPAT_32: \
|
||||
__p->mode = XED_MODE_LEGACY; \
|
||||
break; \
|
||||
case XED_MACHINE_MODE_REAL: \
|
||||
__p->realmode = true; \
|
||||
__p->mode = XED_MODE_REAL; \
|
||||
break; \
|
||||
case XED_MACHINE_MODE_UNREAL: \
|
||||
__p->realmode = true; \
|
||||
__p->mode = XED_MODE_LEGACY; \
|
||||
break; \
|
||||
case XED_MACHINE_MODE_LEGACY_16: \
|
||||
case XED_MACHINE_MODE_LONG_COMPAT_16: \
|
||||
__p->mode = XED_MODE_REAL; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
extern const char kXedErrorNames[];
|
||||
extern const uint8_t kXedEamode[2][3];
|
||||
|
|
74
third_party/xed/x86isa.h
vendored
74
third_party/xed/x86isa.h
vendored
|
@ -211,42 +211,44 @@ struct XedChipFeatures {
|
|||
uint64_t f[3];
|
||||
};
|
||||
|
||||
forceinline void xed_set_chip_modes(struct XedDecodedInst *d, int chip) {
|
||||
switch (chip) {
|
||||
case XED_CHIP_INVALID:
|
||||
break;
|
||||
case XED_CHIP_I86:
|
||||
case XED_CHIP_I86FP:
|
||||
case XED_CHIP_I186:
|
||||
case XED_CHIP_I186FP:
|
||||
case XED_CHIP_I286REAL:
|
||||
case XED_CHIP_I286:
|
||||
case XED_CHIP_I2186FP:
|
||||
case XED_CHIP_I386REAL:
|
||||
case XED_CHIP_I386:
|
||||
case XED_CHIP_I386FP:
|
||||
case XED_CHIP_I486REAL:
|
||||
case XED_CHIP_I486:
|
||||
case XED_CHIP_QUARK:
|
||||
case XED_CHIP_PENTIUM:
|
||||
case XED_CHIP_PENTIUMREAL:
|
||||
case XED_CHIP_PENTIUMMMX:
|
||||
case XED_CHIP_PENTIUMMMXREAL:
|
||||
d->op.mode_first_prefix = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (chip) {
|
||||
case XED_CHIP_INVALID:
|
||||
case XED_CHIP_ALL:
|
||||
case XED_CHIP_AMD:
|
||||
break;
|
||||
default:
|
||||
d->op.is_intel_specific = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#define xed_set_chip_modes(d, chip) \
|
||||
do { \
|
||||
struct XedDecodedInst *__d = d; \
|
||||
switch (chip) { \
|
||||
case XED_CHIP_INVALID: \
|
||||
break; \
|
||||
case XED_CHIP_I86: \
|
||||
case XED_CHIP_I86FP: \
|
||||
case XED_CHIP_I186: \
|
||||
case XED_CHIP_I186FP: \
|
||||
case XED_CHIP_I286REAL: \
|
||||
case XED_CHIP_I286: \
|
||||
case XED_CHIP_I2186FP: \
|
||||
case XED_CHIP_I386REAL: \
|
||||
case XED_CHIP_I386: \
|
||||
case XED_CHIP_I386FP: \
|
||||
case XED_CHIP_I486REAL: \
|
||||
case XED_CHIP_I486: \
|
||||
case XED_CHIP_QUARK: \
|
||||
case XED_CHIP_PENTIUM: \
|
||||
case XED_CHIP_PENTIUMREAL: \
|
||||
case XED_CHIP_PENTIUMMMX: \
|
||||
case XED_CHIP_PENTIUMMMXREAL: \
|
||||
__d->op.mode_first_prefix = 1; \
|
||||
break; \
|
||||
default: \
|
||||
break; \
|
||||
} \
|
||||
switch (chip) { \
|
||||
case XED_CHIP_INVALID: \
|
||||
case XED_CHIP_ALL: \
|
||||
case XED_CHIP_AMD: \
|
||||
break; \
|
||||
default: \
|
||||
__d->op.is_intel_specific = 1; \
|
||||
break; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
extern const uint64_t kXedChipFeatures[XED_CHIP_LAST][3];
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue