Fix aliasing problem when auto inlining non early embedded assembly stubs
This commit is contained in:
parent
32f0b8c6f3
commit
fc2095301d
|
@ -54,6 +54,23 @@ LinkerObject::~LinkerObject(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LinkerObject* LinkerObject::CloneAssembler(Linker* linker) const
|
||||||
|
{
|
||||||
|
LinkerObject* lo = linker->AddObject(mLocation, mIdent, mSection, mType, mAlignment);
|
||||||
|
lo->AddData(mData, mSize);
|
||||||
|
lo->mFlags = mFlags;
|
||||||
|
|
||||||
|
for (int i = 0; i < mReferences.Size(); i++)
|
||||||
|
{
|
||||||
|
LinkerReference ref = *(mReferences[i]);
|
||||||
|
if (ref.mObject == this) ref.mObject = lo;
|
||||||
|
if (ref.mRefObject == this) ref.mRefObject = lo;
|
||||||
|
lo->AddReference(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
return lo;
|
||||||
|
}
|
||||||
|
|
||||||
void LinkerObject::AddReference(const LinkerReference& ref)
|
void LinkerObject::AddReference(const LinkerReference& ref)
|
||||||
{
|
{
|
||||||
LinkerReference* nref = new LinkerReference(ref);
|
LinkerReference* nref = new LinkerReference(ref);
|
||||||
|
|
|
@ -212,6 +212,8 @@ public:
|
||||||
LinkerObject(void);
|
LinkerObject(void);
|
||||||
~LinkerObject(void);
|
~LinkerObject(void);
|
||||||
|
|
||||||
|
LinkerObject* CloneAssembler(Linker * linker) const;
|
||||||
|
|
||||||
void AddData(const uint8* data, int size);
|
void AddData(const uint8* data, int size);
|
||||||
void AddLocations(const ExpandingArray<CodeLocation>& locations);
|
void AddLocations(const ExpandingArray<CodeLocation>& locations);
|
||||||
uint8* AddSpace(int size);
|
uint8* AddSpace(int size);
|
||||||
|
|
|
@ -14281,6 +14281,11 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, NativeCodePro
|
||||||
{
|
{
|
||||||
if (ins->mCode == IC_ASSEMBLER)
|
if (ins->mCode == IC_ASSEMBLER)
|
||||||
{
|
{
|
||||||
|
if (ins->mNumOperands > 1 && ins->mSrc[0].mLinkerObject->mNumTemporaries)
|
||||||
|
{
|
||||||
|
ins->mSrc[0].mLinkerObject = ins->mSrc[0].mLinkerObject->CloneAssembler(proc->mModule->mLinker);
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 1; i < ins->mNumOperands; i++)
|
for (int i = 1; i < ins->mNumOperands; i++)
|
||||||
{
|
{
|
||||||
if (ins->mSrc[i].mTemp < 0)
|
if (ins->mSrc[i].mTemp < 0)
|
||||||
|
@ -53291,7 +53296,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
|
|
||||||
mInterProc->mLinkerObject->mNativeProc = this;
|
mInterProc->mLinkerObject->mNativeProc = this;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "equipment_random");
|
CheckFunc = !strcmp(mIdent->mString, "putpch");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
|
Loading…
Reference in New Issue