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.