forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- DbgInfoUtils.cpp - DbgInfo Utilities -------------------------------==//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// Utility functions to manipulate debugging information.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "llvm/Transforms/Utils/DbgInfoUtils.h"
 | 
						|
#include "llvm/IntrinsicInst.h"
 | 
						|
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this 
 | 
						|
/// basic block.
 | 
						|
void llvm::RemoveDeadDbgIntrinsics(BasicBlock &BB) {
 | 
						|
  BasicBlock::iterator BI = BB.begin(), BE = BB.end();
 | 
						|
  if (BI == BE) return;
 | 
						|
 | 
						|
  Instruction *Prev = BI; ++BI;
 | 
						|
  while (BI != BE) {
 | 
						|
    Instruction *Next = BI; ++BI;
 | 
						|
    DbgInfoIntrinsic *DBI_Prev = dyn_cast<DbgInfoIntrinsic>(Prev);
 | 
						|
    if (!DBI_Prev) {
 | 
						|
      Prev = Next;
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    
 | 
						|
    // If there are two consecutive llvm.dbg.stoppoint calls then
 | 
						|
    // it is likely that the optimizer deleted code in between these
 | 
						|
    // two intrinsics. 
 | 
						|
    DbgInfoIntrinsic *DBI_Next = dyn_cast<DbgInfoIntrinsic>(Next);
 | 
						|
    if (DBI_Next 
 | 
						|
        && DBI_Prev->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint
 | 
						|
        && DBI_Next->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint)
 | 
						|
      Prev->eraseFromParent();
 | 
						|
    
 | 
						|
    // If a llvm.dbg.stoppoint is placed just before an unconditional
 | 
						|
    // branch then remove the llvm.dbg.stoppoint intrinsic.
 | 
						|
    else if (BranchInst *UC = dyn_cast<BranchInst>(Next)) {
 | 
						|
      if (UC->isUnconditional() 
 | 
						|
          && DBI_Prev->getIntrinsicID() == llvm::Intrinsic::dbg_stoppoint)
 | 
						|
        Prev->eraseFromParent();
 | 
						|
    }
 | 
						|
 | 
						|
    Prev = Next;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/// RemoveDeadDbgIntrinsics - Remove dead dbg intrinsics from this function.
 | 
						|
void llvm::RemoveDeadDbgIntrinsics(Function &F) {
 | 
						|
  for (Function::iterator FI = F.begin(), FE = F.end();
 | 
						|
       FI != FE; ++FI) 
 | 
						|
    RemoveDeadDbgIntrinsics(*FI);
 | 
						|
}
 |