Skip to content

[Offload] Do not pass -fcf-protection= for offloading #88402

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6867,8 +6867,14 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-nogpulib");

if (Arg *A = Args.getLastArg(options::OPT_fcf_protection_EQ)) {
CmdArgs.push_back(
Args.MakeArgString(Twine("-fcf-protection=") + A->getValue()));
// Do not pass this argument to the offloading device if the target does not
// support it.
// TODO: We need a better way to detect incompatible options for offloading.
if (JA.getOffloadingDeviceKind() == Action::OFK_None ||
(!TC.getTriple().isAMDGPU() && !TC.getTriple().isNVPTX() &&
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: I'd collapse negations into one:

!(TC.getTriple().isAMDGPU() || TC.getTriple().isNVPTX() || TC.getTriple().isSPIRV())

!TC.getTriple().isSPIRV()))
Comment on lines +6874 to +6875
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we avoid adding yet another one of these arbitrary architecture list cases

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean we could potentially just have some toolchain check like isToolchainGPU, but I don't know if that's exactly any better.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is 100% better

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1. We have grown too many offloading cases all over the place over time. It was fine when there was only CUDA/NVPTX, was sort of OK when AMDGPU got added, now it gets to be a bit too much.

CmdArgs.push_back(
Args.MakeArgString(Twine("-fcf-protection=") + A->getValue()));
}

if (Arg *A = Args.getLastArg(options::OPT_mfunction_return_EQ))
Expand Down
8 changes: 4 additions & 4 deletions clang/test/Driver/hip-options.hip
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@
// MLLVM-NOT: "-mllvm"{{.*}}"-amdgpu-early-inline-all=true"{{.*}}"-mllvm"{{.*}}"-amdgpu-early-inline-all=true"

// RUN: %clang -### -Xarch_device -g -nogpulib -nogpuinc --cuda-gpu-arch=gfx900 \
// RUN: -Xarch_device -fcf-protection=branch -Xarch_device -mllvm=--inline-threshold=100 \
// RUN: -Xarch_device -mllvm=--inline-threshold=100 \
// RUN: --cuda-gpu-arch=gfx906 %s 2>&1 | FileCheck -check-prefix=DEV %s
// DEV: "-cc1"{{.*}} "-fcuda-is-device" {{.*}} "-debug-info-kind={{.*}}" {{.*}} "-fcf-protection=branch" {{.*}}"-mllvm" "--inline-threshold=100"
// DEV: "-cc1"{{.*}} "-fcuda-is-device" {{.*}} "-debug-info-kind={{.*}}" {{.*}} "-fcf-protection=branch" {{.*}}"-mllvm" "--inline-threshold=100"
// DEV: "-cc1"{{.*}} "-fcuda-is-device" {{.*}} "-debug-info-kind={{.*}}"{{.*}}"-mllvm" "--inline-threshold=100"
// DEV: "-cc1"{{.*}} "-fcuda-is-device" {{.*}} "-debug-info-kind={{.*}}"{{.*}}"-mllvm" "--inline-threshold=100"
// DEV-NOT: clang{{.*}} {{.*}} "-debug-info-kind={{.*}}"

// RUN: %clang -### -Xarch_host -g -nogpulib -nogpuinc --cuda-gpu-arch=gfx900 \
Expand Down Expand Up @@ -244,4 +244,4 @@
// RUN: 2>&1 | FileCheck -check-prefix=NO-WARN-ATOMIC %s
// NO-WARN-ATOMIC: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" {{.*}} "-Werror=atomic-alignment" {{.*}} "-Wno-error=atomic-alignment"
// NO-WARN-ATOMIC-NOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-Werror=atomic-alignment"
// NO-WARN-ATOMIC-NOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-Wno-error=atomic-alignment"
// NO-WARN-ATOMIC-NOT: clang{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-Wno-error=atomic-alignment"
39 changes: 39 additions & 0 deletions clang/test/Driver/offload-no-fcf-protection.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Check that -fcf-protection does not get passed to the device-side
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We also have unsupported-option-gpu.c to test various ignored options for GPU.

// compilation.

// RUN: %clang -### -x cuda --target=x86_64-unknown-linux-gnu -nogpulib \
// RUN: -nogpuinc --offload-arch=sm_52 -fcf-protection=full -c %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=CUDA

// CUDA: "-cc1" "-triple" "nvptx64-nvidia-cuda"
// CUDA-NOT: "-fcf-protection=full"
// CUDA: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
// CUDA: "-fcf-protection=full"

// RUN: %clang -### -x hip --target=x86_64-unknown-linux-gnu -nogpulib \
// RUN: -nogpuinc --offload-arch=gfx90a -fcf-protection=full -c %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=HIP

// HIP: "-cc1" "-triple" "amdgcn-amd-amdhsa"
// HIP-NOT: "-fcf-protection=full"
// HIP: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
// HIP: "-fcf-protection=full"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you check explicitly passing this through to the device?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know how that would be possible. We have options like -Xarch_device, but those are stripped by the time we create the synthetic arguments that make it to the tool builder. Potentially we could do this logic where we build the args and just prevent the offloading toolchain from seeing it at all?

// RUN: %clang -### -x c --target=x86_64-unknown-linux-gnu -nogpulib -fopenmp=libomp \
// RUN: -nogpuinc --offload-arch=gfx90a -fcf-protection=full -c %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=OMP

// OMP: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
// OMP: "-fcf-protection=full"
// OMP: "-cc1" "-triple" "amdgcn-amd-amdhsa"
// OMP-NOT: "-fcf-protection=full"
// OMP: "-cc1" "-triple" "x86_64-unknown-linux-gnu"
// OMP: "-fcf-protection=full"

// RUN: %clang -### -x c --target=nvptx64-nvidia-cuda -nogpulib -nogpuinc \
// RUN: -march=sm_52 -fcf-protection=full -c %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=DIRECT
// RUN: %clang -### -x c --target=amdgcn-amd-amdhsa -nogpulib -nogpuinc \
// RUN: -mcpu=gfx90a -fcf-protection=full -c %s 2>&1 \
// RUN: | FileCheck %s --check-prefix=DIRECT
// DIRECT: "-fcf-protection=full"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing spirv run lines