[cfe-dev] Got compile error 'comparison between non-overlapping address spaces' on 3.6 branch
Song, Ruiling
ruiling.song at intel.com
Fri Feb 13 05:33:19 PST 2015
Hi Anastasia,
Thanks for your detailed explanation. Using zero is OK enough to solve the issue.
So, when Clang do semantic check, 0 is interpreted as integer instead of null pointer?
I previously thought Clang treat 0 as null pointer here directly, which it is finally transformed into.
BTW, in C language, NULL may be defined as 0 or (void*)0 in different implementation.
Thanks!
Ruiling
From: Anastasia Stulova [mailto:anastasia.stulova at arm.com]
Sent: Friday, February 13, 2015 6:23 PM
To: 'Sameer Sahasrabuddhe'; Song, Ruiling
Cc: cfe-dev at cs.uiuc.edu
Subject: RE: Got compile error 'comparison between non-overlapping address spaces' on 3.6 branch
Hi Ruiling,
I agree with Sameer, in general in CL2.0 your example will have a comparison between global and generic address spaces, which is allowed.
However, for all CL versions Clang still uses private as default address space of pointers. Some time ago, I’ve sent a patch changing this to comply with CL2.0 rules. My patch wasn’t complete though, because default address space rules are a bit more complex, i.e. program scope pointers should have global address space as default and all other pointers generic. I will see if I can find time to rework this patch.
In the meantime, would this be sufficient for you:
#define NULL 0
This will result in the comparison between a pointer and an integer literal, which is allowed in OpenCL. Also this is the only solution for CL earlier than v2.0.
Regards,
Anastasia
From: Sameer Sahasrabuddhe [mailto:sameer.sahasrabuddhe at amd.com]
Sent: 13 February 2015 06:17
To: Song, Ruiling; Anastasia Stulova
Cc: cfe-dev at cs.uiuc.edu<mailto:cfe-dev at cs.uiuc.edu>
Subject: Re: Got compile error 'comparison between non-overlapping address spaces' on 3.6 branch
Hello Ruiling,
As far as I can see, the C spec defines the literal "0" as the null pointer, so the following macro seems better:
#define NULL 0
But ignoring the NULL, I think the behaviour might change between OpenCL 1.2 and OpenCL 2.0. In CL12, the "void *" is likely to be a pointer to the private address space. In that case, the comparison is undefined. In CL20, it is likely to be a pointer to the generic address space, and it should be allowed by the frontend. (Because generic address space includes global address space).
I have to use words like "should" and "likely to" because this needs confirmation from language lawyers ... the question actually pushes the boundaries of how much I understand the details of OpenCL! :)
Sameer.
On 2/13/2015 11:25 AM, Song, Ruiling wrote:
Hi Sameer, Anastasia,
Do you have any comment on this? Thanks!
Ruiling
-----Original Message-----
From: Song, Ruiling
Sent: Wednesday, February 11, 2015 10:38 AM
To: 'cfe-dev at cs.uiuc.edu<mailto:cfe-dev at cs.uiuc.edu>'
Subject: Got compile error 'comparison between non-overlapping address
spaces' on 3.6 branch
I am a developer working on Beignet (OpenCL driver for Intel Graphics card).
I am trying Clang 3.6 branch, and encounter below problem. It works well in
older clang version.
We define NULL as "#define NULL (void *)0", so user could directly use it in
OpenCL language like __kernel void test(__global unsigned int *dst)
if (dst != NULL) {do something;}
}
But I got below error when compiling using clang 3.6.
"error: comparison between ('__global unsigned int *' and 'void *') which
are pointers to non-overlapping address spaces"
Is this the expected behavior or a bug?
Thanks!
Ruiling
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150213/6e894b1e/attachment.html>
More information about the cfe-dev
mailing list