xref: /aosp_15_r20/external/llvm/lib/MC/MCParser/DarwinAsmParser.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- DarwinAsmParser.cpp - Darwin (Mach-O) Assembly Parser --------------===//
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 #include "llvm/MC/MCParser/MCAsmParserExtension.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringSwitch.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCObjectFileInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCParser/MCAsmLexer.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCParser/MCAsmParser.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionMachO.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSymbol.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FileSystem.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/SourceMgr.h"
26*9880d681SAndroid Build Coastguard Worker using namespace llvm;
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker namespace {
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker /// \brief Implementation of directive handling which is shared across all
31*9880d681SAndroid Build Coastguard Worker /// Darwin targets.
32*9880d681SAndroid Build Coastguard Worker class DarwinAsmParser : public MCAsmParserExtension {
33*9880d681SAndroid Build Coastguard Worker   template<bool (DarwinAsmParser::*HandlerMethod)(StringRef, SMLoc)>
addDirectiveHandler(StringRef Directive)34*9880d681SAndroid Build Coastguard Worker   void addDirectiveHandler(StringRef Directive) {
35*9880d681SAndroid Build Coastguard Worker     MCAsmParser::ExtensionDirectiveHandler Handler = std::make_pair(
36*9880d681SAndroid Build Coastguard Worker         this, HandleDirective<DarwinAsmParser, HandlerMethod>);
37*9880d681SAndroid Build Coastguard Worker     getParser().addDirectiveHandler(Directive, Handler);
38*9880d681SAndroid Build Coastguard Worker   }
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker   bool parseSectionSwitch(const char *Segment, const char *Section,
41*9880d681SAndroid Build Coastguard Worker                           unsigned TAA = 0, unsigned ImplicitAlign = 0,
42*9880d681SAndroid Build Coastguard Worker                           unsigned StubSize = 0);
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker   SMLoc LastVersionMinDirective;
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker public:
DarwinAsmParser()47*9880d681SAndroid Build Coastguard Worker   DarwinAsmParser() {}
48*9880d681SAndroid Build Coastguard Worker 
Initialize(MCAsmParser & Parser)49*9880d681SAndroid Build Coastguard Worker   void Initialize(MCAsmParser &Parser) override {
50*9880d681SAndroid Build Coastguard Worker     // Call the base implementation.
51*9880d681SAndroid Build Coastguard Worker     this->MCAsmParserExtension::Initialize(Parser);
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveAltEntry>(".alt_entry");
54*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveDesc>(".desc");
55*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveIndirectSymbol>(
56*9880d681SAndroid Build Coastguard Worker       ".indirect_symbol");
57*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveLsym>(".lsym");
58*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveSubsectionsViaSymbols>(
59*9880d681SAndroid Build Coastguard Worker       ".subsections_via_symbols");
60*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(".dump");
61*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(".load");
62*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveSection>(".section");
63*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectivePushSection>(
64*9880d681SAndroid Build Coastguard Worker       ".pushsection");
65*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectivePopSection>(
66*9880d681SAndroid Build Coastguard Worker       ".popsection");
67*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectivePrevious>(".previous");
68*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogUnique>(
69*9880d681SAndroid Build Coastguard Worker       ".secure_log_unique");
70*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogReset>(
71*9880d681SAndroid Build Coastguard Worker       ".secure_log_reset");
72*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveTBSS>(".tbss");
73*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveZerofill>(".zerofill");
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegion>(
76*9880d681SAndroid Build Coastguard Worker       ".data_region");
77*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegionEnd>(
78*9880d681SAndroid Build Coastguard Worker       ".end_data_region");
79*9880d681SAndroid Build Coastguard Worker 
80*9880d681SAndroid Build Coastguard Worker     // Special section directives.
81*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveBss>(".bss");
82*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConst>(".const");
83*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstData>(
84*9880d681SAndroid Build Coastguard Worker       ".const_data");
85*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstructor>(
86*9880d681SAndroid Build Coastguard Worker       ".constructor");
87*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveCString>(
88*9880d681SAndroid Build Coastguard Worker       ".cstring");
89*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveData>(".data");
90*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDestructor>(
91*9880d681SAndroid Build Coastguard Worker       ".destructor");
92*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDyld>(".dyld");
93*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit0>(
94*9880d681SAndroid Build Coastguard Worker       ".fvmlib_init0");
95*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit1>(
96*9880d681SAndroid Build Coastguard Worker       ".fvmlib_init1");
97*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
98*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveLazySymbolPointers>(
99*9880d681SAndroid Build Coastguard Worker         ".lazy_symbol_pointer");
100*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseDirectiveLinkerOption>(
101*9880d681SAndroid Build Coastguard Worker       ".linker_option");
102*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral16>(
103*9880d681SAndroid Build Coastguard Worker       ".literal16");
104*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral4>(
105*9880d681SAndroid Build Coastguard Worker       ".literal4");
106*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral8>(
107*9880d681SAndroid Build Coastguard Worker       ".literal8");
108*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModInitFunc>(
109*9880d681SAndroid Build Coastguard Worker       ".mod_init_func");
110*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModTermFunc>(
111*9880d681SAndroid Build Coastguard Worker       ".mod_term_func");
112*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
113*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveNonLazySymbolPointers>(
114*9880d681SAndroid Build Coastguard Worker         ".non_lazy_symbol_pointer");
115*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
116*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveThreadLocalVariablePointers>(
117*9880d681SAndroid Build Coastguard Worker         ".thread_local_variable_pointer");
118*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatClsMeth>(
119*9880d681SAndroid Build Coastguard Worker       ".objc_cat_cls_meth");
120*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatInstMeth>(
121*9880d681SAndroid Build Coastguard Worker       ".objc_cat_inst_meth");
122*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCategory>(
123*9880d681SAndroid Build Coastguard Worker       ".objc_category");
124*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClass>(
125*9880d681SAndroid Build Coastguard Worker       ".objc_class");
126*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassNames>(
127*9880d681SAndroid Build Coastguard Worker       ".objc_class_names");
128*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassVars>(
129*9880d681SAndroid Build Coastguard Worker       ".objc_class_vars");
130*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsMeth>(
131*9880d681SAndroid Build Coastguard Worker       ".objc_cls_meth");
132*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsRefs>(
133*9880d681SAndroid Build Coastguard Worker       ".objc_cls_refs");
134*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCInstMeth>(
135*9880d681SAndroid Build Coastguard Worker       ".objc_inst_meth");
136*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
137*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveObjCInstanceVars>(
138*9880d681SAndroid Build Coastguard Worker         ".objc_instance_vars");
139*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMessageRefs>(
140*9880d681SAndroid Build Coastguard Worker       ".objc_message_refs");
141*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMetaClass>(
142*9880d681SAndroid Build Coastguard Worker       ".objc_meta_class");
143*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
144*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveObjCMethVarNames>(
145*9880d681SAndroid Build Coastguard Worker         ".objc_meth_var_names");
146*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
147*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveObjCMethVarTypes>(
148*9880d681SAndroid Build Coastguard Worker         ".objc_meth_var_types");
149*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCModuleInfo>(
150*9880d681SAndroid Build Coastguard Worker       ".objc_module_info");
151*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCProtocol>(
152*9880d681SAndroid Build Coastguard Worker       ".objc_protocol");
153*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
154*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveObjCSelectorStrs>(
155*9880d681SAndroid Build Coastguard Worker         ".objc_selector_strs");
156*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<
157*9880d681SAndroid Build Coastguard Worker       &DarwinAsmParser::parseSectionDirectiveObjCStringObject>(
158*9880d681SAndroid Build Coastguard Worker         ".objc_string_object");
159*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCSymbols>(
160*9880d681SAndroid Build Coastguard Worker       ".objc_symbols");
161*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectivePICSymbolStub>(
162*9880d681SAndroid Build Coastguard Worker       ".picsymbol_stub");
163*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticConst>(
164*9880d681SAndroid Build Coastguard Worker       ".static_const");
165*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticData>(
166*9880d681SAndroid Build Coastguard Worker       ".static_data");
167*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveSymbolStub>(
168*9880d681SAndroid Build Coastguard Worker       ".symbol_stub");
169*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTData>(".tdata");
170*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveText>(".text");
171*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveThreadInitFunc>(
172*9880d681SAndroid Build Coastguard Worker       ".thread_init_func");
173*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTLV>(".tlv");
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveIdent>(".ident");
176*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(
177*9880d681SAndroid Build Coastguard Worker       ".watchos_version_min");
178*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(".tvos_version_min");
179*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(".ios_version_min");
180*9880d681SAndroid Build Coastguard Worker     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(
181*9880d681SAndroid Build Coastguard Worker       ".macosx_version_min");
182*9880d681SAndroid Build Coastguard Worker 
183*9880d681SAndroid Build Coastguard Worker     LastVersionMinDirective = SMLoc();
184*9880d681SAndroid Build Coastguard Worker   }
185*9880d681SAndroid Build Coastguard Worker 
186*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveAltEntry(StringRef, SMLoc);
187*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveDesc(StringRef, SMLoc);
188*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveIndirectSymbol(StringRef, SMLoc);
189*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveDumpOrLoad(StringRef, SMLoc);
190*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveLsym(StringRef, SMLoc);
191*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveLinkerOption(StringRef, SMLoc);
192*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveSection(StringRef, SMLoc);
193*9880d681SAndroid Build Coastguard Worker   bool parseDirectivePushSection(StringRef, SMLoc);
194*9880d681SAndroid Build Coastguard Worker   bool parseDirectivePopSection(StringRef, SMLoc);
195*9880d681SAndroid Build Coastguard Worker   bool parseDirectivePrevious(StringRef, SMLoc);
196*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveSecureLogReset(StringRef, SMLoc);
197*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveSecureLogUnique(StringRef, SMLoc);
198*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);
199*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveTBSS(StringRef, SMLoc);
200*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveZerofill(StringRef, SMLoc);
201*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveDataRegion(StringRef, SMLoc);
202*9880d681SAndroid Build Coastguard Worker   bool parseDirectiveDataRegionEnd(StringRef, SMLoc);
203*9880d681SAndroid Build Coastguard Worker 
204*9880d681SAndroid Build Coastguard Worker   // Named Section Directive
parseSectionDirectiveBss(StringRef,SMLoc)205*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveBss(StringRef, SMLoc) {
206*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__bss");
207*9880d681SAndroid Build Coastguard Worker   }
208*9880d681SAndroid Build Coastguard Worker 
parseSectionDirectiveConst(StringRef,SMLoc)209*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveConst(StringRef, SMLoc) {
210*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__const");
211*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveStaticConst(StringRef,SMLoc)212*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveStaticConst(StringRef, SMLoc) {
213*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__static_const");
214*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveCString(StringRef,SMLoc)215*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveCString(StringRef, SMLoc) {
216*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__cstring",
217*9880d681SAndroid Build Coastguard Worker                               MachO::S_CSTRING_LITERALS);
218*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveLiteral4(StringRef,SMLoc)219*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveLiteral4(StringRef, SMLoc) {
220*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__literal4",
221*9880d681SAndroid Build Coastguard Worker                               MachO::S_4BYTE_LITERALS, 4);
222*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveLiteral8(StringRef,SMLoc)223*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveLiteral8(StringRef, SMLoc) {
224*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__literal8",
225*9880d681SAndroid Build Coastguard Worker                               MachO::S_8BYTE_LITERALS, 8);
226*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveLiteral16(StringRef,SMLoc)227*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveLiteral16(StringRef, SMLoc) {
228*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__literal16",
229*9880d681SAndroid Build Coastguard Worker                               MachO::S_16BYTE_LITERALS, 16);
230*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveConstructor(StringRef,SMLoc)231*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveConstructor(StringRef, SMLoc) {
232*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__constructor");
233*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveDestructor(StringRef,SMLoc)234*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveDestructor(StringRef, SMLoc) {
235*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__destructor");
236*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveFVMLibInit0(StringRef,SMLoc)237*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveFVMLibInit0(StringRef, SMLoc) {
238*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__fvmlib_init0");
239*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveFVMLibInit1(StringRef,SMLoc)240*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveFVMLibInit1(StringRef, SMLoc) {
241*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__fvmlib_init1");
242*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveSymbolStub(StringRef,SMLoc)243*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveSymbolStub(StringRef, SMLoc) {
244*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__symbol_stub",
245*9880d681SAndroid Build Coastguard Worker                               MachO::S_SYMBOL_STUBS |
246*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_PURE_INSTRUCTIONS,
247*9880d681SAndroid Build Coastguard Worker                               // FIXME: Different on PPC and ARM.
248*9880d681SAndroid Build Coastguard Worker                               0, 16);
249*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectivePICSymbolStub(StringRef,SMLoc)250*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectivePICSymbolStub(StringRef, SMLoc) {
251*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT","__picsymbol_stub",
252*9880d681SAndroid Build Coastguard Worker                               MachO::S_SYMBOL_STUBS |
253*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_PURE_INSTRUCTIONS, 0, 26);
254*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveData(StringRef,SMLoc)255*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveData(StringRef, SMLoc) {
256*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__data");
257*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveStaticData(StringRef,SMLoc)258*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveStaticData(StringRef, SMLoc) {
259*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__static_data");
260*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveNonLazySymbolPointers(StringRef,SMLoc)261*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveNonLazySymbolPointers(StringRef, SMLoc) {
262*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__nl_symbol_ptr",
263*9880d681SAndroid Build Coastguard Worker                               MachO::S_NON_LAZY_SYMBOL_POINTERS, 4);
264*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveLazySymbolPointers(StringRef,SMLoc)265*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveLazySymbolPointers(StringRef, SMLoc) {
266*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__la_symbol_ptr",
267*9880d681SAndroid Build Coastguard Worker                               MachO::S_LAZY_SYMBOL_POINTERS, 4);
268*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveThreadLocalVariablePointers(StringRef,SMLoc)269*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveThreadLocalVariablePointers(StringRef, SMLoc) {
270*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__thread_ptr",
271*9880d681SAndroid Build Coastguard Worker                               MachO::S_THREAD_LOCAL_VARIABLE_POINTERS, 4);
272*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveDyld(StringRef,SMLoc)273*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveDyld(StringRef, SMLoc) {
274*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__dyld");
275*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveModInitFunc(StringRef,SMLoc)276*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveModInitFunc(StringRef, SMLoc) {
277*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__mod_init_func",
278*9880d681SAndroid Build Coastguard Worker                               MachO::S_MOD_INIT_FUNC_POINTERS, 4);
279*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveModTermFunc(StringRef,SMLoc)280*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveModTermFunc(StringRef, SMLoc) {
281*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__mod_term_func",
282*9880d681SAndroid Build Coastguard Worker                               MachO::S_MOD_TERM_FUNC_POINTERS, 4);
283*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveConstData(StringRef,SMLoc)284*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveConstData(StringRef, SMLoc) {
285*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__const");
286*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCClass(StringRef,SMLoc)287*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCClass(StringRef, SMLoc) {
288*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__class",
289*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
290*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCMetaClass(StringRef,SMLoc)291*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCMetaClass(StringRef, SMLoc) {
292*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__meta_class",
293*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
294*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCCatClsMeth(StringRef,SMLoc)295*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCCatClsMeth(StringRef, SMLoc) {
296*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__cat_cls_meth",
297*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
298*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCCatInstMeth(StringRef,SMLoc)299*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCCatInstMeth(StringRef, SMLoc) {
300*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__cat_inst_meth",
301*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
302*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCProtocol(StringRef,SMLoc)303*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCProtocol(StringRef, SMLoc) {
304*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__protocol",
305*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
306*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCStringObject(StringRef,SMLoc)307*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCStringObject(StringRef, SMLoc) {
308*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__string_object",
309*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
310*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCClsMeth(StringRef,SMLoc)311*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCClsMeth(StringRef, SMLoc) {
312*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__cls_meth",
313*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
314*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCInstMeth(StringRef,SMLoc)315*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCInstMeth(StringRef, SMLoc) {
316*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__inst_meth",
317*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
318*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCClsRefs(StringRef,SMLoc)319*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCClsRefs(StringRef, SMLoc) {
320*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__cls_refs",
321*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP |
322*9880d681SAndroid Build Coastguard Worker                               MachO::S_LITERAL_POINTERS, 4);
323*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCMessageRefs(StringRef,SMLoc)324*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCMessageRefs(StringRef, SMLoc) {
325*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__message_refs",
326*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP |
327*9880d681SAndroid Build Coastguard Worker                               MachO::S_LITERAL_POINTERS, 4);
328*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCSymbols(StringRef,SMLoc)329*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCSymbols(StringRef, SMLoc) {
330*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__symbols",
331*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
332*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCCategory(StringRef,SMLoc)333*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCCategory(StringRef, SMLoc) {
334*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__category",
335*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
336*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCClassVars(StringRef,SMLoc)337*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCClassVars(StringRef, SMLoc) {
338*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__class_vars",
339*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
340*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCInstanceVars(StringRef,SMLoc)341*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCInstanceVars(StringRef, SMLoc) {
342*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__instance_vars",
343*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
344*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCModuleInfo(StringRef,SMLoc)345*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCModuleInfo(StringRef, SMLoc) {
346*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__module_info",
347*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_NO_DEAD_STRIP);
348*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCClassNames(StringRef,SMLoc)349*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCClassNames(StringRef, SMLoc) {
350*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__cstring",
351*9880d681SAndroid Build Coastguard Worker                               MachO::S_CSTRING_LITERALS);
352*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCMethVarTypes(StringRef,SMLoc)353*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCMethVarTypes(StringRef, SMLoc) {
354*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__cstring",
355*9880d681SAndroid Build Coastguard Worker                               MachO::S_CSTRING_LITERALS);
356*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCMethVarNames(StringRef,SMLoc)357*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCMethVarNames(StringRef, SMLoc) {
358*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__cstring",
359*9880d681SAndroid Build Coastguard Worker                               MachO::S_CSTRING_LITERALS);
360*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveObjCSelectorStrs(StringRef,SMLoc)361*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveObjCSelectorStrs(StringRef, SMLoc) {
362*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__OBJC", "__selector_strs",
363*9880d681SAndroid Build Coastguard Worker                               MachO::S_CSTRING_LITERALS);
364*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveTData(StringRef,SMLoc)365*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveTData(StringRef, SMLoc) {
366*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__thread_data",
367*9880d681SAndroid Build Coastguard Worker                               MachO::S_THREAD_LOCAL_REGULAR);
368*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveText(StringRef,SMLoc)369*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveText(StringRef, SMLoc) {
370*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__TEXT", "__text",
371*9880d681SAndroid Build Coastguard Worker                               MachO::S_ATTR_PURE_INSTRUCTIONS);
372*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveTLV(StringRef,SMLoc)373*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveTLV(StringRef, SMLoc) {
374*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__thread_vars",
375*9880d681SAndroid Build Coastguard Worker                               MachO::S_THREAD_LOCAL_VARIABLES);
376*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveIdent(StringRef,SMLoc)377*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveIdent(StringRef, SMLoc) {
378*9880d681SAndroid Build Coastguard Worker     // Darwin silently ignores the .ident directive.
379*9880d681SAndroid Build Coastguard Worker     getParser().eatToEndOfStatement();
380*9880d681SAndroid Build Coastguard Worker     return false;
381*9880d681SAndroid Build Coastguard Worker   }
parseSectionDirectiveThreadInitFunc(StringRef,SMLoc)382*9880d681SAndroid Build Coastguard Worker   bool parseSectionDirectiveThreadInitFunc(StringRef, SMLoc) {
383*9880d681SAndroid Build Coastguard Worker     return parseSectionSwitch("__DATA", "__thread_init",
384*9880d681SAndroid Build Coastguard Worker                          MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS);
385*9880d681SAndroid Build Coastguard Worker   }
386*9880d681SAndroid Build Coastguard Worker   bool parseVersionMin(StringRef, SMLoc);
387*9880d681SAndroid Build Coastguard Worker 
388*9880d681SAndroid Build Coastguard Worker };
389*9880d681SAndroid Build Coastguard Worker 
390*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
391*9880d681SAndroid Build Coastguard Worker 
parseSectionSwitch(const char * Segment,const char * Section,unsigned TAA,unsigned Align,unsigned StubSize)392*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseSectionSwitch(const char *Segment,
393*9880d681SAndroid Build Coastguard Worker                                          const char *Section,
394*9880d681SAndroid Build Coastguard Worker                                          unsigned TAA, unsigned Align,
395*9880d681SAndroid Build Coastguard Worker                                          unsigned StubSize) {
396*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
397*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in section switching directive");
398*9880d681SAndroid Build Coastguard Worker   Lex();
399*9880d681SAndroid Build Coastguard Worker 
400*9880d681SAndroid Build Coastguard Worker   // FIXME: Arch specific.
401*9880d681SAndroid Build Coastguard Worker   bool isText = TAA & MachO::S_ATTR_PURE_INSTRUCTIONS;
402*9880d681SAndroid Build Coastguard Worker   getStreamer().SwitchSection(getContext().getMachOSection(
403*9880d681SAndroid Build Coastguard Worker       Segment, Section, TAA, StubSize,
404*9880d681SAndroid Build Coastguard Worker       isText ? SectionKind::getText() : SectionKind::getData()));
405*9880d681SAndroid Build Coastguard Worker 
406*9880d681SAndroid Build Coastguard Worker   // Set the implicit alignment, if any.
407*9880d681SAndroid Build Coastguard Worker   //
408*9880d681SAndroid Build Coastguard Worker   // FIXME: This isn't really what 'as' does; I think it just uses the implicit
409*9880d681SAndroid Build Coastguard Worker   // alignment on the section (e.g., if one manually inserts bytes into the
410*9880d681SAndroid Build Coastguard Worker   // section, then just issuing the section switch directive will not realign
411*9880d681SAndroid Build Coastguard Worker   // the section. However, this is arguably more reasonable behavior, and there
412*9880d681SAndroid Build Coastguard Worker   // is no good reason for someone to intentionally emit incorrectly sized
413*9880d681SAndroid Build Coastguard Worker   // values into the implicitly aligned sections.
414*9880d681SAndroid Build Coastguard Worker   if (Align)
415*9880d681SAndroid Build Coastguard Worker     getStreamer().EmitValueToAlignment(Align);
416*9880d681SAndroid Build Coastguard Worker 
417*9880d681SAndroid Build Coastguard Worker   return false;
418*9880d681SAndroid Build Coastguard Worker }
419*9880d681SAndroid Build Coastguard Worker 
420*9880d681SAndroid Build Coastguard Worker /// parseDirectiveAltEntry
421*9880d681SAndroid Build Coastguard Worker ///  ::= .alt_entry identifier
parseDirectiveAltEntry(StringRef,SMLoc)422*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveAltEntry(StringRef, SMLoc) {
423*9880d681SAndroid Build Coastguard Worker   StringRef Name;
424*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Name))
425*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in directive");
426*9880d681SAndroid Build Coastguard Worker 
427*9880d681SAndroid Build Coastguard Worker   // Look up symbol.
428*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
429*9880d681SAndroid Build Coastguard Worker 
430*9880d681SAndroid Build Coastguard Worker   if (Sym->isDefined())
431*9880d681SAndroid Build Coastguard Worker     return TokError(".alt_entry must preceed symbol definition");
432*9880d681SAndroid Build Coastguard Worker 
433*9880d681SAndroid Build Coastguard Worker   if (!getStreamer().EmitSymbolAttribute(Sym, MCSA_AltEntry))
434*9880d681SAndroid Build Coastguard Worker     return TokError("unable to emit symbol attribute");
435*9880d681SAndroid Build Coastguard Worker 
436*9880d681SAndroid Build Coastguard Worker   Lex();
437*9880d681SAndroid Build Coastguard Worker   return false;
438*9880d681SAndroid Build Coastguard Worker }
439*9880d681SAndroid Build Coastguard Worker 
440*9880d681SAndroid Build Coastguard Worker /// parseDirectiveDesc
441*9880d681SAndroid Build Coastguard Worker ///  ::= .desc identifier , expression
parseDirectiveDesc(StringRef,SMLoc)442*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveDesc(StringRef, SMLoc) {
443*9880d681SAndroid Build Coastguard Worker   StringRef Name;
444*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Name))
445*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in directive");
446*9880d681SAndroid Build Coastguard Worker 
447*9880d681SAndroid Build Coastguard Worker   // Handle the identifier as the key symbol.
448*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
449*9880d681SAndroid Build Coastguard Worker 
450*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
451*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.desc' directive");
452*9880d681SAndroid Build Coastguard Worker   Lex();
453*9880d681SAndroid Build Coastguard Worker 
454*9880d681SAndroid Build Coastguard Worker   int64_t DescValue;
455*9880d681SAndroid Build Coastguard Worker   if (getParser().parseAbsoluteExpression(DescValue))
456*9880d681SAndroid Build Coastguard Worker     return true;
457*9880d681SAndroid Build Coastguard Worker 
458*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
459*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.desc' directive");
460*9880d681SAndroid Build Coastguard Worker 
461*9880d681SAndroid Build Coastguard Worker   Lex();
462*9880d681SAndroid Build Coastguard Worker 
463*9880d681SAndroid Build Coastguard Worker   // Set the n_desc field of this Symbol to this DescValue
464*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitSymbolDesc(Sym, DescValue);
465*9880d681SAndroid Build Coastguard Worker 
466*9880d681SAndroid Build Coastguard Worker   return false;
467*9880d681SAndroid Build Coastguard Worker }
468*9880d681SAndroid Build Coastguard Worker 
469*9880d681SAndroid Build Coastguard Worker /// parseDirectiveIndirectSymbol
470*9880d681SAndroid Build Coastguard Worker ///  ::= .indirect_symbol identifier
parseDirectiveIndirectSymbol(StringRef,SMLoc Loc)471*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveIndirectSymbol(StringRef, SMLoc Loc) {
472*9880d681SAndroid Build Coastguard Worker   const MCSectionMachO *Current = static_cast<const MCSectionMachO*>(
473*9880d681SAndroid Build Coastguard Worker                                        getStreamer().getCurrentSection().first);
474*9880d681SAndroid Build Coastguard Worker   MachO::SectionType SectionType = Current->getType();
475*9880d681SAndroid Build Coastguard Worker   if (SectionType != MachO::S_NON_LAZY_SYMBOL_POINTERS &&
476*9880d681SAndroid Build Coastguard Worker       SectionType != MachO::S_LAZY_SYMBOL_POINTERS &&
477*9880d681SAndroid Build Coastguard Worker       SectionType != MachO::S_THREAD_LOCAL_VARIABLE_POINTERS &&
478*9880d681SAndroid Build Coastguard Worker       SectionType != MachO::S_SYMBOL_STUBS)
479*9880d681SAndroid Build Coastguard Worker     return Error(Loc, "indirect symbol not in a symbol pointer or stub "
480*9880d681SAndroid Build Coastguard Worker                       "section");
481*9880d681SAndroid Build Coastguard Worker 
482*9880d681SAndroid Build Coastguard Worker   StringRef Name;
483*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Name))
484*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in .indirect_symbol directive");
485*9880d681SAndroid Build Coastguard Worker 
486*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
487*9880d681SAndroid Build Coastguard Worker 
488*9880d681SAndroid Build Coastguard Worker   // Assembler local symbols don't make any sense here. Complain loudly.
489*9880d681SAndroid Build Coastguard Worker   if (Sym->isTemporary())
490*9880d681SAndroid Build Coastguard Worker     return TokError("non-local symbol required in directive");
491*9880d681SAndroid Build Coastguard Worker 
492*9880d681SAndroid Build Coastguard Worker   if (!getStreamer().EmitSymbolAttribute(Sym, MCSA_IndirectSymbol))
493*9880d681SAndroid Build Coastguard Worker     return TokError("unable to emit indirect symbol attribute for: " + Name);
494*9880d681SAndroid Build Coastguard Worker 
495*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
496*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.indirect_symbol' directive");
497*9880d681SAndroid Build Coastguard Worker 
498*9880d681SAndroid Build Coastguard Worker   Lex();
499*9880d681SAndroid Build Coastguard Worker 
500*9880d681SAndroid Build Coastguard Worker   return false;
501*9880d681SAndroid Build Coastguard Worker }
502*9880d681SAndroid Build Coastguard Worker 
503*9880d681SAndroid Build Coastguard Worker /// parseDirectiveDumpOrLoad
504*9880d681SAndroid Build Coastguard Worker ///  ::= ( .dump | .load ) "filename"
parseDirectiveDumpOrLoad(StringRef Directive,SMLoc IDLoc)505*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveDumpOrLoad(StringRef Directive,
506*9880d681SAndroid Build Coastguard Worker                                                SMLoc IDLoc) {
507*9880d681SAndroid Build Coastguard Worker   bool IsDump = Directive == ".dump";
508*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::String))
509*9880d681SAndroid Build Coastguard Worker     return TokError("expected string in '.dump' or '.load' directive");
510*9880d681SAndroid Build Coastguard Worker 
511*9880d681SAndroid Build Coastguard Worker   Lex();
512*9880d681SAndroid Build Coastguard Worker 
513*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
514*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.dump' or '.load' directive");
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker   Lex();
517*9880d681SAndroid Build Coastguard Worker 
518*9880d681SAndroid Build Coastguard Worker   // FIXME: If/when .dump and .load are implemented they will be done in the
519*9880d681SAndroid Build Coastguard Worker   // the assembly parser and not have any need for an MCStreamer API.
520*9880d681SAndroid Build Coastguard Worker   if (IsDump)
521*9880d681SAndroid Build Coastguard Worker     return Warning(IDLoc, "ignoring directive .dump for now");
522*9880d681SAndroid Build Coastguard Worker   else
523*9880d681SAndroid Build Coastguard Worker     return Warning(IDLoc, "ignoring directive .load for now");
524*9880d681SAndroid Build Coastguard Worker }
525*9880d681SAndroid Build Coastguard Worker 
526*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveLinkerOption
527*9880d681SAndroid Build Coastguard Worker ///  ::= .linker_option "string" ( , "string" )*
parseDirectiveLinkerOption(StringRef IDVal,SMLoc)528*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveLinkerOption(StringRef IDVal, SMLoc) {
529*9880d681SAndroid Build Coastguard Worker   SmallVector<std::string, 4> Args;
530*9880d681SAndroid Build Coastguard Worker   for (;;) {
531*9880d681SAndroid Build Coastguard Worker     if (getLexer().isNot(AsmToken::String))
532*9880d681SAndroid Build Coastguard Worker       return TokError("expected string in '" + Twine(IDVal) + "' directive");
533*9880d681SAndroid Build Coastguard Worker 
534*9880d681SAndroid Build Coastguard Worker     std::string Data;
535*9880d681SAndroid Build Coastguard Worker     if (getParser().parseEscapedString(Data))
536*9880d681SAndroid Build Coastguard Worker       return true;
537*9880d681SAndroid Build Coastguard Worker 
538*9880d681SAndroid Build Coastguard Worker     Args.push_back(Data);
539*9880d681SAndroid Build Coastguard Worker 
540*9880d681SAndroid Build Coastguard Worker     Lex();
541*9880d681SAndroid Build Coastguard Worker     if (getLexer().is(AsmToken::EndOfStatement))
542*9880d681SAndroid Build Coastguard Worker       break;
543*9880d681SAndroid Build Coastguard Worker 
544*9880d681SAndroid Build Coastguard Worker     if (getLexer().isNot(AsmToken::Comma))
545*9880d681SAndroid Build Coastguard Worker       return TokError("unexpected token in '" + Twine(IDVal) + "' directive");
546*9880d681SAndroid Build Coastguard Worker     Lex();
547*9880d681SAndroid Build Coastguard Worker   }
548*9880d681SAndroid Build Coastguard Worker 
549*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitLinkerOptions(Args);
550*9880d681SAndroid Build Coastguard Worker   return false;
551*9880d681SAndroid Build Coastguard Worker }
552*9880d681SAndroid Build Coastguard Worker 
553*9880d681SAndroid Build Coastguard Worker /// parseDirectiveLsym
554*9880d681SAndroid Build Coastguard Worker ///  ::= .lsym identifier , expression
parseDirectiveLsym(StringRef,SMLoc)555*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveLsym(StringRef, SMLoc) {
556*9880d681SAndroid Build Coastguard Worker   StringRef Name;
557*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Name))
558*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in directive");
559*9880d681SAndroid Build Coastguard Worker 
560*9880d681SAndroid Build Coastguard Worker   // Handle the identifier as the key symbol.
561*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
562*9880d681SAndroid Build Coastguard Worker 
563*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
564*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.lsym' directive");
565*9880d681SAndroid Build Coastguard Worker   Lex();
566*9880d681SAndroid Build Coastguard Worker 
567*9880d681SAndroid Build Coastguard Worker   const MCExpr *Value;
568*9880d681SAndroid Build Coastguard Worker   if (getParser().parseExpression(Value))
569*9880d681SAndroid Build Coastguard Worker     return true;
570*9880d681SAndroid Build Coastguard Worker 
571*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
572*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.lsym' directive");
573*9880d681SAndroid Build Coastguard Worker 
574*9880d681SAndroid Build Coastguard Worker   Lex();
575*9880d681SAndroid Build Coastguard Worker 
576*9880d681SAndroid Build Coastguard Worker   // We don't currently support this directive.
577*9880d681SAndroid Build Coastguard Worker   //
578*9880d681SAndroid Build Coastguard Worker   // FIXME: Diagnostic location!
579*9880d681SAndroid Build Coastguard Worker   (void) Sym;
580*9880d681SAndroid Build Coastguard Worker   return TokError("directive '.lsym' is unsupported");
581*9880d681SAndroid Build Coastguard Worker }
582*9880d681SAndroid Build Coastguard Worker 
583*9880d681SAndroid Build Coastguard Worker /// parseDirectiveSection:
584*9880d681SAndroid Build Coastguard Worker ///   ::= .section identifier (',' identifier)*
parseDirectiveSection(StringRef,SMLoc)585*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) {
586*9880d681SAndroid Build Coastguard Worker   SMLoc Loc = getLexer().getLoc();
587*9880d681SAndroid Build Coastguard Worker 
588*9880d681SAndroid Build Coastguard Worker   StringRef SectionName;
589*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(SectionName))
590*9880d681SAndroid Build Coastguard Worker     return Error(Loc, "expected identifier after '.section' directive");
591*9880d681SAndroid Build Coastguard Worker 
592*9880d681SAndroid Build Coastguard Worker   // Verify there is a following comma.
593*9880d681SAndroid Build Coastguard Worker   if (!getLexer().is(AsmToken::Comma))
594*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.section' directive");
595*9880d681SAndroid Build Coastguard Worker 
596*9880d681SAndroid Build Coastguard Worker   std::string SectionSpec = SectionName;
597*9880d681SAndroid Build Coastguard Worker   SectionSpec += ",";
598*9880d681SAndroid Build Coastguard Worker 
599*9880d681SAndroid Build Coastguard Worker   // Add all the tokens until the end of the line, ParseSectionSpecifier will
600*9880d681SAndroid Build Coastguard Worker   // handle this.
601*9880d681SAndroid Build Coastguard Worker   StringRef EOL = getLexer().LexUntilEndOfStatement();
602*9880d681SAndroid Build Coastguard Worker   SectionSpec.append(EOL.begin(), EOL.end());
603*9880d681SAndroid Build Coastguard Worker 
604*9880d681SAndroid Build Coastguard Worker   Lex();
605*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
606*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.section' directive");
607*9880d681SAndroid Build Coastguard Worker   Lex();
608*9880d681SAndroid Build Coastguard Worker 
609*9880d681SAndroid Build Coastguard Worker 
610*9880d681SAndroid Build Coastguard Worker   StringRef Segment, Section;
611*9880d681SAndroid Build Coastguard Worker   unsigned StubSize;
612*9880d681SAndroid Build Coastguard Worker   unsigned TAA;
613*9880d681SAndroid Build Coastguard Worker   bool TAAParsed;
614*9880d681SAndroid Build Coastguard Worker   std::string ErrorStr =
615*9880d681SAndroid Build Coastguard Worker     MCSectionMachO::ParseSectionSpecifier(SectionSpec, Segment, Section,
616*9880d681SAndroid Build Coastguard Worker                                           TAA, TAAParsed, StubSize);
617*9880d681SAndroid Build Coastguard Worker 
618*9880d681SAndroid Build Coastguard Worker   if (!ErrorStr.empty())
619*9880d681SAndroid Build Coastguard Worker     return Error(Loc, ErrorStr.c_str());
620*9880d681SAndroid Build Coastguard Worker 
621*9880d681SAndroid Build Coastguard Worker   // Issue a warning if the target is not powerpc and Section is a *coal* section.
622*9880d681SAndroid Build Coastguard Worker   Triple TT = getParser().getContext().getObjectFileInfo()->getTargetTriple();
623*9880d681SAndroid Build Coastguard Worker   Triple::ArchType ArchTy = TT.getArch();
624*9880d681SAndroid Build Coastguard Worker 
625*9880d681SAndroid Build Coastguard Worker   if (ArchTy != Triple::ppc && ArchTy != Triple::ppc64) {
626*9880d681SAndroid Build Coastguard Worker     StringRef NonCoalSection = StringSwitch<StringRef>(Section)
627*9880d681SAndroid Build Coastguard Worker                                    .Case("__textcoal_nt", "__text")
628*9880d681SAndroid Build Coastguard Worker                                    .Case("__const_coal", "__const")
629*9880d681SAndroid Build Coastguard Worker                                    .Case("__datacoal_nt", "__data")
630*9880d681SAndroid Build Coastguard Worker                                    .Default(Section);
631*9880d681SAndroid Build Coastguard Worker 
632*9880d681SAndroid Build Coastguard Worker     if (!Section.equals(NonCoalSection)) {
633*9880d681SAndroid Build Coastguard Worker       StringRef SectionVal(Loc.getPointer());
634*9880d681SAndroid Build Coastguard Worker       size_t B = SectionVal.find(',') + 1, E = SectionVal.find(',', B);
635*9880d681SAndroid Build Coastguard Worker       SMLoc BLoc = SMLoc::getFromPointer(SectionVal.data() + B);
636*9880d681SAndroid Build Coastguard Worker       SMLoc ELoc = SMLoc::getFromPointer(SectionVal.data() + E);
637*9880d681SAndroid Build Coastguard Worker       getParser().Warning(Loc, "section \"" + Section + "\" is deprecated",
638*9880d681SAndroid Build Coastguard Worker                           SMRange(BLoc, ELoc));
639*9880d681SAndroid Build Coastguard Worker       getParser().Note(Loc, "change section name to \"" + NonCoalSection +
640*9880d681SAndroid Build Coastguard Worker                        "\"", SMRange(BLoc, ELoc));
641*9880d681SAndroid Build Coastguard Worker     }
642*9880d681SAndroid Build Coastguard Worker   }
643*9880d681SAndroid Build Coastguard Worker 
644*9880d681SAndroid Build Coastguard Worker   // FIXME: Arch specific.
645*9880d681SAndroid Build Coastguard Worker   bool isText = Segment == "__TEXT";  // FIXME: Hack.
646*9880d681SAndroid Build Coastguard Worker   getStreamer().SwitchSection(getContext().getMachOSection(
647*9880d681SAndroid Build Coastguard Worker       Segment, Section, TAA, StubSize,
648*9880d681SAndroid Build Coastguard Worker       isText ? SectionKind::getText() : SectionKind::getData()));
649*9880d681SAndroid Build Coastguard Worker   return false;
650*9880d681SAndroid Build Coastguard Worker }
651*9880d681SAndroid Build Coastguard Worker 
652*9880d681SAndroid Build Coastguard Worker /// ParseDirectivePushSection:
653*9880d681SAndroid Build Coastguard Worker ///   ::= .pushsection identifier (',' identifier)*
parseDirectivePushSection(StringRef S,SMLoc Loc)654*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectivePushSection(StringRef S, SMLoc Loc) {
655*9880d681SAndroid Build Coastguard Worker   getStreamer().PushSection();
656*9880d681SAndroid Build Coastguard Worker 
657*9880d681SAndroid Build Coastguard Worker   if (parseDirectiveSection(S, Loc)) {
658*9880d681SAndroid Build Coastguard Worker     getStreamer().PopSection();
659*9880d681SAndroid Build Coastguard Worker     return true;
660*9880d681SAndroid Build Coastguard Worker   }
661*9880d681SAndroid Build Coastguard Worker 
662*9880d681SAndroid Build Coastguard Worker   return false;
663*9880d681SAndroid Build Coastguard Worker }
664*9880d681SAndroid Build Coastguard Worker 
665*9880d681SAndroid Build Coastguard Worker /// ParseDirectivePopSection:
666*9880d681SAndroid Build Coastguard Worker ///   ::= .popsection
parseDirectivePopSection(StringRef,SMLoc)667*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectivePopSection(StringRef, SMLoc) {
668*9880d681SAndroid Build Coastguard Worker   if (!getStreamer().PopSection())
669*9880d681SAndroid Build Coastguard Worker     return TokError(".popsection without corresponding .pushsection");
670*9880d681SAndroid Build Coastguard Worker   return false;
671*9880d681SAndroid Build Coastguard Worker }
672*9880d681SAndroid Build Coastguard Worker 
673*9880d681SAndroid Build Coastguard Worker /// ParseDirectivePrevious:
674*9880d681SAndroid Build Coastguard Worker ///   ::= .previous
parseDirectivePrevious(StringRef DirName,SMLoc)675*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectivePrevious(StringRef DirName, SMLoc) {
676*9880d681SAndroid Build Coastguard Worker   MCSectionSubPair PreviousSection = getStreamer().getPreviousSection();
677*9880d681SAndroid Build Coastguard Worker   if (!PreviousSection.first)
678*9880d681SAndroid Build Coastguard Worker     return TokError(".previous without corresponding .section");
679*9880d681SAndroid Build Coastguard Worker   getStreamer().SwitchSection(PreviousSection.first, PreviousSection.second);
680*9880d681SAndroid Build Coastguard Worker   return false;
681*9880d681SAndroid Build Coastguard Worker }
682*9880d681SAndroid Build Coastguard Worker 
683*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveSecureLogUnique
684*9880d681SAndroid Build Coastguard Worker ///  ::= .secure_log_unique ... message ...
parseDirectiveSecureLogUnique(StringRef,SMLoc IDLoc)685*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveSecureLogUnique(StringRef, SMLoc IDLoc) {
686*9880d681SAndroid Build Coastguard Worker   StringRef LogMessage = getParser().parseStringToEndOfStatement();
687*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
688*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.secure_log_unique' directive");
689*9880d681SAndroid Build Coastguard Worker 
690*9880d681SAndroid Build Coastguard Worker   if (getContext().getSecureLogUsed())
691*9880d681SAndroid Build Coastguard Worker     return Error(IDLoc, ".secure_log_unique specified multiple times");
692*9880d681SAndroid Build Coastguard Worker 
693*9880d681SAndroid Build Coastguard Worker   // Get the secure log path.
694*9880d681SAndroid Build Coastguard Worker   const char *SecureLogFile = getContext().getSecureLogFile();
695*9880d681SAndroid Build Coastguard Worker   if (!SecureLogFile)
696*9880d681SAndroid Build Coastguard Worker     return Error(IDLoc, ".secure_log_unique used but AS_SECURE_LOG_FILE "
697*9880d681SAndroid Build Coastguard Worker                  "environment variable unset.");
698*9880d681SAndroid Build Coastguard Worker 
699*9880d681SAndroid Build Coastguard Worker   // Open the secure log file if we haven't already.
700*9880d681SAndroid Build Coastguard Worker   raw_fd_ostream *OS = getContext().getSecureLog();
701*9880d681SAndroid Build Coastguard Worker   if (!OS) {
702*9880d681SAndroid Build Coastguard Worker     std::error_code EC;
703*9880d681SAndroid Build Coastguard Worker     auto NewOS = llvm::make_unique<raw_fd_ostream>(
704*9880d681SAndroid Build Coastguard Worker         SecureLogFile, EC, sys::fs::F_Append | sys::fs::F_Text);
705*9880d681SAndroid Build Coastguard Worker     if (EC)
706*9880d681SAndroid Build Coastguard Worker        return Error(IDLoc, Twine("can't open secure log file: ") +
707*9880d681SAndroid Build Coastguard Worker                                SecureLogFile + " (" + EC.message() + ")");
708*9880d681SAndroid Build Coastguard Worker     OS = NewOS.get();
709*9880d681SAndroid Build Coastguard Worker     getContext().setSecureLog(std::move(NewOS));
710*9880d681SAndroid Build Coastguard Worker   }
711*9880d681SAndroid Build Coastguard Worker 
712*9880d681SAndroid Build Coastguard Worker   // Write the message.
713*9880d681SAndroid Build Coastguard Worker   unsigned CurBuf = getSourceManager().FindBufferContainingLoc(IDLoc);
714*9880d681SAndroid Build Coastguard Worker   *OS << getSourceManager().getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
715*9880d681SAndroid Build Coastguard Worker       << ":" << getSourceManager().FindLineNumber(IDLoc, CurBuf) << ":"
716*9880d681SAndroid Build Coastguard Worker       << LogMessage + "\n";
717*9880d681SAndroid Build Coastguard Worker 
718*9880d681SAndroid Build Coastguard Worker   getContext().setSecureLogUsed(true);
719*9880d681SAndroid Build Coastguard Worker 
720*9880d681SAndroid Build Coastguard Worker   return false;
721*9880d681SAndroid Build Coastguard Worker }
722*9880d681SAndroid Build Coastguard Worker 
723*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveSecureLogReset
724*9880d681SAndroid Build Coastguard Worker ///  ::= .secure_log_reset
parseDirectiveSecureLogReset(StringRef,SMLoc IDLoc)725*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveSecureLogReset(StringRef, SMLoc IDLoc) {
726*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
727*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.secure_log_reset' directive");
728*9880d681SAndroid Build Coastguard Worker 
729*9880d681SAndroid Build Coastguard Worker   Lex();
730*9880d681SAndroid Build Coastguard Worker 
731*9880d681SAndroid Build Coastguard Worker   getContext().setSecureLogUsed(false);
732*9880d681SAndroid Build Coastguard Worker 
733*9880d681SAndroid Build Coastguard Worker   return false;
734*9880d681SAndroid Build Coastguard Worker }
735*9880d681SAndroid Build Coastguard Worker 
736*9880d681SAndroid Build Coastguard Worker /// parseDirectiveSubsectionsViaSymbols
737*9880d681SAndroid Build Coastguard Worker ///  ::= .subsections_via_symbols
parseDirectiveSubsectionsViaSymbols(StringRef,SMLoc)738*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) {
739*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
740*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.subsections_via_symbols' directive");
741*9880d681SAndroid Build Coastguard Worker 
742*9880d681SAndroid Build Coastguard Worker   Lex();
743*9880d681SAndroid Build Coastguard Worker 
744*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
745*9880d681SAndroid Build Coastguard Worker 
746*9880d681SAndroid Build Coastguard Worker   return false;
747*9880d681SAndroid Build Coastguard Worker }
748*9880d681SAndroid Build Coastguard Worker 
749*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveTBSS
750*9880d681SAndroid Build Coastguard Worker ///  ::= .tbss identifier, size, align
parseDirectiveTBSS(StringRef,SMLoc)751*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveTBSS(StringRef, SMLoc) {
752*9880d681SAndroid Build Coastguard Worker   SMLoc IDLoc = getLexer().getLoc();
753*9880d681SAndroid Build Coastguard Worker   StringRef Name;
754*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Name))
755*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in directive");
756*9880d681SAndroid Build Coastguard Worker 
757*9880d681SAndroid Build Coastguard Worker   // Handle the identifier as the key symbol.
758*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
759*9880d681SAndroid Build Coastguard Worker 
760*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
761*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in directive");
762*9880d681SAndroid Build Coastguard Worker   Lex();
763*9880d681SAndroid Build Coastguard Worker 
764*9880d681SAndroid Build Coastguard Worker   int64_t Size;
765*9880d681SAndroid Build Coastguard Worker   SMLoc SizeLoc = getLexer().getLoc();
766*9880d681SAndroid Build Coastguard Worker   if (getParser().parseAbsoluteExpression(Size))
767*9880d681SAndroid Build Coastguard Worker     return true;
768*9880d681SAndroid Build Coastguard Worker 
769*9880d681SAndroid Build Coastguard Worker   int64_t Pow2Alignment = 0;
770*9880d681SAndroid Build Coastguard Worker   SMLoc Pow2AlignmentLoc;
771*9880d681SAndroid Build Coastguard Worker   if (getLexer().is(AsmToken::Comma)) {
772*9880d681SAndroid Build Coastguard Worker     Lex();
773*9880d681SAndroid Build Coastguard Worker     Pow2AlignmentLoc = getLexer().getLoc();
774*9880d681SAndroid Build Coastguard Worker     if (getParser().parseAbsoluteExpression(Pow2Alignment))
775*9880d681SAndroid Build Coastguard Worker       return true;
776*9880d681SAndroid Build Coastguard Worker   }
777*9880d681SAndroid Build Coastguard Worker 
778*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
779*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.tbss' directive");
780*9880d681SAndroid Build Coastguard Worker 
781*9880d681SAndroid Build Coastguard Worker   Lex();
782*9880d681SAndroid Build Coastguard Worker 
783*9880d681SAndroid Build Coastguard Worker   if (Size < 0)
784*9880d681SAndroid Build Coastguard Worker     return Error(SizeLoc, "invalid '.tbss' directive size, can't be less than"
785*9880d681SAndroid Build Coastguard Worker                  "zero");
786*9880d681SAndroid Build Coastguard Worker 
787*9880d681SAndroid Build Coastguard Worker   // FIXME: Diagnose overflow.
788*9880d681SAndroid Build Coastguard Worker   if (Pow2Alignment < 0)
789*9880d681SAndroid Build Coastguard Worker     return Error(Pow2AlignmentLoc, "invalid '.tbss' alignment, can't be less"
790*9880d681SAndroid Build Coastguard Worker                  "than zero");
791*9880d681SAndroid Build Coastguard Worker 
792*9880d681SAndroid Build Coastguard Worker   if (!Sym->isUndefined())
793*9880d681SAndroid Build Coastguard Worker     return Error(IDLoc, "invalid symbol redefinition");
794*9880d681SAndroid Build Coastguard Worker 
795*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitTBSSSymbol(getContext().getMachOSection(
796*9880d681SAndroid Build Coastguard Worker                                  "__DATA", "__thread_bss",
797*9880d681SAndroid Build Coastguard Worker                                  MachO::S_THREAD_LOCAL_ZEROFILL,
798*9880d681SAndroid Build Coastguard Worker                                  0, SectionKind::getThreadBSS()),
799*9880d681SAndroid Build Coastguard Worker                                Sym, Size, 1 << Pow2Alignment);
800*9880d681SAndroid Build Coastguard Worker 
801*9880d681SAndroid Build Coastguard Worker   return false;
802*9880d681SAndroid Build Coastguard Worker }
803*9880d681SAndroid Build Coastguard Worker 
804*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveZerofill
805*9880d681SAndroid Build Coastguard Worker ///  ::= .zerofill segname , sectname [, identifier , size_expression [
806*9880d681SAndroid Build Coastguard Worker ///      , align_expression ]]
parseDirectiveZerofill(StringRef,SMLoc)807*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveZerofill(StringRef, SMLoc) {
808*9880d681SAndroid Build Coastguard Worker   StringRef Segment;
809*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Segment))
810*9880d681SAndroid Build Coastguard Worker     return TokError("expected segment name after '.zerofill' directive");
811*9880d681SAndroid Build Coastguard Worker 
812*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
813*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in directive");
814*9880d681SAndroid Build Coastguard Worker   Lex();
815*9880d681SAndroid Build Coastguard Worker 
816*9880d681SAndroid Build Coastguard Worker   StringRef Section;
817*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(Section))
818*9880d681SAndroid Build Coastguard Worker     return TokError("expected section name after comma in '.zerofill' "
819*9880d681SAndroid Build Coastguard Worker                     "directive");
820*9880d681SAndroid Build Coastguard Worker 
821*9880d681SAndroid Build Coastguard Worker   // If this is the end of the line all that was wanted was to create the
822*9880d681SAndroid Build Coastguard Worker   // the section but with no symbol.
823*9880d681SAndroid Build Coastguard Worker   if (getLexer().is(AsmToken::EndOfStatement)) {
824*9880d681SAndroid Build Coastguard Worker     // Create the zerofill section but no symbol
825*9880d681SAndroid Build Coastguard Worker     getStreamer().EmitZerofill(getContext().getMachOSection(
826*9880d681SAndroid Build Coastguard Worker                                  Segment, Section, MachO::S_ZEROFILL,
827*9880d681SAndroid Build Coastguard Worker                                  0, SectionKind::getBSS()));
828*9880d681SAndroid Build Coastguard Worker     return false;
829*9880d681SAndroid Build Coastguard Worker   }
830*9880d681SAndroid Build Coastguard Worker 
831*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
832*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in directive");
833*9880d681SAndroid Build Coastguard Worker   Lex();
834*9880d681SAndroid Build Coastguard Worker 
835*9880d681SAndroid Build Coastguard Worker   SMLoc IDLoc = getLexer().getLoc();
836*9880d681SAndroid Build Coastguard Worker   StringRef IDStr;
837*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(IDStr))
838*9880d681SAndroid Build Coastguard Worker     return TokError("expected identifier in directive");
839*9880d681SAndroid Build Coastguard Worker 
840*9880d681SAndroid Build Coastguard Worker   // handle the identifier as the key symbol.
841*9880d681SAndroid Build Coastguard Worker   MCSymbol *Sym = getContext().getOrCreateSymbol(IDStr);
842*9880d681SAndroid Build Coastguard Worker 
843*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
844*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in directive");
845*9880d681SAndroid Build Coastguard Worker   Lex();
846*9880d681SAndroid Build Coastguard Worker 
847*9880d681SAndroid Build Coastguard Worker   int64_t Size;
848*9880d681SAndroid Build Coastguard Worker   SMLoc SizeLoc = getLexer().getLoc();
849*9880d681SAndroid Build Coastguard Worker   if (getParser().parseAbsoluteExpression(Size))
850*9880d681SAndroid Build Coastguard Worker     return true;
851*9880d681SAndroid Build Coastguard Worker 
852*9880d681SAndroid Build Coastguard Worker   int64_t Pow2Alignment = 0;
853*9880d681SAndroid Build Coastguard Worker   SMLoc Pow2AlignmentLoc;
854*9880d681SAndroid Build Coastguard Worker   if (getLexer().is(AsmToken::Comma)) {
855*9880d681SAndroid Build Coastguard Worker     Lex();
856*9880d681SAndroid Build Coastguard Worker     Pow2AlignmentLoc = getLexer().getLoc();
857*9880d681SAndroid Build Coastguard Worker     if (getParser().parseAbsoluteExpression(Pow2Alignment))
858*9880d681SAndroid Build Coastguard Worker       return true;
859*9880d681SAndroid Build Coastguard Worker   }
860*9880d681SAndroid Build Coastguard Worker 
861*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
862*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.zerofill' directive");
863*9880d681SAndroid Build Coastguard Worker 
864*9880d681SAndroid Build Coastguard Worker   Lex();
865*9880d681SAndroid Build Coastguard Worker 
866*9880d681SAndroid Build Coastguard Worker   if (Size < 0)
867*9880d681SAndroid Build Coastguard Worker     return Error(SizeLoc, "invalid '.zerofill' directive size, can't be less "
868*9880d681SAndroid Build Coastguard Worker                  "than zero");
869*9880d681SAndroid Build Coastguard Worker 
870*9880d681SAndroid Build Coastguard Worker   // NOTE: The alignment in the directive is a power of 2 value, the assembler
871*9880d681SAndroid Build Coastguard Worker   // may internally end up wanting an alignment in bytes.
872*9880d681SAndroid Build Coastguard Worker   // FIXME: Diagnose overflow.
873*9880d681SAndroid Build Coastguard Worker   if (Pow2Alignment < 0)
874*9880d681SAndroid Build Coastguard Worker     return Error(Pow2AlignmentLoc, "invalid '.zerofill' directive alignment, "
875*9880d681SAndroid Build Coastguard Worker                  "can't be less than zero");
876*9880d681SAndroid Build Coastguard Worker 
877*9880d681SAndroid Build Coastguard Worker   if (!Sym->isUndefined())
878*9880d681SAndroid Build Coastguard Worker     return Error(IDLoc, "invalid symbol redefinition");
879*9880d681SAndroid Build Coastguard Worker 
880*9880d681SAndroid Build Coastguard Worker   // Create the zerofill Symbol with Size and Pow2Alignment
881*9880d681SAndroid Build Coastguard Worker   //
882*9880d681SAndroid Build Coastguard Worker   // FIXME: Arch specific.
883*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitZerofill(getContext().getMachOSection(
884*9880d681SAndroid Build Coastguard Worker                                Segment, Section, MachO::S_ZEROFILL,
885*9880d681SAndroid Build Coastguard Worker                                0, SectionKind::getBSS()),
886*9880d681SAndroid Build Coastguard Worker                              Sym, Size, 1 << Pow2Alignment);
887*9880d681SAndroid Build Coastguard Worker 
888*9880d681SAndroid Build Coastguard Worker   return false;
889*9880d681SAndroid Build Coastguard Worker }
890*9880d681SAndroid Build Coastguard Worker 
891*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveDataRegion
892*9880d681SAndroid Build Coastguard Worker ///  ::= .data_region [ ( jt8 | jt16 | jt32 ) ]
parseDirectiveDataRegion(StringRef,SMLoc)893*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveDataRegion(StringRef, SMLoc) {
894*9880d681SAndroid Build Coastguard Worker   if (getLexer().is(AsmToken::EndOfStatement)) {
895*9880d681SAndroid Build Coastguard Worker     Lex();
896*9880d681SAndroid Build Coastguard Worker     getStreamer().EmitDataRegion(MCDR_DataRegion);
897*9880d681SAndroid Build Coastguard Worker     return false;
898*9880d681SAndroid Build Coastguard Worker   }
899*9880d681SAndroid Build Coastguard Worker   StringRef RegionType;
900*9880d681SAndroid Build Coastguard Worker   SMLoc Loc = getParser().getTok().getLoc();
901*9880d681SAndroid Build Coastguard Worker   if (getParser().parseIdentifier(RegionType))
902*9880d681SAndroid Build Coastguard Worker     return TokError("expected region type after '.data_region' directive");
903*9880d681SAndroid Build Coastguard Worker   int Kind = StringSwitch<int>(RegionType)
904*9880d681SAndroid Build Coastguard Worker     .Case("jt8", MCDR_DataRegionJT8)
905*9880d681SAndroid Build Coastguard Worker     .Case("jt16", MCDR_DataRegionJT16)
906*9880d681SAndroid Build Coastguard Worker     .Case("jt32", MCDR_DataRegionJT32)
907*9880d681SAndroid Build Coastguard Worker     .Default(-1);
908*9880d681SAndroid Build Coastguard Worker   if (Kind == -1)
909*9880d681SAndroid Build Coastguard Worker     return Error(Loc, "unknown region type in '.data_region' directive");
910*9880d681SAndroid Build Coastguard Worker   Lex();
911*9880d681SAndroid Build Coastguard Worker 
912*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitDataRegion((MCDataRegionType)Kind);
913*9880d681SAndroid Build Coastguard Worker   return false;
914*9880d681SAndroid Build Coastguard Worker }
915*9880d681SAndroid Build Coastguard Worker 
916*9880d681SAndroid Build Coastguard Worker /// ParseDirectiveDataRegionEnd
917*9880d681SAndroid Build Coastguard Worker ///  ::= .end_data_region
parseDirectiveDataRegionEnd(StringRef,SMLoc)918*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseDirectiveDataRegionEnd(StringRef, SMLoc) {
919*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement))
920*9880d681SAndroid Build Coastguard Worker     return TokError("unexpected token in '.end_data_region' directive");
921*9880d681SAndroid Build Coastguard Worker 
922*9880d681SAndroid Build Coastguard Worker   Lex();
923*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitDataRegion(MCDR_DataRegionEnd);
924*9880d681SAndroid Build Coastguard Worker   return false;
925*9880d681SAndroid Build Coastguard Worker }
926*9880d681SAndroid Build Coastguard Worker 
927*9880d681SAndroid Build Coastguard Worker /// parseVersionMin
928*9880d681SAndroid Build Coastguard Worker ///  ::= .ios_version_min major,minor[,update]
929*9880d681SAndroid Build Coastguard Worker ///  ::= .macosx_version_min major,minor[,update]
parseVersionMin(StringRef Directive,SMLoc Loc)930*9880d681SAndroid Build Coastguard Worker bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc) {
931*9880d681SAndroid Build Coastguard Worker   int64_t Major = 0, Minor = 0, Update = 0;
932*9880d681SAndroid Build Coastguard Worker   int Kind = StringSwitch<int>(Directive)
933*9880d681SAndroid Build Coastguard Worker     .Case(".watchos_version_min", MCVM_WatchOSVersionMin)
934*9880d681SAndroid Build Coastguard Worker     .Case(".tvos_version_min", MCVM_TvOSVersionMin)
935*9880d681SAndroid Build Coastguard Worker     .Case(".ios_version_min", MCVM_IOSVersionMin)
936*9880d681SAndroid Build Coastguard Worker     .Case(".macosx_version_min", MCVM_OSXVersionMin);
937*9880d681SAndroid Build Coastguard Worker   // Get the major version number.
938*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Integer))
939*9880d681SAndroid Build Coastguard Worker     return TokError("invalid OS major version number");
940*9880d681SAndroid Build Coastguard Worker   Major = getLexer().getTok().getIntVal();
941*9880d681SAndroid Build Coastguard Worker   if (Major > 65535 || Major <= 0)
942*9880d681SAndroid Build Coastguard Worker     return TokError("invalid OS major version number");
943*9880d681SAndroid Build Coastguard Worker   Lex();
944*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Comma))
945*9880d681SAndroid Build Coastguard Worker     return TokError("minor OS version number required, comma expected");
946*9880d681SAndroid Build Coastguard Worker   Lex();
947*9880d681SAndroid Build Coastguard Worker   // Get the minor version number.
948*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::Integer))
949*9880d681SAndroid Build Coastguard Worker     return TokError("invalid OS minor version number");
950*9880d681SAndroid Build Coastguard Worker   Minor = getLexer().getTok().getIntVal();
951*9880d681SAndroid Build Coastguard Worker   if (Minor > 255 || Minor < 0)
952*9880d681SAndroid Build Coastguard Worker     return TokError("invalid OS minor version number");
953*9880d681SAndroid Build Coastguard Worker   Lex();
954*9880d681SAndroid Build Coastguard Worker   // Get the update level, if specified
955*9880d681SAndroid Build Coastguard Worker   if (getLexer().isNot(AsmToken::EndOfStatement)) {
956*9880d681SAndroid Build Coastguard Worker     if (getLexer().isNot(AsmToken::Comma))
957*9880d681SAndroid Build Coastguard Worker       return TokError("invalid update specifier, comma expected");
958*9880d681SAndroid Build Coastguard Worker     Lex();
959*9880d681SAndroid Build Coastguard Worker     if (getLexer().isNot(AsmToken::Integer))
960*9880d681SAndroid Build Coastguard Worker       return TokError("invalid OS update number");
961*9880d681SAndroid Build Coastguard Worker     Update = getLexer().getTok().getIntVal();
962*9880d681SAndroid Build Coastguard Worker     if (Update > 255 || Update < 0)
963*9880d681SAndroid Build Coastguard Worker       return TokError("invalid OS update number");
964*9880d681SAndroid Build Coastguard Worker     Lex();
965*9880d681SAndroid Build Coastguard Worker   }
966*9880d681SAndroid Build Coastguard Worker 
967*9880d681SAndroid Build Coastguard Worker   const Triple &T = getContext().getObjectFileInfo()->getTargetTriple();
968*9880d681SAndroid Build Coastguard Worker   Triple::OSType ExpectedOS = Triple::UnknownOS;
969*9880d681SAndroid Build Coastguard Worker   switch ((MCVersionMinType)Kind) {
970*9880d681SAndroid Build Coastguard Worker   case MCVM_WatchOSVersionMin: ExpectedOS = Triple::WatchOS; break;
971*9880d681SAndroid Build Coastguard Worker   case MCVM_TvOSVersionMin:    ExpectedOS = Triple::TvOS;    break;
972*9880d681SAndroid Build Coastguard Worker   case MCVM_IOSVersionMin:     ExpectedOS = Triple::IOS;     break;
973*9880d681SAndroid Build Coastguard Worker   case MCVM_OSXVersionMin:     ExpectedOS = Triple::MacOSX;  break;
974*9880d681SAndroid Build Coastguard Worker   }
975*9880d681SAndroid Build Coastguard Worker   if (T.getOS() != ExpectedOS)
976*9880d681SAndroid Build Coastguard Worker     Warning(Loc, Directive + " should only be used for " +
977*9880d681SAndroid Build Coastguard Worker             Triple::getOSTypeName(ExpectedOS) + " targets");
978*9880d681SAndroid Build Coastguard Worker 
979*9880d681SAndroid Build Coastguard Worker   if (LastVersionMinDirective.isValid()) {
980*9880d681SAndroid Build Coastguard Worker     Warning(Loc, "overriding previous version_min directive");
981*9880d681SAndroid Build Coastguard Worker     Note(LastVersionMinDirective, "previous definition is here");
982*9880d681SAndroid Build Coastguard Worker   }
983*9880d681SAndroid Build Coastguard Worker   LastVersionMinDirective = Loc;
984*9880d681SAndroid Build Coastguard Worker 
985*9880d681SAndroid Build Coastguard Worker   // We've parsed a correct version specifier, so send it to the streamer.
986*9880d681SAndroid Build Coastguard Worker   getStreamer().EmitVersionMin((MCVersionMinType)Kind, Major, Minor, Update);
987*9880d681SAndroid Build Coastguard Worker 
988*9880d681SAndroid Build Coastguard Worker   return false;
989*9880d681SAndroid Build Coastguard Worker }
990*9880d681SAndroid Build Coastguard Worker 
991*9880d681SAndroid Build Coastguard Worker namespace llvm {
992*9880d681SAndroid Build Coastguard Worker 
createDarwinAsmParser()993*9880d681SAndroid Build Coastguard Worker MCAsmParserExtension *createDarwinAsmParser() {
994*9880d681SAndroid Build Coastguard Worker   return new DarwinAsmParser;
995*9880d681SAndroid Build Coastguard Worker }
996*9880d681SAndroid Build Coastguard Worker 
997*9880d681SAndroid Build Coastguard Worker } // end llvm namespace
998