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_CODEGENACTION_H 11 #define LLVM_CLANG_CODEGEN_CODEGENACTION_H 12 13 #include "clang/Frontend/FrontendAction.h" 14 #include <memory> 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 std::unique_ptr<llvm::Module> TheModule; 28 // Vector of {Linker::Flags, Module*} pairs to specify bitcode 29 // modules to link in using corresponding linker flags. 30 SmallVector<std::pair<unsigned, llvm::Module *>, 4> LinkModules; 31 llvm::LLVMContext *VMContext; 32 bool OwnsVMContext; 33 34 protected: 35 /// Create a new code generation action. If the optional \p _VMContext 36 /// parameter is supplied, the action uses it without taking ownership, 37 /// otherwise it creates a fresh LLVM context and takes ownership. 38 CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr); 39 40 bool hasIRSupport() const override; 41 42 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 43 StringRef InFile) override; 44 45 void ExecuteAction() override; 46 47 void EndSourceFileAction() override; 48 49 public: 50 ~CodeGenAction() override; 51 52 /// setLinkModule - Set the link module to be used by this action. If a link 53 /// module is not provided, and CodeGenOptions::LinkBitcodeFile is non-empty, 54 /// the action will load it from the specified file. addLinkModule(llvm::Module * Mod,unsigned LinkFlags)55 void addLinkModule(llvm::Module *Mod, unsigned LinkFlags) { 56 LinkModules.push_back(std::make_pair(LinkFlags, Mod)); 57 } 58 59 /// Take the generated LLVM module, for use after the action has been run. 60 /// The result may be null on failure. 61 std::unique_ptr<llvm::Module> takeModule(); 62 63 /// Take the LLVM context used by this action. 64 llvm::LLVMContext *takeLLVMContext(); 65 66 BackendConsumer *BEConsumer; 67 }; 68 69 class EmitAssemblyAction : public CodeGenAction { 70 virtual void anchor(); 71 public: 72 EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); 73 }; 74 75 class EmitBCAction : public CodeGenAction { 76 virtual void anchor(); 77 public: 78 EmitBCAction(llvm::LLVMContext *_VMContext = nullptr); 79 }; 80 81 class EmitLLVMAction : public CodeGenAction { 82 virtual void anchor(); 83 public: 84 EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); 85 }; 86 87 class EmitLLVMOnlyAction : public CodeGenAction { 88 virtual void anchor(); 89 public: 90 EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); 91 }; 92 93 class EmitCodeGenOnlyAction : public CodeGenAction { 94 virtual void anchor(); 95 public: 96 EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); 97 }; 98 99 class EmitObjAction : public CodeGenAction { 100 virtual void anchor(); 101 public: 102 EmitObjAction(llvm::LLVMContext *_VMContext = nullptr); 103 }; 104 105 } 106 107 #endif 108