LLVM 24.0.0git
LowerTypeTests.cpp File Reference
#include "llvm/Transforms/IPO/LowerTypeTests.h"
#include "IPOOptions.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/EquivalenceClasses.h"
#include "llvm/ADT/FunctionExtras.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/TinyPtrVector.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Analysis/TypeMetadataUtils.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/AsmParser/Parser.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DIBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalAlias.h"
#include "llvm/IR/GlobalObject.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IR/ModuleSummaryIndexYAML.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/ProfDataUtils.h"
#include "llvm/IR/ReplaceConstant.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Object/ModuleSymbolTable.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/TrailingObjects.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/TargetParser/Triple.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <set>
#include <string>
#include <system_error>
#include <utility>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "lowertypetests"

Functions

 STATISTIC (ByteArraySizeBits, "Byte array size in bits")
 STATISTIC (ByteArraySizeBytes, "Byte array size in bytes")
 STATISTIC (NumByteArraysCreated, "Number of byte arrays created")
 STATISTIC (NumTypeTestCallsLowered, "Number of type test calls lowered")
 STATISTIC (NumTypeIdDisjointSets, "Number of disjoint sets of type identifiers")
static ConstantInt * extractNumericTypeId (MDNode &MD)
 Extracts a numeric type identifier from an MDNode containing type metadata.
static CfiFunctionLinkage decodeCfiFunctionLinkage (uint8_t Encoded)
static CfiFunctionHotness decodeCfiFunctionHotness (uint8_t Encoded)
static uint8_t encodeCfiFunctionLinkage (CfiFunctionLinkage Linkage, CfiFunctionHotness Hotness)
static void createCfiFunctionsMetadata (Module &DestM, ArrayRef< GlobalValue * > CfiFunctions, ProfileSummaryInfo &PSI, function_ref< const BlockFrequencyInfo &(Function &)> BFIGetter)
static void createCfiAliasesMetadata (Module &DestM, const Module &SrcM)
static void createCfiSymversMetadata (Module &DestM, const Module &SrcM)
static BitSetInfo buildBitSet (ArrayRef< uint64_t > Offsets)
 Build a bit set for list of offsets.
static Value * createMaskedBitTest (IRBuilder<> &B, Value *Bits, Value *BitOffset)
 Build a test that bit BitOffset mod sizeof(Bits)*8 is set in Bits.
static bool isKnownTypeIdMember (Metadata *TypeId, const DataLayout &DL, Value *V, uint64_t COffset)
static auto buildBitSets (ArrayRef< Metadata * > TypeIds, const DenseMap< GlobalTypeMember *, uint64_t > &GlobalLayout)
static bool isThumbFunction (Function *F, Triple::ArchType ModuleArch)
static SmallVector< DILocation * > createJumpTableDebugInfo (Function *F, ArrayRef< GlobalTypeMember * > Functions)
static bool isDirectCall (Use &U)
static void dropTypeTests (Module &M, Function &TypeTestFunc, bool ShouldDropAll)
static bool dropTypeTests (Module &M, bool ShouldDropAll)

Variables

static const unsigned kX86JumpTableEntrySize = 8
static const unsigned kX86IBTJumpTableEntrySize = 16
static const unsigned kARMJumpTableEntrySize = 4
static const unsigned kARMBTIJumpTableEntrySize = 8
static const unsigned kARMv6MJumpTableEntrySize = 16
static const unsigned kRISCVJumpTableEntrySize = 8
static const unsigned kLOONGARCH64JumpTableEntrySize = 8
static const unsigned kHexagonJumpTableEntrySize = 4

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "lowertypetests"

Definition at line 101 of file LowerTypeTests.cpp.

Function Documentation

◆ buildBitSet()

BitSetInfo buildBitSet ( ArrayRef< uint64_t > Offsets)
static

Build a bit set for list of offsets.

Definition at line 835 of file LowerTypeTests.cpp.

References llvm::lowertypetests::BitSetBuilder::build().

Referenced by buildBitSets().

◆ buildBitSets()

◆ createCfiAliasesMetadata()

◆ createCfiFunctionsMetadata()

◆ createCfiSymversMetadata()

