Skip to content

Commit

Permalink
[llvm-link] Fix crash when materializing appending global
Browse files Browse the repository at this point in the history
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
  • Loading branch information
sndmitriev committed Jan 26, 2021
1 parent 8b11714 commit 13cedca
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
10 changes: 7 additions & 3 deletions llvm/lib/Transforms/Utils/ValueMapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
10 changes: 10 additions & 0 deletions llvm/test/Linker/appending-global-crash.ll
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 13cedca

Please sign in to comment.