clang  6.0.0svn
CodeGenAction.h
Go to the documentation of this file.
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 
14 #include <memory>
15 
16 namespace llvm {
17  class LLVMContext;
18  class Module;
19 }
20 
21 namespace clang {
22 class BackendConsumer;
23 
25 private:
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 
56 protected:
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 
71 public:
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 
82 };
83 
85  virtual void anchor();
86 public:
87  EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
88 };
89 
90 class EmitBCAction : public CodeGenAction {
91  virtual void anchor();
92 public:
93  EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
94 };
95 
96 class EmitLLVMAction : public CodeGenAction {
97  virtual void anchor();
98 public:
99  EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
100 };
101 
103  virtual void anchor();
104 public:
105  EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
106 };
107 
109  virtual void anchor();
110 public:
111  EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
112 };
113 
114 class EmitObjAction : public CodeGenAction {
115  virtual void anchor();
116 public:
117  EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
118 };
119 
120 }
121 
122 #endif
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
Definition: Dominators.h:26
Describes a module or submodule.
Definition: Module.h:65
BackendConsumer * BEConsumer
Definition: CodeGenAction.h:81
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
Abstract base class to use for AST consumer-based frontend actions.
Dataflow Directional Tag Classes.
Defines the clang::FrontendAction interface and various convenience abstract classes (clang::ASTFront...