#include "MetadataLoader.h"
#include "ValueList.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/ADT/ilist_iterator.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Bitcode/BitcodeReader.h"
#include "llvm/Bitcode/LLVMBitCodes.h"
#include "llvm/Bitstream/BitstreamReader.h"
#include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/TrackingMDRef.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/type_traits.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <deque>
#include <iterator>
#include <limits>
#include <map>
#include <optional>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <vector>
namespace llvm {
class Argument;
}
usingnamespacellvm;
#define DEBUG_TYPE …
STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
static cl::opt<bool> ImportFullTypeDefinitions(
"import-full-type-definitions", cl::init(false), cl::Hidden,
cl::desc("Import full type definitions for ThinLTO."));
static cl::opt<bool> DisableLazyLoading(
"disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
cl::desc("Force disable the lazy-loading on-demand of metadata when "
"loading bitcode for importing."));
namespace {
static int64_t unrotateSign(uint64_t U) { … }
class BitcodeReaderMetadataList { … };
void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) { … }
Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) { … }
Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) { … }
MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) { … }
void BitcodeReaderMetadataList::tryToResolveCycles() { … }
void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
DICompositeType &CT) { … }
Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) { … }
Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) { … }
Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) { … }
namespace {
class PlaceholderQueue { … };
}
DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) { … }
void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) { … }
}
static Error error(const Twine &Message) { … }
class MetadataLoader::MetadataLoaderImpl { … };
Expected<bool>
MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { … }
Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() { … }
void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(Metadata **Val,
unsigned TypeID) { … }
Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) { … }
MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) { … }
void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
unsigned ID, PlaceholderQueue &Placeholders) { … }
void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
PlaceholderQueue &Placeholders) { … }
static Value *getValueFwdRef(BitcodeReaderValueList &ValueList, unsigned Idx,
Type *Ty, unsigned TyID) { … }
Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
SmallVectorImpl<uint64_t> &Record, unsigned Code,
PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) { … }
Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
ArrayRef<uint64_t> Record, StringRef Blob,
function_ref<void(StringRef)> CallBack) { … }
Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
GlobalObject &GO, ArrayRef<uint64_t> Record) { … }
Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
Function &F, ArrayRef<Instruction *> InstructionList) { … }
Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
SmallVectorImpl<uint64_t> &Record) { … }
Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() { … }
MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) { … }
MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
: … { … }
MetadataLoader::~MetadataLoader() = default;
MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
BitcodeReaderValueList &ValueList,
bool IsImporting,
MetadataLoaderCallbacks Callbacks)
: … { … }
Error MetadataLoader::parseMetadata(bool ModuleLevel) { … }
bool MetadataLoader::hasFwdRefs() const { … }
Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) { … }
DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) { … }
Error MetadataLoader::parseMetadataAttachment(
Function &F, ArrayRef<Instruction *> InstructionList) { … }
Error MetadataLoader::parseMetadataKinds() { … }
void MetadataLoader::setStripTBAA(bool StripTBAA) { … }
bool MetadataLoader::isStrippingTBAA() { … }
unsigned MetadataLoader::size() const { … }
void MetadataLoader::shrinkTo(unsigned N) { … }
void MetadataLoader::upgradeDebugIntrinsics(Function &F) { … }