[clang] 37b530a - [clang] NFC: split HeaderMapTest to have re-usable header map implementation for testing

Dmitry Polukhin via cfe-commits cfe-commits at lists.llvm.org
Mon May 31 01:57:56 PDT 2021


Author: Dmitry Polukhin
Date: 2021-05-31T01:57:36-07:00
New Revision: 37b530a2ea8bdc28a22a3f8ca701455fb7febdea

URL: https://github.com/llvm/llvm-project/commit/37b530a2ea8bdc28a22a3f8ca701455fb7febdea
DIFF: https://github.com/llvm/llvm-project/commit/37b530a2ea8bdc28a22a3f8ca701455fb7febdea.diff

LOG: [clang] NFC: split HeaderMapTest to have re-usable header map implementation for testing

NFC changes required for https://reviews.llvm.org/D103142

Test Plan: check-clang

Differential Revision: https://reviews.llvm.org/D103229

Added: 
    clang/unittests/Lex/HeaderMapTestUtils.h

Modified: 
    clang/unittests/Lex/HeaderMapTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/unittests/Lex/HeaderMapTest.cpp b/clang/unittests/Lex/HeaderMapTest.cpp
index c18ce79ef58f0..4220edb2908e0 100644
--- a/clang/unittests/Lex/HeaderMapTest.cpp
+++ b/clang/unittests/Lex/HeaderMapTest.cpp
@@ -6,89 +6,17 @@
 //
 //===--------------------------------------------------------------===//
 
-#include "clang/Basic/CharInfo.h"
-#include "clang/Lex/HeaderMap.h"
-#include "clang/Lex/HeaderMapTypes.h"
+#include "HeaderMapTestUtils.h"
 #include "llvm/ADT/SmallString.h"
-#include "llvm/Support/SwapByteOrder.h"
 #include "gtest/gtest.h"
-#include <cassert>
 #include <type_traits>
 
 using namespace clang;
 using namespace llvm;
