@@ -101,6 +101,13 @@ static llvm::Optional<Path> getGlibcModuleMapPath(
101
101
/* isArchSpecific*/ true , vfs);
102
102
}
103
103
104
+ static llvm::Optional<Path> getWASILibcModuleMapPath (
105
+ SearchPathOptions &Opts, const llvm::Triple &triple,
106
+ const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs) {
107
+ return getActualModuleMapPath (" wasi-libc.modulemap" , Opts, triple,
108
+ /* isArchSpecific*/ true , vfs);
109
+ }
110
+
104
111
static llvm::Optional<Path> getLibStdCxxModuleMapPath (
105
112
SearchPathOptions &opts, const llvm::Triple &triple,
106
113
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs) {
@@ -195,11 +202,32 @@ static bool shouldInjectGlibcModulemap(const llvm::Triple &triple) {
195
202
triple.isAndroid ();
196
203
}
197
204
205
+ static bool shouldInjectWASILibcModulemap (const llvm::Triple &triple) {
206
+ return triple.isOSWASI ();
207
+ }
208
+
198
209
static SmallVector<std::pair<std::string, std::string>, 2 > getGlibcFileMapping (
199
210
ASTContext &ctx,
200
211
const llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> &vfs) {
201
212
const llvm::Triple &triple = ctx.LangOpts .Target ;
202
- if (!shouldInjectGlibcModulemap (triple))
213
+
214
+ std::string auxiliaryHeaderName;
215
+ llvm::Optional<Path> maybeActualModuleMapPath;
216
+ if (shouldInjectGlibcModulemap (triple)) {
217
+ auxiliaryHeaderName = " SwiftGlibc.h" ;
218
+ maybeActualModuleMapPath = getGlibcModuleMapPath (ctx.SearchPathOpts , triple, vfs);
219
+ } else if (shouldInjectWASILibcModulemap (triple)) {
220
+ auxiliaryHeaderName = " SwiftWASILibc.h" ;
221
+ maybeActualModuleMapPath = getWASILibcModuleMapPath (ctx.SearchPathOpts , triple, vfs);
222
+ } else {
223
+ return {};
224
+ }
225
+
226
+ Path actualModuleMapPath;
227
+ if (auto path = maybeActualModuleMapPath)
228
+ actualModuleMapPath = path.value ();
229
+ else
230
+ // FIXME: Emit a warning of some kind.
203
231
return {};
204
232
205
233
// Extract the Glibc path from Clang driver.
@@ -225,24 +253,17 @@ static SmallVector<std::pair<std::string, std::string>, 2> getGlibcFileMapping(
225
253
return {};
226
254
}
227
255
228
- Path actualModuleMapPath;
229
- if (auto path = getGlibcModuleMapPath (ctx.SearchPathOpts , triple, vfs))
230
- actualModuleMapPath = path.value ();
231
- else
232
- // FIXME: Emit a warning of some kind.
233
- return {};
234
-
235
256
// TODO: remove the SwiftGlibc.h header and reference all Glibc headers
236
257
// directly from the modulemap.
237
258
Path actualHeaderPath = actualModuleMapPath;
238
259
llvm::sys::path::remove_filename (actualHeaderPath);
239
- llvm::sys::path::append (actualHeaderPath, " SwiftGlibc.h " );
260
+ llvm::sys::path::append (actualHeaderPath, auxiliaryHeaderName );
240
261
241
262
Path injectedModuleMapPath (glibcDir);
242
263
llvm::sys::path::append (injectedModuleMapPath, " module.modulemap" );
243
264
244
265
Path injectedHeaderPath (glibcDir);
245
- llvm::sys::path::append (injectedHeaderPath, " SwiftGlibc.h " );
266
+ llvm::sys::path::append (injectedHeaderPath, auxiliaryHeaderName );
246
267
247
268
return {
248
269
{std::string (injectedModuleMapPath), std::string (actualModuleMapPath)},
0 commit comments