|
30 | 30 | using namespace swift;
|
31 | 31 | using namespace options;
|
32 | 32 |
|
| 33 | +enum class CxxCompatMode { |
| 34 | + invalid, |
| 35 | + enabled, |
| 36 | + off |
| 37 | +}; |
| 38 | + |
| 39 | +static std::pair<CxxCompatMode, version::Version> |
| 40 | +validateCxxInteropCompatibilityMode(StringRef mode) { |
| 41 | + if (mode == "off") |
| 42 | + return {CxxCompatMode::off, {}}; |
| 43 | + if (mode == "default") |
| 44 | + return {CxxCompatMode::enabled, {}}; |
| 45 | + if (mode == "upcoming-swift") |
| 46 | + return {CxxCompatMode::enabled, |
| 47 | + version::Version({version::getUpcomingCxxInteropCompatVersion()})}; |
| 48 | + if (mode == "swift-6") |
| 49 | + return {CxxCompatMode::enabled, version::Version({6})}; |
| 50 | + // Swift-5.9 corresponds to the Swift 5 language mode when |
| 51 | + // Swift 5 is the default language version. |
| 52 | + if (mode == "swift-5.9") |
| 53 | + return {CxxCompatMode::enabled, version::Version({5})}; |
| 54 | + // Note: If this is updated, corresponding code in |
| 55 | + // InterfaceSubContextDelegateImpl::InterfaceSubContextDelegateImpl needs |
| 56 | + // to be updated also. |
| 57 | + return {CxxCompatMode::invalid, {}}; |
| 58 | +} |
| 59 | + |
| 60 | +static void diagnoseCxxInteropCompatMode(llvm::opt::Arg *verArg, |
| 61 | + llvm::opt::InputArgList &Args, |
| 62 | + DiagnosticEngine &diags) { |
| 63 | + // General invalid argument error |
| 64 | + diags.diagnose(SourceLoc(), diag::error_invalid_arg_value, |
| 65 | + verArg->getAsString(Args), verArg->getValue()); |
| 66 | + |
| 67 | + // Note valid C++ interoperability modes. |
| 68 | + auto validVers = {llvm::StringRef("off"), llvm::StringRef("default"), |
| 69 | + llvm::StringRef("swift-6"), llvm::StringRef("swift-5.9")}; |
| 70 | + auto versStr = "'" + llvm::join(validVers, "', '") + "'"; |
| 71 | + diags.diagnose(SourceLoc(), diag::valid_cxx_interop_modes, versStr); |
| 72 | +} |
| 73 | + |
33 | 74 | int swift_symbolgraph_extract_main(ArrayRef<const char *> Args,
|
34 | 75 | const char *Argv0, void *MainAddr) {
|
| 76 | + printf("hello rauhul\n"); |
35 | 77 | INITIALIZE_LLVM();
|
36 | 78 |
|
37 | 79 | CompilerInvocation Invocation;
|
@@ -196,6 +238,23 @@ int swift_symbolgraph_extract_main(ArrayRef<const char *> Args,
|
196 | 238 | .Default(AccessLevel::Public);
|
197 | 239 | }
|
198 | 240 |
|
| 241 | + LangOptions& LangOpts = Invocation.getLangOptions(); |
| 242 | + if (auto *A = ParsedArgs.getLastArg(OPT_cxx_interoperability_mode)) { |
| 243 | + auto interopCompatMode = validateCxxInteropCompatibilityMode(A->getValue()); |
| 244 | + LangOpts.EnableCXXInterop |= |
| 245 | + (interopCompatMode.first == CxxCompatMode::enabled); |
| 246 | + if (LangOpts.EnableCXXInterop) { |
| 247 | + LangOpts.cxxInteropCompatVersion = interopCompatMode.second; |
| 248 | + // The default is tied to the current language version. |
| 249 | + if (LangOpts.cxxInteropCompatVersion.empty()) |
| 250 | + LangOpts.cxxInteropCompatVersion = |
| 251 | + LangOpts.EffectiveLanguageVersion.asMajorVersion(); |
| 252 | + } |
| 253 | + |
| 254 | + if (interopCompatMode.first == CxxCompatMode::invalid) |
| 255 | + diagnoseCxxInteropCompatMode(A, ParsedArgs, Diags); |
| 256 | + } |
| 257 | + |
199 | 258 | std::string InstanceSetupError;
|
200 | 259 | if (CI.setup(Invocation, InstanceSetupError)) {
|
201 | 260 | llvm::outs() << InstanceSetupError << '\n';
|
|
0 commit comments