//===- MSFCommon.h - Common types and functions for MSF files ---*- 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 LLVM_DEBUGINFO_MSF_MSFCOMMON_H #define LLVM_DEBUGINFO_MSF_MSFCOMMON_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/BitVector.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include "llvm/Support/MathExtras.h" #include <cstdint> #include <vector> namespace llvm { namespace msf { static const char Magic[] = …; // The superblock is overlaid at the beginning of the file (offset 0). // It starts with a magic header and is followed by information which // describes the layout of the file system. struct SuperBlock { … }; struct MSFLayout { … }; /// Describes the layout of a stream in an MSF layout. A "stream" here /// is defined as any logical unit of data which may be arranged inside the MSF /// file as a sequence of (possibly discontiguous) blocks. When we want to read /// from a particular MSF Stream, we fill out a stream layout structure and the /// reader uses it to determine which blocks in the underlying MSF file contain /// the data, so that it can be pieced together in the right order. class MSFStreamLayout { … }; /// Determine the layout of the FPM stream, given the MSF layout. An FPM /// stream spans 1 or more blocks, each at equally spaced intervals throughout /// the file. MSFStreamLayout getFpmStreamLayout(const MSFLayout &Msf, bool IncludeUnusedFpmData = false, bool AltFpm = false); inline bool isValidBlockSize(uint32_t Size) { … } /// Given the specified block size, returns the maximum possible file size. /// Block Size | Max File Size /// <= 4096 | 4GB /// 8192 | 8GB /// 16384 | 16GB /// 32768 | 32GB /// \p Size - the block size of the MSF inline uint64_t getMaxFileSizeFromBlockSize(uint32_t Size) { … } // Super Block, Fpm0, Fpm1, and Block Map inline uint32_t getMinimumBlockCount() { … } // Super Block, Fpm0, and Fpm1 are reserved. The Block Map, although required // need not be at block 3. inline uint32_t getFirstUnreservedBlock() { … } inline uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize) { … } inline uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize) { … } inline uint32_t getFpmIntervalLength(const MSFLayout &L) { … } /// Given an MSF with the specified block size and number of blocks, determine /// how many pieces the specified Fpm is split into. /// \p BlockSize - the block size of the MSF /// \p NumBlocks - the total number of blocks in the MSF /// \p IncludeUnusedFpmData - When true, this will count every block that is /// both in the file and matches the form of an FPM block, even if some of /// those FPM blocks are unused (a single FPM block can describe the /// allocation status of up to 32,767 blocks, although one appears only /// every 4,096 blocks). So there are 8x as many blocks that match the /// form as there are blocks that are necessary to describe the allocation /// status of the file. When this parameter is false, these extraneous /// trailing blocks are not counted. inline uint32_t getNumFpmIntervals(uint32_t BlockSize, uint32_t NumBlocks, bool IncludeUnusedFpmData, int FpmNumber) { … } inline uint32_t getNumFpmIntervals(const MSFLayout &L, bool IncludeUnusedFpmData = false, bool AltFpm = false) { … } Error validateSuperBlock(const SuperBlock &SB); } // end namespace msf } // end namespace llvm #endif // LLVM_DEBUGINFO_MSF_MSFCOMMON_H