mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-28 15:33:16 +00:00
Do some spring cleaning on FunctionAttrs.cpp with clang-format prior to
other refactorings and cleanups here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@247519 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
92148557f7
commit
10b4880de3
@ -68,8 +68,7 @@ namespace {
|
||||
bool AddArgumentAttrs(const CallGraphSCC &SCC);
|
||||
|
||||
// IsFunctionMallocLike - Does this function allocate new memory?
|
||||
bool IsFunctionMallocLike(Function *F,
|
||||
SmallPtrSet<Function*, 8> &) const;
|
||||
bool IsFunctionMallocLike(Function *F, SmallPtrSet<Function *, 8> &) const;
|
||||
|
||||
// AddNoAliasAttrs - Deduce noalias attributes for the SCC.
|
||||
bool AddNoAliasAttrs(const CallGraphSCC &SCC);
|
||||
@ -158,7 +157,6 @@ INITIALIZE_PASS_END(FunctionAttrs, "functionattrs",
|
||||
|
||||
Pass *llvm::createFunctionAttrsPass() { return new FunctionAttrs(); }
|
||||
|
||||
|
||||
/// AddReadAttrs - Deduce readonly/readnone attributes for the SCC.
|
||||
bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
|
||||
SmallPtrSet<Function *, 8> SCCNodes;
|
||||
@ -299,11 +297,10 @@ bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
|
||||
|
||||
// Clear out any existing attributes.
|
||||
AttrBuilder B;
|
||||
B.addAttribute(Attribute::ReadOnly)
|
||||
.addAttribute(Attribute::ReadNone);
|
||||
F->removeAttributes(AttributeSet::FunctionIndex,
|
||||
AttributeSet::get(F->getContext(),
|
||||
AttributeSet::FunctionIndex, B));
|
||||
B.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone);
|
||||
F->removeAttributes(
|
||||
AttributeSet::FunctionIndex,
|
||||
AttributeSet::get(F->getContext(), AttributeSet::FunctionIndex, B));
|
||||
|
||||
// Add in the new attribute.
|
||||
F->addAttribute(AttributeSet::FunctionIndex,
|
||||
@ -370,10 +367,16 @@ namespace {
|
||||
|
||||
bool captured(const Use *U) override {
|
||||
CallSite CS(U->getUser());
|
||||
if (!CS.getInstruction()) { Captured = true; return true; }
|
||||
if (!CS.getInstruction()) {
|
||||
Captured = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
Function *F = CS.getCalledFunction();
|
||||
if (!F || !SCCNodes.count(F)) { Captured = true; return true; }
|
||||
if (!F || !SCCNodes.count(F)) {
|
||||
Captured = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Found = false;
|
||||
Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end();
|
||||
@ -415,17 +418,15 @@ namespace llvm {
|
||||
return N->Uses.end();
|
||||
}
|
||||
};
|
||||
template<> struct GraphTraits<ArgumentGraph*>
|
||||
: public GraphTraits<ArgumentGraphNode*> {
|
||||
template <>
|
||||
struct GraphTraits<ArgumentGraph *> : public GraphTraits<ArgumentGraphNode *> {
|
||||
static NodeType *getEntryNode(ArgumentGraph *AG) {
|
||||
return AG->getEntryNode();
|
||||
}
|
||||
static ChildIteratorType nodes_begin(ArgumentGraph *AG) {
|
||||
return AG->begin();
|
||||
}
|
||||
static ChildIteratorType nodes_end(ArgumentGraph *AG) {
|
||||
return AG->end();
|
||||
}
|
||||
static ChildIteratorType nodes_end(ArgumentGraph *AG) { return AG->end(); }
|
||||
};
|
||||
}
|
||||
|
||||
@ -573,8 +574,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
// a value can't capture arguments. Don't analyze them.
|
||||
if (F->onlyReadsMemory() && F->doesNotThrow() &&
|
||||
F->getReturnType()->isVoidTy()) {
|
||||
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end();
|
||||
A != E; ++A) {
|
||||
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E;
|
||||
++A) {
|
||||
if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) {
|
||||
A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
|
||||
++NumNoCapture;
|
||||
@ -584,9 +585,10 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end();
|
||||
A != E; ++A) {
|
||||
if (!A->getType()->isPointerTy()) continue;
|
||||
for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E;
|
||||
++A) {
|
||||
if (!A->getType()->isPointerTy())
|
||||
continue;
|
||||
bool HasNonLocalUses = false;
|
||||
if (!A->hasNoCaptureAttr()) {
|
||||
ArgumentUsesTracker Tracker(SCCNodes);
|
||||
@ -594,7 +596,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
if (!Tracker.Captured) {
|
||||
if (Tracker.Uses.empty()) {
|
||||
// If it's trivially not captured, mark it nocapture now.
|
||||
A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo()+1, B));
|
||||
A->addAttr(
|
||||
AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
|
||||
++NumNoCapture;
|
||||
Changed = true;
|
||||
} else {
|
||||
@ -602,8 +605,10 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
// then it must be calling into another function in our SCC. Save
|
||||
// its particulars for Argument-SCC analysis later.
|
||||
ArgumentGraphNode *Node = AG[A];
|
||||
for (SmallVectorImpl<Argument*>::iterator UI = Tracker.Uses.begin(),
|
||||
UE = Tracker.Uses.end(); UI != UE; ++UI) {
|
||||
for (SmallVectorImpl<Argument *>::iterator
|
||||
UI = Tracker.Uses.begin(),
|
||||
UE = Tracker.Uses.end();
|
||||
UI != UE; ++UI) {
|
||||
Node->Uses.push_back(AG[*UI]);
|
||||
if (*UI != A)
|
||||
HasNonLocalUses = true;
|
||||
@ -641,7 +646,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
for (scc_iterator<ArgumentGraph *> I = scc_begin(&AG); !I.isAtEnd(); ++I) {
|
||||
const std::vector<ArgumentGraphNode *> &ArgumentSCC = *I;
|
||||
if (ArgumentSCC.size() == 1) {
|
||||
if (!ArgumentSCC[0]->Definition) continue; // synthetic root node
|
||||
if (!ArgumentSCC[0]->Definition)
|
||||
continue; // synthetic root node
|
||||
|
||||
// eg. "void f(int* x) { if (...) f(x); }"
|
||||
if (ArgumentSCC[0]->Uses.size() == 1 &&
|
||||
@ -663,7 +669,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
SCCCaptured = true;
|
||||
}
|
||||
}
|
||||
if (SCCCaptured) continue;
|
||||
if (SCCCaptured)
|
||||
continue;
|
||||
|
||||
SmallPtrSet<Argument *, 8> ArgumentSCCNodes;
|
||||
// Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for
|
||||
@ -676,7 +683,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
I != E && !SCCCaptured; ++I) {
|
||||
ArgumentGraphNode *N = *I;
|
||||
for (SmallVectorImpl<ArgumentGraphNode *>::iterator UI = N->Uses.begin(),
|
||||
UE = N->Uses.end(); UI != UE; ++UI) {
|
||||
UE = N->Uses.end();
|
||||
UI != UE; ++UI) {
|
||||
Argument *A = (*UI)->Definition;
|
||||
if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A))
|
||||
continue;
|
||||
@ -684,7 +692,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (SCCCaptured) continue;
|
||||
if (SCCCaptured)
|
||||
continue;
|
||||
|
||||
for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
|
||||
Argument *A = ArgumentSCC[i]->Definition;
|
||||
@ -721,8 +730,7 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
if (ReadAttr != Attribute::None) {
|
||||
AttrBuilder B, R;
|
||||
B.addAttribute(ReadAttr);
|
||||
R.addAttribute(Attribute::ReadOnly)
|
||||
.addAttribute(Attribute::ReadNone);
|
||||
R.addAttribute(Attribute::ReadOnly).addAttribute(Attribute::ReadNone);
|
||||
for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
|
||||
Argument *A = ArgumentSCC[i]->Definition;
|
||||
// Clear out existing readonly/readnone attributes
|
||||
@ -739,8 +747,8 @@ bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
|
||||
|
||||
/// IsFunctionMallocLike - A function is malloc-like if it returns either null
|
||||
/// or a pointer that doesn't alias any other pointer visible to the caller.
|
||||
bool FunctionAttrs::IsFunctionMallocLike(Function *F,
|
||||
SmallPtrSet<Function*, 8> &SCCNodes) const {
|
||||
bool FunctionAttrs::IsFunctionMallocLike(
|
||||
Function *F, SmallPtrSet<Function *, 8> &SCCNodes) const {
|
||||
SmallSetVector<Value *, 8> FlowsToReturn;
|
||||
for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
|
||||
if (ReturnInst *Ret = dyn_cast<ReturnInst>(I->getTerminator()))
|
||||
@ -788,8 +796,7 @@ bool FunctionAttrs::IsFunctionMallocLike(Function *F,
|
||||
CallSite CS(RVI);
|
||||
if (CS.paramHasAttr(0, Attribute::NoAlias))
|
||||
break;
|
||||
if (CS.getCalledFunction() &&
|
||||
SCCNodes.count(CS.getCalledFunction()))
|
||||
if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction()))
|
||||
break;
|
||||
} // fall-through
|
||||
default:
|
||||
@ -1012,8 +1019,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::strchr:
|
||||
case LibFunc::strrchr:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isIntegerTy())
|
||||
return false;
|
||||
setOnlyReadsMemory(F);
|
||||
@ -1026,8 +1032,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::strtoll:
|
||||
case LibFunc::strtold:
|
||||
case LibFunc::strtoull:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 2);
|
||||
@ -1039,16 +1044,14 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::strncat:
|
||||
case LibFunc::strncpy:
|
||||
case LibFunc::stpncpy:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 2);
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::strxfrm:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1063,8 +1066,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::strcoll: // 0,1
|
||||
case LibFunc::strcasecmp: // 0,1
|
||||
case LibFunc::strncasecmp: //
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setOnlyReadsMemory(F);
|
||||
@ -1114,8 +1116,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::stat:
|
||||
case LibFunc::statvfs:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1124,8 +1125,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::sscanf:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1135,8 +1135,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::sprintf:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1145,8 +1144,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::snprintf:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1155,8 +1153,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 3);
|
||||
break;
|
||||
case LibFunc::setitimer:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(1)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1165,23 +1162,20 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::system:
|
||||
if (FTy->getNumParams() != 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
// May throw; "system" is a valid pthread cancellation point.
|
||||
setDoesNotCapture(F, 1);
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::malloc:
|
||||
if (FTy->getNumParams() != 1 ||
|
||||
!FTy->getReturnType()->isPointerTy())
|
||||
if (FTy->getNumParams() != 1 || !FTy->getReturnType()->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotAlias(F, 0);
|
||||
break;
|
||||
case LibFunc::memcmp:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setOnlyReadsMemory(F);
|
||||
@ -1199,8 +1193,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::modf:
|
||||
case LibFunc::modff:
|
||||
case LibFunc::modfl:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 2);
|
||||
@ -1208,8 +1201,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::memcpy:
|
||||
case LibFunc::memccpy:
|
||||
case LibFunc::memmove:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 2);
|
||||
@ -1221,23 +1213,20 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotAlias(F, 0);
|
||||
break;
|
||||
case LibFunc::mkdir:
|
||||
if (FTy->getNumParams() == 0 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 1);
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::mktime:
|
||||
if (FTy->getNumParams() == 0 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 1);
|
||||
break;
|
||||
case LibFunc::realloc:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getReturnType()->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1245,15 +1234,13 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 1);
|
||||
break;
|
||||
case LibFunc::read:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
// May throw; "read" is a valid pthread cancellation point.
|
||||
setDoesNotCapture(F, 2);
|
||||
break;
|
||||
case LibFunc::rewind:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 1);
|
||||
@ -1261,16 +1248,14 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::rmdir:
|
||||
case LibFunc::remove:
|
||||
case LibFunc::realpath:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 1);
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::rename:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1280,8 +1265,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::readlink:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1297,8 +1281,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::bcopy:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1307,8 +1290,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::bcmp:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1323,8 +1305,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 1);
|
||||
break;
|
||||
case LibFunc::calloc:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getReturnType()->isPointerTy())
|
||||
if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotAlias(F, 0);
|
||||
@ -1363,8 +1344,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::fopen:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
@ -1376,8 +1356,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::fdopen:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1423,16 +1402,14 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 2);
|
||||
break;
|
||||
case LibFunc::fgets:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 3);
|
||||
break;
|
||||
case LibFunc::fread:
|
||||
if (FTy->getNumParams() != 4 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(3)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1440,8 +1417,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 4);
|
||||
break;
|
||||
case LibFunc::fwrite:
|
||||
if (FTy->getNumParams() != 4 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(3)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1449,8 +1425,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 4);
|
||||
break;
|
||||
case LibFunc::fputs:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1460,8 +1435,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::fscanf:
|
||||
case LibFunc::fprintf:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1470,8 +1444,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::fgetpos:
|
||||
if (FTy->getNumParams() < 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1538,8 +1511,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::utime:
|
||||
case LibFunc::utimes:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1580,8 +1552,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotThrow(F);
|
||||
break;
|
||||
case LibFunc::popen:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
@ -1606,8 +1577,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::vsscanf:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(1)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1617,8 +1587,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::vfscanf:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(1)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1641,8 +1610,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::vfprintf:
|
||||
case LibFunc::vsprintf:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1651,8 +1619,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::vsnprintf:
|
||||
if (FTy->getNumParams() != 4 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 4 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(2)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1668,8 +1635,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::opendir:
|
||||
if (FTy->getNumParams() != 1 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 1 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1697,8 +1663,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotAccessMemory(F);
|
||||
break;
|
||||
case LibFunc::lstat:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1721,8 +1686,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
break;
|
||||
case LibFunc::dunder_strdup:
|
||||
case LibFunc::dunder_strndup:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1731,8 +1695,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::dunder_strtok_r:
|
||||
if (FTy->getNumParams() != 3 ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 2);
|
||||
@ -1751,8 +1714,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setDoesNotCapture(F, 2);
|
||||
break;
|
||||
case LibFunc::dunder_isoc99_scanf:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy())
|
||||
if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
setDoesNotCapture(F, 1);
|
||||
@ -1761,8 +1723,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
case LibFunc::stat64:
|
||||
case LibFunc::lstat64:
|
||||
case LibFunc::statvfs64:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1771,8 +1732,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 1);
|
||||
break;
|
||||
case LibFunc::dunder_isoc99_sscanf:
|
||||
if (FTy->getNumParams() < 1 ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
setDoesNotThrow(F);
|
||||
@ -1782,8 +1742,7 @@ bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
|
||||
setOnlyReadsMemory(F, 2);
|
||||
break;
|
||||
case LibFunc::fopen64:
|
||||
if (FTy->getNumParams() != 2 ||
|
||||
!FTy->getReturnType()->isPointerTy() ||
|
||||
if (FTy->getNumParams() != 2 || !FTy->getReturnType()->isPointerTy() ||
|
||||
!FTy->getParamType(0)->isPointerTy() ||
|
||||
!FTy->getParamType(1)->isPointerTy())
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user