LLVM  8.0.1
Macros | Functions | Variables
LowerTypeTests.cpp File Reference
#include "llvm/Transforms/IPO/LowerTypeTests.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/EquivalenceClasses.h"
#include "llvm/ADT/PointerUnion.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/ADT/Triple.h"
#include "llvm/Analysis/TypeMetadataUtils.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.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/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/ModuleSummaryIndexYAML.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.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/TrailingObjects.h"
#include "llvm/Support/YAMLTraits.h"
#include "llvm/Support/raw_ostream.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 <memory>
#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")
 
 INITIALIZE_PASS (LowerTypeTests, "lowertypetests", "Lower type metadata", false, false) ModulePass *llvm
 
static ValuecreateMaskedBitTest (IRBuilder<> &B, Value *Bits, Value *BitOffset)
 Build a test that bit BitOffset mod sizeof(Bits)*8 is set in Bits. More...
 
static bool isKnownTypeIdMember (Metadata *TypeId, const DataLayout &DL, Value *V, uint64_t COffset)
 
static bool isThumbFunction (Function *F, Triple::ArchType ModuleArch)
 
static Triple::ArchType selectJumpTableArmEncoding (ArrayRef< GlobalTypeMember *> Functions, Triple::ArchType ModuleArch)
 
static bool isDirectCall (Use &U)
 

Variables

static cl::opt< boolAvoidReuse ("lowertypetests-avoid-reuse", cl::desc("Try to avoid reuse of byte array addresses using aliases"), cl::Hidden, cl::init(true))
 
static cl::opt< PassSummaryActionClSummaryAction ("lowertypetests-summary-action", cl::desc("What to do with the summary when running this pass"), cl::values(clEnumValN(PassSummaryAction::None, "none", "Do nothing"), clEnumValN(PassSummaryAction::Import, "import", "Import typeid resolutions from summary and globals"), clEnumValN(PassSummaryAction::Export, "export", "Export typeid resolutions to summary and globals")), cl::Hidden)
 
static cl::opt< std::string > ClReadSummary ("lowertypetests-read-summary", cl::desc("Read summary from given YAML file before running pass"), cl::Hidden)
 
static cl::opt< std::string > ClWriteSummary ("lowertypetests-write-summary", cl::desc("Write summary to given YAML file after running pass"), cl::Hidden)
 
static const unsigned kX86JumpTableEntrySize = 8
 
static const unsigned kARMJumpTableEntrySize = 4
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "lowertypetests"

Definition at line 87 of file LowerTypeTests.cpp.

Function Documentation

◆ createMaskedBitTest()

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

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( LowerTypeTests  ,
"lowertypetests"  ,
"Lower type metadata ,
false  ,
false   
)

◆ isDirectCall()

static bool isDirectCall ( Use U)
static

◆ isKnownTypeIdMember()

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

Definition at line 630 of file LowerTypeTests.cpp.

