recommit [HIP] Fix -gsplit-dwarf option

recommit e50465ecef with fix for
regression in lldb tests.

Two issues:

1. the directory part of original .dwo file was dropped
2. if the stem of the .dwo file contains '.', the last dot
and strings after that were removed

This recommit fixes those two issues.
This commit is contained in:
Yaxun (Sam) Liu 2020-09-14 14:21:30 -04:00
parent c2deacd929
commit e6d50b4f22
6 changed files with 41 additions and 8 deletions

View File

@ -4810,7 +4810,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
(isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
isa<BackendJobAction>(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 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
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.");

View File

@ -902,8 +902,14 @@ bool tools::areOptimizationsEnabled(const ArgList &Args) {
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) {
auto AddPostfix = [JA](auto &F) {
if (JA.getOffloadingDeviceKind() == Action::OFK_HIP)
F += (Twine("_") + JA.getOffloadingArch()).str();
F += ".dwo";
};
if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
if (StringRef(A->getValue()) == "single")
return Args.MakeArgString(Output.getFilename());
@ -911,14 +917,16 @@ const char *tools::SplitDebugName(const ArgList &Args, const InputInfo &Input,
Arg *FinalOutput = Args.getLastArg(options::OPT_o);
if (FinalOutput && Args.hasArg(options::OPT_c)) {
SmallString<128> T(FinalOutput->getValue());
llvm::sys::path::replace_extension(T, "dwo");
llvm::sys::path::remove_filename(T);
T += llvm::sys::path::stem(FinalOutput->getValue());
AddPostfix(T);
return Args.MakeArgString(T);
} else {
// Use the compilation dir.
SmallString<128> T(
Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
llvm::sys::path::replace_extension(F, "dwo");
AddPostfix(F);
T += F;
return Args.MakeArgString(F);
}

View File

@ -49,7 +49,7 @@ void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
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,

View File

@ -939,7 +939,7 @@ void tools::gnutools::Assembler::ConstructJob(Compilation &C,
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 {

View File

@ -55,7 +55,7 @@ void tools::MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
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,

View File

@ -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"}}