summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/inc/CMakeLists.txt1
-rw-r--r--src/inc/coredistools.h142
-rwxr-xr-xsrc/vm/disassembler.cpp11
-rw-r--r--src/vm/disassembler.h25
-rwxr-xr-xtests/setup-runtime-dependencies.cmd2
-rwxr-xr-xtests/setup-runtime-dependencies.sh2
6 files changed, 156 insertions, 27 deletions
diff --git a/src/inc/CMakeLists.txt b/src/inc/CMakeLists.txt
index 9328773bad..87d7536d02 100644
--- a/src/inc/CMakeLists.txt
+++ b/src/inc/CMakeLists.txt
@@ -74,6 +74,7 @@ add_library(corguids ${CORGUIDS_SOURCES})
install (FILES cfi.h
cor.h
cordebuginfo.h
+ coredistools.h
corhdr.h
corinfo.h
corjit.h
diff --git a/src/inc/coredistools.h b/src/inc/coredistools.h
new file mode 100644
index 0000000000..92c9d9a5e7
--- /dev/null
+++ b/src/inc/coredistools.h
@@ -0,0 +1,142 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//===--------- coredistools.h - Dissassembly tools for CoreClr ------------===//
+//
+// Core Disassembly Tools API Version 1.0.1-prerelease
+// Disassembly tools required by CoreCLR for utilities like
+// GCStress and SuperPMI
+//===----------------------------------------------------------------------===//
+
+#if !defined(_COREDISTOOLS_H_)
+#define _COREDISTOOLS_H_
+
+#include <stdint.h>
+
+#if defined(__cplusplus)
+#define EXTERN_C extern "C"
+#else
+#define EXTERN_C
+#endif // defined(__cplusplus)
+
+#if defined(_MSC_VER)
+#if defined(DllInterfaceExporter)
+#define DllIface EXTERN_C __declspec(dllexport)
+#else
+#define DllIface EXTERN_C __declspec(dllimport)
+#endif // defined(DllInterfaceExporter)
+#else
+#define DllIface EXTERN_C
+#endif // defined(_MSC_VER)
+
+enum TargetArch {
+ Target_Host, // Target is the same as host architecture
+ Target_X86,
+ Target_X64,
+ Target_Thumb,
+ Target_Arm64
+};
+
+struct CorDisasm;
+struct CorAsmDiff;
+
+// The custom print functionality to be provide by the
+// users of this Library
+typedef void(*Printer)(const char *msg, ...);
+struct PrintControl {
+ const Printer Error;
+ const Printer Warning;
+ const Printer Log;
+ const Printer Dump;
+};
+
+// The type of a custom function provided by the user to determine
+// if two offsets are considered equivalent wrt diffing code blocks.
+// Offset1 and Offset2 are the two offsets to be compared.
+// BlockOffset is the offest of the instructions (that contain Offset1
+// and Offset2) from the beginning of their respective code blocks.
+// InstructionLength is the length of the current instruction being
+// compared for equivalency.
+typedef bool(*OffsetComparator)(const void *UserData, size_t BlockOffset,
+ size_t InstructionLength, uint64_t Offset1,
+ uint64_t Offset2);
+
+// The Export/Import definitions for CoreDistools library are defined below.
+// A typedef for each interface function's type is defined in order to aid
+// the importer.
+
+// Initialize the disassembler, using default print controls
+typedef CorDisasm *InitDisasm_t(enum TargetArch Target);
+DllIface InitDisasm_t InitDisasm;
+
+// Initialize the disassembler using custom print controls
+typedef CorDisasm *NewDisasm_t(enum TargetArch Target,
+ const PrintControl *PControl);
+DllIface NewDisasm_t NewDisasm;
+
+// Delete the disassembler
+typedef void FinishDisasm_t(const CorDisasm *Disasm);
+DllIface FinishDisasm_t FinishDisasm;
+
+// DisasmInstruction -- Disassemble one instruction
+// Arguments:
+// Disasm -- The Disassembler
+// Address -- The address at which the bytes of the instruction
+// are intended to execute
+// Bytes -- Pointer to the actual bytes which need to be disassembled
+// MaxLength -- Number of bytes available in Bytes buffer
+// Returns:
+// -- The Size of the disassembled instruction
+// -- Zero on failure
+typedef size_t DisasmInstruction_t(const CorDisasm *Disasm,
+ const uint8_t *Address,
+ const uint8_t *Bytes, size_t Maxlength);
+DllIface DisasmInstruction_t DisasmInstruction;
+
+// Initialize the Code Differ
+typedef CorAsmDiff *NewDiffer_t(enum TargetArch Target,
+ const PrintControl *PControl,
+ const OffsetComparator Comparator);
+DllIface NewDiffer_t NewDiffer;
+
+// Delete the Code Differ
+typedef void FinishDiff_t(const CorAsmDiff *AsmDiff);
+DllIface FinishDiff_t FinishDiff;
+
+// NearDiffCodeBlocks -- Compare two code blocks for semantic
+// equivalence
+// Arguments:
+// AsmDiff -- The Asm-differ
+// UserData -- Any data the user wishes to pass through into
+// the OffsetComparator
+// Address1 -- Address at which first block will execute
+// Bytes1 -- Pointer to the actual bytes of the first block
+// Size1 -- The size of the first block
+// Address2 -- Address at which second block will execute
+// Bytes2 -- Pointer to the actual bytes of the second block
+// Size2 -- The size of the second block
+// Returns:
+// -- true if the two blocks are equivalent, false if not.
+typedef bool NearDiffCodeBlocks_t(const CorAsmDiff *AsmDiff,
+ const void *UserData,
+ const uint8_t *Address1,
+ const uint8_t *Bytes1, size_t Size1,
+ const uint8_t *Address2,
+ const uint8_t *Bytes2, size_t Size2);
+DllIface NearDiffCodeBlocks_t NearDiffCodeBlocks;
+
+// Print a code block according to the Disassembler's Print Controls
+typedef void DumpCodeBlock_t(const CorDisasm *Disasm, const uint8_t *Address,
+ const uint8_t *Bytes, size_t Size);
+DllIface DumpCodeBlock_t DumpCodeBlock;
+
+// Print the two code blocks being diffed, according to
+// AsmDiff's PrintControls.
+typedef void DumpDiffBlocks_t(const CorAsmDiff *AsmDiff,
+ const uint8_t *Address1, const uint8_t *Bytes1,
+ size_t Size1, const uint8_t *Address2,
+ const uint8_t *Bytes2, size_t Size2);
+DllIface DumpDiffBlocks_t DumpDiffBlocks;
+
+#endif // !defined(_COREDISTOOLS_H_)
diff --git a/src/vm/disassembler.cpp b/src/vm/disassembler.cpp
index ea44c61e1f..86a277ad62 100755
--- a/src/vm/disassembler.cpp
+++ b/src/vm/disassembler.cpp
@@ -13,12 +13,9 @@
#if USE_COREDISTOOLS_DISASSEMBLER
HMODULE Disassembler::s_libraryHandle = nullptr;
-
-Disassembler::CorDisasm *(*Disassembler::External_InitDisasm)(enum TargetArch Target) = nullptr;
-SIZE_T(*Disassembler::External_DisasmInstruction)(const Disassembler::CorDisasm *Disasm, size_t Address,
- const uint8_t *Bytes, size_t Maxlength,
- bool PrintAssembly) = nullptr;
-void(*Disassembler::External_FinishDisasm)(const Disassembler::CorDisasm *Disasm) = nullptr;
+InitDisasm_t *Disassembler::External_InitDisasm = nullptr;
+FinishDisasm_t *Disassembler::External_FinishDisasm = nullptr;
+DisasmInstruction_t *Disassembler::External_DisasmInstruction = nullptr;
#endif // USE_COREDISTOOLS_DISASSEMBLER
Disassembler::ExternalDisassembler *Disassembler::s_availableExternalDisassembler = nullptr;
@@ -239,7 +236,7 @@ SIZE_T Disassembler::DisassembleInstruction(const UINT8 *code, SIZE_T codeLength
_ASSERTE(IsAvailable());
#if USE_COREDISTOOLS_DISASSEMBLER
- SIZE_T instructionLength = External_DisasmInstruction(m_externalDisassembler, reinterpret_cast<SIZE_T>(code), code, codeLength, false /* PrintAssembly */);
+ SIZE_T instructionLength = External_DisasmInstruction(m_externalDisassembler, code, code, codeLength);
#elif USE_MSVC_DISASSEMBLER
SIZE_T instructionLength =
m_externalDisassembler->CbDisassemble(reinterpret_cast<ExternalDisassembler::ADDR>(code), code, codeLength);
diff --git a/src/vm/disassembler.h b/src/vm/disassembler.h
index f0be83b81b..e3536bab88 100644
--- a/src/vm/disassembler.h
+++ b/src/vm/disassembler.h
@@ -24,6 +24,10 @@
#endif // defined(FEATURE_CORECLR) || defined(_TARGET_AMD64_) || defined(_TARGET_X86_)
#endif // HAVE_GCCOVER
+#if USE_COREDISTOOLS_DISASSEMBLER
+#include "coredistools.h"
+#endif
+
#if USE_COREDISTOOLS_DISASSEMBLER || USE_MSVC_DISASSEMBLER
#define USE_DISASSEMBLER 1
#else
@@ -61,7 +65,6 @@ class Disassembler
{
#if USE_COREDISTOOLS_DISASSEMBLER
private:
- class CorDisasm;
typedef CorDisasm ExternalDisassembler;
#elif USE_MSVC_DISASSEMBLER
private:
@@ -98,23 +101,9 @@ public:
#if USE_COREDISTOOLS_DISASSEMBLER
private:
static HMODULE s_libraryHandle;
-
- // 'coredistools' library exports
-private:
-
- enum TargetArch {
- Target_Host, // Target is the same as host architecture
- Target_X86,
- Target_X64,
- Target_Thumb,
- Target_Arm64
- };
-
- static CorDisasm *(*External_InitDisasm)(enum TargetArch Target);
- static SIZE_T (*External_DisasmInstruction)(const CorDisasm *Disasm, size_t Address,
- const uint8_t *Bytes, size_t Maxlength,
- bool PrintAssembly);
- static void (*External_FinishDisasm)(const CorDisasm *Disasm);
+ static InitDisasm_t *External_InitDisasm;
+ static FinishDisasm_t *External_FinishDisasm;
+ static DisasmInstruction_t *External_DisasmInstruction;
#endif // USE_COREDISTOOLS_DISASSEMBLER
private:
diff --git a/tests/setup-runtime-dependencies.cmd b/tests/setup-runtime-dependencies.cmd
index e1ec0f1de4..091339982b 100755
--- a/tests/setup-runtime-dependencies.cmd
+++ b/tests/setup-runtime-dependencies.cmd
@@ -78,7 +78,7 @@ REM ============================================================================
REM Write dependency information to project.json
echo { ^
"dependencies": { ^
- "runtime.win7-%__Arch%.Microsoft.NETCore.CoreDisTools": "1.0.0-prerelease-00001" ^
+ "runtime.win7-%__Arch%.Microsoft.NETCore.CoreDisTools": "1.0.1-prerelease-00001" ^
}, ^
"frameworks": { "dnxcore50": { } } ^
} > "%__JasonFilePath%"
diff --git a/tests/setup-runtime-dependencies.sh b/tests/setup-runtime-dependencies.sh
index 457636cdc2..3db178c4f9 100755
--- a/tests/setup-runtime-dependencies.sh
+++ b/tests/setup-runtime-dependencies.sh
@@ -119,7 +119,7 @@ fi
packageName='runtime.'$rid'.Microsoft.NETCore.CoreDisTools'
echo { \
\"dependencies\": { \
- \"$packageName\": \"1.0.0-prerelease-00001\" \
+ \"$packageName\": \"1.0.1-prerelease-00001\" \
}, \
\"frameworks\": { \"dnxcore50\": { } } \
} > $jsonFilePath