diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5a1584b..88e3f6a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,6 +49,10 @@ if (NOT DEFINED ASMJIT_TEST)
set(ASMJIT_TEST FALSE)
endif()
+if (NOT DEFINED ASMJIT_NO_NATVIS)
+ set(ASMJIT_NO_NATVIS FALSE)
+endif()
+
# EMBED implies STATIC.
if (ASMJIT_EMBED AND NOT ASMJIT_STATIC)
set(ASMJIT_STATIC TRUE)
@@ -257,6 +261,16 @@ foreach(build_option ASMJIT_STATIC
endif()
endforeach()
+# =============================================================================
+# [AsmJit - Linker Support]
+# =============================================================================
+
+if (WIN32)
+ if(CMAKE_LINKER MATCHES "link\\.exe" OR CMAKE_LINKER MATCHES "lld-link\\.exe")
+ set(ASMJIT_LINKER_SUPPORTS_NATVIS TRUE)
+ endif()
+endif()
+
# =============================================================================
# [AsmJit - Source]
# =============================================================================
@@ -366,14 +380,22 @@ set(ASMJIT_SRC_LIST
asmjit/x86/x86rapass_p.h
)
-#if (MSVC)
-# list(APPEND ASMJIT_SRC_LIST asmjit.natvis)
-#endif()
+if (MSVC AND NOT ASMJIT_NO_NATVIS)
+ list(APPEND ASMJIT_SRC_LIST asmjit.natvis)
+endif()
set(ASMJIT_SRC "")
-foreach(_src_file ${ASMJIT_SRC_LIST})
- list(APPEND ASMJIT_SRC "${ASMJIT_DIR}/src/${_src_file}")
+foreach(src_file ${ASMJIT_SRC_LIST})
+ set(src_file "${ASMJIT_DIR}/src/${src_file}")
+ list(APPEND ASMJIT_SRC ${src_file})
+
+ if ("${src_file}" MATCHES "\\.natvis")
+ if (ASMJIT_LINKER_SUPPORTS_NATVIS)
+ list(APPEND ASMJIT_PRIVATE_LFLAGS "-natvis:${src_file}")
+ endif()
+ endif()
endforeach()
+
if (NOT ${CMAKE_VERSION} VERSION_LESS "3.8.0")
source_group(TREE "${ASMJIT_DIR}" FILES ${ASMJIT_SRC})
endif()
diff --git a/asmjit.natvis b/asmjit.natvis
deleted file mode 100644
index b85320d..0000000
--- a/asmjit.natvis
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-
-
-
-
- {_small.data, s8}
- {_large.data, s8}
-
-
- Small
- Large
- External
-
- - (int)_small.type, d
- - _large.size, d
- - asmjit::String::kSSOCapacity, d
- - _large.capacity, d
- - _small.data, s8
- - _large.data, s8
-
-
-
-
- {{ [size={_size, d} capacity={_capacity, d}] }}
-
- - _size, d
- - _capacity, d
-
- _size
- (($T1*)_data)
-
-
-
-
-
-
- [None]
- [Reg] {{ id={_reg.id, d} group={(_reg.signature >> 8) & 0xF, d} type={(_reg.signature >> 4) & 0x1F, d} size={(_reg.signature >> 24) & 0xFF, d} }}
- [Mem] {{ }}
- [Imm] {{ val={_imm.value.i64, d} hex={_imm.value.u64, X} f64={_imm.value.f64} }}
- [Label] {{ id={_label.id} }}
- [Unknown]
-
- _any
- _reg
- _mem
- _imm
- _label
- _any
-
-
-
diff --git a/src/asmjit.natvis b/src/asmjit.natvis
new file mode 100644
index 0000000..18a083c
--- /dev/null
+++ b/src/asmjit.natvis
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+ {_small.data, s8}
+ {_large.data, s8}
+
+
+ Small
+ Large
+ External
+
+ - (int)_small.type, d
+ - _large.size, d
+ - asmjit::String::kSSOCapacity, d
+ - _large.capacity, d
+ - _small.data, s8
+ - _large.data, s8
+
+
+
+
+ {{ [size={_size, d} capacity={_capacity, d}] }}
+
+ - _size, d
+ - _capacity, d
+
+ _size
+ (($T1*)_data)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [None]
+ [Reg] {{ id={_baseId, d} group={regGroup(), d} type={regType(), d} size={opSize(), d} }}
+ [Mem] {{ baseId={memBaseId(), d} indexId={memIndexId(), d} offset={(__int64)memOffset(), d} }}
+ [Imm] {{ val={immValue(), d} hex={immValue(), X} }}
+ [Label] {{ id={_baseId} }}
+ [Unknown]
+
+ - _signature, X
+ - (asmjit::Operand_::OpType)opType()
+ - opSize(), d
+ - (asmjit::BaseReg::RegType)regType()
+ - (asmjit::BaseReg::RegGroup)regGroup()
+ - (asmjit::BaseReg::RegType)memBaseType()
+ - (asmjit::BaseReg::RegType)memIndexType()
+ - (asmjit::BaseMem::AddrType)memAddrType()
+ - (bool)memRegHome()
+ - _baseId
+ - _data[0]
+ - _data[1]
+ - _data[0]
+ - _data[1]
+ - _data[0]
+ - _data[1]
+
+
+
diff --git a/src/asmjit/core/operand.cpp b/src/asmjit/core/operand.cpp
index 9cd1772..9d11f3f 100644
--- a/src/asmjit/core/operand.cpp
+++ b/src/asmjit/core/operand.cpp
@@ -125,8 +125,10 @@ UNIT(operand) {
EXPECT(m.offsetHi32() == xHi);
INFO("Checking basic functionality of Imm");
+ Imm immValue(-42);
EXPECT(Imm(-1).i64() == int64_t(-1));
EXPECT(imm(-1).i64() == int64_t(-1));
+ EXPECT(immValue.i64() == int64_t(-42));
EXPECT(imm(0xFFFFFFFF).i64() == int64_t(0xFFFFFFFF));
}
#endif
diff --git a/src/asmjit/core/operand.h b/src/asmjit/core/operand.h
index e7a71c9..eee1af4 100644
--- a/src/asmjit/core/operand.h
+++ b/src/asmjit/core/operand.h
@@ -147,27 +147,6 @@ struct Operand_ {
kDataImmValueHi = ASMJIT_ARCH_LE ? 1 : 0
};
- /*
- //! Memory operand data.
- struct MemData {
- //! Index register id.
- uint32_t indexId;
- //! Low part of 64-bit offset (or 32-bit offset).
- uint32_t offsetLo32;
- };
-
- //! Additional data used by some operands.
- union {
- //! 32-bit data (used either by immediate or as a 32-bit view).
- uint32_t _data32[2];
- //! 64-bit data (used either by immediate or as a 64-bit view).
- uint64_t _data64;
-
- //! Memory address data.
- MemData _mem;
- };
- */
-
//! Operand types that can be encoded in `Operand`.
enum OpType : uint32_t {
//! Not an operand or not initialized.