[LLVMdev] LLI Segfaulting

Fraser Cormack frasercrmck at gmail.com
Mon Mar 12 07:35:59 PDT 2012


Hi Duncan,


Duncan Sands wrote:
> 
> Hi Fraser, it looks to me like you are smashing the stack.
> 
>> define void @main() nounwind {
>> allocas:
>>    %0 = alloca { i32, [0 x i32] }, align 8
> 
> ^ this allocates 4 bytes on the stack.
> 
>>    %2 = getelementptr inbounds { i32, [0 x i32] }* %0, i64 0, i32 1
> 
> ^ this gets a pointer to the byte after the 4 allocated bytes.
> 
>>    %3 = bitcast [0 x i32]* %2 to i8*
>>    call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* bitcast ([5 x i32]*
>> @.gvar_array to i8*), i64 20, i32 4, i1 false)
> 
> This copies 20 bytes there, kaboom!
> 

Such a painfully obvious answer, thank you! I'm assuming this is what
happens when I use the unoptimized version of the code and call

>    %0 = alloca %MainClass

then transfer the array into that. If I'm taking a MainClass pointer into my
<init> function, can I then just re-allocate it as a { i32, [5 x i32] } when
I learn about the length? That doesn't sound like the nicest option. I'm not
aware of a way of only allocating a part of a literal struct, is that
possible?

Cheers,
Fraser
-- 
View this message in context: http://old.nabble.com/LLI-Segfaulting-tp33486161p33486962.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.




More information about the llvm-dev mailing list