[llvm] r189297 - Add new API lto_codegen_compile_parallel().

Eric Christopher echristo at gmail.com
Mon Aug 26 17:24:11 PDT 2013


Not sure why this is a good idea? What usefulness does this have
outside of your partitioning scheme?

-eric

On Mon, Aug 26, 2013 at 5:03 PM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Author: shuxin_yang
> Date: Mon Aug 26 19:03:23 2013
> New Revision: 189297
>
> URL: http://llvm.org/viewvc/llvm-project?rev=189297&view=rev
> Log:
>   Add new API lto_codegen_compile_parallel().
>
>   This API is proposed by Nick Kledzik. The semantic is:
>
>   --------------------------------------------------------------------------
>    Generate code for merged module into an array of native object files. On
>    success returns a pointer to an array of NativeObjectFile.  The count
>    parameter returns the number of elements in the array.  Each element is
>    a pointer/length for a generated mach-o/ELF buffer.  The buffer is owned
>    by the lto_code_gen_t and will be freed when lto_codegen_dispose() is called,
>    or lto_codegen_compile() is called again. On failure, returns NULL
>    (check lto_get_error_message() for details).
>
>    extern const struct  NativeObjectFile*
>    lto_codegen_compile_parallel(lto_code_gen_t cg, size_t *count);
>   ---------------------------------------------------------------------------
>
>   This API is currently only called on OSX platform. Linux or other Unixes
> using GNU gold are not supposed to call this function, because on these systems,
> object files are fed back to linker via disk file instead of memory buffer.
>
>   In this commit, lto_codegen_compile_parallel() simply calls
> lto_codegen_compile() to return a single object file. In the near future,
> this function is the entry point for compilation with partition. Linker can
> blindly call this function even if partition is turned off; in this case,
> compiler will return only one object file.
>
> Modified:
>     llvm/trunk/include/llvm-c/lto.h
>     llvm/trunk/tools/lto/LTOCodeGenerator.cpp
>     llvm/trunk/tools/lto/LTOCodeGenerator.h
>     llvm/trunk/tools/lto/lto.cpp
>     llvm/trunk/tools/lto/lto.exports
>
> Modified: llvm/trunk/include/llvm-c/lto.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/lto.h?rev=189297&r1=189296&r2=189297&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm-c/lto.h (original)
> +++ llvm/trunk/include/llvm-c/lto.h Mon Aug 26 19:03:23 2013
> @@ -27,7 +27,7 @@
>   * @{
>   */
>
> -#define LTO_API_VERSION 4
> +#define LTO_API_VERSION 5
>
>  typedef enum {
>      LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F, /* log2 of alignment */
> @@ -284,6 +284,22 @@ lto_codegen_compile(lto_code_gen_t cg, s
>  extern bool
>  lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name);
>
> +struct NativeObjectFile {
> +  const void *content;
> +  size_t length;
> +};
> +
> +/**
> + * Generates code for merged module into an array of native object files.
> + * On success returns a pointer to an array of NativeObjectFile.  The
> + * count parameter returns the number of elements in the array.  Each
> + * element is a pointer/length for a generated mach-o/ELF buffer. The
> + * buffer is owned by the lto_code_gen_t and will be freed when
> + * lto_codegen_dispose() is called, or lto_codegen_compile() is called again.
> + * On failure, returns NULL (check lto_get_error_message() for details).
> + */
> +extern const struct NativeObjectFile*
> +lto_codegen_compile_parallel(lto_code_gen_t cg, size_t *count);
>
>  /**
>   * Sets options to help debug codegen bugs.
>
> Modified: llvm/trunk/tools/lto/LTOCodeGenerator.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.cpp?rev=189297&r1=189296&r2=189297&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/tools/lto/LTOCodeGenerator.cpp Mon Aug 26 19:03:23 2013
> @@ -74,7 +74,7 @@ LTOCodeGenerator::LTOCodeGenerator()
>      _linker(new Module("ld-temp.o", _context)), _target(NULL),
>      _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false),
>      _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC),
> -    _nativeObjectFile(NULL) {
> +    _nativeObjectFile(NULL), ObjBufVect(0) {
>    InitializeAllTargets();
>    InitializeAllTargetMCs();
>    InitializeAllAsmPrinters();
> @@ -85,6 +85,7 @@ LTOCodeGenerator::~LTOCodeGenerator() {
>    delete _target;
>    delete _nativeObjectFile;
>    delete _linker.getModule();
> +  delete[] ObjBufVect;
>
>    for (std::vector<char*>::iterator I = _codegenOptions.begin(),
>           E = _codegenOptions.end(); I != E; ++I)
> @@ -246,6 +247,23 @@ const void* LTOCodeGenerator::compile(si
>    return _nativeObjectFile->getBufferStart();
>  }
>
> +// Currently compile() and compile_parallel() have no difference.
> +NativeObjectFile *LTOCodeGenerator::compile_parallel(size_t *count,
> +                                                     std::string &ErrMsg) {
> +  assert(ObjBufVect == 0 && "Should be NULL");
> +
> +  size_t Len;
> +  const void *Buf = compile(&Len, ErrMsg);
> +  if (!Buf)
> +    return 0;
> +
> +  *count = 1;
> +  ObjBufVect = new NativeObjectFile[1];
> +  ObjBufVect[0].content = Buf;
> +  ObjBufVect[0].length = Len;
> +  return ObjBufVect;
> +}
> +
>  bool LTOCodeGenerator::determineTarget(std::string &errMsg) {
>    if (_target != NULL)
>      return true;
>
> Modified: llvm/trunk/tools/lto/LTOCodeGenerator.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/LTOCodeGenerator.h?rev=189297&r1=189296&r2=189297&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/LTOCodeGenerator.h (original)
> +++ llvm/trunk/tools/lto/LTOCodeGenerator.h Mon Aug 26 19:03:23 2013
> @@ -102,6 +102,17 @@ struct LTOCodeGenerator {
>    //
>    const void *compile(size_t *length, std::string &errMsg);
>
> +  // Corresponding to lto_codegen_compile_parallel() API.
> +  // Generates code for merged module into an array of native object files.
> +  // On success returns a pointer to an array of NativeObjectFile.  The count
> +  // parameter returns the number of elements in the array.  Each element is
> +  // a pointer/length for a generated mach-o/ELF buffer. The buffer is owned
> +  // by the lto_code_gen_t and will be freed when lto_codegen_dispose() is
> +  // called, or lto_codegen_compile() is called again. On failure, returns
> +  // NULL (check lto_get_error_message() for details).
> +  //
> +  NativeObjectFile *compile_parallel(size_t *count, std::string &ErrMsg);
> +
>  private:
>    void initializeLTOPasses();
>
> @@ -127,6 +138,7 @@ private:
>    std::vector<char*>          _codegenOptions;
>    std::string                 _mCpu;
>    std::string                 _nativeObjectPath;
> +  NativeObjectFile *ObjBufVect;
>  };
>
>  #endif // LTO_CODE_GENERATOR_H
>
> Modified: llvm/trunk/tools/lto/lto.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=189297&r1=189296&r2=189297&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.cpp (original)
> +++ llvm/trunk/tools/lto/lto.cpp Mon Aug 26 19:03:23 2013
> @@ -207,6 +207,11 @@ bool lto_codegen_compile_to_file(lto_cod
>    return !cg->compile_to_file(name, sLastErrorString);
>  }
>
> +extern const struct NativeObjectFile *
> +lto_codegen_compile_parallel(lto_code_gen_t cg, size_t *count) {
> +  return cg->compile_parallel(count, sLastErrorString);
> +}
> +
>  /// lto_codegen_debug_options - Used to pass extra options to the code
>  /// generator.
>  void lto_codegen_debug_options(lto_code_gen_t cg, const char *opt) {
>
> Modified: llvm/trunk/tools/lto/lto.exports
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.exports?rev=189297&r1=189296&r2=189297&view=diff
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.exports (original)
> +++ llvm/trunk/tools/lto/lto.exports Mon Aug 26 19:03:23 2013
> @@ -28,6 +28,7 @@ lto_codegen_set_assembler_args
>  lto_codegen_set_assembler_path
>  lto_codegen_set_cpu
>  lto_codegen_compile_to_file
> +lto_codegen_compile_parallel
>  LLVMCreateDisasm
>  LLVMCreateDisasmCPU
>  LLVMDisasmDispose
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list