[OpenMP] Fix memory leak when translating arguments

Parsing the argument after -Xopenmp-target allocates memory that needs
to be freed. Associate it with the final DerivedArgList after we know
which one will be used.

Differential Revision: https://reviews.llvm.org/D38257

llvm-svn: 314328
This commit is contained in:
Jonas Hahnfeld 2017-09-27 18:12:31 +00:00
parent b9b1867519
commit 85f19958e9
4 changed files with 17 additions and 11 deletions

View File

@ -249,9 +249,10 @@ public:
///
/// \param DeviceOffloadKind - The device offload kind used for the
/// translation.
virtual llvm::opt::DerivedArgList *
TranslateOpenMPTargetArgs(const llvm::opt::DerivedArgList &Args,
Action::OffloadKind DeviceOffloadKind) const;
virtual llvm::opt::DerivedArgList *TranslateOpenMPTargetArgs(
const llvm::opt::DerivedArgList &Args,
Action::OffloadKind DeviceOffloadKind,
SmallVector<llvm::opt::Arg *, 4> &AllocatedArgs) const;
/// Choose a tool to use to handle the action \p JA.
///

View File

@ -51,9 +51,10 @@ Compilation::getArgsForToolChain(const ToolChain *TC, StringRef BoundArch,
DerivedArgList *&Entry = TCArgs[{TC, BoundArch, DeviceOffloadKind}];
if (!Entry) {
SmallVector<Arg *, 4> AllocatedArgs;
// Translate OpenMP toolchain arguments provided via the -Xopenmp-target flags.
DerivedArgList *OpenMPArgs = TC->TranslateOpenMPTargetArgs(*TranslatedArgs,
DeviceOffloadKind);
DerivedArgList *OpenMPArgs = TC->TranslateOpenMPTargetArgs(
*TranslatedArgs, DeviceOffloadKind, AllocatedArgs);
if (!OpenMPArgs) {
Entry = TC->TranslateArgs(*TranslatedArgs, BoundArch, DeviceOffloadKind);
} else {
@ -63,6 +64,11 @@ Compilation::getArgsForToolChain(const ToolChain *TC, StringRef BoundArch,
if (!Entry)
Entry = TranslatedArgs;
// Add allocated arguments to the final DAL.
for (auto ArgPtr : AllocatedArgs) {
Entry->AddSynthesizedArg(ArgPtr);
}
}
return *Entry;

View File

@ -800,9 +800,10 @@ ToolChain::computeMSVCVersion(const Driver *D,
return VersionTuple();
}
llvm::opt::DerivedArgList *
ToolChain::TranslateOpenMPTargetArgs(const llvm::opt::DerivedArgList &Args,
Action::OffloadKind DeviceOffloadKind) const {
llvm::opt::DerivedArgList *ToolChain::TranslateOpenMPTargetArgs(
const llvm::opt::DerivedArgList &Args,
Action::OffloadKind DeviceOffloadKind,
SmallVector<llvm::opt::Arg *, 4> &AllocatedArgs) const {
if (DeviceOffloadKind == Action::OFK_OpenMP) {
DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
const OptTable &Opts = getDriver().getOpts();
@ -854,6 +855,7 @@ ToolChain::TranslateOpenMPTargetArgs(const llvm::opt::DerivedArgList &Args,
}
XOpenMPTargetArg->setBaseArg(A);
A = XOpenMPTargetArg.release();
AllocatedArgs.push_back(A);
DAL->append(A);
NewArgAdded = true;
}

View File

@ -2,9 +2,6 @@
/// Perform several driver tests for OpenMP offloading
///
// Until this test is stabilized on all local configurations.
// UNSUPPORTED: linux
// REQUIRES: clang-driver
// REQUIRES: x86-registered-target
// REQUIRES: powerpc-registered-target