"generic" address space

Hi,

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.

Thanks,
-- Mon Ping

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.

I don't really like this approach: you're introducing a fake type that
isn't actually usable by user code, which seems messy at best. I
think it would be better to handle this like __builtin_shufflevector,
where typechecking gets done by a custom validator.

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.

I think that's fine; of course, please submit this patch separately.

-Eli