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
|