[cfe-dev] address_space pragma

Leonard Chan via cfe-dev cfe-dev at lists.llvm.org
Wed Aug 1 12:19:30 PDT 2018

We would like to propose a new pragma that changes the error message
produced when using pointers with different address spaces. For
example, given the following:

  1 #define SPACE1 __attribute__((address_space(1)))
  2 #define SPACE2 __attribute__((address_space(2)))
  4 void func(char SPACE1 *a){}
  6 int main() {
  7   char SPACE2 *a;
  8   func(a);
  9 }

The following error is produced:

error: passing '__attribute__((address_space(2))) char *' to parameter
of type '__attribute__((address_space(1))) char *' changes address
space of pointer

We would like to propose a pragma that would allow for binding an
address_space to a string, and a list of other attributes used with
address_space, such that the error will instead print the string
passed instead of the whole attribute. That is, this would be dumped

error: passing 'SPACE2 char *' to parameter of type 'SPACE1 char *'
changes address space of pointer

from the following code

  1 #pragma clang address_space "SPACE1"
  2 #pragma clang address_space "SPACE2"
  3 #define SPACE1 __attribute__((address_space("SPACE1")))
  4 #define SPACE2 __attribute__((address_space("SPACE2")))
  6 void func(char SPACE1 *a){}
  8 int main() {
  9   char SPACE2 *a;
 10   func(a);
 11 }

The proposed usage would be along the lines:
 `#pragma clang address_space <string> <variable-attributes>`

where the address_space pragma accepts a string as the first argument
to indicate what gets printed in the error and a list of other
attributes that one would want to pair with address_space.

This would also be useful with codebases that use Sparse
(http://sparse.wiki.kernel.org/), a static analyzer used on the Linux
kernel that uses special annotations to convey information about
certain data types. One such usage is with `__user` which is defined
as `__attribute__((noderef, address_space(1)))`, where pointers
declared with `__user` complain if they are dereferenced or it’s used
for address spaces that aren’t address_space(1).

In the case of tools that use Sparse, instead of printing
`__attribute__((noderef, address_space(1))) void *` for the __user
macro, `__user void *` would be printed instead when using `#pragma
clang address_space "__user" noderef`.

The changes in this patch would include (though I could naively be
missing some other stuff):
- Adding the address_space pragma which will require some internal
mapping of the string to address_space and a list of other attributes
used with it.
- Changing the address_space attribute to accept strings in addition
to integers. Accepting a string will map to whatever attributes were
used in the pragma while accepting an int defaults to the regular
address_space behavior.

For now we intend to use this primarily with address_space but are
open to feedback on other ways we can improve this or expand on the
usage for other attributes.

- Leo

More information about the cfe-dev mailing list