Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- 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 | |||
9 | #ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H |
||
10 | #define LLVM_CLANG_CODEGEN_CODEGENACTION_H |
||
11 | |||
12 | #include "clang/Frontend/FrontendAction.h" |
||
13 | #include <memory> |
||
14 | |||
15 | namespace llvm { |
||
16 | class LLVMContext; |
||
17 | class Module; |
||
18 | } |
||
19 | |||
20 | namespace clang { |
||
21 | class BackendConsumer; |
||
22 | class CodeGenerator; |
||
23 | |||
24 | class CodeGenAction : public ASTFrontendAction { |
||
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 | |||
81 | CodeGenerator *getCodeGenerator() const; |
||
82 | |||
83 | BackendConsumer *BEConsumer; |
||
84 | }; |
||
85 | |||
86 | class EmitAssemblyAction : public CodeGenAction { |
||
87 | virtual void anchor(); |
||
88 | public: |
||
89 | EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); |
||
90 | }; |
||
91 | |||
92 | class EmitBCAction : public CodeGenAction { |
||
93 | virtual void anchor(); |
||
94 | public: |
||
95 | EmitBCAction(llvm::LLVMContext *_VMContext = nullptr); |
||
96 | }; |
||
97 | |||
98 | class EmitLLVMAction : public CodeGenAction { |
||
99 | virtual void anchor(); |
||
100 | public: |
||
101 | EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); |
||
102 | }; |
||
103 | |||
104 | class EmitLLVMOnlyAction : public CodeGenAction { |
||
105 | virtual void anchor(); |
||
106 | public: |
||
107 | EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); |
||
108 | }; |
||
109 | |||
110 | class EmitCodeGenOnlyAction : public CodeGenAction { |
||
111 | virtual void anchor(); |
||
112 | public: |
||
113 | EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); |
||
114 | }; |
||
115 | |||
116 | class EmitObjAction : public CodeGenAction { |
||
117 | virtual void anchor(); |
||
118 | public: |
||
119 | EmitObjAction(llvm::LLVMContext *_VMContext = nullptr); |
||
120 | }; |
||
121 | |||
122 | } |
||
123 | |||
124 | #endif |