123 lines
3.2 KiB
C++
123 lines
3.2 KiB
C++
//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H
|
|
#define LLVM_CLANG_CODEGEN_CODEGENACTION_H
|
|
|
|
#include "clang/Frontend/FrontendAction.h"
|
|
#include <memory>
|
|
|
|
namespace llvm {
|
|
class LLVMContext;
|
|
class Module;
|
|
}
|
|
|
|
namespace clang {
|
|
class BackendConsumer;
|
|
|
|
class CodeGenAction : public ASTFrontendAction {
|
|
private:
|
|
// Let BackendConsumer access LinkModule.
|
|
friend class BackendConsumer;
|
|
|
|
/// Info about module to link into a module we're generating.
|
|
struct LinkModule {
|
|
/// The module to link in.
|
|
std::unique_ptr<llvm::Module> Module;
|
|
|
|
/// If true, we set attributes on Module's functions according to our
|
|
/// CodeGenOptions and LangOptions, as though we were generating the
|
|
/// function ourselves.
|
|
bool PropagateAttrs;
|
|
|
|
/// If true, we use LLVM module internalizer.
|
|
bool Internalize;
|
|
|
|
/// Bitwise combination of llvm::LinkerFlags used when we link the module.
|
|
unsigned LinkFlags;
|
|
};
|
|
|
|
unsigned Act;
|
|
std::unique_ptr<llvm::Module> TheModule;
|
|
|
|
/// Bitcode modules to link in to our module.
|
|
SmallVector<LinkModule, 4> LinkModules;
|
|
llvm::LLVMContext *VMContext;
|
|
bool OwnsVMContext;
|
|
|
|
std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
|
|
|
|
protected:
|
|
/// Create a new code generation action. If the optional \p _VMContext
|
|
/// parameter is supplied, the action uses it without taking ownership,
|
|
/// otherwise it creates a fresh LLVM context and takes ownership.
|
|
CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr);
|
|
|
|
bool hasIRSupport() const override;
|
|
|
|
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
|
|
StringRef InFile) override;
|
|
|
|
void ExecuteAction() override;
|
|
|
|
void EndSourceFileAction() override;
|
|
|
|
public:
|
|
~CodeGenAction() override;
|
|
|
|
/// Take the generated LLVM module, for use after the action has been run.
|
|
/// The result may be null on failure.
|
|
std::unique_ptr<llvm::Module> takeModule();
|
|
|
|
/// Take the LLVM context used by this action.
|
|
llvm::LLVMContext *takeLLVMContext();
|
|
|
|
BackendConsumer *BEConsumer;
|
|
};
|
|
|
|
class EmitAssemblyAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
class EmitBCAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
class EmitLLVMAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
class EmitLLVMOnlyAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
class EmitCodeGenOnlyAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
class EmitObjAction : public CodeGenAction {
|
|
virtual void anchor();
|
|
public:
|
|
EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|