[cfe-dev] OpenCL and Type Poisoning

Speziale Ettore speziale.ettore at gmail.com
Wed Jan 26 00:02:45 PST 2011


Hi everyone.

I'm currently investigating how to implement "type poisoning", required
to disallow using some types in OpenCL kernel parameters. As example, an
OpenCL kernel cannot have a size_t parameter.

Since I cannot check the QualType to detect if parameter type is not
good, Peter Collingbourne suggests me to look for something like the
"#pragma GCC poison" attribute.

I've tried to use that pragma, to poison a type, however, the pragma
poison all identifiers, so

#pragma GCC poison size_t

typedef long size_t; // Here a diagnostic is issued

kernel void foor(size_t err) // I want the diagostic to be issuded here.

I have tried to implement an "openlcl_kernel_poison" pragma, but I've
seen that the pragma construct is too far from what I want to do. Thus,
I've tried to implement the same think with an attribute:

typedef long size_t __attribute__((opencl_kernel_poison));

kernel void foo(size_t err); // The diagnostic is issued here

While handling "opencl_kernel_function" attribute (code from Anton's
patch), I recursively walk the typedef chain looking for declaration
marked with the "opencl_kernel_poision" attribute. This seems working,
however I don't think this to be the right solution.

>From my point of view, the "opencl_kernel_poison" attribute can be
generalized to a "type_poison" attribute. It can be applied to any type
declararation, marking the defined type poisoned. It should be handled
like a type attribute, (e.g. "address_space"), and stored inside the
clang::Qualifiers class as an extended qualifiers (There should be a
free bit in clang::Qualifiers::Mask).

Using this approach, detecting whether a type is poisoned is
straighforward.

I don't known if that attribute can be usefull also for aggregated
types:

typedef long size_t __attribute__((type_poison))__;

struct err_1 {
  size_t err_2;
};

The struct err_1 should also be poisoned.

I attach the "opencl_kernel_poison" patch, only as reference. What do
you think about the "type_poison" approach. Is it usefull? Can it be
used also in languages other than OpenCL?

Have a nice day,
speziale.ettore at gmail.com




More information about the cfe-dev mailing list