[cfe-commits] r93500 - /cfe/trunk/lib/Sema/SemaDecl.cpp

Chris Lattner clattner at apple.com
Thu Jan 14 18:43:24 PST 2010


On Jan 14, 2010, at 6:06 PM, Mike Stump wrote:

> Author: mrs
> Date: Thu Jan 14 20:06:42 2010
> New Revision: 93500
>
> URL: http://llvm.org/viewvc/llvm-project?rev=93500&view=rev
> Log:
> Refine unreachable warnings.  WIP.

How does it refine it?  Testcase?  Also, the codesize for std::sort is  
quite high, is it needed?  Why are you sorting based on locations?

-Chris

>
> Modified:
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=93500&r1=93499&r2=93500&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Jan 14 20:06:42 2010
> @@ -1328,6 +1328,66 @@
>   }
> }
>
> +static SourceLocation MarkLiveTop(CFGBlock *e, llvm::BitVector &live,
> +                               SourceManager &SM) {
> +  std::queue<CFGBlock*> workq;
> +  // Prep work queue
> +  workq.push(e);
> +  SourceLocation top;
> +  if (!e->empty())
> +    top = e[0][0].getStmt()->getLocStart();
> +  bool FromMainFile = false;
> +  bool FromSystemHeader = false;
> +  bool TopValid = false;
> +  if (top.isValid()) {
> +    FromMainFile = SM.isFromMainFile(top);
> +    FromSystemHeader = SM.isInSystemHeader(top);
> +    TopValid = true;
> +  }
> +  // Solve
> +  while (!workq.empty()) {
> +    CFGBlock *item = workq.front();
> +    workq.pop();
> +    SourceLocation c;
> +    if (!item->empty())
> +      c = item[0][0].getStmt()->getLocStart();
> +    else if (item->getTerminator())
> +      c = item->getTerminator()->getLocStart();
> +    if (c.isValid()
> +        && (!TopValid
> +            || (SM.isFromMainFile(c) && !FromMainFile)
> +            || (FromSystemHeader && !SM.isInSystemHeader(c))
> +            || SM.isBeforeInTranslationUnit(c, top))) {
> +      top = c;
> +      FromMainFile = SM.isFromMainFile(top);
> +      FromSystemHeader = SM.isInSystemHeader(top);
> +    }
> +    live.set(item->getBlockID());
> +    for (CFGBlock::succ_iterator I=item->succ_begin(),
> +           E=item->succ_end();
> +         I != E;
> +         ++I) {
> +      if ((*I) && !live[(*I)->getBlockID()]) {
> +        live.set((*I)->getBlockID());
> +        workq.push(*I);
> +      }
> +    }
> +  }
> +  return top;
> +}
> +
> +namespace {
> +class LineCmp {
> +  SourceManager &SM;
> +public:
> +  LineCmp(SourceManager &sm) : SM(sm) {
> +  }
> +  bool operator () (SourceLocation l1, SourceLocation l2) {
> +    return l1 < l2;
> +  }
> +};
> +}
> +
> /// CheckUnreachable - Check for unreachable code.
> void Sema::CheckUnreachable(AnalysisContext &AC) {
>   // We avoid checking when there are errors, as the CFG won't  
> faithfully match
> @@ -1345,15 +1405,38 @@
>   // Mark all live things first.
>   MarkLive(&cfg->getEntry(), live);
>
> +  llvm::SmallVector<SourceLocation, 24> lines;
> +  // First, give warnings for blocks with no predecessors, as they
> +  // can't be part of a loop.
>   for (CFG::iterator I = cfg->begin(), E = cfg->end(); I != E; ++I) {
>     CFGBlock &b = **I;
>     if (!live[b.getBlockID()]) {
> -      if (!b.empty())
> -        Diag(b[0].getStmt()->getLocStart(), diag::warn_unreachable);
> -      // Avoid excessive errors by marking everything reachable  
> from here
> -      MarkLive(&b, live);
> +      if (b.pred_begin() == b.pred_end()) {
> +        if (!b.empty())
> +          lines.push_back(b[0].getStmt()->getLocStart());
> +        else if (b.getTerminator())
> +          lines.push_back(b.getTerminator()->getLocStart());
> +        // Avoid excessive errors by marking everything reachable  
> from here
> +        MarkLive(&b, live);
> +      }
>     }
>   }
> +
> +  // And then give warnings for the tops of loops.
> +  for (CFG::iterator I = cfg->begin(), E = cfg->end(); I != E; ++I) {
> +    CFGBlock &b = **I;
> +    if (!live[b.getBlockID()])
> +      // Avoid excessive errors by marking everything reachable  
> from here
> +      lines.push_back(MarkLiveTop(&b, live,  
> Context.getSourceManager()));
> +  }
> +
> +  std::sort(lines.begin(), lines.end(),  
> LineCmp(Context.getSourceManager()));
> +  for (llvm::SmallVector<SourceLocation, 24>::iterator I =  
> lines.begin(),
> +         E = lines.end();
> +       I != E;
> +       ++I)
> +    if (I->isValid())
> +      Diag(*I, diag::warn_unreachable);
> }
>
> /// CheckFallThrough - Check that we don't fall off the end of a
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list