14ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
24ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//
34ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//                     The LLVM Compiler Infrastructure
44ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//
54ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar// This file is distributed under the University of Illinois Open Source
64ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar// License. See LICENSE.TXT for details.
74ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//
84ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar//===----------------------------------------------------------------------===//
94ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
109b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#ifndef LLVM_CLANG_CODEGEN_CODE_GEN_ACTION_H
119b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#define LLVM_CLANG_CODEGEN_CODE_GEN_ACTION_H
129b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar
134ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar#include "clang/Frontend/FrontendAction.h"
14b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar#include "llvm/ADT/OwningPtr.h"
15b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar
16b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbarnamespace llvm {
174b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  class LLVMContext;
18b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar  class Module;
19b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar}
204ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
214ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarnamespace clang {
225aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberclass BackendConsumer;
234ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
244ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass CodeGenAction : public ASTFrontendAction {
254ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarprivate:
264ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar  unsigned Act;
276f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith  OwningPtr<llvm::Module> TheModule;
2822a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne  llvm::Module *LinkModule;
294b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  llvm::LLVMContext *VMContext;
304b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  bool OwnsVMContext;
314ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
324ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarprotected:
331824d54df85a462ada812dadda18130f951d40f3Dmitri Gribenko  /// Create a new code generation action.  If the optional \p _VMContext
344b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  /// parameter is supplied, the action uses it without taking ownership,
354b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  /// otherwise it creates a fresh LLVM context and takes ownership.
364b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = 0);
374ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
384cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar  virtual bool hasIRSupport() const;
394cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar
404ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
41686775deca8b8685eb90801495880e3abdd844c2Chris Lattner                                         StringRef InFile);
42b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar
434cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar  virtual void ExecuteAction();
444cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbar
45b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar  virtual void EndSourceFileAction();
46b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar
47b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbarpublic:
48f84df9f076038ad16e1ee412162c328cd091bc59Chandler Carruth  ~CodeGenAction();
49f84df9f076038ad16e1ee412162c328cd091bc59Chandler Carruth
5022a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne  /// setLinkModule - Set the link module to be used by this action.  If a link
5122a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne  /// module is not provided, and CodeGenOptions::LinkBitcodeFile is non-empty,
5222a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne  /// the action will load it from the specified file.
5322a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne  void setLinkModule(llvm::Module *Mod) { LinkModule = Mod; }
5422a7dfea585703d6755db69b83e29a0e6ee10369Peter Collingbourne
55b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar  /// takeModule - Take the generated LLVM module, for use after the action has
56b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar  /// been run. The result may be null on failure.
57b954e98893505d401acddac42650a81b83d8dc39Daniel Dunbar  llvm::Module *takeModule();
585aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber
594b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  /// Take the LLVM context used by this action.
604b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  llvm::LLVMContext *takeLLVMContext();
614b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne
625aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber  BackendConsumer *BEConsumer;
634ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
644ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
654ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass EmitAssemblyAction : public CodeGenAction {
6699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
674ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarpublic:
684b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitAssemblyAction(llvm::LLVMContext *_VMContext = 0);
694ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
704ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
714ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass EmitBCAction : public CodeGenAction {
7299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
734ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarpublic:
744b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitBCAction(llvm::LLVMContext *_VMContext = 0);
754ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
764ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
774ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass EmitLLVMAction : public CodeGenAction {
7899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
794ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarpublic:
804b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitLLVMAction(llvm::LLVMContext *_VMContext = 0);
814ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
824ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
834ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass EmitLLVMOnlyAction : public CodeGenAction {
8499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
854ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarpublic:
864b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = 0);
874ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
884ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
8932148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbarclass EmitCodeGenOnlyAction : public CodeGenAction {
9099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
9132148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbarpublic:
924b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = 0);
9332148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar};
9432148cef25570a4fbe3ad0ec497ce3ae2cf1b774Daniel Dunbar
954ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarclass EmitObjAction : public CodeGenAction {
9699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
974ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbarpublic:
984b93d660c6326ec79b5e369317d1051cf826c2f3Peter Collingbourne  EmitObjAction(llvm::LLVMContext *_VMContext = 0);
994ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar};
1004ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar
1014ee34616c6fa7700e27c0a5311718d844cbb7d2cDaniel Dunbar}
1029b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar
1039b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar#endif
104