[llvm-link] Fix crash when materializing appending global

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
This commit is contained in:
Sergey Dmitriev 2021-01-25 18:07:23 -08:00
parent 8b11714885
commit 13cedcaf45
2 changed files with 17 additions and 3 deletions

View 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:

View File

@ -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