diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index b402f53..a1ad86e 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3191,6 +3191,15 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, // Get the OpenMP target triples if any. if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) { + enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit }; + auto getArchPtrSize = [](const llvm::Triple &T) { + if (T.isArch16Bit()) + return Arch16Bit; + if (T.isArch32Bit()) + return Arch32Bit; + assert(T.isArch64Bit() && "Expected 64-bit architecture"); + return Arch64Bit; + }; for (unsigned i = 0; i < A->getNumValues(); ++i) { llvm::Triple TT(A->getValue(i)); @@ -3206,6 +3215,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, TT.getArch() == llvm::Triple::x86 || TT.getArch() == llvm::Triple::x86_64)) Diags.Report(diag::err_drv_invalid_omp_target) << A->getValue(i); + else if (getArchPtrSize(T) != getArchPtrSize(TT)) + Diags.Report(diag::err_drv_incompatible_omp_arch) + << A->getValue(i) << T.str(); else Opts.OMPTargetTriples.push_back(TT); } |