1210008Srdivacky//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
2210008Srdivacky//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6210008Srdivacky//
7210008Srdivacky//===----------------------------------------------------------------------===//
8210008Srdivacky
9280031Sdim#ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H
10280031Sdim#define LLVM_CLANG_CODEGEN_CODEGENACTION_H
11210008Srdivacky
12210008Srdivacky#include "clang/Frontend/FrontendAction.h"
13276479Sdim#include <memory>
14210008Srdivacky
15210008Srdivackynamespace llvm {
16218893Sdim  class LLVMContext;
17210008Srdivacky  class Module;
18210008Srdivacky}
19210008Srdivacky
20210008Srdivackynamespace clang {
21218893Sdimclass BackendConsumer;
22210008Srdivacky
23210008Srdivackyclass CodeGenAction : public ASTFrontendAction {
24210008Srdivackyprivate:
25321369Sdim  // Let BackendConsumer access LinkModule.
26321369Sdim  friend class BackendConsumer;
27321369Sdim
28321369Sdim  /// Info about module to link into a module we're generating.
29321369Sdim  struct LinkModule {
30321369Sdim    /// The module to link in.
31321369Sdim    std::unique_ptr<llvm::Module> Module;
32321369Sdim
33321369Sdim    /// If true, we set attributes on Module's functions according to our
34321369Sdim    /// CodeGenOptions and LangOptions, as though we were generating the
35321369Sdim    /// function ourselves.
36321369Sdim    bool PropagateAttrs;
37321369Sdim
38321369Sdim    /// If true, we use LLVM module internalizer.
39321369Sdim    bool Internalize;
40321369Sdim
41321369Sdim    /// Bitwise combination of llvm::LinkerFlags used when we link the module.
42321369Sdim    unsigned LinkFlags;
43321369Sdim  };
44321369Sdim
45210008Srdivacky  unsigned Act;
46276479Sdim  std::unique_ptr<llvm::Module> TheModule;
47321369Sdim
48321369Sdim  /// Bitcode modules to link in to our module.
49321369Sdim  SmallVector<LinkModule, 4> LinkModules;
50218893Sdim  llvm::LLVMContext *VMContext;
51218893Sdim  bool OwnsVMContext;
52210008Srdivacky
53321369Sdim  std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
54321369Sdim
55210008Srdivackyprotected:
56243830Sdim  /// Create a new code generation action.  If the optional \p _VMContext
57218893Sdim  /// parameter is supplied, the action uses it without taking ownership,
58218893Sdim  /// otherwise it creates a fresh LLVM context and takes ownership.
59276479Sdim  CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr);
60210008Srdivacky
61276479Sdim  bool hasIRSupport() const override;
62210008Srdivacky
63280031Sdim  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
64280031Sdim                                                 StringRef InFile) override;
65210008Srdivacky
66276479Sdim  void ExecuteAction() override;
67210008Srdivacky
68276479Sdim  void EndSourceFileAction() override;
69210008Srdivacky
70210008Srdivackypublic:
71288943Sdim  ~CodeGenAction() override;
72210008Srdivacky
73280031Sdim  /// Take the generated LLVM module, for use after the action has been run.
74280031Sdim  /// The result may be null on failure.
75280031Sdim  std::unique_ptr<llvm::Module> takeModule();
76218893Sdim
77218893Sdim  /// Take the LLVM context used by this action.
78218893Sdim  llvm::LLVMContext *takeLLVMContext();
79218893Sdim
80218893Sdim  BackendConsumer *BEConsumer;
81210008Srdivacky};
82210008Srdivacky
83210008Srdivackyclass EmitAssemblyAction : public CodeGenAction {
84234353Sdim  virtual void anchor();
85210008Srdivackypublic:
86276479Sdim  EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
87210008Srdivacky};
88210008Srdivacky
89210008Srdivackyclass EmitBCAction : public CodeGenAction {
90234353Sdim  virtual void anchor();
91210008Srdivackypublic:
92276479Sdim  EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
93210008Srdivacky};
94210008Srdivacky
95210008Srdivackyclass EmitLLVMAction : public CodeGenAction {
96234353Sdim  virtual void anchor();
97210008Srdivackypublic:
98276479Sdim  EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
99210008Srdivacky};
100210008Srdivacky
101210008Srdivackyclass EmitLLVMOnlyAction : public CodeGenAction {
102234353Sdim  virtual void anchor();
103210008Srdivackypublic:
104276479Sdim  EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
105210008Srdivacky};
106210008Srdivacky
107210008Srdivackyclass EmitCodeGenOnlyAction : public CodeGenAction {
108234353Sdim  virtual void anchor();
109210008Srdivackypublic:
110276479Sdim  EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
111210008Srdivacky};
112210008Srdivacky
113210008Srdivackyclass EmitObjAction : public CodeGenAction {
114234353Sdim  virtual void anchor();
115210008Srdivackypublic:
116276479Sdim  EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
117210008Srdivacky};
118210008Srdivacky
119210008Srdivacky}
120210008Srdivacky
121210008Srdivacky#endif
122