Quickly find the CXCursor for a declaration based on the cursors name?


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?


- M.