aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Driver/Compilation.cpp
diff options
context:
space:
mode:
authorJonas Hahnfeld <hahnjo@hahnjo.de>2017-09-27 18:12:31 +0000
committerJonas Hahnfeld <hahnjo@hahnjo.de>2017-09-27 18:12:31 +0000
commit85f19958e9f51a3631fe94ac9c7cda725d03eb2c (patch)
treea27423f1ba264da47c7d2da7ad109082cd8d666d /clang/lib/Driver/Compilation.cpp
parentb9b18675193cd7410eae2cb5bebf3c2b93a3feaa (diff)
downloadllvm-85f19958e9f51a3631fe94ac9c7cda725d03eb2c.zip
llvm-85f19958e9f51a3631fe94ac9c7cda725d03eb2c.tar.gz
llvm-85f19958e9f51a3631fe94ac9c7cda725d03eb2c.tar.bz2
[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
Diffstat (limited to 'clang/lib/Driver/Compilation.cpp')
-rw-r--r--clang/lib/Driver/Compilation.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp
index bffcf70..fe2a181 100644
--- a/clang/lib/Driver/Compilation.cpp
+++ b/clang/lib/Driver/Compilation.cpp
@@ -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;