[clang][modules][deps] Parse "FW_Private" module map even after loading "FW" PCM
authorJan Svoboda <jan_svoboda@apple.com>
Thu, 6 Jul 2023 17:07:04 +0000 (19:07 +0200)
committerJan Svoboda <jan_svoboda@apple.com>
Mon, 17 Jul 2023 20:50:24 +0000 (13:50 -0700)
commitbe014563f2f492658abcfa68cfaffc58a4ed7d9a
tree4745e124865c09c843cb913392fe242e1390d6a9
parent227f71995804fa5df3f917ae3a7b1499cd24726c
[clang][modules][deps] Parse "FW_Private" module map even after loading "FW" PCM

When Clang loads a PCM that depends on another PCM describing framework module "FW", `ModuleMap` registers "FW" as known, without seeing the module map that defines it (or the adjacent "FW_Private" module map). Later, when looking at a header from "FW_Private", `ModuleMap` returns early due to having knowledge about "FW" and never associates that header with "FW_Private", leading to it being treated as textual. This behavior is caused by D150292, where the scanner stops calling `HeaderSearch::lookupModule()` eagerly for every loaded PCM.

This patch skips an early check when trying to figure out the framework module for a header, which ensures the "FW" and (most importantly) "FW_Private" module maps can be parsed even after loading "FW" from a PCM. Note that the `HeaderSearch::loadModuleMapFile()` function we not call unconditionally has caching behavior of its own, meaning it will avoid parsing module map file repeatedly.

Depends on D150320.

Reviewed By: benlangmuir

Differential Revision: https://reviews.llvm.org/D150478
clang/include/clang/Driver/Options.td
clang/lib/Lex/HeaderSearch.cpp
clang/test/Modules/no-check-relocated-fw-private.c [new file with mode: 0644]