[Symbolize] Improve the ownership of parsed objects.
[oota-llvm.git] / include / llvm / LTO / LTOCodeGenerator.h
index a9f9d972a4f2c17bf4125644e01d8067224ffeaf..3820b211a381d94ec65354534a1f8574b545bfab 100644 (file)
@@ -9,7 +9,7 @@
 //
 // This file declares the LTOCodeGenerator class.
 //
-//   LTO compilation consists of three phases: Pre-IPO, IPO and Post-IPO. 
+//   LTO compilation consists of three phases: Pre-IPO, IPO and Post-IPO.
 //
 //   The Pre-IPO phase compiles source code into bitcode file. The resulting
 // bitcode files, along with object files and libraries, will be fed to the
 //   The IPO phase perform inter-procedural analyses and optimizations, and
 // the Post-IPO consists two sub-phases: intra-procedural scalar optimizations
 // (SOPT), and intra-procedural target-dependent code generator (CG).
-// 
+//
 //   As of this writing, we don't separate IPO and the Post-IPO SOPT. They
 // are intermingled together, and are driven by a single pass manager (see
 // PassManagerBuilder::populateLTOPassManager()).
-// 
-//   The "LTOCodeGenerator" is the driver for the IPO and Post-IPO stages. 
+//
+//   The "LTOCodeGenerator" is the driver for the IPO and Post-IPO stages.
 // The "CodeGenerator" here is bit confusing. Don't confuse the "CodeGenerator"
 // with the machine specific code generator.
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LTO_CODE_GENERATOR_H
-#define LTO_CODE_GENERATOR_H
+#ifndef LLVM_LTO_LTOCODEGENERATOR_H
+#define LLVM_LTO_LTOCODEGENERATOR_H
 
 #include "llvm-c/lto.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/StringMap.h"
-#include "llvm/Linker.h"
+#include "llvm/Target/TargetMachine.h"
 #include "llvm/Target/TargetOptions.h"
 #include <string>
 #include <vector>
 
 namespace llvm {
   class LLVMContext;
+  class DiagnosticInfo;
   class GlobalValue;
+  class Linker;
   class Mangler;
   class MemoryBuffer;
   class TargetLibraryInfo;
   class TargetMachine;
   class raw_ostream;
-}
+  class raw_pwrite_stream;
 
 //===----------------------------------------------------------------------===//
