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
28263508Sdim// Pin the vtable to this file.
29263508Sdimvoid AArch64Subtarget::anchor() {}
30263508Sdim
31249259SdimAArch64Subtarget::AArch64Subtarget(StringRef TT, StringRef CPU, StringRef FS)
32263508Sdim    : AArch64GenSubtargetInfo(TT, CPU, FS), HasFPARMv8(false), HasNEON(false),
33263508Sdim      HasCrypto(false), TargetTriple(TT), CPUString(CPU) {
34249259Sdim
35263508Sdim  initializeSubtargetFeatures(CPU, FS);
36249259Sdim}
37249259Sdim
38263508Sdimvoid AArch64Subtarget::initializeSubtargetFeatures(StringRef CPU,
39263508Sdim                                                   StringRef FS) {
40263508Sdim  if (CPU.empty())
41263508Sdim    CPUString = "generic";
42263508Sdim
43263508Sdim  std::string FullFS = FS;
44263508Sdim  if (CPUString == "generic") {
45263508Sdim    // Enable FP by default.
46263508Sdim    if (FullFS.empty())
47263508Sdim      FullFS = "+fp-armv8";
48263508Sdim    else
49263508Sdim      FullFS = "+fp-armv8," + FullFS;
50263508Sdim  }
51263508Sdim
52263508Sdim  ParseSubtargetFeatures(CPU, FullFS);
53263508Sdim}
54263508Sdim
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