mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[PGO] Simplify coverage mapping lowering
Coverage mapping data may reference names of functions that are skipped by FE (e.g, unused inline functions). Since those functions are skipped, normal instr-prof function lowering pass won't put those names in the right section, so special handling is needed to walk through coverage mapping structure and recollect the references. With this patch, only names that are skipped are processed. This simplifies the lowering code and it no longer needs to make assumptions coverage mapping data layout. It should also be more efficient. llvm-svn: 257091
This commit is contained in:
parent
ea3157c899
commit
d17333c8d6
@ -89,6 +89,12 @@ inline StringRef getCoverageMappingVarName() {
|
||||
return "__llvm_coverage_mapping";
|
||||
}
|
||||
|
||||
/// Return the name of the internal variable recording the array
|
||||
/// of PGO name vars referenced by the coverage mapping, The owning
|
||||
/// functions of those names are not emitted by FE (e.g, unused inline
|
||||
/// functions.)
|
||||
inline StringRef getCoverageNamesVarName() { return "__llvm_coverage_names"; }
|
||||
|
||||
/// Return the name of function that registers all the per-function control
|
||||
/// data at program startup time by calling __llvm_register_function. This
|
||||
/// function has internal linkage and is called by __llvm_profile_init
|
||||
|
@ -93,8 +93,8 @@ private:
|
||||
/// Replace instrprof_increment with an increment of the appropriate value.
|
||||
void lowerIncrement(InstrProfIncrementInst *Inc);
|
||||
|
||||
/// Set up the section and uses for coverage data and its references.
|
||||
void lowerCoverageData(GlobalVariable *CoverageData);
|
||||
/// Force emitting of name vars for unused functions.
|
||||
void lowerCoverageData(GlobalVariable *CoverageNamesVar);
|
||||
|
||||
/// Get the region counters for an increment, creating them if necessary.
|
||||
///
|
||||
@ -156,9 +156,9 @@ bool InstrProfiling::runOnModule(Module &M) {
|
||||
}
|
||||
}
|
||||
|
||||
if (GlobalVariable *Coverage =
|
||||
M.getNamedGlobal(getCoverageMappingVarName())) {
|
||||
lowerCoverageData(Coverage);
|
||||
if (GlobalVariable *CoverageNamesVar =
|
||||
M.getNamedGlobal(getCoverageNamesVarName())) {
|
||||
lowerCoverageData(CoverageNamesVar);
|
||||
MadeChange = true;
|
||||
}
|
||||
|
||||
@ -233,28 +233,16 @@ void InstrProfiling::lowerIncrement(InstrProfIncrementInst *Inc) {
|
||||
Inc->eraseFromParent();
|
||||
}
|
||||
|
||||
void InstrProfiling::lowerCoverageData(GlobalVariable *CoverageData) {
|
||||
|
||||
Constant *Init = CoverageData->getInitializer();
|
||||
// We're expecting { [4 x 32], [n x { i8*, i32, i32 }], [m x i8] }
|
||||
// for some C. If not, the frontend's given us something broken.
|
||||
assert(Init->getNumOperands() == 3 && "bad number of fields in coverage map");
|
||||
assert(isa<ConstantArray>(Init->getAggregateElement(1)) &&
|
||||
"invalid function list in coverage map");
|
||||
ConstantArray *Records = cast<ConstantArray>(Init->getAggregateElement(1));
|
||||
for (unsigned I = 0, E = Records->getNumOperands(); I < E; ++I) {
|
||||
Constant *Record = Records->getOperand(I);
|
||||
Value *V = const_cast<Value *>(Record->getOperand(0))->stripPointerCasts();
|
||||
void InstrProfiling::lowerCoverageData(GlobalVariable *CoverageNamesVar) {
|
||||
|
||||
ConstantArray *Names =
|
||||
cast<ConstantArray>(CoverageNamesVar->getInitializer());
|
||||
for (unsigned I = 0, E = Names->getNumOperands(); I < E; ++I) {
|
||||
Constant *NC = Names->getOperand(I);
|
||||
Value *V = NC->stripPointerCasts();
|
||||
assert(isa<GlobalVariable>(V) && "Missing reference to function name");
|
||||
GlobalVariable *Name = cast<GlobalVariable>(V);
|
||||
|
||||
// If we have region counters for this name, we've already handled it.
|
||||
auto It = ProfileDataMap.find(Name);
|
||||
if (It != ProfileDataMap.end())
|
||||
if (It->second.RegionCounters)
|
||||
continue;
|
||||
|
||||
// Move the name variable to the right section.
|
||||
Name->setSection(getNameSection());
|
||||
Name->setAlignment(1);
|
||||
|
Loading…
Reference in New Issue
Block a user