Go to the documentation of this file.
77 using namespace sampleprofutil;
79 #define DEBUG_TYPE "add-discriminators"
85 "no-discriminators",
cl::init(
false),
86 cl::desc(
"Disable generation of discriminator information."));
91 struct AddDiscriminatorsLegacyPass :
public FunctionPass {
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);
A set of analyses that are preserved following a run of a transformation pass.
This is an optimization pass for GlobalISel generic memory operations.
cl::opt< bool > EnableFSDiscriminator
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
LLVM Basic Block Representation.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static bool shouldHaveDiscriminator(const Instruction *I)
void createFSDiscriminatorVariable(Module *M)
Create a global variable to flag FSDiscriminators are used.
std::optional< const DILocation * > cloneWithBaseDiscriminator(unsigned BD) const
Returns a new DILocation with updated base discriminator BD.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
INITIALIZE_PASS_BEGIN(AddDiscriminatorsLegacyPass, "add-discriminators", "Add DWARF path discriminators", false, false) INITIALIZE_PASS_END(AddDiscriminatorsLegacyPass
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Implements a dense probed hash-table based set.
static cl::opt< bool > NoDiscriminators("no-discriminators", cl::init(false), cl::desc("Disable generation of discriminator information."))
initializer< Ty > init(const Ty &Val)
static bool addDiscriminators(Function &F)
Assign DWARF discriminators.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
static bool runOnFunction(Function &F, bool PostInlining)
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
FunctionPass * createAddDiscriminatorsPass()
A container for analyses that lazily runs them and caches their results.
FunctionPass class - This class is used to implement most global optimizations.
void initializeAddDiscriminatorsLegacyPassPass(PassRegistry &)