[llvm] r239646 - Fix returning error message in LLVMLinkModules

Eli Bendersky eliben at google.com
Mon Jun 15 08:39:05 PDT 2015


Ah, OK - it was fixed by Benjamin Kramer in r239673



On Mon, Jun 15, 2015 at 8:33 AM, Eli Bendersky <eliben at google.com> wrote:

>
>
> On Sat, Jun 13, 2015 at 10:13 AM, Alexey Samsonov <vonosmas at gmail.com>
> wrote:
>
>> Looks like this change have caused (or triggered) a memory leak:
>>
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/7649/steps/check-llvm%20asan/logs/stdio
>>
>>
> Thanks, I'll take a look.
>
>
>> On Fri, Jun 12, 2015 at 4:26 PM, Eli Bendersky <eliben at google.com> wrote:
>> > Author: eliben
>> > Date: Fri Jun 12 18:26:42 2015
>> > New Revision: 239646
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=239646&view=rev
>> > Log:
>> > Fix returning error message in LLVMLinkModules
>> >
>> > On error, the temporary output stream wouldn't be flushed and therefore
>> the
>> > caller would see an empty error message.
>> >
>> > Patch by Antoine Pitrou
>> >
>> > Differential Revision: http://reviews.llvm.org/D10241
>> >
>> > Modified:
>> >     llvm/trunk/lib/Linker/LinkModules.cpp
>> >     llvm/trunk/unittests/Linker/LinkModulesTest.cpp
>> >
>> > Modified: llvm/trunk/lib/Linker/LinkModules.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=239646&r1=239645&r2=239646&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
>> > +++ llvm/trunk/lib/Linker/LinkModules.cpp Fri Jun 12 18:26:42 2015
>> > @@ -1802,7 +1802,9 @@ LLVMBool LLVMLinkModules(LLVMModuleRef D
>> >    LLVMBool Result = Linker::LinkModules(
>> >        D, unwrap(Src), [&](const DiagnosticInfo &DI) { DI.print(DP); });
>> >
>> > -  if (OutMessages && Result)
>> > +  if (OutMessages && Result) {
>> > +    Stream.flush();
>> >      *OutMessages = strdup(Message.c_str());
>> > +  }
>> >    return Result;
>> >  }
>> >
>> > Modified: llvm/trunk/unittests/Linker/LinkModulesTest.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Linker/LinkModulesTest.cpp?rev=239646&r1=239645&r2=239646&view=diff
>> >
>> ==============================================================================
>> > --- llvm/trunk/unittests/Linker/LinkModulesTest.cpp (original)
>> > +++ llvm/trunk/unittests/Linker/LinkModulesTest.cpp Fri Jun 12 18:26:42
>> 2015
>> > @@ -15,6 +15,7 @@
>> >  #include "llvm/IR/Module.h"
>> >  #include "llvm/Linker/Linker.h"
>> >  #include "llvm/Support/SourceMgr.h"
>> > +#include "llvm-c/Linker.h"
>> >  #include "gtest/gtest.h"
>> >
>> >  using namespace llvm;
>> > @@ -125,6 +126,22 @@ TEST_F(LinkModuleTest, BlockAddress) {
>> >    delete LinkedModule;
>> >  }
>> >
>> > +static Module *getExternal(LLVMContext &Ctx, StringRef FuncName) {
>> > +  // Create a module with an empty externally-linked function
>> > +  Module *M = new Module("ExternalModule", Ctx);
>> > +  FunctionType *FTy = FunctionType::get(
>> > +      Type::getVoidTy(Ctx), Type::getInt8PtrTy(Ctx), false
>> /*=isVarArgs*/);
>> > +
>> > +  Function *F =
>> > +      Function::Create(FTy, Function::ExternalLinkage, FuncName, M);
>> > +  F->setCallingConv(CallingConv::C);
>> > +
>> > +  BasicBlock *BB = BasicBlock::Create(Ctx, "", F);
>> > +  IRBuilder<> Builder(BB);
>> > +  Builder.CreateRetVoid();
>> > +  return M;
>> > +}
>> > +
>> >  static Module *getInternal(LLVMContext &Ctx) {
>> >    Module *InternalM = new Module("InternalModule", Ctx);
>> >    FunctionType *FTy = FunctionType::get(
>> > @@ -178,4 +195,27 @@ TEST_F(LinkModuleTest, TypeMerge) {
>> >              M1->getNamedGlobal("t2")->getType());
>> >  }
>> >
>> > +TEST_F(LinkModuleTest, CAPISuccess) {
>> > +  std::unique_ptr<Module> DestM(getExternal(Ctx, "foo"));
>> > +  std::unique_ptr<Module> SourceM(getExternal(Ctx, "bar"));
>> > +  char *errout = nullptr;
>> > +  LLVMBool result = LLVMLinkModules(wrap(DestM.get()),
>> wrap(SourceM.get()),
>> > +                                    LLVMLinkerDestroySource, &errout);
>> > +  EXPECT_EQ(0, result);
>> > +  EXPECT_EQ(nullptr, errout);
>> > +  // "bar" is present in destination module
>> > +  EXPECT_NE(nullptr, DestM->getFunction("bar"));
>> > +}
>> > +
>> > +TEST_F(LinkModuleTest, CAPIFailure) {
>> > +  // Symbol clash between two modules
>> > +  std::unique_ptr<Module> DestM(getExternal(Ctx, "foo"));
>> > +  std::unique_ptr<Module> SourceM(getExternal(Ctx, "foo"));
>> > +  char *errout = nullptr;
>> > +  LLVMBool result = LLVMLinkModules(wrap(DestM.get()),
>> wrap(SourceM.get()),
>> > +                                    LLVMLinkerDestroySource, &errout);
>> > +  EXPECT_EQ(1, result);
>> > +  EXPECT_STREQ("Linking globals named 'foo': symbol multiply
>> defined!", errout);
>> > +}
>> > +
>> >  } // end anonymous namespace
>> >
>> >
>> > _______________________________________________
>> > 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/20150615/2e8d97f9/attachment.html>


More information about the llvm-commits mailing list