1210008Srdivacky//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===// 2210008Srdivacky// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6210008Srdivacky// 7210008Srdivacky//===----------------------------------------------------------------------===// 8210008Srdivacky 9280031Sdim#ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H 10280031Sdim#define LLVM_CLANG_CODEGEN_CODEGENACTION_H 11210008Srdivacky 12210008Srdivacky#include "clang/Frontend/FrontendAction.h" 13276479Sdim#include <memory> 14210008Srdivacky 15210008Srdivackynamespace llvm { 16218893Sdim class LLVMContext; 17210008Srdivacky class Module; 18210008Srdivacky} 19210008Srdivacky 20210008Srdivackynamespace clang { 21218893Sdimclass BackendConsumer; 22210008Srdivacky 23210008Srdivackyclass CodeGenAction : public ASTFrontendAction { 24210008Srdivackyprivate: 25321369Sdim // Let BackendConsumer access LinkModule. 26321369Sdim friend class BackendConsumer; 27321369Sdim 28321369Sdim /// Info about module to link into a module we're generating. 29321369Sdim struct LinkModule { 30321369Sdim /// The module to link in. 31321369Sdim std::unique_ptr<llvm::Module> Module; 32321369Sdim 33321369Sdim /// If true, we set attributes on Module's functions according to our 34321369Sdim /// CodeGenOptions and LangOptions, as though we were generating the 35321369Sdim /// function ourselves. 36321369Sdim bool PropagateAttrs; 37321369Sdim 38321369Sdim /// If true, we use LLVM module internalizer. 39321369Sdim bool Internalize; 40321369Sdim 41321369Sdim /// Bitwise combination of llvm::LinkerFlags used when we link the module. 42321369Sdim unsigned LinkFlags; 43321369Sdim }; 44321369Sdim 45210008Srdivacky unsigned Act; 46276479Sdim std::unique_ptr<llvm::Module> TheModule; 47321369Sdim 48321369Sdim /// Bitcode modules to link in to our module. 49321369Sdim SmallVector<LinkModule, 4> LinkModules; 50218893Sdim llvm::LLVMContext *VMContext; 51218893Sdim bool OwnsVMContext; 52210008Srdivacky 53321369Sdim std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef); 54321369Sdim 55210008Srdivackyprotected: 56243830Sdim /// Create a new code generation action. If the optional \p _VMContext 57218893Sdim /// parameter is supplied, the action uses it without taking ownership, 58218893Sdim /// otherwise it creates a fresh LLVM context and takes ownership. 59276479Sdim CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr); 60210008Srdivacky 61276479Sdim bool hasIRSupport() const override; 62210008Srdivacky 63280031Sdim std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 64280031Sdim StringRef InFile) override; 65210008Srdivacky 66276479Sdim void ExecuteAction() override; 67210008Srdivacky 68276479Sdim void EndSourceFileAction() override; 69210008Srdivacky 70210008Srdivackypublic: 71288943Sdim ~CodeGenAction() override; 72210008Srdivacky 73280031Sdim /// Take the generated LLVM module, for use after the action has been run. 74280031Sdim /// The result may be null on failure. 75280031Sdim std::unique_ptr<llvm::Module> takeModule(); 76218893Sdim 77218893Sdim /// Take the LLVM context used by this action. 78218893Sdim llvm::LLVMContext *takeLLVMContext(); 79218893Sdim 80218893Sdim BackendConsumer *BEConsumer; 81210008Srdivacky}; 82210008Srdivacky 83210008Srdivackyclass EmitAssemblyAction : public CodeGenAction { 84234353Sdim virtual void anchor(); 85210008Srdivackypublic: 86276479Sdim EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr); 87210008Srdivacky}; 88210008Srdivacky 89210008Srdivackyclass EmitBCAction : public CodeGenAction { 90234353Sdim virtual void anchor(); 91210008Srdivackypublic: 92276479Sdim EmitBCAction(llvm::LLVMContext *_VMContext = nullptr); 93210008Srdivacky}; 94210008Srdivacky 95210008Srdivackyclass EmitLLVMAction : public CodeGenAction { 96234353Sdim virtual void anchor(); 97210008Srdivackypublic: 98276479Sdim EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr); 99210008Srdivacky}; 100210008Srdivacky 101210008Srdivackyclass EmitLLVMOnlyAction : public CodeGenAction { 102234353Sdim virtual void anchor(); 103210008Srdivackypublic: 104276479Sdim EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr); 105210008Srdivacky}; 106210008Srdivacky 107210008Srdivackyclass EmitCodeGenOnlyAction : public CodeGenAction { 108234353Sdim virtual void anchor(); 109210008Srdivackypublic: 110276479Sdim EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr); 111210008Srdivacky}; 112210008Srdivacky 113210008Srdivackyclass EmitObjAction : public CodeGenAction { 114234353Sdim virtual void anchor(); 115210008Srdivackypublic: 116276479Sdim EmitObjAction(llvm::LLVMContext *_VMContext = nullptr); 117210008Srdivacky}; 118210008Srdivacky 119210008Srdivacky} 120210008Srdivacky 121210008Srdivacky#endif 122