fix lots more issues, add endian conversions to ObjGenMachO, add 64-bit kludge to Switch.c

This commit is contained in:
Ash Wolf 2023-01-13 01:36:56 +00:00
parent 3a6db389b2
commit 9d985413ce
25 changed files with 362 additions and 249 deletions

View File

@ -4137,7 +4137,6 @@ static void prependif(void) {
} }
static void prepifskip(void) { static void prepifskip(void) {
// this function does something very weird with its code generation that i can't match
TStreamElement ts; TStreamElement ts;
short t; short t;
@ -4146,78 +4145,75 @@ static void prepifskip(void) {
case IfState_1: case IfState_1:
case IfState_3: case IfState_3:
case IfState_4: case IfState_4:
while (1) { restart:
t = prepskipnextchar(); t = prepskipnextchar();
pos = nextcharpos; pos = nextcharpos;
switch (t) { switch (t) {
case 0: case 0:
if (tokenstacklevel > 0) { if (tokenstacklevel > 0) {
poptokenseq(); poptokenseq();
} else if (tokenstacklevel > 0 || pos >= prep_file_end) { } else if (tokenstacklevel > 0 || pos >= prep_file_end) {
if (filesp > 0) { if (filesp > 0) {
popfile(); popfile();
} else {
was_prep_error = 0;
ts.tokenfile = ifstack[iflevel - 1].file;
ts.tokenoffset = ifstack[iflevel - 1].pos;
CError_SetErrorToken(&ts);
CError_ErrorTerm(CErrorStr119);
iflevel = 0;
return;
}
} else { } else {
CPrep_Error(CErrorStr105); was_prep_error = 0;
ts.tokenfile = ifstack[iflevel - 1].file;
ts.tokenoffset = ifstack[iflevel - 1].pos;
CError_SetErrorToken(&ts);
CError_ErrorTerm(CErrorStr119);
iflevel = 0;
return;
} }
continue; } else {
case '\r': CPrep_Error(CErrorStr105);
newline(); }
continue; goto restart;
case '"': case '\r':
skipendoflinematch((StringPtr) pos, '"'); newline();
continue; goto restart;
case '\'': case '"':
skipendoflinematch((StringPtr) pos, '"'); skipendoflinematch((StringPtr) pos, '"');
continue; goto restart;
case '#': case '\'':
t = prepskipnextchar(); skipendoflinematch((StringPtr) pos, '"');
pos = nextcharpos; goto restart;
switch (t) { case '#':
case '\r': t = prepskipnextchar();
continue; pos = nextcharpos;
case 0: switch (t) {
CPrep_Error(CErrorStr102); case '\r':
default: goto restart;
pos = ReadIdentifier(pos - 1); case 0:
if (!strcmp("if", tkidentifier->name)) { CPrep_Error(CErrorStr102);
prepif(); default:
} else if (!strcmp("ifdef", tkidentifier->name)) { pos = ReadIdentifier(pos - 1);
prepifdef(); if (!strcmp("if", tkidentifier->name)) {
} else if (!strcmp("ifndef", tkidentifier->name)) { prepif();
prepifndef(); } else if (!strcmp("ifdef", tkidentifier->name)) {
} else if (!strcmp("elif", tkidentifier->name)) { prepifdef();
prepelif(); } else if (!strcmp("ifndef", tkidentifier->name)) {
} else if (!strcmp("else", tkidentifier->name)) { prepifndef();
prepelse(); } else if (!strcmp("elif", tkidentifier->name)) {
} else if (!strcmp("endif", tkidentifier->name)) { prepelif();
prependif(); } else if (!strcmp("else", tkidentifier->name)) {
} else { prepelse();
skipendofline(); } else if (!strcmp("endif", tkidentifier->name)) {
continue; prependif();
} } else {
} skipendofline();
break; goto restart;
default: }
skipendofline(); }
continue; break;
} default:
break; skipendofline();
goto restart;
} }
break; break;
case IfState_2: case IfState_2:
default: default:
return; return;
} }
return;
} }
} }

View File

@ -53,6 +53,69 @@ unsigned char *CTool_CtoPstr(char *cstr) {
return (unsigned char *) cstr; return (unsigned char *) cstr;
} }
#ifdef CW_64_BIT_SUPPORT
enum { PoolCapacity = 64 };
typedef struct ITPPool {
void *pointers[PoolCapacity];
UInt32 baseIndex;
UInt32 size;
struct ITPPool *next;
} ITPPool;
static ITPPool *poolHead;
static ITPPool *poolTail;
void *CTool_ResolveIndexToPointer(UInt32 index) {
ITPPool *pool = poolHead;
if (index == 0)
return NULL;
while (pool && index >= PoolCapacity) {
pool = pool->next;
index -= PoolCapacity;
}
if (pool && index < pool->size)
return pool->pointers[index];
else
return NULL;
}
UInt32 CTool_CreateIndexFromPointer(void *ptr) {
ITPPool *pool = poolTail;
UInt32 index;
if (ptr == NULL)
return 0;
if (!pool || pool->size >= PoolCapacity) {
pool = lalloc(sizeof(ITPPool));
pool->size = 0;
if (poolTail) {
pool->baseIndex = poolTail->baseIndex + PoolCapacity;
poolTail->next = pool;
} else {
pool->baseIndex = 0;
// always reserve index 0 for NULL
pool->pointers[0] = NULL;
pool->size = 1;
poolHead = pool;
}
poolTail = pool;
}
index = pool->baseIndex + pool->size;
pool->pointers[pool->size] = ptr;
pool->size++;
return index;
}
static void CTool_ResetPointerPool(void) {
poolHead = NULL;
poolTail = NULL;
}
#endif
static void GListError(void) { static void GListError(void) {
if (GListErrorProc) if (GListErrorProc)
GListErrorProc(); GListErrorProc();
@ -845,6 +908,10 @@ void freelheap(void) {
blockp->blockfree = blockp->blocksize - sizeof(HeapBlock); blockp->blockfree = blockp->blocksize - sizeof(HeapBlock);
blockp = blockp->next; blockp = blockp->next;
} }
#ifdef CW_64_BIT_SUPPORT
CTool_ResetPointerPool();
#endif
} }
} }

View File

