From 72d2fc1face964bd4c5383092f26808bf1f0c81a Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 15 Apr 2022 11:06:49 +0200 Subject: [PATCH] Reverse integer range limit calculation --- autotest/arrayindexintrangecheck.c | 22 ++++ autotest/stdlibtest.c | 1 + include/stdio.c | 2 +- oscar64/InterCode.cpp | 204 ++++++++++++++++++++++++++--- oscar64/InterCode.h | 10 +- oscar64/MachineTypes.h | 4 + oscar64/NativeCodeGenerator.cpp | 10 +- oscar64/Type.h | 24 ---- oscar64/oscar64.cpp | 2 +- oscar64/oscar64.rc | 8 +- oscar64/oscar64.vcxproj | 1 - oscar64/oscar64.vcxproj.filters | 3 - oscar64setup/oscar64setup.vdproj | 6 +- 13 files changed, 241 insertions(+), 56 deletions(-) create mode 100644 autotest/arrayindexintrangecheck.c delete mode 100644 oscar64/Type.h diff --git a/autotest/arrayindexintrangecheck.c b/autotest/arrayindexintrangecheck.c new file mode 100644 index 0000000..e71ce42 --- /dev/null +++ b/autotest/arrayindexintrangecheck.c @@ -0,0 +1,22 @@ +int a[10]; + +int get(int i) +{ + return a[i]; +} + +void put(int i, int x) +{ + a[i] = x; +} + +int main(void) +{ + for(int j=0; j<10; j++) + put(j, j); + int s = -45; + for(int j=0; j<10; j++) + s += get[j]; + return s; +} + diff --git a/autotest/stdlibtest.c b/autotest/stdlibtest.c index 260bb32..2409c2b 100644 --- a/autotest/stdlibtest.c +++ b/autotest/stdlibtest.c @@ -1,5 +1,6 @@ // stdlibtest + #include #include #include diff --git a/include/stdio.c b/include/stdio.c index a513a77..adc905f 100644 --- a/include/stdio.c +++ b/include/stdio.c @@ -158,7 +158,7 @@ struct sinfo bool sign, left, prefix; }; -inline int nformi(const sinfo * si, char * str, int v, bool s) +int nformi(const sinfo * si, char * str, int v, bool s) { char * sp = str; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6e33d97..341be81 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -26,6 +26,13 @@ IntegerValueRange::IntegerValueRange(void) IntegerValueRange::~IntegerValueRange(void) {} +void IntegerValueRange::Reset(void) +{ + mMinState = S_UNKNOWN; + mMaxState = S_UNKNOWN; +} + + bool IntegerValueRange::Same(const IntegerValueRange& range) const { if (mMinState == range.mMinState && mMaxState == range.mMaxState) @@ -83,7 +90,15 @@ bool IntegerValueRange::IsConstant(void) const return mMinState == S_BOUND && mMaxState == S_BOUND && mMinValue == mMaxValue; } -bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head) +void IntegerValueRange::Limit(const IntegerValueRange& range) +{ + if (range.mMinState == S_BOUND) + LimitMin(range.mMinValue); + if (range.mMaxState == S_BOUND) + LimitMax(range.mMaxValue); +} + +bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head, bool initial) { bool changed = false; @@ -118,12 +133,12 @@ bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head) } else if (range.mMinValue < mMinValue) { - if (range.mMinState == S_WEAK) + if (range.mMinState == S_WEAK && (initial || !head)) mMinState = S_WEAK; mMinValue = range.mMinValue; changed = true; } - else if (mMinState == S_BOUND && range.mMinState == S_WEAK && !head) + else if (mMinState == S_BOUND && range.mMinState == S_WEAK && (initial || !head)) { mMinState = S_WEAK; changed = true; @@ -161,12 +176,12 @@ bool IntegerValueRange::Merge(const IntegerValueRange& range, bool head) } else if (range.mMaxValue > mMaxValue) { - if (range.mMaxState == S_WEAK) + if (range.mMaxState == S_WEAK && (initial || !head)) mMaxState = S_WEAK; mMaxValue = range.mMaxValue; changed = true; } - else if (mMaxState == S_BOUND && range.mMaxState == S_WEAK && !head) + else if (mMaxState == S_BOUND && range.mMaxState == S_WEAK && (initial || !head)) { mMaxState = S_WEAK; changed = true; @@ -3443,7 +3458,7 @@ void InterInstruction::Disassemble(FILE* file) InterCodeBasicBlock::InterCodeBasicBlock(void) : mInstructions(nullptr), mEntryRenameTable(-1), mExitRenameTable(-1), mMergeTValues(nullptr), mTrueJump(nullptr), mFalseJump(nullptr), mLoopPrefix(nullptr), mDominator(nullptr), - mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mEntryBlocks(nullptr), mLoadStoreInstructions(nullptr), mLoopPathBlocks(nullptr) + mEntryValueRange(IntegerValueRange()), mTrueValueRange(IntegerValueRange()), mFalseValueRange(IntegerValueRange()), mLocalValueRange(IntegerValueRange()), mReverseValueRange(IntegerValueRange()), mEntryBlocks(nullptr), mLoadStoreInstructions(nullptr), mLoopPathBlocks(nullptr) { mInPath = false; mLoopHead = false; @@ -3602,7 +3617,7 @@ void InterCodeBasicBlock::GenerateTraces(bool expand) if (mFalseJump) mFalseJump->mNumEntries++; } - else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump, mTrueJump)) + else if (mTrueJump && !mFalseJump && ((expand && mTrueJump->mInstructions.Size() < 10 && mTrueJump->mInstructions.Size() > 1 && !mLoopHead) || mTrueJump->mNumEntries == 1) && !mTrueJump->mLoopHead && !IsInfiniteLoop(mTrueJump, mTrueJump)) { mTrueJump->mNumEntries--; int n = mTrueJump->mNumEntries; @@ -4797,7 +4812,8 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void) } } -bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void) + +bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(bool initial) { bool changed = false; @@ -4816,7 +4832,7 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void) else { for (int i = 0; i < mLocalValueRange.Size(); i++) - mLocalValueRange[i].Merge(range[i], mLoopHead); + mLocalValueRange[i].Merge(range[i], mLoopHead, initial); } } @@ -4838,9 +4854,9 @@ bool InterCodeBasicBlock::BuildGlobalIntegerRangeSets(void) UpdateLocalIntegerRangeSets(); } - if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets()) + if (mTrueJump && mTrueJump->BuildGlobalIntegerRangeSets(initial)) changed = true; - if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets()) + if (mFalseJump && mFalseJump->BuildGlobalIntegerRangeSets(initial)) changed = true; } @@ -5330,6 +5346,131 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void) } +#if 1 + mReverseValueRange.SetSize(mLocalValueRange.Size()); + GrowingArray msize(0); + msize.SetSize(mLocalValueRange.Size()); + + for (int i = 0; i < mReverseValueRange.Size(); i++) + mReverseValueRange[i].Reset(); + + for (int i = sz - 1; i >= 0; i--) + { + InterInstruction* ins(mInstructions[i]); + if (ins->mCode == IC_LOAD && ins->mSrc[0].mMemory == IM_INDIRECT && ins->mSrc[0].mTemp >= 0) + msize[ins->mSrc[0].mTemp] = int64max(msize[ins->mSrc[0].mTemp], ins->mSrc[0].mIntConst + InterTypeSize[ins->mDst.mType]); + else if (ins->mCode == IC_STORE && ins->mSrc[1].mMemory == IM_INDIRECT && ins->mSrc[1].mTemp >= 0) + msize[ins->mSrc[1].mTemp] = int64max(msize[ins->mSrc[1].mTemp], ins->mSrc[1].mIntConst + InterTypeSize[ins->mSrc[0].mType]); + else if (ins->mCode == IC_LEA && ins->mSrc[1].mMemory != IM_INDIRECT && ins->mSrc[0].mTemp >= 0 && msize[ins->mDst.mTemp] > 0) + { + int asize = 0; + if (ins->mSrc[1].mMemory == IM_GLOBAL) + asize = ins->mSrc[1].mLinkerObject->mSize; + + if (asize > 0) + { + mReverseValueRange[ins->mSrc[0].mTemp].LimitMin(0); + mReverseValueRange[ins->mSrc[0].mTemp].LimitMax(asize - msize[ins->mDst.mTemp]); + } + } + + if (ins->mDst.mTemp >= 0) + { + ins->mDst.mRange.Limit(mReverseValueRange[ins->mDst.mTemp]); + mReverseValueRange[ins->mDst.mTemp].Reset(); + IntegerValueRange& vr(ins->mDst.mRange); + + switch (ins->mCode) + { + case IC_BINARY_OPERATOR: + switch (ins->mOperator) + { + case IA_SHL: + if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMin(vr.mMinValue >> ins->mSrc[0].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMax(vr.mMaxValue >> ins->mSrc[0].mIntConst); + mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange); + } + break; + case IA_SUB: + if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMin(vr.mMinValue + ins->mSrc[0].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMax(vr.mMaxValue + ins->mSrc[0].mIntConst); + mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange); + } + break; + case IA_ADD: + if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMin(vr.mMinValue - ins->mSrc[0].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMax(vr.mMaxValue - ins->mSrc[0].mIntConst); + mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange); + } + else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[0].mRange.LimitMin(vr.mMinValue - ins->mSrc[1].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[0].mRange.LimitMax(vr.mMaxValue - ins->mSrc[1].mIntConst); + mReverseValueRange[ins->mSrc[0].mTemp].Limit(ins->mSrc[0].mRange); + } + break; + case IA_MUL: + if (ins->mSrc[0].mTemp < 0 && ins->mSrc[1].mTemp >= 0 && ins->mSrc[0].mIntConst > 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMin(vr.mMinValue / ins->mSrc[0].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[1].mRange.LimitMax(vr.mMaxValue / ins->mSrc[0].mIntConst); + mReverseValueRange[ins->mSrc[1].mTemp].Limit(ins->mSrc[1].mRange); + } + else if (ins->mSrc[1].mTemp < 0 && ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mIntConst > 0) + { + if (vr.mMinState == IntegerValueRange::S_BOUND) + ins->mSrc[0].mRange.LimitMin(vr.mMinValue / ins->mSrc[1].mIntConst); + if (vr.mMaxState == IntegerValueRange::S_BOUND) + ins->mSrc[0].mRange.LimitMax(vr.mMaxValue / ins->mSrc[1].mIntConst); + mReverseValueRange[ins->mSrc[0].mTemp].Limit(ins->mSrc[0].mRange); + } + break; + } + break; + + case IC_LEA: + if (ins->mSrc[1].mMemory == IM_INDIRECT && msize[ins->mDst.mTemp] > 0) + { + if (ins->mSrc[0].mTemp < 0) + { + msize[ins->mSrc[1].mTemp] = msize[ins->mDst.mTemp] - ins->mSrc[0].mIntConst; + } + else if (ins->mSrc[0].mRange.mMinState == IntegerValueRange::S_BOUND) + { + msize[ins->mSrc[1].mTemp] = msize[ins->mDst.mTemp] - ins->mSrc[0].mRange.mMinValue; + } + } + break; + } + + } + + for (int i = 0; i < ins->mNumOperands; i++) + { + if (ins->mSrc[i].mTemp >= 0) + ins->mSrc[i].mRange.Limit(mReverseValueRange[ins->mSrc[i].mTemp]); + } + + if (ins->mDst.mTemp >= 0) + msize[ins->mDst.mTemp] = 0; + } +#endif mTrueValueRange = mLocalValueRange; mFalseValueRange = mLocalValueRange; @@ -7079,11 +7220,10 @@ bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void) if (mins->mCode == IC_LOAD_TEMPORARY) { - int ttemp = mins->mDst.mTemp; int stemp = mins->mSrc[0].mTemp; - if (!IsTempModifiedOnPath(ttemp, i + 1) && !IsTempModifiedOnPath(stemp, i + 1)) + if (!IsTempModifiedOnPath(ttemp, i + 1) && !IsTempModifiedOnPath(stemp, i + 1) && !tblock->mExitRequiredTemps[stemp]) { int j = 0; while (j < tblock->mInstructions.Size() && @@ -7107,6 +7247,8 @@ bool InterCodeBasicBlock::ForwardDiamondMovedTemp(void) nins->mSrc[0].mType = mins->mDst.mType; fblock->mInstructions.Insert(0, nins); + tblock->mExitRequiredTemps += stemp; + changed = true; } } @@ -9114,6 +9256,25 @@ void InterCodeBasicBlock::PeepholeOptimization(void) mInstructions[i + 1]->mCode = IC_NONE; mInstructions[i + 1]->mNumOperands = 0; changed = true; } + else if ( + mInstructions[i + 0]->mCode == IC_LEA && mInstructions[i + 0]->mSrc[1].mMemory == IM_GLOBAL && + mInstructions[i + 1]->mCode == IC_LEA && mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal && + mInstructions[i + 0]->mSrc[0].IsUByte() && mInstructions[i + 1]->mSrc[0].IsUByte() && mInstructions[i + 0]->mSrc[0].mRange.mMaxValue + mInstructions[i + 1]->mSrc[0].mRange.mMaxValue < 252) + { + mInstructions[i + 1]->mSrc[1] = mInstructions[i + 0]->mSrc[1]; + + mInstructions[i + 0]->mCode = IC_BINARY_OPERATOR; + mInstructions[i + 0]->mOperator = IA_ADD; + mInstructions[i + 0]->mSrc[1] = mInstructions[i + 1]->mSrc[0]; + mInstructions[i + 0]->mDst.mType = IT_INT16; + mInstructions[i + 0]->mDst.mRange.mMaxState = IntegerValueRange::S_BOUND; + mInstructions[i + 0]->mDst.mRange.mMaxValue = mInstructions[i + 0]->mSrc[1].mRange.mMaxValue + mInstructions[i + 0]->mSrc[0].mRange.mMaxValue; + mInstructions[i + 0]->mDst.mRange.mMinState = IntegerValueRange::S_BOUND; + mInstructions[i + 0]->mDst.mRange.mMinValue = 0; + + mInstructions[i + 1]->mSrc[0] = mInstructions[i + 0]->mDst; + changed = true; + } #if 1 // Postincrement artifact @@ -10060,7 +10221,14 @@ void InterCodeProcedure::Close(void) DisassembleDebug("tt"); ResetVisited(); - } while (mEntryBlock->BuildGlobalIntegerRangeSets()); + } while (mEntryBlock->BuildGlobalIntegerRangeSets(true)); + + do { + DisassembleDebug("tq"); + + ResetVisited(); + } while (mEntryBlock->BuildGlobalIntegerRangeSets(false)); + DisassembleDebug("Estimated value range"); #if 1 @@ -10071,7 +10239,13 @@ void InterCodeProcedure::Close(void) DisassembleDebug("tr"); ResetVisited(); - } while (mEntryBlock->BuildGlobalIntegerRangeSets()); + } while (mEntryBlock->BuildGlobalIntegerRangeSets(true)); + + do { + DisassembleDebug("tr"); + + ResetVisited(); + } while (mEntryBlock->BuildGlobalIntegerRangeSets(false)); DisassembleDebug("Estimated value range 2"); #endif diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index d925cd0..22e8345 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -136,6 +136,8 @@ public: IntegerValueRange(void); ~IntegerValueRange(void); + void Reset(void); + int64 mMinValue, mMaxValue; enum State @@ -147,7 +149,9 @@ public: } mMinState, mMaxState; bool Same(const IntegerValueRange& range) const; - bool Merge(const IntegerValueRange& range, bool head); + bool Merge(const IntegerValueRange& range, bool head, bool initial); + + void Limit(const IntegerValueRange& range); bool IsConstant(void) const; @@ -345,7 +349,7 @@ public: GrowingInstructionArray mLoadStoreInstructions; - GrowingIntegerValueRangeArray mEntryValueRange, mTrueValueRange, mFalseValueRange, mLocalValueRange; + GrowingIntegerValueRangeArray mEntryValueRange, mTrueValueRange, mFalseValueRange, mLocalValueRange, mReverseValueRange; GrowingArray mEntryBlocks, mLoopPathBlocks; @@ -395,7 +399,7 @@ public: void RestartLocalIntegerRangeSets(void); void BuildLocalIntegerRangeSets(int num); void UpdateLocalIntegerRangeSets(void); - bool BuildGlobalIntegerRangeSets(void); + bool BuildGlobalIntegerRangeSets(bool initial); void SimplifyIntegerRangeRelops(void); GrowingIntArray mEntryRenameTable; diff --git a/oscar64/MachineTypes.h b/oscar64/MachineTypes.h index 59d2cbd..58d9f40 100644 --- a/oscar64/MachineTypes.h +++ b/oscar64/MachineTypes.h @@ -95,3 +95,7 @@ extern uint8 BC_REG_LOCALS; extern uint8 BC_REG_TMP; extern uint8 BC_REG_TMP_SAVED; +inline int64 int64max(int64 a, int64 b) +{ + return a > b ? a : b; +} \ No newline at end of file diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 6e78a13..a9dc34b 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -11530,6 +11530,7 @@ bool NativeCodeBasicBlock::PatchForwardSumYPointer(const NativeCodeBasicBlock* b bool done = !(ins.mLive & LIVE_MEM); ins.mAddress = base; + ins.mFlags &= ~NCIF_YZERO; if (ins.mLive & LIVE_CPU_REG_Y) mIns.Insert(at + 1, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, yval)); @@ -11562,6 +11563,13 @@ bool NativeCodeBasicBlock::PatchForwardSumYPointer(const NativeCodeBasicBlock* b changed = true; if (mFalseJump && mFalseJump->PatchForwardSumYPointer(block, reg, base, index, 0, yval)) changed = true; + + if (changed) + { + mEntryRequiredRegs += base; + mEntryRequiredRegs += base + 1; + mEntryRequiredRegs += index; + } } return changed; @@ -12985,7 +12993,7 @@ bool NativeCodeBasicBlock::MoveStoreXUp(int at) } else { - if (mIns[at - 1].mType == ASMIT_LDX || mIns[at - 1].mType == ASMIT_TAX) + if (mIns[at - 1].mType == ASMIT_LDX || mIns[at - 1].mType == ASMIT_TAX || mIns[at - 1].mType == ASMIT_TXA) return done; else if (mIns[at - 1].ChangesXReg() || mIns[at - 1].mType == ASMIT_STX) return done; diff --git a/oscar64/Type.h b/oscar64/Type.h deleted file mode 100644 index 5a27b95..0000000 --- a/oscar64/Type.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -enum TType -{ - TT_VOID, - TT_NULL, - TT_BOOL, - TT_INTEGER, - TT_FLOAT, - TT_POINTER, - TT_ARRAY, - TT_STRUCT, - TT_UNION, - TT_FUNCTION -}; - -class Type -{ -public: - TType mType; - Type* mBase; - Scope* mScope; -}; - diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 21941bd..19311b6 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -73,7 +73,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.5.116"); + strcpy(strProductVersion, "1.5.117"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index af03da6..e66aca1 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,5,116,0 - PRODUCTVERSION 1,5,116,0 + FILEVERSION 1,5,117,0 + PRODUCTVERSION 1,5,117,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.5.116.0" + VALUE "FileVersion", "1.5.117.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.5.116.0" + VALUE "ProductVersion", "1.5.117.0" END END BLOCK "VarFileInfo" diff --git a/oscar64/oscar64.vcxproj b/oscar64/oscar64.vcxproj index 212076d..b5aaddc 100644 --- a/oscar64/oscar64.vcxproj +++ b/oscar64/oscar64.vcxproj @@ -189,7 +189,6 @@ - diff --git a/oscar64/oscar64.vcxproj.filters b/oscar64/oscar64.vcxproj.filters index 628676b..99c9015 100644 --- a/oscar64/oscar64.vcxproj.filters +++ b/oscar64/oscar64.vcxproj.filters @@ -128,9 +128,6 @@ Header Files - - Header Files - Header Files diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index e4fbc50..a754e47 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -4023,15 +4023,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{0ED76161-EB93-44B9-8ED5-B52DAE35B818}" - "PackageCode" = "8:{B9A27BFE-6C41-4995-B0B1-AA37F7D48E99}" + "ProductCode" = "8:{13BD934B-1637-4989-8616-270CF677ADF6}" + "PackageCode" = "8:{2EA4AD42-948A-48FA-A940-0325656775A8}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.5.116" + "ProductVersion" = "8:1.5.117" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"