diff --git a/clang/lib/Driver/ToolChains/AMDGPU.h b/clang/lib/Driver/ToolChains/AMDGPU.h --- a/clang/lib/Driver/ToolChains/AMDGPU.h +++ b/clang/lib/Driver/ToolChains/AMDGPU.h @@ -90,6 +90,9 @@ /// Needed for translating LTO options. const char *getDefaultLinker() const override { return "ld.lld"; } + /// Should skip argument. + bool shouldSkipArgument(const llvm::opt::Arg *Arg) const; + protected: /// Translate -mcpu option containing target ID to cc1 options. /// Returns the GPU name. diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -427,8 +427,11 @@ if (!DAL) DAL = new DerivedArgList(Args.getBaseArgs()); - for (auto *A : Args) - DAL->append(A); + + for (Arg *A : Args) { + if (!shouldSkipArgument(A)) + DAL->append(A); + } if (!Args.getLastArgValue(options::OPT_x).equals("cl")) return DAL; @@ -644,3 +647,10 @@ CC1Args.push_back(LinkBitcodeFlag); CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile)); } + +bool AMDGPUToolChain::shouldSkipArgument(const llvm::opt::Arg *A) const { + Option O = A->getOption(); + if (O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) + return true; + return false; +} diff --git a/clang/lib/Driver/ToolChains/HIP.cpp b/clang/lib/Driver/ToolChains/HIP.cpp --- a/clang/lib/Driver/ToolChains/HIP.cpp +++ b/clang/lib/Driver/ToolChains/HIP.cpp @@ -341,7 +341,8 @@ const OptTable &Opts = getDriver().getOpts(); for (Arg *A : Args) { - DAL->append(A); + if (!shouldSkipArgument(A)) + DAL->append(A); } if (!BoundArch.empty()) { diff --git a/clang/test/Driver/hip-fpie-option.hip b/clang/test/Driver/hip-fpie-option.hip new file mode 100644 --- /dev/null +++ b/clang/test/Driver/hip-fpie-option.hip @@ -0,0 +1,38 @@ +// REQUIRES: clang-driver, amdgpu-registered-target + +// -fPIC and -fPIE only affects host relocation model. +// device compilation always uses PIC. + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-STATIC %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-STATIC %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIC \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIC %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIC \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIC %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIE \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: -fPIE \ +// RUN: 2>&1 | FileCheck -check-prefixes=DEV,HOST-PIE %s + +// DEV-DAG: {{".*clang.*".* "-triple" "amdgcn-amd-amdhsa".* "-mrelocation-model" "pic" "-pic-level" "[1|2]" "-mframe-pointer=all"}} +// HOST-STATIC-DAG: {{".*clang.*".* "-triple" "x86_64-unknown-linux-gnu".* "-mrelocation-model" "static"}} +// HOST-PIC-DAG: {{".*clang.*".* "-triple" "x86_64-unknown-linux-gnu".* "-mrelocation-model" "pic" "-pic-level" "2" "-mframe-pointer=all"}} +// HOST-PIE-DAG: {{".*clang.*".* "-triple" "x86_64-unknown-linux-gnu".* "-mrelocation-model" "pic" "-pic-level" "2" "-pic-is-pie"}} +// DEV-NOT: {{".*clang.*".* "-triple" "amdgcn-amd-amdhsa".* "-pic-is-pie"}}