mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
Summary: When reading the metadata bitcode, create a type declaration when possible for composite types when we are importing. Doing this in the bitcode reader saves memory. Also it works naturally in the case when the type ODR map contains a definition for the same composite type because it was used in the importing module (buildODRType will automatically use the existing definition and not create a type declaration). For Chromium built with -g2, this reduces the aggregate size of the generated native object files by 66% (from 31G to 10G). It reduced the time through the ThinLTO link and backend phases by about 20% on my machine. Reviewers: mehdi_amini, dblaikie, aprantl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D27775 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289993 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
//===-- Bitcode/Reader/MetadataLoader.h - Load Metadatas -------*- C++ -*-====//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This class handles loading Metadatas.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_BITCODE_READER_METADATALOADER_H
|
|
#define LLVM_LIB_BITCODE_READER_METADATALOADER_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
|
|
namespace llvm {
|
|
class BitcodeReaderValueList;
|
|
class BitstreamCursor;
|
|
class DISubprogram;
|
|
class Error;
|
|
class Function;
|
|
class Instruction;
|
|
class Metadata;
|
|
class MDNode;
|
|
class Module;
|
|
class Type;
|
|
|
|
/// Helper class that handles loading Metadatas and keeping them available.
|
|
class MetadataLoader {
|
|
class MetadataLoaderImpl;
|
|
std::unique_ptr<MetadataLoaderImpl> Pimpl;
|
|
/// True if metadata is being parsed for a module being ThinLTO imported.
|
|
bool IsImporting = false;
|
|
Error parseMetadata(bool ModuleLevel);
|
|
|
|
public:
|
|
~MetadataLoader();
|
|
MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
|
|
BitcodeReaderValueList &ValueList, bool IsImporting,
|
|
std::function<Type *(unsigned)> getTypeByID);
|
|
MetadataLoader &operator=(MetadataLoader &&);
|
|
MetadataLoader(MetadataLoader &&);
|
|
|
|
// Parse a module metadata block
|
|
Error parseModuleMetadata() { return parseMetadata(true); }
|
|
|
|
// Parse a function metadata block
|
|
Error parseFunctionMetadata() { return parseMetadata(false); }
|
|
|
|
/// Set the mode to strip TBAA metadata on load.
|
|
void setStripTBAA(bool StripTBAA = true);
|
|
|
|
/// Return true if the Loader is stripping TBAA metadata.
|
|
bool isStrippingTBAA();
|
|
|
|
// Return true there are remaining unresolved forward references.
|
|
bool hasFwdRefs() const;
|
|
|
|
/// Return the given metadata, creating a replaceable forward reference if
|
|
/// necessary.
|
|
Metadata *getMetadataFwdRef(unsigned Idx);
|
|
|
|
MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
|
|
|
|
/// Return the DISubprogra metadata for a Function if any, null otherwise.
|
|
DISubprogram *lookupSubprogramForFunction(Function *F);
|
|
|
|
/// Parse a `METADATA_ATTACHMENT` block for a function.
|
|
Error parseMetadataAttachment(
|
|
Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
|
|
|
|
/// Parse a `METADATA_KIND` block for the current module.
|
|
Error parseMetadataKinds();
|
|
|
|
unsigned size() const;
|
|
void shrinkTo(unsigned N);
|
|
};
|
|
}
|
|
|
|
#endif // LLVM_LIB_BITCODE_READER_METADATALOADER_H
|