End SourceLocation of macro

Hi,

I am doing source analysis using clang and I need to identify certain function calls. Some of these calls are instantiated through macros.

Eg:

<1> #define MALLOC(x) malloc((x))
<2>
<3>int main() {
<4> char *p;
<5>
<6> p = MALLOC(sizeof(char) *
<7> MAX_SIZE);
<8> }

In the above dummy example, I want to get the end location of malloc invocation. When MALLOC is expanded by the preprocessor, the two line invocation becomes single line and getEndLoc() on the CallExpr object gives line number 6. But I want to get the actual end location of the macro invocation in source file. In the example, it is line 7. Can anyone point me in the right direction to get this from AST?

Thanks,
Aniruddh

Hi,

I am doing source analysis using clang and I need to identify certain function calls. Some of these calls are instantiated through macros.

Eg:

<1> #define MALLOC(x) malloc((x))
<2>
<3>int main() {
<4> char *p;
<5>
<6> p = MALLOC(sizeof(char) *
<7> MAX_SIZE);
<8> }

In the above dummy example, I want to get the end location of malloc invocation. When MALLOC is expanded by the preprocessor, the two line invocation becomes single line and getEndLoc() on the CallExpr object gives line number 6. But I want to get the actual end location of the macro invocation in source file. In the example, it is line 7. Can anyone point me in the right direction to get this from AST?

Let’s say ‘loc’ is the SourceLocation that you know is in a macro (isMacroID() == true) and ‘SM’ is SourceManager, do this:

FileID FID = SM.getFileID(loc);
const SrcMgr::SLocEntry *Entry = &SM.getSLocEntry(FID);

while (Entry->getInstantiation().getInstantiationLocStart().isMacroID()) {
loc = Entry->getInstantiation().getInstantiationLocStart();
FID = SM.getFileID(loc);
Entry = &SM.getSLocEntry(FID);
}

Now

Entry->getInstantiation().getInstantiationLocEnd()

Will be the SourceLocation of ending ‘)’ of the macro instantiation.

Thanks a lot Argyrios. This is exactly what I wanted.

Thanks,
Aniruddh