[LLVMdev] unexpectedly loop hanging

Matthieu Brucher matthieu.brucher at gmail.com
Tue May 28 08:02:16 PDT 2013


Hi,

I don't know much about this issue, but this malloc error won't be solved
by a change to delete[] or free. In fact, if you use the incorrect one for
simple types, you may not notice it. The error you have seems to me like a
memory corruption because you went out of bound and corrupted the memory
somewhere, Valgrind may help you figure out what is going on.

Cheers,

Matthieu


2013/5/28 Alexandru Ionut Diaconescu <alexandruionutdiaconescu at gmail.com>

> As an update, it is a memory problem which I don't know how to fix.
>
> I tried to skip the problematic piece of code when in the case when the
> loop hangs. So I did something like :
>
>           if( instr )
>           {
>             LLVMContext& C = instr->getContext();
>
>
>               Value* values[cnt];
>               errs()<<"\ngy: \n";
>
>           if(!(desters==7)){    // this is the condition I put to skip the
> case when it hanged
>
>
>               for(int gy=0;gy<cnt;gy++){
>
> values[gy]=ConstantInt::getSigned(Type::getInt64Ty(C),cebag[gy]);
>                 errs()<<" "<<gy;
>               }
>
>              SmallVector<Value*, 100> bla;
>
>              for(int gy=0;gy<cnt;gy++){
>               bla.push_back(values[gy]);
>               }
>
>             instr->setMetadata("path",MDNode::get(C,bla));
>
>
>                 if( (instr->getMetadata("path")) ){
>                   for(int gy=0;gy<cnt;gy++){
>                       if(instr->getMetadata("path")->getOperand(gy)) {
>                     errs()<<"\n
> "<<*(is->getMetadata("path")->getOperand(gy))<<"\n";
>
>                   }
>                  }
>                 }
>
>             } // closing bracket for the extra condition that I put
>
>           }
>
>
> From the terminal output, I see that the problematic case is skipped, but
> then it was printed:
>
> ---------------------------PROCEED TO NEXT
> BB------------------------------------
> opt: malloc.c:3790: _int_malloc: Assertion `(unsigned long)(size) >=
> (unsigned long)(nb)' failed.
>
> So I thought that the problem is regarding memory freeing. I was trying to
> free the memory for arrays like values or bla, using delete [] name and
> even free(), but I am getting segfault.
>
> I think it is some basic stuff that I miss.
>
>
> Thank you for any suggestion !
>
>
>
> On Tue, May 28, 2013 at 10:02 AM, Alexandru Ionut Diaconescu <
> alexandruionutdiaconescu at gmail.com> wrote:
>
>> Hello everyone,
>>
>> I was able to get all the execution paths between 2 points (basic blocks)
>> in my program (with the condition to traverse a loop only once). I mapped
>> all the basic blocks to integers and created a correspondent directed graph.
>>
>> I was able to get all the paths (a path is represented by an integer
>> identifier). For my target program I have 72 paths, but the program hangs
>> unexpectedly at a for loop when I am adding metadata (which is containing
>> the paths). This part of code was working perfectly before of changing the
>> algorithm to traverse the loop only once. However, the traverse algorithm
>> should be totally independent to the part of the code where I add metadata.
>> The single influence that I see is that I have to add more metadata
>> operands to instructions. I mention that for each metadata operand I add a
>> path = an integer identifier. When this was working, I used to add up to 17
>> metadata operands, now I have up to 72.
>>
>> How do I add metadata: Inside a* *loop iterating through basic blocks,
>> for each basic block I take a particular instruction on which I want to
>> attach the metadata (a path = an integer identifier). I do like this :
>>
>> if( instruc )
>> {
>> LLVMContext& C = instruc->getContext();
>>
>>              Value* values[cnt];
>>              errs()<<"\ngy: \n";
>>               for(int gy=0;gy<cnt;gy++)
>>               {
>>
>> values[gy]=ConstantInt::getSigned(Type::getInt64Ty(C),myarray[gy]);
>>                 errs()<<" "<<gy;
>>                }
>> }
>>
>> 1. I checked before this part of the code the values of myarray and they
>> are good
>> 2. It works well for the first 6 instructions (the maximum number of
>> metadata operands they need is 70), but when I get to the 7th instruction
>> to add metadata (with 72 operands), I hangs inside the for loop from above,
>> having :
>>
>> gy:
>>  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
>>
>> and it hangs. Before this part of the code I print myarray[gy] and it it
>> prints all the values from 0 to 71 (the basic block is contained in all
>> possible execution paths).
>>
>> What do you think is the problem? Some memory allocation (I have
>> sufficient allocated), maybe I cannot add so many metadata operands?
>>
>> Thank you for any suggestion !
>>
>>
>>
>>
>>
>>
>
>
> --
> Best regards,
> Alexandru Ionut Diaconescu
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>


-- 
Information System Engineer, Ph.D.
Blog: http://matt.eifelle.com
LinkedIn: http://www.linkedin.com/in/matthieubrucher
Music band: http://liliejay.com/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130528/aabaf601/attachment.html>


More information about the llvm-dev mailing list