[LLVMdev] Is address space 1 reserved?
Philip Reames
listmail at philipreames.com
Wed Jan 7 12:25:44 PST 2015
On 01/07/2015 12:22 PM, Matt Arsenault wrote:
>
>> On Jan 7, 2015, at 3:10 PM, Philip Reames <listmail at philipreames.com
>> <mailto:listmail at philipreames.com>> wrote:
>>
>>
>> On 01/07/2015 12:05 PM, Matt Arsenault wrote:
>>>
>>>> On Jan 7, 2015, at 2:55 PM, Philip Reames
>>>> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>>>
>>>>
>>>> On 01/07/2015 11:52 AM, Matt Arsenault wrote:
>>>>>
>>>>>> On Jan 7, 2015, at 2:25 PM, Owen Anderson <resistor at mac.com
>>>>>> <mailto:resistor at mac.com>> wrote:
>>>>>>
>>>>>> I'm not aware of any such restriction, and I know of several LLVM
>>>>>> based systems that use address space 1 for something other than that.
>>>>>>
>>>>>> -Owen
>>>>>
>>>>> Yes, this would be a problem for us. We use 1 for a normal address
>>>>> space where 0 is invalid. However, we also have a problem where
>>>>> some other address spaces do want 0 to be a valid address, which
>>>>> just sort of don’t work correctly now.
>>>> If you have an example with a null in a non-0 address space being
>>>> mishandled, please file a bug. We'll fix them as we find them.
>>>
>>> I think the problems aren’t so much that accessing 0 doesn’t work
>>> (although I imagine there are problems with that), but expectations
>>> of comparison with null. The main problem I’m aware of is
>>> comparisons with null pointers. The first global object in
>>> addrspace(3) will have the address of 0, so if a user does if (x !=
>>> NULL), it will not behave as expected. For C I think this is
>>> supposed to be fixed by changing the value of NULL to -1, but I
>>> don’t think that is currently supported. That is also complicated
>>> because the null value is different for different address spaces,
>>> and I think the actual null pointer value must be 0 for C++. It
>>> doesn’t really turn up often in real code so I don’t think anybody
>>> has really spent time thinking about how to properly solve this.
>> Just to make sure I'm interpreting this right: the problem is
>> essentially that we hard code "null" to mean address 0 in all address
>> spaces? If we allowed the numeric value of null to be configurable
>> per address space, would that resolve the issue at the LLVM IR level?
>
> Yes, it would. I’ve always imagined this to a be a large undertaking
> though
I'd agree on the scope, but it also seems fairly straight forward. If
this becomes a serious issue, this seems like a workable approach.
>
>>
>> Solving the frontend/language spec problem seems out of scope for
>> LLVM, though probably not for clang. Can you point me to a usage of
>> C++ with non-zero address spaces? I'd be curious to know what's
>> happening in this space.
>
> There’s an AMD static C++ extension language, and a khronos draft for
> an OpenCL C++ kernel language which applies the same sort of
> restrictions and address spaces to C++ as OpenCL C has. Last time I
> looked at this I remember that C allows a non-zero null pointer value,
> but 0 must be implicitly converted to the correct null pointer value
> and the NULL macro will expand to this integer value. I don’t think
> the OpenCL C spec touches the issue of different NULL values for
> different address spaces, but does explicitly allow different sized
> pointers for each. I am less clear on what C++ requires, but C++11
> 4.10 says "A null pointer constant is an integral constant expression
> (5.19) prvalue of integer type that evaluates to zero or a prvalue of
> type std::nullptr_t."
>
>
>>
>>>
>>> -Matt
>>>
>>>
>>>>>
>>>>> -Matt
>>>>>
>>>>>
>>>>>
>>>>>>
>>>>>> On Jan 7, 2015, at 1:18 PM, Philip Reames
>>>>>> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>>>>>
>>>>>>> On the review for http://reviews.llvm.org/D6808, majnemer
>>>>>>> <http://reviews.llvm.org/p/majnemer/> commented that:
>>>>>>> "Address space 1 has a special meaning in LLVM, it's identical
>>>>>>> to address space 0 except for the fact that "null" may be
>>>>>>> dereferenced. You might want to consider a different address space."
>>>>>>>
>>>>>>> This is the first I've heard of this and I can't find any
>>>>>>> documentation about it being reserved, either in general, or
>>>>>>> specifically for x86. Can anyone clarify?
>>>>>>>
>>>>>>> The only address spaces with special meanings I know of are:
>>>>>>> - 0 (the normal address space, null is not dereferencable)
>>>>>>> - 256 - TLS, GS relative addressing
>>>>>>> - 257 - FS relative addressing
>>>>>>>
>>>>>>> Philip
>>>>>>> _______________________________________________
>>>>>>> LLVM Developers mailing list
>>>>>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>>>>> http://llvm.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 <mailto:LLVMdev at cs.uiuc.edu>
>>>>>> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150107/dc61f5ab/attachment.html>
More information about the llvm-dev
mailing list