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