Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8.  
  9. #ifndef LLVM_CLANG_CODEGEN_CODEGENACTION_H
  10. #define LLVM_CLANG_CODEGEN_CODEGENACTION_H
  11.  
  12. #include "clang/Frontend/FrontendAction.h"
  13. #include <memory>
  14.  
  15. namespace llvm {
  16.   class LLVMContext;
  17.   class Module;
  18. }
  19.  
  20. namespace clang {
  21. class BackendConsumer;
  22. class CodeGenerator;
  23.  
  24. class CodeGenAction : public ASTFrontendAction {
  25. private:
  26.   // Let BackendConsumer access LinkModule.
  27.   friend class BackendConsumer;
  28.  
  29.   /// Info about module to link into a module we're generating.
  30.   struct LinkModule {
  31.     /// The module to link in.
  32.     std::unique_ptr<llvm::Module> Module;
  33.  
  34.     /// If true, we set attributes on Module's functions according to our
  35.     /// CodeGenOptions and LangOptions, as though we were generating the
  36.     /// function ourselves.
  37.     bool PropagateAttrs;
  38.  
  39.     /// If true, we use LLVM module internalizer.
  40.     bool Internalize;
  41.  
  42.     /// Bitwise combination of llvm::LinkerFlags used when we link the module.
  43.     unsigned LinkFlags;
  44.   };
  45.  
  46.   unsigned Act;
  47.   std::unique_ptr<llvm::Module> TheModule;
  48.  
  49.   /// Bitcode modules to link in to our module.
  50.   SmallVector<LinkModule, 4> LinkModules;
  51.   llvm::LLVMContext *VMContext;
  52.   bool OwnsVMContext;
  53.  
  54.   std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
  55.  
  56. protected:
  57.   /// Create a new code generation action.  If the optional \p _VMContext
  58.   /// parameter is supplied, the action uses it without taking ownership,
  59.   /// otherwise it creates a fresh LLVM context and takes ownership.
  60.   CodeGenAction(unsigned _Act, llvm::LLVMContext *_VMContext = nullptr);
  61.  
  62.   bool hasIRSupport() const override;
  63.  
  64.   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
  65.                                                  StringRef InFile) override;
  66.  
  67.   void ExecuteAction() override;
  68.  
  69.   void EndSourceFileAction() override;
  70.  
  71. public:
  72.   ~CodeGenAction() override;
  73.  
  74.   /// Take the generated LLVM module, for use after the action has been run.
  75.   /// The result may be null on failure.
  76.   std::unique_ptr<llvm::Module> takeModule();
  77.  
  78.   /// Take the LLVM context used by this action.
  79.   llvm::LLVMContext *takeLLVMContext();
  80.  
  81.   CodeGenerator *getCodeGenerator() const;
  82.  
  83.   BackendConsumer *BEConsumer;
  84. };
  85.  
  86. class EmitAssemblyAction : public CodeGenAction {
  87.   virtual void anchor();
  88. public:
  89.   EmitAssemblyAction(llvm::LLVMContext *_VMContext = nullptr);
  90. };
  91.  
  92. class EmitBCAction : public CodeGenAction {
  93.   virtual void anchor();
  94. public:
  95.   EmitBCAction(llvm::LLVMContext *_VMContext = nullptr);
  96. };
  97.  
  98. class EmitLLVMAction : public CodeGenAction {
  99.   virtual void anchor();
  100. public:
  101.   EmitLLVMAction(llvm::LLVMContext *_VMContext = nullptr);
  102. };
  103.  
  104. class EmitLLVMOnlyAction : public CodeGenAction {
  105.   virtual void anchor();
  106. public:
  107.   EmitLLVMOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
  108. };
  109.  
  110. class EmitCodeGenOnlyAction : public CodeGenAction {
  111.   virtual void anchor();
  112. public:
  113.   EmitCodeGenOnlyAction(llvm::LLVMContext *_VMContext = nullptr);
  114. };
  115.  
  116. class EmitObjAction : public CodeGenAction {
  117.   virtual void anchor();
  118. public:
  119.   EmitObjAction(llvm::LLVMContext *_VMContext = nullptr);
  120. };
  121.  
  122. }
  123.  
  124. #endif
  125.