Skip to content

Commit

Permalink
IRLinker: fix double scheduling of mapping a global value because of …
Browse files Browse the repository at this point in the history
…an alias

This test was hitting an assertion in the value mapper because
the IRLinker was trying to map two times @A while materializing
the initializer for @C.

Fix http://llvm.org/PR27850

Differential Revision: http://reviews.llvm.org/D20586

llvm-svn: 270757
  • Loading branch information
joker-eph committed May 25, 2016
1 parent 971abe8 commit 3d4f3a0
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 0 deletions.
11 changes: 11 additions & 0 deletions llvm/lib/Linker/IRMover.cpp
Expand Up @@ -557,6 +557,17 @@ void IRLinker::materializeInitFor(GlobalValue *New, GlobalValue *Old,
return;
}

// When linking a global for an alias, it will always be linked. However we
// need to check if it was not already scheduled to satify a reference from a
// regular global value initializer. We know if it has been schedule if the
// "New" GlobalValue that is mapped here for the alias is the same as the one
// already mapped. If there is an entry in the ValueMap but the value is
// different, it means that the value already had a definition in the
// destination module (linkonce for instance), but we need a new definition
// for the alias ("New" will be different.
if (ForAlias && ValueMap.lookup(Old) == New)
return;

if (ForAlias || shouldLink(New, *Old))
linkGlobalValueBody(*New, *Old);
}
Expand Down
13 changes: 13 additions & 0 deletions llvm/test/Linker/alias-3.ll
@@ -0,0 +1,13 @@
; RUN: llvm-link %s -S -o - | FileCheck %s
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.9"

; CHECK-DAG: @A = internal constant i8 1
; CHECK-DAG: @B = alias i8, i8* @A
; CHECK-DAG: @C = global [2 x i8*] [i8* @A, i8* @B]

@A = internal constant i8 1
@B = alias i8, i8* @A
@C = global [2 x i8*] [i8* @A, i8* @B]


0 comments on commit 3d4f3a0

Please sign in to comment.