cosmopolitan/libc/dce.h
Justine Tunney f4f4caab0e Add x86_64-linux-gnu emulator
I wanted a tiny scriptable meltdown proof way to run userspace programs
and visualize how program execution impacts memory. It helps to explain
how things like Actually Portable Executable works. It can show you how
the GCC generated code is going about manipulating matrices and more. I
didn't feel fully comfortable with Qemu and Bochs because I'm not smart
enough to understand them. I wanted something like gVisor but with much
stronger levels of assurances. I wanted a single binary that'll run, on
all major operating systems with an embedded GPL barrier ZIP filesystem
that is tiny enough to transpile to JavaScript and run in browsers too.

https://justine.storage.googleapis.com/emulator625.mp4
2020-08-25 04:43:42 -07:00

123 lines
3.7 KiB
C

#ifndef COSMOPOLITAN_LIBC_DCE_H_
#define COSMOPOLITAN_LIBC_DCE_H_
#include "libc/nexgen32e/kcpuids.h"
/*─────────────────────────────────────────────────────────────────────────────╗
│ cosmopolitan § autotune » dead code elimination │
╚─────────────────────────────────────────────────────────────────────────────*/
/**
* Supported Platforms Tuning Knob (Runtime & Compile-Time)
*
* Cosmopolitan's design allows us to support eight platforms. We enable
* them all by default, since we're able to do eight so efficiently. We
* can't do more, due to the way the 80x86 instruction set is encoded.
*
* The user may optionally tune this bitmask, which effectively asks the
* compiler to leave out system call polyfills for a platform, which may
* offer marginal improvements in terms of code size and performance, at
* the cost of portability.
*/
#define HOSTOS (hostos & SUPPORT_VECTOR)
#ifndef SUPPORT_VECTOR
#define SUPPORT_VECTOR 0b11111111
#endif
#define LINUX 1
#define METAL 2
#define WINDOWS 4
#define XNU 8
#define OPENBSD 16 /* 2019-12-11: new openbsd drm might thwart syscall */
#define FREEBSD 32
/* #define YOUR_CLOUD_PLATFORM_HERE 64 /\* jtunney@gmail.com *\/ */
/* #define YOUR_CLOUD_PLATFORM_HERE 128 /\* jtunney@gmail.com *\/ */
#ifdef NDEBUG
#define NoDebug() 1
#else
#define NoDebug() 0
#endif
#ifdef MODE_DBG
#define IsModeDbg() 1
#else
#define IsModeDbg() 0
#endif
#ifdef __MFENTRY__
#define HaveFentry() 1
#else
#define HaveFentry() 0
#endif
#ifdef TRUSTWORTHY
#define IsTrustworthy() 1
#else
#define IsTrustworthy() 0
#endif
#ifdef SECURITY_BLANKETS
#define UseSecurityBlankets() 1
#else
#define UseSecurityBlankets() 0
#endif
#ifdef __MGENERAL_REGS_ONLY__
#define UseGeneralRegsOnly() 1
#else
#define UseGeneralRegsOnly() 0
#endif
#ifdef TINY
#define IsTiny() 1
#else
#define IsTiny() 0
#endif
#ifdef __OPTIMIZE__
#define IsOptimized() 1
#else
#define IsOptimized() 0
#endif
#if defined(__PIE__) || defined(__PIC__)
#define IsPositionIndependent() 1
#else
#define IsPositionIndependent() 0
#endif
#define SupportsLinux() ((SUPPORT_VECTOR & LINUX) == LINUX)
#define SupportsMetal() ((SUPPORT_VECTOR & METAL) == METAL)
#define SupportsWindows() ((SUPPORT_VECTOR & WINDOWS) == WINDOWS)
#define SupportsXnu() ((SUPPORT_VECTOR & XNU) == XNU)
#define SupportsFreebsd() ((SUPPORT_VECTOR & FREEBSD) == FREEBSD)
#define SupportsOpenbsd() ((SUPPORT_VECTOR & OPENBSD) == OPENBSD)
#define SupportsSystemv() \
((SUPPORT_VECTOR & (LINUX | METAL | XNU | OPENBSD | FREEBSD)) != 0)
#ifndef __ASSEMBLER__
#define IsLinux() ((HOSTOS & LINUX) == LINUX)
#define IsMetal() ((HOSTOS & METAL) == METAL)
#define IsWindows() ((HOSTOS & WINDOWS) == WINDOWS)
#define IsBsd() ((HOSTOS & (XNU | FREEBSD | OPENBSD)) != 0)
#define IsXnu() ((HOSTOS & XNU) == XNU)
#define IsFreebsd() ((HOSTOS & FREEBSD) == FREEBSD)
#define IsOpenbsd() ((HOSTOS & OPENBSD) == OPENBSD)
#else
/* clang-format off */
#define IsLinux() $LINUX,hostos(%rip)
#define IsMetal() $METAL,hostos(%rip)
#define IsWindows() $WINDOWS,hostos(%rip)
#define IsBsd() $XNU|FREEBSD|OPENBSD,hostos(%rip)
#define IsXnu() $XNU,hostos(%rip)
#define IsFreebsd() $FREEBSD,hostos(%rip)
#define IsOpenbsd() $OPENBSD,hostos(%rip)
/* clang-format on */
#endif
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
extern const int hostos;
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_DCE_H_ */