References llvm::PHINode::addIncoming(), llvm::lowertypetests::BitSetInfo::AlignLog2, llvm::TypeTestResolution::AlignLog2, llvm::alignTo(), llvm::TypeTestResolution::AllOnes, assert(), B, llvm::tgtok::Bit, llvm::TypeTestResolution::BitMask, llvm::lowertypetests::BitSetInfo::Bits, llvm::lowertypetests::BitSetInfo::BitSize, llvm::TypeTestResolution::ByteArray, llvm::lowertypetests::BitSetInfo::ByteOffset, C, llvm::GlobalAlias::create(), llvm::Function::Create(), llvm::BranchInst::Create(), llvm::IRBuilder< T, Inserter >::CreateICmpEQ(), llvm::IRBuilder< T, Inserter >::CreateICmpULE(), llvm::IRBuilder< T, Inserter >::CreateLShr(), llvm::IRBuilder< T, Inserter >::CreateOr(), llvm::IRBuilder< T, Inserter >::CreatePHI(), llvm::IRBuilder< T, Inserter >::CreatePtrToInt(), llvm::IRBuilder< T, Inserter >::CreateShl(), llvm::IRBuilder< T, Inserter >::CreateSub(), llvm::dbgs(), llvm::dyn_cast(), llvm::Triple::ELF, llvm::tgtok::Else, llvm::Instruction::eraseFromParent(), llvm::GlobalVariable::eraseFromParent(), llvm::GlobalValue::ExternalLinkage, F(), G, GEP, llvm::ConstantInt::get(), llvm::ConstantAggregateZero::get(), llvm::ArrayType::get(), llvm::ConstantAsMetadata::get(), llvm::MDNode::get(), llvm::GlobalValue::getAddressSpace(), llvm::PointerType::getAddressSpace(), llvm::ConstantStruct::getAnon(), llvm::CallBase::getArgOperand(), llvm::ConstantExpr::getBitCast(), llvm::ConstantInt::getFalse(), llvm::Function::getFunctionType(), llvm::ConstantExpr::getGetElementPtr(), llvm::GlobalVariable::getInitializer(), llvm::IRBuilderBase::GetInsertBlock(), llvm::ConstantExpr::getIntToPtr(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::GlobalValue::getLinkage(), llvm::Value::getName(), llvm::ilist_node_with_parent< NodeTy, ParentTy, Options >::getNextNode(), llvm::MDNode::getNumOperands(), llvm::MDNode::getOperand(), llvm::Instruction::getParent(), llvm::DataLayout::getPointerSizeInBits(), llvm::ConstantExpr::getPtrToInt(), llvm::DataLayout::getStructLayout(), llvm::ConstantExpr::getSub(), llvm::ConstantInt::getTrue(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::DataLayout::getTypeAllocSize(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::getVisibility(), llvm::ConstantExpr::getZExt(), llvm::Value::hasOneUse(), llvm::GlobalObject::hasSection(), llvm::GlobalValue::HiddenVisibility, I, llvm::TypeTestResolution::Inline, llvm::TypeTestResolution::InlineBits, Int32Ty, llvm::lowertypetests::BitSetInfo::isAllOnes(), llvm::GlobalValue::isDeclarationForLinker(), llvm::GlobalValue::isDSOLocal(), llvm::GlobalValue::isThreadLocal(), llvm::GlobalValue::isWeakForLinker(), LLVM_DEBUG, llvm::LLVMContext::MD_absolute_symbol, llvm::LLVMContext::MD_prof, llvm::LLVMContext::MD_type, Name, llvm::NextPowerOf2(), P, llvm::BasicBlock::phis(), llvm::lowertypetests::BitSetInfo::print(), llvm::GlobalValue::PrivateLinkage, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::ReplaceInstWithInst(), llvm::report_fatal_error(), llvm::MCID::Select, llvm::IRBuilderBase::SetInsertPoint(), llvm::GlobalValue::setLinkage(), llvm::Instruction::setMetadata(), llvm::Value::setName(), llvm::GlobalValue::setVisibility(), llvm::TypeTestResolution::Single, llvm::TypeTestResolution::SizeM1, llvm::TypeTestResolution::SizeM1BitWidth, llvm::BasicBlock::splitBasicBlock(), llvm::SplitBlockAndInsertIfThen(), llvm::Constant::stripPointerCasts(), llvm::Value::takeName(), llvm::TypeTestResolution::TheKind, llvm::TypeIdSummary::TTRes, llvm::TypeTestResolution::Unsat, llvm::Value::user_begin(), llvm::Value::uses(), Visibility, llvm::Triple::x86, and llvm::Triple::x86_64.

◆ isThumbFunction()

static bool isThumbFunction ( Function F,
Triple::ArchType  ModuleArch 
)
static

◆ selectJumpTableArmEncoding()

static Triple::ArchType selectJumpTableArmEncoding ( ArrayRef< GlobalTypeMember *>  Functions,
Triple::ArchType  ModuleArch 
)
static

Definition at line 1273 of file LowerTypeTests.cpp.

References llvm::Function::addFnAttr(), llvm::lowertypetests::GlobalLayoutBuilder::addFragment(), Arg, llvm::Triple::arm, assert(), ClReadSummary, ClSummaryAction, ClWriteSummary, llvm::GlobalAlias::create(), llvm::BasicBlock::Create(), llvm::Function::Create(), llvm::ArrayRef< T >::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::errorCodeToError(), llvm::errorOrToExpected(), llvm::Export, llvm::GlobalValue::ExternalLinkage, F(), llvm::sys::fs::F_Text, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::InlineAsm::get(), llvm::ConstantInt::get(), llvm::FunctionType::get(), llvm::ArrayType::get(), llvm::ConstantAsMetadata::get(), llvm::ConstantPointerNull::get(), llvm::MDNode::get(), llvm::PointerType::getAddressSpace(), llvm::Triple::getArch(), llvm::ConstantExpr::getBitCast(), llvm::Function::getContext(), llvm::MemoryBuffer::getFile(), llvm::ConstantExpr::getInBoundsGetElementPtr(), llvm::GlobalValue::getLinkage(), llvm::Value::getName(), llvm::MDNode::getOperand(), llvm::ConstantExpr::getPointerCast(), llvm::Module::getTargetTriple(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::GlobalValue::getValueType(), llvm::GlobalValue::getVisibility(), llvm::Type::getVoidTy(), llvm::Function::hasAddressTaken(), llvm::GlobalValue::hasLocalLinkage(), llvm::GlobalValue::HiddenVisibility, I, llvm::Import, llvm::tgtok::In, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::insert(), isThumbFunction(), llvm::GlobalValue::isWeakForLinker(), llvm::ISD::JumpTable, llvm::Attribute::Naked, llvm::Attribute::NoUnwind, llvm::GlobalValue::PrivateLinkage, llvm::SmallVectorTemplateBase< T >::push_back(), llvm::report_fatal_error(), llvm::SmallVectorImpl< T >::reserve(), llvm::GlobalObject::setAlignment(), llvm::GlobalObject::setMetadata(), llvm::Value::setName(), llvm::GlobalValue::setVisibility(), llvm::SmallVectorBase::size(), llvm::ArrayRef< T >::size(), llvm::raw_string_ostream::str(), llvm::Triple::thumb, and llvm::Triple::Win32.

◆ 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 ( NumTypeTestCallsLowered  ,
"Number of type test calls lowered"   
)

◆ STATISTIC() [5/5]

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

Variable Documentation

◆ AvoidReuse

cl::opt<bool> AvoidReuse("lowertypetests-avoid-reuse", cl::desc("Try to avoid reuse of byte array addresses using aliases"), cl::Hidden, cl::init(true))
static

Referenced by createMaskedBitTest().

◆ ClReadSummary

cl::opt<std::string> ClReadSummary("lowertypetests-read-summary", cl::desc("Read summary from given YAML file before running pass"), cl::Hidden)
static

◆ ClSummaryAction

cl::opt<PassSummaryAction> ClSummaryAction("lowertypetests-summary-action", cl::desc("What to do with the summary when running this pass"), cl::values(clEnumValN(PassSummaryAction::None, "none", "Do nothing"), clEnumValN(PassSummaryAction::Import, "import", "Import typeid resolutions from summary and globals"), clEnumValN(PassSummaryAction::Export, "export", "Export typeid resolutions to summary and globals")), cl::Hidden)
static

◆ ClWriteSummary

cl::opt<std::string> ClWriteSummary("lowertypetests-write-summary", cl::desc("Write summary to given YAML file after running pass"), cl::Hidden)
static

◆ kARMJumpTableEntrySize

const unsigned kARMJumpTableEntrySize = 4
static

Definition at line 1133 of file LowerTypeTests.cpp.

◆ kX86JumpTableEntrySize

const unsigned kX86JumpTableEntrySize = 8
static

Definition at line 1132 of file LowerTypeTests.cpp.