SystemZSubtarget.cpp revision 251607
1251881Speter//===-- SystemZSubtarget.cpp - SystemZ subtarget information --------------===// 2251881Speter// 3251881Speter// The LLVM Compiler Infrastructure 4251881Speter// 5251881Speter// This file is distributed under the University of Illinois Open Source 6251881Speter// License. See LICENSE.TXT for details. 7251881Speter// 8251881Speter//===----------------------------------------------------------------------===// 9251881Speter 10251881Speter#include "SystemZSubtarget.h" 11251881Speter#include "llvm/IR/GlobalValue.h" 12251881Speter 13251881Speter#define GET_SUBTARGETINFO_TARGET_DESC 14251881Speter#define GET_SUBTARGETINFO_CTOR 15251881Speter#include "SystemZGenSubtargetInfo.inc" 16251881Speter 17251881Speterusing namespace llvm; 18251881Speter 19251881SpeterSystemZSubtarget::SystemZSubtarget(const std::string &TT, 20251881Speter const std::string &CPU, 21251881Speter const std::string &FS) 22251881Speter : SystemZGenSubtargetInfo(TT, CPU, FS), TargetTriple(TT) { 23251881Speter std::string CPUName = CPU; 24251881Speter if (CPUName.empty()) 25251881Speter CPUName = "z10"; 26251881Speter 27251881Speter // Parse features string. 28251881Speter ParseSubtargetFeatures(CPUName, FS); 29251881Speter} 30251881Speter 31251881Speter// Return true if GV binds locally under reloc model RM. 32251881Speterstatic bool bindsLocally(const GlobalValue *GV, Reloc::Model RM) { 33251881Speter // For non-PIC, all symbols bind locally. 34251881Speter if (RM == Reloc::Static) 35251881Speter return true; 36251881Speter 37251881Speter return GV->hasLocalLinkage() || !GV->hasDefaultVisibility(); 38251881Speter} 39251881Speter 40251881Speterbool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, 41251881Speter Reloc::Model RM, 42251881Speter CodeModel::Model CM) const { 43251881Speter // PC32DBL accesses require the low bit to be clear. Note that a zero 44251881Speter // value selects the default alignment and is therefore OK. 45251881Speter if (GV->getAlignment() == 1) 46251881Speter return false; 47251881Speter 48251881Speter // For the small model, all locally-binding symbols are in range. 49251881Speter if (CM == CodeModel::Small) 50251881Speter return bindsLocally(GV, RM); 51251881Speter 52251881Speter // For Medium and above, assume that the symbol is not within the 4GB range. 53251881Speter // Taking the address of locally-defined text would be OK, but that 54251881Speter // case isn't easy to detect. 55251881Speter return false; 56251881Speter} 57251881Speter