+using namespace clang::test;
 
 namespace {
 
-// Lay out a header file for testing.
-template <unsigned NumBuckets, unsigned NumBytes> struct MapFile {
-  HMapHeader Header;
-  HMapBucket Buckets[NumBuckets];
-  unsigned char Bytes[NumBytes];
-
-  void init() {
-    memset(this, 0, sizeof(MapFile));
-    Header.Magic = HMAP_HeaderMagicNumber;
-    Header.Version = HMAP_HeaderVersion;
-    Header.NumBuckets = NumBuckets;
-    Header.StringsOffset = sizeof(Header) + sizeof(Buckets);
-  }
-
-  void swapBytes() {
-    using llvm::sys::getSwappedBytes;
-    Header.Magic = getSwappedBytes(Header.Magic);
-    Header.Version = getSwappedBytes(Header.Version);
-    Header.NumBuckets = getSwappedBytes(Header.NumBuckets);
-    Header.StringsOffset = getSwappedBytes(Header.StringsOffset);
-  }
-
-  std::unique_ptr<const MemoryBuffer> getBuffer() const {
-    return MemoryBuffer::getMemBuffer(
-        StringRef(reinterpret_cast<const char *>(this), sizeof(MapFile)),
-        "header",
-        /* RequresNullTerminator */ false);
-  }
-};
-
-// The header map hash function.
-static inline unsigned getHash(StringRef Str) {
-  unsigned Result = 0;
-  for (char C : Str)
-    Result += toLowercase(C) * 13;
-  return Result;
-}
-
-template <class FileTy> struct FileMaker {
-  FileTy &File;
-  unsigned SI = 1;
-  unsigned BI = 0;
-  FileMaker(FileTy &File) : File(File) {}
-
-  unsigned addString(StringRef S) {
-    assert(SI + S.size() + 1 <= sizeof(File.Bytes));
-    std::copy(S.begin(), S.end(), File.Bytes + SI);
-    auto OldSI = SI;
-    SI += S.size() + 1;
-    return OldSI;
-  }
-  void addBucket(unsigned Hash, unsigned Key, unsigned Prefix, unsigned Suffix) {
-    assert(!(File.Header.NumBuckets & (File.Header.NumBuckets - 1)));
-    unsigned I = Hash & (File.Header.NumBuckets - 1);
-    do {
-      if (!File.Buckets[I].Key) {
-        File.Buckets[I].Key = Key;
-        File.Buckets[I].Prefix = Prefix;
-        File.Buckets[I].Suffix = Suffix;
-        ++File.Header.NumEntries;
-        return;
-      }
-      ++I;
-      I &= File.Header.NumBuckets - 1;
-    } while (I != (Hash & (File.Header.NumBuckets - 1)));
-    llvm_unreachable("no empty buckets");
-  }
-};
-
 TEST(HeaderMapTest, checkHeaderEmpty) {
   bool NeedsSwap;
   ASSERT_FALSE(HeaderMapImpl::checkHeader(
@@ -98,7 +26,7 @@ TEST(HeaderMapTest, checkHeaderEmpty) {
 }
 
 TEST(HeaderMapTest, checkHeaderMagic) {
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   File.Header.Magic = 0;
   bool NeedsSwap;
@@ -106,7 +34,7 @@ TEST(HeaderMapTest, checkHeaderMagic) {
 }
 
 TEST(HeaderMapTest, checkHeaderReserved) {
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   File.Header.Reserved = 1;
   bool NeedsSwap;
@@ -114,7 +42,7 @@ TEST(HeaderMapTest, checkHeaderReserved) {
 }
 
 TEST(HeaderMapTest, checkHeaderVersion) {
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   ++File.Header.Version;
   bool NeedsSwap;
@@ -122,7 +50,7 @@ TEST(HeaderMapTest, checkHeaderVersion) {
 }
 
 TEST(HeaderMapTest, checkHeaderValidButEmpty) {
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   bool NeedsSwap;
   ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
@@ -134,7 +62,7 @@ TEST(HeaderMapTest, checkHeaderValidButEmpty) {
 }
 
 TEST(HeaderMapTest, checkHeader3Buckets) {
-  MapFile<3, 1> File;
+  HMapFileMock<3, 1> File;
   ASSERT_EQ(3 * sizeof(HMapBucket), sizeof(File.Buckets));
 
   File.init();
@@ -144,7 +72,7 @@ TEST(HeaderMapTest, checkHeader3Buckets) {
 
 TEST(HeaderMapTest, checkHeader0Buckets) {
   // Create with 1 bucket to avoid 0-sized arrays.
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   File.Header.NumBuckets = 0;
   bool NeedsSwap;
@@ -152,7 +80,7 @@ TEST(HeaderMapTest, checkHeader0Buckets) {
 }
 
 TEST(HeaderMapTest, checkHeaderNotEnoughBuckets) {
-  MapFile<1, 1> File;
+  HMapFileMock<1, 1> File;
   File.init();
   File.Header.NumBuckets = 8;
   bool NeedsSwap;
@@ -160,15 +88,15 @@ TEST(HeaderMapTest, checkHeaderNotEnoughBuckets) {
 }
 
 TEST(HeaderMapTest, lookupFilename) {
-  typedef MapFile<2, 7> FileTy;
+  typedef HMapFileMock<2, 7> FileTy;
   FileTy File;
   File.init();
 
-  FileMaker<FileTy> Maker(File);
+  HMapFileMockMaker<FileTy> Maker(File);
   auto a = Maker.addString("a");
   auto b = Maker.addString("b");
   auto c = Maker.addString("c");
-  Maker.addBucket(getHash("a"), a, b, c);
+  Maker.addBucket("a", a, b, c);
 
   bool NeedsSwap;
   ASSERT_TRUE(HeaderMapImpl::checkHeader(*File.getBuffer(), NeedsSwap));
@@ -185,7 +113,8 @@ template <class FileTy, class PaddingTy> struct PaddedFile {
 };
 
 TEST(HeaderMapTest, lookupFilenameTruncatedSuffix) {
-  typedef MapFile<2, 64 - sizeof(HMapHeader) - 2 * sizeof(HMapBucket)> FileTy;
+  typedef HMapFileMock<2, 64 - sizeof(HMapHeader) - 2 * sizeof(HMapBucket)>
+      FileTy;
   static_assert(std::is_standard_layout<FileTy>::value,
                 "Expected standard layout");
   static_assert(sizeof(FileTy) == 64, "check the math");
@@ -194,11 +123,11 @@ TEST(HeaderMapTest, lookupFilenameTruncatedSuffix) {
   auto &Padding = P.Padding;
   File.init();
 
-  FileMaker<FileTy> Maker(File);
+  HMapFileMockMaker<FileTy> Maker(File);
   auto a = Maker.addString("a");
   auto b = Maker.addString("b");
   auto c = Maker.addString("c");
-  Maker.addBucket(getHash("a"), a, b, c);
+  Maker.addBucket("a", a, b, c);
 
   // Add 'x' characters to cause an overflow into Padding.
   ASSERT_EQ('c', File.Bytes[5]);
@@ -220,7 +149,8 @@ TEST(HeaderMapTest, lookupFilenameTruncatedSuffix) {
 }
 
 TEST(HeaderMapTest, lookupFilenameTruncatedPrefix) {
-  typedef MapFile<2, 64 - sizeof(HMapHeader) - 2 * sizeof(HMapBucket)> FileTy;
+  typedef HMapFileMock<2, 64 - sizeof(HMapHeader) - 2 * sizeof(HMapBucket)>
+      FileTy;
   static_assert(std::is_standard_layout<FileTy>::value,
                 "Expected standard layout");
   static_assert(sizeof(FileTy) == 64, "check the math");
@@ -229,11 +159,11 @@ TEST(HeaderMapTest, lookupFilenameTruncatedPrefix) {
   auto &Padding = P.Padding;
   File.init();
 
-  FileMaker<FileTy> Maker(File);
+  HMapFileMockMaker<FileTy> Maker(File);
   auto a = Maker.addString("a");
   auto c = Maker.addString("c");
   auto b = Maker.addString("b"); // Store the prefix last.
-  Maker.addBucket(getHash("a"), a, b, c);
+  Maker.addBucket("a", a, b, c);
 
   // Add 'x' characters to cause an overflow into Padding.
   ASSERT_EQ('b', File.Bytes[5]);

diff  --git a/clang/unittests/Lex/HeaderMapTestUtils.h b/clang/unittests/Lex/HeaderMapTestUtils.h
new file mode 100644
index 0000000000000..271d0588fc802
--- /dev/null
+++ b/clang/unittests/Lex/HeaderMapTestUtils.h
@@ -0,0 +1,100 @@
+//===- unittests/Lex/HeaderMapTestUtils.h - HeaderMap utils -------===//
+//
+// 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 LLVM_CLANG_UNITTESTS_LEX_HEADERMAPTESTUTILS_H
+#define LLVM_CLANG_UNITTESTS_LEX_HEADERMAPTESTUTILS_H
+
+#include "clang/Basic/CharInfo.h"
+#include "clang/Lex/HeaderMap.h"
+#include "clang/Lex/HeaderMapTypes.h"
+#include "llvm/Support/SwapByteOrder.h"
+#include <cassert>
+
+namespace clang {
+namespace test {
+
+// Lay out a header file for testing.
+template <unsigned NumBuckets, unsigned NumBytes> struct HMapFileMock {
+  HMapHeader Header;
+  HMapBucket Buckets[NumBuckets];
+  unsigned char Bytes[NumBytes];
+
+  void init() {
+    memset(this, 0, sizeof(HMapFileMock));
+    Header.Magic = HMAP_HeaderMagicNumber;
+    Header.Version = HMAP_HeaderVersion;
+    Header.NumBuckets = NumBuckets;
+    Header.StringsOffset = sizeof(Header) + sizeof(Buckets);
+  }
+
+  void swapBytes() {
+    using llvm::sys::getSwappedBytes;
+    Header.Magic = getSwappedBytes(Header.Magic);
+    Header.Version = getSwappedBytes(Header.Version);
+    Header.NumBuckets = getSwappedBytes(Header.NumBuckets);
+    Header.StringsOffset = getSwappedBytes(Header.StringsOffset);
+  }
+
+  std::unique_ptr<llvm::MemoryBuffer> getBuffer() {
+    return llvm::MemoryBuffer::getMemBuffer(
+        StringRef(reinterpret_cast<char *>(this), sizeof(HMapFileMock)),
+        "header",
+        /* RequresNullTerminator */ false);
+  }
+};
+
+template <class FileTy> struct HMapFileMockMaker {
+  FileTy &File;
+  unsigned SI = 1;
+  unsigned BI = 0;
+  HMapFileMockMaker(FileTy &File) : File(File) {}
+
+  unsigned addString(StringRef S) {
+    assert(SI + S.size() + 1 <= sizeof(File.Bytes));
+    std::copy(S.begin(), S.end(), File.Bytes + SI);
+    auto OldSI = SI;
+    SI += S.size() + 1;
+    return OldSI;
+  }
+
+  void addBucket(StringRef Str, unsigned Key, unsigned Prefix,
+                 unsigned Suffix) {
+    addBucket(getHash(Str), Key, Prefix, Suffix);
+  }
+
+  void addBucket(unsigned Hash, unsigned Key, unsigned Prefix,
+                 unsigned Suffix) {
+    assert(!(File.Header.NumBuckets & (File.Header.NumBuckets - 1)));
+    unsigned I = Hash & (File.Header.NumBuckets - 1);
+    do {
+      if (!File.Buckets[I].Key) {
+        File.Buckets[I].Key = Key;
+        File.Buckets[I].Prefix = Prefix;
+        File.Buckets[I].Suffix = Suffix;
+        ++File.Header.NumEntries;
+        return;
+      }
+      ++I;
+      I &= File.Header.NumBuckets - 1;
+    } while (I != (Hash & (File.Header.NumBuckets - 1)));
+    llvm_unreachable("no empty buckets");
+  }
+
+  // The header map hash function.
+  static unsigned getHash(StringRef Str) {
+    unsigned Result = 0;
+    for (char C : Str)
+      Result += toLowercase(C) * 13;
+    return Result;
+  }
+};
+
+} // namespace test
+} // namespace clang
+
+#endif


        


More information about the cfe-commits mailing list