1249259Sdim//===-- AArch64Subtarget.cpp - AArch64 Subtarget Information --------------===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// This file implements the AArch64 specific subclass of TargetSubtargetInfo.
11249259Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14249259Sdim#include "AArch64Subtarget.h"
15249259Sdim#include "AArch64RegisterInfo.h"
16249259Sdim#include "MCTargetDesc/AArch64MCTargetDesc.h"
17249259Sdim#include "llvm/IR/GlobalValue.h"
18249259Sdim#include "llvm/Target/TargetSubtargetInfo.h"
19249259Sdim#include "llvm/Support/CommandLine.h"
20249259Sdim#include "llvm/ADT/SmallVector.h"
21249259Sdim
22249259Sdim#define GET_SUBTARGETINFO_TARGET_DESC
23249259Sdim#define GET_SUBTARGETINFO_CTOR
24249259Sdim#include "AArch64GenSubtargetInfo.inc"
25249259Sdim
26249259Sdimusing namespace llvm;
27249259Sdim
28263509Sdim// Pin the vtable to this file.
29263509Sdimvoid AArch64Subtarget::anchor() {}
30263509Sdim
31249259SdimAArch64Subtarget::AArch64Subtarget(StringRef TT, StringRef CPU, StringRef FS)
32263509Sdim    : AArch64GenSubtargetInfo(TT, CPU, FS), HasFPARMv8(false), HasNEON(false),
33263509Sdim      HasCrypto(false), TargetTriple(TT), CPUString(CPU) {
34249259Sdim
35263509Sdim  initializeSubtargetFeatures(CPU, FS);
36249259Sdim}
37249259Sdim
38263509Sdimvoid AArch64Subtarget::initializeSubtargetFeatures(StringRef CPU,
39263509Sdim                                                   StringRef FS) {
40263509Sdim  if (CPU.empty())
41263509Sdim    CPUString = "generic";
42263509Sdim
43263509Sdim  std::string FullFS = FS;
44263509Sdim  if (CPUString == "generic") {
45263509Sdim    // Enable FP by default.
46263509Sdim    if (FullFS.empty())
47263509Sdim      FullFS = "+fp-armv8";
48263509Sdim    else
49263509Sdim      FullFS = "+fp-armv8," + FullFS;
50263509Sdim  }
51263509Sdim
52263509Sdim  ParseSubtargetFeatures(CPU, FullFS);
53263509Sdim}
54263509Sdim
55249259Sdimbool AArch64Subtarget::GVIsIndirectSymbol(const GlobalValue *GV,
56249259Sdim                                          Reloc::Model RelocM) const {
57249259Sdim  if (RelocM == Reloc::Static)
58249259Sdim    return false;
59249259Sdim
60249259Sdim  return !GV->hasLocalLinkage() && !GV->hasHiddenVisibility();
61249259Sdim}
62