本文整理汇总了C++中llvm::SmallVectorImpl类的典型用法代码示例。如果您正苦于以下问题:C++ SmallVectorImpl类的具体用法?C++ SmallVectorImpl怎么用?C++ SmallVectorImpl使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了SmallVectorImpl类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: collectAllModules
void HeaderSearch::collectAllModules(llvm::SmallVectorImpl<Module *> &Modules) {
Modules.clear();
// Load module maps for each of the header search directories.
for (unsigned Idx = 0, N = SearchDirs.size(); Idx != N; ++Idx) {
if (SearchDirs[Idx].isFramework()) {
llvm::error_code EC;
SmallString<128> DirNative;
llvm::sys::path::native(SearchDirs[Idx].getFrameworkDir()->getName(),
DirNative);
// Search each of the ".framework" directories to load them as modules.
bool IsSystem = SearchDirs[Idx].getDirCharacteristic() != SrcMgr::C_User;
for (llvm::sys::fs::directory_iterator Dir(DirNative.str(), EC), DirEnd;
Dir != DirEnd && !EC; Dir.increment(EC)) {
if (llvm::sys::path::extension(Dir->path()) != ".framework")
continue;
const DirectoryEntry *FrameworkDir = FileMgr.getDirectory(Dir->path());
if (!FrameworkDir)
continue;
// Load this framework module.
loadFrameworkModule(llvm::sys::path::stem(Dir->path()), FrameworkDir,
IsSystem);
}
continue;
}
// FIXME: Deal with header maps.
if (SearchDirs[Idx].isHeaderMap())
continue;
// Try to load a module map file for the search directory.
loadModuleMapFile(SearchDirs[Idx].getDir());
// Try to load module map files for immediate subdirectories of this search
// directory.
llvm::error_code EC;
SmallString<128> DirNative;
llvm::sys::path::native(SearchDirs[Idx].getDir()->getName(), DirNative);
for (llvm::sys::fs::directory_iterator Dir(DirNative.str(), EC), DirEnd;
Dir != DirEnd && !EC; Dir.increment(EC)) {
loadModuleMapFile(Dir->path());
}
}
// Populate the list of modules.
for (ModuleMap::module_iterator M = ModMap.module_begin(),
MEnd = ModMap.module_end();
M != MEnd; ++M) {
Modules.push_back(M->getValue());
}
}
示例2: allIncomingValuesEqual
static SILValue allIncomingValuesEqual(
llvm::SmallVectorImpl<std::pair<SILBasicBlock *,
SILValue >> &IncomingValues) {
SILValue First = stripRCIdentityPreservingInsts(IncomingValues[0].second);
if (std::all_of(std::next(IncomingValues.begin()), IncomingValues.end(),
[&First](std::pair<SILBasicBlock *, SILValue> P) -> bool {
return stripRCIdentityPreservingInsts(P.second) == First;
}))
return First;
return SILValue();
}
示例3: strlen
void
HostThreadLinux::GetName(lldb::thread_t thread, llvm::SmallVectorImpl<char> &name)
{
// Read /proc/$TID/comm file.
lldb::DataBufferSP buf_sp = process_linux::ProcFileReader::ReadIntoDataBuffer(thread, "comm");
const char *comm_str = (const char *)buf_sp->GetBytes();
const char *cr_str = ::strchr(comm_str, '\n');
size_t length = cr_str ? (cr_str - comm_str) : strlen(comm_str);
name.clear();
name.append(comm_str, comm_str + length);
}
示例4: optimizeMatchingSet
// This routine takes in the ARCMatchingSet \p MatchSet and inserts new
// increments, decrements at the insertion points and adds the old increment,
// decrements to the delete list. Sets changed to true if anything was moved or
// deleted.
void ARCPairingContext::optimizeMatchingSet(
ARCMatchingSet &MatchSet, llvm::SmallVectorImpl<SILInstruction *> &NewInsts,
llvm::SmallVectorImpl<SILInstruction *> &DeadInsts) {
DEBUG(llvm::dbgs() << "**** Optimizing Matching Set ****\n");
// Insert the new increments.
for (SILInstruction *InsertPt : MatchSet.IncrementInsertPts) {
if (!InsertPt) {
DEBUG(llvm::dbgs() << " No insertion point, not inserting increment "
"into new position.\n");
continue;
}
MadeChange = true;
SILInstruction *NewIncrement = createIncrement(MatchSet.Ptr, InsertPt);
NewInsts.push_back(NewIncrement);
DEBUG(llvm::dbgs() << " Inserting new increment: " << *NewIncrement
<< " At insertion point: " << *InsertPt);
++NumRefCountOpsMoved;
}
// Insert the new decrements.
for (SILInstruction *InsertPt : MatchSet.DecrementInsertPts) {
if (!InsertPt) {
DEBUG(llvm::dbgs() << " No insertion point, not inserting decrement "
"into its new position.\n");
continue;
}
MadeChange = true;
SILInstruction *NewDecrement = createDecrement(MatchSet.Ptr, InsertPt);
NewInsts.push_back(NewDecrement);
DEBUG(llvm::dbgs() << " Inserting new NewDecrement: " << *NewDecrement
<< " At insertion point: " << *InsertPt);
++NumRefCountOpsMoved;
}
// Add the old increments to the delete list.
for (SILInstruction *Increment : MatchSet.Increments) {
MadeChange = true;
DEBUG(llvm::dbgs() << " Deleting increment: " << *Increment);
DeadInsts.push_back(Increment);
++NumRefCountOpsRemoved;
}
// Add the old decrements to the delete list.
for (SILInstruction *Decrement : MatchSet.Decrements) {
MadeChange = true;
DEBUG(llvm::dbgs() << " Deleting decrement: " << *Decrement);
DeadInsts.push_back(Decrement);
++NumRefCountOpsRemoved;
}
}
示例5: findEndOfWord
/// \brief Find the end of the word starting at the given offset
/// within a string.
///
/// \returns the index pointing one character past the end of the
/// word.
static unsigned findEndOfWord(unsigned Start,
const llvm::SmallVectorImpl<char> &Str,
unsigned Length, unsigned Column,
unsigned Columns) {
assert(Start < Str.size() && "Invalid start position!");
unsigned End = Start + 1;
// If we are already at the end of the string, take that as the word.
if (End == Str.size())
return End;
// Determine if the start of the string is actually opening
// punctuation, e.g., a quote or parentheses.
char EndPunct = findMatchingPunctuation(Str[Start]);
if (!EndPunct) {
// This is a normal word. Just find the first space character.
while (End < Length && !isspace(Str[End]))
++End;
return End;
}
// We have the start of a balanced punctuation sequence (quotes,
// parentheses, etc.). Determine the full sequence is.
llvm::SmallVector<char, 16> PunctuationEndStack;
PunctuationEndStack.push_back(EndPunct);
while (End < Length && !PunctuationEndStack.empty()) {
if (Str[End] == PunctuationEndStack.back())
PunctuationEndStack.pop_back();
else if (char SubEndPunct = findMatchingPunctuation(Str[End]))
PunctuationEndStack.push_back(SubEndPunct);
++End;
}
// Find the first space character after the punctuation ended.
while (End < Length && !isspace(Str[End]))
++End;
unsigned PunctWordLength = End - Start;
if (// If the word fits on this line
Column + PunctWordLength <= Columns ||
// ... or the word is "short enough" to take up the next line
// without too much ugly white space
PunctWordLength < Columns/3)
return End; // Take the whole thing as a single "word".
// The whole quoted/parenthesized string is too long to print as a
// single "word". Instead, find the "word" that starts just after
// the punctuation and use that end-point instead. This will recurse
// until it finds something small enough to consider a word.
return findEndOfWord(Start + 1, Str, Length, Column + 1, Columns);
}
示例6: getPartialSpecializations
void ClassTemplateDecl::getPartialSpecializations(
llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
= getPartialSpecializations();
PS.clear();
PS.resize(PartialSpecs.size());
for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
P != PEnd; ++P) {
assert(!PS[P->getSequenceNumber()]);
PS[P->getSequenceNumber()] = P->getMostRecentDeclaration();
}
}
示例7: EnumerateSourceSinks
llvm::ArrayRef<CS_Sink> EnumerateSourceSinks(
CS_Source source, llvm::SmallVectorImpl<CS_Sink>& vec, CS_Status* status) {
auto data = Sources::GetInstance().Get(source);
if (!data) {
*status = CS_INVALID_HANDLE;
return llvm::ArrayRef<CS_Sink>{};
}
vec.clear();
Sinks::GetInstance().ForEach([&](CS_Sink sinkHandle, const SinkData& data) {
if (source == data.sourceHandle.load()) vec.push_back(sinkHandle);
});
return vec;
}
示例8: devirtualizeAndSpecializeApplies
// Devirtualize and specialize a group of applies, returning a
// worklist of newly exposed function references that should be
// considered for inlining before continuing with the caller that has
// the passed-in applies.
//
// The returned worklist is stacked such that the last things we want
// to process are earlier on the list.
//
// Returns true if any changes were made.
bool SILPerformanceInliner::devirtualizeAndSpecializeApplies(
llvm::SmallVectorImpl<ApplySite> &Applies,
SILModuleTransform *MT,
ClassHierarchyAnalysis *CHA,
llvm::SmallVectorImpl<SILFunction *> &WorkList) {
assert(WorkList.empty() && "Expected empty worklist for return results!");
bool ChangedAny = false;
// The set of all new function references generated by
// devirtualization and specialization.
llvm::SetVector<SILFunction *> NewRefs;
// Process all applies passed in, plus any new ones that are pushed
// on as a result of specializing the referenced functions.
while (!Applies.empty()) {
auto Apply = Applies.back();
Applies.pop_back();
bool ChangedApply = false;
if (auto FullApply = FullApplySite::isa(Apply.getInstruction())) {
if (auto NewApply = devirtualize(FullApply, CHA)) {
ChangedApply = true;
Apply = ApplySite(NewApply.getInstruction());
}
}
llvm::SmallVector<ApplySite, 4> NewApplies;
if (auto NewApply = specializeGeneric(Apply, NewApplies)) {
ChangedApply = true;
Apply = NewApply;
Applies.insert(Applies.end(), NewApplies.begin(), NewApplies.end());
}
if (ChangedApply) {
ChangedAny = true;
auto *NewCallee = Apply.getCalleeFunction();
assert(NewCallee && "Expected directly referenced function!");
// Track all new references to function definitions.
if (NewCallee->isDefinition())
NewRefs.insert(NewCallee);
// TODO: Do we need to invalidate everything at this point?
// What about side-effects analysis? What about type analysis?
MT->invalidateAnalysis(Apply.getFunction(),
SILAnalysis::InvalidationKind::Everything);
}
}
// Copy out all the new function references gathered.
if (ChangedAny)
WorkList.insert(WorkList.end(), NewRefs.begin(), NewRefs.end());
return ChangedAny;
}
示例9: gatherUsers
void SILValueOwnershipChecker::gatherUsers(
llvm::SmallVectorImpl<SILInstruction *> &LifetimeEndingUsers,
llvm::SmallVectorImpl<SILInstruction *> &NonLifetimeEndingUsers) {
for (Operand *Op : Value->getUses()) {
auto *User = Op->getUser();
if (OwnershipCompatibilityUseChecker(Mod, *Op).check(User)) {
DEBUG(llvm::dbgs() << " Lifetime Ending User: " << *User);
LifetimeEndingUsers.push_back(User);
} else {
DEBUG(llvm::dbgs() << " Regular User: " << *User);
NonLifetimeEndingUsers.push_back(User);
}
}
}
示例10: canonicalize
llvm::error_code canonicalize(const llvm::Twine &path, llvm::SmallVectorImpl<char> &result) {
std::string p = path.str();
#ifdef PATH_MAX
int path_max = PATH_MAX;
#else
int path_max = pathconf(p.c_str(), _PC_PATH_MAX);
if (path_max <= 0)
path_max = 4096;
#endif
result.resize(path_max);
realpath(p.c_str(), result.data());
result.resize(strlen(result.data()));
return llvm::error_code::success();
}
示例11: getSpelling
/// getSpelling - This method is used to get the spelling of a token into a
/// SmallVector. Note that the returned StringRef may not point to the
/// supplied buffer if a copy can be avoided.
llvm::StringRef Preprocessor::getSpelling(const Token &Tok,
llvm::SmallVectorImpl<char> &Buffer,
bool *Invalid) const {
// Try the fast path.
if (const IdentifierInfo *II = Tok.getIdentifierInfo())
return II->getName();
// Resize the buffer if we need to copy into it.
if (Tok.needsCleaning())
Buffer.resize(Tok.getLength());
const char *Ptr = Buffer.data();
unsigned Len = getSpelling(Tok, Ptr, Invalid);
return llvm::StringRef(Ptr, Len);
}
示例12: findNominalsAndOperators
static void findNominalsAndOperators(
llvm::MapVector<const NominalTypeDecl *, bool> &foundNominals,
llvm::SmallVectorImpl<const FuncDecl *> &foundOperators,
DeclRange members) {
for (const Decl *D : members) {
auto *VD = dyn_cast<ValueDecl>(D);
if (!VD)
continue;
if (VD->hasAccessibility() &&
VD->getFormalAccess() <= Accessibility::FilePrivate) {
continue;
}
if (VD->getFullName().isOperator()) {
foundOperators.push_back(cast<FuncDecl>(VD));
continue;
}
auto nominal = dyn_cast<NominalTypeDecl>(D);
if (!nominal)
continue;
foundNominals[nominal] |= true;
findNominalsAndOperators(foundNominals, foundOperators,
nominal->getMembers());
}
}
示例13: descriptorsForFile
void
PMDescriptor::
descriptorsForFile(StringRef Filename,
llvm::SmallVectorImpl<PMDescriptor> &Descriptors) {
namespace yaml = llvm::yaml;
// Load the input file.
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> FileBufOrErr =
llvm::MemoryBuffer::getFileOrSTDIN(Filename);
if (!FileBufOrErr) {
llvm_unreachable("Failed to read yaml file");
}
StringRef Buffer = FileBufOrErr->get()->getBuffer();
llvm::SourceMgr SM;
yaml::Stream Stream(Buffer, SM);
yaml::document_iterator DI = Stream.begin();
assert(DI != Stream.end() && "Failed to read a document");
yaml::Node *N = DI->getRoot();
assert(N && "Failed to find a root");
auto *RootList = cast<yaml::SequenceNode>(N);
for (auto &PMDescriptorIter : make_range(RootList->begin(), RootList->end())) {
PMDescriptor PM(cast<yaml::SequenceNode>(&PMDescriptorIter));
Descriptors.push_back(std::move(PM));
}
}
示例14:
void
DeclContext::collectAllContexts(llvm::SmallVectorImpl<DeclContext *> &Contexts){
Contexts.clear();
if (DeclKind != Decl::Namespace) {
Contexts.push_back(this);
return;
}
NamespaceDecl *Self = static_cast<NamespaceDecl *>(this);
for (NamespaceDecl *N = Self->getMostRecentDecl(); N;
N = N->getPreviousDecl())
Contexts.push_back(N);
std::reverse(Contexts.begin(), Contexts.end());
}
示例15: legalizeVectorType
void swiftcall::legalizeVectorType(CodeGenModule &CGM, CharUnits origVectorSize,
llvm::VectorType *origVectorTy,
llvm::SmallVectorImpl<llvm::Type*> &components) {
// If it's already a legal vector type, use it.
if (isLegalVectorType(CGM, origVectorSize, origVectorTy)) {
components.push_back(origVectorTy);
return;
}
// Try to split the vector into legal subvectors.
auto numElts = origVectorTy->getNumElements();
auto eltTy = origVectorTy->getElementType();
assert(numElts != 1);
// The largest size that we're still considering making subvectors of.
// Always a power of 2.
unsigned logCandidateNumElts = llvm::findLastSet(numElts, llvm::ZB_Undefined);
unsigned candidateNumElts = 1U << logCandidateNumElts;
assert(candidateNumElts <= numElts && candidateNumElts * 2 > numElts);
// Minor optimization: don't check the legality of this exact size twice.
if (candidateNumElts == numElts) {
logCandidateNumElts--;
candidateNumElts >>= 1;
}