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