Fix aliasing problem when auto inlining non early embedded assembly stubs

This commit is contained in:
drmortalwombat 2025-03-16 20:29:03 +01:00
parent 32f0b8c6f3
commit fc2095301d
3 changed files with 25 additions and 1 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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];