mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 05:32:25 +00:00
Error if we see an alias to a declaration.
In ELF and COFF an alias is just another offset in a section. There is no way to represent an alias to something in another file. In MachO, the spec has the N_INDR type which should allow for exactly that, but is not currently implemented. Given that it is specified but not implemented, we error in codegen to avoid miscompiling but don't reject aliases to declarations in the verifier to leave the option open of implementing it. In the past we have used alias to declarations as a way of implementing weakref, which is why it exists in some old tests which this patch updates. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194705 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8cc5f7cd59
commit
3d47402f2e
@ -949,6 +949,11 @@ bool AsmPrinter::doFinalization(Module &M) {
|
||||
MCSymbol *Name = getSymbol(I);
|
||||
|
||||
const GlobalValue *GV = I->getAliasedGlobal();
|
||||
if (GV->isDeclaration()) {
|
||||
report_fatal_error(Name->getName() +
|
||||
": Target doesn't support aliases to declarations");
|
||||
}
|
||||
|
||||
MCSymbol *Target = getSymbol(GV);
|
||||
|
||||
if (I->hasExternalLinkage() || !MAI->getWeakRefDirective())
|
||||
|
@ -16,13 +16,15 @@
|
||||
; CHECK: .globl A
|
||||
; CHECK: A = bar
|
||||
|
||||
@bar = external global i32
|
||||
@bar = global i32 42
|
||||
@foo1 = alias i32* @bar
|
||||
@foo2 = alias i32* @bar
|
||||
|
||||
%FunTy = type i32()
|
||||
|
||||
declare i32 @foo_f()
|
||||
define i32 @foo_f() {
|
||||
ret i32 0
|
||||
}
|
||||
@bar_f = alias weak %FunTy* @foo_f
|
||||
|
||||
@bar_i = alias internal i32* @bar
|
||||
|
@ -63,30 +63,58 @@ bb47: ; preds = %bb46, %bb44
|
||||
br label %bb44
|
||||
}
|
||||
|
||||
declare i32 @pthread_once(i32*, void ()*)
|
||||
define i32 @pthread_once(i32*, void ()*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i8* @pthread_getspecific(i32)
|
||||
define i8* @pthread_getspecific(i32) {
|
||||
ret i8* null
|
||||
}
|
||||
|
||||
declare i32 @pthread_setspecific(i32, i8*)
|
||||
define i32 @pthread_setspecific(i32, i8*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_create(i64*, %struct.pthread_attr_t*, i8* (i8*)*, i8*)
|
||||
define i32 @pthread_create(i64*, %struct.pthread_attr_t*, i8* (i8*)*, i8*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_cancel(i64)
|
||||
define i32 @pthread_cancel(i64) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutex_lock(%struct.pthread_mutex_t*)
|
||||
define i32 @pthread_mutex_lock(%struct.pthread_mutex_t*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutex_trylock(%struct.pthread_mutex_t*)
|
||||
define i32 @pthread_mutex_trylock(%struct.pthread_mutex_t*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutex_unlock(%struct.pthread_mutex_t*)
|
||||
define i32 @pthread_mutex_unlock(%struct.pthread_mutex_t*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutex_init(%struct.pthread_mutex_t*, %struct.Alignment*)
|
||||
define i32 @pthread_mutex_init(%struct.pthread_mutex_t*, %struct.Alignment*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_key_create(i32*, void (i8*)*)
|
||||
define i32 @pthread_key_create(i32*, void (i8*)*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_key_delete(i32)
|
||||
define i32 @pthread_key_delete(i32) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutexattr_init(%struct.Alignment*)
|
||||
define i32 @pthread_mutexattr_init(%struct.Alignment*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutexattr_settype(%struct.Alignment*, i32)
|
||||
define i32 @pthread_mutexattr_settype(%struct.Alignment*, i32) {
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
declare i32 @pthread_mutexattr_destroy(%struct.Alignment*)
|
||||
define i32 @pthread_mutexattr_destroy(%struct.Alignment*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
@ -7,8 +7,7 @@
|
||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
|
||||
target triple = "powerpc64-unknown-linux-gnu"
|
||||
|
||||
@ei = external global i32
|
||||
@a = alias i32* @ei
|
||||
@a = external global i32
|
||||
|
||||
define signext i32 @test_external() nounwind {
|
||||
entry:
|
||||
|
@ -1,4 +1,6 @@
|
||||
; RUN: llc < %s -march=x86 | grep weak | count 2
|
||||
@__gthrw_pthread_once = alias weak i32 (i32*, void ()*)* @pthread_once ; <i32 (i32*, void ()*)*> [#uses=0]
|
||||
|
||||
declare extern_weak i32 @pthread_once(i32*, void ()*)
|
||||
define weak i32 @pthread_once(i32*, void ()*) {
|
||||
ret i32 0
|
||||
}
|
||||
|
@ -45,4 +45,6 @@ bb383: ; preds = %bb374.us, %bb311.split
|
||||
ret i64 0
|
||||
}
|
||||
|
||||
declare i64 @__wcstoll_l(i32*, i32**, i32, %struct.__locale_struct*) nounwind
|
||||
define i64 @__wcstoll_l(i32*, i32**, i32, %struct.__locale_struct*) nounwind {
|
||||
ret i64 0
|
||||
}
|
||||
|
5
test/CodeGen/X86/alias-error.ll
Normal file
5
test/CodeGen/X86/alias-error.ll
Normal file
@ -0,0 +1,5 @@
|
||||
; RUN: not llc < %s -mtriple=i686-pc-linux-gnu %s 2>&1 | FileCheck %s
|
||||
|
||||
@a = external global i32
|
||||
@b = alias i32* @a
|
||||
; CHECK: b: Target doesn't support aliases to declarations
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc < %s -mtriple=i686-pc-linux-gnu -asm-verbose=false | FileCheck %s
|
||||
|
||||
@bar = external global i32
|
||||
@bar = global i32 42
|
||||
|
||||
; CHECK-DAG: .globl foo1
|
||||
@foo1 = alias i32* @bar
|
||||
@ -10,7 +10,9 @@
|
||||
|
||||
%FunTy = type i32()
|
||||
|
||||
declare i32 @foo_f()
|
||||
define i32 @foo_f() {
|
||||
ret i32 0
|
||||
}
|
||||
; CHECK-DAG: .weak bar_f
|
||||
@bar_f = alias weak %FunTy* @foo_f
|
||||
|
||||
|
@ -9,4 +9,6 @@ entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
declare extern_weak i32 @f()
|
||||
define weak i32 @f() {
|
||||
ret i32 42
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
; RUN: llc < %s -march=xcore | FileCheck %s
|
||||
declare void @a_val() nounwind
|
||||
@b_val = external constant i32, section ".cp.rodata"
|
||||
@c_val = external global i32
|
||||
define void @a_val() nounwind {
|
||||
ret void
|
||||
}
|
||||
@b_val = constant i32 42, section ".cp.rodata"
|
||||
@c_val = global i32 42
|
||||
|
||||
@a = alias void ()* @a_val
|
||||
@b = alias i32* @b_val
|
||||
|
Loading…
Reference in New Issue
Block a user