Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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