1234353Sdim//===-- ARMMCAsmInfo.cpp - ARM asm properties -----------------------------===//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// This file contains the declarations of the ARMMCAsmInfo properties.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14224133Sdim#include "ARMMCAsmInfo.h"
15280031Sdim#include "llvm/ADT/Triple.h"
16224133Sdim#include "llvm/Support/CommandLine.h"
17224133Sdim
18224133Sdimusing namespace llvm;
19224133Sdim
20276479Sdimvoid ARMMCAsmInfoDarwin::anchor() { }
21224133Sdim
22288943SdimARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {
23276479Sdim  if ((TheTriple.getArch() == Triple::armeb) ||
24276479Sdim      (TheTriple.getArch() == Triple::thumbeb))
25276479Sdim    IsLittleEndian = false;
26224133Sdim
27276479Sdim  Data64bitsDirective = nullptr;
28224133Sdim  CommentString = "@";
29226633Sdim  Code16Directive = ".code\t16";
30226633Sdim  Code32Directive = ".code\t32";
31239462Sdim  UseDataRegionDirectives = true;
32226633Sdim
33224133Sdim  SupportsDebugInformation = true;
34224133Sdim
35224133Sdim  // Exceptions handling
36296417Sdim  ExceptionsType = TheTriple.isOSDarwin() && !TheTriple.isWatchOS()
37296417Sdim                       ? ExceptionHandling::SjLj
38296417Sdim                       : ExceptionHandling::DwarfCFI;
39276479Sdim
40276479Sdim  UseIntegratedAssembler = true;
41224133Sdim}
42224133Sdim
43234353Sdimvoid ARMELFMCAsmInfo::anchor() { }
44234353Sdim
45288943SdimARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) {
46276479Sdim  if ((TheTriple.getArch() == Triple::armeb) ||
47276479Sdim      (TheTriple.getArch() == Triple::thumbeb))
48276479Sdim    IsLittleEndian = false;
49276479Sdim
50224133Sdim  // ".comm align is in bytes but .align is pow-2."
51224133Sdim  AlignmentIsInBytes = false;
52224133Sdim
53276479Sdim  Data64bitsDirective = nullptr;
54224133Sdim  CommentString = "@";
55226633Sdim  Code16Directive = ".code\t16";
56226633Sdim  Code32Directive = ".code\t32";
57224133Sdim
58224133Sdim  SupportsDebugInformation = true;
59224133Sdim
60224133Sdim  // Exceptions handling
61276479Sdim  switch (TheTriple.getOS()) {
62288943Sdim  case Triple::Bitrig:
63276479Sdim  case Triple::NetBSD:
64276479Sdim    ExceptionsType = ExceptionHandling::DwarfCFI;
65276479Sdim    break;
66276479Sdim  default:
67224133Sdim    ExceptionsType = ExceptionHandling::ARM;
68276479Sdim    break;
69276479Sdim  }
70276479Sdim
71276479Sdim  // foo(plt) instead of foo@plt
72276479Sdim  UseParensForSymbolVariant = true;
73276479Sdim
74276479Sdim  UseIntegratedAssembler = true;
75224133Sdim}
76276479Sdim
77276479Sdimvoid ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) {
78276479Sdim  UseIntegratedAssembler = Value;
79276479Sdim  if (!UseIntegratedAssembler) {
80276479Sdim    // gas doesn't handle VFP register names in cfi directives,
81276479Sdim    // so don't use register names with external assembler.
82276479Sdim    // See https://sourceware.org/bugzilla/show_bug.cgi?id=16694
83276479Sdim    DwarfRegNumForCFI = true;
84276479Sdim  }
85276479Sdim}
86276479Sdim
87276479Sdimvoid ARMCOFFMCAsmInfoMicrosoft::anchor() { }
88276479Sdim
89276479SdimARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() {
90276479Sdim  AlignmentIsInBytes = false;
91276479Sdim
92276479Sdim  PrivateGlobalPrefix = "$M";
93280031Sdim  PrivateLabelPrefix = "$M";
94276479Sdim}
95276479Sdim
96276479Sdimvoid ARMCOFFMCAsmInfoGNU::anchor() { }
97276479Sdim
98276479SdimARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() {
99276479Sdim  AlignmentIsInBytes = false;
100276479Sdim  HasSingleParameterDotFile = true;
101276479Sdim
102276479Sdim  CommentString = "@";
103276479Sdim  Code16Directive = ".code\t16";
104276479Sdim  Code32Directive = ".code\t32";
105276479Sdim  PrivateGlobalPrefix = ".L";
106280031Sdim  PrivateLabelPrefix = ".L";
107276479Sdim
108276479Sdim  SupportsDebugInformation = true;
109276479Sdim  ExceptionsType = ExceptionHandling::None;
110276479Sdim  UseParensForSymbolVariant = true;
111276479Sdim
112276479Sdim  UseIntegratedAssembler = false;
113276479Sdim  DwarfRegNumForCFI = true;
114276479Sdim}
115276479Sdim
116