llvm-project/clang
Vassil Vassilev 0cb7e7ca0c Make iteration over the DeclContext::lookup_result safe.
The idiom:
```
DeclContext::lookup_result R = DeclContext::lookup(Name);
for (auto *D : R) {...}
```

is not safe when in the loop body we trigger deserialization from an AST file.
The deserialization can insert new declarations in the StoredDeclsList whose
underlying type is a vector. When the vector decides to reallocate its storage
the pointer we hold becomes invalid.

This patch replaces a SmallVector with an singly-linked list. The current
approach stores a SmallVector<NamedDecl*, 4> which is around 8 pointers.
The linked list is 3, 5, or 7. We do better in terms of memory usage for small
cases (and worse in terms of locality -- the linked list entries won't be near
each other, but will be near their corresponding declarations, and we were going
to fetch those memory pages anyway). For larger cases: the vector uses a
doubling strategy for reallocation, so will generally be between half-full and
full. Let's say it's 75% full on average, so there's N * 4/3 + 4 pointers' worth
of space allocated currently and will be 2N pointers with the linked list. So we
break even when there are N=6 entries and slightly lose in terms of memory usage
after that. We suspect that's still a win on average.

Thanks to @rsmith!

Differential revision: https://reviews.llvm.org/D91524
2021-03-17 08:59:04 +00:00
..
INPUTS
bindings
cmake [Fuchsia] Add check-polly to CLANG_BOOTSTRAP_TARGETS 2021-03-12 18:31:20 -08:00
docs [ASTMatchers] Fix documentation for hasAnyBody matcher 2021-03-15 13:06:49 +00:00
examples Refactoring the attribute plugin example to fit the new API 2020-12-21 08:24:09 -05:00
include Make iteration over the DeclContext::lookup_result safe. 2021-03-17 08:59:04 +00:00
lib Make iteration over the DeclContext::lookup_result safe. 2021-03-17 08:59:04 +00:00
runtime [compiler-rt] Fix stale incremental builds when using `LLVM_BUILD_EXTERNAL_COMPILER_RT=ON`. 2021-03-10 09:42:24 -08:00
test Make iteration over the DeclContext::lookup_result safe. 2021-03-17 08:59:04 +00:00
tools Make iteration over the DeclContext::lookup_result safe. 2021-03-17 08:59:04 +00:00
unittests Make iteration over the DeclContext::lookup_result safe. 2021-03-17 08:59:04 +00:00
utils [RISCV] Don't emit #undef BUILTIN from RISCVVEmitter.cpp 2021-03-16 14:57:45 +08:00
www [www] Add cxx_status tracking for C++23. 2021-02-25 14:47:43 -08:00
.clang-format
.clang-tidy
.gitignore
CMakeLists.txt [test] Add ability to get error messages from CMake for errc substitution 2021-03-15 20:56:08 +01:00
CODE_OWNERS.TXT
INSTALL.txt
LICENSE.TXT
ModuleInfo.txt
NOTES.txt
README.txt

README.txt

//===----------------------------------------------------------------------===//
// C Language Family Front-end
//===----------------------------------------------------------------------===//

Welcome to Clang.  This is a compiler front-end for the C family of languages
(C, C++, Objective-C, and Objective-C++) which is built as part of the LLVM
compiler infrastructure project.

Unlike many other compiler frontends, Clang is useful for a number of things
beyond just compiling code: we intend for Clang to be host to a number of
different source-level tools.  One example of this is the Clang Static Analyzer.

If you're interested in more (including how to build Clang) it is best to read
the relevant web sites.  Here are some pointers:

Information on Clang:             http://clang.llvm.org/
Building and using Clang:         http://clang.llvm.org/get_started.html
Clang Static Analyzer:            http://clang-analyzer.llvm.org/
Information on the LLVM project:  http://llvm.org/

If you have questions or comments about Clang, a great place to discuss them is
on the Clang development mailing list:
  http://lists.llvm.org/mailman/listinfo/cfe-dev

If you find a bug in Clang, please file it in the LLVM bug tracker:
  http://llvm.org/bugs/