[LLVMdev] How to handle size_t in front ends?

Chris Lattner sabre at nondot.org
Wed May 21 14:09:26 PDT 2008


On Wed, 21 May 2008, Talin wrote:
> On a related topic: The source-level debugging descriptors require you
> to know up front what the sizeof pointer types are. Is there any hope of
> the frontend remaining blissfully unaware of platform details?

I really don't know how to do this.  The current debug info stuff depends 
on emitting size info into the IR.  At this point, I don't think there is 
a good way around this.  Improvements to the design are welcome of course.

-Chris


>> Nice.
>>
>>
>>> However, where things get tricky is in calling C functions that take a
>>> size_t as a parameter. Since a size_t is the same size as a pointer,
>>> it
>>> may be either 32 or 64 bits depending on the target platform. All of a
>>> sudden, I can no longer generate 'target-neutral' IR, but instead must
>>> introduce into the front end knowledge about the target platform.
>>>
>>
>> Right, this is ugliness of C.  :(  Remember that even the size of int
>> (and certainly the size of long!) is target specific as well.  This
>> implies that you cannot generate truly portable interfaces to C code
>> if they take an int.
>>
>>
>>> So my questions are:
>>>
>>> 1) Is there a way to declare an integer type in the IR that represents
>>> "an int the same size as a pointer" without specifying exactly the
>>> size
>>> of a pointer?
>>>
>>
>> No.
>>
>>
>>> 2) Assuming the above answer is "no", what's the best way for the
>>> front
>>> end to measure the size of a pointer?
>>>
>>
>> It doesn't help for interfacing to C, but you can do things like this:
>> http://llvm.org/docs/tutorial/LangImpl8.html#offsetofsizeof
>>
>> If you want to generate a constant as a Value* in the IR.
>>
>> For emitting the right sized integer type, I'm afraid that your front-
>> end needs to know the size of the integer.
>>
>>
>> If you are willing to accept an ugly hack that works almost always on
>> common targets, you can just declare the size_t argument *as being a
>> pointer*, and use inttoptr to pass it.  This works because common ABIs
>> pass integers and pointers the same way.
>>
>> -Chris
>>
>> _______________________________________________
>> 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
>

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/



More information about the llvm-dev mailing list