| # How to Update Unicode Tables |
| |
| LLVM and Clang use a subset of the [Unicode Character Database](https://www.unicode.org/ucd/) |
| (UCD) for identifiers, `\N{...}` named characters, diagnostic column width, |
| and simple case folding. The corresponding tables are generated from the UCD |
| into Clang and LLVM Support. |
| |
| ## Downloading the Unicode data |
| |
| Download the following files: |
| |
| ```text |
| https://www.unicode.org/Public/UCD/latest/ucdxml/ucd.nounihan.flat.zip |
| https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt |
| https://www.unicode.org/Public/UCD/latest/ucd/NameAliases.txt |
| https://www.unicode.org/Public/UCD/latest/ucd/extracted/DerivedName.txt |
| ``` |
| |
| Unzip `ucd.nounihan.flat.zip` to get `ucd.nounihan.flat.xml`. |
| |
| ## Building the generators |
| |
| Build the generators from an LLVM build directory that has utilities enabled |
| (`LLVM_BUILD_UTILS`, the default) and libxml2 (`LLVM_ENABLE_LIBXML2`, also the |
| default): |
| |
| ```bash |
| ninja -C <build> UnicodeCharSetsGenerator UnicodeNameMappingGenerator |
| ``` |
| |
| Then run them from the `llvm-project` root as shown below. |
| |
| ## Character properties |
| |
| `UnicodeCharSetsGenerator` writes the identifier character sets used by the |
| lexer (`XID_Start`, `XID_Continue`, and the mathematical compatibility notation |
| profile) and the printable / formatting / combining / East-Asian-width sets |
| used by LLVM Support. |
| |
| ```bash |
| <build>/bin/UnicodeCharSetsGenerator ucd.nounihan.flat.xml \ |
| clang/lib/Lex/UnicodeCharSetsGenerated.cpp \ |
| llvm/lib/Support/UnicodeCharSetsGenerated.cpp |
| clang-format -i clang/lib/Lex/UnicodeCharSetsGenerated.cpp \ |
| llvm/lib/Support/UnicodeCharSetsGenerated.cpp |
| ``` |
| |
| The C99 and C11 identifier tables and the whitespace table in |
| `clang/lib/Lex/UnicodeCharSets.h` are maintained by hand. |
| |
| ## Character names |
| |
| `UnicodeNameMappingGenerator` writes the name-to-codepoint trie used by |
| `\N{...}` and `llvm::sys::unicode::nameToCodepointStrict` / |
| `nameToCodepointLooseMatching`. |
| |
| ```bash |
| <build>/bin/UnicodeNameMappingGenerator UnicodeData.txt NameAliases.txt \ |
| llvm/lib/Support/UnicodeNameToCodepointGenerated.cpp |
| clang-format -i llvm/lib/Support/UnicodeNameToCodepointGenerated.cpp |
| ``` |
| |
| Algorithmically derived names (`CJK UNIFIED IDEOGRAPH-*`, and so on) are not |
| in those files. Update `GeneratedNamesDataTable` in |
| `llvm/lib/Support/UnicodeNameToCodepoint.cpp` from `DerivedName.txt`. |
| |
| ## Case folding |
| |
| `llvm/utils/unicode-case-fold.py` fetches `CaseFolding.txt` and writes |
| `llvm/lib/Support/UnicodeCaseFold.cpp`: |
| |
| ```bash |
| llvm/utils/unicode-case-fold.py \ |
| https://www.unicode.org/Public/UCD/latest/ucd/CaseFolding.txt \ |
| > llvm/lib/Support/UnicodeCaseFold.cpp |
| ``` |
| |
| After regenerating the tables, update |
| `llvm/unittests/Support/UnicodeTest.cpp` and `clang/test/Lexer/unicode.c` for |
| new characters and changed name ranges. |