[llvm-link] Fix crash when materializing appending global
authorSergey Dmitriev <serguei.n.dmitriev@intel.com>
Tue, 26 Jan 2021 02:07:23 +0000 (18:07 -0800)
committerSergey Dmitriev <serguei.n.dmitriev@intel.com>
Tue, 26 Jan 2021 02:08:07 +0000 (18:08 -0800)
This patch fixes llvm-link crash when materializing global variable
with appending linkage and initializer that depends on another
global with appending linkage.

Reviewed By: tra

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

llvm/lib/Transforms/Utils/ValueMapper.cpp
llvm/test/Linker/appending-global-crash.ll [new file with mode: 0644]

index 8ab272e..930e0b7 100644 (file)
@@ -819,11 +819,15 @@ void Mapper::flush() {
       break;
     case WorklistEntry::MapAppendingVar: {
       unsigned PrefixSize = AppendingInits.size() - E.AppendingGVNumNewMembers;
+      // mapAppendingVariable call can change AppendingInits if initalizer for
+      // the variable depends on another appending global, because of that inits
+      // need to be extracted and updated before the call.
+      SmallVector<Constant *, 8> NewInits(
+          drop_begin(AppendingInits, PrefixSize));
+      AppendingInits.resize(PrefixSize);
       mapAppendingVariable(*E.Data.AppendingGV.GV,
                            E.Data.AppendingGV.InitPrefix,
-                           E.AppendingGVIsOldCtorDtor,
-                           makeArrayRef(AppendingInits).slice(PrefixSize));
-      AppendingInits.resize(PrefixSize);
+                           E.AppendingGVIsOldCtorDtor, makeArrayRef(NewInits));
       break;
     }
     case WorklistEntry::MapGlobalIndirectSymbol:
diff --git a/llvm/test/Linker/appending-global-crash.ll b/llvm/test/Linker/appending-global-crash.ll
new file mode 100644 (file)
index 0000000..28987e2
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llvm-link %s -S -o - | FileCheck %s
+
+; Check that llvm-link does not crash when materializing appending global with
+; initializer depending on another appending global.
+
+; CHECK-DAG: @use = appending global [1 x i8*] [i8* bitcast ([1 x i8*]* @var to i8*)]
+; CHECK-DAG: @var = appending global [1 x i8*] undef
+
+@use = appending global [1 x i8*] [i8* bitcast ([1 x i8*]* @var to i8*)]
+@var = appending global [1 x i8*] undef