diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4810,7 +4810,7 @@ (isa(JA) || isa(JA) || isa(JA)); if (SplitDWARF) { - const char *SplitDWARFOut = SplitDebugName(Args, Input, Output); + const char *SplitDWARFOut = SplitDebugName(JA, Args, Input, Output); CmdArgs.push_back("-split-dwarf-file"); CmdArgs.push_back(SplitDWARFOut); if (DwarfFission == DwarfFissionKind::Split) { @@ -7047,7 +7047,7 @@ if (getDebugFissionKind(D, Args, A) == DwarfFissionKind::Split && T.isOSBinFormatELF()) { CmdArgs.push_back("-split-dwarf-output"); - CmdArgs.push_back(SplitDebugName(Args, Input, Output)); + CmdArgs.push_back(SplitDebugName(JA, Args, Input, Output)); } assert(Input.isFilename() && "Invalid input."); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -49,7 +49,7 @@ llvm::opt::ArgStringList &CmdArgs, const llvm::opt::ArgList &Args); -const char *SplitDebugName(const llvm::opt::ArgList &Args, +const char *SplitDebugName(const JobAction &JA, const llvm::opt::ArgList &Args, const InputInfo &Input, const InputInfo &Output); void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T, diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -902,15 +902,23 @@ return false; } -const char *tools::SplitDebugName(const ArgList &Args, const InputInfo &Input, +const char *tools::SplitDebugName(const JobAction &JA, const ArgList &Args, + const InputInfo &Input, const InputInfo &Output) { + // Adds '_' and GPU arch to the stem of .dwo file for HIP, which is + // expected by gdb. + auto AddPostfix = [JA](auto &F) { + if (JA.getOffloadingDeviceKind() == Action::OFK_HIP) + F += (Twine("_") + JA.getOffloadingArch()).str(); + }; if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ)) if (StringRef(A->getValue()) == "single") return Args.MakeArgString(Output.getFilename()); Arg *FinalOutput = Args.getLastArg(options::OPT_o); if (FinalOutput && Args.hasArg(options::OPT_c)) { - SmallString<128> T(FinalOutput->getValue()); + SmallString<128> T(llvm::sys::path::stem(FinalOutput->getValue())); + AddPostfix(T); llvm::sys::path::replace_extension(T, "dwo"); return Args.MakeArgString(T); } else { @@ -918,6 +926,7 @@ SmallString<128> T( Args.getLastArgValue(options::OPT_fdebug_compilation_dir)); SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput())); + AddPostfix(F); llvm::sys::path::replace_extension(F, "dwo"); T += F; return Args.MakeArgString(F); diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -939,7 +939,7 @@ if (Args.hasArg(options::OPT_gsplit_dwarf) && getToolChain().getTriple().isOSLinux()) SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, - SplitDebugName(Args, Inputs[0], Output)); + SplitDebugName(JA, Args, Inputs[0], Output)); } namespace { diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp b/clang/lib/Driver/ToolChains/MinGW.cpp --- a/clang/lib/Driver/ToolChains/MinGW.cpp +++ b/clang/lib/Driver/ToolChains/MinGW.cpp @@ -55,7 +55,7 @@ if (Args.hasArg(options::OPT_gsplit_dwarf)) SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, - SplitDebugName(Args, Inputs[0], Output)); + SplitDebugName(JA, Args, Inputs[0], Output)); } void tools::MinGW::Linker::AddLibGCC(const ArgList &Args, diff --git a/clang/test/Driver/hip-gsplit-dwarf-options.hip b/clang/test/Driver/hip-gsplit-dwarf-options.hip new file mode 100644 --- /dev/null +++ b/clang/test/Driver/hip-gsplit-dwarf-options.hip @@ -0,0 +1,25 @@ +// REQUIRES: zlib, clang-driver, amdgpu-registered-target + +// RUN: %clang -### -target x86_64-unknown-linux-gnu -c \ +// RUN: --offload-arch=gfx906:xnack+ %s -nogpulib -nogpuinc \ +// RUN: --offload-arch=gfx900 \ +// RUN: -ggdb -gsplit-dwarf 2>&1 | FileCheck %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu -c \ +// RUN: -fgpu-rdc --offload-arch=gfx906:xnack+ %s -nogpulib -nogpuinc \ +// RUN: --offload-arch=gfx900 \ +// RUN: -ggdb -gsplit-dwarf 2>&1 | FileCheck %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: --offload-arch=gfx906:xnack+ %s -nogpulib -nogpuinc \ +// RUN: --offload-arch=gfx900 \ +// RUN: -ggdb -gsplit-dwarf 2>&1 | FileCheck %s + +// RUN: %clang -### -target x86_64-unknown-linux-gnu \ +// RUN: -fgpu-rdc --offload-arch=gfx906:xnack+ %s -nogpulib -nogpuinc \ +// RUN: --offload-arch=gfx900 \ +// RUN: -ggdb -gsplit-dwarf 2>&1 | FileCheck %s + +// CHECK-DAG: {{".*clang.*".* "-target-cpu" "gfx906".* "-split-dwarf-output" "hip-gsplit-dwarf-options_gfx906:xnack\+.dwo"}} +// CHECK-DAG: {{".*clang.*".* "-target-cpu" "gfx900".* "-split-dwarf-output" "hip-gsplit-dwarf-options_gfx900.dwo"}} +// CHECK-DAG: {{".*clang.*".* "-target-cpu" "x86-64".* "-split-dwarf-output" "hip-gsplit-dwarf-options.dwo"}}