https://github.com/JDevlieghere created https://github.com/llvm/llvm-project/pull/71456
This commit adds an MD5 checksum (`Checksum`) class to LLDB. Its purpose is to store the MD5 hash added to the DWARF 5 line table. >From 5ba3f9d6cd795bc091bacae75b7c51d815138d5b Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere <jo...@devlieghere.com> Date: Mon, 6 Nov 2023 14:39:26 -0800 Subject: [PATCH] [lldb] Add Checksum class to lldbUtility This commit adds an MD5 checksum (`Checksum`) class to LLDB. Its purpose is to store the MD5 hash added to the DWARF 5 line table. --- lldb/include/lldb/Utility/Checksum.h | 36 ++++++++++++++++ lldb/source/Utility/CMakeLists.txt | 1 + lldb/source/Utility/Checksum.cpp | 46 ++++++++++++++++++++ lldb/unittests/Utility/CMakeLists.txt | 1 + lldb/unittests/Utility/ChecksumTest.cpp | 57 +++++++++++++++++++++++++ 5 files changed, 141 insertions(+) create mode 100644 lldb/include/lldb/Utility/Checksum.h create mode 100644 lldb/source/Utility/Checksum.cpp create mode 100644 lldb/unittests/Utility/ChecksumTest.cpp diff --git a/lldb/include/lldb/Utility/Checksum.h b/lldb/include/lldb/Utility/Checksum.h new file mode 100644 index 000000000000000..90a579b247636ac --- /dev/null +++ b/lldb/include/lldb/Utility/Checksum.h @@ -0,0 +1,36 @@ +//===-- Checksum.h ----------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_UTILITY_CHECKSUM_H +#define LLDB_UTILITY_CHECKSUM_H + +#include "llvm/Support/MD5.h" + +namespace lldb_private { +class Checksum { +public: + static llvm::MD5::MD5Result sentinel; + + Checksum(llvm::MD5::MD5Result md5 = sentinel); + Checksum(const Checksum &checksum); + Checksum &operator=(const Checksum &checksum); + + explicit operator bool() const; + bool operator==(const Checksum &checksum) const; + bool operator!=(const Checksum &checksum) const; + + std::string digest() const; + +private: + void SetMD5(llvm::MD5::MD5Result); + + llvm::MD5::MD5Result m_checksum; +}; +} // namespace lldb_private + +#endif // LLDB_UTILITY_CHECKSUM_H diff --git a/lldb/source/Utility/CMakeLists.txt b/lldb/source/Utility/CMakeLists.txt index 16afab1113a970c..a3b0a405b4133f6 100644 --- a/lldb/source/Utility/CMakeLists.txt +++ b/lldb/source/Utility/CMakeLists.txt @@ -29,6 +29,7 @@ add_lldb_library(lldbUtility NO_INTERNAL_DEPENDENCIES Args.cpp Baton.cpp Broadcaster.cpp + Checksum.cpp CompletionRequest.cpp Connection.cpp ConstString.cpp diff --git a/lldb/source/Utility/Checksum.cpp b/lldb/source/Utility/Checksum.cpp new file mode 100644 index 000000000000000..70167e497a526c4 --- /dev/null +++ b/lldb/source/Utility/Checksum.cpp @@ -0,0 +1,46 @@ +//===-- Checksum.cpp ------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/Checksum.h" +#include "llvm/ADT/SmallString.h" + +using namespace lldb_private; + +Checksum::Checksum(llvm::MD5::MD5Result md5) { SetMD5(md5); } + +Checksum::Checksum(const Checksum &checksum) { SetMD5(checksum.m_checksum); } + +Checksum &Checksum::operator=(const Checksum &checksum) { + SetMD5(checksum.m_checksum); + return *this; +} + +void Checksum::SetMD5(llvm::MD5::MD5Result md5) { + std::uninitialized_copy_n(md5.begin(), 16, m_checksum.begin()); +} + +Checksum::operator bool() const { + return !std::equal(m_checksum.begin(), m_checksum.end(), sentinel.begin()); +} + +bool Checksum::operator==(const Checksum &checksum) const { + return std::equal(m_checksum.begin(), m_checksum.end(), + checksum.m_checksum.begin()); +} + +bool Checksum::operator!=(const Checksum &checksum) const { + return !std::equal(m_checksum.begin(), m_checksum.end(), + checksum.m_checksum.begin()); +} + +std::string Checksum::digest() const { + return std::string(m_checksum.digest().str()); +} + +llvm::MD5::MD5Result Checksum::sentinel = {0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/lldb/unittests/Utility/CMakeLists.txt b/lldb/unittests/Utility/CMakeLists.txt index 5c7003a156813dc..097dae860b15911 100644 --- a/lldb/unittests/Utility/CMakeLists.txt +++ b/lldb/unittests/Utility/CMakeLists.txt @@ -4,6 +4,7 @@ add_lldb_unittest(UtilityTests OptionsWithRawTest.cpp ArchSpecTest.cpp BroadcasterTest.cpp + ChecksumTest.cpp ConstStringTest.cpp CompletionRequestTest.cpp DataBufferTest.cpp diff --git a/lldb/unittests/Utility/ChecksumTest.cpp b/lldb/unittests/Utility/ChecksumTest.cpp new file mode 100644 index 000000000000000..7537d30b5ff5b84 --- /dev/null +++ b/lldb/unittests/Utility/ChecksumTest.cpp @@ -0,0 +1,57 @@ +//===-- ChecksumTest.cpp --------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "lldb/Utility/Checksum.h" + +using namespace lldb_private; + +static llvm::MD5::MD5Result hash1 = {0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15}; + +static llvm::MD5::MD5Result hash2 = {0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15}; + +static llvm::MD5::MD5Result hash3 = {8, 9, 10, 11, 12, 13, 14, 15, + 0, 1, 2, 3, 4, 5, 6, 7}; + +TEST(ChecksumTest, TestConstructor) { + Checksum checksum1; + EXPECT_FALSE(static_cast<bool>(checksum1)); + EXPECT_EQ(checksum1, Checksum()); + + Checksum checksum2 = Checksum(hash1); + EXPECT_EQ(checksum2, Checksum(hash1)); + + Checksum checksum3(checksum2); + EXPECT_EQ(checksum3, Checksum(hash1)); +} + +TEST(ChecksumTest, TestCopyConstructor) { + Checksum checksum1; + EXPECT_FALSE(static_cast<bool>(checksum1)); + EXPECT_EQ(checksum1, Checksum()); + + Checksum checksum2 = checksum1; + EXPECT_EQ(checksum2, checksum1); + + Checksum checksum3(checksum1); + EXPECT_EQ(checksum3, checksum1); +} + +TEST(ChecksumTest, TestMD5) { + Checksum checksum1(hash1); + EXPECT_TRUE(static_cast<bool>(checksum1)); + + // Make sure two checksums with the same underlying hashes are the same. + EXPECT_EQ(Checksum(hash1), Checksum(hash2)); + + // Make sure two checksums with different underlying hashes are different. + EXPECT_NE(Checksum(hash1), Checksum(hash3)); +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits