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