LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FunctionAttrs.cpp
Go to the documentation of this file.
1 //===- FunctionAttrs.cpp - Pass which marks functions attributes ----------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements a simple interprocedural pass which walks the
11 // call-graph, looking for functions which do not access or only read
12 // non-local memory, and marking them readnone/readonly. It does the
13 // same with function arguments independently, marking them readonly/
14 // readnone/nocapture. Finally, well-known library call declarations
15 // are marked with all attributes that are consistent with the
16 // function's standard definition. This pass is implemented as a
17 // bottom-up traversal of the call-graph.
18 //
19 //===----------------------------------------------------------------------===//
20 
21 #define DEBUG_TYPE "functionattrs"
22 #include "llvm/Transforms/IPO.h"
23 #include "llvm/ADT/SCCIterator.h"
24 #include "llvm/ADT/SetVector.h"
25 #include "llvm/ADT/SmallSet.h"
26 #include "llvm/ADT/Statistic.h"
31 #include "llvm/IR/GlobalVariable.h"
32 #include "llvm/IR/IntrinsicInst.h"
33 #include "llvm/IR/LLVMContext.h"
36 using namespace llvm;
37 
38 STATISTIC(NumReadNone, "Number of functions marked readnone");
39 STATISTIC(NumReadOnly, "Number of functions marked readonly");
40 STATISTIC(NumNoCapture, "Number of arguments marked nocapture");
41 STATISTIC(NumReadNoneArg, "Number of arguments marked readnone");
42 STATISTIC(NumReadOnlyArg, "Number of arguments marked readonly");
43 STATISTIC(NumNoAlias, "Number of function returns marked noalias");
44 STATISTIC(NumAnnotated, "Number of attributes added to library functions");
45 
46 namespace {
47  struct FunctionAttrs : public CallGraphSCCPass {
48  static char ID; // Pass identification, replacement for typeid
49  FunctionAttrs() : CallGraphSCCPass(ID), AA(0) {
51  }
52 
53  // runOnSCC - Analyze the SCC, performing the transformation if possible.
54  bool runOnSCC(CallGraphSCC &SCC);
55 
56  // AddReadAttrs - Deduce readonly/readnone attributes for the SCC.
57  bool AddReadAttrs(const CallGraphSCC &SCC);
58 
59  // AddArgumentAttrs - Deduce nocapture attributes for the SCC.
60  bool AddArgumentAttrs(const CallGraphSCC &SCC);
61 
62  // IsFunctionMallocLike - Does this function allocate new memory?
63  bool IsFunctionMallocLike(Function *F,
65 
66  // AddNoAliasAttrs - Deduce noalias attributes for the SCC.
67  bool AddNoAliasAttrs(const CallGraphSCC &SCC);
68 
69  // Utility methods used by inferPrototypeAttributes to add attributes
70  // and maintain annotation statistics.
71 
72  void setDoesNotAccessMemory(Function &F) {
73  if (!F.doesNotAccessMemory()) {
75  ++NumAnnotated;
76  }
77  }
78 
79  void setOnlyReadsMemory(Function &F) {
80  if (!F.onlyReadsMemory()) {
82  ++NumAnnotated;
83  }
84  }
85 
86  void setDoesNotThrow(Function &F) {
87  if (!F.doesNotThrow()) {
88  F.setDoesNotThrow();
89  ++NumAnnotated;
90  }
91  }
92 
93  void setDoesNotCapture(Function &F, unsigned n) {
94  if (!F.doesNotCapture(n)) {
95  F.setDoesNotCapture(n);
96  ++NumAnnotated;
97  }
98  }
99 
100  void setOnlyReadsMemory(Function &F, unsigned n) {
101  if (!F.onlyReadsMemory(n)) {
102  F.setOnlyReadsMemory(n);
103  ++NumAnnotated;
104  }
105  }
106 
107  void setDoesNotAlias(Function &F, unsigned n) {
108  if (!F.doesNotAlias(n)) {
109  F.setDoesNotAlias(n);
110  ++NumAnnotated;
111  }
112  }
113 
114  // inferPrototypeAttributes - Analyze the name and prototype of the
115  // given function and set any applicable attributes. Returns true
116  // if any attributes were set and false otherwise.
117  bool inferPrototypeAttributes(Function &F);
118 
119  // annotateLibraryCalls - Adds attributes to well-known standard library
120  // call declarations.
121  bool annotateLibraryCalls(const CallGraphSCC &SCC);
122 
123  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
124  AU.setPreservesCFG();
128  }
129 
130  private:
131  AliasAnalysis *AA;
132  TargetLibraryInfo *TLI;
133  };
134 }
135 
136 char FunctionAttrs::ID = 0;
137 INITIALIZE_PASS_BEGIN(FunctionAttrs, "functionattrs",
138  "Deduce function attributes", false, false)
143  "Deduce function attributes", false, false)
144 
145 Pass *llvm::createFunctionAttrsPass() { return new FunctionAttrs(); }
146 
147 
148 /// AddReadAttrs - Deduce readonly/readnone attributes for the SCC.
149 bool FunctionAttrs::AddReadAttrs(const CallGraphSCC &SCC) {
150  SmallPtrSet<Function*, 8> SCCNodes;
151 
152  // Fill SCCNodes with the elements of the SCC. Used for quickly
153  // looking up whether a given CallGraphNode is in this SCC.
154  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
155  SCCNodes.insert((*I)->getFunction());
156 
157  // Check if any of the functions in the SCC read or write memory. If they
158  // write memory then they can't be marked readnone or readonly.
159  bool ReadsMemory = false;
160  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
161  Function *F = (*I)->getFunction();
162 
163  if (F == 0)
164  // External node - may write memory. Just give up.
165  return false;
166 
167  AliasAnalysis::ModRefBehavior MRB = AA->getModRefBehavior(F);
169  // Already perfect!
170  continue;
171 
172  // Definitions with weak linkage may be overridden at linktime with
173  // something that writes memory, so treat them like declarations.
174  if (F->isDeclaration() || F->mayBeOverridden()) {
176  // May write memory. Just give up.
177  return false;
178 
179  ReadsMemory = true;
180  continue;
181  }
182 
183  // Scan the function body for instructions that may read or write memory.
184  for (inst_iterator II = inst_begin(F), E = inst_end(F); II != E; ++II) {
185  Instruction *I = &*II;
186 
187  // Some instructions can be ignored even if they read or write memory.
188  // Detect these now, skipping to the next instruction if one is found.
189  CallSite CS(cast<Value>(I));
190  if (CS) {
191  // Ignore calls to functions in the same SCC.
192  if (CS.getCalledFunction() && SCCNodes.count(CS.getCalledFunction()))
193  continue;
194  AliasAnalysis::ModRefBehavior MRB = AA->getModRefBehavior(CS);
195  // If the call doesn't access arbitrary memory, we may be able to
196  // figure out something.
198  // If the call does access argument pointees, check each argument.
200  // Check whether all pointer arguments point to local memory, and
201  // ignore calls that only access local memory.
202  for (CallSite::arg_iterator CI = CS.arg_begin(), CE = CS.arg_end();
203  CI != CE; ++CI) {
204  Value *Arg = *CI;
205  if (Arg->getType()->isPointerTy()) {
206  AliasAnalysis::Location Loc(Arg,
209  if (!AA->pointsToConstantMemory(Loc, /*OrLocal=*/true)) {
210  if (MRB & AliasAnalysis::Mod)
211  // Writes non-local memory. Give up.
212  return false;
213  if (MRB & AliasAnalysis::Ref)
214  // Ok, it reads non-local memory.
215  ReadsMemory = true;
216  }
217  }
218  }
219  continue;
220  }
221  // The call could access any memory. If that includes writes, give up.
222  if (MRB & AliasAnalysis::Mod)
223  return false;
224  // If it reads, note it.
225  if (MRB & AliasAnalysis::Ref)
226  ReadsMemory = true;
227  continue;
228  } else if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
229  // Ignore non-volatile loads from local memory. (Atomic is okay here.)
230  if (!LI->isVolatile()) {
231  AliasAnalysis::Location Loc = AA->getLocation(LI);
232  if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
233  continue;
234  }
235  } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
236  // Ignore non-volatile stores to local memory. (Atomic is okay here.)
237  if (!SI->isVolatile()) {
238  AliasAnalysis::Location Loc = AA->getLocation(SI);
239  if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
240  continue;
241  }
242  } else if (VAArgInst *VI = dyn_cast<VAArgInst>(I)) {
243  // Ignore vaargs on local memory.
244  AliasAnalysis::Location Loc = AA->getLocation(VI);
245  if (AA->pointsToConstantMemory(Loc, /*OrLocal=*/true))
246  continue;
247  }
248 
249  // Any remaining instructions need to be taken seriously! Check if they
250  // read or write memory.
251  if (I->mayWriteToMemory())
252  // Writes memory. Just give up.
253  return false;
254 
255  // If this instruction may read memory, remember that.
256  ReadsMemory |= I->mayReadFromMemory();
257  }
258  }
259 
260  // Success! Functions in this SCC do not access memory, or only read memory.
261  // Give them the appropriate attribute.
262  bool MadeChange = false;
263  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
264  Function *F = (*I)->getFunction();
265 
266  if (F->doesNotAccessMemory())
267  // Already perfect!
268  continue;
269 
270  if (F->onlyReadsMemory() && ReadsMemory)
271  // No change.
272  continue;
273 
274  MadeChange = true;
275 
276  // Clear out any existing attributes.
277  AttrBuilder B;
280  F->removeAttributes(AttributeSet::FunctionIndex,
281  AttributeSet::get(F->getContext(),
282  AttributeSet::FunctionIndex, B));
283 
284  // Add in the new attribute.
285  F->addAttribute(AttributeSet::FunctionIndex,
286  ReadsMemory ? Attribute::ReadOnly : Attribute::ReadNone);
287 
288  if (ReadsMemory)
289  ++NumReadOnly;
290  else
291  ++NumReadNone;
292  }
293 
294  return MadeChange;
295 }
296 
297 namespace {
298  // For a given pointer Argument, this retains a list of Arguments of functions
299  // in the same SCC that the pointer data flows into. We use this to build an
300  // SCC of the arguments.
301  struct ArgumentGraphNode {
302  Argument *Definition;
304  };
305 
306  class ArgumentGraph {
307  // We store pointers to ArgumentGraphNode objects, so it's important that
308  // that they not move around upon insert.
309  typedef std::map<Argument*, ArgumentGraphNode> ArgumentMapTy;
310 
311  ArgumentMapTy ArgumentMap;
312 
313  // There is no root node for the argument graph, in fact:
314  // void f(int *x, int *y) { if (...) f(x, y); }
315  // is an example where the graph is disconnected. The SCCIterator requires a
316  // single entry point, so we maintain a fake ("synthetic") root node that
317  // uses every node. Because the graph is directed and nothing points into
318  // the root, it will not participate in any SCCs (except for its own).
319  ArgumentGraphNode SyntheticRoot;
320 
321  public:
322  ArgumentGraph() { SyntheticRoot.Definition = 0; }
323 
325 
326  iterator begin() { return SyntheticRoot.Uses.begin(); }
327  iterator end() { return SyntheticRoot.Uses.end(); }
328  ArgumentGraphNode *getEntryNode() { return &SyntheticRoot; }
329 
330  ArgumentGraphNode *operator[](Argument *A) {
331  ArgumentGraphNode &Node = ArgumentMap[A];
332  Node.Definition = A;
333  SyntheticRoot.Uses.push_back(&Node);
334  return &Node;
335  }
336  };
337 
338  // This tracker checks whether callees are in the SCC, and if so it does not
339  // consider that a capture, instead adding it to the "Uses" list and
340  // continuing with the analysis.
341  struct ArgumentUsesTracker : public CaptureTracker {
342  ArgumentUsesTracker(const SmallPtrSet<Function*, 8> &SCCNodes)
343  : Captured(false), SCCNodes(SCCNodes) {}
344 
345  void tooManyUses() { Captured = true; }
346 
347  bool captured(Use *U) {
348  CallSite CS(U->getUser());
349  if (!CS.getInstruction()) { Captured = true; return true; }
350 
351  Function *F = CS.getCalledFunction();
352  if (!F || !SCCNodes.count(F)) { Captured = true; return true; }
353 
354  bool Found = false;
355  Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end();
356  for (CallSite::arg_iterator PI = CS.arg_begin(), PE = CS.arg_end();
357  PI != PE; ++PI, ++AI) {
358  if (AI == AE) {
359  assert(F->isVarArg() && "More params than args in non-varargs call");
360  Captured = true;
361  return true;
362  }
363  if (PI == U) {
364  Uses.push_back(AI);
365  Found = true;
366  break;
367  }
368  }
369  assert(Found && "Capturing call-site captured nothing?");
370  (void)Found;
371  return false;
372  }
373 
374  bool Captured; // True only if certainly captured (used outside our SCC).
375  SmallVector<Argument*, 4> Uses; // Uses within our SCC.
376 
377  const SmallPtrSet<Function*, 8> &SCCNodes;
378  };
379 }
380 
381 namespace llvm {
382  template<> struct GraphTraits<ArgumentGraphNode*> {
383  typedef ArgumentGraphNode NodeType;
385 
386  static inline NodeType *getEntryNode(NodeType *A) { return A; }
387  static inline ChildIteratorType child_begin(NodeType *N) {
388  return N->Uses.begin();
389  }
390  static inline ChildIteratorType child_end(NodeType *N) {
391  return N->Uses.end();
392  }
393  };
394  template<> struct GraphTraits<ArgumentGraph*>
396  static NodeType *getEntryNode(ArgumentGraph *AG) {
397  return AG->getEntryNode();
398  }
399  static ChildIteratorType nodes_begin(ArgumentGraph *AG) {
400  return AG->begin();
401  }
402  static ChildIteratorType nodes_end(ArgumentGraph *AG) {
403  return AG->end();
404  }
405  };
406 }
407 
408 // Returns Attribute::None, Attribute::ReadOnly or Attribute::ReadNone.
409 static Attribute::AttrKind
411  const SmallPtrSet<Argument*, 8> &SCCNodes) {
412 
413  SmallVector<Use*, 32> Worklist;
414  SmallSet<Use*, 32> Visited;
415  int Count = 0;
416 
417  bool IsRead = false;
418  // We don't need to track IsWritten. If A is written to, return immediately.
419 
420  for (Value::use_iterator UI = A->use_begin(), UE = A->use_end();
421  UI != UE; ++UI) {
422  if (Count++ >= 20)
423  return Attribute::None;
424 
425  Use *U = &UI.getUse();
426  Visited.insert(U);
427  Worklist.push_back(U);
428  }
429 
430  while (!Worklist.empty()) {
431  Use *U = Worklist.pop_back_val();
432  Instruction *I = cast<Instruction>(U->getUser());
433  Value *V = U->get();
434 
435  switch (I->getOpcode()) {
436  case Instruction::BitCast:
437  case Instruction::GetElementPtr:
438  case Instruction::PHI:
439  case Instruction::Select:
440  // The original value is not read/written via this if the new value isn't.
441  for (Instruction::use_iterator UI = I->use_begin(), UE = I->use_end();
442  UI != UE; ++UI) {
443  Use *U = &UI.getUse();
444  if (Visited.insert(U))
445  Worklist.push_back(U);
446  }
447  break;
448 
449  case Instruction::Call:
450  case Instruction::Invoke: {
451  CallSite CS(I);
452  if (CS.doesNotAccessMemory())
453  continue;
454 
455  Function *F = CS.getCalledFunction();
456  if (!F) {
457  if (CS.onlyReadsMemory()) {
458  IsRead = true;
459  continue;
460  }
461  return Attribute::None;
462  }
463 
464  Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end();
465  CallSite::arg_iterator B = CS.arg_begin(), E = CS.arg_end();
466  for (CallSite::arg_iterator A = B; A != E; ++A, ++AI) {
467  if (A->get() == V) {
468  if (AI == AE) {
469  assert(F->isVarArg() &&
470  "More params than args in non-varargs call.");
471  return Attribute::None;
472  }
473  if (SCCNodes.count(AI))
474  continue;
475  if (!CS.onlyReadsMemory() && !CS.onlyReadsMemory(A - B))
476  return Attribute::None;
477  if (!CS.doesNotAccessMemory(A - B))
478  IsRead = true;
479  }
480  }
481  break;
482  }
483 
484  case Instruction::Load:
485  IsRead = true;
486  break;
487 
488  case Instruction::ICmp:
489  case Instruction::Ret:
490  break;
491 
492  default:
493  return Attribute::None;
494  }
495  }
496 
497  return IsRead ? Attribute::ReadOnly : Attribute::ReadNone;
498 }
499 
500 /// AddArgumentAttrs - Deduce nocapture attributes for the SCC.
501 bool FunctionAttrs::AddArgumentAttrs(const CallGraphSCC &SCC) {
502  bool Changed = false;
503 
504  SmallPtrSet<Function*, 8> SCCNodes;
505 
506  // Fill SCCNodes with the elements of the SCC. Used for quickly
507  // looking up whether a given CallGraphNode is in this SCC.
508  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
509  Function *F = (*I)->getFunction();
510  if (F && !F->isDeclaration() && !F->mayBeOverridden())
511  SCCNodes.insert(F);
512  }
513 
514  ArgumentGraph AG;
515 
516  AttrBuilder B;
518 
519  // Check each function in turn, determining which pointer arguments are not
520  // captured.
521  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
522  Function *F = (*I)->getFunction();
523 
524  if (F == 0)
525  // External node - only a problem for arguments that we pass to it.
526  continue;
527 
528  // Definitions with weak linkage may be overridden at linktime with
529  // something that captures pointers, so treat them like declarations.
530  if (F->isDeclaration() || F->mayBeOverridden())
531  continue;
532 
533  // Functions that are readonly (or readnone) and nounwind and don't return
534  // a value can't capture arguments. Don't analyze them.
535  if (F->onlyReadsMemory() && F->doesNotThrow() &&
536  F->getReturnType()->isVoidTy()) {
537  for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end();
538  A != E; ++A) {
539  if (A->getType()->isPointerTy() && !A->hasNoCaptureAttr()) {
540  A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo() + 1, B));
541  ++NumNoCapture;
542  Changed = true;
543  }
544  }
545  continue;
546  }
547 
548  for (Function::arg_iterator A = F->arg_begin(), E = F->arg_end();
549  A != E; ++A) {
550  if (!A->getType()->isPointerTy()) continue;
551  bool HasNonLocalUses = false;
552  if (!A->hasNoCaptureAttr()) {
553  ArgumentUsesTracker Tracker(SCCNodes);
554  PointerMayBeCaptured(A, &Tracker);
555  if (!Tracker.Captured) {
556  if (Tracker.Uses.empty()) {
557  // If it's trivially not captured, mark it nocapture now.
558  A->addAttr(AttributeSet::get(F->getContext(), A->getArgNo()+1, B));
559  ++NumNoCapture;
560  Changed = true;
561  } else {
562  // If it's not trivially captured and not trivially not captured,
563  // then it must be calling into another function in our SCC. Save
564  // its particulars for Argument-SCC analysis later.
565  ArgumentGraphNode *Node = AG[A];
566  for (SmallVectorImpl<Argument*>::iterator UI = Tracker.Uses.begin(),
567  UE = Tracker.Uses.end(); UI != UE; ++UI) {
568  Node->Uses.push_back(AG[*UI]);
569  if (*UI != A)
570  HasNonLocalUses = true;
571  }
572  }
573  }
574  // Otherwise, it's captured. Don't bother doing SCC analysis on it.
575  }
576  if (!HasNonLocalUses && !A->onlyReadsMemory()) {
577  // Can we determine that it's readonly/readnone without doing an SCC?
578  // Note that we don't allow any calls at all here, or else our result
579  // will be dependent on the iteration order through the functions in the
580  // SCC.
582  Self.insert(A);
584  if (R != Attribute::None) {
585  AttrBuilder B;
586  B.addAttribute(R);
587  A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
588  Changed = true;
589  R == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg;
590  }
591  }
592  }
593  }
594 
595  // The graph we've collected is partial because we stopped scanning for
596  // argument uses once we solved the argument trivially. These partial nodes
597  // show up as ArgumentGraphNode objects with an empty Uses list, and for
598  // these nodes the final decision about whether they capture has already been
599  // made. If the definition doesn't have a 'nocapture' attribute by now, it
600  // captures.
601 
602  for (scc_iterator<ArgumentGraph*> I = scc_begin(&AG), E = scc_end(&AG);
603  I != E; ++I) {
604  std::vector<ArgumentGraphNode*> &ArgumentSCC = *I;
605  if (ArgumentSCC.size() == 1) {
606  if (!ArgumentSCC[0]->Definition) continue; // synthetic root node
607 
608  // eg. "void f(int* x) { if (...) f(x); }"
609  if (ArgumentSCC[0]->Uses.size() == 1 &&
610  ArgumentSCC[0]->Uses[0] == ArgumentSCC[0]) {
611  Argument *A = ArgumentSCC[0]->Definition;
612  A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
613  ++NumNoCapture;
614  Changed = true;
615  }
616  continue;
617  }
618 
619  bool SCCCaptured = false;
620  for (std::vector<ArgumentGraphNode*>::iterator I = ArgumentSCC.begin(),
621  E = ArgumentSCC.end(); I != E && !SCCCaptured; ++I) {
622  ArgumentGraphNode *Node = *I;
623  if (Node->Uses.empty()) {
624  if (!Node->Definition->hasNoCaptureAttr())
625  SCCCaptured = true;
626  }
627  }
628  if (SCCCaptured) continue;
629 
630  SmallPtrSet<Argument*, 8> ArgumentSCCNodes;
631  // Fill ArgumentSCCNodes with the elements of the ArgumentSCC. Used for
632  // quickly looking up whether a given Argument is in this ArgumentSCC.
633  for (std::vector<ArgumentGraphNode*>::iterator I = ArgumentSCC.begin(),
634  E = ArgumentSCC.end(); I != E; ++I) {
635  ArgumentSCCNodes.insert((*I)->Definition);
636  }
637 
638  for (std::vector<ArgumentGraphNode*>::iterator I = ArgumentSCC.begin(),
639  E = ArgumentSCC.end(); I != E && !SCCCaptured; ++I) {
640  ArgumentGraphNode *N = *I;
641  for (SmallVectorImpl<ArgumentGraphNode*>::iterator UI = N->Uses.begin(),
642  UE = N->Uses.end(); UI != UE; ++UI) {
643  Argument *A = (*UI)->Definition;
644  if (A->hasNoCaptureAttr() || ArgumentSCCNodes.count(A))
645  continue;
646  SCCCaptured = true;
647  break;
648  }
649  }
650  if (SCCCaptured) continue;
651 
652  for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
653  Argument *A = ArgumentSCC[i]->Definition;
654  A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
655  ++NumNoCapture;
656  Changed = true;
657  }
658 
659  // We also want to compute readonly/readnone. With a small number of false
660  // negatives, we can assume that any pointer which is captured isn't going
661  // to be provably readonly or readnone, since by definition we can't
662  // analyze all uses of a captured pointer.
663  //
664  // The false negatives happen when the pointer is captured by a function
665  // that promises readonly/readnone behaviour on the pointer, then the
666  // pointer's lifetime ends before anything that writes to arbitrary memory.
667  // Also, a readonly/readnone pointer may be returned, but returning a
668  // pointer is capturing it.
669 
671  for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
672  Argument *A = ArgumentSCC[i]->Definition;
673  Attribute::AttrKind K = determinePointerReadAttrs(A, ArgumentSCCNodes);
674  if (K == Attribute::ReadNone)
675  continue;
676  if (K == Attribute::ReadOnly) {
677  ReadAttr = Attribute::ReadOnly;
678  continue;
679  }
680  ReadAttr = K;
681  break;
682  }
683 
684  if (ReadAttr != Attribute::None) {
685  AttrBuilder B;
686  B.addAttribute(ReadAttr);
687  for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
688  Argument *A = ArgumentSCC[i]->Definition;
689  A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
690  ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg;
691  Changed = true;
692  }
693  }
694  }
695 
696  return Changed;
697 }
698 
699 /// IsFunctionMallocLike - A function is malloc-like if it returns either null
700 /// or a pointer that doesn't alias any other pointer visible to the caller.
701 bool FunctionAttrs::IsFunctionMallocLike(Function *F,
702  SmallPtrSet<Function*, 8> &SCCNodes) const {
703  SmallSetVector<Value *, 8> FlowsToReturn;
704  for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I)
705  if (ReturnInst *Ret = dyn_cast<ReturnInst>(I->getTerminator()))
706  FlowsToReturn.insert(Ret->getReturnValue());
707 
708  for (unsigned i = 0; i != FlowsToReturn.size(); ++i) {
709  Value *RetVal = FlowsToReturn[i];
710 
711  if (Constant *C = dyn_cast<Constant>(RetVal)) {
712  if (!C->isNullValue() && !isa<UndefValue>(C))
713  return false;
714 
715  continue;
716  }
717 
718  if (isa<Argument>(RetVal))
719  return false;
720 
721  if (Instruction *RVI = dyn_cast<Instruction>(RetVal))
722  switch (RVI->getOpcode()) {
723  // Extend the analysis by looking upwards.
724  case Instruction::BitCast:
725  case Instruction::GetElementPtr:
726  FlowsToReturn.insert(RVI->getOperand(0));
727  continue;
728  case Instruction::Select: {
729  SelectInst *SI = cast<SelectInst>(RVI);
730  FlowsToReturn.insert(SI->getTrueValue());
731  FlowsToReturn.insert(SI->getFalseValue());
732  continue;
733  }
734  case Instruction::PHI: {
735  PHINode *PN = cast<PHINode>(RVI);
736  for (int i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
737  FlowsToReturn.insert(PN->getIncomingValue(i));
738  continue;
739  }
740 
741  // Check whether the pointer came from an allocation.
742  case Instruction::Alloca:
743  break;
744  case Instruction::Call:
745  case Instruction::Invoke: {
746  CallSite CS(RVI);
747  if (CS.paramHasAttr(0, Attribute::NoAlias))
748  break;
749  if (CS.getCalledFunction() &&
750  SCCNodes.count(CS.getCalledFunction()))
751  break;
752  } // fall-through
753  default:
754  return false; // Did not come from an allocation.
755  }
756 
757  if (PointerMayBeCaptured(RetVal, false, /*StoreCaptures=*/false))
758  return false;
759  }
760 
761  return true;
762 }
763 
764 /// AddNoAliasAttrs - Deduce noalias attributes for the SCC.
765 bool FunctionAttrs::AddNoAliasAttrs(const CallGraphSCC &SCC) {
766  SmallPtrSet<Function*, 8> SCCNodes;
767 
768  // Fill SCCNodes with the elements of the SCC. Used for quickly
769  // looking up whether a given CallGraphNode is in this SCC.
770  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I)
771  SCCNodes.insert((*I)->getFunction());
772 
773  // Check each function in turn, determining which functions return noalias
774  // pointers.
775  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
776  Function *F = (*I)->getFunction();
777 
778  if (F == 0)
779  // External node - skip it;
780  return false;
781 
782  // Already noalias.
783  if (F->doesNotAlias(0))
784  continue;
785 
786  // Definitions with weak linkage may be overridden at linktime, so
787  // treat them like declarations.
788  if (F->isDeclaration() || F->mayBeOverridden())
789  return false;
790 
791  // We annotate noalias return values, which are only applicable to
792  // pointer types.
793  if (!F->getReturnType()->isPointerTy())
794  continue;
795 
796  if (!IsFunctionMallocLike(F, SCCNodes))
797  return false;
798  }
799 
800  bool MadeChange = false;
801  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
802  Function *F = (*I)->getFunction();
803  if (F->doesNotAlias(0) || !F->getReturnType()->isPointerTy())
804  continue;
805 
806  F->setDoesNotAlias(0);
807  ++NumNoAlias;
808  MadeChange = true;
809  }
810 
811  return MadeChange;
812 }
813 
814 /// inferPrototypeAttributes - Analyze the name and prototype of the
815 /// given function and set any applicable attributes. Returns true
816 /// if any attributes were set and false otherwise.
817 bool FunctionAttrs::inferPrototypeAttributes(Function &F) {
818  FunctionType *FTy = F.getFunctionType();
819  LibFunc::Func TheLibFunc;
820  if (!(TLI->getLibFunc(F.getName(), TheLibFunc) && TLI->has(TheLibFunc)))
821  return false;
822 
823  switch (TheLibFunc) {
824  case LibFunc::strlen:
825  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
826  return false;
827  setOnlyReadsMemory(F);
828  setDoesNotThrow(F);
829  setDoesNotCapture(F, 1);
830  break;
831  case LibFunc::strchr:
832  case LibFunc::strrchr:
833  if (FTy->getNumParams() != 2 ||
834  !FTy->getParamType(0)->isPointerTy() ||
835  !FTy->getParamType(1)->isIntegerTy())
836  return false;
837  setOnlyReadsMemory(F);
838  setDoesNotThrow(F);
839  break;
840  case LibFunc::strtol:
841  case LibFunc::strtod:
842  case LibFunc::strtof:
843  case LibFunc::strtoul:
844  case LibFunc::strtoll:
845  case LibFunc::strtold:
846  case LibFunc::strtoull:
847  if (FTy->getNumParams() < 2 ||
848  !FTy->getParamType(1)->isPointerTy())
849  return false;
850  setDoesNotThrow(F);
851  setDoesNotCapture(F, 2);
852  setOnlyReadsMemory(F, 1);
853  break;
854  case LibFunc::strcpy:
855  case LibFunc::stpcpy:
856  case LibFunc::strcat:
857  case LibFunc::strncat:
858  case LibFunc::strncpy:
859  case LibFunc::stpncpy:
860  if (FTy->getNumParams() < 2 ||
861  !FTy->getParamType(1)->isPointerTy())
862  return false;
863  setDoesNotThrow(F);
864  setDoesNotCapture(F, 2);
865  setOnlyReadsMemory(F, 2);
866  break;
867  case LibFunc::strxfrm:
868  if (FTy->getNumParams() != 3 ||
869  !FTy->getParamType(0)->isPointerTy() ||
870  !FTy->getParamType(1)->isPointerTy())
871  return false;
872  setDoesNotThrow(F);
873  setDoesNotCapture(F, 1);
874  setDoesNotCapture(F, 2);
875  setOnlyReadsMemory(F, 2);
876  break;
877  case LibFunc::strcmp: //0,1
878  case LibFunc::strspn: // 0,1
879  case LibFunc::strncmp: // 0,1
880  case LibFunc::strcspn: //0,1
881  case LibFunc::strcoll: //0,1
882  case LibFunc::strcasecmp: // 0,1
883  case LibFunc::strncasecmp: //
884  if (FTy->getNumParams() < 2 ||
885  !FTy->getParamType(0)->isPointerTy() ||
886  !FTy->getParamType(1)->isPointerTy())
887  return false;
888  setOnlyReadsMemory(F);
889  setDoesNotThrow(F);
890  setDoesNotCapture(F, 1);
891  setDoesNotCapture(F, 2);
892  break;
893  case LibFunc::strstr:
894  case LibFunc::strpbrk:
895  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
896  return false;
897  setOnlyReadsMemory(F);
898  setDoesNotThrow(F);
899  setDoesNotCapture(F, 2);
900  break;
901  case LibFunc::strtok:
902  case LibFunc::strtok_r:
903  if (FTy->getNumParams() < 2 || !FTy->getParamType(1)->isPointerTy())
904  return false;
905  setDoesNotThrow(F);
906  setDoesNotCapture(F, 2);
907  setOnlyReadsMemory(F, 2);
908  break;
909  case LibFunc::scanf:
910  if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
911  return false;
912  setDoesNotThrow(F);
913  setDoesNotCapture(F, 1);
914  setOnlyReadsMemory(F, 1);
915  break;
916  case LibFunc::setbuf:
917  case LibFunc::setvbuf:
918  if (FTy->getNumParams() < 1 || !FTy->getParamType(0)->isPointerTy())
919  return false;
920  setDoesNotThrow(F);
921  setDoesNotCapture(F, 1);
922  break;
923  case LibFunc::strdup:
924  case LibFunc::strndup:
925  if (FTy->getNumParams() < 1 || !FTy->getReturnType()->isPointerTy() ||
926  !FTy->getParamType(0)->isPointerTy())
927  return false;
928  setDoesNotThrow(F);
929  setDoesNotAlias(F, 0);
930  setDoesNotCapture(F, 1);
931  setOnlyReadsMemory(F, 1);
932  break;
933  case LibFunc::stat:
934  case LibFunc::statvfs:
935  if (FTy->getNumParams() < 2 ||
936  !FTy->getParamType(0)->isPointerTy() ||
937  !FTy->getParamType(1)->isPointerTy())
938  return false;
939  setDoesNotThrow(F);
940  setDoesNotCapture(F, 1);
941  setDoesNotCapture(F, 2);
942  setOnlyReadsMemory(F, 1);
943  break;
944  case LibFunc::sscanf:
945  if (FTy->getNumParams() < 2 ||
946  !FTy->getParamType(0)->isPointerTy() ||
947  !FTy->getParamType(1)->isPointerTy())
948  return false;
949  setDoesNotThrow(F);
950  setDoesNotCapture(F, 1);
951  setDoesNotCapture(F, 2);
952  setOnlyReadsMemory(F, 1);
953  setOnlyReadsMemory(F, 2);
954  break;
955  case LibFunc::sprintf:
956  if (FTy->getNumParams() < 2 ||
957  !FTy->getParamType(0)->isPointerTy() ||
958  !FTy->getParamType(1)->isPointerTy())
959  return false;
960  setDoesNotThrow(F);
961  setDoesNotCapture(F, 1);
962  setDoesNotCapture(F, 2);
963  setOnlyReadsMemory(F, 2);
964  break;
965  case LibFunc::snprintf:
966  if (FTy->getNumParams() != 3 ||
967  !FTy->getParamType(0)->isPointerTy() ||
968  !FTy->getParamType(2)->isPointerTy())
969  return false;
970  setDoesNotThrow(F);
971  setDoesNotCapture(F, 1);
972  setDoesNotCapture(F, 3);
973  setOnlyReadsMemory(F, 3);
974  break;
975  case LibFunc::setitimer:
976  if (FTy->getNumParams() != 3 ||
977  !FTy->getParamType(1)->isPointerTy() ||
978  !FTy->getParamType(2)->isPointerTy())
979  return false;
980  setDoesNotThrow(F);
981  setDoesNotCapture(F, 2);
982  setDoesNotCapture(F, 3);
983  setOnlyReadsMemory(F, 2);
984  break;
985  case LibFunc::system:
986  if (FTy->getNumParams() != 1 ||
987  !FTy->getParamType(0)->isPointerTy())
988  return false;
989  // May throw; "system" is a valid pthread cancellation point.
990  setDoesNotCapture(F, 1);
991  setOnlyReadsMemory(F, 1);
992  break;
993  case LibFunc::malloc:
994  if (FTy->getNumParams() != 1 ||
995  !FTy->getReturnType()->isPointerTy())
996  return false;
997  setDoesNotThrow(F);
998  setDoesNotAlias(F, 0);
999  break;
1000  case LibFunc::memcmp:
1001  if (FTy->getNumParams() != 3 ||
1002  !FTy->getParamType(0)->isPointerTy() ||
1003  !FTy->getParamType(1)->isPointerTy())
1004  return false;
1005  setOnlyReadsMemory(F);
1006  setDoesNotThrow(F);
1007  setDoesNotCapture(F, 1);
1008  setDoesNotCapture(F, 2);
1009  break;
1010  case LibFunc::memchr:
1011  case LibFunc::memrchr:
1012  if (FTy->getNumParams() != 3)
1013  return false;
1014  setOnlyReadsMemory(F);
1015  setDoesNotThrow(F);
1016  break;
1017  case LibFunc::modf:
1018  case LibFunc::modff:
1019  case LibFunc::modfl:
1020  if (FTy->getNumParams() < 2 ||
1021  !FTy->getParamType(1)->isPointerTy())
1022  return false;
1023  setDoesNotThrow(F);
1024  setDoesNotCapture(F, 2);
1025  break;
1026  case LibFunc::memcpy:
1027  case LibFunc::memccpy:
1028  case LibFunc::memmove:
1029  if (FTy->getNumParams() < 2 ||
1030  !FTy->getParamType(1)->isPointerTy())
1031  return false;
1032  setDoesNotThrow(F);
1033  setDoesNotCapture(F, 2);
1034  setOnlyReadsMemory(F, 2);
1035  break;
1036  case LibFunc::memalign:
1037  if (!FTy->getReturnType()->isPointerTy())
1038  return false;
1039  setDoesNotAlias(F, 0);
1040  break;
1041  case LibFunc::mkdir:
1042  if (FTy->getNumParams() == 0 ||
1043  !FTy->getParamType(0)->isPointerTy())
1044  return false;
1045  setDoesNotThrow(F);
1046  setDoesNotCapture(F, 1);
1047  setOnlyReadsMemory(F, 1);
1048  break;
1049  case LibFunc::mktime:
1050  if (FTy->getNumParams() == 0 ||
1051  !FTy->getParamType(0)->isPointerTy())
1052  return false;
1053  setDoesNotThrow(F);
1054  setDoesNotCapture(F, 1);
1055  break;
1056  case LibFunc::realloc:
1057  if (FTy->getNumParams() != 2 ||
1058  !FTy->getParamType(0)->isPointerTy() ||
1059  !FTy->getReturnType()->isPointerTy())
1060  return false;
1061  setDoesNotThrow(F);
1062  setDoesNotAlias(F, 0);
1063  setDoesNotCapture(F, 1);
1064  break;
1065  case LibFunc::read:
1066  if (FTy->getNumParams() != 3 ||
1067  !FTy->getParamType(1)->isPointerTy())
1068  return false;
1069  // May throw; "read" is a valid pthread cancellation point.
1070  setDoesNotCapture(F, 2);
1071  break;
1072  case LibFunc::rewind:
1073  if (FTy->getNumParams() < 1 ||
1074  !FTy->getParamType(0)->isPointerTy())
1075  return false;
1076  setDoesNotThrow(F);
1077  setDoesNotCapture(F, 1);
1078  break;
1079  case LibFunc::rmdir:
1080  case LibFunc::remove:
1081  case LibFunc::realpath:
1082  if (FTy->getNumParams() < 1 ||
1083  !FTy->getParamType(0)->isPointerTy())
1084  return false;
1085  setDoesNotThrow(F);
1086  setDoesNotCapture(F, 1);
1087  setOnlyReadsMemory(F, 1);
1088  break;
1089  case LibFunc::rename:
1090  if (FTy->getNumParams() < 2 ||
1091  !FTy->getParamType(0)->isPointerTy() ||
1092  !FTy->getParamType(1)->isPointerTy())
1093  return false;
1094  setDoesNotThrow(F);
1095  setDoesNotCapture(F, 1);
1096  setDoesNotCapture(F, 2);
1097  setOnlyReadsMemory(F, 1);
1098  setOnlyReadsMemory(F, 2);
1099  break;
1100  case LibFunc::readlink:
1101  if (FTy->getNumParams() < 2 ||
1102  !FTy->getParamType(0)->isPointerTy() ||
1103  !FTy->getParamType(1)->isPointerTy())
1104  return false;
1105  setDoesNotThrow(F);
1106  setDoesNotCapture(F, 1);
1107  setDoesNotCapture(F, 2);
1108  setOnlyReadsMemory(F, 1);
1109  break;
1110  case LibFunc::write:
1111  if (FTy->getNumParams() != 3 || !FTy->getParamType(1)->isPointerTy())
1112  return false;
1113  // May throw; "write" is a valid pthread cancellation point.
1114  setDoesNotCapture(F, 2);
1115  setOnlyReadsMemory(F, 2);
1116  break;
1117  case LibFunc::bcopy:
1118  if (FTy->getNumParams() != 3 ||
1119  !FTy->getParamType(0)->isPointerTy() ||
1120  !FTy->getParamType(1)->isPointerTy())
1121  return false;
1122  setDoesNotThrow(F);
1123  setDoesNotCapture(F, 1);
1124  setDoesNotCapture(F, 2);
1125  setOnlyReadsMemory(F, 1);
1126  break;
1127  case LibFunc::bcmp:
1128  if (FTy->getNumParams() != 3 ||
1129  !FTy->getParamType(0)->isPointerTy() ||
1130  !FTy->getParamType(1)->isPointerTy())
1131  return false;
1132  setDoesNotThrow(F);
1133  setOnlyReadsMemory(F);
1134  setDoesNotCapture(F, 1);
1135  setDoesNotCapture(F, 2);
1136  break;
1137  case LibFunc::bzero:
1138  if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1139  return false;
1140  setDoesNotThrow(F);
1141  setDoesNotCapture(F, 1);
1142  break;
1143  case LibFunc::calloc:
1144  if (FTy->getNumParams() != 2 ||
1145  !FTy->getReturnType()->isPointerTy())
1146  return false;
1147  setDoesNotThrow(F);
1148  setDoesNotAlias(F, 0);
1149  break;
1150  case LibFunc::chmod:
1151  case LibFunc::chown:
1152  if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1153  return false;
1154  setDoesNotThrow(F);
1155  setDoesNotCapture(F, 1);
1156  setOnlyReadsMemory(F, 1);
1157  break;
1158  case LibFunc::ctermid:
1159  case LibFunc::clearerr:
1160  case LibFunc::closedir:
1161  if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1162  return false;
1163  setDoesNotThrow(F);
1164  setDoesNotCapture(F, 1);
1165  break;
1166  case LibFunc::atoi:
1167  case LibFunc::atol:
1168  case LibFunc::atof:
1169  case LibFunc::atoll:
1170  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1171  return false;
1172  setDoesNotThrow(F);
1173  setOnlyReadsMemory(F);
1174  setDoesNotCapture(F, 1);
1175  break;
1176  case LibFunc::access:
1177  if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1178  return false;
1179  setDoesNotThrow(F);
1180  setDoesNotCapture(F, 1);
1181  setOnlyReadsMemory(F, 1);
1182  break;
1183  case LibFunc::fopen:
1184  if (FTy->getNumParams() != 2 ||
1185  !FTy->getReturnType()->isPointerTy() ||
1186  !FTy->getParamType(0)->isPointerTy() ||
1187  !FTy->getParamType(1)->isPointerTy())
1188  return false;
1189  setDoesNotThrow(F);
1190  setDoesNotAlias(F, 0);
1191  setDoesNotCapture(F, 1);
1192  setDoesNotCapture(F, 2);
1193  setOnlyReadsMemory(F, 1);
1194  setOnlyReadsMemory(F, 2);
1195  break;
1196  case LibFunc::fdopen:
1197  if (FTy->getNumParams() != 2 ||
1198  !FTy->getReturnType()->isPointerTy() ||
1199  !FTy->getParamType(1)->isPointerTy())
1200  return false;
1201  setDoesNotThrow(F);
1202  setDoesNotAlias(F, 0);
1203  setDoesNotCapture(F, 2);
1204  setOnlyReadsMemory(F, 2);
1205  break;
1206  case LibFunc::feof:
1207  case LibFunc::free:
1208  case LibFunc::fseek:
1209  case LibFunc::ftell:
1210  case LibFunc::fgetc:
1211  case LibFunc::fseeko:
1212  case LibFunc::ftello:
1213  case LibFunc::fileno:
1214  case LibFunc::fflush:
1215  case LibFunc::fclose:
1216  case LibFunc::fsetpos:
1217  case LibFunc::flockfile:
1218  case LibFunc::funlockfile:
1219  case LibFunc::ftrylockfile:
1220  if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1221  return false;
1222  setDoesNotThrow(F);
1223  setDoesNotCapture(F, 1);
1224  break;
1225  case LibFunc::ferror:
1226  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1227  return false;
1228  setDoesNotThrow(F);
1229  setDoesNotCapture(F, 1);
1230  setOnlyReadsMemory(F);
1231  break;
1232  case LibFunc::fputc:
1233  case LibFunc::fstat:
1234  case LibFunc::frexp:
1235  case LibFunc::frexpf:
1236  case LibFunc::frexpl:
1237  case LibFunc::fstatvfs:
1238  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1239  return false;
1240  setDoesNotThrow(F);
1241  setDoesNotCapture(F, 2);
1242  break;
1243  case LibFunc::fgets:
1244  if (FTy->getNumParams() != 3 ||
1245  !FTy->getParamType(0)->isPointerTy() ||
1246  !FTy->getParamType(2)->isPointerTy())
1247  return false;
1248  setDoesNotThrow(F);
1249  setDoesNotCapture(F, 3);
1250  break;
1251  case LibFunc::fread:
1252  if (FTy->getNumParams() != 4 ||
1253  !FTy->getParamType(0)->isPointerTy() ||
1254  !FTy->getParamType(3)->isPointerTy())
1255  return false;
1256  setDoesNotThrow(F);
1257  setDoesNotCapture(F, 1);
1258  setDoesNotCapture(F, 4);
1259  break;
1260  case LibFunc::fwrite:
1261  if (FTy->getNumParams() != 4 ||
1262  !FTy->getParamType(0)->isPointerTy() ||
1263  !FTy->getParamType(3)->isPointerTy())
1264  return false;
1265  setDoesNotThrow(F);
1266  setDoesNotCapture(F, 1);
1267  setDoesNotCapture(F, 4);
1268  break;
1269  case LibFunc::fputs:
1270  if (FTy->getNumParams() < 2 ||
1271  !FTy->getParamType(0)->isPointerTy() ||
1272  !FTy->getParamType(1)->isPointerTy())
1273  return false;
1274  setDoesNotThrow(F);
1275  setDoesNotCapture(F, 1);
1276  setDoesNotCapture(F, 2);
1277  setOnlyReadsMemory(F, 1);
1278  break;
1279  case LibFunc::fscanf:
1280  case LibFunc::fprintf:
1281  if (FTy->getNumParams() < 2 ||
1282  !FTy->getParamType(0)->isPointerTy() ||
1283  !FTy->getParamType(1)->isPointerTy())
1284  return false;
1285  setDoesNotThrow(F);
1286  setDoesNotCapture(F, 1);
1287  setDoesNotCapture(F, 2);
1288  setOnlyReadsMemory(F, 2);
1289  break;
1290  case LibFunc::fgetpos:
1291  if (FTy->getNumParams() < 2 ||
1292  !FTy->getParamType(0)->isPointerTy() ||
1293  !FTy->getParamType(1)->isPointerTy())
1294  return false;
1295  setDoesNotThrow(F);
1296  setDoesNotCapture(F, 1);
1297  setDoesNotCapture(F, 2);
1298  break;
1299  case LibFunc::getc:
1300  case LibFunc::getlogin_r:
1302  if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1303  return false;
1304  setDoesNotThrow(F);
1305  setDoesNotCapture(F, 1);
1306  break;
1307  case LibFunc::getenv:
1308  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1309  return false;
1310  setDoesNotThrow(F);
1311  setOnlyReadsMemory(F);
1312  setDoesNotCapture(F, 1);
1313  break;
1314  case LibFunc::gets:
1315  case LibFunc::getchar:
1316  setDoesNotThrow(F);
1317  break;
1318  case LibFunc::getitimer:
1319  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1320  return false;
1321  setDoesNotThrow(F);
1322  setDoesNotCapture(F, 2);
1323  break;
1324  case LibFunc::getpwnam:
1325  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1326  return false;
1327  setDoesNotThrow(F);
1328  setDoesNotCapture(F, 1);
1329  setOnlyReadsMemory(F, 1);
1330  break;
1331  case LibFunc::ungetc:
1332  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1333  return false;
1334  setDoesNotThrow(F);
1335  setDoesNotCapture(F, 2);
1336  break;
1337  case LibFunc::uname:
1338  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1339  return false;
1340  setDoesNotThrow(F);
1341  setDoesNotCapture(F, 1);
1342  break;
1343  case LibFunc::unlink:
1344  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1345  return false;
1346  setDoesNotThrow(F);
1347  setDoesNotCapture(F, 1);
1348  setOnlyReadsMemory(F, 1);
1349  break;
1350  case LibFunc::unsetenv:
1351  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1352  return false;
1353  setDoesNotThrow(F);
1354  setDoesNotCapture(F, 1);
1355  setOnlyReadsMemory(F, 1);
1356  break;
1357  case LibFunc::utime:
1358  case LibFunc::utimes:
1359  if (FTy->getNumParams() != 2 ||
1360  !FTy->getParamType(0)->isPointerTy() ||
1361  !FTy->getParamType(1)->isPointerTy())
1362  return false;
1363  setDoesNotThrow(F);
1364  setDoesNotCapture(F, 1);
1365  setDoesNotCapture(F, 2);
1366  setOnlyReadsMemory(F, 1);
1367  setOnlyReadsMemory(F, 2);
1368  break;
1369  case LibFunc::putc:
1370  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1371  return false;
1372  setDoesNotThrow(F);
1373  setDoesNotCapture(F, 2);
1374  break;
1375  case LibFunc::puts:
1376  case LibFunc::printf:
1377  case LibFunc::perror:
1378  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1379  return false;
1380  setDoesNotThrow(F);
1381  setDoesNotCapture(F, 1);
1382  setOnlyReadsMemory(F, 1);
1383  break;
1384  case LibFunc::pread:
1385  if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy())
1386  return false;
1387  // May throw; "pread" is a valid pthread cancellation point.
1388  setDoesNotCapture(F, 2);
1389  break;
1390  case LibFunc::pwrite:
1391  if (FTy->getNumParams() != 4 || !FTy->getParamType(1)->isPointerTy())
1392  return false;
1393  // May throw; "pwrite" is a valid pthread cancellation point.
1394  setDoesNotCapture(F, 2);
1395  setOnlyReadsMemory(F, 2);
1396  break;
1397  case LibFunc::putchar:
1398  setDoesNotThrow(F);
1399  break;
1400  case LibFunc::popen:
1401  if (FTy->getNumParams() != 2 ||
1402  !FTy->getReturnType()->isPointerTy() ||
1403  !FTy->getParamType(0)->isPointerTy() ||
1404  !FTy->getParamType(1)->isPointerTy())
1405  return false;
1406  setDoesNotThrow(F);
1407  setDoesNotAlias(F, 0);
1408  setDoesNotCapture(F, 1);
1409  setDoesNotCapture(F, 2);
1410  setOnlyReadsMemory(F, 1);
1411  setOnlyReadsMemory(F, 2);
1412  break;
1413  case LibFunc::pclose:
1414  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1415  return false;
1416  setDoesNotThrow(F);
1417  setDoesNotCapture(F, 1);
1418  break;
1419  case LibFunc::vscanf:
1420  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1421  return false;
1422  setDoesNotThrow(F);
1423  setDoesNotCapture(F, 1);
1424  setOnlyReadsMemory(F, 1);
1425  break;
1426  case LibFunc::vsscanf:
1427  if (FTy->getNumParams() != 3 ||
1428  !FTy->getParamType(1)->isPointerTy() ||
1429  !FTy->getParamType(2)->isPointerTy())
1430  return false;
1431  setDoesNotThrow(F);
1432  setDoesNotCapture(F, 1);
1433  setDoesNotCapture(F, 2);
1434  setOnlyReadsMemory(F, 1);
1435  setOnlyReadsMemory(F, 2);
1436  break;
1437  case LibFunc::vfscanf:
1438  if (FTy->getNumParams() != 3 ||
1439  !FTy->getParamType(1)->isPointerTy() ||
1440  !FTy->getParamType(2)->isPointerTy())
1441  return false;
1442  setDoesNotThrow(F);
1443  setDoesNotCapture(F, 1);
1444  setDoesNotCapture(F, 2);
1445  setOnlyReadsMemory(F, 2);
1446  break;
1447  case LibFunc::valloc:
1448  if (!FTy->getReturnType()->isPointerTy())
1449  return false;
1450  setDoesNotThrow(F);
1451  setDoesNotAlias(F, 0);
1452  break;
1453  case LibFunc::vprintf:
1454  if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy())
1455  return false;
1456  setDoesNotThrow(F);
1457  setDoesNotCapture(F, 1);
1458  setOnlyReadsMemory(F, 1);
1459  break;
1460  case LibFunc::vfprintf:
1461  case LibFunc::vsprintf:
1462  if (FTy->getNumParams() != 3 ||
1463  !FTy->getParamType(0)->isPointerTy() ||
1464  !FTy->getParamType(1)->isPointerTy())
1465  return false;
1466  setDoesNotThrow(F);
1467  setDoesNotCapture(F, 1);
1468  setDoesNotCapture(F, 2);
1469  setOnlyReadsMemory(F, 2);
1470  break;
1471  case LibFunc::vsnprintf:
1472  if (FTy->getNumParams() != 4 ||
1473  !FTy->getParamType(0)->isPointerTy() ||
1474  !FTy->getParamType(2)->isPointerTy())
1475  return false;
1476  setDoesNotThrow(F);
1477  setDoesNotCapture(F, 1);
1478  setDoesNotCapture(F, 3);
1479  setOnlyReadsMemory(F, 3);
1480  break;
1481  case LibFunc::open:
1482  if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy())
1483  return false;
1484  // May throw; "open" is a valid pthread cancellation point.
1485  setDoesNotCapture(F, 1);
1486  setOnlyReadsMemory(F, 1);
1487  break;
1488  case LibFunc::opendir:
1489  if (FTy->getNumParams() != 1 ||
1490  !FTy->getReturnType()->isPointerTy() ||
1491  !FTy->getParamType(0)->isPointerTy())
1492  return false;
1493  setDoesNotThrow(F);
1494  setDoesNotAlias(F, 0);
1495  setDoesNotCapture(F, 1);
1496  setOnlyReadsMemory(F, 1);
1497  break;
1498  case LibFunc::tmpfile:
1499  if (!FTy->getReturnType()->isPointerTy())
1500  return false;
1501  setDoesNotThrow(F);
1502  setDoesNotAlias(F, 0);
1503  break;
1504  case LibFunc::times:
1505  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1506  return false;
1507  setDoesNotThrow(F);
1508  setDoesNotCapture(F, 1);
1509  break;
1510  case LibFunc::htonl:
1511  case LibFunc::htons:
1512  case LibFunc::ntohl:
1513  case LibFunc::ntohs:
1514  setDoesNotThrow(F);
1515  setDoesNotAccessMemory(F);
1516  break;
1517  case LibFunc::lstat:
1518  if (FTy->getNumParams() != 2 ||
1519  !FTy->getParamType(0)->isPointerTy() ||
1520  !FTy->getParamType(1)->isPointerTy())
1521  return false;
1522  setDoesNotThrow(F);
1523  setDoesNotCapture(F, 1);
1524  setDoesNotCapture(F, 2);
1525  setOnlyReadsMemory(F, 1);
1526  break;
1527  case LibFunc::lchown:
1528  if (FTy->getNumParams() != 3 || !FTy->getParamType(0)->isPointerTy())
1529  return false;
1530  setDoesNotThrow(F);
1531  setDoesNotCapture(F, 1);
1532  setOnlyReadsMemory(F, 1);
1533  break;
1534  case LibFunc::qsort:
1535  if (FTy->getNumParams() != 4 || !FTy->getParamType(3)->isPointerTy())
1536  return false;
1537  // May throw; places call through function pointer.
1538  setDoesNotCapture(F, 4);
1539  break;
1542  if (FTy->getNumParams() < 1 ||
1543  !FTy->getReturnType()->isPointerTy() ||
1544  !FTy->getParamType(0)->isPointerTy())
1545  return false;
1546  setDoesNotThrow(F);
1547  setDoesNotAlias(F, 0);
1548  setDoesNotCapture(F, 1);
1549  setOnlyReadsMemory(F, 1);
1550  break;
1552  if (FTy->getNumParams() != 3 ||
1553  !FTy->getParamType(1)->isPointerTy())
1554  return false;
1555  setDoesNotThrow(F);
1556  setDoesNotCapture(F, 2);
1557  setOnlyReadsMemory(F, 2);
1558  break;
1560  if (FTy->getNumParams() != 1 || !FTy->getParamType(0)->isPointerTy())
1561  return false;
1562  setDoesNotThrow(F);
1563  setDoesNotCapture(F, 1);
1564  break;
1566  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1567  return false;
1568  setDoesNotThrow(F);
1569  setDoesNotCapture(F, 2);
1570  break;
1572  if (FTy->getNumParams() < 1 ||
1573  !FTy->getParamType(0)->isPointerTy())
1574  return false;
1575  setDoesNotThrow(F);
1576  setDoesNotCapture(F, 1);
1577  setOnlyReadsMemory(F, 1);
1578  break;
1579  case LibFunc::stat64:
1580  case LibFunc::lstat64:
1581  case LibFunc::statvfs64:
1582  if (FTy->getNumParams() < 1 ||
1583  !FTy->getParamType(0)->isPointerTy() ||
1584  !FTy->getParamType(1)->isPointerTy())
1585  return false;
1586  setDoesNotThrow(F);
1587  setDoesNotCapture(F, 1);
1588  setDoesNotCapture(F, 2);
1589  setOnlyReadsMemory(F, 1);
1590  break;
1592  if (FTy->getNumParams() < 1 ||
1593  !FTy->getParamType(0)->isPointerTy() ||
1594  !FTy->getParamType(1)->isPointerTy())
1595  return false;
1596  setDoesNotThrow(F);
1597  setDoesNotCapture(F, 1);
1598  setDoesNotCapture(F, 2);
1599  setOnlyReadsMemory(F, 1);
1600  setOnlyReadsMemory(F, 2);
1601  break;
1602  case LibFunc::fopen64:
1603  if (FTy->getNumParams() != 2 ||
1604  !FTy->getReturnType()->isPointerTy() ||
1605  !FTy->getParamType(0)->isPointerTy() ||
1606  !FTy->getParamType(1)->isPointerTy())
1607  return false;
1608  setDoesNotThrow(F);
1609  setDoesNotAlias(F, 0);
1610  setDoesNotCapture(F, 1);
1611  setDoesNotCapture(F, 2);
1612  setOnlyReadsMemory(F, 1);
1613  setOnlyReadsMemory(F, 2);
1614  break;
1615  case LibFunc::fseeko64:
1616  case LibFunc::ftello64:
1617  if (FTy->getNumParams() == 0 || !FTy->getParamType(0)->isPointerTy())
1618  return false;
1619  setDoesNotThrow(F);
1620  setDoesNotCapture(F, 1);
1621  break;
1622  case LibFunc::tmpfile64:
1623  if (!FTy->getReturnType()->isPointerTy())
1624  return false;
1625  setDoesNotThrow(F);
1626  setDoesNotAlias(F, 0);
1627  break;
1628  case LibFunc::fstat64:
1629  case LibFunc::fstatvfs64:
1630  if (FTy->getNumParams() != 2 || !FTy->getParamType(1)->isPointerTy())
1631  return false;
1632  setDoesNotThrow(F);
1633  setDoesNotCapture(F, 2);
1634  break;
1635  case LibFunc::open64:
1636  if (FTy->getNumParams() < 2 || !FTy->getParamType(0)->isPointerTy())
1637  return false;
1638  // May throw; "open" is a valid pthread cancellation point.
1639  setDoesNotCapture(F, 1);
1640  setOnlyReadsMemory(F, 1);
1641  break;
1642  case LibFunc::gettimeofday:
1643  if (FTy->getNumParams() != 2 || !FTy->getParamType(0)->isPointerTy() ||
1644  !FTy->getParamType(1)->isPointerTy())
1645  return false;
1646  // Currently some platforms have the restrict keyword on the arguments to
1647  // gettimeofday. To be conservative, do not add noalias to gettimeofday's
1648  // arguments.
1649  setDoesNotThrow(F);
1650  setDoesNotCapture(F, 1);
1651  setDoesNotCapture(F, 2);
1652  default:
1653  // Didn't mark any attributes.
1654  return false;
1655  }
1656 
1657  return true;
1658 }
1659 
1660 /// annotateLibraryCalls - Adds attributes to well-known standard library
1661 /// call declarations.
1662 bool FunctionAttrs::annotateLibraryCalls(const CallGraphSCC &SCC) {
1663  bool MadeChange = false;
1664 
1665  // Check each function in turn annotating well-known library function
1666  // declarations with attributes.
1667  for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
1668  Function *F = (*I)->getFunction();
1669 
1670  if (F != 0 && F->isDeclaration())
1671  MadeChange |= inferPrototypeAttributes(*F);
1672  }
1673 
1674  return MadeChange;
1675 }
1676 
1677 bool FunctionAttrs::runOnSCC(CallGraphSCC &SCC) {
1678  AA = &getAnalysis<AliasAnalysis>();
1679  TLI = &getAnalysis<TargetLibraryInfo>();
1680 
1681  bool Changed = annotateLibraryCalls(SCC);
1682  Changed |= AddReadAttrs(SCC);
1683  Changed |= AddArgumentAttrs(SCC);
1684  Changed |= AddNoAliasAttrs(SCC);
1685  return Changed;
1686 }
void initializeFunctionAttrsPass(PassRegistry &)
bool hasNoCaptureAttr() const
Return true if this argument has the nocapture attribute on it in its containing function.
Definition: Function.cpp:111
void flockfile(FILE *file);
int strcmp(const char *s1, const char *s2);
static ChildIteratorType nodes_end(ArgumentGraph *AG)
use_iterator use_end()
Definition: Value.h:152
const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:181
int fseeko(FILE *stream, off_t offset, int whence);
long ftell(FILE *stream);
int uname(struct utsname *name);
int sscanf(const char *s, const char *format, ... );
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
int sprintf(char *str, const char *format, ...);
static PassRegistry * getPassRegistry()
LLVMContext & getContext() const
Definition: Function.cpp:167
void bcopy(const void *s1, void *s2, size_t n);
int remove(const char *path);
LLVM Argument representation.
Definition: Argument.h:35
void *memcpy(void *s1, const void *s2, size_t n);
int fstatvfs64(int fildes, struct statvfs64 *buf);
char *__strndup(const char *s, size_t n);
int chmod(const char *path, mode_t mode);
int fstat(int fildes, struct stat *buf);
bool onlyReadsMemory() const
Determine if the function does not access or only reads memory.
Definition: Function.h:246
FILE *tmpfile64(void)
char *strpbrk(const char *s1, const char *s2);
functionattrs
off64_t ftello64(FILE *stream)
unsigned getNumParams() const
Definition: DerivedTypes.h:133
IterTy arg_end() const
Definition: CallSite.h:143
int getc(FILE *stream);
std::vector< CallGraphNode * >::const_iterator iterator
iterator end()
Definition: Function.h:397
int fstat64(int filedes, struct stat64 *buf)
void funlockfile(FILE *file);
FILE *fdopen(int fildes, const char *mode);.
int printf(const char *format, ...);
int strncasecmp(const char *s1, const char *s2, size_t n);
long int strtol(const char *nptr, char **endptr, int base);
int lstat64(const char *path, struct stat64 *buf);
int open(const char *path, int oflag, ... );
DIR *opendir(const char *dirname);.
double frexp(double num, int *exp);
float strtof(const char *nptr, char **endptr);
bool insert(PtrType Ptr)
Definition: SmallPtrSet.h:253
char *ctermid(char *s);
const_iterator begin(StringRef path)
Get begin iterator over path.
Definition: Path.cpp:173
float modff(float, float *iptr);
Type * getReturnType() const
Definition: Function.cpp:179
int putc(int c, FILE *stream);
arg_iterator arg_end()
Definition: Function.h:418
char *strcat(char *s1, const char *s2);
F(f)
FILE *fopen(const char *filename, const char *mode);.
AttrBuilder & addAttribute(Attribute::AttrKind Val)
Add an attribute to the builder.
Definition: Attributes.cpp:968
int __isoc99_sscanf(const char *s, const char *format, ...)
ssize_t read(int fildes, void *buf, size_t nbyte);
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:64
int fclose(FILE *stream);
virtual void getAnalysisUsage(AnalysisUsage &Info) const
LoopInfoBase< BlockT, LoopT > * LI
Definition: LoopInfoImpl.h:411
double strtod(const char *nptr, char **endptr);
bool doesNotAlias(unsigned n) const
Determine if the parameter does not alias other parameters.
Definition: Function.h:305
StringRef getName() const
Definition: Value.cpp:167
Pass * createFunctionAttrsPass()
int puts(const char *s);
void addAttr(AttributeSet AS)
Add a Attribute to an argument.
Definition: Function.cpp:144
void setDoesNotThrow()
Definition: Function.h:269
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:167
int access(const char *path, int amode);
char *fgets(char *s, int n, FILE *stream);
long double frexpl(long double num, int *exp);
iterator end() const
inst_iterator inst_begin(Function *F)
Definition: InstIterator.h:128
bool doesNotThrow() const
Determine if the function cannot unwind.
Definition: Function.h:265
int ftrylockfile(FILE *file);
uint32_t ntohl(uint32_t netlong);
int _IO_getc(_IO_FILE * __fp);
off_t ftello(FILE *stream);
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
Definition: SmallVector.h:430
int feof(FILE *stream);
Definition: Use.h:60
INITIALIZE_PASS_BEGIN(FunctionAttrs,"functionattrs","Deduce function attributes", false, false) INITIALIZE_PASS_END(FunctionAttrs
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:172
No attributes have been set.
Definition: Attributes.h:66
int closedir(DIR *dirp);
double modf(double x, double *iptr);
double atof(const char *str);
char *strchr(const char *s, int c);
int gettimeofday(struct timeval *tp, void *tzp);
int strcoll(const char *s1, const char *s2);
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
Function does not access memory.
Definition: Attributes.h:93
Function creates no aliases of pointer.
Definition: Attributes.h:82
scc_iterator< T > scc_begin(const T &G)
Definition: SCCIterator.h:199
int atoi(const char *str);
int statvfs(const char *path, struct statvfs *buf);
char *gets(char *s);
long long atoll(const char *nptr);
ssize_t readlink(const char *path, char *buf, size_t bufsize);
int system(const char *command);
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:102
bool mayReadFromMemory() const
bool count(PtrType Ptr) const
count - Return true if the specified pointer is in the set.
Definition: SmallPtrSet.h:264
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
Definition: SmallVector.h:56
long long int strtoll(const char *nptr, char **endptr, int base);
size_t strxfrm(char *s1, const char *s2, size_t n);
char *stpncpy(char *s1, const char *s2, size_t n);
int rename(const char *old, const char *new);
int ungetc(int c, FILE *stream);
bool insert(const T &V)
Definition: SmallSet.h:59
char *strndup(const char *s1, size_t n);
void removeAttributes(unsigned i, AttributeSet attr)
removes the attributes from the list of attributes.
Definition: Function.cpp:296
iterator begin()
Definition: Function.h:395
bool doesNotAccessMemory() const
Determine if the function does not access memory.
Definition: Function.h:237
Considered to not alias after call.
Definition: Attributes.h:80
bool onlyReadsMemory(ImmutableCallSite CS)
int rmdir(const char *path);
int vprintf(const char *restrict format, va_list ap);
unsigned getNumIncomingValues() const
void setDoesNotCapture(unsigned n)
Definition: Function.h:317
int memcmp(const void *s1, const void *s2, size_t n);
Type * getParamType(unsigned i) const
Parameter type accessors.
Definition: DerivedTypes.h:128
char *realpath(const char *file_name, char *resolved_name);
int setvbuf(FILE *stream, char *buf, int type, size_t size);
friend const_iterator end(StringRef path)
Get end iterator over path.
Definition: Path.cpp:181
char *strrchr(const char *s, int c);
void setOnlyReadsMemory()
Definition: Function.h:251
int vfprintf(FILE *stream, const char *format, va_list ap);
int pclose(FILE *stream);
value_use_iterator< User > use_iterator
Definition: Value.h:146
int lstat(const char *path, struct stat *buf);
void clearerr(FILE *stream);
uint16_t ntohs(uint16_t netshort);
int getitimer(int which, struct itimerval *value);
static bool mayBeOverridden(LinkageTypes Linkage)
Definition: GlobalValue.h:171
int vsnprintf(char *s, size_t n, const char *format, va_list ap);
scc_iterator< T > scc_end(const T &G)
Definition: SCCIterator.h:204
LLVM Constant Representation.
Definition: Constant.h:41
Deduce function false
int fstatvfs(int fildes, struct statvfs *buf);
int bcmp(const void *s1, const void *s2, size_t n);
int fgetpos(FILE *stream, fpos_t *pos);
void free(void *ptr);
static ChildIteratorType child_end(NodeType *N)
void setDoesNotAlias(unsigned n)
Definition: Function.h:308
int fsetpos(FILE *stream, const fpos_t *pos);
void *realloc(void *ptr, size_t size);
int utimes(const char *path, const struct timeval times[2]);
int vfscanf(FILE *stream, const char *format, va_list arg);
long double strtold(const char *nptr, char **endptr);
static NodeType * getEntryNode(NodeType *A)
int fseeko64(FILE *stream, off64_t offset, int whence)
int unlink(const char *path);
void *valloc(size_t size);
int snprintf(char *s, size_t n, const char *format, ...);
float frexpf(float num, int *exp);
void *memchr(const void *s, int c, size_t n);
int getchar(void);
void perror(const char *s);
arg_iterator arg_begin()
Definition: Function.h:410
int _IO_putc(int __c, _IO_FILE * __fp);
void *memmove(void *s1, const void *s2, size_t n);
uint16_t htons(uint16_t hostshort);
Location - A description of a memory location.
int mkdir(const char *path, mode_t mode);
#define INITIALIZE_AG_DEPENDENCY(depName)
Definition: PassSupport.h:169
static bool doesAccessArgPointees(ModRefBehavior MRB)
bool isPointerTy() const
Definition: Type.h:220
char *strstr(const char *s1, const char *s2);
bool PointerMayBeCaptured(const Value *V, bool ReturnCaptures, bool StoreCaptures)
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:517
bool onlyReadsMemory() const
Determine if the call does not access or only reads memory.
Definition: CallSite.h:224
FILE *fopen64(const char *filename, const char *opentype)
const Value * getTrueValue() const
bool mayWriteToMemory() const
int stat(const char *path, struct stat *buf);
int fputs(const char *s, FILE *stream);
clock_t times(struct tms *buffer);
int stat64(const char *path, struct stat64 *buf);
char *strdup(const char *s1);
int fgetc(FILE *stream);
char * __strdup(const char *s);
void setbuf(FILE *stream, char *buf);
int getc_unlocked(FILE *stream);
int chown(const char *path, uid_t owner, gid_t group);
A SetVector that performs no allocations if smaller than a certain size.
Definition: SetVector.h:218
char *strncat(char *s1, const char *s2, size_t n);
bool doesNotAccessMemory() const
Determine if the call does not access memory.
Definition: CallSite.h:216
FILE *tmpfile(void);.
struct passwd *getpwnam(const char *name);
Value * getIncomingValue(unsigned i) const
friend const_iterator begin(StringRef path)
Get begin iterator over path.
Definition: Path.cpp:173
int fprintf(FILE *stream, const char *format, ...);
int vsprintf(char *s, const char *format, va_list ap);
void *memccpy(void *s1, const void *s2, int c, size_t n);
Type * getType() const
Definition: Value.h:111
MDNode * getMetadata(unsigned KindID) const
Definition: Instruction.h:140
size_t strcspn(const char *s1, const char *s2);
unsigned long int strtoul(const char *nptr, char **endptr, int base);
int fflush(FILE *stream);
void setPreservesCFG()
Definition: Pass.cpp:249
size_t strlen(const char *s);
char *stpcpy(char *s1, const char *s2);
void rewind(FILE *stream);
int open64(const char *filename, int flags[, mode_t mode])
void addAttribute(unsigned i, Attribute::AttrKind attr)
adds the attribute to the list of attributes.
Definition: Function.cpp:284
iterator begin() const
bool isIntegerTy() const
Definition: Type.h:196
FILE *popen(const char *command, const char *mode);.
Function only reads from memory.
Definition: Attributes.h:94
int statvfs64(const char *path, struct statvfs64 *buf)
int fscanf(FILE *stream, const char *format, ... );
int vsscanf(const char *s, const char *format, va_list arg);
int fputc(int c, FILE *stream);
ssize_t write(int fildes, const void *buf, size_t nbyte);
use_iterator use_begin()
Definition: Value.h:150
int unsetenv(const char *name);
int ferror(FILE *stream);
STATISTIC(NumReadNone,"Number of functions marked readnone")
static bool onlyAccessesArgPointees(ModRefBehavior MRB)
void *malloc(size_t size);
bool isDeclaration() const
Definition: Globals.cpp:66
void setDoesNotAccessMemory()
Definition: Function.h:241
int fseek(FILE *stream, long offset, int whence);
int utime(const char *path, const struct utimbuf *times);
char * __strtok_r(char *s, const char *delim, char **save_ptr);
void bzero(void *s, size_t n);
#define I(x, y, z)
Definition: MD5.cpp:54
#define N
FunctionType * getFunctionType() const
Definition: Function.cpp:171
Deduce function attributes
static ChildIteratorType child_begin(NodeType *N)
long double modfl(long double value, long double *iptr);
static uint64_t const UnknownSize
Definition: AliasAnalysis.h:84
IterTy arg_begin() const
Definition: CallSite.h:137
int strcasecmp(const char *s1, const char *s2);
int getlogin_r(char *name, size_t namesize);
int fileno(FILE *stream);
Type * getReturnType() const
Definition: DerivedTypes.h:121
int lchown(const char *path, uid_t owner, gid_t group);
LLVM Value Representation.
Definition: Value.h:66
bool doesNotCapture(unsigned n) const
Determine if the parameter can be captured.
Definition: Function.h:314
CallGraphSCC - This is a single SCC that a CallGraphSCCPass is run on.
unsigned getOpcode() const
getOpcode() returns a member of one of the enums like Instruction::Add.
Definition: Instruction.h:83
unsigned getArgNo() const
Return the index of this formal argument in its containing function.
Definition: Function.cpp:67
static ChildIteratorType nodes_begin(ArgumentGraph *AG)
int putchar(int c);
time_t mktime(struct tm *timeptr);
int scanf(const char *restrict format, ... );
char *strcpy(char *s1, const char *s2);
print Print MemDeps of function
void *memalign(size_t boundary, size_t size);
const Value * getFalseValue() const
inst_iterator inst_end(Function *F)
Definition: InstIterator.h:129
int __isoc99_scanf (const char *format, ...)
int strncmp(const char *s1, const char *s2, size_t n);
int vscanf(const char *format, va_list arg);
char *getenv(const char *name);
bool isVarArg() const
Definition: Function.cpp:175
uint32_t htonl(uint32_t hostlong);
void *calloc(size_t count, size_t size);
SmallVectorImpl< ArgumentGraphNode * >::iterator ChildIteratorType
static Attribute::AttrKind determinePointerReadAttrs(Argument *A, const SmallPtrSet< Argument *, 8 > &SCCNodes)
static NodeType * getEntryNode(ArgumentGraph *AG)
size_t strspn(const char *s1, const char *s2);
bool isVoidTy() const
isVoidTy - Return true if this is 'void'.
Definition: Type.h:140
FunTy * getCalledFunction() const
Definition: CallSite.h:93
long atol(const char *str);
char *strncpy(char *s1, const char *s2, size_t n);