1//===-- ARMMCAsmInfo.cpp - ARM asm properties -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the declarations of the ARMMCAsmInfo properties.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ARMMCAsmInfo.h"
14#include "llvm/ADT/Triple.h"
15
16using namespace llvm;
17
18void ARMMCAsmInfoDarwin::anchor() { }
19
20ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) {
21  if ((TheTriple.getArch() == Triple::armeb) ||
22      (TheTriple.getArch() == Triple::thumbeb))
23    IsLittleEndian = false;
24
25  Data64bitsDirective = nullptr;
26  CommentString = "@";
27  Code16Directive = ".code\t16";
28  Code32Directive = ".code\t32";
29  UseDataRegionDirectives = true;
30
31  SupportsDebugInformation = true;
32
33  // Conditional Thumb 4-byte instructions can have an implicit IT.
34  MaxInstLength = 6;
35
36  // Exceptions handling
37  ExceptionsType = (TheTriple.isOSDarwin() && !TheTriple.isWatchABI())
38                       ? ExceptionHandling::SjLj
39                       : ExceptionHandling::DwarfCFI;
40}
41
42void ARMELFMCAsmInfo::anchor() { }
43
44ARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) {
45  if ((TheTriple.getArch() == Triple::armeb) ||
46      (TheTriple.getArch() == Triple::thumbeb))
47    IsLittleEndian = false;
48
49  // ".comm align is in bytes but .align is pow-2."
50  AlignmentIsInBytes = false;
51
52  Data64bitsDirective = nullptr;
53  CommentString = "@";
54  Code16Directive = ".code\t16";
55  Code32Directive = ".code\t32";
56
57  SupportsDebugInformation = true;
58
59  // Conditional Thumb 4-byte instructions can have an implicit IT.
60  MaxInstLength = 6;
61
62  // Exceptions handling
63  switch (TheTriple.getOS()) {
64  case Triple::NetBSD:
65    ExceptionsType = ExceptionHandling::DwarfCFI;
66    break;
67  default:
68    ExceptionsType = ExceptionHandling::ARM;
69    break;
70  }
71
72  // foo(plt) instead of foo@plt
73  UseParensForSymbolVariant = true;
74}
75
76void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) {
77  UseIntegratedAssembler = Value;
78  if (!UseIntegratedAssembler) {
79    // gas doesn't handle VFP register names in cfi directives,
80    // so don't use register names with external assembler.
81    // See https://sourceware.org/bugzilla/show_bug.cgi?id=16694
82    DwarfRegNumForCFI = true;
83  }
84}
85
86void ARMCOFFMCAsmInfoMicrosoft::anchor() { }
87
88ARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() {
89  AlignmentIsInBytes = false;
90  SupportsDebugInformation = true;
91  ExceptionsType = ExceptionHandling::WinEH;
92  WinEHEncodingType = WinEH::EncodingType::Itanium;
93  PrivateGlobalPrefix = "$M";
94  PrivateLabelPrefix = "$M";
95  CommentString = "@";
96
97  // Conditional Thumb 4-byte instructions can have an implicit IT.
98  MaxInstLength = 6;
99}
100
101void ARMCOFFMCAsmInfoGNU::anchor() { }
102
103ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() {
104  AlignmentIsInBytes = false;
105  HasSingleParameterDotFile = true;
106
107  CommentString = "@";
108  Code16Directive = ".code\t16";
109  Code32Directive = ".code\t32";
110  PrivateGlobalPrefix = ".L";
111  PrivateLabelPrefix = ".L";
112
113  SupportsDebugInformation = true;
114  ExceptionsType = ExceptionHandling::WinEH;
115  WinEHEncodingType = WinEH::EncodingType::Itanium;
116  UseParensForSymbolVariant = true;
117
118  DwarfRegNumForCFI = false;
119
120  // Conditional Thumb 4-byte instructions can have an implicit IT.
121  MaxInstLength = 6;
122}
123