summaryrefslogtreecommitdiff
path: root/src/ToolBox/superpmi/superpmi/neardiffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ToolBox/superpmi/superpmi/neardiffer.h')
-rw-r--r--src/ToolBox/superpmi/superpmi/neardiffer.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/ToolBox/superpmi/superpmi/neardiffer.h b/src/ToolBox/superpmi/superpmi/neardiffer.h
new file mode 100644
index 0000000000..e3ffe1c790
--- /dev/null
+++ b/src/ToolBox/superpmi/superpmi/neardiffer.h
@@ -0,0 +1,86 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+//----------------------------------------------------------
+// nearDiffer.h - differ that handles code that is very similar
+//----------------------------------------------------------
+#ifndef _nearDiffer
+#define _nearDiffer
+
+#include "methodcontext.h"
+#include "compileresult.h"
+
+class NearDiffer
+{
+public:
+
+ NearDiffer(const char *targetArch, bool useCorDisTools)
+ : TargetArchitecture(targetArch)
+ , UseCoreDisTools(useCorDisTools)
+#ifdef USE_COREDISTOOLS
+ , corAsmDiff(nullptr)
+#endif // USE_COREDISTOOLS
+ {
+ }
+
+ ~NearDiffer();
+
+ void InitAsmDiff();
+
+ bool compare(MethodContext *mc, CompileResult *cr1,CompileResult *cr2);
+
+ const char* TargetArchitecture;
+ const bool UseCoreDisTools;
+
+private:
+
+ void DumpCodeBlock(unsigned char *block, ULONG blocksize, void *originalAddr);
+
+ bool compareCodeSection(
+ MethodContext *mc,
+ CompileResult *cr1,
+ CompileResult *cr2,
+ unsigned char *block1,
+ ULONG blocksize1,
+ unsigned char *datablock1,
+ ULONG datablockSize1,
+ void *originalBlock1,
+ void *originalDataBlock1,
+ void *otherCodeBlock1,
+ ULONG otherCodeBlockSize1,
+ unsigned char *block2,
+ ULONG blocksize2,
+ unsigned char *datablock2,
+ ULONG datablockSize2,
+ void *originalBlock2,
+ void *originalDataBlock2,
+ void *otherCodeBlock2,
+ ULONG otherCodeBlockSize2);
+
+ bool compareReadOnlyDataBlock(MethodContext *mc, CompileResult *cr1, CompileResult *cr2,
+ unsigned char *block1, ULONG blocksize1, void *originalDataBlock1,
+ unsigned char *block2, ULONG blocksize2, void *originalDataBlock2);
+ bool compareEHInfo(MethodContext *mc, CompileResult *cr1, CompileResult *cr2);
+ bool compareGCInfo(MethodContext *mc, CompileResult *cr1, CompileResult *cr2);
+ bool compareVars(MethodContext *mc, CompileResult *cr1, CompileResult *cr2);
+ bool compareBoundaries(MethodContext *mc, CompileResult *cr1, CompileResult *cr2);
+
+ static bool compareOffsets(const void *payload,
+ size_t blockOffset,
+ size_t instrLen,
+ uint64_t offset1,
+ uint64_t offset2);
+
+#ifdef USE_COREDISTOOLS
+ CorAsmDiff *corAsmDiff;
+#endif // USE_COREDISTOOLS
+
+#ifdef USE_MSVCDIS
+ DIS* GetMsVcDis();
+#endif // USE_MSVCDIS
+
+};
+
+#endif // _nearDiffer