]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/llvm/tools/clang/include/clang/CodeGen/CodeGenAction.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / llvm / tools / clang / include / clang / CodeGen / CodeGenAction.h
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_CODE_GEN_ACTION_H
11 #define LLVM_CLANG_CODEGEN_CODE_GEN_ACTION_H
12
13 #include "clang/Frontend/FrontendAction.h"
14 #include "llvm/ADT/OwningPtr.h"
15
16 namespace llvm {
17   class LLVMContext;
18   class Module;
19 }
20
21 namespace clang {
22 class BackendConsumer;
23
24 class CodeGenAction : public ASTFrontendAction {
25 private:
26   unsigned Act;
27   OwningPtr<llvm::Module> TheModule;
28   llvm::Module *LinkModule;
29   llvm::LLVMContext *VMContext;
30   bool OwnsVMContext;
31
32 protected:
33   /// Create a new code generation action.  If the optional \p _VMContext
34   /// parameter is supplied, the action uses it without taking ownership,
35   /// otherwise it creates a fresh LLVM context and takes ownership.
36   CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = 0);
37
38   virtual bool hasIRSupport() const;
39
40   virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
41                                          StringRef InFile);
42
43   virtual void ExecuteAction();
44
45   virtual void EndSourceFileAction();
46
47 public:
48   ~CodeGenAction();
49
50   /// setLinkModule - Set the link module to be used by this action.  If a link
51   /// module is not provided, and CodeGenOptions::LinkBitcodeFile is non-empty,
52   /// the action will load it from the specified file.
53   void setLinkModule(llvm::Module *Mod) { LinkModule = Mod; }
54
55   /// takeModule - Take the generated LLVM module, for use after the action has
56   /// been run. The result may be null on failure.
57   llvm::Module *takeModule();
58
59   /// Take the LLVM context used by this action.
60   llvm::LLVMContext *takeLLVMContext();
61
62   BackendConsumer *BEConsumer;
63 };
64
65 class EmitAssemblyAction : public CodeGenAction {
66   virtual void anchor();
67 public:
68   EmitAssemblyAction(llvm::LLVMContext *_VMContext = 0);
69 };
70
71 class EmitBCAction : public CodeGenAction {
72   virtual void anchor();
73 public:
74   EmitBCAction(llvm::LLVMContext *_VMContext = 0);
75 };
76
77 class EmitLLVMAction : public CodeGenAction {
78   virtual void anchor();
79 public:
80   EmitLLVMAction(llvm::LLVMContext *_VMContext = 0);
81 };
82
83 class EmitLLVMOnlyAction : public CodeGenAction {
84   virtual void anchor();
85 public:
86   EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = 0);
87 };
88
89 class EmitCodeGenOnlyAction : public CodeGenAction {
90   virtual void anchor();
91 public:
92   EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = 0);
93 };
94
95 class EmitObjAction : public CodeGenAction {
96   virtual void anchor();
97 public:
98   EmitObjAction(llvm::LLVMContext *_VMContext = 0);
99 };
100
101 }
102
103 #endif