◆ createJumpTableDebugInfo()

◆ createMaskedBitTest()

Value * createMaskedBitTest ( IRBuilder<> & B,
Value * Bits,
Value * BitOffset )
static

Build a test that bit BitOffset mod sizeof(Bits)*8 is set in Bits.

This pattern matches to the bt instruction on x86.

Definition at line 843 of file LowerTypeTests.cpp.

References B(), llvm::BitWidth, and llvm::cast().

◆ decodeCfiFunctionHotness()

CfiFunctionHotness decodeCfiFunctionHotness ( uint8_t Encoded)
static

Definition at line 410 of file LowerTypeTests.cpp.

Referenced by encodeCfiFunctionLinkage().

◆ decodeCfiFunctionLinkage()

CfiFunctionLinkage decodeCfiFunctionLinkage ( uint8_t Encoded)
static

Definition at line 406 of file LowerTypeTests.cpp.

Referenced by encodeCfiFunctionLinkage().

◆ dropTypeTests() [1/2]

◆ dropTypeTests() [2/2]

◆ encodeCfiFunctionLinkage()

uint8_t encodeCfiFunctionLinkage ( CfiFunctionLinkage Linkage,
CfiFunctionHotness Hotness )
static

◆ extractNumericTypeId()

ConstantInt * extractNumericTypeId ( MDNode & MD)
static

Extracts a numeric type identifier from an MDNode containing type metadata.

Definition at line 292 of file LowerTypeTests.cpp.

References C(), llvm::dyn_cast(), llvm::dyn_cast_or_null(), and llvm::MDNode::getOperand().

Referenced by llvm::lowertypetests::findCfiTypeIds().

◆ isDirectCall()

bool isDirectCall ( Use & U)
static

Definition at line 2342 of file LowerTypeTests.cpp.

References llvm::dyn_cast().

◆ isKnownTypeIdMember()

bool isKnownTypeIdMember ( Metadata * TypeId,
const DataLayout & DL,
Value * V,
uint64_t COffset )
static

◆ isThumbFunction()

◆ STATISTIC() [1/5]

STATISTIC ( ByteArraySizeBits ,
"Byte array size in bits"  )

◆ STATISTIC() [2/5]

STATISTIC ( ByteArraySizeBytes ,
"Byte array size in bytes"  )

◆ STATISTIC() [3/5]

STATISTIC ( NumByteArraysCreated ,
"Number of byte arrays created"  )

◆ STATISTIC() [4/5]

STATISTIC ( NumTypeIdDisjointSets ,
"Number of disjoint sets of type identifiers"  )

◆ STATISTIC() [5/5]

STATISTIC ( NumTypeTestCallsLowered ,
"Number of type test calls lowered"  )

Variable Documentation

◆ kARMBTIJumpTableEntrySize

const unsigned kARMBTIJumpTableEntrySize = 8
static

Definition at line 1536 of file LowerTypeTests.cpp.

◆ kARMJumpTableEntrySize

const unsigned kARMJumpTableEntrySize = 4
static

Definition at line 1535 of file LowerTypeTests.cpp.

◆ kARMv6MJumpTableEntrySize

const unsigned kARMv6MJumpTableEntrySize = 16
static

Definition at line 1537 of file LowerTypeTests.cpp.

◆ kHexagonJumpTableEntrySize

const unsigned kHexagonJumpTableEntrySize = 4
static

Definition at line 1540 of file LowerTypeTests.cpp.

◆ kLOONGARCH64JumpTableEntrySize

const unsigned kLOONGARCH64JumpTableEntrySize = 8
static

Definition at line 1539 of file LowerTypeTests.cpp.

◆ kRISCVJumpTableEntrySize

const unsigned kRISCVJumpTableEntrySize = 8
static

Definition at line 1538 of file LowerTypeTests.cpp.

◆ kX86IBTJumpTableEntrySize

const unsigned kX86IBTJumpTableEntrySize = 16
static

Definition at line 1534 of file LowerTypeTests.cpp.

◆ kX86JumpTableEntrySize

const unsigned kX86JumpTableEntrySize = 8
static

Definition at line 1533 of file LowerTypeTests.cpp.