Capability attributes on a parameter mean one of two unrelated things: on a scoped-lockable parameter they describe the locks the passed scope object holds, while on a function pointer parameter they describe the requirements of the function called through the pointer. Since #191187 allowed the latter, both of the scoped-lockable code paths have been misreading function pointer parameters as scope objects. At a call site, the argument bound to the parameter was translated into a capability and required to be held, so passing a callback that requires a capability was reported as a missing lock named after the callback: ``` void apply(fn_t fn EXCLUSIVE_LOCKS_REQUIRED(mu)); static int my_fn() EXCLUSIVE_LOCKS_REQUIRED(mu); ... apply(my_fn); // warning: requires holding mutex 'fn' ``` In the callee, the same confusion seeded the parameter's capabilities into the function's entry lockset, so they were considered held throughout the body and the calls made through the pointer went unchecked -- the opposite of what the annotation asks for. Skip function pointer parameters in both places; their attributes are already checked at the indirect call sites (by #191187), the same way as for annotated function pointer variables and fields. Assisted-by: Claude Opus 5 |
||
|---|---|---|
| .ci | ||
| .github | ||
| bolt | ||
| clang | ||
| clang-tools-extra | ||
| cmake | ||
| compiler-rt | ||
| cross-project-tests | ||
| flang | ||
| flang-rt | ||
| libc | ||
| libclc | ||
| libcxx | ||
| libcxxabi | ||
| libsycl | ||
| libunwind | ||
| lld | ||
| lldb | ||
| llvm | ||
| llvm-libgcc | ||
| mlir | ||
| offload | ||
| openmp | ||
| orc-rt | ||
| polly | ||
| runtimes | ||
| third-party | ||
| utils | ||
| .clang-format | ||
| .clang-format-ignore | ||
| .clang-tidy | ||
| .git-blame-ignore-revs | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| LICENSE.TXT | ||
| pyproject.toml | ||
| README.md | ||
| SECURITY.md | ||
The LLVM Compiler Infrastructure
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called "LLVM". This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Getting the Source Code and Building LLVM
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Getting in touch
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.