xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Support/CRC.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===-- llvm/Support/CRC.h - Cyclic Redundancy Check-------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains implementations of CRC functions.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_SUPPORT_CRC_H
14 #define LLVM_SUPPORT_CRC_H
15 
16 #include "llvm/Support/Compiler.h"
17 #include "llvm/Support/DataTypes.h"
18 
19 namespace llvm {
20 template <typename T> class ArrayRef;
21 
22 // Compute the CRC-32 of Data.
23 LLVM_ABI uint32_t crc32(ArrayRef<uint8_t> Data);
24 
25 // Compute the running CRC-32 of Data, with CRC being the previous value of the
26 // checksum.
27 LLVM_ABI uint32_t crc32(uint32_t CRC, ArrayRef<uint8_t> Data);
28 
29 // Class for computing the JamCRC.
30 //
31 // We will use the "Rocksoft^tm Model CRC Algorithm" to describe the properties
32 // of this CRC:
33 //   Width  : 32
34 //   Poly   : 04C11DB7
35 //   Init   : FFFFFFFF
36 //   RefIn  : True
37 //   RefOut : True
38 //   XorOut : 00000000
39 //   Check  : 340BC6D9 (result of CRC for "123456789")
40 //
41 // In other words, this is the same as CRC-32, except that XorOut is 0 instead
42 // of FFFFFFFF.
43 //
44 // N.B.  We permit flexibility of the "Init" value.  Some consumers of this need
45 //       it to be zero.
46 class JamCRC {
47 public:
CRC(Init)48   JamCRC(uint32_t Init = 0xFFFFFFFFU) : CRC(Init) {}
49 
50   // Update the CRC calculation with Data.
51   LLVM_ABI void update(ArrayRef<uint8_t> Data);
52 
getCRC()53   uint32_t getCRC() const { return CRC; }
54 
55 private:
56   uint32_t CRC;
57 };
58 
59 } // end namespace llvm
60 
61 #endif
62