-/// LTOCodeGenerator - C++ class which implements the opaque lto_code_gen_t
-/// type.
+/// C++ class which implements the opaque lto_code_gen_t type.
 ///
 struct LTOCodeGenerator {
   static const char *getVersionString();
 
-  LTOCodeGenerator();
+  LTOCodeGenerator(LLVMContext &Context);
   ~LTOCodeGenerator();
 
-  // Merge given module, return true on success.
-  bool addModule(struct LTOModule*, std::string &errMsg);
+  /// Merge given module.  Return true on success.
+  bool addModule(struct LTOModule *);
 
-  void setTargetOptions(llvm::TargetOptions options);
-  void setDebugInfo(lto_debug_model);
-  void setCodePICModel(lto_codegen_model);
+  /// Set the destination module.
+  void setModule(std::unique_ptr<LTOModule> M);
 
-  void setCpu(const char *mCpu) { MCpu = mCpu; }
-
-  void addMustPreserveSymbol(const char *sym) { MustPreserveSymbols[sym] = 1; }
-
-  // To pass options to the driver and optimization passes. These options are
-  // not necessarily for debugging purpose (The function name is misleading).
-  // This function should be called before LTOCodeGenerator::compilexxx(),
-  // and LTOCodeGenerator::writeMergedModules().
-  //
-  void setCodeGenDebugOptions(const char *opts);
+  void setTargetOptions(TargetOptions Options);
+  void setDebugInfo(lto_debug_model);
+  void setCodePICModel(Reloc::Model Model) { RelocModel = Model; }
   
-  // Parse the options set in setCodeGenDebugOptions. Like
-  // setCodeGenDebugOptions, this must be called before
-  // LTOCodeGenerator::compilexxx() and LTOCodeGenerator::writeMergedModules()
+  /// Set the file type to be emitted (assembly or object code).
+  /// The default is TargetMachine::CGFT_ObjectFile. 
+  void setFileType(TargetMachine::CodeGenFileType FT) { FileType = FT; }
+
+  void setCpu(const char *MCpu) { this->MCpu = MCpu; }
+  void setAttr(const char *MAttr) { this->MAttr = MAttr; }
+  void setOptLevel(unsigned OptLevel);
+
+  void setShouldInternalize(bool Value) { ShouldInternalize = Value; }
+  void setShouldEmbedUselists(bool Value) { ShouldEmbedUselists = Value; }
+
+  void addMustPreserveSymbol(StringRef Sym) { MustPreserveSymbols[Sym] = 1; }
+
+  /// Pass options to the driver and optimization passes.
+  ///
+  /// These options are not necessarily for debugging purpose (the function
+  /// name is misleading).  This function should be called before
+  /// LTOCodeGenerator::compilexxx(), and
+  /// LTOCodeGenerator::writeMergedModules().
+  void setCodeGenDebugOptions(const char *Opts);
+
+  /// Parse the options set in setCodeGenDebugOptions.
+  ///
+  /// Like \a setCodeGenDebugOptions(), this must be called before
+  /// LTOCodeGenerator::compilexxx() and
+  /// LTOCodeGenerator::writeMergedModules().
   void parseCodeGenDebugOptions();
 
-  // Write the merged module to the file specified by the given path.
-  // Return true on success.
-  bool writeMergedModules(const char *path, std::string &errMsg);
-
-  // Compile the merged module into a *single* object file; the path to object
-  // file is returned to the caller via argument "name". Return true on
-  // success.
-  //
-  // NOTE that it is up to the linker to remove the intermediate object file.
-  //  Do not try to remove the object file in LTOCodeGenerator's destructor
-  //  as we don't who (LTOCodeGenerator or the obj file) will last longer.
-  // 
-  bool compile_to_file(const char **name,
-                       bool disableOpt,
-                       bool disableInline,
-                       bool disableGVNLoadPRE,
-                       std::string &errMsg);
-
-  // As with compile_to_file(), this function compiles the merged module into
-  // single object file. Instead of returning the object-file-path to the caller
-  // (linker), it brings the object to a buffer, and return the buffer to the
-  // caller. This function should delete intermediate object file once its content
-  // is brought to memory. Return NULL if the compilation was not successful. 
-  //
-  const void *compile(size_t *length,
-                      bool disableOpt,
-                      bool disableInline,
-                      bool disableGVNLoadPRE,
-                      std::string &errMsg);
+  /// Write the merged module to the file specified by the given path.  Return
+  /// true on success.
+  bool writeMergedModules(const char *Path);
+
+  /// Compile the merged module into a *single* output file; the path to output
+  /// file is returned to the caller via argument "name". Return true on
+  /// success.
+  ///
+  /// \note It is up to the linker to remove the intermediate output file.  Do
+  /// not try to remove the object file in LTOCodeGenerator's destructor as we
+  /// don't who (LTOCodeGenerator or the output file) will last longer.
+  bool compile_to_file(const char **Name, bool DisableVerify,
+                       bool DisableInline, bool DisableGVNLoadPRE,
+                       bool DisableVectorization);
+
+  /// As with compile_to_file(), this function compiles the merged module into
+  /// single output file. Instead of returning the output file path to the
+  /// caller (linker), it brings the output to a buffer, and returns the buffer
+  /// to the caller. This function should delete the intermediate file once
+  /// its content is brought to memory. Return NULL if the compilation was not
+  /// successful.
+  std::unique_ptr<MemoryBuffer> compile(bool DisableVerify, bool DisableInline,
+                                        bool DisableGVNLoadPRE,
+                                        bool DisableVectorization);
+
+  /// Optimizes the merged module.  Returns true on success.
+  bool optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE,
+                bool DisableVectorization);
+
+  /// Compiles the merged optimized module into a single output file. It brings
+  /// the output to a buffer, and returns the buffer to the caller. Return NULL
+  /// if the compilation was not successful.
+  std::unique_ptr<MemoryBuffer> compileOptimized();
+
+  /// Compile the merged optimized module into out.size() output files each
+  /// representing a linkable partition of the module. If out contains more
+  /// than one element, code generation is done in parallel with out.size()
+  /// threads.  Output files will be written to members of out. Returns true on
+  /// success.
+  bool compileOptimized(ArrayRef<raw_pwrite_stream *> Out);
+
+  void setDiagnosticHandler(lto_diagnostic_handler_t, void *);
+
+  LLVMContext &getContext() { return Context; }
+
+  void resetMergedModule() { MergedModule.reset(); }
 
 private:
   void initializeLTOPasses();
 
