In the llvm, I'm adding support for address spaces for builtin functions that take pointers. For
example, the front end will generate slightly different code if the incoming pointer to the intrinsic function comes from different address spaces, e.g.,
@llvm.atomic.load.add.i32.p0i32 // returns i32, i32 ptr to default address space
@llvm.atomic.load.add.i32.p11i32 // return i32, i32 ptr to address space 11
To generate this in Clang, I didn't want to require the user to have to specify what specific address spaces a builtin can take, especially if the intrinsic is supported on the address space for a particular machine. So, I added the concept to ASQualType the concept of a "generic" address space that can be used in the parameter type of a function prototype. This concept is used when we checking to see if an argument and a parameter type are compatible. An argument of type pointer to an address space to a Type T1 is compatible with a parameter of type pointer to a generic space to a Type T1. When we get to code generation, we take the type of the argument account to generate the different intrinsic names.
I'm also going to change clang to generate an error if the compiler needs to do an implicit cast between to pointers pointing at different address spaces. Typically, this operation doesn't make sense. Note that users can still do explicit cast between address spaces.
If you have any comments or suggestions, please let me know.
-- Mon Ping