[clang] Add support for referencable labels for attribute documentation (PR #118428)

Oliver Hunt via cfe-commits cfe-commits at lists.llvm.org
Tue Dec 3 21:22:34 PST 2024


ojhunt wrote:

> I have no idea what is going on here... @AaronBallman probably needs to take a better look. Else, could the author please give me an ELI5 sorta thing here or show me what the change looks like on the generated stuff?

Sure! This example will cover the docs used in the [above screenshot](#issuecomment-2516159888)

So currently the documentation for the attribute is:

```markdown
def NoSanitizeMemoryDocs : Documentation {
  let Category = DocCatFunction;
  let Heading = "no_sanitize_memory";
  let Content = [{
.. _langext-memory_sanitizer:

Use ``__attribute__((no_sanitize_memory))`` on a function declaration to
....
  }];
}
```

this results in generated docs like this:

```rst
no_sanitize_memory
------------------
.. csv-table:: Supported Syntaxes
   :header: "GNU", "C++11", "C23", "``__declspec``", "Keyword", "``#pragma``", "HLSL Annotation", "``#pragma clang attribute``"

   "``no_address_safety_analysis`` |br| ``no_sanitize_address`` |br| ``no_sanitize_thread`` |br| ``no_sanitize_memory``","``gnu::no_address_safety_analysis`` |br| ``gnu::no_sanitize_address`` |br| ``gnu::no_sanitize_thread`` |br| ``clang::no_sanitize_memory``","``gnu::no_address_safety_analysis`` |br| ``gnu::no_sanitize_address`` |br| ``gnu::no_sanitize_thread`` |br| ``clang::no_sanitize_memory``","","","","","Yes"

.. _langext-memory_sanitizer: <!-- NOTE: This is where the manually specified label is -->

Use ``__attribute__((no_sanitize_memory))`` on a function declaration to
...
```

The result is that a `:ref:langext-memory_sanitizer` link goes into the middle of the attribute documentation, after the name and spelling table.

This change simply adds a `Label` field to the root Documentation object and updates the codgen to use it, and removes the currently manually specified labels, after which we can remove the manual label from the doc string above and use the explicit Label field which then results in this generated documentation:

```rst
.. _langext-memory_sanitizer: <!-- NOTE: This is where the manually specified label is now -->

no_sanitize_memory
------------------
.. csv-table:: Supported Syntaxes
   :header: "GNU", "C++11", "C23", "``__declspec``", "Keyword", "``#pragma``", "HLSL Annotation", "``#pragma clang attribute``"

   "``no_address_safety_analysis`` |br| ``no_sanitize_address`` |br| ``no_sanitize_thread`` |br| ``no_sanitize_memory``","``gnu::no_address_safety_analysis`` |br| ``gnu::no_sanitize_address`` |br| ``gnu::no_sanitize_thread`` |br| ``clang::no_sanitize_memory``","``gnu::no_address_safety_analysis`` |br| ``gnu::no_sanitize_address`` |br| ``gnu::no_sanitize_thread`` |br| ``clang::no_sanitize_memory``","","","","","Yes"

Use ``__attribute__((no_sanitize_memory))`` on a function declaration to
...
```

This puts the link in a much better location for cross linking documentation

https://github.com/llvm/llvm-project/pull/118428


More information about the cfe-commits mailing list