AArch64: use linker-private symbols for globals in MachO.

We don't use section-relative relocations on AArch64, so all symbols must be at
least visible to the linker (i.e. properly global or l_whatever, but not
L_whatever).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@303118 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover
2017-05-15 21:51:38 +00:00
parent f80f771764
commit 87dff1dfcd
4 changed files with 30 additions and 2 deletions
@@ -70,3 +70,11 @@ const MCExpr *AArch64_MachoTargetObjectFile::getIndirectSymViaGOTPCRel(
const MCExpr *PC = MCSymbolRefExpr::create(PCSym, getContext());
return MCBinaryExpr::createSub(Res, PC, getContext());
}
void AArch64_MachoTargetObjectFile::getNameWithPrefix(
SmallVectorImpl<char> &OutName, const GlobalValue *GV,
const TargetMachine &TM) const {
// AArch64 does not use section-relative relocations so any global symbol must
// be accessed via at least a linker-private symbol.
getMangler().getNameWithPrefix(OutName, GV, /* CannotUsePrivateLabel */ true);
}
@@ -40,6 +40,9 @@ public:
const MCValue &MV, int64_t Offset,
MachineModuleInfo *MMI,
MCStreamer &Streamer) const override;
void getNameWithPrefix(SmallVectorImpl<char> &OutName, const GlobalValue *GV,
const TargetMachine &TM) const override;
};
} // end namespace llvm
+2 -2
View File
@@ -6,8 +6,8 @@
; CHECK-NEXT: stp x29, x30, [sp, #16]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: stur wzr, [x29, #-4]
; CHECK: adrp x0, L_.str@PAGE
; CHECK: add x0, x0, L_.str@PAGEOFF
; CHECK: adrp x0, l_.str@PAGE
; CHECK: add x0, x0, l_.str@PAGEOFF
; CHECK-NEXT: bl _puts
; CHECK-NEXT: ldp x29, x30, [sp, #16]
; CHECK-NEXT: add sp, sp, #32
@@ -0,0 +1,17 @@
; RUN: llc -mtriple=arm64-apple-ios %s -o - | FileCheck %s
; All global symbols must be at-most linker-private for AArch64 because we don't
; use section-relative relocations in MachO.
define i8* @private_sym() {
; CHECK-LABEL: private_sym:
; CHECK: adrp [[HIBITS:x[0-9]+]], l_var@PAGE
; CHECK: add x0, [[HIBITS]], l_var@PAGEOFF
ret i8* getelementptr([2 x i8], [2 x i8]* @var, i32 0, i32 0)
}
; CHECK: .section __TEXT,__cstring
; CHECK: l_var:
; CHECK: .asciz "\002"
@var = private unnamed_addr constant [2 x i8] [i8 2, i8 0]