diff options
Diffstat (limited to 'bolt/lib')
-rw-r--r-- | bolt/lib/Profile/DataAggregator.cpp | 44 | ||||
-rw-r--r-- | bolt/lib/Rewrite/RewriteInstance.cpp | 59 |
2 files changed, 49 insertions, 54 deletions
diff --git a/bolt/lib/Profile/DataAggregator.cpp b/bolt/lib/Profile/DataAggregator.cpp index 905728de..c13fa6d 100644 --- a/bolt/lib/Profile/DataAggregator.cpp +++ b/bolt/lib/Profile/DataAggregator.cpp @@ -581,6 +581,26 @@ void DataAggregator::imputeFallThroughs() { outs() << "BOLT-INFO: imputed " << InferredTraces << " traces\n"; } +void DataAggregator::registerProfiledFunctions() { + DenseSet<uint64_t> Addrs; + for (const auto &Trace : llvm::make_first_range(Traces)) { + if (Trace.Branch != Trace::FT_ONLY && + Trace.Branch != Trace::FT_EXTERNAL_ORIGIN) + Addrs.insert(Trace.Branch); + Addrs.insert(Trace.From); + } + + for (const auto [PC, _] : BasicSamples) + Addrs.insert(PC); + + for (const PerfMemSample &MemSample : MemSamples) + Addrs.insert(MemSample.PC); + + for (const uint64_t Addr : Addrs) + if (BinaryFunction *Func = getBinaryFunctionContainingAddress(Addr)) + Func->setHasProfileAvailable(); +} + Error DataAggregator::preprocessProfile(BinaryContext &BC) { this->BC = &BC; @@ -603,6 +623,7 @@ Error DataAggregator::preprocessProfile(BinaryContext &BC) { exit(0); } + registerProfiledFunctions(); return Error::success(); } @@ -906,11 +927,10 @@ DataAggregator::getFallthroughsInTrace(BinaryFunction &BF, const Trace &Trace, if (BF.isPseudo()) return Branches; - if (!BF.isSimple()) + // Can only record traces in CFG state + if (!BF.hasCFG()) return std::nullopt; - assert(BF.hasCFG() && "can only record traces in CFG state"); - const BinaryBasicBlock *FromBB = BF.getBasicBlockContainingOffset(From); const BinaryBasicBlock *ToBB = BF.getBasicBlockContainingOffset(To); @@ -1348,10 +1368,6 @@ std::error_code DataAggregator::parseAggregatedLBREntry() { } const uint64_t FromOffset = Addr[0]->Offset; - BinaryFunction *FromFunc = getBinaryFunctionContainingAddress(FromOffset); - if (FromFunc) - FromFunc->setHasProfileAvailable(); - int64_t Count = Counters[0]; int64_t Mispreds = Counters[1]; @@ -1362,11 +1378,6 @@ std::error_code DataAggregator::parseAggregatedLBREntry() { return std::error_code(); } - const uint64_t ToOffset = Addr[1]->Offset; - BinaryFunction *ToFunc = getBinaryFunctionContainingAddress(ToOffset); - if (ToFunc) - ToFunc->setHasProfileAvailable(); - /// For fall-through types, adjust locations to match Trace container. if (Type == FT || Type == FT_EXTERNAL_ORIGIN || Type == FT_EXTERNAL_RETURN) { Addr[2] = Location(Addr[1]->Offset); // Trace To @@ -1614,9 +1625,6 @@ std::error_code DataAggregator::parseBranchEvents() { Traces.reserve(TraceMap.size()); for (const auto &[Trace, Info] : TraceMap) { Traces.emplace_back(Trace, Info); - for (const uint64_t Addr : {Trace.Branch, Trace.From}) - if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Addr)) - BF->setHasProfileAvailable(); } clear(TraceMap); @@ -1677,9 +1685,6 @@ std::error_code DataAggregator::parseBasicEvents() { continue; ++NumTotalSamples; - if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Sample->PC)) - BF->setHasProfileAvailable(); - ++BasicSamples[Sample->PC]; EventNames.insert(Sample->EventName); } @@ -1717,9 +1722,6 @@ std::error_code DataAggregator::parseMemEvents() { if (std::error_code EC = Sample.getError()) return EC; - if (BinaryFunction *BF = getBinaryFunctionContainingAddress(Sample->PC)) - BF->setHasProfileAvailable(); - MemSamples.emplace_back(std::move(Sample.get())); } diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp index 96045a9..fe4a23c 100644 --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -714,21 +714,6 @@ Error RewriteInstance::run() { preprocessProfileData(); - // Skip disassembling if we have a translation table and we are running an - // aggregation job. - if (opts::AggregateOnly && BAT->enabledFor(InputFile)) { - // YAML profile in BAT mode requires CFG for .bolt.org.text functions - if (!opts::SaveProfile.empty() || - opts::ProfileFormat == opts::ProfileFormatKind::PF_YAML) { - selectFunctionsToProcess(); - disassembleFunctions(); - processMetadataPreCFG(); - buildFunctionsCFG(); - } - processProfileData(); - return Error::success(); - } - selectFunctionsToProcess(); readDebugInfo(); @@ -911,6 +896,20 @@ void RewriteInstance::discoverFileObjects() { continue; MarkerSymType MarkerType = BC->getMarkerType(SymInfo.Symbol); + + // Treat ST_Function as code. + Expected<object::SymbolRef::Type> TypeOrError = SymInfo.Symbol.getType(); + consumeError(TypeOrError.takeError()); + if (TypeOrError && *TypeOrError == SymbolRef::ST_Function) { + if (IsData) { + Expected<StringRef> NameOrError = SymInfo.Symbol.getName(); + consumeError(NameOrError.takeError()); + BC->errs() << "BOLT-WARNING: function symbol " << *NameOrError + << " lacks code marker\n"; + } + MarkerType = MarkerSymType::CODE; + } + if (MarkerType != MarkerSymType::NONE) { SortedMarkerSymbols.push_back(MarkerSym{SymInfo.Address, MarkerType}); LastAddr = SymInfo.Address; @@ -4260,31 +4259,25 @@ void RewriteInstance::patchELFPHDRTable() { const ELFFile<ELF64LE> &Obj = ELF64LEFile->getELFFile(); raw_fd_ostream &OS = Out->os(); - // Write/re-write program headers. Phnum = Obj.getHeader().e_phnum; - if (PHDRTableOffset) { - // Writing new pheader table and adding one new entry for R+X segment. - Phnum += 1; - if (NewWritableSegmentSize) { - // Adding one more entry for R+W segment. - Phnum += 1; - } - } else { + + if (BC->NewSegments.empty()) { + BC->outs() << "BOLT-INFO: not adding new segments\n"; + return; + } + + if (opts::UseGnuStack) { assert(!PHDRTableAddress && "unexpected address for program header table"); - PHDRTableOffset = Obj.getHeader().e_phoff; - if (NewWritableSegmentSize) { + if (BC->NewSegments.size() > 1) { BC->errs() << "BOLT-ERROR: unable to add writable segment\n"; exit(1); } + } else { + Phnum += BC->NewSegments.size(); } - if (opts::Instrument) - Phnum += 2; - - if (BC->NewSegments.empty()) { - BC->outs() << "BOLT-INFO: not adding new segments\n"; - return; - } + if (!PHDRTableOffset) + PHDRTableOffset = Obj.getHeader().e_phoff; const uint64_t SavedPos = OS.tell(); OS.seek(PHDRTableOffset); |