| # Summary Extraction Internals |
| |
| :::{WARNING} |
| The framework is rapidly evolving. |
| The documentation might be out-of-sync with the implementation. |
| The purpose of this documentation is to give context for upcoming reviews. |
| ::: |
| |
| When `--ssaf-tu-summary-file=` is non-empty, `CreateFrontendAction()` (in `ExecuteCompilerInvocation.cpp`) |
| wraps the original `FrontendAction` inside a `TUSummaryExtractorFrontendAction`. |
| This ensures that the summary extraction transparently happens after the original frontend action, which is usually either compilation (`-c`) or just `-fsyntax-only` in tests. |
| |
| ## Lifetime of a summary extraction |
| |
| The `TUSummaryExtractorFrontendAction` will try to construct a `TUSummaryRunner` ASTConsumer and report an error on failure. |
| When it succeeds, it will multiplex the handlers of the ASTConsumer to every summary extractor and in the end, serialize and write the results to the desired file. |
| |
| ## Implementation details |
| |
| ### Global Registries |
| |
| The framework uses [llvm::Registry<>](https://llvm.org/doxygen/classllvm_1_1Registry.html) |
| as an extension point for adding new summary analyses or serialization formats. |
| Each entry in the *registry* holds a name, a description and a pointer to a constructor. |
| Because static linking can discard unreferenced registration objects, the framework |
| uses {doc}`ForceLinkerHeaders` to ensure they are retained. |
| |
| For details on how to add new extractors and formats, see {doc}`HowToExtend`. |