summaryrefslogtreecommitdiff
path: root/includes/compiler/MachO.h
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2022-12-29 12:32:55 +0000
committerAsh Wolf <ninji@wuffs.org>2022-12-29 12:32:55 +0000
commitfcfbafff31869ed808bff0639532db1828660e92 (patch)
tree7425b346b031c4cb47a06250b3f6f950374d44ae /includes/compiler/MachO.h
parentbc1321735c15104ffad195e1509cab5f3a044260 (diff)
downloadMWCC-fcfbafff31869ed808bff0639532db1828660e92.tar.gz
MWCC-fcfbafff31869ed808bff0639532db1828660e92.zip
dump lots more code
Diffstat (limited to '')
-rw-r--r--includes/compiler/MachO.h280
1 files changed, 280 insertions, 0 deletions
diff --git a/includes/compiler/MachO.h b/includes/compiler/MachO.h
index eb8ad57..9be6c3e 100644
--- a/includes/compiler/MachO.h
+++ b/includes/compiler/MachO.h
@@ -2,5 +2,285 @@
#define COMPILER_MACHO_H
#include "compiler/common.h"
+#include "compiler/CompilerTools.h"
+
+typedef struct MachOReloc MachOReloc;
+typedef struct MachOSection MachOSection;
+typedef struct MachOSegment MachOSegment;
+typedef struct MachOSymbol MachOSymbol;
+typedef struct SymbolData SymbolData;
+
+struct SymbolData {
+ union {
+ char *name;
+ SInt32 strx;
+ } u;
+ UInt8 type;
+ SInt16 desc;
+ UInt32 value;
+ MachOSection *section;
+};
+
+typedef enum RelocType {
+ RT_0,
+ RT_1,
+ RT_2,
+ RT_3,
+ RT_4,
+ RT_5,
+ RT_6,
+ RT_7,
+ RT_8,
+ RT_9
+} RelocType;
+
+typedef struct RelocDataT {
+ RelocType type;
+ UInt8 privFlag;
+ UInt8 x2;
+ UInt8 x3;
+ UInt32 x4;
+ MachOSection *section;
+ UInt32 gapC;
+ MachOSection *sect10;
+ char *name;
+ SInt32 x18;
+} RelocDataT;
+
+#define N_GSYM 0x20
+#define N_FNAME 0x22
+#define N_FUN 0x24
+#define N_STSYM 0x26
+#define N_LCSYM 0x28
+#define N_BNSYM 0x2E
+#define N_OPT 0x3C
+#define N_RSYM 0x40
+#define N_SLINE 0x44
+#define N_ENSYM 0x4E
+#define N_SSYM 0x60
+#define N_SO 0x64
+#define N_OSO 0x66
+#define N_LSYM 0x80
+#define N_BINCL 0x82
+#define N_SOL 0x84
+#define N_PARAMS 0x86
+#define N_VERSION 0x88
+#define N_OLEVEL 0x8A
+#define N_PSYM 0xA0
+#define N_EINCL 0xA2
+#define N_ENTRY 0xA4
+#define N_LBRAC 0xC0
+#define N_EXCL 0xC2
+#define N_RBRAC 0xE0
+#define N_BCOMM 0xE2
+#define N_ECOMM 0xE4
+#define N_ECOML 0xE8
+#define N_LENG 0xFE
+
+#define N_STAB 0xE0
+#define N_PEXT 0x10
+#define N_TYPE 0x0E
+#define N_EXT 0x01
+
+#define N_UNDF 0
+#define N_ABS 2
+#define N_SECT 0xE
+#define N_PBUD 0xC
+#define N_INDR 0xA
+
+// Mach-O header
+struct mach_header {
+ uint32_t magic;
+ SInt32 cputype;
+ SInt32 cpusubtype;
+ uint32_t filetype;
+ uint32_t ncmds;
+ uint32_t sizeofcmds;
+ uint32_t flags;
+};
+
+#define MH_MAGIC 0xfeedface
+#define MH_OBJECT 1
+#define CPU_TYPE_POWERPC 18
+#define CPU_SUBTYPE_MC98000_ALL 0
+
+// load commands
+#define LC_SEGMENT 1
+#define LC_SYMTAB 2
+#define LC_DYSYMTAB 11
+
+// segments
+struct segment_command {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ char segname[16];
+ uint32_t vmaddr;
+ uint32_t vmsize;
+ uint32_t fileoff;
+ uint32_t filesize;
+ SInt32 maxprot;
+ SInt32 initprot;
+ uint32_t nsects;
+ uint32_t flags;
+};
+
+// sections
+struct section {
+ char sectname[16];
+ char segname[16];
+ uint32_t addr;
+ uint32_t size;
+ uint32_t offset;
+ uint32_t align;
+ uint32_t reloff;
+ uint32_t nreloc;
+ uint32_t flags;
+ uint32_t reserved1;
+ uint32_t reserved2;
+};
+
+#define S_REGULAR 0
+#define S_ZEROFILL 1
+#define S_CSTRING_LITERALS 2
+#define S_4BYTE_LITERALS 3
+#define S_8BYTE_LITERALS 4
+#define S_LITERAL_POINTERS 5
+#define S_NON_LAZY_SYMBOL_POINTERS 6
+#define S_LAZY_SYMBOL_POINTERS 7
+#define S_SYMBOL_STUBS 8
+#define S_MOD_INIT_FUNC_POINTERS 9
+#define S_MOD_TERM_FUNC_POINTERS 10
+#define S_COALESCED 11
+#define S_GB_ZEROFILL 12
+#define S_INTERPOSING 13
+#define S_16BYTE_LITERALS 14
+
+#define S_ATTR_PURE_INSTRUCTIONS 0x80000000
+#define S_ATTR_NO_TOC 0x40000000
+#define S_ATTR_STRIP_STATIC_SYMS 0x20000000
+#define S_ATTR_NO_DEAD_STRIP 0x10000000
+#define S_ATTR_LIVE_SUPPORT 0x8000000
+#define S_ATTR_SELF_MODIFYING_CODE 0x4000000
+#define S_ATTR_DBUG 0x2000000
+#define S_ATTR_SOME_INSTRUCTIONS 0x400
+#define S_ATTR_EXT_RELOC 0x200
+#define S_ATTR_LOC_RELOC 0x100
+
+// symbols
+struct symtab_command {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ uint32_t symoff;
+ uint32_t nsyms;
+ uint32_t stroff;
+ uint32_t strsize;
+};
+
+struct dysymtab_command {
+ uint32_t cmd;
+ uint32_t cmdsize;
+ uint32_t ilocalsym;
+ uint32_t nlocalsym;
+ uint32_t iextdefsym;
+ uint32_t nextdefsym;
+ uint32_t iundefsym;
+ uint32_t nundefsym;
+ uint32_t tocoff;
+ uint32_t ntoc;
+ uint32_t modtaboff;
+ uint32_t nmodtab;
+ uint32_t extrefsymoff;
+ uint32_t nextrefsyms;
+ uint32_t indirectsymoff;
+ uint32_t nindirectsyms;
+ uint32_t extreloff;
+ uint32_t nextrel;
+ uint32_t locreloff;
+ uint32_t nlocrel;
+};
+
+struct nlist {
+ int32_t n_strx;
+ uint8_t n_type;
+ uint8_t n_sect;
+ int16_t n_desc;
+ uint32_t n_value;
+};
+
+// relocations
+enum reloc_type_ppc {
+ PPC_RELOC_VANILLA,
+ PPC_RELOC_PAIR,
+ PPC_RELOC_BR14,
+ PPC_RELOC_BR24,
+ PPC_RELOC_HI16,
+ PPC_RELOC_LO16,
+ PPC_RELOC_HA16,
+ PPC_RELOC_LO14,
+ PPC_RELOC_SECTDIFF,
+ PPC_RELOC_PB_LA_PTR,
+ PPC_RELOC_HI16_SECTDIFF,
+ PPC_RELOC_LO16_SECTDIFF,
+ PPC_RELOC_HA16_SECTDIFF,
+ PPC_RELOC_JBSR,
+ PPC_RELOC_LO14_SECTDIFF,
+ PPC_RELOC_LOCAL_SECTDIFF
+};
+
+#define R_SCATTERED 0x80000000
+
+#ifdef __MWERKS__
+#pragma options align=mac68k
+#endif
+struct MachOSection {
+ struct section section;
+ GList glist;
+ MachOReloc *firstReloc;
+ MachOReloc *lastReloc;
+ int x5C;
+ UInt32 num;
+ UInt32 id;
+ MachOSection *next;
+};
+
+struct MachOSegment {
+ struct segment_command cmd;
+ MachOSection *firstSection;
+ MachOSection *lastSection;
+ MachOSegment *next;
+};
+
+struct MachOReloc {
+ char length; // size of the relocation
+ char reltype;
+ char is_extern;
+ char is_pcrel; // was relocated pc relative already
+ UInt32 address; // offset to what is being relocated
+ UInt32 value;
+ MachOReloc *next;
+};
+
+struct MachOSymbol {
+ SymbolData data;
+ UInt32 index;
+ MachOSymbol *next;
+};
+#ifdef __MWERKS__
+#pragma options align=reset
+#endif
+
+extern void MachO_Setup(void);
+extern void MachO_Finish(void);
+extern void MachO_Cleanup(void);
+extern MachOSegment *MachO_CreateSegment(char *segname, int maxprot, int initprot, UInt32 flags);
+extern MachOSection *MachO_CreateSection(MachOSegment *segment, char *segname, char *sectname, UInt32 align, UInt32 flags, UInt32 sectionID);
+extern GList *MachO_GetGList(MachOSection *section);
+extern void MachO_SetSectionSize(void);
+extern void MachO_Relocate(MachOSection *section, UInt32 address, UInt32 value, char length, char is_pcrel, Boolean is_extern, int reltype);
+extern UInt32 MachO_DeclareSymbol(char *name, MachOSection *section, UInt32 value, Boolean isAbsolute, short type, short desc);
+extern void MachO_ReOrderSections(void);
+extern void MachO_AddIndirectSymbol(SInt32 symbol);
+extern UInt32 MachO_NumIndirectSym(void);
+extern SInt32 MachO_OutputStab(SymbolData *data, SInt32 strIndex);
#endif