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