diff options
Diffstat (limited to 'include/llvm/LTO/LTOCodeGenerator.h')
-rw-r--r-- | include/llvm/LTO/LTOCodeGenerator.h | 153 |
1 files changed, 84 insertions, 69 deletions
diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 0c46fc048a43..3820b211a381 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -39,7 +39,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringMap.h" -#include "llvm/Linker/Linker.h" +#include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include <string> #include <vector> @@ -48,6 +48,7 @@ namespace llvm { class LLVMContext; class DiagnosticInfo; class GlobalValue; + class Linker; class Mangler; class MemoryBuffer; class TargetLibraryInfo; @@ -61,121 +62,135 @@ namespace llvm { struct LTOCodeGenerator { static const char *getVersionString(); - LTOCodeGenerator(); - LTOCodeGenerator(std::unique_ptr<LLVMContext> Context); + LTOCodeGenerator(LLVMContext &Context); ~LTOCodeGenerator(); - // Merge given module, return true on success. + /// Merge given module. Return true on success. bool addModule(struct LTOModule *); - // Set the destination module. - void setModule(struct LTOModule *); + /// Set the destination module. + void setModule(std::unique_ptr<LTOModule> M); - void setTargetOptions(TargetOptions options); + void setTargetOptions(TargetOptions Options); void setDebugInfo(lto_debug_model); - void setCodePICModel(lto_codegen_model); + void setCodePICModel(Reloc::Model Model) { RelocModel = Model; } + + /// 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) { MCpu = mCpu; } - void setAttr(const char *mAttr) { MAttr = mAttr; } - void setOptLevel(unsigned optLevel) { OptLevel = optLevel; } + 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; } - - // 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); - - // Parse the options set in setCodeGenDebugOptions. Like - // setCodeGenDebugOptions, this must be called before - // LTOCodeGenerator::compilexxx() and LTOCodeGenerator::writeMergedModules() + 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 disableInline, - bool disableGVNLoadPRE, - bool disableVectorization, - 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. - std::unique_ptr<MemoryBuffer> compile(bool disableInline, - bool disableGVNLoadPRE, - bool disableVectorization, - std::string &errMsg); - - // Optimizes the merged module. Returns true on success. - bool optimize(bool disableInline, - bool disableGVNLoadPRE, - bool disableVectorization, - std::string &errMsg); - - // Compiles the merged optimized module into a single object file. It brings - // the object to a buffer, and returns the buffer to the caller. Return NULL - // if the compilation was not successful. - std::unique_ptr<MemoryBuffer> compileOptimized(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 compileOptimized(raw_pwrite_stream &out, std::string &errMsg); - bool compileOptimizedToFile(const char **name, std::string &errMsg); + bool compileOptimizedToFile(const char **Name); void applyScopeRestrictions(); void applyRestriction(GlobalValue &GV, ArrayRef<StringRef> Libcalls, std::vector<const char *> &MustPreserveList, SmallPtrSetImpl<GlobalValue *> &AsmUsed, Mangler &Mangler); - bool determineTarget(std::string &errMsg); + 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; - void destroyMergedModule(); - std::unique_ptr<LLVMContext> OwnedContext; LLVMContext &Context; - Linker IRLinker; - TargetMachine *TargetMach = nullptr; + std::unique_ptr<Module> MergedModule; + std::unique_ptr<Linker> TheLinker; + std::unique_ptr<TargetMachine> TargetMach; bool EmitDwarfDebugInfo = false; bool ScopeRestrictionsDone = false; - lto_codegen_model CodeModel = LTO_CODEGEN_PIC_MODEL_DEFAULT; + Reloc::Model RelocModel = Reloc::Default; StringSet MustPreserveSymbols; StringSet AsmUndefinedRefs; - std::vector<char *> CodegenOptions; + std::vector<std::string> CodegenOptions; + std::string FeatureStr; std::string MCpu; std::string MAttr; std::string NativeObjectPath; TargetOptions Options; + CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default; unsigned OptLevel = 2; lto_diagnostic_handler_t DiagHandler = nullptr; void *DiagContext = nullptr; - LTOModule *OwnedModule = nullptr; bool ShouldInternalize = true; bool ShouldEmbedUselists = false; + TargetMachine::CodeGenFileType FileType = TargetMachine::CGFT_ObjectFile; }; } #endif |