[cfe-dev] Parameter check question

Douglas Gregor dgregor at apple.com
Tue Oct 6 16:38:00 PDT 2009


On Oct 6, 2009, at 4:20 PM, Tanya Lattner wrote:

>
> On Oct 6, 2009, at 3:50 PM, John McCall wrote:
>
>> Tanya Lattner wrote:
>>>
>>>
>>> On Oct 5, 2009, at 2:58 PM, Douglas Gregor wrote:
>>>
>>>>
>>>> On Oct 5, 2009, at 2:37 PM, Tanya Lattner wrote:
>>>>
>>>>> Hello,
>>>>>
>>>>> I want to do a check on function parameters similar to the  
>>>>> "err_arg_with_address_space" check that I added in  
>>>>> ActOnParamDeclarator (r83165). However, this time, I only want  
>>>>> to perform the check if the function has a specific attribute.  
>>>>> Is ActOnParamDeclarator the right place? I'm not seeing a way to  
>>>>> get the function attribute there. Or, any suggestion on where to  
>>>>> add this?
>>>>
>>>>
>>>> ActOnParamDeclarator won't work, since that gets can get called  
>>>> by the parser before we've seen the function attributes. I  
>>>> suggest putting this check into ActOnFunctionDeclarator (e.g.,  
>>>> where we check for parameters of "void" type).
>>>>
>>>
>>> Awesome, thanks! At this point in ActOnFunctionDeclarator, do  
>>> parameters know about their attributes? Specifically addr space  
>>> qualifiers. I'm thinking no because it always seems to think the  
>>> param's in addr space 0, but when I dump the QualType I can  
>>> clearly see the addr space attribute and its non zero, but I  
>>> assume it just hasn't been processed yet.
>>
>> ActOnFunctionDeclarator doesn't get called until all the parameters  
>> have finished parsing, so all the attributes, address spaces, etc.  
>> should be present.
>>
>> Can you post a code example where it thinks the parameter is in  
>> address space 0 (I assume getAddressSpace() is returning 0)?
>>
>
> Yes, I'm using getAddressSpace().
>
> Here is a simple example:
> __attribute__((annotate("random"))) void foo(__attribute__ 
> ((address_space(1))) int *x);
>
> At the end of ActOnFunctionDeclarator (right before the return) is  
> where I have my check.
>
> for (unsigned p = 0, NumParams = NewFD->getNumParams();
>              p < NumParams; ++p) {
>           ParmVarDecl *Param = NewFD->getParamDecl(p);
>           QualType T = Param->getType();
>           if (T.getAddressSpace() == 0) {
> 		// do stuff
> 	
> 	}
> }
>
> For some reason, getAddressSpace() is returning 0.
>
> (gdb) p T.getAddressSpace()
> $1 = 0
> (gdb) p T.dump()
> : int __attribute__((address_space(1)))*identifier
> $2 = void

The address space qualifier here applies to the "int", not to the  
"int*". If you get T as a PointerType (T->getAs<PointerType>()) and  
look at its pointee type, you'll see an address-space-qualified "int".

	- Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20091006/221c25a0/attachment.html>


More information about the cfe-dev mailing list