Static stack allocations for complex locals in non recursive calls
This commit is contained in:
parent
24a17c937b
commit
ea09c2aa7b
|
@ -135,6 +135,9 @@ rem @echo off
|
||||||
@call :test ptrarraycmptest.c
|
@call :test ptrarraycmptest.c
|
||||||
@if %errorlevel% neq 0 goto :error
|
@if %errorlevel% neq 0 goto :error
|
||||||
|
|
||||||
|
@call :test cplxstructtest.c
|
||||||
|
@if %errorlevel% neq 0 goto :error
|
||||||
|
|
||||||
@exit /b 0
|
@exit /b 0
|
||||||
|
|
||||||
:error
|
:error
|
||||||
|
|
|
@ -362,6 +362,7 @@ int main(void)
|
||||||
shr16b(0xfedc, 0xfedc);
|
shr16b(0xfedc, 0xfedc);
|
||||||
|
|
||||||
shl16n(0x0000, 0x0000);
|
shl16n(0x0000, 0x0000);
|
||||||
|
|
||||||
shl16n(0xffff, 0xffff);
|
shl16n(0xffff, 0xffff);
|
||||||
shl16n(0x1234, 0x1234);
|
shl16n(0x1234, 0x1234);
|
||||||
shl16n(0xfedc, 0xfedc);
|
shl16n(0xfedc, 0xfedc);
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
struct cplx
|
||||||
|
{
|
||||||
|
float r, i;
|
||||||
|
};
|
||||||
|
|
||||||
|
cplx cplx_add(cplx a, cplx b)
|
||||||
|
{
|
||||||
|
cplx c;
|
||||||
|
c.r = a.r + b.r;
|
||||||
|
c.i = a.i + b.i;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
cplx cplx_sub(cplx a, cplx b)
|
||||||
|
{
|
||||||
|
cplx c;
|
||||||
|
c.r = a.r - b.r;
|
||||||
|
c.i = a.i - b.i;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
cplx cplx_mul(cplx a, cplx b)
|
||||||
|
{
|
||||||
|
cplx c;
|
||||||
|
c.r = a.r * b.r - a.i * b.i;
|
||||||
|
c.i = a.i * b.r + a.r * b.i;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
float cplx_abs(cplx a)
|
||||||
|
{
|
||||||
|
return sqrt(a.r * a.r + a.i * a.i);
|
||||||
|
}
|
||||||
|
|
||||||
|
cplx cplx_sum(cplx p, const cplx * a, int n)
|
||||||
|
{
|
||||||
|
cplx s = {0.0, 0.0};
|
||||||
|
cplx c = {1.0, 0.0};
|
||||||
|
|
||||||
|
for(int i=0; i<n; i++)
|
||||||
|
{
|
||||||
|
s = cplx_add(s, cplx_mul(a[i], c));
|
||||||
|
c = cplx_mul(c, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
cplx sig[100];
|
||||||
|
|
||||||
|
for(int i=0; i<100; i++)
|
||||||
|
{
|
||||||
|
sig[i].r = cos(i * 1.3);
|
||||||
|
sig[i].i = sin(i * 1.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
cplx c = {1.0, 0.0};
|
||||||
|
float phi = 0.1 * PI;
|
||||||
|
cplx t;
|
||||||
|
t.r = cos(phi); t.i = sin(phi);
|
||||||
|
|
||||||
|
float p[20], q[20];
|
||||||
|
|
||||||
|
for(int i=0; i<20; i++)
|
||||||
|
{
|
||||||
|
p[i] = cplx_abs(cplx_sum(c, sig, 100));
|
||||||
|
c = cplx_mul(c, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i=0; i<20; i++)
|
||||||
|
{
|
||||||
|
float sumr = 0.0, sumi = 0.0;
|
||||||
|
for(int j=0; j<100; j++)
|
||||||
|
{
|
||||||
|
float co = cos(i * j * 0.1 * PI), si = sin(i * j * 0.1 * PI);
|
||||||
|
sumr += co * sig[j].r - si * sig[j].i;
|
||||||
|
sumi += si * sig[j].r + co * sig[j].i;
|
||||||
|
}
|
||||||
|
q[i] = sqrt(sumr * sumr + sumi * sumi);
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
for(int i=0; i<20; i++)
|
||||||
|
{
|
||||||
|
printf("%d, %f - %f\n", i, p[i], q[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for(int i=0; i<20; i++)
|
||||||
|
assert(fabs(p[i] - q[i]) < 1.0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -27,7 +27,7 @@ Compiler::Compiler(void)
|
||||||
mByteCodeGenerator = new ByteCodeGenerator(mErrors, mLinker);
|
mByteCodeGenerator = new ByteCodeGenerator(mErrors, mLinker);
|
||||||
mInterCodeGenerator = new InterCodeGenerator(mErrors, mLinker);
|
mInterCodeGenerator = new InterCodeGenerator(mErrors, mLinker);
|
||||||
mNativeCodeGenerator = new NativeCodeGenerator(mErrors, mLinker, mCompilationUnits->mSectionCode);
|
mNativeCodeGenerator = new NativeCodeGenerator(mErrors, mLinker, mCompilationUnits->mSectionCode);
|
||||||
mInterCodeModule = new InterCodeModule();
|
mInterCodeModule = new InterCodeModule(mLinker);
|
||||||
mGlobalAnalyzer = new GlobalAnalyzer(mErrors, mLinker);
|
mGlobalAnalyzer = new GlobalAnalyzer(mErrors, mLinker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,6 +311,9 @@ bool Compiler::GenerateCode(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CompileProcedure(proc);
|
CompileProcedure(proc);
|
||||||
|
|
||||||
|
if (proc->mLinkerObject->mStackSection)
|
||||||
|
mCompilationUnits->mSectionStack->mSections.Push(proc->mLinkerObject->mStackSection);
|
||||||
}
|
}
|
||||||
|
|
||||||
LinkerObject* byteCodeObject = nullptr;
|
LinkerObject* byteCodeObject = nullptr;
|
||||||
|
|
|
@ -127,7 +127,7 @@ void GlobalAnalyzer::AutoInline(void)
|
||||||
|
|
||||||
void GlobalAnalyzer::CheckFastcall(Declaration* procDec)
|
void GlobalAnalyzer::CheckFastcall(Declaration* procDec)
|
||||||
{
|
{
|
||||||
if (!(procDec->mBase->mFlags & DTF_FASTCALL) && !(procDec->mBase->mFlags & DTF_STACKCALL))
|
if (!(procDec->mBase->mFlags & DTF_FASTCALL) && !(procDec->mBase->mFlags & DTF_STACKCALL) && (procDec->mType == DT_CONST_FUNCTION))
|
||||||
{
|
{
|
||||||
if (!(procDec->mBase->mFlags & DTF_VARIADIC) && !(procDec->mFlags & DTF_FUNC_VARIABLE) && !(procDec->mFlags & DTF_FUNC_RECURSIVE))
|
if (!(procDec->mBase->mFlags & DTF_VARIADIC) && !(procDec->mFlags & DTF_FUNC_VARIABLE) && !(procDec->mFlags & DTF_FUNC_RECURSIVE))
|
||||||
{
|
{
|
||||||
|
@ -150,6 +150,10 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec)
|
||||||
}
|
}
|
||||||
|
|
||||||
int nparams = 0;
|
int nparams = 0;
|
||||||
|
|
||||||
|
if (procDec->mBase->mBase->mType == DT_TYPE_STRUCT)
|
||||||
|
nparams += 2;
|
||||||
|
|
||||||
Declaration* dec = procDec->mBase->mParams;
|
Declaration* dec = procDec->mBase->mParams;
|
||||||
while (dec)
|
while (dec)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2702,6 +2702,13 @@ bool InterInstruction::ConstantFolding(void)
|
||||||
mNumOperands = 1;
|
mNumOperands = 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if ((mOperator == IA_AND || mOperator == IA_MUL || mOperator == IA_SHL || mOperator == IA_SHR || mOperator == IA_SAR) && mSrc[1].mIntConst == 0)
|
||||||
|
{
|
||||||
|
mCode = IC_CONSTANT;
|
||||||
|
mConst.mIntConst = 0;
|
||||||
|
mNumOperands = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -6954,6 +6961,65 @@ bool InterCodeBasicBlock::IsEqual(const InterCodeBasicBlock* block) const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InterCodeBasicBlock::CheckStaticStack(void)
|
||||||
|
{
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
|
{
|
||||||
|
if (mInstructions[i]->mCode == IC_CALL || mInstructions[i]->mCode == IC_CALL_NATIVE)
|
||||||
|
{
|
||||||
|
if (mInstructions[i]->mSrc[0].mTemp >= 0 || !mInstructions[i]->mSrc[0].mLinkerObject)
|
||||||
|
return false;
|
||||||
|
else if (!(mInstructions[i]->mSrc[0].mLinkerObject->mFlags & LOBJF_STATIC_STACK))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && !mTrueJump->CheckStaticStack())
|
||||||
|
return false;
|
||||||
|
if (mFalseJump && !mFalseJump->CheckStaticStack())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyStaticStack(InterOperand & iop, const GrowingVariableArray& localVars)
|
||||||
|
{
|
||||||
|
if (iop.mMemory == IM_LOCAL)
|
||||||
|
{
|
||||||
|
iop.mMemory = IM_GLOBAL;
|
||||||
|
iop.mLinkerObject = localVars[iop.mVarIndex]->mLinkerObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterCodeBasicBlock::CollectStaticStack(LinkerObject* lobj, const GrowingVariableArray& localVars)
|
||||||
|
{
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
|
{
|
||||||
|
if (mInstructions[i]->mCode == IC_CALL || mInstructions[i]->mCode == IC_CALL_NATIVE)
|
||||||
|
lobj->mStackSection->mSections.Push(mInstructions[i]->mSrc[0].mLinkerObject->mStackSection);
|
||||||
|
|
||||||
|
if (mInstructions[i]->mCode == IC_LOAD)
|
||||||
|
ApplyStaticStack(mInstructions[i]->mSrc[0], localVars);
|
||||||
|
else if (mInstructions[i]->mCode == IC_STORE || mInstructions[i]->mCode == IC_LEA)
|
||||||
|
ApplyStaticStack(mInstructions[i]->mSrc[1], localVars);
|
||||||
|
else if (mInstructions[i]->mCode == IC_CONSTANT && mInstructions[i]->mDst.mType == IT_POINTER)
|
||||||
|
ApplyStaticStack(mInstructions[i]->mConst, localVars);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump) mTrueJump->CollectStaticStack(lobj, localVars);
|
||||||
|
if (mFalseJump) mFalseJump->CollectStaticStack(lobj, localVars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::DropUnreachable(void)
|
bool InterCodeBasicBlock::DropUnreachable(void)
|
||||||
{
|
{
|
||||||
if (!mVisited)
|
if (!mVisited)
|
||||||
|
@ -7243,7 +7309,7 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
for (int i = 0; i < path.Size(); i++)
|
for (int i = 0; i < path.Size(); i++)
|
||||||
printf("path %d\n", path[i]->mIndex);
|
printf("path %d\n", path[i]->mIndex);
|
||||||
#endif
|
#endif
|
||||||
bool hasCall = false;
|
bool hasCall = false, hasFrame = false;
|
||||||
for (int bi = 0; bi < body.Size(); bi++)
|
for (int bi = 0; bi < body.Size(); bi++)
|
||||||
{
|
{
|
||||||
InterCodeBasicBlock* block = body[bi];
|
InterCodeBasicBlock* block = body[bi];
|
||||||
|
@ -7255,10 +7321,11 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
ins->mExpensive = false;
|
ins->mExpensive = false;
|
||||||
if (ins->mCode == IC_CALL || ins->mCode == IC_CALL_NATIVE)
|
if (ins->mCode == IC_CALL || ins->mCode == IC_CALL_NATIVE)
|
||||||
hasCall = true;
|
hasCall = true;
|
||||||
|
else if (ins->mCode == IC_PUSH_FRAME)
|
||||||
|
hasFrame = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int bi = 0; bi < path.Size(); bi++)
|
for (int bi = 0; bi < path.Size(); bi++)
|
||||||
{
|
{
|
||||||
InterCodeBasicBlock* block = path[bi];
|
InterCodeBasicBlock* block = path[bi];
|
||||||
|
@ -7270,6 +7337,10 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
|
|
||||||
if (!IsMoveable(ins->mCode))
|
if (!IsMoveable(ins->mCode))
|
||||||
ins->mInvariant = false;
|
ins->mInvariant = false;
|
||||||
|
else if (ins->mCode == IC_CONSTANT && ins->mDst.mType == IT_POINTER && ins->mConst.mMemory == IM_FRAME && hasFrame)
|
||||||
|
ins->mInvariant = false;
|
||||||
|
else if (ins->mCode == IC_LEA && ins->mSrc[1].mMemory == IM_FRAME && hasFrame)
|
||||||
|
ins->mInvariant = false;
|
||||||
else if (ins->mCode == IC_LOAD)
|
else if (ins->mCode == IC_LOAD)
|
||||||
{
|
{
|
||||||
if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile)
|
if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile)
|
||||||
|
@ -7305,6 +7376,10 @@ void InterCodeBasicBlock::InnerLoopOptimization(const NumberSet& aliasedParams)
|
||||||
ins->mInvariant = false;
|
ins->mInvariant = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (sins->mCode == IC_COPY)
|
||||||
|
{
|
||||||
|
ins->mInvariant = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7572,13 +7647,23 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
GrowingArray<InterInstructionPtr> tvalues(nullptr);
|
GrowingArray<InterInstructionPtr> tvalues(nullptr);
|
||||||
GrowingArray<int> nassigns(0);
|
GrowingArray<int> nassigns(0);
|
||||||
|
|
||||||
|
int frameLevel = 0;
|
||||||
for (int i = 0; i < mInstructions.Size(); i++)
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
{
|
{
|
||||||
InterInstruction* ins = mInstructions[i];
|
InterInstruction* ins = mInstructions[i];
|
||||||
ins->mInvariant = true;
|
ins->mInvariant = true;
|
||||||
|
|
||||||
|
if (ins->mCode == IC_PUSH_FRAME)
|
||||||
|
frameLevel++;
|
||||||
|
else if (ins->mCode == IC_POP_FRAME)
|
||||||
|
frameLevel--;
|
||||||
|
|
||||||
if (!IsMoveable(ins->mCode))
|
if (!IsMoveable(ins->mCode))
|
||||||
ins->mInvariant = false;
|
ins->mInvariant = false;
|
||||||
|
else if (ins->mCode == IC_CONSTANT && ins->mDst.mType == IT_POINTER && ins->mConst.mMemory == IM_FRAME && frameLevel != 0)
|
||||||
|
ins->mInvariant = false;
|
||||||
|
else if (ins->mCode == IC_LEA && ins->mSrc[1].mMemory == IM_FRAME && frameLevel != 0)
|
||||||
|
ins->mInvariant = false;
|
||||||
else if (ins->mCode == IC_LOAD)
|
else if (ins->mCode == IC_LOAD)
|
||||||
{
|
{
|
||||||
if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile)
|
if (ins->mSrc[0].mTemp >= 0 || ins->mVolatile)
|
||||||
|
@ -7627,6 +7712,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
|
||||||
ins->mInvariant = false;
|
ins->mInvariant = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (sins->mCode == IC_COPY)
|
||||||
|
{
|
||||||
|
ins->mInvariant = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9094,6 +9183,7 @@ void InterCodeProcedure::Close(void)
|
||||||
int vi = simpleLocals.Element(i);
|
int vi = simpleLocals.Element(i);
|
||||||
if (!complexLocals[vi])
|
if (!complexLocals[vi])
|
||||||
{
|
{
|
||||||
|
mLocalVars[vi]->mTemp = true;
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mEntryBlock->SimpleLocalToTemp(vi, AddTemporary(localTypes[vi]));
|
mEntryBlock->SimpleLocalToTemp(vi, AddTemporary(localTypes[vi]));
|
||||||
}
|
}
|
||||||
|
@ -9122,6 +9212,7 @@ void InterCodeProcedure::Close(void)
|
||||||
TempForwarding();
|
TempForwarding();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BuildLoopPrefix();
|
BuildLoopPrefix();
|
||||||
DisassembleDebug("added dominators");
|
DisassembleDebug("added dominators");
|
||||||
|
|
||||||
|
@ -9366,6 +9457,28 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
ResetVisited();
|
||||||
|
if (mEntryBlock->CheckStaticStack())
|
||||||
|
{
|
||||||
|
mLinkerObject->mFlags |= LOBJF_STATIC_STACK;
|
||||||
|
mLinkerObject->mStackSection = mModule->mLinker->AddSection(mIdent, LST_STATIC_STACK);
|
||||||
|
|
||||||
|
for (int i = 0; i < mLocalVars.Size(); i++)
|
||||||
|
{
|
||||||
|
InterVariable* var(mLocalVars[i]);
|
||||||
|
if (var && !var->mTemp && !var->mLinkerObject)
|
||||||
|
{
|
||||||
|
var->mLinkerObject = mModule->mLinker->AddObject(mLocation, var->mIdent, mLinkerObject->mStackSection, LOT_BSS);
|
||||||
|
var->mLinkerObject->AddSpace(var->mSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->CollectStaticStack(mLinkerObject, mLocalVars);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
MapVariables();
|
MapVariables();
|
||||||
|
|
||||||
DisassembleDebug("mapped variabled");
|
DisassembleDebug("mapped variabled");
|
||||||
|
@ -9379,6 +9492,7 @@ void InterCodeProcedure::Close(void)
|
||||||
MergeBasicBlocks();
|
MergeBasicBlocks();
|
||||||
BuildTraces(false);
|
BuildTraces(false);
|
||||||
DisassembleDebug("Merged basic blocks");
|
DisassembleDebug("Merged basic blocks");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InterCodeProcedure::AddCalledFunction(InterCodeProcedure* proc)
|
void InterCodeProcedure::AddCalledFunction(InterCodeProcedure* proc)
|
||||||
|
@ -9412,7 +9526,7 @@ void InterCodeProcedure::MapVariables(void)
|
||||||
mLocalSize = 0;
|
mLocalSize = 0;
|
||||||
for (int i = 0; i < mLocalVars.Size(); i++)
|
for (int i = 0; i < mLocalVars.Size(); i++)
|
||||||
{
|
{
|
||||||
if (mLocalVars[i] && mLocalVars[i]->mUsed)
|
if (mLocalVars[i] && mLocalVars[i]->mUsed && !mLocalVars[i]->mLinkerObject)
|
||||||
{
|
{
|
||||||
mLocalVars[i]->mOffset = mLocalSize;
|
mLocalVars[i]->mOffset = mLocalSize;
|
||||||
mLocalSize += mLocalVars[i]->mSize;
|
mLocalSize += mLocalVars[i]->mSize;
|
||||||
|
@ -9765,8 +9879,8 @@ void InterCodeProcedure::Disassemble(const char* name, bool dumpSets)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
InterCodeModule::InterCodeModule(void)
|
InterCodeModule::InterCodeModule(Linker * linker)
|
||||||
: mGlobalVars(nullptr), mProcedures(nullptr), mCompilerOptions(0)
|
: mLinker(linker), mGlobalVars(nullptr), mProcedures(nullptr), mCompilerOptions(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -223,14 +223,14 @@ class InterVariable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Location mLocation;
|
Location mLocation;
|
||||||
bool mUsed, mAliased;
|
bool mUsed, mAliased, mTemp;
|
||||||
int mIndex, mSize, mOffset, mAddr;
|
int mIndex, mSize, mOffset, mAddr;
|
||||||
int mNumReferences;
|
int mNumReferences;
|
||||||
const Ident * mIdent;
|
const Ident * mIdent;
|
||||||
LinkerObject * mLinkerObject;
|
LinkerObject * mLinkerObject;
|
||||||
|
|
||||||
InterVariable(void)
|
InterVariable(void)
|
||||||
: mUsed(false), mAliased(false), mIndex(-1), mSize(0), mOffset(0), mIdent(nullptr), mLinkerObject(nullptr)
|
: mUsed(false), mAliased(false), mTemp(false), mIndex(-1), mSize(0), mOffset(0), mIdent(nullptr), mLinkerObject(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -460,6 +460,9 @@ public:
|
||||||
bool OptimizeIntervalCompare(void);
|
bool OptimizeIntervalCompare(void);
|
||||||
|
|
||||||
bool DropUnreachable(void);
|
bool DropUnreachable(void);
|
||||||
|
|
||||||
|
bool CheckStaticStack(void);
|
||||||
|
void CollectStaticStack(LinkerObject * lobj, const GrowingVariableArray& localVars);
|
||||||
};
|
};
|
||||||
|
|
||||||
class InterCodeModule;
|
class InterCodeModule;
|
||||||
|
@ -533,7 +536,7 @@ protected:
|
||||||
class InterCodeModule
|
class InterCodeModule
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
InterCodeModule(void);
|
InterCodeModule(Linker * linker);
|
||||||
~InterCodeModule(void);
|
~InterCodeModule(void);
|
||||||
|
|
||||||
bool Disassemble(const char* name);
|
bool Disassemble(const char* name);
|
||||||
|
@ -542,6 +545,8 @@ public:
|
||||||
|
|
||||||
GrowingVariableArray mGlobalVars;
|
GrowingVariableArray mGlobalVars;
|
||||||
|
|
||||||
|
Linker * mLinker;
|
||||||
|
|
||||||
uint64 mCompilerOptions;
|
uint64 mCompilerOptions;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,11 +8,11 @@ LinkerRegion::LinkerRegion(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LinkerSection::LinkerSection(void)
|
LinkerSection::LinkerSection(void)
|
||||||
: mObjects(nullptr)
|
: mObjects(nullptr), mSections(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LinkerObject::LinkerObject(void)
|
LinkerObject::LinkerObject(void)
|
||||||
: mReferences(nullptr), mNumTemporaries(0), mSize(0), mAlignment(1)
|
: mReferences(nullptr), mNumTemporaries(0), mSize(0), mAlignment(1), mStackSection(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LinkerObject::~LinkerObject(void)
|
LinkerObject::~LinkerObject(void)
|
||||||
|
@ -235,6 +235,42 @@ bool LinkerRegion::Allocate(LinkerObject* lobj)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LinkerRegion::PlaceStackSection(LinkerSection* stackSection, LinkerSection* section)
|
||||||
|
{
|
||||||
|
if (!section->mEnd)
|
||||||
|
{
|
||||||
|
int start = stackSection->mEnd;
|
||||||
|
|
||||||
|
for(int i=0; i<section->mSections.Size(); i++)
|
||||||
|
{
|
||||||
|
PlaceStackSection(stackSection, section->mSections[i]);
|
||||||
|
if (section->mSections[i]->mStart < start)
|
||||||
|
start = section->mSections[i]->mStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
section->mStart = start;
|
||||||
|
section->mEnd = start;
|
||||||
|
|
||||||
|
for (int i = 0; i < section->mObjects.Size(); i++)
|
||||||
|
{
|
||||||
|
LinkerObject* lobj = section->mObjects[i];
|
||||||
|
if (lobj->mFlags & LOBJF_REFERENCED)
|
||||||
|
{
|
||||||
|
section->mStart -= lobj->mSize;
|
||||||
|
section->mSize += lobj->mSize;
|
||||||
|
|
||||||
|
lobj->mFlags |= LOBJF_PLACED;
|
||||||
|
lobj->mAddress = section->mStart;
|
||||||
|
lobj->mRefAddress = section->mStart + mReloc;
|
||||||
|
lobj->mRegion = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stackSection->mStart > section->mStart)
|
||||||
|
stackSection->mStart = section->mStart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Linker::Link(void)
|
void Linker::Link(void)
|
||||||
{
|
{
|
||||||
if (mErrors->mErrorCount == 0)
|
if (mErrors->mErrorCount == 0)
|
||||||
|
@ -305,9 +341,14 @@ void Linker::Link(void)
|
||||||
|
|
||||||
if (lsec->mType == LST_STACK)
|
if (lsec->mType == LST_STACK)
|
||||||
{
|
{
|
||||||
lsec->mStart = lrgn->mEnd - lsec->mSize;
|
lsec->mStart = lsec->mEnd = lrgn->mEnd;
|
||||||
lsec->mEnd = lrgn->mEnd;
|
lrgn->mEnd = lsec->mStart - lsec->mSize;
|
||||||
lrgn->mEnd = lsec->mStart;
|
|
||||||
|
for(int i=0; i<lsec->mSections.Size(); i++)
|
||||||
|
lrgn->PlaceStackSection(lsec, lsec->mSections[i]);
|
||||||
|
|
||||||
|
lsec->mEnd = lsec->mStart;
|
||||||
|
lsec->mStart = lrgn->mEnd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,7 +481,8 @@ static const char* LinkerSectionTypeNames[] = {
|
||||||
"DATA",
|
"DATA",
|
||||||
"BSS",
|
"BSS",
|
||||||
"HEAP",
|
"HEAP",
|
||||||
"STACK"
|
"STACK",
|
||||||
|
"SSTACK"
|
||||||
};
|
};
|
||||||
|
|
||||||
bool Linker::WriteBinFile(const char* filename)
|
bool Linker::WriteBinFile(const char* filename)
|
||||||
|
|
|
@ -30,7 +30,9 @@ enum LinkerSectionType
|
||||||
LST_DATA,
|
LST_DATA,
|
||||||
LST_BSS,
|
LST_BSS,
|
||||||
LST_HEAP,
|
LST_HEAP,
|
||||||
LST_STACK
|
LST_STACK,
|
||||||
|
LST_STATIC_STACK
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ZeroPageSet
|
struct ZeroPageSet
|
||||||
|
@ -90,6 +92,7 @@ public:
|
||||||
GrowingArray<FreeChunk> mFreeChunks;
|
GrowingArray<FreeChunk> mFreeChunks;
|
||||||
|
|
||||||
bool Allocate(LinkerObject* obj);
|
bool Allocate(LinkerObject* obj);
|
||||||
|
void PlaceStackSection(LinkerSection* stackSection, LinkerSection* section);
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32 LREF_LOWBYTE = 0x00000001;
|
static const uint32 LREF_LOWBYTE = 0x00000001;
|
||||||
|
@ -111,7 +114,7 @@ public:
|
||||||
const Ident* mIdent;
|
const Ident* mIdent;
|
||||||
|
|
||||||
GrowingArray <LinkerObject*> mObjects;
|
GrowingArray <LinkerObject*> mObjects;
|
||||||
|
GrowingArray <LinkerSection*> mSections;
|
||||||
|
|
||||||
int mStart, mEnd, mSize;
|
int mStart, mEnd, mSize;
|
||||||
LinkerSectionType mType;
|
LinkerSectionType mType;
|
||||||
|
@ -119,31 +122,32 @@ public:
|
||||||
LinkerSection(void);
|
LinkerSection(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32 LOBJF_REFERENCED = 0x00000001;
|
static const uint32 LOBJF_REFERENCED = 0x00000001;
|
||||||
static const uint32 LOBJF_PLACED = 0x00000002;
|
static const uint32 LOBJF_PLACED = 0x00000002;
|
||||||
static const uint32 LOBJF_NO_FRAME = 0x00000004;
|
static const uint32 LOBJF_NO_FRAME = 0x00000004;
|
||||||
static const uint32 LOBJF_INLINE = 0x00000008;
|
static const uint32 LOBJF_INLINE = 0x00000008;
|
||||||
static const uint32 LOBJF_CONST = 0x00000010;
|
static const uint32 LOBJF_CONST = 0x00000010;
|
||||||
static const uint32 LOBJF_RELEVANT = 0x00000020;
|
static const uint32 LOBJF_RELEVANT = 0x00000020;
|
||||||
|
static const uint32 LOBJF_STATIC_STACK = 0x00000040;
|
||||||
|
|
||||||
class LinkerObject
|
class LinkerObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Location mLocation;
|
Location mLocation;
|
||||||
const Ident * mIdent;
|
const Ident * mIdent;
|
||||||
LinkerObjectType mType;
|
LinkerObjectType mType;
|
||||||
int mID;
|
int mID;
|
||||||
int mAddress, mRefAddress;
|
int mAddress, mRefAddress;
|
||||||
int mSize, mAlignment;
|
int mSize, mAlignment;
|
||||||
LinkerSection * mSection;
|
LinkerSection * mSection;
|
||||||
LinkerRegion * mRegion;
|
LinkerRegion * mRegion;
|
||||||
uint8 * mData;
|
uint8 * mData;
|
||||||
InterCodeProcedure* mProc;
|
InterCodeProcedure * mProc;
|
||||||
uint32 mFlags;
|
uint32 mFlags;
|
||||||
uint8 mTemporaries[16], mTempSizes[16];
|
uint8 mTemporaries[16], mTempSizes[16];
|
||||||
int mNumTemporaries;
|
int mNumTemporaries;
|
||||||
ZeroPageSet mZeroPageSet;
|
ZeroPageSet mZeroPageSet;
|
||||||
|
LinkerSection * mStackSection;
|
||||||
|
|
||||||
LinkerObject(void);
|
LinkerObject(void);
|
||||||
~LinkerObject(void);
|
~LinkerObject(void);
|
||||||
|
|
|
@ -12135,6 +12135,7 @@ bool NativeCodeBasicBlock::MoveLoadStoreUp(int at)
|
||||||
}
|
}
|
||||||
mIns[j - 1].mLive |= LIVE_CPU_REG_A;
|
mIns[j - 1].mLive |= LIVE_CPU_REG_A;
|
||||||
mIns[j] = mIns[at + 1];
|
mIns[j] = mIns[at + 1];
|
||||||
|
mIns[j].mLive |= LIVE_CPU_REG_A;
|
||||||
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
|
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.4.101");
|
strcpy(strProductVersion, "1.5.102");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint32_t length = sizeof(basePath);
|
uint32_t length = sizeof(basePath);
|
||||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,4,101,0
|
FILEVERSION 1,5,102,0
|
||||||
PRODUCTVERSION 1,4,101,0
|
PRODUCTVERSION 1,5,102,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -43,12 +43,12 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "oscar64"
|
VALUE "CompanyName", "oscar64"
|
||||||
VALUE "FileDescription", "oscar64 compiler"
|
VALUE "FileDescription", "oscar64 compiler"
|
||||||
VALUE "FileVersion", "1.4.101.0"
|
VALUE "FileVersion", "1.5.102.0"
|
||||||
VALUE "InternalName", "oscar64.exe"
|
VALUE "InternalName", "oscar64.exe"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2021"
|
VALUE "LegalCopyright", "Copyright (C) 2021"
|
||||||
VALUE "OriginalFilename", "oscar64.exe"
|
VALUE "OriginalFilename", "oscar64.exe"
|
||||||
VALUE "ProductName", "oscar64"
|
VALUE "ProductName", "oscar64"
|
||||||
VALUE "ProductVersion", "1.4.101.0"
|
VALUE "ProductVersion", "1.5.102.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -3945,15 +3945,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{015F3702-7631-43CC-8735-41950474E793}"
|
"ProductCode" = "8:{6DCF4711-61FA-455B-87CE-A5383B7EEB4E}"
|
||||||
"PackageCode" = "8:{7D690EF3-EE02-4845-BCF6-64CB0E42ED95}"
|
"PackageCode" = "8:{20057AF4-DA5C-4190-B17D-094F83470BE1}"
|
||||||
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
||||||
"AspNetVersion" = "8:2.0.50727.0"
|
"AspNetVersion" = "8:2.0.50727.0"
|
||||||
"RestartWWWService" = "11:FALSE"
|
"RestartWWWService" = "11:FALSE"
|
||||||
"RemovePreviousVersions" = "11:TRUE"
|
"RemovePreviousVersions" = "11:TRUE"
|
||||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||||
"InstallAllUsers" = "11:FALSE"
|
"InstallAllUsers" = "11:FALSE"
|
||||||
"ProductVersion" = "8:1.4.101"
|
"ProductVersion" = "8:1.5.102"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
|
Loading…
Reference in New Issue