File indexing completed on 2026-05-10 08:36:52
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H
0010 #define LLVM_CLANG_CODEGEN_CODEGENACTION_H
0011
0012 #include "clang/Frontend/FrontendAction.h"
0013 #include <memory>
0014
0015 namespace llvm {
0016 class LLVMContext;
0017 class Module;
0018 }
0019
0020 namespace clang {
0021 class BackendConsumer;
0022 class CodeGenerator;
0023
0024 class CodeGenAction : public ASTFrontendAction {
0025 private:
0026
0027 friend class BackendConsumer;
0028
0029
0030 struct LinkModule {
0031
0032 std::unique_ptr<llvm::Module> Module;
0033
0034
0035
0036
0037 bool PropagateAttrs;
0038
0039
0040 bool Internalize;
0041
0042
0043 unsigned LinkFlags;
0044 };
0045
0046 unsigned Act;
0047 std::unique_ptr<llvm::Module> TheModule;
0048
0049
0050 SmallVector<LinkModule, 4> LinkModules;
0051 llvm::LLVMContext *VMContext;
0052 bool OwnsVMContext;
0053
0054 std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
0055
0056
0057 bool loadLinkModules(CompilerInstance &CI);
0058
0059 protected:
0060 bool BeginSourceFileAction(CompilerInstance &CI) override;
0061
0062
0063
0064
0065 CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr);
0066
0067 bool hasIRSupport() const override;
0068
0069 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
0070 StringRef InFile) override;
0071
0072 void ExecuteAction() override;
0073
0074 void EndSourceFileAction() override;
0075
0076 public:
0077 ~CodeGenAction() override;
0078
0079
0080
0081 std::unique_ptr<llvm::Module> takeModule();
0082
0083
0084 llvm::LLVMContext *takeLLVMContext();
0085
0086 CodeGenerator *getCodeGenerator() const;
0087
0088 BackendConsumer *BEConsumer = nullptr;
0089 };
0090
0091 class EmitAssemblyAction : public CodeGenAction {
0092 virtual void anchor();
0093 public:
0094 EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
0095 };
0096
0097 class EmitBCAction : public CodeGenAction {
0098 virtual void anchor();
0099 public:
0100 EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
0101 };
0102
0103 class EmitLLVMAction : public CodeGenAction {
0104 virtual void anchor();
0105 public:
0106 EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
0107 };
0108
0109 class EmitLLVMOnlyAction : public CodeGenAction {
0110 virtual void anchor();
0111 public:
0112 EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
0113 };
0114
0115 class EmitCodeGenOnlyAction : public CodeGenAction {
0116 virtual void anchor();
0117 public:
0118 EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
0119 };
0120
0121 class EmitObjAction : public CodeGenAction {
0122 virtual void anchor();
0123 public:
0124 EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
0125 };
0126
0127 }
0128
0129 #endif