This reverts commit 68c04b0ae6.
This disables the IWYU mapping that caused the failure, since
the headers aren't reachable for now.
This is the first part of the "Freezing C++03 headers" proposal
explained in
https://discourse.llvm.org/t/rfc-freezing-c-03-headers-in-libc/77319/58.
This patch mechanically copies the headers as of the LLVM 19.1 release
into a subdirectory of libc++ so that we can start using these headers
when building in C++03 mode. We are going to be backporting important
changes to that copy of the headers until the LLVM 21 release. After the
LLVM 21 release, only critical bugfixes will be fixed in the C++03 copy
of the headers.
This patch only performs a copy of the headers -- these headers are
still unused by the rest of the codebase.
94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
#!/usr/bin/env python
|
|
|
|
import argparse
|
|
import libcxx.header_information
|
|
import os
|
|
import pathlib
|
|
import re
|
|
import sys
|
|
import typing
|
|
|
|
def IWYU_mapping(header: str) -> typing.Optional[typing.List[str]]:
|
|
ignore = [
|
|
"__cxx03/.+",
|
|
"__debug_utils/.+",
|
|
"__fwd/get[.]h",
|
|
"__pstl/.+",
|
|
"__support/.+",
|
|
"__utility/private_constructor_tag.h",
|
|
]
|
|
if any(re.match(pattern, header) for pattern in ignore):
|
|
return None
|
|
elif header == "__bits":
|
|
return ["bits"]
|
|
elif header in ("__bit_reference", "__fwd/bit_reference.h"):
|
|
return ["bitset", "vector"]
|
|
elif re.match("__configuration/.+", header) or header == "__config":
|
|
return ["version"]
|
|
elif header == "__hash_table":
|
|
return ["unordered_map", "unordered_set"]
|
|
elif header == "__locale":
|
|
return ["locale"]
|
|
elif re.match("__locale_dir/.+", header):
|
|
return ["locale"]
|
|
elif re.match("__math/.+", header):
|
|
return ["cmath"]
|
|
elif header == "__node_handle":
|
|
return ["map", "set", "unordered_map", "unordered_set"]
|
|
elif header == "__split_buffer":
|
|
return ["deque", "vector"]
|
|
elif re.match("(__thread/support[.]h)|(__thread/support/.+)", header):
|
|
return ["atomic", "mutex", "semaphore", "thread"]
|
|
elif header == "__tree":
|
|
return ["map", "set"]
|
|
elif header == "__fwd/byte.h":
|
|
return ["cstddef"]
|
|
elif header == "__fwd/pair.h":
|
|
return ["utility"]
|
|
elif header == "__fwd/subrange.h":
|
|
return ["ranges"]
|
|
elif re.match("__fwd/(fstream|ios|istream|ostream|sstream|streambuf)[.]h", header):
|
|
return ["iosfwd"]
|
|
# Handle remaining forward declaration headers
|
|
elif re.match("__fwd/(.+)[.]h", header):
|
|
return [re.match("__fwd/(.+)[.]h", header).group(1)]
|
|
# Handle detail headers for things like <__algorithm/foo.h>
|
|
elif re.match("__(.+?)/.+", header):
|
|
return [re.match("__(.+?)/.+", header).group(1)]
|
|
else:
|
|
return None
|
|
|
|
|
|
def main(argv: typing.List[str]):
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"-o",
|
|
help="File to output the IWYU mappings into",
|
|
type=argparse.FileType("w"),
|
|
required=True,
|
|
dest="output",
|
|
)
|
|
args = parser.parse_args(argv)
|
|
|
|
mappings = [] # Pairs of (header, public_header)
|
|
for header in libcxx.header_information.all_headers:
|
|
public_headers = IWYU_mapping(str(header))
|
|
if public_headers is not None:
|
|
mappings.extend((header, public) for public in public_headers)
|
|
|
|
# Validate that we only have valid public header names -- otherwise the mapping above
|
|
# needs to be updated.
|
|
for header, public in mappings:
|
|
if public not in libcxx.header_information.public_headers:
|
|
raise RuntimeError(f"{header}: Header {public} is not a valid header")
|
|
|
|
args.output.write("[\n")
|
|
for header, public in sorted(mappings):
|
|
args.output.write(
|
|
f' {{ include: [ "<{header}>", "private", "<{public}>", "public" ] }},\n'
|
|
)
|
|
args.output.write("]\n")
|
|
|
|
if __name__ == "__main__":
|
|
main(sys.argv[1:])
|