Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. //===-LTOCodeGenerator.h - LLVM Link Time Optimizer -----------------------===//
  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. // This file declares the LTOCodeGenerator class.
  10. //
  11. //   LTO compilation consists of three phases: Pre-IPO, IPO and Post-IPO.
  12. //
  13. //   The Pre-IPO phase compiles source code into bitcode file. The resulting
  14. // bitcode files, along with object files and libraries, will be fed to the
  15. // linker to through the IPO and Post-IPO phases. By using obj-file extension,
  16. // the resulting bitcode file disguises itself as an object file, and therefore
  17. // obviates the need of writing a special set of the make-rules only for LTO
  18. // compilation.
  19. //
  20. //   The IPO phase perform inter-procedural analyses and optimizations, and
  21. // the Post-IPO consists two sub-phases: intra-procedural scalar optimizations
  22. // (SOPT), and intra-procedural target-dependent code generator (CG).
  23. //
  24. //   As of this writing, we don't separate IPO and the Post-IPO SOPT. They
  25. // are intermingled together, and are driven by a single pass manager (see
  26. // PassManagerBuilder::populateLTOPassManager()).
  27. //   FIXME: populateLTOPassManager no longer exists.
  28. //
  29. //   The "LTOCodeGenerator" is the driver for the IPO and Post-IPO stages.
  30. // The "CodeGenerator" here is bit confusing. Don't confuse the "CodeGenerator"
  31. // with the machine specific code generator.
  32. //
  33. //===----------------------------------------------------------------------===//
  34.  
  35. #ifndef LLVM_LTO_LEGACY_LTOCODEGENERATOR_H
  36. #define LLVM_LTO_LEGACY_LTOCODEGENERATOR_H
  37.  
  38. #include "llvm-c/lto.h"
  39. #include "llvm/ADT/ArrayRef.h"
  40. #include "llvm/ADT/SmallPtrSet.h"
  41. #include "llvm/ADT/StringMap.h"
  42. #include "llvm/ADT/StringSet.h"
  43. #include "llvm/IR/GlobalValue.h"
  44. #include "llvm/IR/Module.h"
  45. #include "llvm/LTO/Config.h"
  46. #include "llvm/LTO/LTO.h"
  47. #include "llvm/Support/CommandLine.h"
  48. #include "llvm/Support/Error.h"
  49. #include "llvm/Support/ToolOutputFile.h"
  50. #include "llvm/Target/TargetMachine.h"
  51. #include "llvm/Target/TargetOptions.h"
  52. #include <string>
  53. #include <vector>
  54.  
  55. namespace llvm {
  56. template <typename T> class ArrayRef;
  57.   class LLVMContext;
  58.   class DiagnosticInfo;
  59.   class Linker;
  60.   class Mangler;
  61.   class MemoryBuffer;
  62.   class TargetLibraryInfo;
  63.   class TargetMachine;
  64.   class raw_ostream;
  65.   class raw_pwrite_stream;
  66.  
  67. /// Enable global value internalization in LTO.
  68. extern cl::opt<bool> EnableLTOInternalization;
  69.  
  70. //===----------------------------------------------------------------------===//
  71. /// C++ class which implements the opaque lto_code_gen_t type.
  72. ///
  73. struct LTOCodeGenerator {
  74.   static const char *getVersionString();
  75.  
  76.   LTOCodeGenerator(LLVMContext &Context);
  77.   ~LTOCodeGenerator();
  78.  
  79.   /// Merge given module.  Return true on success.
  80.   ///
  81.   /// Resets \a HasVerifiedInput.
  82.   bool addModule(struct LTOModule *);
  83.  
  84.   /// Set the destination module.
  85.   ///
  86.   /// Resets \a HasVerifiedInput.
  87.   void setModule(std::unique_ptr<LTOModule> M);
  88.  
  89.   void setAsmUndefinedRefs(struct LTOModule *);
  90.   void setTargetOptions(const TargetOptions &Options);
  91.   void setDebugInfo(lto_debug_model);
  92.   void setCodePICModel(std::optional<Reloc::Model> Model) {
  93.     Config.RelocModel = Model;
  94.   }
  95.  
  96.   /// Set the file type to be emitted (assembly or object code).
  97.   /// The default is CGFT_ObjectFile.
  98.   void setFileType(CodeGenFileType FT) { Config.CGFileType = FT; }
  99.  
  100.   void setCpu(StringRef MCpu) { Config.CPU = std::string(MCpu); }
  101.   void setAttrs(std::vector<std::string> MAttrs) { Config.MAttrs = MAttrs; }
  102.   void setOptLevel(unsigned OptLevel);
  103.  
  104.   void setShouldInternalize(bool Value) { ShouldInternalize = Value; }
  105.   void setShouldEmbedUselists(bool Value) { ShouldEmbedUselists = Value; }
  106.   void setSaveIRBeforeOptPath(std::string Value) {
  107.     SaveIRBeforeOptPath = Value;
  108.   }
  109.  
  110.   /// Restore linkage of globals
  111.   ///
  112.   /// When set, the linkage of globals will be restored prior to code
  113.   /// generation. That is, a global symbol that had external linkage prior to
  114.   /// LTO will be emitted with external linkage again; and a local will remain
  115.   /// local. Note that this option only affects the end result - globals may
  116.   /// still be internalized in the process of LTO and may be modified and/or
  117.   /// deleted where legal.
  118.   ///
  119.   /// The default behavior will internalize globals (unless on the preserve
  120.   /// list) and, if parallel code generation is enabled, will externalize
  121.   /// all locals.
  122.   void setShouldRestoreGlobalsLinkage(bool Value) {
  123.     ShouldRestoreGlobalsLinkage = Value;
  124.   }
  125.  
  126.   void addMustPreserveSymbol(StringRef Sym) { MustPreserveSymbols.insert(Sym); }
  127.  
  128.   /// Pass options to the driver and optimization passes.
  129.   ///
  130.   /// These options are not necessarily for debugging purpose (the function
  131.   /// name is misleading).  This function should be called before
  132.   /// LTOCodeGenerator::compilexxx(), and
  133.   /// LTOCodeGenerator::writeMergedModules().
  134.   void setCodeGenDebugOptions(ArrayRef<StringRef> Opts);
  135.  
  136.   /// Parse the options set in setCodeGenDebugOptions.
  137.   ///
  138.   /// Like \a setCodeGenDebugOptions(), this must be called before
  139.   /// LTOCodeGenerator::compilexxx() and
  140.   /// LTOCodeGenerator::writeMergedModules().
  141.   void parseCodeGenDebugOptions();
  142.  
  143.   /// Write the merged module to the file specified by the given path.  Return
  144.   /// true on success.
  145.   ///
  146.   /// Calls \a verifyMergedModuleOnce().
  147.   bool writeMergedModules(StringRef Path);
  148.  
  149.   /// Compile the merged module into a *single* output file; the path to output
  150.   /// file is returned to the caller via argument "name". Return true on
  151.   /// success.
  152.   ///
  153.   /// \note It is up to the linker to remove the intermediate output file.  Do
  154.   /// not try to remove the object file in LTOCodeGenerator's destructor as we
  155.   /// don't who (LTOCodeGenerator or the output file) will last longer.
  156.   bool compile_to_file(const char **Name);
  157.  
  158.   /// As with compile_to_file(), this function compiles the merged module into
  159.   /// single output file. Instead of returning the output file path to the
  160.   /// caller (linker), it brings the output to a buffer, and returns the buffer
  161.   /// to the caller. This function should delete the intermediate file once
  162.   /// its content is brought to memory. Return NULL if the compilation was not
  163.   /// successful.
  164.   std::unique_ptr<MemoryBuffer> compile();
  165.  
  166.   /// Optimizes the merged module.  Returns true on success.
  167.   ///
  168.   /// Calls \a verifyMergedModuleOnce().
  169.   bool optimize();
  170.  
  171.   /// Compiles the merged optimized module into a single output file. It brings
  172.   /// the output to a buffer, and returns the buffer to the caller. Return NULL
  173.   /// if the compilation was not successful.
  174.   std::unique_ptr<MemoryBuffer> compileOptimized();
  175.  
  176.   /// Compile the merged optimized module \p ParallelismLevel output files each
  177.   /// representing a linkable partition of the module. If out contains more
  178.   /// than one element, code generation is done in parallel with \p
  179.   /// ParallelismLevel threads.  Output files will be written to the streams
  180.   /// created using the \p AddStream callback. Returns true on success.
  181.   ///
  182.   /// Calls \a verifyMergedModuleOnce().
  183.   bool compileOptimized(AddStreamFn AddStream, unsigned ParallelismLevel);
  184.  
  185.   /// Enable the Freestanding mode: indicate that the optimizer should not
  186.   /// assume builtins are present on the target.
  187.   void setFreestanding(bool Enabled) { Config.Freestanding = Enabled; }
  188.  
  189.   void setDisableVerify(bool Value) { Config.DisableVerify = Value; }
  190.  
  191.   void setDebugPassManager(bool Enabled) { Config.DebugPassManager = Enabled; }
  192.  
  193.   void setDiagnosticHandler(lto_diagnostic_handler_t, void *);
  194.  
  195.   LLVMContext &getContext() { return Context; }
  196.  
  197.   void resetMergedModule() { MergedModule.reset(); }
  198.   void DiagnosticHandler(const DiagnosticInfo &DI);
  199.  
  200. private:
  201.   /// Verify the merged module on first call.
  202.   ///
  203.   /// Sets \a HasVerifiedInput on first call and doesn't run again on the same
  204.   /// input.
  205.   void verifyMergedModuleOnce();
  206.  
  207.   bool compileOptimizedToFile(const char **Name);
  208.   void restoreLinkageForExternals();
  209.   void applyScopeRestrictions();
  210.   void preserveDiscardableGVs(
  211.       Module &TheModule,
  212.       llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV);
  213.  
  214.   bool determineTarget();
  215.   std::unique_ptr<TargetMachine> createTargetMachine();
  216.  
  217.   bool useAIXSystemAssembler();
  218.   bool runAIXSystemAssembler(SmallString<128> &AssemblyFile);
  219.  
  220.   void emitError(const std::string &ErrMsg);
  221.   void emitWarning(const std::string &ErrMsg);
  222.  
  223.   void finishOptimizationRemarks();
  224.  
  225.   LLVMContext &Context;
  226.   std::unique_ptr<Module> MergedModule;
  227.   std::unique_ptr<Linker> TheLinker;
  228.   std::unique_ptr<TargetMachine> TargetMach;
  229.   bool EmitDwarfDebugInfo = false;
  230.   bool ScopeRestrictionsDone = false;
  231.   bool HasVerifiedInput = false;
  232.   StringSet<> MustPreserveSymbols;
  233.   StringSet<> AsmUndefinedRefs;
  234.   StringMap<GlobalValue::LinkageTypes> ExternalSymbols;
  235.   std::vector<std::string> CodegenOptions;
  236.   std::string FeatureStr;
  237.   std::string NativeObjectPath;
  238.   const Target *MArch = nullptr;
  239.   std::string TripleStr;
  240.   lto_diagnostic_handler_t DiagHandler = nullptr;
  241.   void *DiagContext = nullptr;
  242.   bool ShouldInternalize = EnableLTOInternalization;
  243.   bool ShouldEmbedUselists = false;
  244.   bool ShouldRestoreGlobalsLinkage = false;
  245.   std::unique_ptr<ToolOutputFile> DiagnosticOutputFile;
  246.   std::unique_ptr<ToolOutputFile> StatsFile = nullptr;
  247.   std::string SaveIRBeforeOptPath;
  248.  
  249.   lto::Config Config;
  250. };
  251.  
  252. /// A convenience function that calls cl::ParseCommandLineOptions on the given
  253. /// set of options.
  254. void parseCommandLineOptions(std::vector<std::string> &Options);
  255. }
  256. #endif
  257.