33#include <system_error>
43 template<
bool (DarwinAsmParser::*HandlerMethod)(StringRef, SMLoc)>
44 void addDirectiveHandler(StringRef Directive) {
46 this, HandleDirective<DarwinAsmParser, HandlerMethod>);
47 getParser().addDirectiveHandler(Directive, Handler);
50 bool parseSectionSwitch(StringRef Segment, StringRef Section,
51 unsigned TAA = 0,
unsigned ImplicitAlign = 0,
52 unsigned StubSize = 0);
54 SMLoc LastVersionDirective;
57 DarwinAsmParser() =
default;
59 void Initialize(MCAsmParser &Parser)
override {
63 addDirectiveHandler<&DarwinAsmParser::parseDirectiveAltEntry>(
".alt_entry");
64 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDesc>(
".desc");
65 addDirectiveHandler<&DarwinAsmParser::parseDirectiveIndirectSymbol>(
67 addDirectiveHandler<&DarwinAsmParser::parseDirectiveLsym>(
".lsym");
68 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSubsectionsViaSymbols>(
69 ".subsections_via_symbols");
70 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(
".dump");
71 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(
".load");
72 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSection>(
".section");
73 addDirectiveHandler<&DarwinAsmParser::parseDirectivePushSection>(
75 addDirectiveHandler<&DarwinAsmParser::parseDirectivePopSection>(
77 addDirectiveHandler<&DarwinAsmParser::parseDirectivePrevious>(
".previous");
78 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogUnique>(
79 ".secure_log_unique");
80 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogReset>(
82 addDirectiveHandler<&DarwinAsmParser::parseDirectiveTBSS>(
".tbss");
83 addDirectiveHandler<&DarwinAsmParser::parseDirectiveZerofill>(
".zerofill");
85 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegion>(
87 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegionEnd>(
91 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveBss>(
".bss");
92 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConst>(
".const");
93 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstData>(
95 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstructor>(
97 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveCString>(
99 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveData>(
".data");
100 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDestructor>(
102 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDyld>(
".dyld");
103 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit0>(
105 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit1>(
108 &DarwinAsmParser::parseSectionDirectiveLazySymbolPointers>(
109 ".lazy_symbol_pointer");
110 addDirectiveHandler<&DarwinAsmParser::parseDirectiveLinkerOption>(
112 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral16>(
114 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral4>(
116 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral8>(
118 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModInitFunc>(
120 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModTermFunc>(
123 &DarwinAsmParser::parseSectionDirectiveNonLazySymbolPointers>(
124 ".non_lazy_symbol_pointer");
126 &DarwinAsmParser::parseSectionDirectiveThreadLocalVariablePointers>(
127 ".thread_local_variable_pointer");
128 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatClsMeth>(
129 ".objc_cat_cls_meth");
130 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatInstMeth>(
131 ".objc_cat_inst_meth");
132 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCategory>(
134 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClass>(
136 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassNames>(
137 ".objc_class_names");
138 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassVars>(
140 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsMeth>(
142 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsRefs>(
144 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCInstMeth>(
147 &DarwinAsmParser::parseSectionDirectiveObjCInstanceVars>(
148 ".objc_instance_vars");
149 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMessageRefs>(
150 ".objc_message_refs");
151 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMetaClass>(
154 &DarwinAsmParser::parseSectionDirectiveObjCMethVarNames>(
155 ".objc_meth_var_names");
157 &DarwinAsmParser::parseSectionDirectiveObjCMethVarTypes>(
158 ".objc_meth_var_types");
159 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCModuleInfo>(
160 ".objc_module_info");
161 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCProtocol>(
164 &DarwinAsmParser::parseSectionDirectiveObjCSelectorStrs>(
165 ".objc_selector_strs");
167 &DarwinAsmParser::parseSectionDirectiveObjCStringObject>(
168 ".objc_string_object");
169 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCSymbols>(
171 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectivePICSymbolStub>(
173 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticConst>(
175 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticData>(
177 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveSymbolStub>(
179 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTData>(
".tdata");
180 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveText>(
".text");
181 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveThreadInitFunc>(
182 ".thread_init_func");
183 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTLV>(
".tlv");
185 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveIdent>(
".ident");
186 addDirectiveHandler<&DarwinAsmParser::parseWatchOSVersionMin>(
187 ".watchos_version_min");
188 addDirectiveHandler<&DarwinAsmParser::parseTvOSVersionMin>(
189 ".tvos_version_min");
190 addDirectiveHandler<&DarwinAsmParser::parseIOSVersionMin>(
192 addDirectiveHandler<&DarwinAsmParser::parseMacOSXVersionMin>(
193 ".macosx_version_min");
194 addDirectiveHandler<&DarwinAsmParser::parseBuildVersion>(
".build_version");
195 addDirectiveHandler<&DarwinAsmParser::parseTargetTripleDirective>(
197 addDirectiveHandler<&DarwinAsmParser::parseDirectiveCGProfile>(
200 LastVersionDirective = SMLoc();
203 bool parseDirectiveAltEntry(StringRef, SMLoc);
204 bool parseDirectiveDesc(StringRef, SMLoc);
205 bool parseDirectiveIndirectSymbol(StringRef, SMLoc);
206 bool parseDirectiveDumpOrLoad(StringRef, SMLoc);
207 bool parseDirectiveLsym(StringRef, SMLoc);
208 bool parseDirectiveLinkerOption(StringRef, SMLoc);
209 bool parseDirectiveSection(StringRef, SMLoc);
210 bool parseDirectivePushSection(StringRef, SMLoc);
211 bool parseDirectivePopSection(StringRef, SMLoc);
212 bool parseDirectivePrevious(StringRef, SMLoc);
213 bool parseDirectiveSecureLogReset(StringRef, SMLoc);
214 bool parseDirectiveSecureLogUnique(StringRef, SMLoc);
215 bool parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);
216 bool parseDirectiveTBSS(StringRef, SMLoc);
217 bool parseDirectiveZerofill(StringRef, SMLoc);
218 bool parseDirectiveDataRegion(StringRef, SMLoc);
219 bool parseDirectiveDataRegionEnd(StringRef, SMLoc);
222 bool parseSectionDirectiveBss(StringRef, SMLoc) {
223 return parseSectionSwitch(
"__DATA",
"__bss");
226 bool parseSectionDirectiveConst(StringRef, SMLoc) {
227 return parseSectionSwitch(
"__TEXT",
"__const");
230 bool parseSectionDirectiveStaticConst(StringRef, SMLoc) {
231 return parseSectionSwitch(
"__TEXT",
"__static_const");
234 bool parseSectionDirectiveCString(StringRef, SMLoc) {
235 return parseSectionSwitch(
"__TEXT",
"__cstring",
239 bool parseSectionDirectiveLiteral4(StringRef, SMLoc) {
240 return parseSectionSwitch(
"__TEXT",
"__literal4",
244 bool parseSectionDirectiveLiteral8(StringRef, SMLoc) {
245 return parseSectionSwitch(
"__TEXT",
"__literal8",
249 bool parseSectionDirectiveLiteral16(StringRef, SMLoc) {
250 return parseSectionSwitch(
"__TEXT",
"__literal16",
254 bool parseSectionDirectiveConstructor(StringRef, SMLoc) {
255 return parseSectionSwitch(
"__TEXT",
"__constructor");
258 bool parseSectionDirectiveDestructor(StringRef, SMLoc) {
259 return parseSectionSwitch(
"__TEXT",
"__destructor");
262 bool parseSectionDirectiveFVMLibInit0(StringRef, SMLoc) {
263 return parseSectionSwitch(
"__TEXT",
"__fvmlib_init0");
266 bool parseSectionDirectiveFVMLibInit1(StringRef, SMLoc) {
267 return parseSectionSwitch(
"__TEXT",
"__fvmlib_init1");
270 bool parseSectionDirectiveSymbolStub(StringRef, SMLoc) {
271 return parseSectionSwitch(
"__TEXT",
"__symbol_stub",
278 bool parseSectionDirectivePICSymbolStub(StringRef, SMLoc) {
279 return parseSectionSwitch(
"__TEXT",
"__picsymbol_stub",
284 bool parseSectionDirectiveData(StringRef, SMLoc) {
285 return parseSectionSwitch(
"__DATA",
"__data");
288 bool parseSectionDirectiveStaticData(StringRef, SMLoc) {
289 return parseSectionSwitch(
"__DATA",
"__static_data");
292 bool parseSectionDirectiveNonLazySymbolPointers(StringRef, SMLoc) {
293 return parseSectionSwitch(
"__DATA",
"__nl_symbol_ptr",
297 bool parseSectionDirectiveLazySymbolPointers(StringRef, SMLoc) {
298 return parseSectionSwitch(
"__DATA",
"__la_symbol_ptr",
302 bool parseSectionDirectiveThreadLocalVariablePointers(StringRef, SMLoc) {
303 return parseSectionSwitch(
"__DATA",
"__thread_ptr",
307 bool parseSectionDirectiveDyld(StringRef, SMLoc) {
308 return parseSectionSwitch(
"__DATA",
"__dyld");
311 bool parseSectionDirectiveModInitFunc(StringRef, SMLoc) {
312 return parseSectionSwitch(
"__DATA",
"__mod_init_func",
316 bool parseSectionDirectiveModTermFunc(StringRef, SMLoc) {
317 return parseSectionSwitch(
"__DATA",
"__mod_term_func",
321 bool parseSectionDirectiveConstData(StringRef, SMLoc) {
322 return parseSectionSwitch(
"__DATA",
"__const");
325 bool parseSectionDirectiveObjCClass(StringRef, SMLoc) {
326 return parseSectionSwitch(
"__OBJC",
"__class",
330 bool parseSectionDirectiveObjCMetaClass(StringRef, SMLoc) {
331 return parseSectionSwitch(
"__OBJC",
"__meta_class",
335 bool parseSectionDirectiveObjCCatClsMeth(StringRef, SMLoc) {
336 return parseSectionSwitch(
"__OBJC",
"__cat_cls_meth",
340 bool parseSectionDirectiveObjCCatInstMeth(StringRef, SMLoc) {
341 return parseSectionSwitch(
"__OBJC",
"__cat_inst_meth",
345 bool parseSectionDirectiveObjCProtocol(StringRef, SMLoc) {
346 return parseSectionSwitch(
"__OBJC",
"__protocol",
350 bool parseSectionDirectiveObjCStringObject(StringRef, SMLoc) {
351 return parseSectionSwitch(
"__OBJC",
"__string_object",
355 bool parseSectionDirectiveObjCClsMeth(StringRef, SMLoc) {
356 return parseSectionSwitch(
"__OBJC",
"__cls_meth",
360 bool parseSectionDirectiveObjCInstMeth(StringRef, SMLoc) {
361 return parseSectionSwitch(
"__OBJC",
"__inst_meth",
365 bool parseSectionDirectiveObjCClsRefs(StringRef, SMLoc) {
366 return parseSectionSwitch(
"__OBJC",
"__cls_refs",
371 bool parseSectionDirectiveObjCMessageRefs(StringRef, SMLoc) {
372 return parseSectionSwitch(
"__OBJC",
"__message_refs",
377 bool parseSectionDirectiveObjCSymbols(StringRef, SMLoc) {
378 return parseSectionSwitch(
"__OBJC",
"__symbols",
382 bool parseSectionDirectiveObjCCategory(StringRef, SMLoc) {
383 return parseSectionSwitch(
"__OBJC",
"__category",
387 bool parseSectionDirectiveObjCClassVars(StringRef, SMLoc) {
388 return parseSectionSwitch(
"__OBJC",
"__class_vars",
392 bool parseSectionDirectiveObjCInstanceVars(StringRef, SMLoc) {
393 return parseSectionSwitch(
"__OBJC",
"__instance_vars",
397 bool parseSectionDirectiveObjCModuleInfo(StringRef, SMLoc) {
398 return parseSectionSwitch(
"__OBJC",
"__module_info",
402 bool parseSectionDirectiveObjCClassNames(StringRef, SMLoc) {
403 return parseSectionSwitch(
"__TEXT",
"__cstring",
407 bool parseSectionDirectiveObjCMethVarTypes(StringRef, SMLoc) {
408 return parseSectionSwitch(
"__TEXT",
"__cstring",
412 bool parseSectionDirectiveObjCMethVarNames(StringRef, SMLoc) {
413 return parseSectionSwitch(
"__TEXT",
"__cstring",
417 bool parseSectionDirectiveObjCSelectorStrs(StringRef, SMLoc) {
418 return parseSectionSwitch(
"__OBJC",
"__selector_strs",
422 bool parseSectionDirectiveTData(StringRef, SMLoc) {
423 return parseSectionSwitch(
"__DATA",
"__thread_data",
427 bool parseSectionDirectiveText(StringRef, SMLoc) {
428 return parseSectionSwitch(
"__TEXT",
"__text",
432 bool parseSectionDirectiveTLV(StringRef, SMLoc) {
433 return parseSectionSwitch(
"__DATA",
"__thread_vars",
437 bool parseSectionDirectiveIdent(StringRef, SMLoc) {
439 getParser().eatToEndOfStatement();
443 bool parseSectionDirectiveThreadInitFunc(StringRef, SMLoc) {
444 return parseSectionSwitch(
"__DATA",
"__thread_init",
448 bool parseWatchOSVersionMin(StringRef Directive, SMLoc Loc) {
451 bool parseTvOSVersionMin(StringRef Directive, SMLoc Loc) {
454 bool parseIOSVersionMin(StringRef Directive, SMLoc Loc) {
457 bool parseMacOSXVersionMin(StringRef Directive, SMLoc Loc) {
461 bool parseBuildVersion(StringRef Directive, SMLoc Loc);
462 bool parseTargetTripleDirective(StringRef Directive, SMLoc Loc);
464 bool parseMajorMinorVersionComponent(
unsigned *Major,
unsigned *Minor,
465 const char *VersionName);
466 bool parseOptionalTrailingVersionComponent(
unsigned *Component,
467 const char *ComponentName);
468 bool parseVersion(
unsigned *Major,
unsigned *Minor,
unsigned *Update);
469 bool parseSDKVersion(VersionTuple &SDKVersion);
470 void checkVersion(StringRef Directive, StringRef Arg, SMLoc Loc,
472 bool parseDirectiveCGProfile(StringRef Directive, SMLoc Loc);
478 unsigned TAA,
unsigned Alignment,
481 return TokError(
"unexpected token in section switching directive");
486 getStreamer().switchSection(
getContext().getMachOSection(
487 Segment, Section, TAA, StubSize,
499 getStreamer().emitValueToAlignment(
Align(Alignment));
506bool DarwinAsmParser::parseDirectiveAltEntry(StringRef, SMLoc) {
509 return TokError(
"expected identifier in directive");
512 return TokError(
".alt_entry must preceed symbol definition");
515 return TokError(
"unable to emit symbol attribute");
523bool DarwinAsmParser::parseDirectiveDesc(StringRef, SMLoc) {
526 return TokError(
"expected identifier in directive");
529 return TokError(
"unexpected token in '.desc' directive");
533 if (getParser().parseAbsoluteExpression(DescValue))
537 return TokError(
"unexpected token in '.desc' directive");
542 getStreamer().emitSymbolDesc(Sym, DescValue);
549bool DarwinAsmParser::parseDirectiveIndirectSymbol(StringRef, SMLoc Loc) {
550 const MCSectionMachO *Current =
static_cast<const MCSectionMachO *
>(
551 getStreamer().getCurrentSectionOnly());
557 return Error(Loc,
"indirect symbol not in a symbol pointer or stub "
562 return TokError(
"expected identifier in .indirect_symbol directive");
566 return TokError(
"non-local symbol required in directive");
569 return TokError(
"unable to emit indirect symbol attribute for: " +
573 return TokError(
"unexpected token in '.indirect_symbol' directive");
582bool DarwinAsmParser::parseDirectiveDumpOrLoad(StringRef Directive,
584 bool IsDump = Directive ==
".dump";
586 return TokError(
"expected string in '.dump' or '.load' directive");
591 return TokError(
"unexpected token in '.dump' or '.load' directive");
598 return Warning(IDLoc,
"ignoring directive .dump for now");
600 return Warning(IDLoc,
"ignoring directive .load for now");
605bool DarwinAsmParser::parseDirectiveLinkerOption(StringRef IDVal, SMLoc) {
606 SmallVector<std::string, 4>
Args;
609 return TokError(
"expected string in '" + Twine(IDVal) +
"' directive");
612 if (getParser().parseEscapedString(
Data))
621 return TokError(
"unexpected token in '" + Twine(IDVal) +
"' directive");
625 getStreamer().emitLinkerOptions(Args);
631bool DarwinAsmParser::parseDirectiveLsym(StringRef, SMLoc) {
634 return TokError(
"expected identifier in directive");
637 return TokError(
"unexpected token in '.lsym' directive");
641 if (getParser().parseExpression(
Value))
645 return TokError(
"unexpected token in '.lsym' directive");
653 return TokError(
"directive '.lsym' is unsupported");
658bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) {
659 SMLoc Loc = getLexer().getLoc();
662 if (getParser().parseIdentifier(SectionName))
663 return Error(Loc,
"expected identifier after '.section' directive");
667 return TokError(
"unexpected token in '.section' directive");
669 std::string SectionSpec = std::string(SectionName);
674 StringRef EOL = getLexer().LexUntilEndOfStatement();
675 SectionSpec.append(EOL.
begin(), EOL.
end());
679 return TokError(
"unexpected token in '.section' directive");
687 SectionSpec, Segment, Section, TAA, TAAParsed, StubSize))
691 Triple
TT = getParser().getContext().getTargetTriple();
695 StringRef NonCoalSection = StringSwitch<StringRef>(Section)
696 .Case(
"__textcoal_nt",
"__text")
697 .Case(
"__const_coal",
"__const")
698 .Case(
"__datacoal_nt",
"__data")
701 if (Section != NonCoalSection) {
703 size_t B = SectionVal.find(
',') + 1,
E = SectionVal.find(
',',
B);
706 getParser().Warning(Loc,
"section \"" + Section +
"\" is deprecated",
707 SMRange(BLoc, ELoc));
708 getParser().Note(Loc,
"change section name to \"" + NonCoalSection +
709 "\"", SMRange(BLoc, ELoc));
714 bool isText = Segment ==
"__TEXT";
715 getStreamer().switchSection(
getContext().getMachOSection(
716 Segment, Section, TAA, StubSize,
723bool DarwinAsmParser::parseDirectivePushSection(StringRef S, SMLoc Loc) {
724 getStreamer().pushSection();
726 if (parseDirectiveSection(S, Loc)) {
727 getStreamer().popSection();
736bool DarwinAsmParser::parseDirectivePopSection(StringRef, SMLoc) {
737 if (!getStreamer().popSection())
738 return TokError(
".popsection without corresponding .pushsection");
744bool DarwinAsmParser::parseDirectivePrevious(StringRef DirName, SMLoc) {
746 if (!PreviousSection.first)
747 return TokError(
".previous without corresponding .section");
748 getStreamer().switchSection(PreviousSection.first, PreviousSection.second);
754bool DarwinAsmParser::parseDirectiveSecureLogUnique(StringRef, SMLoc IDLoc) {
755 StringRef LogMessage = getParser().parseStringToEndOfStatement();
757 return TokError(
"unexpected token in '.secure_log_unique' directive");
760 return Error(IDLoc,
".secure_log_unique specified multiple times");
763 StringRef SecureLogFile =
getContext().getSecureLogFile();
764 if (SecureLogFile.
empty())
765 return Error(IDLoc,
".secure_log_unique used but AS_SECURE_LOG_FILE "
766 "environment variable unset.");
769 raw_fd_ostream *OS =
getContext().getSecureLog();
772 auto NewOS = std::make_unique<raw_fd_ostream>(
775 return Error(IDLoc, Twine(
"can't open secure log file: ") +
776 SecureLogFile +
" (" +
EC.message() +
")");
782 unsigned CurBuf = getSourceManager().FindBufferContainingLoc(IDLoc);
783 *OS << getSourceManager().getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
784 <<
":" << getSourceManager().FindLineNumber(IDLoc, CurBuf) <<
":"
785 << LogMessage +
"\n";
794bool DarwinAsmParser::parseDirectiveSecureLogReset(StringRef, SMLoc IDLoc) {
796 return TokError(
"unexpected token in '.secure_log_reset' directive");
807bool DarwinAsmParser::parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) {
809 return TokError(
"unexpected token in '.subsections_via_symbols' directive");
813 getStreamer().emitSubsectionsViaSymbols();
820bool DarwinAsmParser::parseDirectiveTBSS(StringRef, SMLoc) {
821 SMLoc IDLoc = getLexer().getLoc();
824 return TokError(
"expected identifier in directive");
827 return TokError(
"unexpected token in directive");
831 SMLoc SizeLoc = getLexer().getLoc();
832 if (getParser().parseAbsoluteExpression(
Size))
835 int64_t Pow2Alignment = 0;
836 SMLoc Pow2AlignmentLoc;
839 Pow2AlignmentLoc = getLexer().getLoc();
840 if (getParser().parseAbsoluteExpression(Pow2Alignment))
845 return TokError(
"unexpected token in '.tbss' directive");
850 return Error(SizeLoc,
"invalid '.tbss' directive size, can't be less than"
854 if (Pow2Alignment < 0)
855 return Error(Pow2AlignmentLoc,
"invalid '.tbss' alignment, can't be less"
859 return Error(IDLoc,
"invalid symbol redefinition");
861 getStreamer().emitTBSSSymbol(
862 getContext().getMachOSection(
"__DATA",
"__thread_bss",
865 Sym,
Size,
Align(1ULL << Pow2Alignment));
873bool DarwinAsmParser::parseDirectiveZerofill(StringRef, SMLoc) {
875 if (getParser().parseIdentifier(Segment))
876 return TokError(
"expected segment name after '.zerofill' directive");
879 return TokError(
"unexpected token in directive");
883 SMLoc SectionLoc = getLexer().getLoc();
884 if (getParser().parseIdentifier(Section))
885 return TokError(
"expected section name after comma in '.zerofill' "
892 getStreamer().emitZerofill(
895 nullptr, 0,
Align(1), SectionLoc);
900 return TokError(
"unexpected token in directive");
903 SMLoc IDLoc = getLexer().getLoc();
906 return TokError(
"expected identifier in directive");
909 return TokError(
"unexpected token in directive");
913 SMLoc SizeLoc = getLexer().getLoc();
914 if (getParser().parseAbsoluteExpression(
Size))
917 int64_t Pow2Alignment = 0;
918 SMLoc Pow2AlignmentLoc;
921 Pow2AlignmentLoc = getLexer().getLoc();
922 if (getParser().parseAbsoluteExpression(Pow2Alignment))
927 return TokError(
"unexpected token in '.zerofill' directive");
932 return Error(SizeLoc,
"invalid '.zerofill' directive size, can't be less "
938 if (Pow2Alignment < 0)
939 return Error(Pow2AlignmentLoc,
"invalid '.zerofill' directive alignment, "
940 "can't be less than zero");
943 return Error(IDLoc,
"invalid symbol redefinition");
948 getStreamer().emitZerofill(
951 Sym,
Size,
Align(1ULL << Pow2Alignment), SectionLoc);
958bool DarwinAsmParser::parseDirectiveDataRegion(StringRef, SMLoc) {
964 StringRef RegionType;
965 SMLoc Loc = getParser().getTok().getLoc();
966 if (getParser().parseIdentifier(RegionType))
967 return TokError(
"expected region type after '.data_region' directive");
968 int Kind = StringSwitch<int>(RegionType)
974 return Error(Loc,
"unknown region type in '.data_region' directive");
983bool DarwinAsmParser::parseDirectiveDataRegionEnd(StringRef, SMLoc) {
985 return TokError(
"unexpected token in '.end_data_region' directive");
997bool DarwinAsmParser::parseMajorMinorVersionComponent(
unsigned *Major,
999 const char *VersionName) {
1002 return TokError(Twine(
"invalid ") + VersionName +
1003 " major version number, integer expected");
1004 int64_t MajorVal = getLexer().getTok().getIntVal();
1005 if (MajorVal > 65535 || MajorVal <= 0)
1006 return TokError(Twine(
"invalid ") + VersionName +
" major version number");
1007 *Major = (unsigned)MajorVal;
1010 return TokError(Twine(VersionName) +
1011 " minor version number required, comma expected");
1015 return TokError(Twine(
"invalid ") + VersionName +
1016 " minor version number, integer expected");
1017 int64_t MinorVal = getLexer().getTok().getIntVal();
1018 if (MinorVal > 255 || MinorVal < 0)
1019 return TokError(Twine(
"invalid ") + VersionName +
" minor version number");
1026bool DarwinAsmParser::parseOptionalTrailingVersionComponent(
1027 unsigned *Component,
const char *ComponentName) {
1031 return TokError(Twine(
"invalid ") + ComponentName +
1032 " version number, integer expected");
1033 int64_t Val = getLexer().getTok().getIntVal();
1034 if (Val > 255 || Val < 0)
1035 return TokError(Twine(
"invalid ") + ComponentName +
" version number");
1043bool DarwinAsmParser::parseVersion(
unsigned *Major,
unsigned *Minor,
1045 if (parseMajorMinorVersionComponent(Major, Minor,
"OS"))
1054 return TokError(
"invalid OS update specifier, comma expected");
1055 if (parseOptionalTrailingVersionComponent(Update,
"OS update"))
1060bool DarwinAsmParser::parseSDKVersion(VersionTuple &SDKVersion) {
1063 unsigned Major, Minor;
1064 if (parseMajorMinorVersionComponent(&Major, &Minor,
"SDK"))
1066 SDKVersion = VersionTuple(Major, Minor);
1071 if (parseOptionalTrailingVersionComponent(&Subminor,
"SDK subminor"))
1073 SDKVersion = VersionTuple(Major, Minor, Subminor);
1078void DarwinAsmParser::checkVersion(StringRef Directive, StringRef Arg,
1081 if (
Target.getOS() != ExpectedOS)
1082 Warning(Loc, Twine(Directive) +
1083 (Arg.
empty() ? Twine() : Twine(
' ') + Arg) +
1084 " used while targeting " +
Target.getOSName());
1086 if (LastVersionDirective.
isValid()) {
1087 Warning(Loc,
"overriding previous version directive");
1088 Note(LastVersionDirective,
"previous definition is here");
1090 LastVersionDirective = Loc;
1108bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc,
1116 VersionTuple SDKVersion;
1121 return addErrorSuffix(Twine(
" in '") + Directive +
"' directive");
1124 checkVersion(Directive, StringRef(), Loc, ExpectedOS);
1125 getStreamer().emitVersionMin(
Type, Major, Minor, Update, SDKVersion);
1131 case MachO::PLATFORM_UNKNOWN:
1138 case MachO::PLATFORM_BRIDGEOS:
break;
1139 case MachO::PLATFORM_DRIVERKIT:
1141 case MachO::PLATFORM_MACCATALYST:
return Triple::IOS;
1142 case MachO::PLATFORM_IOSSIMULATOR:
break;
1143 case MachO::PLATFORM_TVOSSIMULATOR:
break;
1144 case MachO::PLATFORM_WATCHOSSIMULATOR:
break;
1145 case MachO::PLATFORM_XROS_SIMULATOR:
break;
1152bool DarwinAsmParser::parseBuildVersion(StringRef Directive, SMLoc Loc) {
1153 StringRef PlatformName;
1154 SMLoc PlatformLoc = getTok().getLoc();
1155 if (getParser().parseIdentifier(PlatformName))
1156 return TokError(
"platform name expected");
1158 unsigned Platform = StringSwitch<unsigned>(PlatformName)
1159#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
1161 .Case(#build_name, MachO::PLATFORM_##platform)
1162#include "llvm/BinaryFormat/MachO.def"
1163 .Default(MachO::PLATFORM_UNKNOWN);
1165 if (Platform == MachO::PLATFORM_UNKNOWN)
1166 return Error(PlatformLoc,
"unknown platform name");
1169 return TokError(
"version number required, comma expected");
1178 VersionTuple SDKVersion;
1183 return addErrorSuffix(
" in '.build_version' directive");
1187 checkVersion(Directive, PlatformName, Loc, ExpectedOS);
1188 getStreamer().emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
1194bool DarwinAsmParser::parseTargetTripleDirective(StringRef Directive,
1196 StringRef TargetTriple;
1197 SMLoc TargetTripleLoc = getTok().getLoc();
1198 if (getParser().parseIdentifier(TargetTriple))
1199 return TokError(
"target triple expected");
1201 if (!Triple(NormalizedTriple).isOSDarwin())
1202 return Error(TargetTripleLoc,
"non-Darwin target triple");
1205 return addErrorSuffix(
" in '.target_triple' directive");
1207 getStreamer().emitTargetTriple(NormalizedTriple);
1213bool DarwinAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) {
1218 return new DarwinAsmParser;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isNot(const MachineRegisterInfo &MRI, const MachineInstr &MI)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static Version parseVersion(StringRef Name)
static bool isSDKVersionToken(const AsmToken &Tok)
static Triple::OSType getOSTypeFromMCVM(MCVersionMinType Type)
static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file defines the SmallVector class.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Target independent representation for an assembler token.
bool is(TokenKind K) const
StringRef getIdentifier() const
Get the identifier string for the current token, which should be an identifier or a string.
Generic interface for extending the MCAsmParser, which is implemented by target and object file assem...
virtual void Initialize(MCAsmParser &Parser)
Initialize the extension for parsing using the given Parser.
bool parseDirectiveCGProfile(StringRef, SMLoc)
parseDirectiveCGProfile ::= .cg_profile identifier, identifier, <number>
std::pair< MCAsmParserExtension *, DirectiveHandler > ExtensionDirectiveHandler
static Error ParseSectionSpecifier(StringRef Spec, StringRef &Segment, StringRef &Section, unsigned &TAA, bool &TAAParsed, unsigned &StubSize)
Parse the section specifier indicated by "Spec".
MachO::SectionType getType() const
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
StringRef getName() const
getName - Get the symbol name.
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
static SMLoc getFromPointer(const char *Ptr)
constexpr const char * getPointer() const
constexpr bool isValid() const
static SectionKind getText()
static SectionKind getData()
static SectionKind getBSS()
static SectionKind getThreadBSS()
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
static LLVM_ABI std::string normalize(StringRef Str, CanonicalForm Form=CanonicalForm::ANY)
Turn an arbitrary machine specification into the canonical triple form (or something sensible that th...
The instances of the Type class are immutable: once they are created, they are never changed.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
SectionType
These are the section type and attributes fields.
@ S_THREAD_LOCAL_VARIABLE_POINTERS
S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread local structures.
@ S_16BYTE_LITERALS
S_16BYTE_LITERALS - Section with only 16 byte literals.
@ S_THREAD_LOCAL_INIT_FUNCTION_POINTERS
S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local variable initialization pointers to...
@ S_THREAD_LOCAL_ZEROFILL
S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section.
@ S_LAZY_SYMBOL_POINTERS
S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers.
@ S_MOD_TERM_FUNC_POINTERS
S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.
@ S_MOD_INIT_FUNC_POINTERS
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
@ S_CSTRING_LITERALS
S_CSTRING_LITERALS - Section with literal C strings.
@ S_THREAD_LOCAL_REGULAR
S_THREAD_LOCAL_REGULAR - Thread local data section.
@ S_ZEROFILL
S_ZEROFILL - Zero fill on demand section.
@ S_NON_LAZY_SYMBOL_POINTERS
S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
@ S_4BYTE_LITERALS
S_4BYTE_LITERALS - Section with 4 byte literals.
@ S_LITERAL_POINTERS
S_LITERAL_POINTERS - Section with pointers to literals.
@ S_8BYTE_LITERALS
S_8BYTE_LITERALS - Section with 8 byte literals.
@ S_THREAD_LOCAL_VARIABLES
S_THREAD_LOCAL_VARIABLES - Section with thread local variable structure data.
@ S_SYMBOL_STUBS
S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in the Reserved2 field.
LLVM_ABI SimpleSymbol parseSymbol(StringRef SymName)
Get symbol classification by parsing the name of a symbol.
@ S_ATTR_NO_DEAD_STRIP
S_ATTR_NO_DEAD_STRIP - No dead stripping.
@ S_ATTR_PURE_INSTRUCTIONS
S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine instructions.
@ OF_TextWithCRLF
The file should be opened in text mode and use a carriage linefeed '\r '.
@ OF_Append
The file should be opened in append mode.
This is an optimization pass for GlobalISel generic memory operations.
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
@ MCVM_WatchOSVersionMin
.watchos_version_min
@ MCVM_OSXVersionMin
.macosx_version_min
@ MCVM_TvOSVersionMin
.tvos_version_min
@ MCVM_IOSVersionMin
.ios_version_min
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
std::pair< MCSection *, uint32_t > MCSectionSubPair
LLVM_ABI MCAsmParserExtension * createDarwinAsmParser()
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)