1//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H
11#define LLVM_CLANG_CODEGEN_CODEGENACTION_H
12
13#include "clang/Frontend/FrontendAction.h"
14#include <memory>
15
16namespace llvm {
17  class LLVMContext;
18  class Module;
19}
20
21namespace clang {
22class BackendConsumer;
23
24class CodeGenAction : public ASTFrontendAction {
25private:
26  // Let BackendConsumer access LinkModule.
27  friend class BackendConsumer;
28
29  /// Info about module to link into a module we're generating.
30  struct LinkModule {
31    /// The module to link in.
32    std::unique_ptr<llvm::Module> Module;
33
34    /// If true, we set attributes on Module's functions according to our
35    /// CodeGenOptions and LangOptions, as though we were generating the
36    /// function ourselves.
37    bool PropagateAttrs;
38
39    /// If true, we use LLVM module internalizer.
40    bool Internalize;
41
42    /// Bitwise combination of llvm::LinkerFlags used when we link the module.
43    unsigned LinkFlags;
44  };
45
46  unsigned Act;
47  std::unique_ptr<llvm::Module> TheModule;
48
49  /// Bitcode modules to link in to our module.
50  SmallVector<LinkModule, 4> LinkModules;
51  llvm::LLVMContext *VMContext;
52  bool OwnsVMContext;
53
54  std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
55
56protected:
57  /// Create a new code generation action.  If the optional \p _VMContext
58  /// parameter is supplied, the action uses it without taking ownership,
59  /// otherwise it creates a fresh LLVM context and takes ownership.
60  CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr);
61
62  bool hasIRSupport() const override;
63
64  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
65                                                 StringRef InFile) override;
66
67  void ExecuteAction() override;
68
69  void EndSourceFileAction() override;
70
71public:
72  ~CodeGenAction() override;
73
74  /// Take the generated LLVM module, for use after the action has been run.
75  /// The result may be null on failure.
76  std::unique_ptr<llvm::Module> takeModule();
77
78  /// Take the LLVM context used by this action.
79  llvm::LLVMContext *takeLLVMContext();
80
81  BackendConsumer *BEConsumer;
82};
83
84class EmitAssemblyAction : public CodeGenAction {
85  virtual void anchor();
86public:
87  EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
88};
89
90class EmitBCAction : public CodeGenAction {
91  virtual void anchor();
92public:
93  EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
94};
95
96class EmitLLVMAction : public CodeGenAction {
97  virtual void anchor();
98public:
99  EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
100};
101
102class EmitLLVMOnlyAction : public CodeGenAction {
103  virtual void anchor();
104public:
105  EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
106};
107
108class EmitCodeGenOnlyAction : public CodeGenAction {
109  virtual void anchor();
110public:
111  EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
112};
113
114class EmitObjAction : public CodeGenAction {
115  virtual void anchor();
116public:
117  EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
118};
119
120}
121
122#endif
123