1//===- CodeGenDataReader.cpp ----------------------------------------------===// 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 7//===----------------------------------------------------------------------===// 9// This file contains support for reading codegen data. 11//===----------------------------------------------------------------------===// 18#define DEBUG_TYPE "cg-data-reader" 27 : FS.getBufferForFile(Filename);
28if (std::error_code EC = BufferOrErr.getError())
30return std::move(BufferOrErr.get());
45if (
Name != CGOutlineName &&
Name != CGMergeName)
49auto *
Data =
reinterpret_cast<constunsignedchar *
>(Contents.data());
50auto *EndData =
Data + Contents.size();
51// In case dealing with an executable that has concatenated cgdata, 52// we want to merge them into a single cgdata. 53// Although it's not a typical workflow, we support this scenario 54// by looping over all data in the sections. 55if (
Name == CGOutlineName) {
56while (
Data != EndData) {
59 GlobalOutlineRecord.
merge(LocalOutlineRecord);
61 }
elseif (
Name == CGMergeName) {
62while (
Data != EndData) {
65 GlobalFunctionMapRecord.
merge(LocalFunctionMapRecord);
70for (
auto &Section : Obj->
sections()) {
77 processSectionContents(*NameOrErr, *ContentsOrErr);
84using namespacesupport;
86// The smallest header with the version 1 is 24 bytes. 87// Do not update this value even with the new version of the header. 88constunsigned MinHeaderSize = 24;
89if (DataBuffer->getBufferSize() < MinHeaderSize)
93reinterpret_cast<constunsignedchar *
>(DataBuffer->getBufferStart());
95reinterpret_cast<constunsignedchar *
>(DataBuffer->getBufferEnd());
117// Set up the buffer to read. 119if (
Error E = BufferOrError.takeError())
126if (Buffer->getBufferSize() == 0)
129 std::unique_ptr<CodeGenDataReader> Reader;
132 Reader = std::make_unique<IndexedCodeGenDataReader>(std::move(Buffer));
134 Reader = std::make_unique<TextCodeGenDataReader>(std::move(Buffer));
138// Initialize the reader and return the result. 139if (
Error E = Reader->read())
142return std::move(Reader);
146using namespacesupport;
150uint64_t Magic = endian::read<uint64_t, llvm::endianness::little, aligned>(
152// Verify that it's magical. 157// Verify that this really looks like plain ASCII text by checking a 158// 'reasonable' number of characters (up to the magic size). 160returnllvm::all_of(Prefix, [](
char c) {
return isPrint(c) || isSpace(c); });
163using namespacesupport;
165// Parse the custom header line by line. 167// Skip empty or whitespace-only lines 174if (Str.equals_insensitive(
"outlined_hash_tree"))
176elseif (Str.equals_insensitive(
"stable_function_map"))
182// We treat an empty header (that is a comment # only) as a valid header. 189// The YAML docs follow after the header. 190constchar *Pos = Line->
data();
191size_tSize =
reinterpret_cast<size_t>(DataBuffer->getBufferEnd()) -
192reinterpret_cast<size_t>(Pos);
201}
// end namespace llvm Error success()
Clear the current error and return a successful one.
OutlinedHashTreeRecord HashTreeRecord
The outlined hash tree that has been read.
static Expected< std::unique_ptr< CodeGenDataReader > > create(const Twine &Path, vfs::FileSystem &FS)
Factory method to create an appropriately typed reader for the given codegen data file path and file ...
StableFunctionMapRecord FunctionMapRecord
The stable function map that has been read. When it's released by.
static Error mergeFromObjectFile(const object::ObjectFile *Obj, OutlinedHashTreeRecord &GlobalOutlineRecord, StableFunctionMapRecord &GlobalFunctionMapRecord, stable_hash *CombinedHash=nullptr)
Extract the cgdata embedded in sections from the given object file and merge them into the GlobalOutl...
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
static bool hasFormat(const MemoryBuffer &Buffer)
Return true if the given buffer is in binary codegen data format.
Error read() override
Read the contents including the header.
bool hasStableFunctionMap() const override
Return true if the header indicates the data has a stable function map.
bool hasOutlinedHashTree() const override
Return true if the header indicates the data has an outlined hash tree.
This interface provides simple read-only access to a block of memory, and provides simple methods for...
size_t getBufferSize() const
StringRef getBuffer() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getSTDIN()
Read all of stdin into a file buffer, and return it.
const char * getBufferStart() const
StringRef - Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
StringRef rtrim(char Char) const
Return string with consecutive Char characters starting from the right removed.
StringRef take_front(size_t N=1) const
Return a StringRef equal to 'this' but with only the first N elements remaining.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
static bool hasFormat(const MemoryBuffer &Buffer)
Return true if the given buffer is in text codegen data format.
bool hasStableFunctionMap() const override
Return true if the header indicates the data has a stable function map.
bool hasOutlinedHashTree() const override
Return true if the header indicates the data has an outlined hash tree.
Error read() override
Read the contents including the header.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool is_at_eof() const
Return true if we've reached EOF or are an "end" iterator.
This class is the base class for all object file types.
Triple makeTriple() const
Create a triple from the data in this object file.
section_iterator_range sections() const
The virtual file system interface.
This is an optimization pass for GlobalISel generic memory operations.
@ StableFunctionMergingMap
@ FunctionOutlinedHashTree
static Expected< std::unique_ptr< MemoryBuffer > > setupMemoryBuffer(const Twine &Filename, vfs::FileSystem &FS)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
uint64_t xxh3_64bits(ArrayRef< uint8_t > data)
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
stable_hash stable_hash_combine(ArrayRef< stable_hash > Buffer)
std::string getCodeGenDataSectionName(CGDataSectKind CGSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
uint64_t StableFunctionMapOffset
static Expected< Header > readFromBuffer(const unsigned char *Curr)
uint64_t OutlinedHashTreeOffset
void deserializeYAML(yaml::Input &YIS)
Deserialize the outlined hash tree from a YAML stream.
void deserialize(const unsigned char *&Ptr)
Deserialize the outlined hash tree from a raw_ostream.
void merge(const OutlinedHashTreeRecord &Other)
Merge the other outlined hash tree into this one.
void merge(const StableFunctionMapRecord &Other)
Merge the stable function map into this one.
void deserialize(const unsigned char *&Ptr)
Deserialize the stable function map from a raw_ostream.
void deserializeYAML(yaml::Input &YIS)
Deserialize the stable function map from a YAML stream.