LLVM 22.0.0git
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/STLExtras.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.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/AttributeMask.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/ConstantRangeList.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/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalIFunc.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/IntrinsicsAArch64.h"
#include "llvm/IR/IntrinsicsARM.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/ProfDataUtils.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/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/ModRef.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Triple.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdint>
#include <deque>
#include <map>
#include <memory>
#include <optional>
#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.
static void stripTBAA (Module *M)
static Expected< std::stringreadIdentificationBlock (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.
static Expected< std::stringreadIdentificationCode (BitstreamCursor &Stream)
static Expected< boolhasObjCCategoryInModule (BitstreamCursor &Stream)
static Expected< boolhasObjCCategory (BitstreamCursor &Stream)
static Expected< std::stringreadModuleTriple (BitstreamCursor &Stream)
static Expected< std::stringreadTriple (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 std::pair< CalleeInfo::HotnessType, boolgetDecodedHotnessCallEdgeInfo (uint64_t RawFlags)
static void getDecodedRelBFCallEdgeInfo (uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static GlobalValue::VisibilityTypes getDecodedVisibility (unsigned Val)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass (unsigned Val)
static bool getDecodedDSOLocal (unsigned Val)
static std::optional< CodeModel::ModelgetDecodedCodeModel (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 GEPNoWrapFlags toGEPNoWrapFlags (uint64_t Flags)
static bool isConstExprSupported (const BitcodeConstant *BC)
static uint64_t getRawAttributeMask (Attribute::AttrKind Val)
static void addRawAttributeValue (AttrBuilder &B, uint64_t Val)
static void decodeLLVMAttributesForBitcode (AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
 This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integer.
static Attribute::AttrKind getAttrFromCode (uint64_t Code)
static bool upgradeOldMemoryAttribute (MemoryEffects &ME, uint64_t EncodedKind)
static Expected< uint64_tjumpToValueSymbolTable (uint64_t Offset, BitstreamCursor &Stream)
 Helper to note and return the current location, and jump to the given offset.
static void inferDSOLocal (GlobalValue *GV)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata (unsigned V)
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 (SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static Expected< StringRefreadBlobInRecord (BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag (BitstreamCursor &Stream, unsigned ID, BitcodeLTOInfo &LTOInfo)
static Expected< BitcodeModulegetSingleModule (MemoryBufferRef Buffer)

Variables

static cl::opt< boolPrintSummaryGUIDs ("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static cl::opt< boolExpandConstantExprs ("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))

Function Documentation

◆ addRawAttributeValue()

void addRawAttributeValue ( AttrBuilder & B,
uint64_t Val )
static

◆ convertToString()

template<typename StrTy>
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 160 of file BitcodeReader.cpp.

Referenced by hasObjCCategoryInModule(), readIdentificationBlock(), and readModuleTriple().

◆ decodeLLVMAttributesForBitcode()

◆ deserializeSanitizerMetadata()

GlobalValue::SanitizerMetadata deserializeSanitizerMetadata ( unsigned V)

Definition at line 4081 of file BitcodeReader.cpp.

◆ error()

Error error ( const Twine & Message)
static

◆ getAttrFromCode()

Attribute::AttrKind getAttrFromCode ( uint64_t Code)
static

Definition at line 2058 of file BitcodeReader.cpp.

References llvm::bitc::ATTR_KIND_ALIGNMENT, llvm::bitc::ATTR_KIND_ALLOC_ALIGN, llvm::bitc::ATTR_KIND_ALLOC_KIND, llvm::bitc::ATTR_KIND_ALLOC_SIZE, llvm::bitc::ATTR_KIND_ALLOCATED_POINTER, llvm::bitc::ATTR_KIND_ALWAYS_INLINE, llvm::bitc::ATTR_KIND_BUILTIN, llvm::bitc::ATTR_KIND_BY_VAL, llvm::bitc::ATTR_KIND_BYREF, llvm::bitc::ATTR_KIND_CAPTURES, llvm::bitc::ATTR_KIND_COLD, llvm::bitc::ATTR_KIND_CONVERGENT, llvm::bitc::ATTR_KIND_CORO_ELIDE_SAFE, llvm::bitc::ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE, llvm::bitc::ATTR_KIND_DEAD_ON_RETURN, llvm::bitc::ATTR_KIND_DEAD_ON_UNWIND, llvm::bitc::ATTR_KIND_DEREFERENCEABLE, llvm::bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL, llvm::bitc::ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION, llvm::bitc::ATTR_KIND_ELEMENTTYPE, llvm::bitc::ATTR_KIND_FNRETTHUNK_EXTERN, 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_INITIALIZES, llvm::bitc::ATTR_KIND_INLINE_HINT, llvm::bitc::ATTR_KIND_JUMP_TABLE, llvm::bitc::ATTR_KIND_MEMORY, 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_DIVERGENCE_SOURCE, llvm::bitc::ATTR_KIND_NO_DUPLICATE, llvm::bitc::ATTR_KIND_NO_EXT, 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_BOUNDS, llvm::bitc::ATTR_KIND_NO_SANITIZE_COVERAGE, llvm::bitc::ATTR_KIND_NO_UNWIND, llvm::bitc::ATTR_KIND_NOCF_CHECK, llvm::bitc::ATTR_KIND_NOFPCLASS, 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_DEBUGGING, llvm::bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE, llvm::bitc::ATTR_KIND_OPTIMIZE_NONE, llvm::bitc::ATTR_KIND_PREALLOCATED, llvm::bitc::ATTR_KIND_PRESPLIT_COROUTINE, llvm::bitc::ATTR_KIND_RANGE, 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_NUMERICAL_STABILITY, llvm::bitc::ATTR_KIND_SANITIZE_REALTIME, llvm::bitc::ATTR_KIND_SANITIZE_REALTIME_BLOCKING, llvm::bitc::ATTR_KIND_SANITIZE_THREAD, llvm::bitc::ATTR_KIND_SANITIZE_TYPE, llvm::bitc::ATTR_KIND_SHADOWCALLSTACK, llvm::bitc::ATTR_KIND_SKIP_PROFILE, 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_WRITABLE, llvm::bitc::ATTR_KIND_WRITEONLY, llvm::bitc::ATTR_KIND_Z_EXT, and llvm::Attribute::None.

◆ getDecodedBinaryOpcode()

◆ getDecodedCastOpcode()

◆ getDecodedCodeModel()

std::optional< CodeModel::Model > getDecodedCodeModel ( unsigned Val)
static

◆ getDecodedComdatSelectionKind()

◆ getDecodedDLLStorageClass()

◆ getDecodedDSOLocal()

bool getDecodedDSOLocal ( unsigned Val)
static

Definition at line 1229 of file BitcodeReader.cpp.

◆ getDecodedFastMathFlags()

◆ getDecodedFFlags()

FunctionSummary::FFlags getDecodedFFlags ( uint64_t RawFlags)
static

Definition at line 1146 of file BitcodeReader.cpp.

References llvm::FunctionSummary::FFlags::ReadNone.

◆ getDecodedGVarFlags()

GlobalVarSummary::GVarFlags getDecodedGVarFlags ( uint64_t RawFlags)
static

Definition at line 1187 of file BitcodeReader.cpp.

◆ getDecodedGVSummaryFlags()

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

Definition at line 1165 of file BitcodeReader.cpp.

References Linkage, and Local.

◆ getDecodedHotnessCallEdgeInfo()

std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo ( uint64_t RawFlags)
static

Definition at line 1195 of file BitcodeReader.cpp.

◆ getDecodedLinkage()

◆ getDecodedOrdering()

◆ getDecodedRelBFCallEdgeInfo()

void getDecodedRelBFCallEdgeInfo ( uint64_t RawFlags,
uint64_t & RelBF,
bool & HasTailCall )
static

Definition at line 1202 of file BitcodeReader.cpp.

References llvm::CalleeInfo::RelBlockFreqBits.

◆ getDecodedRMWOperation()

◆ getDecodedThreadLocalMode()

◆ getDecodedUnaryOpcode()

int getDecodedUnaryOpcode ( unsigned Val,
Type * Ty )
static

Definition at line 1294 of file BitcodeReader.cpp.

References llvm::bitc::UNOP_FNEG.

◆ getDecodedUnnamedAddrType()

GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType ( unsigned Val)
static

◆ getDecodedVisibility()

◆ getEnableSplitLTOUnitAndUnifiedFlag()

◆ getRawAttributeMask()

◆ getSingleModule()

◆ hasImplicitComdat()

bool hasImplicitComdat ( size_t Val)
static

Definition at line 1092 of file BitcodeReader.cpp.

◆ hasInvalidBitcodeHeader()

◆ hasObjCCategory()

◆ hasObjCCategoryInModule()

◆ inferDSOLocal()

◆ initStream()

◆ isConstExprSupported()

◆ jumpToValueSymbolTable()

◆ parseTypeIdSummaryRecord()

◆ parseWholeProgramDevirtResolution()

◆ parseWholeProgramDevirtResolutionByArg()

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

◆ readBlobInRecord()

◆ readIdentificationBlock()

◆ readIdentificationCode()

◆ readModuleTriple()

◆ readTriple()

◆ setSpecialRefs()

void setSpecialRefs ( SmallVectorImpl< ValueInfo > & Refs,
unsigned ROCnt,
unsigned WOCnt )
static

◆ stripTBAA()

void stripTBAA ( Module * M)
static

Definition at line 170 of file BitcodeReader.cpp.

References F, I, and instructions.

◆ toGEPNoWrapFlags()

◆ upgradeDLLImportExportLinkage()

◆ upgradeOldMemoryAttribute()

Variable Documentation

◆ ExpandConstantExprs

cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc( "Expand constant expressions to instructions for testing purposes")) ( "expand-constant-exprs" ,
cl::Hidden ,
cl::desc( "Expand constant expressions to instructions for testing purposes")  )
static

Referenced by isConstExprSupported().

◆ 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")) ( "print-summary-global-ids" ,
cl::init(false) ,
cl::Hidden ,
cl::desc( "Print the global id for each value when reading the module summary")  )
static