1 //===-- AArch64MCAsmInfo.cpp - AArch64 asm properties ---------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains the declarations of the AArch64MCAsmInfo properties.
11 //===----------------------------------------------------------------------===//
13 #include "AArch64MCAsmInfo.h"
14 #include "llvm/ADT/Triple.h"
15 #include "llvm/MC/MCContext.h"
16 #include "llvm/MC/MCExpr.h"
17 #include "llvm/MC/MCStreamer.h"
18 #include "llvm/Support/CommandLine.h"
21 enum AsmWriterVariantTy
{
27 static cl::opt
<AsmWriterVariantTy
> AsmWriterVariant(
28 "aarch64-neon-syntax", cl::init(Default
),
29 cl::desc("Choose style of NEON code to emit from AArch64 backend:"),
30 cl::values(clEnumValN(Generic
, "generic", "Emit generic NEON assembly"),
31 clEnumValN(Apple
, "apple", "Emit Apple-style NEON assembly")));
33 AArch64MCAsmInfoDarwin::AArch64MCAsmInfoDarwin() {
34 // We prefer NEON instructions to be printed in the short, Apple-specific
35 // form when targeting Darwin.
36 AssemblerDialect
= AsmWriterVariant
== Default
? Apple
: AsmWriterVariant
;
38 PrivateGlobalPrefix
= "L";
39 PrivateLabelPrefix
= "L";
40 SeparatorString
= "%%";
42 CodePointerSize
= CalleeSaveStackSlotSize
= 8;
44 AlignmentIsInBytes
= false;
45 UsesELFSectionDirectiveForBSS
= true;
46 SupportsDebugInformation
= true;
47 UseDataRegionDirectives
= true;
49 ExceptionsType
= ExceptionHandling::DwarfCFI
;
52 const MCExpr
*AArch64MCAsmInfoDarwin::getExprForPersonalitySymbol(
53 const MCSymbol
*Sym
, unsigned Encoding
, MCStreamer
&Streamer
) const {
54 // On Darwin, we can reference dwarf symbols with foo@GOT-., which
55 // is an indirect pc-relative reference. The default implementation
56 // won't reference using the GOT, so we need this target-specific
58 MCContext
&Context
= Streamer
.getContext();
60 MCSymbolRefExpr::create(Sym
, MCSymbolRefExpr::VK_GOT
, Context
);
61 MCSymbol
*PCSym
= Context
.createTempSymbol();
62 Streamer
.EmitLabel(PCSym
);
63 const MCExpr
*PC
= MCSymbolRefExpr::create(PCSym
, Context
);
64 return MCBinaryExpr::createSub(Res
, PC
, Context
);
67 AArch64MCAsmInfoELF::AArch64MCAsmInfoELF(const Triple
&T
) {
68 if (T
.getArch() == Triple::aarch64_be
)
69 IsLittleEndian
= false;
71 // We prefer NEON instructions to be printed in the generic form when
73 AssemblerDialect
= AsmWriterVariant
== Default
? Generic
: AsmWriterVariant
;
77 // ".comm align is in bytes but .align is pow-2."
78 AlignmentIsInBytes
= false;
81 PrivateGlobalPrefix
= ".L";
82 PrivateLabelPrefix
= ".L";
83 Code32Directive
= ".code\t32";
85 Data16bitsDirective
= "\t.hword\t";
86 Data32bitsDirective
= "\t.word\t";
87 Data64bitsDirective
= "\t.xword\t";
89 UseDataRegionDirectives
= false;
91 WeakRefDirective
= "\t.weak\t";
93 SupportsDebugInformation
= true;
95 // Exceptions handling
96 ExceptionsType
= ExceptionHandling::DwarfCFI
;
98 UseIntegratedAssembler
= true;
100 HasIdentDirective
= true;
103 AArch64MCAsmInfoMicrosoftCOFF::AArch64MCAsmInfoMicrosoftCOFF() {
104 PrivateGlobalPrefix
= ".L";
105 PrivateLabelPrefix
= ".L";
107 Data16bitsDirective
= "\t.hword\t";
108 Data32bitsDirective
= "\t.word\t";
109 Data64bitsDirective
= "\t.xword\t";
111 AlignmentIsInBytes
= false;
112 SupportsDebugInformation
= true;
116 ExceptionsType
= ExceptionHandling::WinEH
;
117 WinEHEncodingType
= WinEH::EncodingType::Itanium
;
120 AArch64MCAsmInfoGNUCOFF::AArch64MCAsmInfoGNUCOFF() {
121 PrivateGlobalPrefix
= ".L";
122 PrivateLabelPrefix
= ".L";
124 Data16bitsDirective
= "\t.hword\t";
125 Data32bitsDirective
= "\t.word\t";
126 Data64bitsDirective
= "\t.xword\t";
128 AlignmentIsInBytes
= false;
129 SupportsDebugInformation
= true;
132 CommentString
= "//";
133 ExceptionsType
= ExceptionHandling::WinEH
;
134 WinEHEncodingType
= WinEH::EncodingType::Itanium
;