As an update, here is the current piece of code:
Inside a loop iterating over each basic block :
*std::vector<Value*> values;
values.resize(cnt);
//std::vector<Value*> values(sizeof(Value*)*cnt);
//SmallVector<Value*,cnt> values;
if(is)
{
LLVMContext& C = is->getContext();
errs()<<"\ni: \n";
for(i=0;i<cnt;i++){
values[i]=ConstantInt::getSigned(Type::getInt64Ty(C),myArray[i]);
errs()<<" "<<myArray[i];
}
is->setMetadata("path",MDNode::get(C,values));
errs()<<"\nmodif instr
"<<*is<<"\n";
if( (is->getMetadata("path")) ){
for(i=0;i<cnt;i++){
if(is->getMetadata("path")->getOperand(i)) {
errs()<<"\nget isntr
"<<*(is->getMetadata("path")->getOperand(i))<<"\n";
}
}
}
}
values.clear();*
I receive a memory corruption error at some basic blocks. Here are the
debug outputs:
1. opt - *opt: malloc.c:3801: _int_malloc: Assertion `(unsigned
long)(size)>= (unsigned long)(nb)' failed.*
2. gdb -
*Program received signal SIGABRT, Aborted.
0xb7fdd424 in __kernel_vsyscall ()*
3. valgrind - it executes all the code and at the problematic loop
iteration I have :
*==5134== Invalid write of size 4
==5134== at 0x4039280: (anonymous
namespace)::Hello::runOnModule(llvm::Module&) (in
/home/alex/llvm/Release+Asserts/lib/Hello.so)
==5134== by 0x8E33DE3: llvm::MPPassManager::runOnModule(llvm::Module&)
(in /home/alex/llvm/Release+Asserts/bin/opt)
==5134== by 0x8E3726F: llvm::PassManagerImpl::run(llvm::Module&) (in
/home/alex/llvm/Release+Asserts/bin/opt)
==5134== by 0x8E37385: llvm::PassManager::run(llvm::Module&) (in
/home/alex/llvm/Release+Asserts/bin/opt)
==5134== by 0x41AE4D2: (below main) (libc-start.c:226)
==5134== Address 0x46cfa40 is 0 bytes after a block of size 200 alloc'd
==5134== at 0x402C454: operator new[](unsigned int) (in
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5134== by 0x4037AE0: (anonymous
namespace)::Hello::runOnModule(llvm::Module&) (in
/home/alex/llvm/Release+Asserts/lib/Hello.so)*
and repeating.
*==5230== HEAP SUMMARY:
==5230== in use at exit: 95,110 bytes in 317 blocks
==5230== total heap usage: 33,395 allocs, 33,078 frees, 4,484,753 bytes
allocated
==5230===5230== LEAK SUMMARY:
==5230== definitely lost: 7,732 bytes in 31 blocks
==5230== indirectly lost: 85,864 bytes in 275 blocks
==5230== possibly lost: 0 bytes in 0 blocks
==5230== still reachable: 1,514 bytes in 11 blocks
==5230== suppressed: 0 bytes in 0 blocks
==5230== Rerun with --leak-check=full to see details of leaked memory
==5230===5230== For counts of detected and suppressed errors, rerun with: -v
==5230== ERROR SUMMARY: 16432 errors from 15 contexts (suppressed: 0 from 0)
*
I assume the main problems are:
1. I don't allocate well memory for values. Or maybe I am allocating only
for Value* pointers, not for the actual values. Maybe I don't free the mem.
2. I cannot use array instead of vector, since *
is->setMetadata("path",MDNode::get(C,values));* won't let me.
What do you think it is wrong? What should I try? I want only to attach
some integers as metadata, one integer per operand.
Thank you !
On Wed, May 29, 2013 at 10:00 AM, Alexandru Ionut Diaconescu <
alexandruionutdiaconescu at gmail.com> wrote:
> Hello Duncan,
>
> Yes, I built it with assertions and I have also debug info.
>
>
> On Tue, May 28, 2013 at 5:47 PM, Duncan Sands <baldrick at free.fr>
wrote:
>
>> Hi Alexandru, did you build LLVM with assertions enabled? If not then
you
>> should do.
>>
>> Ciao, Duncan.
>>
>> ______________________________**_________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>
http://lists.cs.uiuc.edu/**mailman/listinfo/llvmdev<http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>>
>
>
>
> --
> Best regards,
> Alexandru Ionut Diaconescu
>
--
Best regards,
Alexandru Ionut Diaconescu
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20130530/bdb723c5/attachment.html>
Hi Alexandru, > /*==5134== Invalid write of size 4> ==5134== at 0x4039280: (anonymous > namespace)::Hello::runOnModule(llvm::Module&) (in > /home/alex/llvm/Release+Asserts/lib/Hello.so) > ==5134== by 0x8E33DE3: llvm::MPPassManager::runOnModule(llvm::Module&) (in > /home/alex/llvm/Release+Asserts/bin/opt) > ==5134== by 0x8E3726F: llvm::PassManagerImpl::run(llvm::Module&) (in > /home/alex/llvm/Release+Asserts/bin/opt) > ==5134== by 0x8E37385: llvm::PassManager::run(llvm::Module&) (in > /home/alex/llvm/Release+Asserts/bin/opt) > ==5134== by 0x41AE4D2: (below main) (libc-start.c:226) > ==5134== Address 0x46cfa40 is 0 bytes after a block of size 200 alloc'd > ==5134== at 0x402C454: operator new[](unsigned int) (in > /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) > ==5134== by 0x4037AE0: (anonymous > namespace)::Hello::runOnModule(llvm::Module&) (in > /home/alex/llvm/Release+Asserts/lib/Hello.so)*/ > ==5134== Address 0x46cfa40 is 0 bytes after a block of size 200 alloc'd > ==5134== at 0x402C454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) > ==5134== by 0x4037AE0: (anonymous namespace)::Hello::runOnModule(llvm::Module&) (in /home/alex/llvm/Release+Asserts/lib/Hello.so)you are writing of the end of an array that you allocated with "new". If you compile your program with debug info (-g) then valgrind should give you the line number at which the allocation occurred and the line number at which the bad write occurred. Ciao, Duncan.
Hello Duncan, Thank you for your quick answer. I use the standard Makefile from a pass, that is calling Makefile.common. I saw only the make -d option, that "*print lots of debugging information*", as mentioned by LLVM. Using this, valgrind don't tell me extra info. It is a very good idea ti use -g, but where to insert? If I am trying to use clang++, I have to fix a lot of things. Should I make the changes for to use clang++ or I can debug using the Makefile.common? On Thu, May 30, 2013 at 1:57 PM, Duncan Sands <baldrick at free.fr> wrote:> Hi Alexandru, > > > /*==5134== Invalid write of size 4 > >> ==5134== at 0x4039280: (anonymous >> namespace)::Hello::**runOnModule(llvm::Module&) (in >> /home/alex/llvm/Release+**Asserts/lib/Hello.so) >> ==5134== by 0x8E33DE3: llvm::MPPassManager::**runOnModule(llvm::Module&) >> (in >> /home/alex/llvm/Release+**Asserts/bin/opt) >> ==5134== by 0x8E3726F: llvm::PassManagerImpl::run(**llvm::Module&) (in >> /home/alex/llvm/Release+**Asserts/bin/opt) >> ==5134== by 0x8E37385: llvm::PassManager::run(llvm::**Module&) (in >> /home/alex/llvm/Release+**Asserts/bin/opt) >> ==5134== by 0x41AE4D2: (below main) (libc-start.c:226) >> ==5134== Address 0x46cfa40 is 0 bytes after a block of size 200 alloc'd >> ==5134== at 0x402C454: operator new[](unsigned int) (in >> /usr/lib/valgrind/vgpreload_**memcheck-x86-linux.so) >> ==5134== by 0x4037AE0: (anonymous >> namespace)::Hello::**runOnModule(llvm::Module&) (in >> /home/alex/llvm/Release+**Asserts/lib/Hello.so)*/ >> >> ==5134== Address 0x46cfa40 is 0 bytes after a block of size 200 alloc'd >> ==5134== at 0x402C454: operator new[](unsigned int) (in >> /usr/lib/valgrind/vgpreload_**memcheck-x86-linux.so) >> ==5134== by 0x4037AE0: (anonymous namespace)::Hello::**runOnModule(llvm::Module&) >> (in /home/alex/llvm/Release+**Asserts/lib/Hello.so) >> > > you are writing of the end of an array that you allocated with "new". If > you > compile your program with debug info (-g) then valgrind should give you > the line > number at which the allocation occurred and the line number at which the > bad > write occurred. > > Ciao, Duncan. > >-- Best regards, Alexandru Ionut Diaconescu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130530/fa7e8ca4/attachment.html>