1 | //===- MCAsmInfo.cpp - Asm Info -------------------------------------------===// |
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 defines target asm properties related what form asm statements |
10 | // should take. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #include "llvm/MC/MCAsmInfo.h" |
15 | #include "llvm/ADT/StringExtras.h" |
16 | #include "llvm/BinaryFormat/Dwarf.h" |
17 | #include "llvm/MC/MCContext.h" |
18 | #include "llvm/MC/MCExpr.h" |
19 | #include "llvm/MC/MCStreamer.h" |
20 | #include "llvm/Support/CommandLine.h" |
21 | |
22 | using namespace llvm; |
23 | |
24 | namespace { |
25 | enum DefaultOnOff { Default, Enable, Disable }; |
26 | } |
27 | static cl::opt<DefaultOnOff> DwarfExtendedLoc( |
28 | "dwarf-extended-loc" , cl::Hidden, |
29 | cl::desc("Disable emission of the extended flags in .loc directives." ), |
30 | cl::values(clEnumVal(Default, "Default for platform" ), |
31 | clEnumVal(Enable, "Enabled" ), clEnumVal(Disable, "Disabled" )), |
32 | cl::init(Val: Default)); |
33 | |
34 | namespace llvm { |
35 | cl::opt<cl::boolOrDefault> UseLEB128Directives( |
36 | "use-leb128-directives" , cl::Hidden, |
37 | cl::desc( |
38 | "Disable the usage of LEB128 directives, and generate .byte instead." ), |
39 | cl::init(Val: cl::BOU_UNSET)); |
40 | } |
41 | |
42 | MCAsmInfo::MCAsmInfo() { |
43 | SeparatorString = ";" ; |
44 | CommentString = "#" ; |
45 | LabelSuffix = ":" ; |
46 | PrivateGlobalPrefix = "L" ; |
47 | PrivateLabelPrefix = PrivateGlobalPrefix; |
48 | LinkerPrivateGlobalPrefix = "" ; |
49 | InlineAsmStart = "APP" ; |
50 | InlineAsmEnd = "NO_APP" ; |
51 | Code16Directive = ".code16" ; |
52 | Code32Directive = ".code32" ; |
53 | Code64Directive = ".code64" ; |
54 | ZeroDirective = "\t.zero\t" ; |
55 | AsciiDirective = "\t.ascii\t" ; |
56 | AscizDirective = "\t.asciz\t" ; |
57 | Data8bitsDirective = "\t.byte\t" ; |
58 | Data16bitsDirective = "\t.short\t" ; |
59 | Data32bitsDirective = "\t.long\t" ; |
60 | Data64bitsDirective = "\t.quad\t" ; |
61 | GlobalDirective = "\t.globl\t" ; |
62 | WeakDirective = "\t.weak\t" ; |
63 | if (DwarfExtendedLoc != Default) |
64 | SupportsExtendedDwarfLocDirective = DwarfExtendedLoc == Enable; |
65 | if (UseLEB128Directives != cl::BOU_UNSET) |
66 | HasLEB128Directives = UseLEB128Directives == cl::BOU_TRUE; |
67 | UseIntegratedAssembler = true; |
68 | ParseInlineAsmUsingAsmParser = false; |
69 | PreserveAsmComments = true; |
70 | PPCUseFullRegisterNames = false; |
71 | } |
72 | |
73 | MCAsmInfo::~MCAsmInfo() = default; |
74 | |
75 | void MCAsmInfo::addInitialFrameState(const MCCFIInstruction &Inst) { |
76 | InitialFrameState.push_back(x: Inst); |
77 | } |
78 | |
79 | const MCExpr * |
80 | MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, |
81 | unsigned Encoding, |
82 | MCStreamer &Streamer) const { |
83 | return getExprForFDESymbol(Sym, Encoding, Streamer); |
84 | } |
85 | |
86 | const MCExpr * |
87 | MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, |
88 | unsigned Encoding, |
89 | MCStreamer &Streamer) const { |
90 | if (!(Encoding & dwarf::DW_EH_PE_pcrel)) |
91 | return MCSymbolRefExpr::create(Symbol: Sym, Ctx&: Streamer.getContext()); |
92 | |
93 | MCContext &Context = Streamer.getContext(); |
94 | const MCExpr *Res = MCSymbolRefExpr::create(Symbol: Sym, Ctx&: Context); |
95 | MCSymbol *PCSym = Context.createTempSymbol(); |
96 | Streamer.emitLabel(Symbol: PCSym); |
97 | const MCExpr *PC = MCSymbolRefExpr::create(Symbol: PCSym, Ctx&: Context); |
98 | return MCBinaryExpr::createSub(LHS: Res, RHS: PC, Ctx&: Context); |
99 | } |
100 | |
101 | bool MCAsmInfo::isAcceptableChar(char C) const { |
102 | if (C == '@') |
103 | return doesAllowAtInName(); |
104 | |
105 | return isAlnum(C) || C == '_' || C == '$' || C == '.'; |
106 | } |
107 | |
108 | bool MCAsmInfo::isValidUnquotedName(StringRef Name) const { |
109 | if (Name.empty()) |
110 | return false; |
111 | |
112 | // If any of the characters in the string is an unacceptable character, force |
113 | // quotes. |
114 | for (char C : Name) { |
115 | if (!isAcceptableChar(C)) |
116 | return false; |
117 | } |
118 | |
119 | return true; |
120 | } |
121 | |
122 | bool MCAsmInfo::shouldOmitSectionDirective(StringRef SectionName) const { |
123 | // FIXME: Does .section .bss/.data/.text work everywhere?? |
124 | return SectionName == ".text" || SectionName == ".data" || |
125 | (SectionName == ".bss" && !usesELFSectionDirectiveForBSS()); |
126 | } |
127 | |