[cfe-dev] Get name of MemberExpr expression

Qiufeng Yu via cfe-dev cfe-dev at lists.llvm.org
Thu Dec 7 14:15:23 PST 2017


Here is the ast dump for the MemberExpr that I'm interested in.

MemberExpr 0x55deb5e87188 'unsigned int (void)' lvalue .__fetch_builtin_x
0x55deb5001b60
`-OpaqueValueExpr 0x55deb5e87130 'const struct __cuda_builtin_blockIdx_t'
lvalue
  `-DeclRefExpr 0x55deb5e870d0 'const struct __cuda_builtin_blockIdx_t'
lvalue Var 0x55deb5097940 'blockIdx' 'const struct
__cuda_builtin_blockIdx_t'

MemberExpr 0x55deb5e87388 'unsigned int (void)' lvalue .__fetch_builtin_y
0x55deb5001d50
`-OpaqueValueExpr 0x55deb5e87330 'const struct __cuda_builtin_blockIdx_t'
lvalue
  `-DeclRefExpr 0x55deb5e872d0 'const struct __cuda_builtin_blockIdx_t'
lvalue Var 0x55deb5097940 'blockIdx' 'const struct
__cuda_builtin_blockIdx_t'

I think the member name should be __fetch_builting_x or __fetch_buildin_y,
and the base name should be found in a DeclRefExpr.
The problem is that, all I have is a Stmt pointer Stmt *s, which can be
casted to MemberExpr *me, then I do if(MemberExpr *me =
dyn_cast<MemberExpr>(s)) to see if the Stmt is a MemberExpr.
If yes, how do I cast this *me to OpaqueValueExpr or DeclRefExpr to
retrieve the actually name in the DeclRefExpr?



On Thu, Dec 7, 2017 at 2:49 PM, Qiufeng Yu <qyu4 at ncsu.edu> wrote:

> Hi Alexey,
>
> As far as checking the base. What's the best way to check if the base is
> actually "blockIdx"?
>
> On Thu, Dec 7, 2017 at 6:19 AM, Alexey Knyshev <alexey.knyshev at gmail.com>
> wrote:
>
>> You should not check RecordDecl in this manner as soon as it MemberExpr
>> is "composite". I mean you should separately check base & memberDecl.
>>
>> According to docs for MeberExpr::getMemberDecl
>> <https://clang.llvm.org/doxygen/classclang_1_1MemberExpr.html#a66dc522ec5732b5e4a1a90bdfe70919f>
>> The returned declaration will be a FieldDecl or (in C++) a VarDecl (for
>>   /// static data members), a CXXMethodDecl, or an EnumConstantDecl.
>>
>> 2017-12-07 12:21 GMT+03:00 Qiufeng Yu <qyu4 at ncsu.edu>:
>>
>>> I can also use the ASTMatcher to find all MemberExprs, but still can't
>>> narrow them down to those only called blockIdx.x and blockIdx.y.
>>> My Matcher is following:
>>>
>>> Matcher.addMatcher(memberExpr(hasObjectExpression(hasType(cx
>>> xRecordDecl(hasName("blockIdx.x"))))));
>>> Matcher.addMatcher(memberExpr(hasObjectExpression(hasType(cx
>>> xRecordDecl(hasName("blockIdx.y"))))));
>>>
>>> On Thu, Dec 7, 2017 at 3:55 AM, Qiufeng Yu <qyu4 at ncsu.edu> wrote:
>>>
>>>> Say the original code is int bx = blockIdx.x, I already found the
>>>> MemberExpr of this line of code, which is blockIdx.x. But all I have is
>>>> only this MemberExpr. What I need is the actual string representation of
>>>> this MemberExpr so that I can perform the string comparison to make sure
>>>> that this MemberExpr is indeed blockIdx.x, and perform the rewriting
>>>> process.
>>>>
>>>> On Thu, Dec 7, 2017 at 3:48 AM, Alexey Knyshev <
>>>> alexey.knyshev at gmail.com> wrote:
>>>>
>>>>> Hi,
>>>>> Do you mean finding AST corresponding to MemberExpr or you already
>>>>> found then and trying to figure out SourceLocation for them?
>>>>>
>>>>> Regards, Alexey K
>>>>>
>>>>> 2017-12-07 11:40 GMT+03:00 Qiufeng Yu via cfe-dev <
>>>>> cfe-dev at lists.llvm.org>:
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I'm new to clang and currently working on a project where I need to
>>>>>> rewrite some codes in CUDA source file.
>>>>>>
>>>>>> For example, if I have the following CUDA code:
>>>>>>
>>>>>> int bx = blockIdx.x;
>>>>>> int by = blockIdx.y;
>>>>>>
>>>>>> I want to rewrite the blockIdx and blockIdx.x and blockIdx.y to some
>>>>>> other code:
>>>>>> int bx = something else;
>>>>>> int by = something else;
>>>>>>
>>>>>> My problem is that how do I find the MemberExpr blockIdx,x and
>>>>>> blockIdx.y?
>>>>>>
>>>>>> I know how to get the MemberExpr, but I have no clue how to extract
>>>>>> the name of the MemberExpr in order to know that it is the right MemberExpr
>>>>>> for me to rewrite.
>>>>>>
>>>>>> Any help is appreciated.
>>>>>>
>>>>>>
>>>>>> Patrick
>>>>>>
>>>>>> _______________________________________________
>>>>>> cfe-dev mailing list
>>>>>> cfe-dev at lists.llvm.org
>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> linkedin.com/profile
>>>>> <https://www.linkedin.com/profile/view?id=AAMAABn6oKQBDhBteiQnWsYm-S9yxT7wQkfWhSw>
>>>>>
>>>>> github.com/alexeyknyshev
>>>>> bitbucket.org/alexeyknyshev
>>>>>
>>>>
>>>>
>>>
>>
>>
>> --
>> linkedin.com/profile
>> <https://www.linkedin.com/profile/view?id=AAMAABn6oKQBDhBteiQnWsYm-S9yxT7wQkfWhSw>
>>
>> github.com/alexeyknyshev
>> bitbucket.org/alexeyknyshev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171207/02d23047/attachment.html>


More information about the cfe-dev mailing list