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
cfe-users@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to