]> granicus.if.org Git - llvm/commitdiff
Error if we see an alias to a declaration.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 14 Nov 2013 13:58:06 +0000 (13:58 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 14 Nov 2013 13:58:06 +0000 (13:58 +0000)
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

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/CodeGen/ARM/aliases.ll
test/CodeGen/Generic/2009-03-17-LSR-APInt.ll
test/CodeGen/PowerPC/mcm-9.ll
test/CodeGen/X86/2007-09-06-ExtWeakAliasee.ll
test/CodeGen/X86/2008-03-14-SpillerCrash.ll
test/CodeGen/X86/alias-error.ll [new file with mode: 0644]
test/CodeGen/X86/aliases.ll
test/CodeGen/X86/x86-64-pic-10.ll
test/CodeGen/XCore/aliases.ll

index 44a83167238e0220e50774bde30e7d478a1fb9ad..308b0e091ac55fd2bbbb9e4e7134ea75f458a5b0 100644 (file)
@@ -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())
index 4147bd0be07ce12062af24138fd386ab6b5d1ac5..f55ae10b247d6f56c4c9c9f8565d513c7fb49b58 100644 (file)
 ; 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
index 6281ada73fc6bd027661f587425b3660432af523..3f17ce1e0b16937d605955d90588877d84f48ae2 100644 (file)
@@ -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
+}
index e587f61eaf22b92929412c715eb754f3b3016407..7906b6abea6a1e18c959e97e24bbb84cbd12d48f 100644 (file)
@@ -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:
index c5d2a46f92c270bcdd781ab71a96bdfdd5c1a50a..7e37ef5c40db38dba05a3fdbb46f695b2bc1e34b 100644 (file)
@@ -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
+}
index 8946415108f4ae23cde73fec45be17e75ce863be..18b3714f851f89632583741de097dfaebe53b6e9 100644 (file)
@@ -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
+}
diff --git a/test/CodeGen/X86/alias-error.ll b/test/CodeGen/X86/alias-error.ll
new file mode 100644 (file)
index 0000000..89b0876
--- /dev/null
@@ -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
index 025dcfedb62183f00e0c6ac33d84614c5799023a..d0a262d390da0fee10ed2ac13da18be3cc5f11f7 100644 (file)
@@ -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
 
index 3ec172b2b656e144eeba664cbfbdd05f68a66ecc..da8082b925186367a29c19ab12e0ab66a0128ce8 100644 (file)
@@ -9,4 +9,6 @@ entry:
         ret void
 }
 
-declare extern_weak i32 @f()
+define weak i32 @f() {
+  ret i32 42
+}
index d4da63c5d9a96094b6cb6c7d1bdea84cdc89f447..b7ad416968f453ed86dd02d57b68c1609d3e475f 100644 (file)
@@ -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