@ -1025,7 +1025,7 @@ static ENode *CExpr_UserConversion(ENode *expr, Type *type2, UInt32 qual2, Impli
if (CExpr_StandardConversionMatch(expr, tmptype23, arg21->qual, 0, &sc1)) { if (CExpr_StandardConversionMatch(expr, tmptype23, arg21->qual, 0, &sc1)) {
if (object27) { if (object27) {
if (!object26->u.func.inst && !object27->u.func.inst) if (object26->u.func.inst && !object27->u.func.inst)
continue; continue;
if (CExpr_IsBetterStandardConv(&sc2, &sc1)) if (CExpr_IsBetterStandardConv(&sc2, &sc1))
continue; continue;

View File

@ -2598,7 +2598,7 @@ static Statement *CInline_InlineFunctionStatement(Statement *stmt, Boolean *chan
} }
*changed = 1; *changed = 1;
CInline_ExpandStatements(object, stmt, funcdata, stmt->expr, label, NULL, 0); return CInline_ExpandStatements(object, stmt, funcdata, stmt->expr, label, NULL, 0);
} }
static Statement *CInline_ExtractInlineFunction(Statement *stmt) { static Statement *CInline_ExtractInlineFunction(Statement *stmt) {

View File

@ -457,7 +457,7 @@ void CInt64_ConvertUInt32(CInt64 *i) {
} }
void CInt64_ConvertInt16(CInt64 *i) { void CInt64_ConvertInt16(CInt64 *i) {
i->lo = (SInt32) i->lo; i->lo = (SInt16) i->lo;
CInt64_Extend32(i); CInt64_Extend32(i);
} }

View File

@ -10,10 +10,10 @@
#include "compiler/objects.h" #include "compiler/objects.h"
#include "compiler/types.h" #include "compiler/types.h"
TypeIntegral stbool = {TYPEINT, 0, IT_BOOL}; TypeIntegral stbool = {TYPEINT, 1, IT_BOOL};
TypeIntegral stchar = {TYPEINT, 1, IT_CHAR}; TypeIntegral stchar = {TYPEINT, 1, IT_CHAR};
TypeIntegral stsignedchar = {TYPEINT, 0, IT_SCHAR}; TypeIntegral stsignedchar = {TYPEINT, 1, IT_SCHAR};
TypeIntegral stunsignedchar = {TYPEINT, 0, IT_UCHAR}; TypeIntegral stunsignedchar = {TYPEINT, 1, IT_UCHAR};
TypeIntegral stwchar = {TYPEINT, 4, IT_WCHAR_T}; TypeIntegral stwchar = {TYPEINT, 4, IT_WCHAR_T};
TypeIntegral stsignedshort = {TYPEINT, 2, IT_SHORT}; TypeIntegral stsignedshort = {TYPEINT, 2, IT_SHORT};
TypeIntegral stunsignedshort = {TYPEINT, 2, IT_USHORT}; TypeIntegral stunsignedshort = {TYPEINT, 2, IT_USHORT};

View File

@ -119,7 +119,7 @@ static void FuncAsm_PreScanDirectives(void) {
cprep_eoltokens = 1; cprep_eoltokens = 1;
if (setjmp(InlineAsm_assemblererror) == 0) { if (setjmp(InlineAsm_assemblererror) == 0) {
while (tk == TK_IDENTIFIER && (directive = InlineAsm_IsDirective(AssemblerType_0))) { while (tk == TK_IDENTIFIER && (directive = InlineAsm_IsDirective(AssemblerType_1))) {
InlineAsm_ProcessDirective(directive); InlineAsm_ProcessDirective(directive);
if (tk == ';' || tk == TK_EOL) { if (tk == ';' || tk == TK_EOL) {

View File

@ -383,7 +383,7 @@ static void ScanOptionalLabel(void) {
} }
} }
static void ScanStatements(volatile short endToken, UInt8 mode) { static void ScanStatements(volatile short endToken, AssemblerType mode) {
if (setjmp(InlineAsm_assemblererror)) { if (setjmp(InlineAsm_assemblererror)) {
while (tk != TK_EOL && tk != endToken && tk != '}' && tk) while (tk != TK_EOL && tk != endToken && tk != '}' && tk)
tk = lex(); tk = lex();
@ -445,11 +445,11 @@ static void ScanStatements(volatile short endToken, UInt8 mode) {
} }
void InlineAsm_ScanStatements(volatile short endToken) { void InlineAsm_ScanStatements(volatile short endToken) {
ScanStatements(endToken, 0); ScanStatements(endToken, AssemblerType_0);
} }
void InlineAsm_ScanFunction(volatile short endToken) { void InlineAsm_ScanFunction(volatile short endToken) {
ScanStatements(endToken, 1); ScanStatements(endToken, AssemblerType_1);
} }
void InlineAsm_Assemble(void) { void InlineAsm_Assemble(void) {

View File

@ -1757,8 +1757,8 @@ void gen_COND(ENode *expr, short outputReg, short outputRegHi, Operand *output)
emitpcode(PC_XOR, reg2, reg1, output->reg); emitpcode(PC_XOR, reg2, reg1, output->reg);
reg3 = outputReg ? outputReg : ALLOC_GPR(); reg3 = outputReg ? outputReg : ALLOC_GPR();
emitpcode(PC_SUBF, reg3, reg1, reg2); emitpcode(PC_SUBF, reg3, reg1, reg2);
op2.optype = OpndType_GPR; output->optype = OpndType_GPR;
op2.reg = reg3; output->reg = reg3;
} }
return; return;
} }

View File

@ -55,9 +55,7 @@ static void buildinterferencematrix(void) {
for (block = pcbasicblocks; block; block = block->nextBlock) { for (block = pcbasicblocks; block; block = block->nextBlock) {
bitvectorcopy(vec, liveinfo[block->blockIndex].out, regs); bitvectorcopy(vec, liveinfo[block->blockIndex].out, regs);
for (instr = block->lastPCode; instr; instr = instr->prevPCode) { for (instr = block->lastPCode; instr; instr = instr->prevPCode) {
op = instr->args; for (op = instr->args, i = instr->argCount; i--; op++) {
i = instr->argCount;
while (i--) {
if (PC_OP_IS_WRITE_ANY_REGISTER(op, coloring_class)) { if (PC_OP_IS_WRITE_ANY_REGISTER(op, coloring_class)) {
reg = op->data.reg.reg; reg = op->data.reg.reg;
bitvectorclearbit(reg, vec); bitvectorclearbit(reg, vec);
@ -73,23 +71,19 @@ static void buildinterferencematrix(void) {
} }
} }
} }
op++;
} }
op = instr->args; for (op = instr->args, i = instr->argCount; i--; op++) {
i = instr->argCount;
while (i--) {
if (PC_OP_IS_READ_ANY_REGISTER(op, coloring_class)) { if (PC_OP_IS_READ_ANY_REGISTER(op, coloring_class)) {
reg = op->data.reg.reg; reg = op->data.reg.reg;
if (bitvectorgetbit(reg, vec) == 0) if (bitvectorgetbit(reg, vec) == 0)
op->data.reg.effect |= Effect4; op->data.reg.effect |= Effect4;
bitvectorsetbit(reg, vec); bitvectorsetbit(reg, vec);
} }
op++;
} }
if (coloring_class == RegClass_GPR) { if (coloring_class == RegClass_GPR) {
if (PCODE_FLAG_SET_F(instr) & (fIsRead | fIsWrite | fPCodeFlag40000)) { if (PCODE_FLAG_SET_F(instr) & (fIsRead | fIsWrite | fPCodeFlag400000)) {
if (instr->args[1].data.reg.reg >= n_real_registers[coloring_class]) if (instr->args[1].data.reg.reg >= n_real_registers[coloring_class])
makeinterfere(0, instr->args[1].data.reg.reg); makeinterfere(0, instr->args[1].data.reg.reg);
if (PCODE_FLAG_SET_F(instr) & fUpdatesPtr) if (PCODE_FLAG_SET_F(instr) & fUpdatesPtr)
@ -124,7 +118,7 @@ static void buildinterferencematrix(void) {
op = instr->args; op = instr->args;
CError_ASSERT(219, instr->argCount != 0); CError_ASSERT(219, instr->argCount != 0);
while (op->kind != PCOp_REGISTER && !(op->data.reg.effect & EffectWrite)) { while (op->kind != PCOp_REGISTER || !(op->data.reg.effect & EffectWrite)) {
i++; i++;
op++; op++;
CError_ASSERT(226, i <= instr->argCount); CError_ASSERT(226, i <= instr->argCount);
@ -136,6 +130,7 @@ static void buildinterferencematrix(void) {
for (j = 0; j < n_scratch_registers[coloring_class]; j++) for (j = 0; j < n_scratch_registers[coloring_class]; j++)
makeinterfere(op->data.reg.reg, scratch_registers[coloring_class][j]); makeinterfere(op->data.reg.reg, scratch_registers[coloring_class][j]);
} }
i++;
op++; op++;
} }
} }

View File

@ -1993,7 +1993,7 @@ IROLoop *ExtractLoopInfo(IRONode *fnode) {
if (IS_LINEAR_DIADIC(scannd, ESHR) && if (IS_LINEAR_DIADIC(scannd, ESHR) &&
(obj = IRO_IsVariable(scannd->u.diadic.left)) && (obj = IRO_IsVariable(scannd->u.diadic.left)) &&
IRO_IsConstant(scannd->u.diadic.right)) { IRO_IsIntConstant(scannd->u.diadic.right)) {
for (scanind = FirstInd; scanind; scanind = scanind->next) { for (scanind = FirstInd; scanind; scanind = scanind->next) {
if (scanind->var->object == obj) { if (scanind->var->object == obj) {
IRO_Dump("Induction has DIV: %s\n", obj->name->name); IRO_Dump("Induction has DIV: %s\n", obj->name->name);
@ -2004,7 +2004,7 @@ IROLoop *ExtractLoopInfo(IRONode *fnode) {
if (IS_LINEAR_DIADIC(scannd, EAND) && if (IS_LINEAR_DIADIC(scannd, EAND) &&
(obj = IRO_IsVariable(scannd->u.diadic.left)) && (obj = IRO_IsVariable(scannd->u.diadic.left)) &&
IRO_IsConstant(scannd->u.diadic.right)) { IRO_IsIntConstant(scannd->u.diadic.right)) {
for (scanind = FirstInd; scanind && obj; scanind = scanind->next) { for (scanind = FirstInd; scanind && obj; scanind = scanind->next) {
if (scanind->var->object == obj) { if (scanind->var->object == obj) {
IRO_Dump("Induction has MOD: %s\n", obj->name->name); IRO_Dump("Induction has MOD: %s\n", obj->name->name);

View File

@ -2,6 +2,9 @@
#include "compiler/IroMalloc.h" #include "compiler/IroMalloc.h"
#include "compiler/CError.h" #include "compiler/CError.h"
#include "compiler/CInt64.h" #include "compiler/CInt64.h"
#include "compiler/CParser.h"
#include "compiler/objects.h"
#include "compiler/types.h"
// TODO: this should really be elsewhere (but where?) // TODO: this should really be elsewhere (but where?)
CW_INLINE UInt32 gcd(UInt32 a, UInt32 b) { CW_INLINE UInt32 gcd(UInt32 a, UInt32 b) {

View File

@ -509,7 +509,7 @@ void IRO_ExpressionPropagation(void) {
if (IRO_IsVariable(linear) && !(linear->flags & IROLF_Assigned)) { if (IRO_IsVariable(linear) && !(linear->flags & IROLF_Assigned)) {
if ((var = IRO_FindVar(linear->u.monadic->u.node->data.objref, 0, 1))) { if ((var = IRO_FindVar(linear->u.monadic->u.node->data.objref, 0, 1))) {
for (ass = IRO_LastAssign; ass; ass = ass->next) { for (ass = IRO_FirstAssign; ass; ass = ass->next) {
if (ass->varIndex == var->index && Bv_IsBitSet(ass->index, IRO_Avail) && !PropagationHasDefsInUnorderedRegions(linear, ass->linear2)) { if (ass->varIndex == var->index && Bv_IsBitSet(ass->index, IRO_Avail) && !PropagationHasDefsInUnorderedRegions(linear, ass->linear2)) {
if (ass->linear2->type == IROLinearOperand && IRO_is_CPtypeequal(linear->rtype, ass->linear->u.diadic.left->rtype)) { if (ass->linear2->type == IROLinearOperand && IRO_is_CPtypeequal(linear->rtype, ass->linear->u.diadic.left->rtype)) {
ENode *enode = IRO_NewENode(ass->linear2->u.node->type); ENode *enode = IRO_NewENode(ass->linear2->u.node->type);

View File

@ -592,7 +592,7 @@ static void checkcountingloop(Loop *loop) {
return; return;
if (op12 != PC_CMP && op12 != PC_CMPL && op12 != PC_CMPI && op12 != PC_CMPLI) if (op12 != PC_CMP && op12 != PC_CMPL && op12 != PC_CMPI && op12 != PC_CMPLI)
return; return;
if (prevpcode->args[1].data.reg.reg == pc8->args[0].data.reg.reg) if (prevpcode->args[1].data.reg.reg != pc8->args[0].data.reg.reg)
return; return;
if ((loop->step = pc8->args[2].data.imm.value) == 0) if ((loop->step = pc8->args[2].data.imm.value) == 0)
return; return;

View File

@ -255,13 +255,23 @@ static void ApplyRelocs(void) {
ptr = (UInt32 *) ((*section->glist.data) + reloc->address); ptr = (UInt32 *) ((*section->glist.data) + reloc->address);
if (reloc->is_pcrel) { if (reloc->is_pcrel) {
if (!reloc->is_extern) if (!reloc->is_extern) {
*ptr = (*ptr & opMask) | (argMask & (value - (reloc->address + section->section.addr) + (*ptr & argMask))); *ptr = CTool_EndianConvertWord32(
(CTool_EndianConvertWord32(*ptr) & opMask) |
(argMask & (value - (reloc->address + section->section.addr) + (CTool_EndianConvertWord32(*ptr) & argMask))));
}
} else { } else {
if (reloc->reltype == PPC_RELOC_PAIR) if (reloc->reltype == PPC_RELOC_PAIR) {
*ptr = (*ptr & opMask) | (value & argMask); *ptr = CTool_EndianConvertWord32(
else (CTool_EndianConvertWord32(*ptr) & opMask) |
*ptr = (*ptr & opMask) | (argMask & (value + (*ptr & argMask))); (value & argMask)
);
} else {
*ptr = CTool_EndianConvertWord32(
(CTool_EndianConvertWord32(*ptr) & opMask) |
(argMask & (value + (CTool_EndianConvertWord32(*ptr) & argMask)))
);
}
} }
} }
} }
@ -287,9 +297,41 @@ static void WriteSegLoadCommands(void) {
MachOSection *section; MachOSection *section;
for (segment = FirstSeg; segment; segment = segment->next) { for (segment = FirstSeg; segment; segment = segment->next) {
#ifdef ENDIAN_CONVERSION
struct segment_command c = segment->cmd;
c.cmd = CTool_EndianConvertWord32(c.cmd);
c.cmdsize = CTool_EndianConvertWord32(c.cmdsize);
c.vmaddr = CTool_EndianConvertWord32(c.vmaddr);
c.vmsize = CTool_EndianConvertWord32(c.vmsize);
c.fileoff = CTool_EndianConvertWord32(c.fileoff);
c.filesize = CTool_EndianConvertWord32(c.filesize);
c.maxprot = CTool_EndianConvertWord32(c.maxprot);
c.initprot = CTool_EndianConvertWord32(c.initprot);
c.nsects = CTool_EndianConvertWord32(c.nsects);
c.flags = CTool_EndianConvertWord32(c.flags);
AppendGListData(&ObjFile, &c, sizeof(c));
#else
AppendGListData(&ObjFile, &segment->cmd, sizeof(segment->cmd)); AppendGListData(&ObjFile, &segment->cmd, sizeof(segment->cmd));
for (section = segment->firstSection; section; section = section->next) #endif
for (section = segment->firstSection; section; section = section->next) {
#ifdef ENDIAN_CONVERSION
struct section c = section->section;
c.addr = CTool_EndianConvertWord32(c.addr);
c.size = CTool_EndianConvertWord32(c.size);
c.offset = CTool_EndianConvertWord32(c.offset);
c.align = CTool_EndianConvertWord32(c.align);
c.reloff = CTool_EndianConvertWord32(c.reloff);
c.nreloc = CTool_EndianConvertWord32(c.nreloc);
c.flags = CTool_EndianConvertWord32(c.flags);
c.reserved1 = CTool_EndianConvertWord32(c.reserved1);
c.reserved2 = CTool_EndianConvertWord32(c.reserved2);
AppendGListData(&ObjFile, &c, sizeof(c));
#else
AppendGListData(&ObjFile, &section->section, sizeof(section->section)); AppendGListData(&ObjFile, &section->section, sizeof(section->section));
#endif
}
} }
} }
@ -297,14 +339,14 @@ static void WriteSymtabLoadCommand(void) {
struct symtab_command cmd; struct symtab_command cmd;
UInt32 total; UInt32 total;
cmd.cmd = LC_SYMTAB; cmd.cmd = CTool_EndianConvertWord32(LC_SYMTAB);
cmd.cmdsize = sizeof(cmd); cmd.cmdsize = CTool_EndianConvertWord32(sizeof(cmd));
cmd.symoff = FileOffset; cmd.symoff = CTool_EndianConvertWord32(FileOffset);
total = SymNum + NumStabs; total = SymNum + NumStabs;
cmd.nsyms = total; cmd.nsyms = total;
FileOffset += total * sizeof(struct nlist); FileOffset += total * sizeof(struct nlist);
cmd.stroff = FileOffset; cmd.stroff = CTool_EndianConvertWord32(FileOffset);
cmd.strsize = StringTable.size; cmd.strsize = CTool_EndianConvertWord32(StringTable.size);
AppendGListData(&ObjFile, &cmd, sizeof(cmd)); AppendGListData(&ObjFile, &cmd, sizeof(cmd));
} }
@ -329,15 +371,15 @@ static void WriteDynamicSymtabLoadCommand(void) {
CError_ASSERT(652, (iundefsym + nundefsym) <= (SymNum + NumStabs)); CError_ASSERT(652, (iundefsym + nundefsym) <= (SymNum + NumStabs));
cmd.cmd = LC_DYSYMTAB; cmd.cmd = CTool_EndianConvertWord32(LC_DYSYMTAB);
cmd.cmdsize = sizeof(cmd); cmd.cmdsize = CTool_EndianConvertWord32(sizeof(cmd));
cmd.ilocalsym = ilocalsym; cmd.ilocalsym = CTool_EndianConvertWord32(ilocalsym);
cmd.nlocalsym = nlocalsym; cmd.nlocalsym = CTool_EndianConvertWord32(nlocalsym);
cmd.iextdefsym = iextdefsym; cmd.iextdefsym = CTool_EndianConvertWord32(iextdefsym);
cmd.nextdefsym = nextdefsym; cmd.nextdefsym = CTool_EndianConvertWord32(nextdefsym);
cmd.iundefsym = iundefsym; cmd.iundefsym = CTool_EndianConvertWord32(iundefsym);
cmd.nundefsym = nundefsym; cmd.nundefsym = CTool_EndianConvertWord32(nundefsym);
cmd.tocoff = 0; cmd.tocoff = 0;
cmd.ntoc = 0; cmd.ntoc = 0;
@ -345,8 +387,8 @@ static void WriteDynamicSymtabLoadCommand(void) {
cmd.nmodtab = 0; cmd.nmodtab = 0;
cmd.extrefsymoff = 0; cmd.extrefsymoff = 0;
cmd.nextrefsyms = 0; cmd.nextrefsyms = 0;
cmd.indirectsymoff = IndirectSymbolTableOffset; cmd.indirectsymoff = CTool_EndianConvertWord32(IndirectSymbolTableOffset);
cmd.nindirectsyms = IndirectSymbolTable.size / 4; cmd.nindirectsyms = CTool_EndianConvertWord32(IndirectSymbolTable.size / 4);
cmd.extreloff = 0; cmd.extreloff = 0;
cmd.nextrel = 0; cmd.nextrel = 0;
cmd.locreloff = 0; cmd.locreloff = 0;
@ -428,13 +470,13 @@ static void WriteRelocs(void) {
case PPC_RELOC_BR24: case PPC_RELOC_BR24:
case PPC_RELOC_HI16: case PPC_RELOC_HI16:
case PPC_RELOC_PB_LA_PTR: case PPC_RELOC_PB_LA_PTR:
AppendGListLong(&ObjFile, reloc->address); AppendGListLong(&ObjFile, CTool_EndianConvertWord32(reloc->address));
AppendGListLong(&ObjFile, AppendGListLong(&ObjFile,
(reloc->value << 8) | CTool_EndianConvertWord32((reloc->value << 8) |
(reloc->is_pcrel << 7) | (reloc->is_pcrel << 7) |
(length_code[reloc->length] << 5) | (length_code[reloc->length] << 5) |
(reloc->is_extern << 4) | (reloc->is_extern << 4) |
reloc->reltype reloc->reltype)
); );
break; break;
case PPC_RELOC_PAIR: case PPC_RELOC_PAIR:
@ -471,21 +513,21 @@ static void WriteRelocs(void) {
pairType = 0; pairType = 0;
if (scatterFlag) { if (scatterFlag) {
AppendGListLong(&ObjFile, AppendGListLong(&ObjFile,
scatterFlag | CTool_EndianConvertWord32(scatterFlag |
(reloc->is_pcrel << 30) | (reloc->is_pcrel << 30) |
(length_code[reloc->length] << 28) | (length_code[reloc->length] << 28) |
(reloc->reltype << 24) | (reloc->reltype << 24) |
reloc->address reloc->address)
); );
AppendGListLong(&ObjFile, reloc->value); AppendGListLong(&ObjFile, CTool_EndianConvertWord32(reloc->value));
} else { } else {
combo = combo =
(reloc->value << 8) | (reloc->value << 8) |
(reloc->is_pcrel << 7) | (reloc->is_pcrel << 7) |
(length_code[reloc->length] << 5) | (length_code[reloc->length] << 5) |
reloc->reltype; reloc->reltype;
AppendGListLong(&ObjFile, reloc->address); AppendGListLong(&ObjFile, CTool_EndianConvertWord32(reloc->address));
AppendGListLong(&ObjFile, combo); AppendGListLong(&ObjFile, CTool_EndianConvertWord32(combo));
} }
break; break;
case PPC_RELOC_SECTDIFF: case PPC_RELOC_SECTDIFF:
@ -497,13 +539,13 @@ static void WriteRelocs(void) {
pairType = reloc->reltype; pairType = reloc->reltype;
pairValue = reloc->value; pairValue = reloc->value;
AppendGListLong(&ObjFile, AppendGListLong(&ObjFile,
R_SCATTERED | CTool_EndianConvertWord32(R_SCATTERED |
(reloc->is_pcrel << 30) | (reloc->is_pcrel << 30) |
(length_code[reloc->length] << 28) | (length_code[reloc->length] << 28) |
(reloc->reltype << 24) | (reloc->reltype << 24) |
reloc->address reloc->address)
); );
AppendGListLong(&ObjFile, reloc->value); AppendGListLong(&ObjFile, CTool_EndianConvertWord32(reloc->value));
break; break;
default: default:
@ -525,8 +567,10 @@ static void WriteIndirectSymbolTable(void) {
COS_LockHandle(IndirectSymbolTable.data); COS_LockHandle(IndirectSymbolTable.data);
ptr = (UInt32 *) *IndirectSymbolTable.data; ptr = (UInt32 *) *IndirectSymbolTable.data;
for (i = 0; i < MachO_NumIndirectSym(); ptr++, i++) for (i = 0; i < MachO_NumIndirectSym(); ptr++, i++) {
*ptr += NumStabs; *ptr += NumStabs;
*ptr = CTool_EndianConvertWord32(*ptr);
}
AppendGListData(&ObjFile, *IndirectSymbolTable.data, IndirectSymbolTable.size); AppendGListData(&ObjFile, *IndirectSymbolTable.data, IndirectSymbolTable.size);
COS_UnlockHandle(IndirectSymbolTable.data); COS_UnlockHandle(IndirectSymbolTable.data);
@ -543,13 +587,13 @@ static void WriteSymbolTable(void) {
} }
for (symbol = FirstSym; symbol; symbol = symbol->next) { for (symbol = FirstSym; symbol; symbol = symbol->next) {
nlist.n_strx = symbol->data.u.strx; nlist.n_strx = CTool_EndianConvertWord32(symbol->data.u.strx);
nlist.n_type = symbol->data.type; nlist.n_type = symbol->data.type;
if (symbol->data.section) if (symbol->data.section)
nlist.n_sect = symbol->data.section->num; nlist.n_sect = symbol->data.section->num;
else else
nlist.n_sect = 0; nlist.n_sect = 0;
nlist.n_desc = symbol->data.desc; nlist.n_desc = CTool_EndianConvertWord16(symbol->data.desc);
if ( if (
symbol->data.type == N_STSYM || symbol->data.type == N_STSYM ||
@ -569,7 +613,7 @@ static void WriteSymbolTable(void) {
CError_FATAL(1010); CError_FATAL(1010);
} }
nlist.n_value = symbol->data.value; nlist.n_value = CTool_EndianConvertWord32(symbol->data.value);
AppendGListData(&ObjFile, &nlist, sizeof(nlist)); AppendGListData(&ObjFile, &nlist, sizeof(nlist));
} }
} }
@ -598,7 +642,8 @@ void MachO_Finish(void) {
hdr.ncmds++; hdr.ncmds++;
} }
hdr.sizeofcmds = FileOffset - sizeof(hdr); hdr.ncmds = CTool_EndianConvertWord32(hdr.ncmds);
hdr.sizeofcmds = CTool_EndianConvertWord32(FileOffset - sizeof(hdr));
AllocateAddresses(); AllocateAddresses();
ApplyRelocs(); ApplyRelocs();
@ -615,10 +660,10 @@ void MachO_Finish(void) {
InitGList(&ObjFile, 4096); InitGList(&ObjFile, 4096);
hdr.magic = MH_MAGIC; hdr.magic = CTool_EndianConvertWord32(MH_MAGIC);
hdr.cputype = CPU_TYPE_POWERPC; hdr.cputype = CTool_EndianConvertWord32(CPU_TYPE_POWERPC);
hdr.cpusubtype = CPU_SUBTYPE_MC98000_ALL; hdr.cpusubtype = CTool_EndianConvertWord32(CPU_SUBTYPE_MC98000_ALL);
hdr.filetype = MH_OBJECT; hdr.filetype = CTool_EndianConvertWord32(MH_OBJECT);
hdr.flags = 0; hdr.flags = 0;
AppendGListData(&ObjFile, &hdr, sizeof(hdr)); AppendGListData(&ObjFile, &hdr, sizeof(hdr));

View File

@ -921,7 +921,10 @@ void ObjGen_Finish(void) {
if (value) { if (value) {
UInt32 *ptr = (UInt32 *) (*reloc->section->glist.data + reloc->offset); UInt32 *ptr = (UInt32 *) (*reloc->section->glist.data + reloc->offset);
*ptr = (*ptr & opMask) | (argMask & (value + (*ptr & argMask))); *ptr = CTool_EndianConvertWord32(
(CTool_EndianConvertWord32(*ptr) & opMask) |
(argMask & (value + (CTool_EndianConvertWord32(*ptr) & argMask)))
);
} }
} else { } else {
switch (reloc->mwRelType) { switch (reloc->mwRelType) {
@ -969,7 +972,10 @@ void ObjGen_Finish(void) {
if (value != 0) { if (value != 0) {
UInt32 *ptr = (UInt32 *) (*reloc->section->glist.data + reloc->offset); UInt32 *ptr = (UInt32 *) (*reloc->section->glist.data + reloc->offset);
*ptr = (*ptr & opMask) | (argMask & (value + (*ptr & argMask))); *ptr = CTool_EndianConvertWord32(
(CTool_EndianConvertWord32(*ptr) & opMask) |
(argMask & (value + (CTool_EndianConvertWord32(*ptr) & argMask)))
);
} }
if (nextRelType == PPC_RELOC_BR24) { if (nextRelType == PPC_RELOC_BR24) {
@ -1098,9 +1104,9 @@ static void declaredata(Object *object, char *data, OLinkList *olinklist, UInt32
SInt32 extflag; SInt32 extflag;
SInt32 id; SInt32 id;
extflag = ObjGen_IsExternalVar(ObjGen_GetHashNodeRelocID(scan->obj, NULL, 0)); extflag = ObjGen_IsExternalVar(ObjGen_GetHashNodeRelocID(olinklist->obj, NULL, 0));
id = CMangler_GetLinkName(scan->obj)->id; id = CMangler_GetLinkName(olinklist->obj)->id;
ObjGen_Relocate(Sections[sectionID], offset + scan->offset, extflag + id, RT_4, MW_RELOC_0); ObjGen_Relocate(Sections[sectionID], offset + olinklist->offset, extflag + id, RT_4, MW_RELOC_0);
olinklist = olinklist->next; olinklist = olinklist->next;
} }
} else { } else {

View File

@ -1,12 +1,10 @@
#include "compiler/CompilerTools.h" #include "compiler/CompilerTools.h"
#include "compiler/CFunc.h" #include "compiler/CFunc.h"
#include "compiler/Alias.h"
#include "compiler/CodeGen.h" #include "compiler/CodeGen.h"
#include "compiler/PCode.h" #include "compiler/PCode.h"
#include "compiler/PCodeInfo.h" #include "compiler/PCodeInfo.h"
// TODO: move me
extern void initialize_aliases();
PCodeBlock *pcbasicblocks; PCodeBlock *pcbasicblocks;
PCodeBlock *pclastblock; PCodeBlock *pclastblock;
PCodeBlock *prologue; PCodeBlock *prologue;

View File

@ -433,7 +433,7 @@ PCode *vformatpcode(short opcode, va_list argList) {
CError_ASSERT(476, obj->otype == OT_OBJECT); CError_ASSERT(476, obj->otype == OT_OBJECT);
arg->data.mem.obj = obj; arg->data.mem.obj = obj;
arg->data.mem.offset = 0; arg->data.mem.offset = 0;
arg->arg = 1; arg->arg = RefType_4;
} }
break; break;
@ -769,7 +769,7 @@ int expectandformatoperand(PCodeArg *operand, PCOpKind expectedKind, char a3, in
tmp = sprintf(buf, "%sB<unknown>-B%ld+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelB->block->blockIndex, operand->data.labeldiff.offset); tmp = sprintf(buf, "%sB<unknown>-B%ld+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelB->block->blockIndex, operand->data.labeldiff.offset);
} else { } else {
if (b_null) if (b_null)
tmp = sprintf(buf, "%sB%ld-%B<unknown>+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelA->block->blockIndex, operand->data.labeldiff.offset); tmp = sprintf(buf, "%sB%ld-B<unknown>+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelA->block->blockIndex, operand->data.labeldiff.offset);
else else
tmp = sprintf(buf, "%sB%ld-B%ld+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelA->block->blockIndex, operand->data.labeldiff.labelB->block->blockIndex, operand->data.labeldiff.offset); tmp = sprintf(buf, "%sB%ld-B%ld+%ld", refis1 ? "-" : "", operand->data.labeldiff.labelA->block->blockIndex, operand->data.labeldiff.labelB->block->blockIndex, operand->data.labeldiff.offset);
} }
@ -786,7 +786,12 @@ int expectandformatoperand(PCodeArg *operand, PCOpKind expectedKind, char a3, in
} }
int formatoperand(PCodeArg *operand, char *buf) { int formatoperand(PCodeArg *operand, char *buf) {
return expectandformatoperand(
operand,
operand->kind,
(operand->kind == PCOp_REGISTER) ? operand->arg : 'x',
-1,
buf);
} }
void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) { void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) {
@ -1146,15 +1151,83 @@ void formatoperands(PCode *pcode, char *buf, int showBasicBlocks) {
} }
PCode *makecopyinstruction(PCodeArg *a, PCodeArg *b) { PCode *makecopyinstruction(PCodeArg *a, PCodeArg *b) {
if (b->kind == PCOp_REGISTER) {
switch (b->arg) {
case RegClass_GPR:
return makepcode(PC_MR, b->data.reg.reg, a->data.reg.reg);
case RegClass_FPR:
return makepcode(PC_FMR, b->data.reg.reg, a->data.reg.reg);
case RegClass_VR:
return makepcode(PC_VMR, b->data.reg.reg, a->data.reg.reg);
case RegClass_CRFIELD:
return makepcode(PC_MCRF, b->data.reg.reg, a->data.reg.reg);
}
}
CError_FATAL(1622);
return NULL;
} }
int is_location_independent(PCode *pcode) { int is_location_independent(PCode *pcode) {
switch (pcode->op) {
case PC_LI:
case PC_LIS:
case PC_VSPLTISB:
case PC_VSPLTISH:
case PC_VSPLTISW:
return 1;
case PC_ADDI:
case PC_ADDIS:
case PC_ORI:
case PC_ORIS:
return pcode->args[1].data.reg.reg == _FP_;
case PC_LWZ:
if (
pcode->args[1].data.reg.reg == 1 &&
pcode->args[2].kind == PCOp_IMMEDIATE &&
pcode->args[2].data.imm.value == 0
)
return 1;
}
return 0;
} }
int can_reuse_stored_value(PCode *a, PCode *b) { int can_reuse_stored_value(PCode *a, PCode *b) {
switch (b->op) {
case PC_LWZ:
case PC_LWZU:
case PC_LWZX:
case PC_LWZUX:
switch (a->op) {
case PC_STW:
case PC_STWU:
case PC_STWX:
case PC_STWUX:
return 1;
}
break;
case PC_LFD:
case PC_LFDU:
case PC_LFDX:
case PC_LFDUX:
switch (a->op) {
case PC_STFD:
case PC_STFDU:
case PC_STFDX:
case PC_STFDUX:
return 1;
}
break;
case PC_LVX:
if (a->op == PC_STVX)
return 1;
break;
}
return 0;
} }
int nbytes_loaded_or_stored_by(PCode *pcode) { int nbytes_loaded_or_stored_by(PCode *pcode) {
@ -1261,7 +1334,14 @@ int nbytes_loaded_or_stored_by(PCode *pcode) {
} }
void change_num_operands(PCode *pcode, int newNum) { void change_num_operands(PCode *pcode, int newNum) {
int i;
CError_ASSERT(2026, ((pcode->argCount > 5) ? pcode->argCount : 5) >= newNum);
for (i = pcode->argCount - 1; i >= newNum; i--)
pcode->args[i].kind = PCOp_PLACEHOLDEROPERAND;
pcode->argCount = newNum;
} }
void change_opcode(PCode *pcode, short opcode) { void change_opcode(PCode *pcode, short opcode) {

View File

@ -2346,7 +2346,7 @@ static void adjustforward(PCodeBlock *block) {
if (PC_OP_IS_WRITE_REGISTER(op, RegClass_GPR, reg1)) if (PC_OP_IS_WRITE_REGISTER(op, RegClass_GPR, reg1))
flag2 = 1; flag2 = 1;
if (PC_OP_IS_REGISTER(op, RegClass_GPR, 0)) if (PC_OP_IS_REGISTER(op, RegClass_CRFIELD, 0))
flag1 = 1; flag1 = 1;
} }
} }
@ -2389,13 +2389,13 @@ static void adjustforward(PCodeBlock *block) {
break; break;
} }
if (PC_OP_IS_REGISTER(op, RegClass_GPR, 0)) if (PC_OP_IS_REGISTER(op, RegClass_CRFIELD, 0))
flag = 1; flag = 1;
} }
} }
} else if ( } else if (
instr->op == PC_EXTSH && instr->op == PC_EXTSH &&
(reg0 = instr->args[0].data.reg.reg) == (reg1 = instr->args[1].data.reg.reg) (reg0 = instr->args[0].data.reg.reg) != (reg1 = instr->args[1].data.reg.reg)
) )
{ {
short flag = 0; short flag = 0;
@ -2428,7 +2428,7 @@ static void adjustforward(PCodeBlock *block) {
break; break;
} }
if (PC_OP_IS_REGISTER(op, RegClass_GPR, 0)) if (PC_OP_IS_REGISTER(op, RegClass_CRFIELD, 0))
flag = 1; flag = 1;
} }
} }

View File

@ -366,8 +366,7 @@ static Object *create_switch_table(void) {
while (CInt64_LessEqual(value, range)) { while (CInt64_LessEqual(value, range)) {
while (CInt64_Greater(CInt64_Add(first, value), CInt64_Add(currange->min, currange->range))) while (CInt64_Greater(CInt64_Add(first, value), CInt64_Add(currange->min, currange->range)))
currange++; currange++;
// HACK - this will not work properly on 64-bit systems *outptr = CTool_CreateIndexFromPointer(currange->label);
*outptr = (UInt32) currange->label;
value = CInt64_Add(value, cint64_one); value = CInt64_Add(value, cint64_one);
outptr++; outptr++;
} }
@ -420,7 +419,7 @@ static void generate_table(ENode *expr, SwitchInfo *info) {
} }
} }
if (FITS_IN_SHORT(CInt64_GetULong(&range))) { if (!FITS_IN_SHORT(CInt64_GetULong(&range))) {
short tmp = ALLOC_GPR(); short tmp = ALLOC_GPR();
load_immediate(tmp, CInt64_GetULong(&range)); load_immediate(tmp, CInt64_GetULong(&range));
emitpcode(PC_CMPL, 0, reg, tmp); emitpcode(PC_CMPL, 0, reg, tmp);
@ -511,7 +510,7 @@ void dumpswitchtables(Object *funcobj) {
size = table->u.data.u.switchtable.size; size = table->u.data.u.switchtable.size;
array = (UInt32 *) table->u.data.u.switchtable.data; array = (UInt32 *) table->u.data.u.switchtable.data;
while (size--) { while (size--) {
*array = CTool_EndianConvertWord32(((PCodeLabel *) *array)->block->codeOffset); *array = CTool_EndianConvertWord32(((PCodeLabel *) CTool_ResolveIndexToPointer(*array))->block->codeOffset);
array++; array++;
} }

View File

@ -295,7 +295,7 @@ static void computeusedeflists(int flag) {
def->v.arg = 0; def->v.arg = 0;
def->v.u.object = object; def->v.u.object = object;
list = oalloc(sizeof(RegUseOrDef)); list = oalloc(sizeof(RegUseOrDef));
list->id = useID; list->id = defID;
tmp = findobjectusedef(object); tmp = findobjectusedef(object);
list->next = tmp->defs; list->next = tmp->defs;
tmp->defs = list; tmp->defs = list;
@ -427,7 +427,7 @@ static void computelocalusedefinfo(void) {
bitvectorclearbit(list->id, defvec0); bitvectorclearbit(list->id, defvec0);
} }
} else if (def->v.arg == 0) { } else if (def->v.arg == 0) {
oud = findobjectusedef(use->v.u.object); oud = findobjectusedef(def->v.u.object);
for (list = oud->uses; list; list = list->next) { for (list = oud->uses; list; list = list->next) {
if (may_alias(pcode, Uses[list->id].pcode)) { if (may_alias(pcode, Uses[list->id].pcode)) {
if (Uses[list->id].pcode->block != block) if (Uses[list->id].pcode->block != block)

View File

@ -15,7 +15,6 @@
#ifdef __MWERKS__ #ifdef __MWERKS__
#define macintosh #define macintosh
//#include <MacHeadersMach-O>
#define CW_PASCAL pascal #define CW_PASCAL pascal
#undef toupper #undef toupper
#undef tolower #undef tolower

View File

@ -3,6 +3,10 @@
#include "compiler/common.h" #include "compiler/common.h"
#ifdef __LITTLE_ENDIAN__
#define ENDIAN_CONVERSION
#endif
extern void CompilerGetPString(short index, unsigned char *string); extern void CompilerGetPString(short index, unsigned char *string);
extern void CompilerGetCString(short index, char *string); extern void CompilerGetCString(short index, char *string);
extern unsigned char *CTool_CtoPstr(char *cstr); extern unsigned char *CTool_CtoPstr(char *cstr);
@ -49,6 +53,20 @@ struct GList {
extern long hash_name_id; extern long hash_name_id;
extern HashNameNode **name_hash_nodes; extern HashNameNode **name_hash_nodes;
#ifdef __LP64__
#define CW_64_BIT_SUPPORT
#endif
// These don't exist in the original source, but are kind of necessary in the 2020s
#ifdef CW_64_BIT_SUPPORT
extern void *CTool_ResolveIndexToPointer(UInt32 index);
extern UInt32 CTool_CreateIndexFromPointer(void *ptr);
#else
#define CTool_ResolveIndexToPointer(index) ((void *) (index))
#define CTool_CreateIndexFromPointer(ptr) ((UInt32) (ptr))
#endif
extern void (*GListErrorProc)(void); extern void (*GListErrorProc)(void);
extern short InitGList(GList *gl, SInt32 size); extern short InitGList(GList *gl, SInt32 size);

View File

@ -17,6 +17,7 @@ typedef enum {
PCOp_PLACEHOLDEROPERAND PCOp_PLACEHOLDEROPERAND
} PCOpKind; } PCOpKind;
// unify me with RefType?
typedef enum { typedef enum {
PCOpMemory0 = 0, PCOpMemory0 = 0,
PCOpMemory1 = 1 PCOpMemory1 = 1

View File

@ -1,94 +0,0 @@
#pragma once
#include "common.h"
#include "oslib.h"
#include "macemul.h"
#include "plugin.h"
#define OPTION_ASSERT(cond) do { if (!!(cond) == 0) { printf("%s:%u: failed assertion\n", __FILE__, __LINE__); abort(); } } while(0)
#ifdef __cplusplus
extern "C" {
#endif
/********************************/
/* command_line/CmdLine/Src/Clients/CLStaticMain.c */
extern int main(int argc, const char **argv);
/********************************/
/* ??? */
extern int AddFileTypeMappingList(void *a, void *b); // TODO sig
extern void UseFileTypeMappings(void *a); // TODO sig
extern OSErr SetMacFileType(const FSSpec *fss, void *a); // TODO sig
extern OSErr GetMacFileType(const FSSpec *fss, void *a); // TODO sig
/********************************/
/* Might be cc-mach-ppc-mw.c? */
extern void GetStaticTarget(OSType *cpu, OSType *os);
extern void GetStaticPluginType(OSType *language, OSType *plugintype);
extern void GetStaticParserPluginType(OSType *style);
extern int RegisterStaticTargetResources(void);
extern int RegisterStaticTargetPlugins(void);
/********************************/
/* Might be ParserGlue-mach-ppc-cc.c? */
extern int RegisterStaticParserToolInfo(void);
/********************************/
/* Might be cc-mach-ppc.c? */
extern int RegisterStaticCompilerPlugin(void);
extern int RegisterCompilerResources(void);
/********************************/
/* libimp-mach-ppc.c */
// some statics here
extern int RegisterStaticLibImporterPlugin(void);
extern int RegisterLibImporterResources(void);
/********************************/
/* TargetOptimizer-ppc-mach.c */
extern int TargetSetOptFlags(SInt16 val, Boolean set);
extern void TargetDisplayOptimizationOptions(Handle txt);
extern void TargetSetPragmaOptimizationsToUnspecified(void);
/********************************/
/* OptimizerHelpers.c */
extern int SetPragmaOptimizationsToUnspecified(void);
extern int SetOptFlags(char *opt, void *str, ...); // two unknown args
extern int DisplayOptimizationOptions(void);
/********************************/
/* Unk name lol */
extern int TargetSetWarningFlags(SInt16 val, Boolean set);
extern int TargetDisplayWarningOptions(Handle txt);
/********************************/
/* WarningHelpers.c */
extern int SetWarningFlags(char *opt, void *str, ...); // two unknown args
extern int DisplayWarningOptions(void);
/********************************/
/* CCompiler.c */
extern CWPLUGIN_ENTRY(MWC_main)(CWPluginContext context);
// LOTS OF STUFF
/********************************/
/* StaticParserGlue.c */
extern int RegisterStaticParserPlugins(void);
extern int RegisterStaticParserResources(void);
/********************************/
/* CmdLineBuildDate.c */
extern char CMDLINE_BUILD_DATE[];
extern char CMDLINE_BUILD_TIME[];
/********************************/
/* MISC */
extern char cmdline_build_date[32];
extern char cmdline_build_time[32];
#ifdef __cplusplus
}
#endif