aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorJoseph Huber <jhuber6@vols.utk.edu>2020-10-07 14:13:14 -0400
committerJoseph Huber <jhuber6@vols.utk.edu>2020-10-08 08:20:38 -0400
commit6668e4cc685e74a17ebd386913e842ac3d7472e5 (patch)
tree18558bb87502f818b743226302315b98af19cf57 /clang/lib/Frontend/CompilerInvocation.cpp
parent5415fef3abefd666fc9209f8305f5e0b4103b5cf (diff)
downloadllvm-6668e4cc685e74a17ebd386913e842ac3d7472e5.zip
llvm-6668e4cc685e74a17ebd386913e842ac3d7472e5.tar.gz
llvm-6668e4cc685e74a17ebd386913e842ac3d7472e5.tar.bz2
[OpenMP] Add Error Handling for Conflicting Pointer Sizes for Target Offload
Summary: This patch adds an error to Clang that detects if OpenMP offloading is used between two architectures with incompatible pointer sizes. This ensures that the data mapping can be done correctly and solves an issue in code generation generating the wrong size pointer. Reviewer: jdoerfert Subscribers: cfe-commits delcypher guansong llvm-commits sstefan1 yaxunl Tags: #OpenMP #Clang Differential Revision: https://reviews.llvm.org/D88594
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp12
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);
}