mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-16 19:16:05 +00:00
[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:
parent
b9b1867519
commit
85f19958e9
@ -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.
|
||||
///
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user