From 26d84dea6cd80a2dff179c09157e76d68bd95547 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:17:05 +0100 Subject: [PATCH 01/16] util: Add llvm helper crtps. --- mcsema/BC/Util.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index 2133a3558..adb0e69b4 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -22,6 +22,7 @@ #include #include +#include #include "mcsema/CFG/CFG.h" @@ -44,6 +45,62 @@ extern std::shared_ptr gContext; extern llvm::IntegerType *gWordType; extern std::unique_ptr gModule; +template +struct LLVMConstants { + + llvm::ConstantInt *i32(int32_t value) { + return GetConstantInt(value, 32); + } + + llvm::ConstantInt *i64(int64_t value) { + return GetConstantInt(value, 64); + } + + llvm::ConstantInt *GetConstantInt(int64_t value, int64_t size) { + return llvm::ConstantInt::get( + llvm::Type::getIntNTy(static_cast(*this).context, size), value); + } + + llvm::Type *i64_t() { + return llvm::Type::getInt64Ty(static_cast(*this).context); + } + + llvm::Type *i64_ptr_t() { + return llvm::Type::getInt64PtrTy(static_cast(*this).context); + } + + llvm::Type *i_n_ptr_t(uint64_t size) { + return llvm::Type::getIntNPtrTy(static_cast(*this).context, size); + } + + llvm::Type *i8_t() { + return llvm::Type::getInt8Ty(static_cast(*this).context); + } + + llvm::Type *i8P_ptr_t() { + return llvm::Type::getInt8PtrTy(static_cast(*this).context); + } + + llvm::Type *i_n_ty(uint64_t size) { + return llvm::Type::getIntNTy(static_cast(*this).context, size); + } + + llvm::Value *undef(llvm::Type *type) { + return llvm::UndefValue::get(type); + } + + llvm::Type *ptr(llvm::Type *type, unsigned addr_space=0) { + return llvm::PointerType::get(type, addr_space); + } + +}; + +template +struct ModuleUtil { + llvm::Function &function(const std::string &name) { + return *static_cast(*this).module.getFunction(name); + } +}; llvm::Value *GetConstantInt(unsigned size, uint64_t value); From d4442e7794478a6446304eb0a2c9873dc85ebb9d Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:17:29 +0100 Subject: [PATCH 02/16] util: Add ForEachLifted utility function. --- mcsema/BC/Util.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index adb0e69b4..0074756f5 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -26,6 +26,8 @@ #include "mcsema/CFG/CFG.h" +#include "remill/BC/Annotate.h" + namespace llvm { class BasicBlock; @@ -111,6 +113,14 @@ llvm::FunctionType *LiftedFunctionType(void); // lifted segment associated with `seg`. llvm::Constant *LiftEA(const NativeSegment *seg, uint64_t ea); +template +void ForEachLifted( llvm::Module &_module, Yield yield ) { + using funcs = std::vector; + for (auto f : remill::GetFunctionsByOrigin(_module )) { + yield( f ); + } +} + } // namespace mcsema #endif // MCSEMA_BC_UTIL_H_ From ac7cee449c73006a8b46727e65860f1e2a06896f Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:32:20 +0100 Subject: [PATCH 03/16] util: Add simple metadata helpers. --- mcsema/BC/Util.cpp | 24 ++++++++++++++++++++++++ mcsema/BC/Util.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/mcsema/BC/Util.cpp b/mcsema/BC/Util.cpp index f7943f68b..a03e59cc0 100644 --- a/mcsema/BC/Util.cpp +++ b/mcsema/BC/Util.cpp @@ -73,4 +73,28 @@ llvm::Constant *LiftEA(const NativeSegment *cfg_seg, uint64_t ea) { llvm::ConstantInt::get(gWordType, offset)); } +void SetMetadata(llvm::GlobalObject &go, + const std::string &kind, const std::string &val) { + if (go.hasMetadata(kind)) { + LOG(WARNING) << remill::LLVMThingToString(&go) << " already has metadata of kind: " + << kind; + } + auto &ctx = go.getContext(); + auto node = llvm::MDNode::get(ctx, llvm::MDString::get(ctx, val)); + go.setMetadata(kind, node); +} + +std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind) { + auto node = go.getMetadata(kind); + if (!node) { + return {}; + } + + CHECK(node->getNumOperands() == 1) + << "util::GetMetada does not support nodes with more than one operand"; + + return llvm::cast(node)->getString().str(); +} + + } // namespace mcsema diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index 0074756f5..a24d7f09a 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -121,6 +121,9 @@ void ForEachLifted( llvm::Module &_module, Yield yield ) { } } +void SetMetadata(llvm::GlobalObject &go, const std::string &kind, const std::string &val); +std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind); + } // namespace mcsema #endif // MCSEMA_BC_UTIL_H_ From 25961878bd327475bab56bfa66a35e76ffcfc3a1 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:48:44 +0100 Subject: [PATCH 04/16] lift: Add Info class, that maps lifted functions to information from binary. --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index daea19164..65118c22b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,7 @@ add_executable(${MCSEMA_LIFT} mcsema/BC/External.cpp mcsema/BC/Function.cpp mcsema/BC/Instruction.cpp + mcsema/BC/Info.cpp mcsema/BC/Legacy.cpp mcsema/BC/Lift.cpp mcsema/BC/Optimize.cpp From 1a85eae88ec435bde038c3cb6773cd00295dc9ef Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:58:36 +0100 Subject: [PATCH 05/16] util: Fix llvm::cast on MDNode instead of its operand. --- mcsema/BC/Util.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcsema/BC/Util.cpp b/mcsema/BC/Util.cpp index a03e59cc0..297312c0a 100644 --- a/mcsema/BC/Util.cpp +++ b/mcsema/BC/Util.cpp @@ -93,7 +93,7 @@ std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind) { CHECK(node->getNumOperands() == 1) << "util::GetMetada does not support nodes with more than one operand"; - return llvm::cast(node)->getString().str(); + return llvm::cast(node->getOperand(0))->getString().str(); } From b58f7d8ba35482e97fc1a48326d8f4d85b6c83be Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 02:59:16 +0100 Subject: [PATCH 06/16] lift: Set Info after lifted function is declared. --- mcsema/BC/Function.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mcsema/BC/Function.cpp b/mcsema/BC/Function.cpp index fe7c0f181..cfd73c215 100644 --- a/mcsema/BC/Function.cpp +++ b/mcsema/BC/Function.cpp @@ -54,6 +54,7 @@ #include "mcsema/BC/Callback.h" #include "mcsema/BC/Function.h" #include "mcsema/BC/Instruction.h" +#include "mcsema/BC/Info.h" #include "mcsema/BC/Legacy.h" #include "mcsema/BC/Lift.h" #include "mcsema/BC/Optimize.h" @@ -1015,7 +1016,10 @@ void DeclareLiftedFunctions(const NativeModule *cfg_module) { LOG(INFO) << "Already inserted function: " << func_name << ", skipping."; } + + info::Set( { cfg_func->name, cfg_func->ea }, *lifted_func ); } + } using Calls_t = std::vector; From 3148065ae4a0eb423d6679318ea6fcea25c59a83 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 03:04:18 +0100 Subject: [PATCH 07/16] lift: Slightly simplify DeclareLiftedFunctions. --- mcsema/BC/Function.cpp | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/mcsema/BC/Function.cpp b/mcsema/BC/Function.cpp index cfd73c215..d44afe937 100644 --- a/mcsema/BC/Function.cpp +++ b/mcsema/BC/Function.cpp @@ -991,6 +991,22 @@ static llvm::Function *LiftFunction( } // namespace +void DeclareLiftedFunction(const NativeObject *cfg_func) { + const auto &func_name = cfg_func->lifted_name; + auto lifted_func = gModule->getFunction(func_name); + + if (lifted_func) { + LOG(INFO) << "Already inserted function: " << func_name << ", skipping."; + return; + } + + lifted_func = remill::DeclareLiftedFunction(gModule.get(), func_name); + // make local functions 'static' + LOG(INFO) << "Inserted function: " << func_name; + + info::Set( { cfg_func->name, cfg_func->ea }, *lifted_func ); +} + // Declare the lifted functions. This is a separate step from defining // functions because it's important that all possible code- and data-cross // references are resolved before any data or instructions can use @@ -1001,25 +1017,8 @@ void DeclareLiftedFunctions(const NativeModule *cfg_module) { if (cfg_func->is_external) { continue; } - - const auto &func_name = cfg_func->lifted_name; - auto lifted_func = gModule->getFunction(func_name); - - if (!lifted_func) { - lifted_func = remill::DeclareLiftedFunction(gModule.get(), func_name); - - // make local functions 'static' - LOG(INFO) - << "Inserted function: " << func_name; - - } else { - LOG(INFO) - << "Already inserted function: " << func_name << ", skipping."; - } - - info::Set( { cfg_func->name, cfg_func->ea }, *lifted_func ); + DeclareLiftedFunction(cfg_func); } - } using Calls_t = std::vector; From 5296956f2d12974d23f69ee694cb8373f7bd6a40 Mon Sep 17 00:00:00 2001 From: xkorenc1 Date: Sat, 7 Mar 2020 03:14:44 +0100 Subject: [PATCH 08/16] lift: Add Info class. --- mcsema/BC/Info.cpp | 49 ++++++++++++++++++++++++++++++++++++++++++ mcsema/BC/Info.h | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 mcsema/BC/Info.cpp create mode 100644 mcsema/BC/Info.h diff --git a/mcsema/BC/Info.cpp b/mcsema/BC/Info.cpp new file mode 100644 index 000000000..05e854c1f --- /dev/null +++ b/mcsema/BC/Info.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Trail of Bits, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include + +#include + +namespace mcsema::info { + +void Set(const Info &meta, llvm::Function &func) { + SetMetadata(func, Kinds::ea_kind, std::to_string(meta.ea)); + SetMetadata(func, Kinds::name_kind, meta.name); +} + +Info Get(llvm::Function &func) { + return { Name(func), EA(func) }; +} + +std::string Name(llvm::Function &func) { + return GetMetadata(func, Kinds::name_kind); +} + +uint64_t EA(llvm::Function &func) { + auto as_str = GetMetadata(func, Kinds::ea_kind); + if (as_str.empty()) { + LOG(WARNING) << remill::LLVMThingToString(&func) << " does not have set " + << Kinds::ea_kind; + return 0xffffffff; + } + return stoul( as_str ); +} + +} // namespace mcsema::info + + diff --git a/mcsema/BC/Info.h b/mcsema/BC/Info.h new file mode 100644 index 000000000..5abb6e2de --- /dev/null +++ b/mcsema/BC/Info.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 Trail of Bits, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +namespace llvm { +class Function; +} // namespace llvm + +namespace mcsema::info { + +struct Kinds { + // TODO(lukas): std::string_view once c++17 is available + static constexpr char *ea_kind = "bin.ea"; + static constexpr char *name_kind = "bin.name"; +}; + +struct Info { + std::string name; + uint64_t ea; + + template + friend Stream &operator<<(Stream &os, const Info &info) { + os << "0x" << std::hex << info.ea << std::dec << ": " << info.name << std::endl; + return os; + } +}; + +void Set(const Info &meta, llvm::Function &func); +Info Get(llvm::Function &func); + +std::string Name(llvm::Function &func); +uint64_t EA(llvm::Function &func); + +} // namespace mcsema::info + + From 1e5d78485c71d8b2ec968d494591ca488f1a0cd2 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 15:14:50 +0100 Subject: [PATCH 09/16] util: Replace hasMetadata with getMetadata, for compatibility reasons. --- mcsema/BC/Util.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcsema/BC/Util.cpp b/mcsema/BC/Util.cpp index 297312c0a..adb133ed8 100644 --- a/mcsema/BC/Util.cpp +++ b/mcsema/BC/Util.cpp @@ -75,7 +75,7 @@ llvm::Constant *LiftEA(const NativeSegment *cfg_seg, uint64_t ea) { void SetMetadata(llvm::GlobalObject &go, const std::string &kind, const std::string &val) { - if (go.hasMetadata(kind)) { + if (go.getMetadata(kind)) { LOG(WARNING) << remill::LLVMThingToString(&go) << " already has metadata of kind: " << kind; } From 80627d24b8aa6a6f9633c08960cd8cde1e4d9017 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Sat, 7 Mar 2020 15:15:50 +0100 Subject: [PATCH 10/16] lift: Split nested namespace declaration, since it is c++17 feature. --- mcsema/BC/Info.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mcsema/BC/Info.cpp b/mcsema/BC/Info.cpp index 05e854c1f..6629b36bc 100644 --- a/mcsema/BC/Info.cpp +++ b/mcsema/BC/Info.cpp @@ -19,7 +19,9 @@ #include -namespace mcsema::info { +// TODO(lukas): Nested declaration once C++17 is available +namespace mcsema { +namespace info { void Set(const Info &meta, llvm::Function &func) { SetMetadata(func, Kinds::ea_kind, std::to_string(meta.ea)); @@ -44,6 +46,7 @@ uint64_t EA(llvm::Function &func) { return stoul( as_str ); } -} // namespace mcsema::info +} // namespace info +} // namespace mcsema From b2f335e7487a98c270d187d3e977b03226701603 Mon Sep 17 00:00:00 2001 From: xkorenc1 Date: Sun, 8 Mar 2020 01:31:48 +0100 Subject: [PATCH 11/16] util: Fix typo in method name of i8* type getter. --- mcsema/BC/Util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index a24d7f09a..3e99f8702 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -79,7 +79,7 @@ struct LLVMConstants { return llvm::Type::getInt8Ty(static_cast(*this).context); } - llvm::Type *i8P_ptr_t() { + llvm::Type *i8_ptr_t() { return llvm::Type::getInt8PtrTy(static_cast(*this).context); } From 5948df897cd41fc75e3e9a799f81b5de083540e9 Mon Sep 17 00:00:00 2001 From: xkorenc1 Date: Sun, 8 Mar 2020 01:32:25 +0100 Subject: [PATCH 12/16] util: Fix codestyle. --- mcsema/BC/Util.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index 3e99f8702..f5e0d0c5f 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -114,10 +114,10 @@ llvm::FunctionType *LiftedFunctionType(void); llvm::Constant *LiftEA(const NativeSegment *seg, uint64_t ea); template -void ForEachLifted( llvm::Module &_module, Yield yield ) { +void ForEachLifted(llvm::Module &_module, Yield yield) { using funcs = std::vector; - for (auto f : remill::GetFunctionsByOrigin(_module )) { - yield( f ); + for (auto f : remill::GetFunctionsByOrigin(_module)) { + yield(f); } } From 8af42447cf0065d1b5cbcbc83fbf1bb962540156 Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Mon, 16 Mar 2020 16:30:40 +0100 Subject: [PATCH 13/16] lift: Wrap data members of info::Info in std::optional. --- mcsema/BC/Info.cpp | 10 ++++++---- mcsema/BC/Info.h | 17 ++++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/mcsema/BC/Info.cpp b/mcsema/BC/Info.cpp index 6629b36bc..af9976b67 100644 --- a/mcsema/BC/Info.cpp +++ b/mcsema/BC/Info.cpp @@ -24,19 +24,21 @@ namespace mcsema { namespace info { void Set(const Info &meta, llvm::Function &func) { - SetMetadata(func, Kinds::ea_kind, std::to_string(meta.ea)); - SetMetadata(func, Kinds::name_kind, meta.name); + if (meta.ea) + SetMetadata(func, Kinds::ea_kind, std::to_string(*meta.ea)); + if (meta.name) + SetMetadata(func, Kinds::name_kind, *meta.name); } Info Get(llvm::Function &func) { return { Name(func), EA(func) }; } -std::string Name(llvm::Function &func) { +std::optional Name(llvm::Function &func) { return GetMetadata(func, Kinds::name_kind); } -uint64_t EA(llvm::Function &func) { +std::optional EA(llvm::Function &func) { auto as_str = GetMetadata(func, Kinds::ea_kind); if (as_str.empty()) { LOG(WARNING) << remill::LLVMThingToString(&func) << " does not have set " diff --git a/mcsema/BC/Info.h b/mcsema/BC/Info.h index 5abb6e2de..761f95cb8 100644 --- a/mcsema/BC/Info.h +++ b/mcsema/BC/Info.h @@ -17,6 +17,7 @@ #pragma once #include +#include #include namespace llvm { @@ -32,12 +33,18 @@ struct Kinds { }; struct Info { - std::string name; - uint64_t ea; + std::optional name; + std::optional ea; template friend Stream &operator<<(Stream &os, const Info &info) { - os << "0x" << std::hex << info.ea << std::dec << ": " << info.name << std::endl; + if ( info.ea ) { + os << "0x" << std::hex << *info.ea << std::dec; + } else { + os << "(unknown)"; + } + + os << ": " << ((info.name) ? *info.name : "(unknown)") << std::endl; return os; } }; @@ -45,8 +52,8 @@ struct Info { void Set(const Info &meta, llvm::Function &func); Info Get(llvm::Function &func); -std::string Name(llvm::Function &func); -uint64_t EA(llvm::Function &func); +std::optional Name(llvm::Function &func); +std::optional EA(llvm::Function &func); } // namespace mcsema::info From d34e05a6455e9d7af3b972beb8f1ae9470cf002a Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Mon, 16 Mar 2020 16:33:16 +0100 Subject: [PATCH 14/16] util: GetMetada now returns std::optional if metadata is not set. --- mcsema/BC/Util.cpp | 4 ++-- mcsema/BC/Util.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mcsema/BC/Util.cpp b/mcsema/BC/Util.cpp index adb133ed8..ef96d24db 100644 --- a/mcsema/BC/Util.cpp +++ b/mcsema/BC/Util.cpp @@ -84,7 +84,7 @@ void SetMetadata(llvm::GlobalObject &go, go.setMetadata(kind, node); } -std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind) { +MetaValue GetMetadata(llvm::GlobalObject &go, const std::string &kind) { auto node = go.getMetadata(kind); if (!node) { return {}; @@ -93,7 +93,7 @@ std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind) { CHECK(node->getNumOperands() == 1) << "util::GetMetada does not support nodes with more than one operand"; - return llvm::cast(node->getOperand(0))->getString().str(); + return { llvm::cast(node->getOperand(0))->getString().str() }; } diff --git a/mcsema/BC/Util.h b/mcsema/BC/Util.h index f5e0d0c5f..71f1bc94f 100644 --- a/mcsema/BC/Util.h +++ b/mcsema/BC/Util.h @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -121,8 +122,10 @@ void ForEachLifted(llvm::Module &_module, Yield yield) { } } +using MetaValue = std::optional; + void SetMetadata(llvm::GlobalObject &go, const std::string &kind, const std::string &val); -std::string GetMetadata(llvm::GlobalObject &go, const std::string &kind); +MetaValue GetMetadata(llvm::GlobalObject &go, const std::string &kind); } // namespace mcsema From fa03479ee3b23a2d8c31928dd7d92f46466873aa Mon Sep 17 00:00:00 2001 From: Lukas Korencik Date: Mon, 16 Mar 2020 16:33:59 +0100 Subject: [PATCH 15/16] lift: Reflect change in GetMetadata return type. --- mcsema/BC/Info.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mcsema/BC/Info.cpp b/mcsema/BC/Info.cpp index af9976b67..737d34af3 100644 --- a/mcsema/BC/Info.cpp +++ b/mcsema/BC/Info.cpp @@ -40,12 +40,10 @@ std::optional Name(llvm::Function &func) { std::optional EA(llvm::Function &func) { auto as_str = GetMetadata(func, Kinds::ea_kind); - if (as_str.empty()) { - LOG(WARNING) << remill::LLVMThingToString(&func) << " does not have set " - << Kinds::ea_kind; - return 0xffffffff; + if (!as_str) { + return {}; } - return stoul( as_str ); + return { stoul(*as_str) }; } } // namespace info From 8f14f1b9c5ee3eb6dfe9e428baee0bda34b2cc21 Mon Sep 17 00:00:00 2001 From: xkorenc1 Date: Tue, 21 Apr 2020 20:52:32 +0200 Subject: [PATCH 16/16] Bump .remill_commit_id. --- .remill_commit_id | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.remill_commit_id b/.remill_commit_id index 3b93adb62..38efc82a2 100644 --- a/.remill_commit_id +++ b/.remill_commit_id @@ -1 +1 @@ -eae68217c43f2e99a657c75ae36d40af740cc20e +cb3f49bf3e52c465f194cd01a3a3894bfecf7b2a