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