mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
a26436a32a
An optional third field was added to `llvm.global_ctors` (and `llvm.global_dtors`) in r209015. Most of the code has been changed to deal with both versions of the variables. Users of the C API might create either version, the helper functions in LLVM create the two-field version, and clang now creates the three-field version. However, the BitcodeReader was changed to always upgrade to the three-field version. This created an unnecessary inconsistency in the IR before/after serializing to bitcode. This commit resolves the inconsistency by making the third field truly optional (and not upgrading in the bitcode reader). Since `llvm-link` was relying on this upgrade code, rather than deleting it I've moved it into `ModuleLinker`, where it upgrades these arrays as necessary to resolve inconsistencies between modules. The ideal resolution would be to remove the 2-field version and make the third field required. I filed PR20506 to track that. I changed `test/Bitcode/upgrade-global-ctors.ll` to a negative test and duplicated the `llvm-link` check in `test/Linker/global_ctors.ll` to check both upgrade directions. Since I came across this as part of PR5680 (serializing use-list order), I've also added the missing `verify-uselistorder` RUN line to `test/Bitcode/metadata-2.ll`. llvm-svn: 215457
31 lines
1.3 KiB
LLVM
31 lines
1.3 KiB
LLVM
; RUN: llvm-as %s -o %t.new.bc
|
|
; RUN: llvm-link %t.new.bc %S/Inputs/old_global_ctors.3.4.bc | llvm-dis | FileCheck %s
|
|
; RUN: llvm-link %S/Inputs/old_global_ctors.3.4.bc %t.new.bc | llvm-dis | FileCheck %s
|
|
|
|
; old_global_ctors.3.4.bc contains the following LLVM IL, assembled into
|
|
; bitcode by llvm-as from 3.4. It uses a two element @llvm.global_ctors array.
|
|
; ---
|
|
; declare void @a_global_ctor()
|
|
; declare void @b_global_ctor()
|
|
;
|
|
; @llvm.global_ctors = appending global [2 x { i32, void ()* } ] [
|
|
; { i32, void ()* } { i32 65535, void ()* @a_global_ctor },
|
|
; { i32, void ()* } { i32 65535, void ()* @b_global_ctor }
|
|
; ]
|
|
; ---
|
|
|
|
declare void @c_global_ctor()
|
|
declare void @d_global_ctor()
|
|
|
|
@llvm.global_ctors = appending global [2 x { i32, void ()*, i8* } ] [
|
|
{ i32, void ()*, i8* } { i32 65535, void ()* @c_global_ctor, i8* null },
|
|
{ i32, void ()*, i8* } { i32 65535, void ()* @d_global_ctor, i8* null }
|
|
]
|
|
|
|
; CHECK: @llvm.global_ctors = appending global [4 x { i32, void ()*, i8* }] [
|
|
; CHECK-DAG: { i32, void ()*, i8* } { i32 65535, void ()* @a_global_ctor, i8* null }
|
|
; CHECK-DAG: { i32, void ()*, i8* } { i32 65535, void ()* @b_global_ctor, i8* null }
|
|
; CHECK-DAG: { i32, void ()*, i8* } { i32 65535, void ()* @c_global_ctor, i8* null }
|
|
; CHECK-DAG: { i32, void ()*, i8* } { i32 65535, void ()* @d_global_ctor, i8* null }
|
|
; CHECK: ]
|