| # 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`. |