[LLVMdev] LLI Segfaulting

Gavin Harrison gavin.har at gmail.com
Mon Mar 12 12:02:46 PDT 2012


One way to find out how to do these sorts of things is to write them in C or C++ and see what clang does :)

In C you would do something like this:

a = malloc(sizeof(int) * n);

The associated LLVM IR would look similar to this:

%a = alloca i32* ; %a's type is i32**
%n = alloca i32
...
%1 = load i32 %n
%2 = sext i32 %1 to i64
%3 = mul i64 4, %2
%4 = call i8 * @malloc(i64 %2)
%5 = bitcast i8* %4 to i32*
store i32* %5, i32** %a

Thanks,
Gavin

On Mar 12, 2012, at 2:43 PM, Fraser Cormack wrote:

> 
> Sorry for my ignorance, but I'm unaware as to how I'd achieve this.
> 
> I know I'd have this,
> 
> %MainClass = type { { i32, i32* } }
> 
> And something along these lines:
> 
> %1 = getelementptr inbounds %MainClass* %0, i32 0, i32 0    ; get to the
> 'array'
> %2 = getelementptr inbounds { i32, i32* }* %1, i32 0, i32 1    ; index the
> data pointer
> 
> And then I'd want to:
> 
> alloca i32, i64 5
> 
> But I don't understand how I'd associate this allocation with the existing
> integer 'array' pointer. Also,  what would happen when the function returns,
> wouldn't the new array allocation portion go out of scope, as it's allocated
> on the function's stack frame?
> 
> Thanks,
> Fraser
> 
> 
> 
> Gavin Harrison-2 wrote:
>> 
>> Yes, that is what I mean. :-)
>> On Mar 12, 2012 11:02 AM, "Fraser Cormack" <frasercrmck at gmail.com> wrote:
>> 
>>> 
>>> Hi Gavin,
>>> 
>>> Do you mean something along the lines of having my array struct as { i32,
>>> i32* } and then indexing it with a gep and allocating the appropriate
>>> memory
>>> when I learn of it?
>>> 
>>> Thanks,
>>> Fraser
>>> 
>>> 
>>> Gavin Harrison-2 wrote:
>>>> 
>>>> Hi Fraser,
>>>> 
>>>> Is there anything preventing you from using a pointer for the second
>>> part
>>>> of the structure and allocating memory for it later?
>>>> 
>>>> Thanks,
>>>> Gavin
>>>> 
>>>> On Mar 12, 2012, at 10:35 AM, Fraser Cormack wrote:
>>>> 
>>>>> 
>>>>> 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.
>>>>> 
>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>> 
>>>> 
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>> 
>>>> 
>>> 
>>> --
>>> View this message in context:
>>> http://old.nabble.com/LLI-Segfaulting-tp33486161p33487147.html
>>> Sent from the LLVM - Dev mailing list archive at Nabble.com.
>>> 
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>> 
>> 
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>> 
>> 
> -- 
> View this message in context: http://old.nabble.com/LLI-Segfaulting-tp33486161p33489084.html
> Sent from the LLVM - Dev mailing list archive at Nabble.com.
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list