How to get symbol's info. when the symbol is in macro instantiation

Hi list
I meet a problem about macro when using libclang, when i want to get a viriable’s infomation which is in a macro instantiation, for example, its linkage kind, i get 200(UnexposedStmt), is this the expected result? If so, how can i get the exact information of the symbol(e.g. previous in following code, SETARG_B is macro)?

//example
SETARG_B(*previous, from+n-1);

Thanks
|

This reference to previous will show up as a CXCursor_DeclRefExpr cursor. You can then use clang_getCursorReferenced() to find the declaration that the cursor points to.

  • Doug

Thanks for your explanation.

But I can’t get the result you said, when i run my test programe on the input, i get totally different result list below, could you kindly check my code please?
//run( cursor is on previous)
./clang_test /home/lucency/Study/source/lua/src/lcode.c 45 21 -I/home/lucency/Study/source/lua/src

//Result begin
Display: []
Kind [200] - [UnexposedStmt].
LK [0].
USR: [].
Can’t find Cursor’s reference.
//Result end

//code begin
#include “clang-c/Index.h”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static int displayCursorInfo(CXCursor Cursor)
{
CXString String = clang_getCursorDisplayName(Cursor);
printf(“Display: [%s]\n”, clang_getCString(String));
clang_disposeString(String);

CXCursorKind Kind = clang_getCursorKind(Cursor);
String = clang_getCursorKindSpelling(Kind);
printf(“Kind [%d] - [%s].\n”, Kind, clang_getCString(String));
clang_disposeString(String);

CXLinkageKind LK = clang_getCursorLinkage(Cursor);
printf(“LK [%d].\n”, LK);

CXString str2 = clang_getCursorUSR(Cursor);
printf(“USR: [%s].\n”, clang_getCString(str2));
clang_disposeString(str2);

return 0;
}
int main(int argc, char** argv)
{
CXTranslationUnit TU;
CXIndex Index = clang_createIndex(0,0);

//clang_test file line column -I…
int idx = 1;
char* szFileName = argv[idx++];
int nLine = atoi(argv[idx++]);
int nColumn = atoi(argv[idx++]);
int nArgs = argc - idx;
char** szArgs = &argv[idx];

TU = clang_parseTranslationUnit(Index, szFileName, szArgs, nArgs, 0, 0, CXTranslationUnit_DetailedPreprocessingRecord);

if( !TU )
{
printf(“File has some errors.\n”);

clang_disposeIndex(Index);

return -1;
}

CXFile File = clang_getFile(TU, szFileName );
if( File == NULL )
{
printf(“Can’t get CXFile.\n”);

clang_disposeTranslationUnit(TU);
clang_disposeIndex(Index);

return -1;
}
CXSourceLocation Location = clang_getLocation(TU, File, nLine, nColumn);

CXCursor Cursor = clang_getCursor(TU, Location);

displayCursorInfo(Cursor);

CXCursor iDefCursor;
if( clang_getCursorKind(Cursor) == CXCursor_MacroDefinition )
iDefCursor = Cursor;
else
iDefCursor = clang_getCursorReferenced(Cursor);
if( clang_equalCursors(iDefCursor, clang_getNullCursor() ) )
{
printf(“Can’t find Cursor’s reference.\n”);

clang_disposeTranslationUnit(TU);
clang_disposeIndex(Index);

return -1;
}

displayCursorInfo(iDefCursor);

clang_disposeTranslationUnit(TU);
clang_disposeIndex(Index);

return 0;
}
//code ends

// /Input file(only important piece, the most left column in lcode.c is line number)
//lopcodes.h
… …
#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | <br>((cast(Instruction, b)<<POS_B)&MASK1(SIZE_B,POS_B))))
… …

//lcode.c
… …
35 void luaK_nil (FuncState *fs, int from, int n) {
36 Instruction previous;
37 if (fs->pc > fs->lasttarget) { /
no jumps to current position? /
38 if (fs->pc == 0) /
function start? /
39 return; /
positions are already clean /
40 if (GET_OPCODE(
(previous = &fs->f->code[fs->pc-1])) == OP_LOADNIL) {
41 int pfrom = GETARG_A(*previous);
42 int pto = GETARG_B(previous);
43 if (pfrom <= from && from <= pto+1) { /
can connect both? */
44 if (from+n-1 > pto)
45 SETARG_B(previous, from+n-1);
46 return;
47 }
48 }
49 }
50 luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /
else no optimization */
51}
… …

11年1月25日,周二, Douglas Gregor dgregor@apple.com 写道:


> 发件人: Douglas Gregor dgregor@apple.com
> 主题: Re: [cfe-dev] How to get symbol’s info. when the symbol is in macro instantiation
> 收件人: “jiyang zhao” zjyzhaojiyang@yahoo.com.cn
> 抄送: cfe-dev@cs.uiuc.edu
> 日期: 2011年1月25日,周二,下午11:53
>
> On Jan 25, 2011, at 12:30 AM, jiyang zhao wrote:
>
> > Hi list
> > I meet a problem about macro when using libclang, when i want to get a viriable’s infomation which is in a macro instantiation, for example, its linkage kind, i get 200(UnexposedStmt), is this the expected result? If so, how can i get the exact information of the symbol(e.g. previous in following code, SETARG_B is macro)?
> >
> > //example
> > SETARG_B(*previous, from+n-1);
> >
> > Thanks
>
> This reference to previous will show up as a CXCursor_DeclRefExpr cursor. You can then use clang_getCursorReferenced() to find the declaration that the cursor points to.
>
> - Doug

|

Sorry for another post.

I make another test using c-index-test, and get a similar result.
//run
./c-index-test -cursor-at=/home/lucency/Study/source/lua/src/lcode.c:45:21 /home/lucency/Study/source/lua/src/lcode.c -I/home/lucency/Study/source/lua/src/

//result
UnexposedStmt=

Do i miss something?

PS.
1.c-index-code is built about ten days ago using code checkout from svn.
2.As you can see, the test input files come from lua.

11年1月25日,周二, Douglas Gregor dgregor@apple.com 写道:


> 发件人: Douglas Gregor dgregor@apple.com
> 主题: Re: [cfe-dev] How to get symbol’s info. when the symbol is in macro instantiation
> 收件人: “jiyang zhao” zjyzhaojiyang@yahoo.com.cn
> 抄送: cfe-dev@cs.uiuc.edu
> 日期: 2011年1月25日,周二,下午11:53
>
> On Jan 25, 2011, at 12:30 AM, jiyang zhao wrote:
>
> > Hi list
> > I meet a problem about macro when using libclang, when i want to get a viriable’s infomation which is in a macro instantiation, for example, its linkage kind, i get 200(UnexposedStmt), is this the expected result? If so, how can i get the exact information of the symbol(e.g. previous in following code, SETARG_B is macro)?
> >
> > //example
> > SETARG_B(*previous, from+n-1);
> >
> > Thanks
>
> This reference to previous will show up as a CXCursor_DeclRefExpr cursor. You can then use clang_getCursorReferenced() to find the declaration that the cursor points to.
>
> - Doug

|