LLVM  13.0.0git
Functions | Variables
BitcodeReader.cpp File Reference
#include "llvm/Bitcode/BitcodeReader.h"
#include "MetadataLoader.h"
#include "ValueList.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Bitcode/BitcodeCommon.h"
#include "llvm/Bitcode/LLVMBitCodes.h"
#include "llvm/Bitstream/BitstreamReader.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/AutoUpgrade.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Comdat.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GVMaterializer.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalIFunc.h"
#include "llvm/IR/GlobalIndirectSymbol.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <deque>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <system_error>
#include <tuple>
#include <utility>
#include <vector>

Go to the source code of this file.

Functions

static Error error (const Twine &Message)
 
static Error hasInvalidBitcodeHeader (BitstreamCursor &Stream)
 
static Expected< BitstreamCursorinitStream (MemoryBufferRef Buffer)
 
template<typename StrTy >
static bool convertToString (ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
 Convert a string from a record into an std::string, return true on failure. More...
 
static void stripTBAA (Module *M)
 
static Expected< std::string > readIdentificationBlock (BitstreamCursor &Stream)
 Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bitcode, and return the producer name if any. More...
 
static Expected< std::string > readIdentificationCode (BitstreamCursor &Stream)
 
static Expected< bool > hasObjCCategoryInModule (BitstreamCursor &Stream)
 
static Expected< bool > hasObjCCategory (BitstreamCursor &Stream)
 
static Expected< std::string > readModuleTriple (BitstreamCursor &Stream)
 
static Expected< std::string > readTriple (BitstreamCursor &Stream)
 
static bool hasImplicitComdat (size_t Val)
 
static GlobalValue::LinkageTypes getDecodedLinkage (unsigned Val)
 
static FunctionSummary::FFlags getDecodedFFlags (uint64_t RawFlags)
 
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags (uint64_t RawFlags, uint64_t Version)
 
static GlobalVarSummary::GVarFlags getDecodedGVarFlags (uint64_t RawFlags)
 
static GlobalValue::VisibilityTypes getDecodedVisibility (unsigned Val)
 
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass (unsigned Val)
 
static bool getDecodedDSOLocal (unsigned Val)
 
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode (unsigned Val)
 
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType (unsigned Val)
 
static int getDecodedCastOpcode (unsigned Val)
 
static int getDecodedUnaryOpcode (unsigned Val, Type *Ty)
 
static int getDecodedBinaryOpcode (unsigned Val, Type *Ty)
 
static AtomicRMWInst::BinOp getDecodedRMWOperation (unsigned Val)
 
static AtomicOrdering getDecodedOrdering (unsigned Val)
 
static Comdat::SelectionKind getDecodedComdatSelectionKind (unsigned Val)
 
static FastMathFlags getDecodedFastMathFlags (unsigned Val)
 
static void upgradeDLLImportExportLinkage (GlobalValue *GV, unsigned Val)
 
static uint64_t getRawAttributeMask (Attribute::AttrKind Val)
 
static void addRawAttributeValue (AttrBuilder &B, uint64_t Val)
 
static void decodeLLVMAttributesForBitcode (AttrBuilder &B, uint64_t EncodedAttrs)
 This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integer. More...
 
static Attribute::AttrKind getAttrFromCode (uint64_t Code)
 
static Expected< uint64_t > jumpToValueSymbolTable (uint64_t Offset, BitstreamCursor &Stream)
 Helper to note and return the current location, and jump to the given offset. More...
 
static void inferDSOLocal (GlobalValue *GV)
 
static void parseWholeProgramDevirtResolutionByArg (ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
 
static void parseWholeProgramDevirtResolution (ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
 
static void parseTypeIdSummaryRecord (ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
 
static void setSpecialRefs (std::vector< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
 
static Expected< StringRefreadBlobInRecord (BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
 
static Expected< bool > getEnableSplitLTOUnitFlag (BitstreamCursor &Stream, unsigned ID)
 
static Expected< BitcodeModulegetSingleModule (MemoryBufferRef Buffer)
 

Variables

static cl::opt< bool > PrintSummaryGUIDs ("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
 
static ManagedStatic< BitcodeErrorCategoryType > ErrorCategory
 

Function Documentation

◆ addRawAttributeValue()

static void addRawAttributeValue ( AttrBuilder B,
uint64_t  Val 
)
static

Definition at line 1273 of file BitcodeReader.cpp.

References A, B, getRawAttributeMask(), I, and llvm::None.

Referenced by decodeLLVMAttributesForBitcode().

◆ convertToString()

template<typename StrTy >
static bool convertToString ( ArrayRef< uint64_t >  Record,
unsigned  Idx,
StrTy &  Result 
)
static

Convert a string from a record into an std::string, return true on failure.

Definition at line 151 of file BitcodeReader.cpp.

◆ decodeLLVMAttributesForBitcode()

static void decodeLLVMAttributesForBitcode ( AttrBuilder B,
uint64_t  EncodedAttrs 
)
static

This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integer.

This function must stay in sync with 'encodeLLVMAttributesForBitcode'.

Definition at line 1294 of file BitcodeReader.cpp.

References addRawAttributeValue(), assert(), B, and llvm::isPowerOf2_32().

◆ error()

static Error error ( const Twine Message)
static

Definition at line 103 of file BitcodeReader.cpp.

References llvm::CorruptedBitcode, and llvm::make_error_code().

Referenced by getSingleModule(), and initStream().

◆ getAttrFromCode()

static Attribute::AttrKind getAttrFromCode ( uint64_t  Code)
static

Definition at line 1371 of file BitcodeReader.cpp.

References llvm::bitc::ATTR_KIND_ALIGNMENT, llvm::bitc::ATTR_KIND_ALLOC_SIZE, llvm::bitc::ATTR_KIND_ALWAYS_INLINE, llvm::bitc::ATTR_KIND_ARGMEMONLY, llvm::bitc::ATTR_KIND_BUILTIN, llvm::bitc::ATTR_KIND_BY_VAL, llvm::bitc::ATTR_KIND_BYREF, llvm::bitc::ATTR_KIND_COLD, llvm::bitc::ATTR_KIND_CONVERGENT, llvm::bitc::ATTR_KIND_DEREFERENCEABLE, llvm::bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL, llvm::bitc::ATTR_KIND_ELEMENTTYPE, llvm::bitc::ATTR_KIND_HOT, llvm::bitc::ATTR_KIND_IMMARG, llvm::bitc::ATTR_KIND_IN_ALLOCA, llvm::bitc::ATTR_KIND_IN_REG, llvm::bitc::ATTR_KIND_INACCESSIBLEMEM_ONLY, llvm::bitc::ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY, llvm::bitc::ATTR_KIND_INLINE_HINT, llvm::bitc::ATTR_KIND_JUMP_TABLE, llvm::bitc::ATTR_KIND_MIN_SIZE, llvm::bitc::ATTR_KIND_MUSTPROGRESS, llvm::bitc::ATTR_KIND_NAKED, llvm::bitc::ATTR_KIND_NEST, llvm::bitc::ATTR_KIND_NO_ALIAS, llvm::bitc::ATTR_KIND_NO_BUILTIN, llvm::bitc::ATTR_KIND_NO_CALLBACK, llvm::bitc::ATTR_KIND_NO_CAPTURE, llvm::bitc::ATTR_KIND_NO_DUPLICATE, llvm::bitc::ATTR_KIND_NO_IMPLICIT_FLOAT, llvm::bitc::ATTR_KIND_NO_INLINE, llvm::bitc::ATTR_KIND_NO_MERGE, llvm::bitc::ATTR_KIND_NO_PROFILE, llvm::bitc::ATTR_KIND_NO_RECURSE, llvm::bitc::ATTR_KIND_NO_RED_ZONE, llvm::bitc::ATTR_KIND_NO_RETURN, llvm::bitc::ATTR_KIND_NO_SANITIZE_COVERAGE, llvm::bitc::ATTR_KIND_NO_UNWIND, llvm::bitc::ATTR_KIND_NOCF_CHECK, llvm::bitc::ATTR_KIND_NOFREE, llvm::bitc::ATTR_KIND_NON_LAZY_BIND, llvm::bitc::ATTR_KIND_NON_NULL, llvm::bitc::ATTR_KIND_NOSYNC, llvm::bitc::ATTR_KIND_NOUNDEF, llvm::bitc::ATTR_KIND_NULL_POINTER_IS_VALID, llvm::bitc::ATTR_KIND_OPT_FOR_FUZZING, llvm::bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE, llvm::bitc::ATTR_KIND_OPTIMIZE_NONE, llvm::bitc::ATTR_KIND_PREALLOCATED, llvm::bitc::ATTR_KIND_READ_NONE, llvm::bitc::ATTR_KIND_READ_ONLY, llvm::bitc::ATTR_KIND_RETURNED, llvm::bitc::ATTR_KIND_RETURNS_TWICE, llvm::bitc::ATTR_KIND_S_EXT, llvm::bitc::ATTR_KIND_SAFESTACK, llvm::bitc::ATTR_KIND_SANITIZE_ADDRESS, llvm::bitc::ATTR_KIND_SANITIZE_HWADDRESS, llvm::bitc::ATTR_KIND_SANITIZE_MEMORY, llvm::bitc::ATTR_KIND_SANITIZE_MEMTAG, llvm::bitc::ATTR_KIND_SANITIZE_THREAD, llvm::bitc::ATTR_KIND_SHADOWCALLSTACK, llvm::bitc::ATTR_KIND_SPECULATABLE, llvm::bitc::ATTR_KIND_SPECULATIVE_LOAD_HARDENING, llvm::bitc::ATTR_KIND_STACK_ALIGNMENT, llvm::bitc::ATTR_KIND_STACK_PROTECT, llvm::bitc::ATTR_KIND_STACK_PROTECT_REQ, llvm::bitc::ATTR_KIND_STACK_PROTECT_STRONG, llvm::bitc::ATTR_KIND_STRICT_FP, llvm::bitc::ATTR_KIND_STRUCT_RET, llvm::bitc::ATTR_KIND_SWIFT_ASYNC, llvm::bitc::ATTR_KIND_SWIFT_ERROR, llvm::bitc::ATTR_KIND_SWIFT_SELF, llvm::bitc::ATTR_KIND_UW_TABLE, llvm::bitc::ATTR_KIND_VSCALE_RANGE, llvm::bitc::ATTR_KIND_WILLRETURN, llvm::bitc::ATTR_KIND_WRITEONLY, llvm::bitc::ATTR_KIND_Z_EXT, llvm::tgtok::Code, llvm::CallingConv::Cold, llvm::MCID::Convergent, JumpTable, llvm::None, and llvm::orc::ReadOnly.

◆ getDecodedBinaryOpcode()

static int getDecodedBinaryOpcode ( unsigned  Val,
Type Ty 
)
static

◆ getDecodedCastOpcode()

static int getDecodedCastOpcode ( unsigned  Val)
static

◆ getDecodedComdatSelectionKind()

static Comdat::SelectionKind getDecodedComdatSelectionKind ( unsigned  Val)
static

◆ getDecodedDLLStorageClass()

static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass ( unsigned  Val)
static

Definition at line 981 of file BitcodeReader.cpp.

◆ getDecodedDSOLocal()

static bool getDecodedDSOLocal ( unsigned  Val)
static

Definition at line 990 of file BitcodeReader.cpp.

◆ getDecodedFastMathFlags()

static FastMathFlags getDecodedFastMathFlags ( unsigned  Val)
static

◆ getDecodedFFlags()

static FunctionSummary::FFlags getDecodedFFlags ( uint64_t  RawFlags)
static

◆ getDecodedGVarFlags()

static GlobalVarSummary::GVarFlags getDecodedGVarFlags ( uint64_t  RawFlags)
static

Definition at line 964 of file BitcodeReader.cpp.

References x2().

◆ getDecodedGVSummaryFlags()

static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags ( uint64_t  RawFlags,
uint64_t  Version 
)
static

Definition at line 943 of file BitcodeReader.cpp.

References llvm::IndexedInstrProf::Version.

◆ getDecodedLinkage()

static GlobalValue::LinkageTypes getDecodedLinkage ( unsigned  Val)
static

Definition at line 886 of file BitcodeReader.cpp.

◆ getDecodedOrdering()

static AtomicOrdering getDecodedOrdering ( unsigned  Val)
static

◆ getDecodedRMWOperation()

static AtomicRMWInst::BinOp getDecodedRMWOperation ( unsigned  Val)
static

◆ getDecodedThreadLocalMode()

static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode ( unsigned  Val)
static

Definition at line 998 of file BitcodeReader.cpp.

◆ getDecodedUnaryOpcode()

static int getDecodedUnaryOpcode ( unsigned  Val,
Type Ty 
)
static

◆ getDecodedUnnamedAddrType()

static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType ( unsigned  Val)
static

Definition at line 1009 of file BitcodeReader.cpp.

References llvm::None.

◆ getDecodedVisibility()

static GlobalValue::VisibilityTypes getDecodedVisibility ( unsigned  Val)
static

Definition at line 971 of file BitcodeReader.cpp.

◆ getEnableSplitLTOUnitFlag()

static Expected<bool> getEnableSplitLTOUnitFlag ( BitstreamCursor Stream,
unsigned  ID 
)
static

Definition at line 6843 of file BitcodeReader.cpp.

◆ getRawAttributeMask()

static uint64_t getRawAttributeMask ( Attribute::AttrKind  Val)
static

◆ getSingleModule()

static Expected<BitcodeModule> getSingleModule ( MemoryBufferRef  Buffer)
static

◆ hasImplicitComdat()

static bool hasImplicitComdat ( size_t  Val)
static

Definition at line 874 of file BitcodeReader.cpp.

◆ hasInvalidBitcodeHeader()

static Error hasInvalidBitcodeHeader ( BitstreamCursor Stream)
static

◆ hasObjCCategory()

static Expected<bool> hasObjCCategory ( BitstreamCursor Stream)
static

Definition at line 304 of file BitcodeReader.cpp.

Referenced by llvm::isBitcodeContainingObjCCategory().

◆ hasObjCCategoryInModule()

static Expected<bool> hasObjCCategoryInModule ( BitstreamCursor Stream)
static

Definition at line 257 of file BitcodeReader.cpp.

◆ inferDSOLocal()

static void inferDSOLocal ( GlobalValue GV)
static

◆ initStream()

static Expected<BitstreamCursor> initStream ( MemoryBufferRef  Buffer)
static

◆ jumpToValueSymbolTable()

static Expected<uint64_t> jumpToValueSymbolTable ( uint64_t  Offset,
BitstreamCursor Stream 
)
static

◆ parseTypeIdSummaryRecord()

static void parseTypeIdSummaryRecord ( ArrayRef< uint64_t >  Record,
StringRef  Strtab,
ModuleSummaryIndex TheIndex 
)
static

◆ parseWholeProgramDevirtResolution()

static void parseWholeProgramDevirtResolution ( ArrayRef< uint64_t >  Record,
StringRef  Strtab,
size_t &  Slot,
TypeIdSummary TypeId 
)
static

◆ parseWholeProgramDevirtResolutionByArg()

static void parseWholeProgramDevirtResolutionByArg ( ArrayRef< uint64_t >  Record,
size_t &  Slot,
WholeProgramDevirtResolution Wpd 
)
static

◆ readBlobInRecord()

static Expected<StringRef> readBlobInRecord ( BitstreamCursor Stream,
unsigned  Block,
unsigned  RecordID 
)
static

Definition at line 6593 of file BitcodeReader.cpp.

◆ readIdentificationBlock()

static Expected<std::string> readIdentificationBlock ( BitstreamCursor Stream)
static

Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bitcode, and return the producer name if any.

Definition at line 172 of file BitcodeReader.cpp.

◆ readIdentificationCode()

static Expected<std::string> readIdentificationCode ( BitstreamCursor Stream)
static

Definition at line 222 of file BitcodeReader.cpp.

References llvm::BitstreamCursor::AtEndOfStream().

Referenced by llvm::getBitcodeProducerString().

◆ readModuleTriple()

static Expected<std::string> readModuleTriple ( BitstreamCursor Stream)
static

Definition at line 338 of file BitcodeReader.cpp.

◆ readTriple()

static Expected<std::string> readTriple ( BitstreamCursor Stream)
static

◆ setSpecialRefs()

static void setSpecialRefs ( std::vector< ValueInfo > &  Refs,
unsigned  ROCnt,
unsigned  WOCnt 
)
static

Definition at line 6067 of file BitcodeReader.cpp.

References assert().

◆ stripTBAA()

static void stripTBAA ( Module M)
static

Definition at line 161 of file BitcodeReader.cpp.

References F, I, llvm::instructions(), and M.

◆ upgradeDLLImportExportLinkage()

static void upgradeDLLImportExportLinkage ( GlobalValue GV,
unsigned  Val 
)
static

Definition at line 1158 of file BitcodeReader.cpp.

References llvm::GlobalValue::setDLLStorageClass().

Variable Documentation

◆ ErrorCategory

ManagedStatic<BitcodeErrorCategoryType> ErrorCategory
static

Definition at line 6587 of file BitcodeReader.cpp.

Referenced by llvm::BitcodeErrorCategory().

◆ PrintSummaryGUIDs

cl::opt<bool> PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc( "Print the global id for each value when reading the module summary"))
static