-  bool generateObjectFile(llvm::raw_ostream &out,
-                          bool disableOpt,
-                          bool disableInline,
-                          bool disableGVNLoadPRE,
-                          std::string &errMsg);
+  bool compileOptimizedToFile(const char **Name);
   void applyScopeRestrictions();
-  void applyRestriction(llvm::GlobalValue &GV,
-                        const llvm::ArrayRef<llvm::StringRef> &Libcalls,
-                        std::vector<const char*> &MustPreserveList,
-                        llvm::SmallPtrSet<llvm::GlobalValue*, 8> &AsmUsed,
-                        llvm::Mangler &Mangler);
-  bool determineTarget(std::string &errMsg);
-
-  typedef llvm::StringMap<uint8_t> StringSet;
-
-  llvm::LLVMContext &Context;
-  llvm::Linker Linker;
-  llvm::TargetMachine *TargetMach;
-  bool EmitDwarfDebugInfo;
-  bool ScopeRestrictionsDone;
-  lto_codegen_model CodeModel;
+  void applyRestriction(GlobalValue &GV, ArrayRef<StringRef> Libcalls,
+                        std::vector<const char *> &MustPreserveList,
+                        SmallPtrSetImpl<GlobalValue *> &AsmUsed,
+                        Mangler &Mangler);
+  bool determineTarget();
+
+  static void DiagnosticHandler(const DiagnosticInfo &DI, void *Context);
+
+  void DiagnosticHandler2(const DiagnosticInfo &DI);
+
+  void emitError(const std::string &ErrMsg);
+
+  typedef StringMap<uint8_t> StringSet;
+
+  LLVMContext &Context;
+  std::unique_ptr<Module> MergedModule;
+  std::unique_ptr<Linker> TheLinker;
+  std::unique_ptr<TargetMachine> TargetMach;
+  bool EmitDwarfDebugInfo = false;
+  bool ScopeRestrictionsDone = false;
+  Reloc::Model RelocModel = Reloc::Default;
   StringSet MustPreserveSymbols;
   StringSet AsmUndefinedRefs;
-  llvm::MemoryBuffer *NativeObjectFile;
-  std::vector<char *> CodegenOptions;
+  std::vector<std::string> CodegenOptions;
+  std::string FeatureStr;
   std::string MCpu;
+  std::string MAttr;
   std::string NativeObjectPath;
-  llvm::TargetOptions Options;
+  TargetOptions Options;
+  CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default;
+  unsigned OptLevel = 2;
+  lto_diagnostic_handler_t DiagHandler = nullptr;
+  void *DiagContext = nullptr;
+  bool ShouldInternalize = true;
+  bool ShouldEmbedUselists = false;
+  TargetMachine::CodeGenFileType FileType = TargetMachine::CGFT_ObjectFile;
 };
-
-#endif // LTO_CODE_GENERATOR_H
+}
+#endif