[llvm] r207226 - [ARM64] When compiling for ELF in PIC mode, local symbols shouldn't go through the GOT

Tilmann Scheller t.scheller at samsung.com
Fri Apr 25 06:43:18 PDT 2014


Author: tilmann
Date: Fri Apr 25 08:43:18 2014
New Revision: 207226

URL: http://llvm.org/viewvc/llvm-project?rev=207226&view=rev
Log:
[ARM64] When compiling for ELF in PIC mode, local symbols shouldn't go through the GOT

There's no need for local symbols to go through the GOT, in fact it seems GNU ld is not even emitting GOT entries for local symbols and will error out when trying to resolve a GOT relocation for a local symbol.

This bug triggers when bootstrapping clang on AArch64 Linux with -fPIC and the ARM64 backend. The AArch64 backend is not affected.

With this commit it's now possible to bootstrap clang on AArch64 Linux with the ARM64 backend (-fPIC, -O3).

Added:
    llvm/trunk/test/CodeGen/ARM64/pic-local-symbol.ll
Modified:
    llvm/trunk/lib/Target/ARM64/ARM64Subtarget.cpp

Modified: llvm/trunk/lib/Target/ARM64/ARM64Subtarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM64/ARM64Subtarget.cpp?rev=207226&r1=207225&r2=207226&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM64/ARM64Subtarget.cpp (original)
+++ llvm/trunk/lib/Target/ARM64/ARM64Subtarget.cpp Fri Apr 25 08:43:18 2014
@@ -77,7 +77,8 @@ ARM64Subtarget::ClassifyGlobalReference(
       return (isDecl || GV->isWeakForLinker()) ? ARM64II::MO_GOT
                                                : ARM64II::MO_NO_FLAG;
     else
-      return ARM64II::MO_GOT;
+      // No need to go through the GOT for local symbols on ELF.
+      return GV->hasLocalLinkage() ? ARM64II::MO_NO_FLAG : ARM64II::MO_GOT;
   }
 
   return ARM64II::MO_NO_FLAG;

Added: llvm/trunk/test/CodeGen/ARM64/pic-local-symbol.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM64/pic-local-symbol.ll?rev=207226&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM64/pic-local-symbol.ll (added)
+++ llvm/trunk/test/CodeGen/ARM64/pic-local-symbol.ll Fri Apr 25 08:43:18 2014
@@ -0,0 +1,22 @@
+; RUN: llc -mtriple=arm64-unknown-linux-gnu -relocation-model=pic < %s | FileCheck %s
+
+ at a = internal unnamed_addr global i32 0, align 4
+ at .str = private unnamed_addr constant [6 x i8] c"test\0A\00", align 1
+
+define i32 @get() {
+; CHECK: get:
+; CHECK: adrp x{{[0-9]+}}, a
+; CHECK-NEXT: ldr w{{[0-9]+}}, [x{{[0-9]}}, :lo12:a]
+  %res = load i32* @a, align 4
+  ret i32 %res
+}
+
+define void @foo() nounwind {
+; CHECK: foo:
+; CHECK: adrp x{{[0-9]}}, .L.str
+; CHECK-NEXT: add x{{[0-9]}}, x{{[0-9]}}, :lo12:.L.str
+  tail call void @bar(i8* getelementptr inbounds ([6 x i8]* @.str, i64 0, i64 0))
+  ret void
+}
+
+declare void @bar(i8*)





More information about the llvm-commits mailing list