[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-12-06 Thread LLVM Continuous Integration via cfe-commits

llvm-ci wrote:

LLVM Buildbot has detected a new failure on builder `clangd-ubuntu-tsan` 
running on `clangd-ubuntu-clang` while building `clang` at step 2 "checkout".

Full details are available at: 
https://lab.llvm.org/buildbot/#/builders/134/builds/9882


Here is the relevant piece of the build log for the reference

```
Step 2 (checkout) failure: update (failure)
git version 2.17.1
fatal: unable to access 'https://github.com/llvm/llvm-project.git/': Could not 
resolve host: github.com
fatal: unable to access 'https://github.com/llvm/llvm-project.git/': Could not 
resolve host: github.com

```



https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-12-06 Thread Alexey Bataev via cfe-commits

https://github.com/alexey-bataev closed 
https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-12-06 Thread Jefferson Le Quellec via cfe-commits

jle-quel wrote:

@MaskRay @alexey-bataev, if everything looks good now, could we go ahead and 
merge this PR? Thanks for your time reviewing!

https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-12-02 Thread Jefferson Le Quellec via cfe-commits


@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target 
-mcpu=pwr8 %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s
 
-// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target 
argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are 
unsupported
+// CHK-FOPENMP-TARGET-NESTED-ERROR_0: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring 
arguments are unsupported
+
+/// Check -Xopenmp-target= triggers error when an option requiring arguments 
is passed to it.
+// RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s
+
+// CHK-FOPENMP-TARGET-NESTED-ERROR_1: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu 
-Xopenmp-target', options requiring arguments are unsupported

jle-quel wrote:

Updated :+1: 

https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-12-02 Thread Jefferson Le Quellec via cfe-commits

https://github.com/jle-quel updated 
https://github.com/llvm/llvm-project/pull/115375

>From b85cc64cee1ac22f27c648ca8d892b40804f6d98 Mon Sep 17 00:00:00 2001
From: Jefferson Le Quellec 
Date: Thu, 7 Nov 2024 22:38:26 +0100
Subject: [PATCH 1/2] Fix OpenMP target-toolchain-option parser

---
 clang/lib/Driver/Driver.cpp|  6 ++
 clang/lib/Driver/ToolChain.cpp |  6 --
 clang/test/Driver/openmp-offload.c | 10 --
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 93e85f7dffe35a..a7e985195a3051 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4528,7 +4528,13 @@ Driver::getOffloadArchs(Compilation &C, const 
llvm::opt::DerivedArgList &Args,
 ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
   Arg->claim();
   unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
+  unsigned Prev = Index;
   ExtractedArg = getOpts().ParseOneArg(Args, Index);
+  if (!ExtractedArg || Index > Prev + 1) {
+TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< Arg->getAsString(Args);
+continue;
+  }
   Arg = ExtractedArg.get();
 }
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 646dbc0faf5a9f..188d2dc7e03e25 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1598,8 +1598,10 @@ llvm::opt::DerivedArgList 
*ToolChain::TranslateOpenMPTargetArgs(
 Prev = Index;
 std::unique_ptr XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
 if (!XOpenMPTargetArg || Index > Prev + 1) {
-  getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
-  << A->getAsString(Args);
+  if (!A->isClaimed()) {
+getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< A->getAsString(Args);
+  }
   continue;
 }
 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index eaed0d66df75cb..8c787cbc695335 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target 
-mcpu=pwr8 %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s
 
-// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target 
argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are 
unsupported
+// CHK-FOPENMP-TARGET-NESTED-ERROR_0: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring 
arguments are unsupported
+
+/// Check -Xopenmp-target= triggers error when an option requiring arguments 
is passed to it.
+// RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s
+
+// CHK-FOPENMP-TARGET-NESTED-ERROR_1: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu 
-Xopenmp-target', options requiring arguments are unsupported
 
 /// ###
 

>From 6d897f13c237ad174680973751c272c1b459487f Mon Sep 17 00:00:00 2001
From: Jefferson Le Quellec 
Date: Mon, 2 Dec 2024 16:32:32 +0100
Subject: [PATCH 2/2] Update tests to omit the string before 'error'

---
 clang/test/Driver/openmp-offload.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index 8c787cbc695335..caedc223a5c76f 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -86,13 +86,13 @@
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target 
-mcpu=pwr8 %s 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s
 
-// CHK-FOPENMP-TARGET-NESTED-ERROR_0: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring 
arguments are unsupported
+// CHK-FOPENMP-TARGET-NESTED-ERROR_0: error: invalid -Xopenmp-target argument: 
'-Xopenmp-target -Xopenmp-target', options requiring arguments are unsupported
 
 /// Check -Xopenmp-target= triggers error when an option requiring arguments 
is passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target

[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-29 Thread Fangrui Song via cfe-commits


@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target 
-mcpu=pwr8 %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s
 
-// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target 
argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are 
unsupported
+// CHK-FOPENMP-TARGET-NESTED-ERROR_0: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring 
arguments are unsupported
+
+/// Check -Xopenmp-target= triggers error when an option requiring arguments 
is passed to it.
+// RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s
+
+// CHK-FOPENMP-TARGET-NESTED-ERROR_1: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu 
-Xopenmp-target', options requiring arguments are unsupported

MaskRay wrote:

The convention is to omit the string before `error:`. Some tests are not 
consistent. You can fix them while modifying the tests

https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-29 Thread Fangrui Song via cfe-commits

https://github.com/MaskRay approved this pull request.


https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-29 Thread Alexey Bataev via cfe-commits

https://github.com/alexey-bataev approved this pull request.


https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-29 Thread Jefferson Le Quellec via cfe-commits

jle-quel wrote:

Ping @alexey-bataev @MaskRay 

https://github.com/llvm/llvm-project/pull/115375
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-18 Thread Jefferson Le Quellec via cfe-commits

https://github.com/jle-quel updated 
https://github.com/llvm/llvm-project/pull/115375

>From b85cc64cee1ac22f27c648ca8d892b40804f6d98 Mon Sep 17 00:00:00 2001
From: Jefferson Le Quellec 
Date: Thu, 7 Nov 2024 22:38:26 +0100
Subject: [PATCH] Fix OpenMP target-toolchain-option parser

---
 clang/lib/Driver/Driver.cpp|  6 ++
 clang/lib/Driver/ToolChain.cpp |  6 --
 clang/test/Driver/openmp-offload.c | 10 --
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 93e85f7dffe35a..a7e985195a3051 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4528,7 +4528,13 @@ Driver::getOffloadArchs(Compilation &C, const 
llvm::opt::DerivedArgList &Args,
 ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
   Arg->claim();
   unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
+  unsigned Prev = Index;
   ExtractedArg = getOpts().ParseOneArg(Args, Index);
+  if (!ExtractedArg || Index > Prev + 1) {
+TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< Arg->getAsString(Args);
+continue;
+  }
   Arg = ExtractedArg.get();
 }
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 646dbc0faf5a9f..188d2dc7e03e25 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1598,8 +1598,10 @@ llvm::opt::DerivedArgList 
*ToolChain::TranslateOpenMPTargetArgs(
 Prev = Index;
 std::unique_ptr XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
 if (!XOpenMPTargetArg || Index > Prev + 1) {
-  getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
-  << A->getAsString(Args);
+  if (!A->isClaimed()) {
+getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< A->getAsString(Args);
+  }
   continue;
 }
 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index eaed0d66df75cb..8c787cbc695335 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target 
-mcpu=pwr8 %s 2>&1 \
-// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR %s
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s
 
-// CHK-FOPENMP-TARGET-NESTED-ERROR: clang{{.*}} error: invalid -Xopenmp-target 
argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are 
unsupported
+// CHK-FOPENMP-TARGET-NESTED-ERROR_0: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring 
arguments are unsupported
+
+/// Check -Xopenmp-target= triggers error when an option requiring arguments 
is passed to it.
+// RUN:   not %clang -### -no-canonical-prefixes -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \
+// RUN:   | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s
+
+// CHK-FOPENMP-TARGET-NESTED-ERROR_1: clang{{.*}} error: invalid 
-Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu 
-Xopenmp-target', options requiring arguments are unsupported
 
 /// ###
 

___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-07 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Jefferson Le Quellec (jle-quel)


Changes

## Description

This PR fixes a segmentation fault that occurs when passing options requiring 
arguments via `-Xopenmp-target=`. The issue was that the function 
`Driver::getOffloadArchs` did not properly parse the extracted option, but 
instead assumed   it was valid, leading to a crash when incomplete arguments 
were provided.

## Backtrace

```sh
llvm-project/build/bin/clang++ main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o 
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and 
include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.  Program arguments: llvm-project/build/bin/clang++ main.cpp 
-fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o
1.  Compilation construction
2.  Building compilation actions
 #0 0x562fb21c363b 
llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
(llvm-project/build/bin/clang+++0x392f63b)
 #1 0x562fb21c0e3c SignalHandler(int) Signals.cpp:0:0
 #2 0x7fcbf6c81420 __restore_rt 
(/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x562fb1fa5d70 
llvm::opt::Option::matches(llvm::opt::OptSpecifier) const 
(llvm-project/build/bin/clang+++0x3711d70)
 #4 0x562fb2a78e7d 
clang::driver::Driver::getOffloadArchs(clang::driver::Compilation&, 
llvm::opt::DerivedArgList const&, clang::driver::Action::OffloadKind, 
clang::driver::ToolChain const*, bool) const 
(llvm-project/build/bin/clang+++0x41e4e7d)
 #5 0x562fb2a7a9aa 
clang::driver::Driver::BuildOffloadingActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, std::pair const&, clang::driver::Action*) const 
(.part.1164) Driver.cpp:0:0
 #6 0x562fb2a7c093 
clang::driver::Driver::BuildActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, 
llvm::SmallVector, 16u> const&, llvm::SmallVector&) const (llvm-project/build/bin/clang+++0x41e8093)
 #7 0x562fb2a8395d 
clang::driver::Driver::BuildCompilation(llvm::ArrayRef) 
(llvm-project/build/bin/clang+++0x41ef95d)
 #8 0x562faf92684c clang_main(int, char**, llvm::ToolContext 
const&) (llvm-project/build/bin/clang+++0x109284c)
 #9 0x562faf826cc6 main (llvm-project/build/bin/clang+++0xf92cc6)
#10 0x7fcbf6699083 __libc_start_main 
/build/glibc-LcI20x/glibc-2.31/csu/../csu/libc-start.c:342:3
#11 0x562faf923a5e _start (llvm-project/build/bin/clang+++0x108fa5e)
[1]2628042 segmentation fault (core dumped)   main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu  -o
```

---
Full diff: https://github.com/llvm/llvm-project/pull/115375.diff


3 Files Affected:

- (modified) clang/lib/Driver/Driver.cpp (+6) 
- (modified) clang/lib/Driver/ToolChain.cpp (+4-2) 
- (modified) clang/test/Driver/openmp-offload.c (+8-2) 


``diff
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 93e85f7dffe35a..a7e985195a3051 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4528,7 +4528,13 @@ Driver::getOffloadArchs(Compilation &C, const 
llvm::opt::DerivedArgList &Args,
 ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
   Arg->claim();
   unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
+  unsigned Prev = Index;
   ExtractedArg = getOpts().ParseOneArg(Args, Index);
+  if (!ExtractedArg || Index > Prev + 1) {
+TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< Arg->getAsString(Args);
+continue;
+  }
   Arg = ExtractedArg.get();
 }
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 646dbc0faf5a9f..188d2dc7e03e25 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1598,8 +1598,10 @@ llvm::opt::DerivedArgList 
*ToolChain::TranslateOpenMPTargetArgs(
 Prev = Index;
 std::unique_ptr XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
 if (!XOpenMPTargetArg || Index > Prev + 1) {
-  getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
-  << A->getAsString(Args);
+  if (!A->isClaimed()) {
+getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< A->getAsString(Args);
+  }
   continue;
 }
 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index eaed0d66df75cb..8c787cbc695335 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %cl

[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-07 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-driver

Author: Jefferson Le Quellec (jle-quel)


Changes

## Description

This PR fixes a segmentation fault that occurs when passing options requiring 
arguments via `-Xopenmp-target=`. The issue was that the function 
`Driver::getOffloadArchs` did not properly parse the extracted option, but 
instead assumed   it was valid, leading to a crash when incomplete arguments 
were provided.

## Backtrace

```sh
llvm-project/build/bin/clang++ main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o 
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and 
include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.  Program arguments: llvm-project/build/bin/clang++ main.cpp 
-fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o
1.  Compilation construction
2.  Building compilation actions
 #0 0x562fb21c363b 
llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
(llvm-project/build/bin/clang+++0x392f63b)
 #1 0x562fb21c0e3c SignalHandler(int) Signals.cpp:0:0
 #2 0x7fcbf6c81420 __restore_rt 
(/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x562fb1fa5d70 
llvm::opt::Option::matches(llvm::opt::OptSpecifier) const 
(llvm-project/build/bin/clang+++0x3711d70)
 #4 0x562fb2a78e7d 
clang::driver::Driver::getOffloadArchs(clang::driver::Compilation&, 
llvm::opt::DerivedArgList const&, clang::driver::Action::OffloadKind, 
clang::driver::ToolChain const*, bool) const 
(llvm-project/build/bin/clang+++0x41e4e7d)
 #5 0x562fb2a7a9aa 
clang::driver::Driver::BuildOffloadingActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, std::pair const&, clang::driver::Action*) const 
(.part.1164) Driver.cpp:0:0
 #6 0x562fb2a7c093 
clang::driver::Driver::BuildActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, 
llvm::SmallVector, 16u> const&, llvm::SmallVector&) const (llvm-project/build/bin/clang+++0x41e8093)
 #7 0x562fb2a8395d 
clang::driver::Driver::BuildCompilation(llvm::ArrayRef) 
(llvm-project/build/bin/clang+++0x41ef95d)
 #8 0x562faf92684c clang_main(int, char**, llvm::ToolContext 
const&) (llvm-project/build/bin/clang+++0x109284c)
 #9 0x562faf826cc6 main (llvm-project/build/bin/clang+++0xf92cc6)
#10 0x7fcbf6699083 __libc_start_main 
/build/glibc-LcI20x/glibc-2.31/csu/../csu/libc-start.c:342:3
#11 0x562faf923a5e _start (llvm-project/build/bin/clang+++0x108fa5e)
[1]2628042 segmentation fault (core dumped)   main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu  -o
```

---
Full diff: https://github.com/llvm/llvm-project/pull/115375.diff


3 Files Affected:

- (modified) clang/lib/Driver/Driver.cpp (+6) 
- (modified) clang/lib/Driver/ToolChain.cpp (+4-2) 
- (modified) clang/test/Driver/openmp-offload.c (+8-2) 


``diff
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 93e85f7dffe35a..a7e985195a3051 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4528,7 +4528,13 @@ Driver::getOffloadArchs(Compilation &C, const 
llvm::opt::DerivedArgList &Args,
 ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
   Arg->claim();
   unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
+  unsigned Prev = Index;
   ExtractedArg = getOpts().ParseOneArg(Args, Index);
+  if (!ExtractedArg || Index > Prev + 1) {
+TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< Arg->getAsString(Args);
+continue;
+  }
   Arg = ExtractedArg.get();
 }
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 646dbc0faf5a9f..188d2dc7e03e25 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1598,8 +1598,10 @@ llvm::opt::DerivedArgList 
*ToolChain::TranslateOpenMPTargetArgs(
 Prev = Index;
 std::unique_ptr XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
 if (!XOpenMPTargetArg || Index > Prev + 1) {
-  getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
-  << A->getAsString(Args);
+  if (!A->isClaimed()) {
+getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< A->getAsString(Args);
+  }
   continue;
 }
 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index eaed0d66df75cb..8c787cbc695335 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   

[clang] [Driver][OpenMP] Fix OpenMP target-toolchain-option parser (PR #115375)

2024-11-07 Thread Jefferson Le Quellec via cfe-commits

https://github.com/jle-quel created 
https://github.com/llvm/llvm-project/pull/115375

## Description

This PR fixes a segmentation fault that occurs when passing options requiring 
arguments via `-Xopenmp-target=`. The issue was that the function 
`Driver::getOffloadArchs` did not properly parse the extracted option, but 
instead assumed   it was valid, leading to a crash when incomplete arguments 
were provided.

## Backtrace

```sh
llvm-project/build/bin/clang++ main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o 
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and 
include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.  Program arguments: llvm-project/build/bin/clang++ main.cpp 
-fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu 
-Xopenmp-target=powerpc64le-ibm-linux-gnu -o
1.  Compilation construction
2.  Building compilation actions
 #0 0x562fb21c363b llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
(llvm-project/build/bin/clang+++0x392f63b)
 #1 0x562fb21c0e3c SignalHandler(int) Signals.cpp:0:0
 #2 0x7fcbf6c81420 __restore_rt 
(/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x562fb1fa5d70 llvm::opt::Option::matches(llvm::opt::OptSpecifier) 
const (llvm-project/build/bin/clang+++0x3711d70)
 #4 0x562fb2a78e7d 
clang::driver::Driver::getOffloadArchs(clang::driver::Compilation&, 
llvm::opt::DerivedArgList const&, clang::driver::Action::OffloadKind, 
clang::driver::ToolChain const*, bool) const 
(llvm-project/build/bin/clang+++0x41e4e7d)
 #5 0x562fb2a7a9aa 
clang::driver::Driver::BuildOffloadingActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, std::pair const&, clang::driver::Action*) const (.part.1164) Driver.cpp:0:0
 #6 0x562fb2a7c093 
clang::driver::Driver::BuildActions(clang::driver::Compilation&, 
llvm::opt::DerivedArgList&, 
llvm::SmallVector, 
16u> const&, llvm::SmallVector&) const 
(llvm-project/build/bin/clang+++0x41e8093)
 #7 0x562fb2a8395d 
clang::driver::Driver::BuildCompilation(llvm::ArrayRef) 
(llvm-project/build/bin/clang+++0x41ef95d)
 #8 0x562faf92684c clang_main(int, char**, llvm::ToolContext const&) 
(llvm-project/build/bin/clang+++0x109284c)
 #9 0x562faf826cc6 main (llvm-project/build/bin/clang+++0xf92cc6)
#10 0x7fcbf6699083 __libc_start_main 
/build/glibc-LcI20x/glibc-2.31/csu/../csu/libc-start.c:342:3
#11 0x562faf923a5e _start (llvm-project/build/bin/clang+++0x108fa5e)
[1]2628042 segmentation fault (core dumped)   main.cpp -fopenmp=libomp 
-fopenmp-targets=powerpc64le-ibm-linux-gnu  -o
```

>From b85cc64cee1ac22f27c648ca8d892b40804f6d98 Mon Sep 17 00:00:00 2001
From: Jefferson Le Quellec 
Date: Thu, 7 Nov 2024 22:38:26 +0100
Subject: [PATCH] Fix OpenMP target-toolchain-option parser

---
 clang/lib/Driver/Driver.cpp|  6 ++
 clang/lib/Driver/ToolChain.cpp |  6 --
 clang/test/Driver/openmp-offload.c | 10 --
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 93e85f7dffe35a..a7e985195a3051 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -4528,7 +4528,13 @@ Driver::getOffloadArchs(Compilation &C, const 
llvm::opt::DerivedArgList &Args,
 ToolChain::getOpenMPTriple(Arg->getValue(0)) == TC->getTriple()) {
   Arg->claim();
   unsigned Index = Args.getBaseArgs().MakeIndex(Arg->getValue(1));
+  unsigned Prev = Index;
   ExtractedArg = getOpts().ParseOneArg(Args, Index);
+  if (!ExtractedArg || Index > Prev + 1) {
+TC->getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< Arg->getAsString(Args);
+continue;
+  }
   Arg = ExtractedArg.get();
 }
 
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 646dbc0faf5a9f..188d2dc7e03e25 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -1598,8 +1598,10 @@ llvm::opt::DerivedArgList 
*ToolChain::TranslateOpenMPTargetArgs(
 Prev = Index;
 std::unique_ptr XOpenMPTargetArg(Opts.ParseOneArg(Args, Index));
 if (!XOpenMPTargetArg || Index > Prev + 1) {
-  getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
-  << A->getAsString(Args);
+  if (!A->isClaimed()) {
+getDriver().Diag(diag::err_drv_invalid_Xopenmp_target_with_args)
+<< A->getAsString(Args);
+  }
   continue;
 }
 if (XOpenMPTargetNoTriple && XOpenMPTargetArg &&
diff --git a/clang/test/Driver/openmp-offload.c 
b/clang/test/Driver/openmp-offload.c
index eaed0d66df75cb..8c787cbc695335 100644
--- a/clang/test/Driver/openmp-offload.c
+++ b/clang/test/Driver/openmp-offload.c
@@ -84,9 +84,15 @@
 
 /// Check -Xopenmp-target triggers error when an option requiring arguments is 
passed to it.
 // RUN:   not %clang -### -no-canonical-prefixes -