mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-21 19:20:50 +00:00
IRLinker: fix double scheduling of mapping a global value because of 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270757 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
07cea65abb
commit
f31f603963
@ -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);
|
||||
}
|
||||
|
13
test/Linker/alias-3.ll
Normal file
13
test/Linker/alias-3.ll
Normal file
@ -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]
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user