77using namespace sampleprofutil;
79#define DEBUG_TYPE "add-discriminators"
85 "no-discriminators",
cl::init(
false),
86 cl::desc(
"Disable generation of discriminator information."));
91struct AddDiscriminatorsLegacyPass :
public FunctionPass {
103char AddDiscriminatorsLegacyPass::ID = 0;
106 "Add DWARF path discriminators",
false,
false)
112 return new AddDiscriminatorsLegacyPass();
116 return !isa<IntrinsicInst>(
I) || isa<MemIntrinsic>(
I);
181 bool Changed =
false;
183 using Location = std::pair<StringRef, unsigned>;
190 LocationDiscriminatorMap LDM;
208 Location L = std::make_pair(DIL->getFilename(), DIL->getLine());
209 auto &BBMap = LBM[L];
210 auto R = BBMap.insert(&
B);
211 if (BBMap.size() == 1)
217 unsigned Discriminator = R.second ? ++LDM[L] : LDM[L];
221 << DIL->getFilename() <<
":" << DIL->getLine() <<
":"
222 << DIL->getColumn() <<
":" << Discriminator <<
" "
225 I.setDebugLoc(*NewDIL);
226 LLVM_DEBUG(
dbgs() << DIL->getFilename() <<
":" << DIL->getLine() <<
":"
227 << DIL->getColumn() <<
":" << Discriminator <<
" " <<
I
239 LocationSet CallLocations;
245 if (!isa<InvokeInst>(
I) && (!isa<CallInst>(
I) || isa<IntrinsicInst>(
I)))
252 std::make_pair(CurrentDIL->getFilename(), CurrentDIL->getLine());
253 if (!CallLocations.insert(L).second) {
254 unsigned Discriminator = ++LDM[L];
258 <<
"Could not encode discriminator: "
259 << CurrentDIL->getFilename() <<
":"
260 << CurrentDIL->getLine() <<
":" << CurrentDIL->getColumn()
261 <<
":" << Discriminator <<
" " <<
I <<
"\n");
263 I.setDebugLoc(*NewDIL);
272bool AddDiscriminatorsLegacyPass::runOnFunction(
Function &
F) {
static cl::opt< bool > NoDiscriminators("no-discriminators", cl::init(false), cl::desc("Disable generation of discriminator information."))
static bool addDiscriminators(Function &F)
Assign DWARF discriminators.
static bool shouldHaveDiscriminator(const Instruction *I)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This header defines various interfaces for pass management in LLVM.
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file provides the utility functions for the sampled PGO loader base implementation.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
A container for analyses that lazily runs them and caches their results.
LLVM Basic Block Representation.
std::optional< const DILocation * > cloneWithBaseDiscriminator(unsigned BD) const
Returns a new DILocation with updated base discriminator BD.
Implements a dense probed hash-table based set.
FunctionPass class - This class is used to implement most global optimizations.
virtual bool runOnFunction(Function &F)=0
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
void createFSDiscriminatorVariable(Module *M)
Create a global variable to flag FSDiscriminators are used.
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createAddDiscriminatorsPass()
cl::opt< bool > EnableFSDiscriminator
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void initializeAddDiscriminatorsLegacyPassPass(PassRegistry &)