summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2015-11-21 00:35:38 +0000
committerTeresa Johnson <tejohnson@google.com>2015-11-21 00:35:38 +0000
commit9f474a019f3d5fab2de0c792fd7d6d902084c6b9 (patch)
tree66ce116dde810c1444eb27b2009fce3db70c9b56 /tools
parenteb9a1dc0690f7c01d54682abfbd7eb236465ae9d (diff)
llvm-link option and test for recent metadata mapping bug
Summary: Add a -preserve-modules option to llvm-link that simulates LTO clients that don't destroy modules as they are linked. This enables reproduction of a recent bug introduced by a metadata linking change that was only caught when the modules weren't destroyed before writing bitcode (LTO on Windows). See http://llvm.org/viewvc/llvm-project?view=revision&revision=253170 for more details on the original bug and the fix. Confirmed the new test added here reproduces the failure using the new option when I suppress the fix. Reviewers: pcc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14818 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253740 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-link/llvm-link.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp
index c539f75702b..ada55c93a6e 100644
--- a/tools/llvm-link/llvm-link.cpp
+++ b/tools/llvm-link/llvm-link.cpp
@@ -89,6 +89,10 @@ static cl::opt<bool>
SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"),
cl::init(false));
+static cl::opt<bool>
+ PreserveModules("preserve-modules",
+ cl::desc("Preserve linked modules for testing"));
+
static cl::opt<bool> PreserveBitcodeUseListOrder(
"preserve-bc-uselistorder",
cl::desc("Preserve use-list order when writing LLVM bitcode."),
@@ -259,6 +263,15 @@ static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L,
return false;
// All linker flags apply to linking of subsequent files.
ApplicableFlags = Flags;
+
+ // If requested for testing, preserve modules by releasing them from
+ // the unique_ptr before the are freed. This can help catch any
+ // cross-module references from e.g. unneeded metadata references
+ // that aren't properly set to null but instead mapped to the source
+ // module version. The bitcode writer will assert if it finds any such
+ // cross-module references.
+ if (PreserveModules)
+ M.release();
}
return true;