[llvm] r230290 - [LTO API] add lto_codegen_set_module to set the destination module.

Alexey Samsonov vonosmas at gmail.com
Wed Feb 25 12:03:08 PST 2015


Hi Manman,

This commit introduces a memory leak, breaking ASan bootstrap:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/1878/steps/check-llvm%20asan/logs/stdio
Please investigate.

On Mon, Feb 23, 2015 at 4:45 PM, Manman Ren <manman.ren at gmail.com> wrote:

> Author: mren
> Date: Mon Feb 23 18:45:56 2015
> New Revision: 230290
>
> URL: http://llvm.org/viewvc/llvm-project?rev=230290&view=rev
> Log:
> [LTO API] add lto_codegen_set_module to set the destination module.
>
> When debugging LTO issues with ld64, we use -save-temps to save the merged
> optimized bitcode file, then invoke ld64 again on the single bitcode file
> to
> speed up debugging code generation passes and ld64 stuff after code
> generation.
>
> llvm linking a single bitcode file via lto_codegen_add_module will
> generate a
> different bitcode file from the single input. With the newly-added
> lto_codegen_set_module, we can make sure the destination module is the
> same as
> the input.
>
> lto_codegen_set_module will transfer the ownship of the module to code
> generator.
>
> rdar://19024554
>
> Added:
>     llvm/trunk/test/LTO/X86/set-merged.ll
> Modified:
>     llvm/trunk/include/llvm-c/lto.h
>     llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
>     llvm/trunk/include/llvm/Linker/Linker.h
>     llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
>     llvm/trunk/lib/Linker/LinkModules.cpp
>     llvm/trunk/tools/llvm-lto/llvm-lto.cpp
>     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=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm-c/lto.h (original)
> +++ llvm/trunk/include/llvm-c/lto.h Mon Feb 23 18:45:56 2015
> @@ -40,7 +40,7 @@ typedef bool lto_bool_t;
>   * @{
>   */
>
> -#define LTO_API_VERSION 12
> +#define LTO_API_VERSION 13
>
>  /**
>   * \since prior to LTO_API_VERSION=3
> @@ -396,6 +396,17 @@ extern lto_bool_t
>  lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod);
>
>  /**
> + * Sets the object module for code generation. This will transfer the
> ownship of
> + * the module to code generator.
> + *
> + * \c cg and \c mod must both be in the same context.
> + *
> + * \since prior to LTO_API_VERSION=13
> + */
> +extern void
> +lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod);
> +
> +/**
>   * Sets if debug info should be generated.
>   * Returns true on error (check lto_get_error_message() for details).
>   *
>
> Modified: llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h (original)
> +++ llvm/trunk/include/llvm/LTO/LTOCodeGenerator.h Mon Feb 23 18:45:56 2015
> @@ -67,6 +67,9 @@ struct LTOCodeGenerator {
>    // Merge given module, return true on success.
>    bool addModule(struct LTOModule *);
>
> +  // Set the destination module.
> +  void setModule(struct LTOModule *);
> +
>    void setTargetOptions(TargetOptions options);
>    void setDebugInfo(lto_debug_model);
>    void setCodePICModel(lto_codegen_model);
>
> Modified: llvm/trunk/include/llvm/Linker/Linker.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Linker/Linker.h?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Linker/Linker.h (original)
> +++ llvm/trunk/include/llvm/Linker/Linker.h Mon Feb 23 18:45:56 2015
> @@ -70,6 +70,9 @@ public:
>    /// Returns true on error.
>    bool linkInModule(Module *Src);
>
> +  /// \brief Set the composite to the passed-in module.
> +  void setModule(Module *Dst);
> +
>    static bool LinkModules(Module *Dest, Module *Src,
>                            DiagnosticHandlerFunction DiagnosticHandler);
>
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Mon Feb 23 18:45:56 2015
> @@ -141,6 +141,22 @@ bool LTOCodeGenerator::addModule(LTOModu
>    return !ret;
>  }
>
> +void LTOCodeGenerator::setModule(LTOModule *Mod) {
> +  assert(&Mod->getModule().getContext() == &Context &&
> +         "Expected module in same context");
> +
> +  // Delete the old merged module.
> +  if (IRLinker.getModule())
> +    IRLinker.deleteModule();
> +  AsmUndefinedRefs.clear();
> +
> +  IRLinker.setModule(&Mod->getModule());
> +
> +  const std::vector<const char*> &Undefs = Mod->getAsmUndefinedRefs();
> +  for (int I = 0, E = Undefs.size(); I != E; ++I)
> +    AsmUndefinedRefs[Undefs[I]] = 1;
> +}
> +
>  void LTOCodeGenerator::setTargetOptions(TargetOptions options) {
>    Options = options;
>  }
>
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Mon Feb 23 18:45:56 2015
> @@ -1748,6 +1748,10 @@ bool Linker::linkInModule(Module *Src) {
>    return RetCode;
>  }
>
> +void Linker::setModule(Module *Dst) {
> +  init(Dst, DiagnosticHandler);
> +}
> +
>
>  //===----------------------------------------------------------------------===//
>  // LinkModules entrypoint.
>
>  //===----------------------------------------------------------------------===//
>
> Added: llvm/trunk/test/LTO/X86/set-merged.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/LTO/X86/set-merged.ll?rev=230290&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/LTO/X86/set-merged.ll (added)
> +++ llvm/trunk/test/LTO/X86/set-merged.ll Mon Feb 23 18:45:56 2015
> @@ -0,0 +1,36 @@
> +; RUN: llvm-as < %s >%t1
> +; RUN: llvm-lto -exported-symbol=_main -set-merged-module -o %t2 %t1
> +; RUN: llvm-objdump -d %t2 | FileCheck %s
> +
> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-apple-macosx10.10.0"
> +
> +; CHECK: _main
> +; CHECK: movl $132
> +define i32 @_Z3fooi(i32 %a) {
> +entry:
> +  %a.addr = alloca i32, align 4
> +  store i32 %a, i32* %a.addr, align 4
> +  %0 = load i32* %a.addr, align 4
> +  %1 = load i32* %a.addr, align 4
> +  %call = call i32 @_Z4bar2i(i32 %1)
> +  %add = add nsw i32 %0, %call
> +  ret i32 %add
> +}
> +
> +define i32 @_Z4bar2i(i32 %a) {
> +entry:
> +  %a.addr = alloca i32, align 4
> +  store i32 %a, i32* %a.addr, align 4
> +  %0 = load i32* %a.addr, align 4
> +  %mul = mul nsw i32 2, %0
> +  ret i32 %mul
> +}
> +
> +define i32 @main() {
> +entry:
> +  %retval = alloca i32, align 4
> +  store i32 0, i32* %retval
> +  %call = call i32 @_Z3fooi(i32 44)
> +  ret i32 %call
> +}
>
> Modified: llvm/trunk/tools/llvm-lto/llvm-lto.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto/llvm-lto.cpp?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-lto/llvm-lto.cpp (original)
> +++ llvm/trunk/tools/llvm-lto/llvm-lto.cpp Mon Feb 23 18:45:56 2015
> @@ -69,6 +69,10 @@ static cl::opt<bool> ListSymbolsOnly(
>      "list-symbols-only", cl::init(false),
>      cl::desc("Instead of running LTO, list the symbols in each IR file"));
>
> +static cl::opt<bool> SetMergedModule(
> +    "set-merged-module", cl::init(false),
> +    cl::desc("Use the first input module as the merged module"));
> +
>  namespace {
>  struct ModuleInfo {
>    std::vector<bool> CanBeHidden;
> @@ -194,15 +198,22 @@ int main(int argc, char **argv) {
>        return 1;
>      }
>
> -    if (!CodeGen.addModule(Module.get()))
> +    LTOModule *LTOMod = Module.get();
> +
> +    // We use the first input module as the destination module when
> +    // SetMergedModule is true.
> +    if (SetMergedModule && i == BaseArg) {
> +      // Transfer ownership to the code generator.
> +      CodeGen.setModule(Module.release());
>

^^
This is false. LTOCodeGenerator::setModule does *not* take the ownership of
LTOModule - it
just leaks this object.



> +    } else if (!CodeGen.addModule(Module.get()))
>        return 1;
>
> -    unsigned NumSyms = Module->getSymbolCount();
> +    unsigned NumSyms = LTOMod->getSymbolCount();
>      for (unsigned I = 0; I < NumSyms; ++I) {
> -      StringRef Name = Module->getSymbolName(I);
> +      StringRef Name = LTOMod->getSymbolName(I);
>        if (!DSOSymbolsSet.count(Name))
>          continue;
> -      lto_symbol_attributes Attrs = Module->getSymbolAttributes(I);
> +      lto_symbol_attributes Attrs = LTOMod->getSymbolAttributes(I);
>        unsigned Scope = Attrs & LTO_SYMBOL_SCOPE_MASK;
>        if (Scope != LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN)
>          KeptDSOSyms.push_back(Name);
>
> Modified: llvm/trunk/tools/lto/lto.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.cpp?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.cpp (original)
> +++ llvm/trunk/tools/lto/lto.cpp Mon Feb 23 18:45:56 2015
> @@ -248,6 +248,10 @@ bool lto_codegen_add_module(lto_code_gen
>    return !unwrap(cg)->addModule(unwrap(mod));
>  }
>
> +void lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod) {
> +  unwrap(cg)->setModule(unwrap(mod));
> +}
> +
>  bool lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model
> debug) {
>    unwrap(cg)->setDebugInfo(debug);
>    return false;
>
> Modified: llvm/trunk/tools/lto/lto.exports
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/lto/lto.exports?rev=230290&r1=230289&r2=230290&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/lto/lto.exports (original)
> +++ llvm/trunk/tools/lto/lto.exports Mon Feb 23 18:45:56 2015
> @@ -25,6 +25,7 @@ lto_module_dispose
>  lto_api_version
>  lto_codegen_set_diagnostic_handler
>  lto_codegen_add_module
> +lto_codegen_set_module
>  lto_codegen_add_must_preserve_symbol
>  lto_codegen_compile
>  lto_codegen_create
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150225/b4ce3a04/attachment.html>


More information about the llvm-commits mailing list