Uses shouldAssumeDSOLocal.

With that SystemZ knows to avoid a GOT for PIE.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273614 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2016-06-23 21:18:59 +00:00
parent f71f36557b
commit e41c71efea
2 changed files with 15 additions and 10 deletions

View File

@ -9,6 +9,7 @@
#include "SystemZSubtarget.h"
#include "MCTargetDesc/SystemZMCTargetDesc.h"
#include "llvm/CodeGen/Analysis.h"
#include "llvm/IR/GlobalValue.h"
using namespace llvm;
@ -44,15 +45,6 @@ SystemZSubtarget::SystemZSubtarget(const Triple &TT, const std::string &CPU,
InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
TSInfo(), FrameLowering() {}
// Return true if GV binds locally under reloc model RM.
static bool bindsLocally(const GlobalValue *GV, Reloc::Model RM) {
// For non-PIC, all symbols bind locally.
if (RM == Reloc::Static)
return true;
return GV->hasLocalLinkage() || !GV->hasDefaultVisibility();
}
bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV,
Reloc::Model RM,
CodeModel::Model CM) const {
@ -63,7 +55,7 @@ bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV,
// For the small model, all locally-binding symbols are in range.
if (CM == CodeModel::Small)
return bindsLocally(GV, RM);
return shouldAssumeDSOLocal(RM, TargetTriple, *GV->getParent(), GV);
// For Medium and above, assume that the symbol is not within the 4GB range.
// Taking the address of locally-defined text would be OK, but that

View File

@ -0,0 +1,13 @@
; RUN: llc -mtriple=s390x-linux-gnu -relocation-model=pic < %s | FileCheck %s
@foo = global i32 42
define i32* @get_foo() {
ret i32* @foo
}
; CHECK: larl %r2, foo{{$}}
!llvm.module.flags = !{!0}
!0 = !{i32 1, !"PIE Level", i32 2}