diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index f366e90..d8916a6 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3679,6 +3679,22 @@ static StringRef GetInputKindName(InputKind IK) { llvm_unreachable("unknown input language"); } +static StringRef getExceptionHandlingName(unsigned EHK) { + switch (static_cast<LangOptions::ExceptionHandlingKind>(EHK)) { + case LangOptions::ExceptionHandlingKind::None: + default: + return "none"; + case LangOptions::ExceptionHandlingKind::SjLj: + return "sjlj"; + case LangOptions::ExceptionHandlingKind::DwarfCFI: + return "dwarf"; + case LangOptions::ExceptionHandlingKind::Wasm: + return "wasm"; + } + + llvm_unreachable("covered switch"); +} + void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, ArgumentConsumer Consumer, const llvm::Triple &T, @@ -3694,6 +3710,10 @@ void CompilerInvocationBase::GenerateLangArgs(const LangOptions &Opts, GenerateArg(Consumer, OPT_pic_is_pie); for (StringRef Sanitizer : serializeSanitizerKinds(Opts.Sanitize)) GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer); + if (Opts.ExceptionHandling) { + GenerateArg(Consumer, OPT_exception_model, + getExceptionHandlingName(Opts.ExceptionHandling)); + } return; } @@ -4002,6 +4022,24 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ), Diags, Opts.Sanitize); + if (const Arg *A = Args.getLastArg(options::OPT_exception_model)) { + std::optional<LangOptions::ExceptionHandlingKind> EMValue = + llvm::StringSwitch<std::optional<LangOptions::ExceptionHandlingKind>>( + A->getValue()) + .Case("dwarf", LangOptions::ExceptionHandlingKind::DwarfCFI) + .Case("sjlj", LangOptions::ExceptionHandlingKind::SjLj) + .Case("wineh", LangOptions::ExceptionHandlingKind::WinEH) + .Case("wasm", LangOptions::ExceptionHandlingKind::Wasm) + .Case("none", LangOptions::ExceptionHandlingKind::None) + .Default(std::nullopt); + if (EMValue) { + Opts.ExceptionHandling = static_cast<unsigned>(*EMValue); + } else { + Diags.Report(diag::err_drv_invalid_value) + << A->getAsString(Args) << A->getValue(); + } + } + return Diags.getNumErrors() == NumErrorsBefore; } |