@@ -1267,16 +1267,31 @@ void swift::serialization::diagnoseSerializedASTLoadFailureTransitive(
1267
1267
}
1268
1268
}
1269
1269
1270
+ static std::optional<StringRef> getFlagsFromInterfaceFile (StringRef buffer,
1271
+ StringRef prefix) {
1272
+ StringRef line;
1273
+ unsigned lineCount = 0 ;
1274
+ const unsigned maxLine = 10 ;
1275
+ while (!buffer.empty ()) {
1276
+ std::tie (line, buffer) = buffer.split (' \n ' );
1277
+ if (line.consume_front (prefix))
1278
+ return line;
1279
+
1280
+ if (++lineCount > maxLine)
1281
+ return std::nullopt;
1282
+ }
1283
+
1284
+ return std::nullopt;
1285
+ }
1286
+
1270
1287
bool swift::extractCompilerFlagsFromInterface (StringRef interfacePath,
1271
1288
StringRef buffer,
1272
1289
llvm::StringSaver &ArgSaver,
1273
1290
SmallVectorImpl<const char *> &SubArgs) {
1274
- SmallVector<StringRef, 1 > FlagMatches;
1275
- auto FlagRe = llvm::Regex (" ^// swift-module-flags:(.*)$" , llvm::Regex::Newline);
1276
- if (!FlagRe.match (buffer, &FlagMatches))
1291
+ auto FlagMatch = getFlagsFromInterfaceFile (buffer, " // swift-module-flags:" );
1292
+ if (!FlagMatch)
1277
1293
return true ;
1278
- assert (FlagMatches.size () == 2 );
1279
- llvm::cl::TokenizeGNUCommandLine (FlagMatches[1 ], ArgSaver, SubArgs);
1294
+ llvm::cl::TokenizeGNUCommandLine (*FlagMatch, ArgSaver, SubArgs);
1280
1295
1281
1296
auto intFileName = llvm::sys::path::filename (interfacePath);
1282
1297
@@ -1300,28 +1315,22 @@ bool swift::extractCompilerFlagsFromInterface(StringRef interfacePath,
1300
1315
}
1301
1316
}
1302
1317
1303
- SmallVector<StringRef, 1 > IgnFlagMatches;
1304
- // Cherry-pick supported options from the ignorable list.
1305
- auto IgnFlagRe = llvm::Regex (" ^// swift-module-flags-ignorable:(.*)$" ,
1306
- llvm::Regex::Newline);
1307
- auto hasIgnorableFlags = IgnFlagRe.match (buffer, &IgnFlagMatches);
1308
-
1309
- // Check for ignorable-private flags
1310
- SmallVector<StringRef, 1 > IgnPrivateFlagMatches;
1311
- auto IgnPrivateFlagRe = llvm::Regex (" ^// swift-module-flags-ignorable-private:(.*)$" ,
1312
- llvm::Regex::Newline);
1313
- auto hasIgnorablePrivateFlags = IgnPrivateFlagRe.match (buffer, &IgnPrivateFlagMatches);
1318
+ auto IgnFlagMatch =
1319
+ getFlagsFromInterfaceFile (buffer, " // swift-module-flags-ignorable:" );
1320
+ auto IgnPrivateFlagMatch = getFlagsFromInterfaceFile (
1321
+ buffer, " // swift-module-flags-ignorable-private:" );
1314
1322
1315
1323
// It's OK the interface doesn't have the ignorable list (private or not), we just
1316
1324
// ignore them all.
1317
- if (!hasIgnorableFlags && !hasIgnorablePrivateFlags )
1325
+ if (!IgnFlagMatch && !IgnPrivateFlagMatch )
1318
1326
return false ;
1319
1327
1320
1328
SmallVector<const char *, 8 > IgnSubArgs;
1321
- if (hasIgnorableFlags)
1322
- llvm::cl::TokenizeGNUCommandLine (IgnFlagMatches[1 ], ArgSaver, IgnSubArgs);
1323
- if (hasIgnorablePrivateFlags)
1324
- llvm::cl::TokenizeGNUCommandLine (IgnPrivateFlagMatches[1 ], ArgSaver, IgnSubArgs);
1329
+ if (IgnFlagMatch)
1330
+ llvm::cl::TokenizeGNUCommandLine (*IgnFlagMatch, ArgSaver, IgnSubArgs);
1331
+ if (IgnPrivateFlagMatch)
1332
+ llvm::cl::TokenizeGNUCommandLine (*IgnPrivateFlagMatch, ArgSaver,
1333
+ IgnSubArgs);
1325
1334
1326
1335
std::unique_ptr<llvm::opt::OptTable> table = swift::createSwiftOptTable ();
1327
1336
unsigned missingArgIdx = 0 ;
0 commit comments