From dc834fde16fcb5e1bc3ba4820fd5dd301c9dee0b Mon Sep 17 00:00:00 2001 From: raax7 <142668843+raax7@users.noreply.github.com> Date: Tue, 1 Jul 2025 04:05:05 +0100 Subject: [PATCH 1/3] Add 128-bit support in tritonToLLVM --- src/libtriton/ast/llvm/tritonToLLVM.cpp | 32 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/libtriton/ast/llvm/tritonToLLVM.cpp b/src/libtriton/ast/llvm/tritonToLLVM.cpp index 55e9e0d40..a12e31c54 100644 --- a/src/libtriton/ast/llvm/tritonToLLVM.cpp +++ b/src/libtriton/ast/llvm/tritonToLLVM.cpp @@ -62,8 +62,11 @@ namespace triton { case 64: argsType[index] = llvm::Type::getInt64Ty(this->llvmContext); break; + case 128: + argsType[index] = llvm::Type::getInt128Ty(this->llvmContext); + break; default: - throw triton::exceptions::AstLifting("TritonToLLVM::do_convert(): Symbolic variables must be aligned on 8, 16, 32 or 64 bit."); + throw triton::exceptions::AstLifting("TritonToLLVM::do_convert(): Symbolic variables must be aligned on 8, 16, 32, 64 or 128 bit."); } } @@ -149,10 +152,11 @@ namespace triton { case triton::ast::BSWAP_NODE: { llvm::Function* bswap = nullptr; switch (node->getBitvectorSize()) { - case triton::bitsize::byte: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt8Ty(this->llvmContext)); break; - case triton::bitsize::word: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt16Ty(this->llvmContext)); break; - case triton::bitsize::dword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt32Ty(this->llvmContext)); break; - case triton::bitsize::qword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt64Ty(this->llvmContext)); break; + case triton::bitsize::byte: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt8Ty(this->llvmContext)); break; + case triton::bitsize::word: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt16Ty(this->llvmContext)); break; + case triton::bitsize::dword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt32Ty(this->llvmContext)); break; + case triton::bitsize::qword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt64Ty(this->llvmContext)); break; + case triton::bitsize::dqword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt128Ty(this->llvmContext)); break; default: throw triton::exceptions::AstLifting("TritonToLLVM::do_convert(): Invalid bswap size."); } @@ -257,8 +261,22 @@ namespace triton { case triton::ast::BVXOR_NODE: return this->llvmIR.CreateXor(children[0], children[1]); - case triton::ast::BV_NODE: - return llvm::ConstantInt::get(this->llvmContext, llvm::APInt(node->getBitvectorSize(), static_cast(node->evaluate()), false)); + case triton::ast::BV_NODE: { + auto value = node->evaluate(); + auto bitSize = node->getBitvectorSize(); + if (bitSize <= triton::bitsize::qword) { + return llvm::ConstantInt::get(this->llvmContext, llvm::APInt(bitSize, static_cast(value), false)); + } + else if (bitSize == triton::bitsize::dqword) { + uint64_t low = static_cast(value); + uint64_t high = static_cast(value >> 64); + std::array arr64 = { low, high }; + return llvm::ConstantInt::get(this->llvmContext, llvm::APInt(bitSize, arr64)); + } + else { + throw triton::exceptions::AstLifting("TritonToLLVM::do_convert(): Invalid bv size."); + } + } case triton::ast::CONCAT_NODE: { auto dstSize = node->getBitvectorSize(); From dd71f08925062c9d45524634f93cbd216fcff123 Mon Sep 17 00:00:00 2001 From: raax7 <142668843+raax7@users.noreply.github.com> Date: Tue, 1 Jul 2025 04:12:36 +0100 Subject: [PATCH 2/3] Fix formatting --- src/libtriton/ast/llvm/tritonToLLVM.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libtriton/ast/llvm/tritonToLLVM.cpp b/src/libtriton/ast/llvm/tritonToLLVM.cpp index a12e31c54..478bd8fec 100644 --- a/src/libtriton/ast/llvm/tritonToLLVM.cpp +++ b/src/libtriton/ast/llvm/tritonToLLVM.cpp @@ -152,10 +152,10 @@ namespace triton { case triton::ast::BSWAP_NODE: { llvm::Function* bswap = nullptr; switch (node->getBitvectorSize()) { - case triton::bitsize::byte: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt8Ty(this->llvmContext)); break; - case triton::bitsize::word: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt16Ty(this->llvmContext)); break; - case triton::bitsize::dword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt32Ty(this->llvmContext)); break; - case triton::bitsize::qword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt64Ty(this->llvmContext)); break; + case triton::bitsize::byte: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt8Ty(this->llvmContext)); break; + case triton::bitsize::word: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt16Ty(this->llvmContext)); break; + case triton::bitsize::dword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt32Ty(this->llvmContext)); break; + case triton::bitsize::qword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt64Ty(this->llvmContext)); break; case triton::bitsize::dqword: bswap = llvm::Intrinsic::getDeclaration(this->llvmModule.get(), llvm::Intrinsic::bswap, llvm::Type::getInt128Ty(this->llvmContext)); break; default: throw triton::exceptions::AstLifting("TritonToLLVM::do_convert(): Invalid bswap size."); From 8facb3fd3cba0886307c82ff22ab7581ffcb6237 Mon Sep 17 00:00:00 2001 From: raax7 <142668843+raax7@users.noreply.github.com> Date: Tue, 1 Jul 2025 19:26:01 +0100 Subject: [PATCH 3/3] Bug fix for 128-bit integer support with LLVM --- src/libtriton/ast/llvm/tritonToLLVM.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/libtriton/ast/llvm/tritonToLLVM.cpp b/src/libtriton/ast/llvm/tritonToLLVM.cpp index 478bd8fec..24105e4ef 100644 --- a/src/libtriton/ast/llvm/tritonToLLVM.cpp +++ b/src/libtriton/ast/llvm/tritonToLLVM.cpp @@ -267,10 +267,11 @@ namespace triton { if (bitSize <= triton::bitsize::qword) { return llvm::ConstantInt::get(this->llvmContext, llvm::APInt(bitSize, static_cast(value), false)); } - else if (bitSize == triton::bitsize::dqword) { - uint64_t low = static_cast(value); - uint64_t high = static_cast(value >> 64); - std::array arr64 = { low, high }; + else if (bitSize <= triton::bitsize::dqqword) { + std::array arr64; + for (uint64_t i = 0; i < bitSize / 64; i++) { + arr64[i] = static_cast(value >> (i * 64)); + } return llvm::ConstantInt::get(this->llvmContext, llvm::APInt(bitSize, arr64)); } else {