Hi,
I am using libclang to process large PCH files. Within the translation units
for the PCH files I need to locate the CXCursor of a declaration based on an
arbitrary name. Currently I use something similar to the following which is
terrible performance wise:
// start a search in this translation unit for a CXCursor to a declaration
called "SomeNameToSearchFor", the CXType is not known in advance.
CXCursor result;
clang_visitChildren( clang_getTranslationUnitCursor( tu ), findDeclaration,
&result );
// recurse into the TU and check *every* declaration name to see if it matches
to one I want...
enum CXChildVisitResult findDeclaration( CXCursor cursor, CXCursor parent,
CXClientData data )
{
CXCursorKind kind = clang_getCursorKind( cursor );
// ignore anything that is not a declaration
if( !clang_isDeclaration( kind ) )
return CXChildVisitResult::CXChildVisit_Continue;
CXType type = clang_getCursorType( cursor );
if( type.kind == CXTypeKind::CXType_Unexposed )
type = clang_getCanonicalType( type );
CXString spell = clang_getCursorSpelling( cursor );
// Check if this name is the one I want...
if( strcmp( clang_getCString( spell ), "SomeNameToSearchFor" ) == 0 )
{
*(CXCursor *)data = cursor;
return CXChildVisitResult::CXChildVisit_Break;
}
// Recurse into namespace/class/struct/union declaration in order to
keep searching inside them...
if( kind == CXCursorKind::CXCursor_Namespace || kind ==
CXCursorKind::CXCursor_ClassDecl || kind == CXCursorKind::CXCursor_StructDecl
|| kind == CXCursorKind::CXCursor_UnionDecl )
{
if( clang_visitChildren( cursor, findDeclaration, data ) != 0 )
return CXChildVisitResult::CXChildVisit_Break;
}
return CXChildVisitResult::CXChildVisit_Continue;
}
One option is to create a hash map of every declaration cursor (the maps value)
and its name (the maps key) and then just do an O(1) lookup into that map for a
corresponding cursor should one exist. However I am wondering if something like
this is already available within clang so I can avoid the overhead as the PCH
files can be huge.
Is there an existing technique to do a fast search of a declaration name for a
cursor?
Thanks!
- M.
_______________________________________________
cfe-users mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users