aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp38
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;
}