- //===- ReplayInlineAdvisor.h - Replay Inline Advisor interface -*- 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 LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 
- #define LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 
-   
- #include "llvm/ADT/StringSet.h" 
- #include "llvm/Analysis/InlineAdvisor.h" 
-   
- namespace llvm { 
- class CallBase; 
- class Function; 
- class LLVMContext; 
- class Module; 
-   
- struct CallSiteFormat { 
-   enum class Format : int { 
-     Line, 
-     LineColumn, 
-     LineDiscriminator, 
-     LineColumnDiscriminator 
-   }; 
-   
-   bool outputColumn() const { 
-     return OutputFormat == Format::LineColumn || 
-            OutputFormat == Format::LineColumnDiscriminator; 
-   } 
-   
-   bool outputDiscriminator() const { 
-     return OutputFormat == Format::LineDiscriminator || 
-            OutputFormat == Format::LineColumnDiscriminator; 
-   } 
-   
-   Format OutputFormat; 
- }; 
-   
- /// Replay Inliner Setup 
- struct ReplayInlinerSettings { 
-   enum class Scope : int { Function, Module }; 
-   enum class Fallback : int { Original, AlwaysInline, NeverInline }; 
-   
-   StringRef ReplayFile; 
-   Scope ReplayScope; 
-   Fallback ReplayFallback; 
-   CallSiteFormat ReplayFormat; 
- }; 
-   
- /// Get call site location as a string with the given format 
- std::string formatCallSiteLocation(DebugLoc DLoc, const CallSiteFormat &Format); 
-   
- std::unique_ptr<InlineAdvisor> 
- getReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, 
-                        LLVMContext &Context, 
-                        std::unique_ptr<InlineAdvisor> OriginalAdvisor, 
-                        const ReplayInlinerSettings &ReplaySettings, 
-                        bool EmitRemarks, InlineContext IC); 
-   
- /// Replay inline advisor that uses optimization remarks from inlining of 
- /// previous build to guide current inlining. This is useful for inliner tuning. 
- class ReplayInlineAdvisor : public InlineAdvisor { 
- public: 
-   ReplayInlineAdvisor(Module &M, FunctionAnalysisManager &FAM, 
-                       LLVMContext &Context, 
-                       std::unique_ptr<InlineAdvisor> OriginalAdvisor, 
-                       const ReplayInlinerSettings &ReplaySettings, 
-                       bool EmitRemarks, InlineContext IC); 
-   std::unique_ptr<InlineAdvice> getAdviceImpl(CallBase &CB) override; 
-   bool areReplayRemarksLoaded() const { return HasReplayRemarks; } 
-   
- private: 
-   bool hasInlineAdvice(Function &F) const { 
-     return (ReplaySettings.ReplayScope == 
-             ReplayInlinerSettings::Scope::Module) || 
-            CallersToReplay.contains(F.getName()); 
-   } 
-   std::unique_ptr<InlineAdvisor> OriginalAdvisor; 
-   bool HasReplayRemarks = false; 
-   const ReplayInlinerSettings ReplaySettings; 
-   bool EmitRemarks = false; 
-   
-   StringMap<bool> InlineSitesFromRemarks; 
-   StringSet<> CallersToReplay; 
- }; 
- } // namespace llvm 
- #endif // LLVM_ANALYSIS_REPLAYINLINEADVISOR_H 
-