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