| //===- bolt/Profile/YAMLProfileReader.h - YAML profile reader ---*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef BOLT_PROFILE_YAML_PROFILE_READER_H |
| #define BOLT_PROFILE_YAML_PROFILE_READER_H |
| |
| #include "bolt/Profile/ProfileReaderBase.h" |
| #include "bolt/Profile/ProfileYAMLMapping.h" |
| #include <unordered_set> |
| |
| namespace llvm { |
| namespace bolt { |
| |
| class YAMLProfileReader : public ProfileReaderBase { |
| public: |
| explicit YAMLProfileReader(StringRef Filename) |
| : ProfileReaderBase(Filename) {} |
| |
| StringRef getReaderName() const override { return "YAML profile reader"; } |
| |
| bool isTrustedSource() const override { return false; } |
| |
| Error readProfilePreCFG(BinaryContext &BC) override { |
| return Error::success(); |
| } |
| |
| Error readProfile(BinaryContext &BC) override; |
| |
| Error preprocessProfile(BinaryContext &BC) override; |
| |
| bool hasLocalsWithFileName() const override; |
| |
| bool mayHaveProfileData(const BinaryFunction &BF) override; |
| |
| /// Check if the file contains YAML. |
| static bool isYAML(StringRef Filename); |
| |
| private: |
| /// Adjustments for basic samples profiles (without LBR). |
| bool NormalizeByInsnCount{false}; |
| bool NormalizeByCalls{false}; |
| |
| /// Binary profile in YAML format. |
| yaml::bolt::BinaryProfile YamlBP; |
| |
| /// Map a function ID from a YAML profile to a BinaryFunction object. |
| std::vector<BinaryFunction *> YamlProfileToFunction; |
| |
| /// To keep track of functions that have a matched profile before the profile |
| /// is attributed. |
| std::unordered_set<const BinaryFunction *> ProfiledFunctions; |
| |
| /// For LTO symbol resolution. |
| /// Map a common LTO prefix to a list of YAML profiles matching the prefix. |
| StringMap<std::vector<yaml::bolt::BinaryFunctionProfile *>> LTOCommonNameMap; |
| |
| /// Map a common LTO prefix to a set of binary functions. |
| StringMap<std::unordered_set<const BinaryFunction *>> |
| LTOCommonNameFunctionMap; |
| |
| /// Strict matching of a name in a profile to its contents. |
| StringMap<yaml::bolt::BinaryFunctionProfile *> ProfileNameToProfile; |
| |
| /// Populate \p Function profile with the one supplied in YAML format. |
| bool parseFunctionProfile(BinaryFunction &Function, |
| const yaml::bolt::BinaryFunctionProfile &YamlBF); |
| |
| /// Initialize maps for profile matching. |
| void buildNameMaps(std::map<uint64_t, BinaryFunction> &Functions); |
| |
| /// Update matched YAML -> BinaryFunction pair. |
| void matchProfileToFunction(yaml::bolt::BinaryFunctionProfile &YamlBF, |
| BinaryFunction &BF) { |
| if (YamlBF.Id >= YamlProfileToFunction.size()) |
| YamlProfileToFunction.resize(YamlBF.Id + 1); |
| YamlProfileToFunction[YamlBF.Id] = &BF; |
| YamlBF.Used = true; |
| |
| assert(!ProfiledFunctions.count(&BF) && |
| "function already has an assigned profile"); |
| ProfiledFunctions.emplace(&BF); |
| } |
| |
| /// Check if the profile uses an event with a given \p Name. |
| bool usesEvent(StringRef Name) const; |
| }; |
| |
| } // namespace bolt |
| } // namespace llvm |
| |
| #endif |