
appendToGlobalCtors implicitly assumes this is the case, since it deletes and recreates without trying to update any uses. This ran into an interesting problem in a few linker tests. During the link, ConstantExpr casts were speculatively created to replace any uses that might need them for replacement. These unused ConstantExprs would hang around and still appear on the use list. It seems like a bug that those stick around, but I'm not sure where those are supposed to be cleaned up. Avoid this by not creating the casts for appending linkage. Delete one of the casts entirely as it breaks no tests. The verifier has enforced a specific type for these since 2011, so I don't see why we would need to handle linking modules with a wrong types. One test does fail without the second cast (Linker/appending-global-proto.ll, added by D95126). This test looks contrived; it's using appending linkage with a regular variable. The LangRef suggests this is illegal (and suggests another missing verifier check).
21 lines
496 B
LLVM
21 lines
496 B
LLVM
; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
|
|
|
|
; CHECK: invalid uses of intrinsic global variable
|
|
; CHECK-NEXT: ptr @llvm.used
|
|
@llvm.used = appending global [1 x ptr] [ptr @foo]
|
|
|
|
; CHECK: invalid uses of intrinsic global variable
|
|
; CHECK-NEXT: ptr @llvm.compiler.used
|
|
@llvm.compiler.used = appending global [1 x ptr] [ptr @bar]
|
|
|
|
define void @foo() {
|
|
ret void
|
|
}
|
|
|
|
define void @bar() {
|
|
ret void
|
|
}
|
|
|
|
@used_user = global ptr @llvm.used
|
|
@compiler_used_user = global ptr @llvm.compiler.used
|