[cfe-dev] OpenCL support
Alberto Magni
alberto.magni86 at gmail.com
Sun Nov 28 04:19:44 PST 2010
Hi Pekka,
thank you for the reply and for the paper, I have never heard of SAP before,
very interesting field.
Hi Peter,
the suggestion you gave my are what I am looking for, thank you very much.
- Please make sure your patch conforms with the LLVM coding standards
> (http://llvm.org/docs/CodingStandards.html). In particular indentation
> is inconsistent in some areas.
>
The problem was the usage of tabs instead of spaces, fixed.
>
> - Similarly, your patch reformats parts of the Clang source code in a
> way that is inconsistent with the coding standards. Please remove
> these changes.
>
> - For such a large change as this, it would be really nice (and
> easier to review) if your patch were broken up into a series of
> separate logical changes. This is easy to do using git; I saw
> you're using hg so this should also be possible.
>
Ok, I'll look for it in Mercurial.
- You added an OpenCLMask field to Qualifiers for storing the OpenCL
> address space. This doubles the size of the Qualifiers object.
> Is there any reason why you did not use the existing AddrSpace
> subfield? (The way I imagine it could work is to define fixed
> address space constants for the constant, global, local and private
> address spaces).
I added a new mask for the sake of simplicity, but I think I'll follow your
advice.
You also don't need to use a bitmask (at least
> at the AST level) since the address spaces are mutually exclusive.
>
This is a problem on which I thought a lot. Since this qualifiers are
mutually
exclusive I could have used only two bits to save one of the possible four
cases.
But let's take into consideration this test case:
typedef __global int global_typedef;
__local global_typedef* t4; //expected-error {{multiple named address
spaces}}
The compilation error is due to the presence of a different OpenCL qualifier
both
in the typdef both in the variable definition. Now, what is the canonical
type of "t4" ?
"__global __local int".
In the method Sema::HandleDeclarator there is a call to:
TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
GetTypeForDeclarator will build the canonical type of the declarator passed
as argument (D).
The actual stack trace is:
HandleDeclarator
GetTypeForDeclarator
BuildPointerType
getPointerType
getCanonicalType
The call to getCanonicalType will result in the building of a new
"Qualifiers" object,
starting from "__local", the local OpenCL qualifier the "__global" qualifier
will also be added.
If I add an assert in the Qualifier class to the method that adds the new
qualifier (__global):
assert (there are no previous OpenCL qualifiers here)
it will for sure signal an error, since the Qualifiers object contains
already an OpenCL
qualifiers: (__local).
To overcome this I allowed the possibility to have an inconsistent state in
the Qualifiers
object, ie 2 bits in the OpenCL qualifiers mask, with the assurance that
this inconsistency
would be checked in the method Sema::ActOnVariableDeclaration, also called
by
HandleDeclarator.
One solution would be to add a check for duplicated OpenCL qualifiers in
HandleDeclarator before the call to GetTypeForDeclarator, but I think that
this would be
misplaced since all the semantic checks on a variable declaration should be
performed in
ActOnVariableDeclarator.
Right now I have no idea how to solve this issue.
Any suggestion is greatly appreciated.
> - You added a __kernel field to FunctionDecl. A better way
> of handling this IMO would be to add a new attribute (Attr subclass).
> See the include/clang/Basic/Attr.td file.
>
Sorry for the stupid question, but what is the advantage of using an
attribute instead of a function specifier ?
Thank you very much again.
Bye bye.
Alberto
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20101128/f0c25f06/attachment.html>
More information about the cfe-dev
mailing list