1*9880d681SAndroid Build Coastguard Worker //===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file defines target asm properties related what form asm statements
11*9880d681SAndroid Build Coastguard Worker // should take.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCExpr.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Dwarf.h"
21*9880d681SAndroid Build Coastguard Worker #include <cctype>
22*9880d681SAndroid Build Coastguard Worker #include <cstring>
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker
MCAsmInfo()25*9880d681SAndroid Build Coastguard Worker MCAsmInfo::MCAsmInfo() {
26*9880d681SAndroid Build Coastguard Worker PointerSize = 4;
27*9880d681SAndroid Build Coastguard Worker CalleeSaveStackSlotSize = 4;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker IsLittleEndian = true;
30*9880d681SAndroid Build Coastguard Worker StackGrowsUp = false;
31*9880d681SAndroid Build Coastguard Worker HasSubsectionsViaSymbols = false;
32*9880d681SAndroid Build Coastguard Worker HasMachoZeroFillDirective = false;
33*9880d681SAndroid Build Coastguard Worker HasMachoTBSSDirective = false;
34*9880d681SAndroid Build Coastguard Worker HasStaticCtorDtorReferenceInStaticMode = false;
35*9880d681SAndroid Build Coastguard Worker MaxInstLength = 4;
36*9880d681SAndroid Build Coastguard Worker MinInstAlignment = 1;
37*9880d681SAndroid Build Coastguard Worker DollarIsPC = false;
38*9880d681SAndroid Build Coastguard Worker SeparatorString = ";";
39*9880d681SAndroid Build Coastguard Worker CommentString = "#";
40*9880d681SAndroid Build Coastguard Worker LabelSuffix = ":";
41*9880d681SAndroid Build Coastguard Worker UseAssignmentForEHBegin = false;
42*9880d681SAndroid Build Coastguard Worker NeedsLocalForSize = false;
43*9880d681SAndroid Build Coastguard Worker PrivateGlobalPrefix = "L";
44*9880d681SAndroid Build Coastguard Worker PrivateLabelPrefix = PrivateGlobalPrefix;
45*9880d681SAndroid Build Coastguard Worker LinkerPrivateGlobalPrefix = "";
46*9880d681SAndroid Build Coastguard Worker InlineAsmStart = "APP";
47*9880d681SAndroid Build Coastguard Worker InlineAsmEnd = "NO_APP";
48*9880d681SAndroid Build Coastguard Worker Code16Directive = ".code16";
49*9880d681SAndroid Build Coastguard Worker Code32Directive = ".code32";
50*9880d681SAndroid Build Coastguard Worker Code64Directive = ".code64";
51*9880d681SAndroid Build Coastguard Worker AssemblerDialect = 0;
52*9880d681SAndroid Build Coastguard Worker AllowAtInName = false;
53*9880d681SAndroid Build Coastguard Worker SupportsQuotedNames = true;
54*9880d681SAndroid Build Coastguard Worker UseDataRegionDirectives = false;
55*9880d681SAndroid Build Coastguard Worker ZeroDirective = "\t.zero\t";
56*9880d681SAndroid Build Coastguard Worker AsciiDirective = "\t.ascii\t";
57*9880d681SAndroid Build Coastguard Worker AscizDirective = "\t.asciz\t";
58*9880d681SAndroid Build Coastguard Worker Data8bitsDirective = "\t.byte\t";
59*9880d681SAndroid Build Coastguard Worker Data16bitsDirective = "\t.short\t";
60*9880d681SAndroid Build Coastguard Worker Data32bitsDirective = "\t.long\t";
61*9880d681SAndroid Build Coastguard Worker Data64bitsDirective = "\t.quad\t";
62*9880d681SAndroid Build Coastguard Worker SunStyleELFSectionSwitchSyntax = false;
63*9880d681SAndroid Build Coastguard Worker UsesELFSectionDirectiveForBSS = false;
64*9880d681SAndroid Build Coastguard Worker AlignmentIsInBytes = true;
65*9880d681SAndroid Build Coastguard Worker TextAlignFillValue = 0;
66*9880d681SAndroid Build Coastguard Worker GPRel64Directive = nullptr;
67*9880d681SAndroid Build Coastguard Worker GPRel32Directive = nullptr;
68*9880d681SAndroid Build Coastguard Worker GlobalDirective = "\t.globl\t";
69*9880d681SAndroid Build Coastguard Worker SetDirectiveSuppressesReloc = false;
70*9880d681SAndroid Build Coastguard Worker HasAggressiveSymbolFolding = true;
71*9880d681SAndroid Build Coastguard Worker COMMDirectiveAlignmentIsInBytes = true;
72*9880d681SAndroid Build Coastguard Worker LCOMMDirectiveAlignmentType = LCOMM::NoAlignment;
73*9880d681SAndroid Build Coastguard Worker HasFunctionAlignment = true;
74*9880d681SAndroid Build Coastguard Worker HasDotTypeDotSizeDirective = true;
75*9880d681SAndroid Build Coastguard Worker HasSingleParameterDotFile = true;
76*9880d681SAndroid Build Coastguard Worker HasIdentDirective = false;
77*9880d681SAndroid Build Coastguard Worker HasNoDeadStrip = false;
78*9880d681SAndroid Build Coastguard Worker HasAltEntry = false;
79*9880d681SAndroid Build Coastguard Worker WeakDirective = "\t.weak\t";
80*9880d681SAndroid Build Coastguard Worker WeakRefDirective = nullptr;
81*9880d681SAndroid Build Coastguard Worker HasWeakDefDirective = false;
82*9880d681SAndroid Build Coastguard Worker HasWeakDefCanBeHiddenDirective = false;
83*9880d681SAndroid Build Coastguard Worker HasLinkOnceDirective = false;
84*9880d681SAndroid Build Coastguard Worker HiddenVisibilityAttr = MCSA_Hidden;
85*9880d681SAndroid Build Coastguard Worker HiddenDeclarationVisibilityAttr = MCSA_Hidden;
86*9880d681SAndroid Build Coastguard Worker ProtectedVisibilityAttr = MCSA_Protected;
87*9880d681SAndroid Build Coastguard Worker SupportsDebugInformation = false;
88*9880d681SAndroid Build Coastguard Worker ExceptionsType = ExceptionHandling::None;
89*9880d681SAndroid Build Coastguard Worker WinEHEncodingType = WinEH::EncodingType::Invalid;
90*9880d681SAndroid Build Coastguard Worker DwarfUsesRelocationsAcrossSections = true;
91*9880d681SAndroid Build Coastguard Worker DwarfFDESymbolsUseAbsDiff = false;
92*9880d681SAndroid Build Coastguard Worker DwarfRegNumForCFI = false;
93*9880d681SAndroid Build Coastguard Worker NeedsDwarfSectionOffsetDirective = false;
94*9880d681SAndroid Build Coastguard Worker UseParensForSymbolVariant = false;
95*9880d681SAndroid Build Coastguard Worker UseLogicalShr = true;
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker // FIXME: Clang's logic should be synced with the logic used to initialize
98*9880d681SAndroid Build Coastguard Worker // this member and the two implementations should be merged.
99*9880d681SAndroid Build Coastguard Worker // For reference:
100*9880d681SAndroid Build Coastguard Worker // - Solaris always enables the integrated assembler by default
101*9880d681SAndroid Build Coastguard Worker // - SparcELFMCAsmInfo and X86ELFMCAsmInfo are handling this case
102*9880d681SAndroid Build Coastguard Worker // - Windows always enables the integrated assembler by default
103*9880d681SAndroid Build Coastguard Worker // - MCAsmInfoCOFF is handling this case, should it be MCAsmInfoMicrosoft?
104*9880d681SAndroid Build Coastguard Worker // - MachO targets always enables the integrated assembler by default
105*9880d681SAndroid Build Coastguard Worker // - MCAsmInfoDarwin is handling this case
106*9880d681SAndroid Build Coastguard Worker // - Generic_GCC toolchains enable the integrated assembler on a per
107*9880d681SAndroid Build Coastguard Worker // architecture basis.
108*9880d681SAndroid Build Coastguard Worker // - The target subclasses for AArch64, ARM, and X86 handle these cases
109*9880d681SAndroid Build Coastguard Worker UseIntegratedAssembler = false;
110*9880d681SAndroid Build Coastguard Worker PreserveAsmComments = true;
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker CompressDebugSections = DebugCompressionType::DCT_None;
113*9880d681SAndroid Build Coastguard Worker }
114*9880d681SAndroid Build Coastguard Worker
~MCAsmInfo()115*9880d681SAndroid Build Coastguard Worker MCAsmInfo::~MCAsmInfo() {
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker
isSectionAtomizableBySymbols(const MCSection & Section) const118*9880d681SAndroid Build Coastguard Worker bool MCAsmInfo::isSectionAtomizableBySymbols(const MCSection &Section) const {
119*9880d681SAndroid Build Coastguard Worker return false;
120*9880d681SAndroid Build Coastguard Worker }
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker const MCExpr *
getExprForPersonalitySymbol(const MCSymbol * Sym,unsigned Encoding,MCStreamer & Streamer) const123*9880d681SAndroid Build Coastguard Worker MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
124*9880d681SAndroid Build Coastguard Worker unsigned Encoding,
125*9880d681SAndroid Build Coastguard Worker MCStreamer &Streamer) const {
126*9880d681SAndroid Build Coastguard Worker return getExprForFDESymbol(Sym, Encoding, Streamer);
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker const MCExpr *
getExprForFDESymbol(const MCSymbol * Sym,unsigned Encoding,MCStreamer & Streamer) const130*9880d681SAndroid Build Coastguard Worker MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
131*9880d681SAndroid Build Coastguard Worker unsigned Encoding,
132*9880d681SAndroid Build Coastguard Worker MCStreamer &Streamer) const {
133*9880d681SAndroid Build Coastguard Worker if (!(Encoding & dwarf::DW_EH_PE_pcrel))
134*9880d681SAndroid Build Coastguard Worker return MCSymbolRefExpr::create(Sym, Streamer.getContext());
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker MCContext &Context = Streamer.getContext();
137*9880d681SAndroid Build Coastguard Worker const MCExpr *Res = MCSymbolRefExpr::create(Sym, Context);
138*9880d681SAndroid Build Coastguard Worker MCSymbol *PCSym = Context.createTempSymbol();
139*9880d681SAndroid Build Coastguard Worker Streamer.EmitLabel(PCSym);
140*9880d681SAndroid Build Coastguard Worker const MCExpr *PC = MCSymbolRefExpr::create(PCSym, Context);
141*9880d681SAndroid Build Coastguard Worker return MCBinaryExpr::createSub(Res, PC, Context);
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker
isAcceptableChar(char C)144*9880d681SAndroid Build Coastguard Worker static bool isAcceptableChar(char C) {
145*9880d681SAndroid Build Coastguard Worker return (C >= 'a' && C <= 'z') || (C >= 'A' && C <= 'Z') ||
146*9880d681SAndroid Build Coastguard Worker (C >= '0' && C <= '9') || C == '_' || C == '$' || C == '.' || C == '@';
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker
isValidUnquotedName(StringRef Name) const149*9880d681SAndroid Build Coastguard Worker bool MCAsmInfo::isValidUnquotedName(StringRef Name) const {
150*9880d681SAndroid Build Coastguard Worker if (Name.empty())
151*9880d681SAndroid Build Coastguard Worker return false;
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker // If any of the characters in the string is an unacceptable character, force
154*9880d681SAndroid Build Coastguard Worker // quotes.
155*9880d681SAndroid Build Coastguard Worker for (char C : Name) {
156*9880d681SAndroid Build Coastguard Worker if (!isAcceptableChar(C))
157*9880d681SAndroid Build Coastguard Worker return false;
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker return true;
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker
shouldOmitSectionDirective(StringRef SectionName) const163*9880d681SAndroid Build Coastguard Worker bool MCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const {
164*9880d681SAndroid Build Coastguard Worker // FIXME: Does .section .bss/.data/.text work everywhere??
165*9880d681SAndroid Build Coastguard Worker return SectionName == ".text" || SectionName == ".data" ||
166*9880d681SAndroid Build Coastguard Worker (SectionName == ".bss" && !usesELFSectionDirectiveForBSS());
167*9880d681SAndroid Build Coastguard Worker }
168