[PATCH] D111543: [clang][modules] Delay creating `IdentifierInfo` for names of explicit modules
Jan Svoboda via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 18 02:50:50 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa2d805c020a1: [clang][modules] Delay creating `IdentifierInfo` for names of explicit modules (authored by jansvoboda11).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D111543/new/
https://reviews.llvm.org/D111543
Files:
clang/lib/Frontend/CompilerInstance.cpp
clang/test/Modules/Inputs/module-name-used-by-objc-bridge/Interface.h
clang/test/Modules/Inputs/module-name-used-by-objc-bridge/InterfaceBridge.h
clang/test/Modules/Inputs/module-name-used-by-objc-bridge/module.modulemap
clang/test/Modules/module-name-used-by-objc-bridge.m
Index: clang/test/Modules/module-name-used-by-objc-bridge.m
===================================================================
--- /dev/null
+++ clang/test/Modules/module-name-used-by-objc-bridge.m
@@ -0,0 +1,25 @@
+// RUN: rm -rf %t && mkdir %t
+
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-name=InterfaceBridge \
+// RUN: %S/Inputs/module-name-used-by-objc-bridge/module.modulemap -o %t/InterfaceBridge.pcm
+
+// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-name=Interface \
+// RUN: %S/Inputs/module-name-used-by-objc-bridge/module.modulemap -o %t/Interface.pcm
+
+// Check that the `-fmodule-file=<name>=<path>` form succeeds:
+// RUN: %clang_cc1 -fmodules -fsyntax-only %s -I %S/Inputs/module-name-used-by-objc-bridge \
+// RUN: -fmodule-file=InterfaceBridge=%t/InterfaceBridge.pcm -fmodule-file=Interface=%t/Interface.pcm \
+// RUN: -fmodule-map-file=%S/Inputs/module-name-used-by-objc-bridge/module.modulemap -verify
+
+// Check that the `-fmodule-file=<path>` form succeeds:
+// RUN: %clang_cc1 -fmodules -fsyntax-only %s -I %S/Inputs/module-name-used-by-objc-bridge \
+// RUN: -fmodule-file=%t/InterfaceBridge.pcm -fmodule-file=%t/Interface.pcm \
+// RUN: -fmodule-map-file=%S/Inputs/module-name-used-by-objc-bridge/module.modulemap -verify
+
+#import "InterfaceBridge.h"
+#import "Interface.h"
+
+ at interface Interface (User)
+ at end
+
+// expected-no-diagnostics
Index: clang/test/Modules/Inputs/module-name-used-by-objc-bridge/module.modulemap
===================================================================
--- /dev/null
+++ clang/test/Modules/Inputs/module-name-used-by-objc-bridge/module.modulemap
@@ -0,0 +1,7 @@
+module InterfaceBridge {
+ header "InterfaceBridge.h"
+}
+
+module Interface {
+ header "Interface.h"
+}
Index: clang/test/Modules/Inputs/module-name-used-by-objc-bridge/InterfaceBridge.h
===================================================================
--- /dev/null
+++ clang/test/Modules/Inputs/module-name-used-by-objc-bridge/InterfaceBridge.h
@@ -0,0 +1 @@
+typedef struct __attribute__((objc_bridge(Interface))) Foo *Bar;
Index: clang/test/Modules/Inputs/module-name-used-by-objc-bridge/Interface.h
===================================================================
--- /dev/null
+++ clang/test/Modules/Inputs/module-name-used-by-objc-bridge/Interface.h
@@ -0,0 +1,2 @@
+ at interface Interface
+ at end
Index: clang/lib/Frontend/CompilerInstance.cpp
===================================================================
--- clang/lib/Frontend/CompilerInstance.cpp
+++ clang/lib/Frontend/CompilerInstance.cpp
@@ -565,25 +565,28 @@
// the files we were handed.
struct ReadModuleNames : ASTReaderListener {
Preprocessor &PP;
- llvm::SmallVector<IdentifierInfo*, 8> LoadedModules;
+ llvm::SmallVector<std::string, 8> LoadedModules;
ReadModuleNames(Preprocessor &PP) : PP(PP) {}
void ReadModuleName(StringRef ModuleName) override {
- LoadedModules.push_back(PP.getIdentifierInfo(ModuleName));
+ // Keep the module name as a string for now. It's not safe to create a new
+ // IdentifierInfo from an ASTReader callback.
+ LoadedModules.push_back(ModuleName.str());
}
void registerAll() {
ModuleMap &MM = PP.getHeaderSearchInfo().getModuleMap();
- for (auto *II : LoadedModules)
- MM.cacheModuleLoad(*II, MM.findModule(II->getName()));
+ for (const std::string &LoadedModule : LoadedModules)
+ MM.cacheModuleLoad(*PP.getIdentifierInfo(LoadedModule),
+ MM.findModule(LoadedModule));
LoadedModules.clear();
}
void markAllUnavailable() {
- for (auto *II : LoadedModules) {
+ for (const std::string &LoadedModule : LoadedModules) {
if (Module *M = PP.getHeaderSearchInfo().getModuleMap().findModule(
- II->getName())) {
+ LoadedModule)) {
M->HasIncompatibleModuleFile = true;
// Mark module as available if the only reason it was unavailable
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D111543.380321.patch
Type: text/x-patch
Size: 3973 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211018/081f558e/attachment.bin>
More information about the cfe-commits
mailing list