|
LLVM 24.0.0git
|
#include "CoroInternal.h"#include "llvm/ADT/ScopeExit.h"#include "llvm/ADT/SmallString.h"#include "llvm/Analysis/StackLifetime.h"#include "llvm/IR/DIBuilder.h"#include "llvm/IR/DebugInfo.h"#include "llvm/IR/Dominators.h"#include "llvm/IR/IRBuilder.h"#include "llvm/IR/InstIterator.h"#include "llvm/IR/IntrinsicInst.h"#include "llvm/IR/LLVMContext.h"#include "llvm/IR/MDBuilder.h"#include "llvm/IR/Module.h"#include "llvm/IR/ProfDataUtils.h"#include "llvm/Support/Compiler.h"#include "llvm/Support/Debug.h"#include "llvm/Support/OptimizedStructLayout.h"#include "llvm/Transforms/Coroutines/ABI.h"#include "llvm/Transforms/Coroutines/CoroInstr.h"#include "llvm/Transforms/Coroutines/MaterializationUtils.h"#include "llvm/Transforms/Coroutines/SpillUtils.h"#include "llvm/Transforms/Coroutines/SuspendCrossingInfo.h"#include "llvm/Transforms/Utils/BasicBlockUtils.h"#include "llvm/Transforms/Utils/Local.h"#include "llvm/Transforms/Utils/PromoteMemToReg.h"#include <algorithm>#include <optional>Go to the source code of this file.
Namespaces | |
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
| #define | DEBUG_TYPE "coro-frame" |
Functions | |
| static void | dumpSpills (StringRef Title, const coro::SpillInfo &Spills) |
| static void | dumpAllocas (const SmallVectorImpl< coro::AllocaInfo > &Allocas) |
| static void | cacheDIVar (FrameDataInfo &FrameData, DenseMap< Value *, DILocalVariable * > &DIVarCache) |
| static StringRef | solveTypeName (Type *Ty) |
| Create name for Type. | |
| static DIType * | solveDIType (DIBuilder &Builder, Type *Ty, const DataLayout &Layout, DIScope *Scope, unsigned LineNum, DenseMap< Type *, DIType * > &DITypeCache) |
| static void | buildFrameDebugInfo (Function &F, coro::Shape &Shape, FrameDataInfo &FrameData) |
| Build artificial debug info for C++ coroutine frames to allow users to inspect the contents of the frame directly. | |
| static bool | hasAccessingPromiseBeforeCB (const DominatorTree &DT, coro::Shape &Shape) |
| static void | buildFrameLayout (Function &F, const DominatorTree &DT, coro::Shape &Shape, FrameDataInfo &FrameData, bool OptimizeFrame) |
| static Type * | extractByvalIfArgument (Value *MaybeArgument) |
| If MaybeArgument is a byval Argument, return its byval type. | |
| static void | createStoreIntoFrame (IRBuilder<> &Builder, Value *Def, Type *ByValTy, const coro::Shape &Shape, const FrameDataInfo &FrameData) |
| Store Def into the coroutine frame. | |
| static Value * | createGEPToFramePointer (const FrameDataInfo &FrameData, IRBuilder<> &Builder, coro::Shape &Shape, Value *Orig) |
| Returns a pointer into the coroutine frame at the offset where Orig is located. | |
| template<DbgVariableRecord::LocationType record_type> | |
| static TinyPtrVector< DbgVariableRecord * > | findDbgRecordsThroughLoads (Function &F, Value *Def) |
| Find dbg.declare or dbg.declare_value records referencing Def. | |
| static void | handleAccessBeforeCoroBegin (const FrameDataInfo &FrameData, coro::Shape &Shape, IRBuilder<> &Builder, AllocaInst *Alloca) |
| static void | insertSpills (const FrameDataInfo &FrameData, coro::Shape &Shape) |
| static void | movePHIValuesToInsertedBlock (BasicBlock *SuccBB, BasicBlock *InsertedBB, BasicBlock *PredBB, PHINode *UntilPHI=nullptr) |
| static void | rewritePHIsForCleanupPad (BasicBlock *CleanupPadBB, CleanupPadInst *CleanupPad) |
| static void | cleanupSinglePredPHIs (Function &F) |
| static void | rewritePHIs (BasicBlock &BB) |
| static void | rewritePHIs (Function &F) |
| static BasicBlock * | splitBlockIfNotFirst (Instruction *I, const Twine &Name) |
| static void | splitAround (Instruction *I, const Twine &Name) |
| static bool | willLeaveFunctionImmediatelyAfter (BasicBlock *BB, unsigned depth=3) |
| After we split the coroutine, will the given basic block be along an obvious exit path for the resumption function? | |
| static bool | localAllocaNeedsStackSave (CoroAllocaAllocInst *AI) |
| static void | lowerLocalAllocas (ArrayRef< CoroAllocaAllocInst * > LocalAllocas, SmallVectorImpl< Instruction * > &DeadInsts) |
| Turn each of the given local allocas into a normal (dynamic) alloca instruction. | |
| static Value * | emitGetSwiftErrorValue (IRBuilder<> &Builder, Type *ValueTy, coro::Shape &Shape) |
| Get the current swifterror value. | |
| static Value * | emitSetSwiftErrorValue (IRBuilder<> &Builder, Value *V, coro::Shape &Shape) |
| Set the given value as the current swifterror value. | |
| static Value * | emitSetAndGetSwiftErrorValueAround (Instruction *Call, AllocaInst *Alloca, coro::Shape &Shape) |
| Set the swifterror value from the given alloca before a call, then put in back in the alloca afterwards. | |
| static void | eliminateSwiftErrorAlloca (Function &F, AllocaInst *Alloca, coro::Shape &Shape) |
| Eliminate a formerly-swifterror alloca by inserting the get/set intrinsics and attempting to MemToReg the alloca away. | |
| static void | eliminateSwiftErrorArgument (Function &F, Argument &Arg, coro::Shape &Shape, SmallVectorImpl< AllocaInst * > &AllocasToPromote) |
| "Eliminate" a swifterror argument by reducing it to the alloca case and then loading and storing in the prologue and epilog. | |
| static void | eliminateSwiftError (Function &F, coro::Shape &Shape) |
| Eliminate all problematic uses of swifterror arguments and allocas from the function. | |
| static void | sinkLifetimeStartMarkers (Function &F, coro::Shape &Shape, SuspendCrossingInfo &Checker, const DominatorTree &DT) |
| For each local variable that all of its user are only used inside one of suspended region, we sink their lifetime.start markers to the place where after the suspend block. | |
| static std::optional< std::pair< Value &, DIExpression & > > | salvageDebugInfoImpl (SmallDenseMap< Argument *, AllocaInst *, 4 > &ArgToAllocaMap, bool UseEntryValue, Function *F, Value *Storage, DIExpression *Expr, bool SkipOutermostLoad) |
| #define DEBUG_TYPE "coro-frame" |
Definition at line 52 of file CoroFrame.cpp.
|
static |
Build artificial debug info for C++ coroutine frames to allow users to inspect the contents of the frame directly.
Create Debug information for coroutine frame with debug name "__coro_frame". The debug information for the fields of coroutine frame is constructed from the following way:
Definition at line 625 of file CoroFrame.cpp.
References llvm::coro::Shape::ABI, assert(), cacheDIVar(), llvm::DIBuilder::createAutoVariable(), llvm::DIBuilder::createBasicType(), llvm::DIBuilder::createExpression(), llvm::DIBuilder::createMemberType(), llvm::DIBuilder::createPointerType(), llvm::DIBuilder::createStructType(), llvm::DbgVariableRecord::Declare, llvm::coro::Shape::SwitchLoweringStorage::DestroyOffset, llvm::dyn_cast(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), F, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::coro::Shape::FrameAlign, llvm::coro::Shape::FramePtr, llvm::coro::Shape::FrameSize, llvm::DICompileUnit::FullDebug, llvm::MDNode::get(), llvm::ValueAsMetadata::get(), llvm::AllocaInst::getAllocatedType(), llvm::AllocaInst::getAllocationSize(), llvm::MDNode::getContext(), llvm::DIScope::getFile(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getFixedValue(), llvm::coro::Shape::getIndexType(), llvm::coro::Shape::getInsertPtAfterFramePtr(), llvm::DIType::getName(), llvm::DIBuilder::getOrCreateArray(), llvm::DataLayout::getPointerABIAlignment(), llvm::DataLayout::getPointerSizeInBits(), llvm::coro::Shape::getSwitchResumePointerType(), llvm::DataLayout::getTypeSizeInBits(), llvm::coro::Shape::SwitchLoweringStorage::IndexAlign, llvm::coro::Shape::SwitchLoweringStorage::IndexOffset, llvm::dwarf::isCPlusPlus(), llvm::Offset, llvm::DIBuilder::replaceArrays(), Size, solveDIType(), llvm::StringRef::str(), llvm::Twine::str(), llvm::coro::Switch, llvm::coro::Shape::SwitchLowering, uint64_t, and llvm::Align::value().
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 805 of file CoroFrame.cpp.
References A(), llvm::coro::Shape::ABI, llvm::alignTo(), assert(), llvm::coro::Async, llvm::coro::Shape::AsyncLowering, B(), llvm::cast(), llvm::coro::Shape::AsyncLoweringStorage::ContextHeaderSize, llvm::coro::Shape::AsyncLoweringStorage::ContextSize, llvm::coro::Shape::CoroSuspends, llvm::coro::Shape::SwitchLoweringStorage::DestroyOffset, DL, llvm::dyn_cast(), F, llvm::coro::Shape::FrameAlign, llvm::coro::Shape::AsyncLoweringStorage::FrameOffset, llvm::coro::Shape::FrameSize, llvm::coro::Shape::AsyncLoweringStorage::getContextAlignment(), llvm::Type::getIntNTy(), llvm::coro::Shape::getPromiseAlloca(), llvm::coro::Shape::getRetconCoroId(), llvm::coro::Shape::getSwitchResumePointerType(), hasAccessingPromiseBeforeCB(), llvm::coro::Shape::SwitchLoweringStorage::IndexAlign, llvm::coro::Shape::SwitchLoweringStorage::IndexOffset, llvm::coro::Shape::SwitchLoweringStorage::IndexType, llvm::coro::Shape::RetconLoweringStorage::IsFrameInlineInStorage, llvm::Log2_64_Ceil(), llvm::report_fatal_error(), llvm::coro::Retcon, llvm::coro::Shape::RetconLowering, llvm::coro::RetconOnce, llvm::coro::Switch, and llvm::coro::Shape::SwitchLowering.
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 480 of file CoroFrame.cpp.
References llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::contains(), llvm::find_if(), llvm::findDVRDeclares(), llvm::findDVRDeclareValues(), I, and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert().
Referenced by buildFrameDebugInfo().
|
static |
Definition at line 1388 of file CoroFrame.cpp.
References llvm::SmallVectorTemplateCommon< T, typename >::empty(), F, llvm::SmallVectorImpl< T >::pop_back_val(), and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by llvm::coro::normalizeCoroutine().
|
static |
Returns a pointer into the coroutine frame at the offset where Orig is located.
Definition at line 970 of file CoroFrame.cpp.
References assert(), llvm::coro::Shape::CoroBegin, llvm::dyn_cast(), llvm::coro::Shape::FramePtr, llvm::AllocaInst::getAlign(), llvm::Value::getContext(), llvm::Type::getInt64Ty(), llvm::Instruction::getModule(), llvm::Value::getName(), llvm::AllocaInst::getType(), llvm::Value::getType(), llvm::IntPtrTy, llvm::Offset, uint64_t, and llvm::Align::value().
Referenced by handleAccessBeforeCoroBegin(), and insertSpills().
|
static |
Store Def into the coroutine frame.
Definition at line 943 of file CoroFrame.cpp.
References llvm::coro::Shape::CoroBegin, DL, llvm::coro::Shape::FramePtr, G, llvm::Value::getContext(), llvm::Type::getInt64Ty(), llvm::Offset, Size, and uint64_t.
Referenced by insertSpills().
|
static |
Definition at line 151 of file CoroFrame.cpp.
References A(), and llvm::dbgs().
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 141 of file CoroFrame.cpp.
References llvm::dbgs(), E(), and I.
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Eliminate all problematic uses of swifterror arguments and allocas from the function.
We'll fix them up later when splitting the function.
Definition at line 1718 of file CoroFrame.cpp.
References llvm::dyn_cast(), eliminateSwiftErrorAlloca(), eliminateSwiftErrorArgument(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), F, llvm::AllocaInst::isSwiftError(), llvm::PromoteMemToReg(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::AllocaInst::setSwiftError().
Referenced by llvm::coro::normalizeCoroutine().
|
static |
Eliminate a formerly-swifterror alloca by inserting the get/set intrinsics and attempting to MemToReg the alloca away.
Definition at line 1654 of file CoroFrame.cpp.
References assert(), Call, llvm::cast(), emitSetAndGetSwiftErrorValueAround(), F, llvm::Use::getUser(), llvm::isa(), llvm::isAllocaPromotable(), llvm::make_early_inc_range(), llvm::Use::set(), and llvm::Value::uses().
Referenced by eliminateSwiftError(), and eliminateSwiftErrorArgument().
|
static |
"Eliminate" a swifterror argument by reducing it to the alloca case and then loading and storing in the prologue and epilog.
The argument keeps the swifterror flag.
Definition at line 1680 of file CoroFrame.cpp.
References llvm::cast(), llvm::coro::Shape::CoroEnds, llvm::coro::Shape::CoroSuspends, eliminateSwiftErrorAlloca(), emitSetAndGetSwiftErrorValueAround(), emitSetSwiftErrorValue(), F, llvm::Constant::getNullValue(), llvm::Value::getType(), llvm::PointerType::getUnqual(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::Value::replaceAllUsesWith().
Referenced by eliminateSwiftError().
|
static |
Get the current swifterror value.
Definition at line 1591 of file CoroFrame.cpp.
References Call, llvm::ConstantPointerNull::get(), llvm::FunctionType::get(), and llvm::coro::Shape::SwiftErrorOps.
Referenced by emitSetAndGetSwiftErrorValueAround().
|
static |
Set the swifterror value from the given alloca before a call, then put in back in the alloca afterwards.
Returns an address that will stand in for the swifterror slot until splitting.
Definition at line 1624 of file CoroFrame.cpp.
References Call, llvm::cast(), emitGetSwiftErrorValue(), emitSetSwiftErrorValue(), llvm::AllocaInst::getAllocatedType(), and llvm::isa().
Referenced by eliminateSwiftErrorAlloca(), and eliminateSwiftErrorArgument().
|
static |
Set the given value as the current swifterror value.
Returns a slot that can be used as a swifterror slot.
Definition at line 1606 of file CoroFrame.cpp.
References Call, llvm::ConstantPointerNull::get(), llvm::FunctionType::get(), and llvm::coro::Shape::SwiftErrorOps.
Referenced by eliminateSwiftErrorArgument(), and emitSetAndGetSwiftErrorValueAround().
If MaybeArgument is a byval Argument, return its byval type.
Also removes the captures attribute, so that the argument value may be stored directly on the coroutine frame.
Definition at line 932 of file CoroFrame.cpp.
References llvm::dyn_cast().
Referenced by insertSpills().
|
static |
Find dbg.declare or dbg.declare_value records referencing Def.
If none are found, walk up the load chain to find one.
Definition at line 1004 of file CoroFrame.cpp.
References llvm::cast(), llvm::DbgVariableRecord::Declare, llvm::DbgVariableRecord::DeclareValue, llvm::SmallVectorTemplateCommon< T, typename >::empty(), F, llvm::findDVRDeclares(), llvm::findDVRDeclareValues(), and llvm::isa().
Referenced by insertSpills().
|
static |
Definition at line 1034 of file CoroFrame.cpp.
References createGEPToFramePointer(), G, llvm::AllocaInst::getAlign(), and Size.
Referenced by insertSpills().
|
static |
Definition at line 769 of file CoroFrame.cpp.
References llvm::any_of(), llvm::isa(), llvm::coro::Shape::SwitchLoweringStorage::PromiseAlloca, and llvm::coro::Shape::SwitchLowering.
Referenced by buildFrameLayout().
|
static |
Definition at line 1065 of file CoroFrame.cpp.
References A(), llvm::coro::Shape::ABI, llvm::coro::Shape::AllocaSpillBlock, assert(), llvm::coro::Async, llvm::BasicBlock::begin(), C(), llvm::cast(), llvm::SmallVectorImpl< T >::clear(), llvm::coro::Shape::CoroBegin, createGEPToFramePointer(), createStoreIntoFrame(), llvm::MDBuilder::createTBAAScalarTypeNode(), llvm::MDBuilder::createTBAAStructTagNode(), llvm::DbgVariableRecord::Declare, llvm::DbgVariableRecord::DeclareValue, llvm::DominatorTree::dominates(), llvm::dyn_cast(), E(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::Instruction::eraseFromParent(), extractByvalIfArgument(), F, llvm::filterDbgVars(), findDbgRecordsThroughLoads(), llvm::findDbgUsers(), llvm::for_each(), FramePtr, G, GEP, llvm::IntegerType::get(), llvm::ValueAsMetadata::get(), llvm::Value::getContext(), llvm::BasicBlock::getFirstInsertionPt(), llvm::Instruction::getFunction(), llvm::MDNode::getIfExists(), llvm::MDString::getIfExists(), llvm::coro::Shape::getInsertPtAfterFramePtr(), llvm::Value::getName(), llvm::BasicBlock::getParent(), llvm::coro::getSpillInsertionPt(), handleAccessBeforeCoroBegin(), I, llvm::make_early_inc_range(), P, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Value::replaceAllUsesWith(), llvm::coro::Retcon, llvm::coro::RetconOnce, llvm::coro::salvageDebugInfo(), llvm::BasicBlock::splitBasicBlock(), llvm::Value::user_empty(), llvm::Value::users(), and llvm::DbgVariableRecord::Value.
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 1535 of file CoroFrame.cpp.
References llvm::dyn_cast(), llvm::Value::users(), and willLeaveFunctionImmediatelyAfter().
Referenced by lowerLocalAllocas().
|
static |
Turn each of the given local allocas into a normal (dynamic) alloca instruction.
Definition at line 1553 of file CoroFrame.cpp.
References llvm::cast(), llvm::isa(), localAllocaNeedsStackSave(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::AllocaInst::setAlignment(), and llvm::Value::users().
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 1281 of file CoroFrame.cpp.
References llvm::PHINode::addIncoming(), llvm::BasicBlock::begin(), llvm::cast(), llvm::PHINode::Create(), llvm::dyn_cast(), llvm::BasicBlock::front(), llvm::Value::getName(), and llvm::Instruction::insertBefore().
Referenced by rewritePHIs(), and rewritePHIsForCleanupPad().
|
static |
Definition at line 1405 of file CoroFrame.cpp.
References assert(), llvm::PHINode::Create(), llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::ehAwareSplitEdge(), llvm::BasicBlock::empty(), llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getFirstNonPHIIt(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::Value::getName(), llvm::Value::getType(), llvm::Instruction::insertBefore(), movePHIValuesToInsertedBlock(), llvm::predecessors(), llvm::Value::replaceAllUsesWith(), rewritePHIsForCleanupPad(), and llvm::Value::takeName().
|
static |
Definition at line 1481 of file CoroFrame.cpp.
References llvm::dyn_cast(), F, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and rewritePHIs().
|
static |
Definition at line 1299 of file CoroFrame.cpp.
References llvm::BasicBlock::Create(), llvm::MDBuilder::createBranchWeights(), llvm::BasicBlock::getContext(), llvm::Value::getName(), llvm::BasicBlock::getParent(), llvm::Instruction::insertAfter(), llvm::MDBuilder::kUnlikelyBranchWeight, movePHIValuesToInsertedBlock(), llvm::pred_size(), llvm::predecessors(), llvm::ProfcheckDisableMetadataFixes, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::Instruction::removeFromParent(), llvm::setUnwindEdgeTo(), and llvm::updatePhiNodes().
Referenced by rewritePHIs().
|
static |
Definition at line 1833 of file CoroFrame.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, llvm::DIExpression::appendOpsToArg(), llvm::DIExpression::DerefBefore, llvm::dyn_cast(), llvm::dyn_cast_or_null(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::DIExpression::EntryValue, F, llvm::DIExpression::foldConstantMath(), llvm::Value::getName(), llvm::DIExpression::getNumLocationOperands(), llvm::Value::getType(), llvm::isa(), llvm::DIExpression::isEntryValue(), llvm::DIExpression::isSingleLocationExpression(), llvm::DIExpression::prepend(), and llvm::salvageDebugInfoImpl().
|
static |
For each local variable that all of its user are only used inside one of suspended region, we sink their lifetime.start markers to the place where after the suspend block.
Doing so minimizes the lifetime of each variable, hence minimizing the amount of data we end up putting on the frame.
Definition at line 1753 of file CoroFrame.cpp.
References assert(), llvm::cast(), llvm::coro::Shape::CoroSuspends, llvm::DominatorTree::dominates(), llvm::dyn_cast(), F, llvm::BasicBlock::getParent(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSingleSuccessor(), I, II, llvm::SmallPtrSetImpl< PtrType >::insert(), instructions, llvm::SuspendCrossingInfo::isDefinitionAcrossSuspend(), isLifetimeStart(), llvm::coro::isSuspendBlock(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::Value::users().
Referenced by llvm::coro::BaseABI::buildCoroutineFrame().
|
static |
Definition at line 538 of file CoroFrame.cpp.
References assert(), llvm::BitWidth, llvm::cast(), llvm::dbgs(), llvm::DataLayout::getABITypeAlign(), llvm::DIType::getAlignInBits(), llvm::StructLayout::getElementOffsetInBits(), llvm::TypeSize::getFixed(), llvm::DIType::getName(), llvm::DataLayout::getPrefTypeAlign(), llvm::DIType::getSizeInBits(), llvm::DataLayout::getStructLayout(), llvm::DataLayout::getTypeSizeInBits(), I, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), LLVM_DEBUG, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), Size, solveDIType(), solveTypeName(), and llvm::Align::value().
Referenced by buildFrameDebugInfo(), and solveDIType().
Create name for Type.
It uses MDString to store new created string to avoid memory leak.
Definition at line 500 of file CoroFrame.cpp.
References llvm::cast(), llvm::MDString::get(), llvm::raw_svector_ostream::str(), and llvm::SmallString< InternalLen >::str().
Referenced by solveDIType().
|
static |
Definition at line 1508 of file CoroFrame.cpp.
References I, and splitBlockIfNotFirst().
Referenced by llvm::coro::normalizeCoroutine().
|
static |
|
static |
After we split the coroutine, will the given basic block be along an obvious exit path for the resumption function?
Definition at line 1515 of file CoroFrame.cpp.
References llvm::coro::isSuspendBlock(), llvm::successors(), and willLeaveFunctionImmediatelyAfter().
Referenced by localAllocaNeedsStackSave(), and willLeaveFunctionImmediatelyAfter().