[cfe-dev] Parameter check question

Tanya Lattner lattner at apple.com
Tue Oct 6 16:20:00 PDT 2009


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


-Tanya

>

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


More information about the cfe-dev mailing list