[llvm] r230290 - [LTO API] add lto_codegen_set_module to set the destination module.
Manman Ren
mren at apple.com
Wed Feb 25 13:05:12 PST 2015
Sorry about the breakage.
The Module itself was destroyed by LTOCodeGenerator, but not the LTOModule. I am working on a fix.
Thanks,
Manman
> On Feb 25, 2015, at 12:03 PM, Alexey Samsonov <vonosmas at gmail.com> wrote:
>
> 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 <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 <mailto: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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <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 <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>
>
>
> --
> Alexey Samsonov
> vonosmas at gmail.com <mailto:vonosmas at gmail.com>_______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150225/163abe97/attachment.html>
More information about the llvm-commits
mailing list