diff --git a/CMakeLists.txt b/CMakeLists.txt index 7433dd9cf..f255457d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,10 +143,11 @@ set(public_include_header_list "${library_root}/multiprecision.hh" "${library_root}/slaformat.hh" ) -# if(sleigh_RELEASE_IS_HEAD) -# list(APPEND public_include_header_list -# ) -# endif() +if(sleigh_RELEASE_IS_HEAD) + list(APPEND public_include_header_list + "${library_root}/constseq.hh" + ) +endif() # Create custom target so that IDEs know these files are part of the sources add_custom_target(sleigh_all_headers SOURCES ${public_include_header_list}) set(public_headers_dir ${CMAKE_CURRENT_BINARY_DIR}/include) diff --git a/src/patches/HEAD/0001-Fix-UBSAN-errors-in-decompiler.patch b/src/patches/HEAD/0001-Fix-UBSAN-errors-in-decompiler.patch index e634f50bc..7d964b20e 100644 --- a/src/patches/HEAD/0001-Fix-UBSAN-errors-in-decompiler.patch +++ b/src/patches/HEAD/0001-Fix-UBSAN-errors-in-decompiler.patch @@ -1,11 +1,11 @@ -From 6c36965500d26d5a35dfbc91725956ae1d51e394 Mon Sep 17 00:00:00 2001 -From: Alex Cameron -Date: Mon, 5 Jun 2023 16:45:04 +1200 -Subject: [PATCH 1/5] Fix UBSAN errors in decompiler +From 692408998944223ca7d531899e2e602bc7dae3fe Mon Sep 17 00:00:00 2001 +From: Eric Kilmer +Date: Mon, 12 Aug 2024 12:02:35 -0400 +Subject: [PATCH 1/3] Fix UBSAN errors in decompiler +Co-authored-by: Alex Cameron --- .../Decompiler/src/decompile/cpp/fspec.cc | 8 ++++++-- - .../src/decompile/cpp/funcdata_varnode.cc | 8 +++++++- .../Decompiler/src/decompile/cpp/op.cc | 6 +++++- .../Decompiler/src/decompile/cpp/opbehavior.cc | 8 +++++++- .../src/decompile/cpp/pcodecompile.cc | 18 +++++++++++------- @@ -15,13 +15,13 @@ Subject: [PATCH 1/5] Fix UBSAN errors in decompiler .../src/decompile/cpp/slgh_compile.cc | 2 +- .../Decompiler/src/decompile/cpp/type.cc | 2 +- .../src/decompile/unittests/testfloatemu.cc | 2 +- - 11 files changed, 56 insertions(+), 20 deletions(-) + 10 files changed, 49 insertions(+), 19 deletions(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc -index dc96f0c19..3482cf17c 100644 +index 65c1cc7889..cb3284b787 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc -@@ -2727,8 +2727,12 @@ void ProtoModelMerged::decode(Decoder &decoder) +@@ -2868,8 +2868,12 @@ void ProtoModelMerged::decode(Decoder &decoder) modellist.push_back(mymodel); } decoder.closeElement(elemId); @@ -36,27 +36,8 @@ index dc96f0c19..3482cf17c 100644 } void ParameterBasic::setTypeLock(bool val) -diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -index fc094ee96..1f7e53ebe 100644 ---- a/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -+++ b/Ghidra/Features/Decompiler/src/decompile/cpp/funcdata_varnode.cc -@@ -503,7 +503,13 @@ void Funcdata::setHighLevel(void) - void Funcdata::transferVarnodeProperties(Varnode *vn,Varnode *newVn,int4 lsbOffset) - - { -- uintb newConsume = (vn->getConsume() >> 8*lsbOffset) & calc_mask(newVn->getSize()); -+ uintb newConsume = vn->getConsume(); -+ if (8*lsbOffset < sizeof(newConsume)) { -+ newConsume >>= 8*lsbOffset; -+ } else { -+ newConsume = 0; -+ } -+ newConsume &= calc_mask(newVn->getSize()); - - uint4 vnFlags = vn->getFlags() & (Varnode::directwrite|Varnode::addrforce); - diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc -index 921335173..46cdc39f3 100644 +index 74a62950c8..bc21d20250 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/op.cc @@ -666,7 +666,11 @@ uintb PcodeOp::getNZMaskLocal(bool cliploop) const @@ -73,7 +54,7 @@ index 921335173..46cdc39f3 100644 break; case CPUI_INT_MULT: diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc -index aebcfd910..6c47e6eb1 100644 +index aebcfd9103..6c47e6eb15 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/opbehavior.cc @@ -746,7 +746,13 @@ uintb OpBehaviorPiece::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb i @@ -92,7 +73,7 @@ index aebcfd910..6c47e6eb1 100644 } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc -index ca9d71ab9..85d4dd281 100644 +index ca9d71ab99..85d4dd281d 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/pcodecompile.cc @@ -621,8 +621,10 @@ vector *PcodeCompile::assignBitRange(VarnodeTpl *vn,uint4 bitoffset,uin @@ -135,10 +116,10 @@ index ca9d71ab9..85d4dd281 100644 return res; } diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc -index 3703c8ef5..ac6e21c00 100644 +index b6d5aaa461..ff1e9a10d7 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/ruleaction.cc -@@ -976,7 +976,12 @@ int4 RulePullsubIndirect::applyOp(PcodeOp *op,Funcdata &data) +@@ -977,7 +977,12 @@ int4 RulePullsubIndirect::applyOp(PcodeOp *op,Funcdata &data) Varnode *outvn = op->getOut(); if (outvn->isPrecisLo()||outvn->isPrecisHi()) return 0; // Don't pull apart double precision object @@ -152,7 +133,7 @@ index 3703c8ef5..ac6e21c00 100644 consume = ~consume; if ((consume & indir->getIn(0)->getConsume())!=0) return 0; -@@ -6803,8 +6808,9 @@ int4 RulePtrsubCharConstant::applyOp(PcodeOp *op,Funcdata &data) +@@ -6785,8 +6790,9 @@ int4 RulePtrsubCharConstant::applyOp(PcodeOp *op,Funcdata &data) Varnode *sb = op->getIn(0); Datatype *sbType = sb->getTypeReadFacing(op); if (sbType->getMetatype() != TYPE_PTR) return 0; @@ -164,7 +145,7 @@ index 3703c8ef5..ac6e21c00 100644 Varnode *vn1 = op->getIn(1); if (!vn1->isConstant()) return 0; Varnode *outvn = op->getOut(); -@@ -8616,7 +8622,11 @@ int4 RuleSubvarSubpiece::applyOp(PcodeOp *op,Funcdata &data) +@@ -8590,7 +8596,11 @@ int4 RuleSubvarSubpiece::applyOp(PcodeOp *op,Funcdata &data) Varnode *outvn = op->getOut(); int4 flowsize = outvn->getSize(); uintb mask = calc_mask( flowsize ); @@ -178,7 +159,7 @@ index 3703c8ef5..ac6e21c00 100644 if (!aggressive) { if ((vn->getConsume() & mask) != vn->getConsume()) return 0; diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc -index cd9b9835b..8a4616c3b 100644 +index cd9b9835b1..8a4616c3b9 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.cc @@ -22,6 +22,7 @@ ConstTpl::ConstTpl(const_type tp) @@ -198,7 +179,7 @@ index cd9b9835b..8a4616c3b 100644 bool ConstTpl::isConstSpace(void) const diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh -index e0b069959..9117a45c7 100644 +index e0b069959d..9117a45c75 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/semantics.hh @@ -47,7 +47,7 @@ class ConstTpl { @@ -211,7 +192,7 @@ index e0b069959..9117a45c7 100644 type=op2.type; value=op2.value; value_real=op2.value_real; select=op2.select; } ConstTpl(const_type tp,uintb val); diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc -index c060053bf..c9004023c 100644 +index 50d85e22ba..9f3b456229 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/slgh_compile.cc @@ -2164,8 +2164,8 @@ string SleighCompile::checkSymbols(SymbolScope *scope) @@ -225,10 +206,10 @@ index c060053bf..c9004023c 100644 msg << " Label <" << sym->getName() << "> was placed but not used" << endl; else if (!sym->isPlaced()) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc -index e6292e138..bd31b7470 100644 +index 04a5bdce7c..5b9aeb7c04 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/type.cc -@@ -3561,8 +3561,8 @@ void TypeFactory::recalcPointerSubmeta(Datatype *base,sub_metatype sub) +@@ -3590,8 +3590,8 @@ void TypeFactory::recalcPointerSubmeta(Datatype *base,sub_metatype sub) top.submeta = sub; // Search on the incorrect submeta iter = tree.lower_bound(&top); while(iter != tree.end()) { @@ -239,7 +220,7 @@ index e6292e138..bd31b7470 100644 ++iter; if (ptr->submeta == sub) { diff --git a/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc b/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc -index c35bde877..061e53677 100644 +index c35bde8774..061e536775 100644 --- a/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc +++ b/Ghidra/Features/Decompiler/src/decompile/unittests/testfloatemu.cc @@ -346,7 +346,7 @@ TEST(float_opTrunc_to_int) { @@ -252,5 +233,5 @@ index c35bde877..061e53677 100644 uintb true_result = ((uintb)(int32_t)f) & 0xffffffff; uintb encoding = format.getEncoding(f); -- -2.44.0 +2.46.0 diff --git a/src/patches/HEAD/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch b/src/patches/HEAD/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch index 63e211770..4fb7a1795 100644 --- a/src/patches/HEAD/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch +++ b/src/patches/HEAD/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch @@ -1,7 +1,7 @@ -From 290b06621c7a8c32c1470d16dbd8740876d57640 Mon Sep 17 00:00:00 2001 +From b7681c6a2b68b27323bf4ad79fb3501d7f067c4d Mon Sep 17 00:00:00 2001 From: Alex Cameron Date: Wed, 3 Aug 2022 20:01:18 +1000 -Subject: [PATCH 2/5] Use `stroull` instead of `stroul` to parse address +Subject: [PATCH 2/3] Use `stroull` instead of `stroul` to parse address offsets --- @@ -9,7 +9,7 @@ Subject: [PATCH 2/5] Use `stroull` instead of `stroul` to parse address 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc -index bda09fc94..d077ee375 100644 +index bda09fc94c..d077ee375e 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/space.cc @@ -16,6 +16,8 @@ @@ -34,5 +34,5 @@ index bda09fc94..d077ee375 100644 enddata = (const char *) tmpdata; if (enddata - s.c_str() == s.size()) { // If no size or offset override -- -2.44.0 +2.46.0 diff --git a/src/patches/HEAD/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch b/src/patches/HEAD/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch similarity index 79% rename from src/patches/HEAD/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch rename to src/patches/HEAD/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch index b09809fa2..36f5632f9 100644 --- a/src/patches/HEAD/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch +++ b/src/patches/HEAD/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch @@ -1,7 +1,7 @@ -From a7fc8b440ab58cb377460e11c7449488ff5abc96 Mon Sep 17 00:00:00 2001 +From 0be97746f512af054a0428cdddb9b6b8445b6ccf Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Sat, 30 Mar 2024 18:46:16 -0400 -Subject: [PATCH 5/5] Add missing index check to prevent errors in Windows +Subject: [PATCH 3/3] Add missing index check to prevent errors in Windows Not sure why this only appears when testing on Windows. --- @@ -9,10 +9,10 @@ Not sure why this only appears when testing on Windows. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc -index ac94d261c..a76ad389b 100644 +index 0237adb820..5048a9d480 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/ifacedecomp.cc -@@ -1842,7 +1842,7 @@ void IfcProtooverride::execute(istream &s) +@@ -1844,7 +1844,7 @@ void IfcProtooverride::execute(istream &s) s >> ws; Address callpoint(parse_machaddr(s,discard,*dcp->conf->types)); int4 i; @@ -22,5 +22,5 @@ index ac94d261c..a76ad389b 100644 if (i == dcp->fd->numCalls()) throw IfaceExecutionError("No call is made at this address"); -- -2.44.0 +2.46.0 diff --git a/src/setup-ghidra-source.cmake b/src/setup-ghidra-source.cmake index 1f0c0c5ce..7d3a05a48 100644 --- a/src/setup-ghidra-source.cmake +++ b/src/setup-ghidra-source.cmake @@ -49,7 +49,7 @@ if("${sleigh_RELEASE_TYPE}" STREQUAL "HEAD") # TODO: CMake only likes numeric characters in the version string.... set(ghidra_head_version "11.2") set(ghidra_version "${ghidra_head_version}") - set(ghidra_head_git_tag "3ec2dfb2011579933c43177e4d38d204ff248b7d") + set(ghidra_head_git_tag "5ab72bf4f254773b12c3c9566d14c42e5eb2495f") set(ghidra_git_tag "${ghidra_head_git_tag}") set(ghidra_shallow FALSE) set(ghidra_patches @@ -58,7 +58,7 @@ if("${sleigh_RELEASE_TYPE}" STREQUAL "HEAD") "${GIT_EXECUTABLE}" am --ignore-space-change --ignore-whitespace --no-gpg-sign "${CMAKE_CURRENT_LIST_DIR}/patches/HEAD/0001-Fix-UBSAN-errors-in-decompiler.patch" "${CMAKE_CURRENT_LIST_DIR}/patches/HEAD/0002-Use-stroull-instead-of-stroul-to-parse-address-offse.patch" - "${CMAKE_CURRENT_LIST_DIR}/patches/HEAD/0005-Add-missing-index-check-to-prevent-errors-in-Windows.patch" + "${CMAKE_CURRENT_LIST_DIR}/patches/HEAD/0003-Add-missing-index-check-to-prevent-errors-in-Windows.patch" ) string(SUBSTRING "${ghidra_git_tag}" 0 7 ghidra_short_commit) else() @@ -168,10 +168,11 @@ set(sleigh_deccore_source_list "${library_root}/signature.cc" "${library_root}/multiprecision.cc" ) -# if("${sleigh_RELEASE_TYPE}" STREQUAL "HEAD") -# list(APPEND sleigh_deccore_source_list -# ) -# endif() +if("${sleigh_RELEASE_TYPE}" STREQUAL "HEAD") + list(APPEND sleigh_deccore_source_list + "${library_root}/constseq.cc" + ) +endif() set(sleigh_extra_source_list "${library_root}/callgraph.cc"