1 //===-- EmbedBitcodePass.h - Embeds bitcode into global ---------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 /// \file
9 ///
10 /// This file provides a pass which clones the current module and runs the
11 /// provided pass pipeline on the clone. The optimized module is stored into a
12 /// global variable in the `.llvm.lto` section. Primarily, this pass is used
13 /// to support the FatLTO pipeline, but could be used to generate a bitcode
14 /// section for any arbitrary pass pipeline without changing the current module.
15 ///
16 //===----------------------------------------------------------------------===//
17 //
18 #ifndef LLVM_TRANSFORMS_IPO_EMBEDBITCODEPASS_H
19 #define LLVM_TRANSFORMS_IPO_EMBEDBITCODEPASS_H
20 
21 #include "llvm/IR/PassManager.h"
22 
23 namespace llvm {
24 class Module;
25 class Pass;
26 
27 struct EmbedBitcodeOptions {
EmbedBitcodeOptionsEmbedBitcodeOptions28   EmbedBitcodeOptions() : EmbedBitcodeOptions(false, false) {}
EmbedBitcodeOptionsEmbedBitcodeOptions29   EmbedBitcodeOptions(bool IsThinLTO, bool EmitLTOSummary)
30       : IsThinLTO(IsThinLTO), EmitLTOSummary(EmitLTOSummary) {}
31   bool IsThinLTO;
32   bool EmitLTOSummary;
33 };
34 
35 /// Pass embeds a copy of the module optimized with the provided pass pipeline
36 /// into a global variable.
37 class EmbedBitcodePass : public PassInfoMixin<EmbedBitcodePass> {
38   bool IsThinLTO;
39   bool EmitLTOSummary;
40 
41 public:
EmbedBitcodePass(EmbedBitcodeOptions Opts)42   EmbedBitcodePass(EmbedBitcodeOptions Opts)
43       : EmbedBitcodePass(Opts.IsThinLTO, Opts.EmitLTOSummary) {}
EmbedBitcodePass(bool IsThinLTO,bool EmitLTOSummary)44   EmbedBitcodePass(bool IsThinLTO, bool EmitLTOSummary)
45       : IsThinLTO(IsThinLTO), EmitLTOSummary(EmitLTOSummary) {}
46 
47   PreservedAnalyses run(Module &M, ModuleAnalysisManager &);
48 
isRequired()49   static bool isRequired() { return true; }
50 };
51 
52 } // end namespace llvm.
53 
54 #endif
55