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::parseDirectiveCGProfile>(
198 LastVersionDirective = SMLoc();
201 bool parseDirectiveAltEntry(StringRef, SMLoc);
202 bool parseDirectiveDesc(StringRef, SMLoc);
203 bool parseDirectiveIndirectSymbol(StringRef, SMLoc);
204 bool parseDirectiveDumpOrLoad(StringRef, SMLoc);
205 bool parseDirectiveLsym(StringRef, SMLoc);
206 bool parseDirectiveLinkerOption(StringRef, SMLoc);
207 bool parseDirectiveSection(StringRef, SMLoc);
208 bool parseDirectivePushSection(StringRef, SMLoc);
209 bool parseDirectivePopSection(StringRef, SMLoc);
210 bool parseDirectivePrevious(StringRef, SMLoc);
211 bool parseDirectiveSecureLogReset(StringRef, SMLoc);
212 bool parseDirectiveSecureLogUnique(StringRef, SMLoc);
213 bool parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);
214 bool parseDirectiveTBSS(StringRef, SMLoc);
215 bool parseDirectiveZerofill(StringRef, SMLoc);
216 bool parseDirectiveDataRegion(StringRef, SMLoc);
217 bool parseDirectiveDataRegionEnd(StringRef, SMLoc);
220 bool parseSectionDirectiveBss(StringRef, SMLoc) {
221 return parseSectionSwitch(
"__DATA",
"__bss");
224 bool parseSectionDirectiveConst(StringRef, SMLoc) {
225 return parseSectionSwitch(
"__TEXT",
"__const");
228 bool parseSectionDirectiveStaticConst(StringRef, SMLoc) {
229 return parseSectionSwitch(
"__TEXT",
"__static_const");
232 bool parseSectionDirectiveCString(StringRef, SMLoc) {
233 return parseSectionSwitch(
"__TEXT",
"__cstring",
237 bool parseSectionDirectiveLiteral4(StringRef, SMLoc) {
238 return parseSectionSwitch(
"__TEXT",
"__literal4",
242 bool parseSectionDirectiveLiteral8(StringRef, SMLoc) {
243 return parseSectionSwitch(
"__TEXT",
"__literal8",
247 bool parseSectionDirectiveLiteral16(StringRef, SMLoc) {
248 return parseSectionSwitch(
"__TEXT",
"__literal16",
252 bool parseSectionDirectiveConstructor(StringRef, SMLoc) {
253 return parseSectionSwitch(
"__TEXT",
"__constructor");
256 bool parseSectionDirectiveDestructor(StringRef, SMLoc) {
257 return parseSectionSwitch(
"__TEXT",
"__destructor");
260 bool parseSectionDirectiveFVMLibInit0(StringRef, SMLoc) {
261 return parseSectionSwitch(
"__TEXT",
"__fvmlib_init0");
264 bool parseSectionDirectiveFVMLibInit1(StringRef, SMLoc) {
265 return parseSectionSwitch(
"__TEXT",
"__fvmlib_init1");
268 bool parseSectionDirectiveSymbolStub(StringRef, SMLoc) {
269 return parseSectionSwitch(
"__TEXT",
"__symbol_stub",
276 bool parseSectionDirectivePICSymbolStub(StringRef, SMLoc) {
277 return parseSectionSwitch(
"__TEXT",
"__picsymbol_stub",
282 bool parseSectionDirectiveData(StringRef, SMLoc) {
283 return parseSectionSwitch(
"__DATA",
"__data");
286 bool parseSectionDirectiveStaticData(StringRef, SMLoc) {
287 return parseSectionSwitch(
"__DATA",
"__static_data");
290 bool parseSectionDirectiveNonLazySymbolPointers(StringRef, SMLoc) {
291 return parseSectionSwitch(
"__DATA",
"__nl_symbol_ptr",
295 bool parseSectionDirectiveLazySymbolPointers(StringRef, SMLoc) {
296 return parseSectionSwitch(
"__DATA",
"__la_symbol_ptr",
300 bool parseSectionDirectiveThreadLocalVariablePointers(StringRef, SMLoc) {
301 return parseSectionSwitch(
"__DATA",
"__thread_ptr",
305 bool parseSectionDirectiveDyld(StringRef, SMLoc) {
306 return parseSectionSwitch(
"__DATA",
"__dyld");
309 bool parseSectionDirectiveModInitFunc(StringRef, SMLoc) {
310 return parseSectionSwitch(
"__DATA",
"__mod_init_func",
314 bool parseSectionDirectiveModTermFunc(StringRef, SMLoc) {
315 return parseSectionSwitch(
"__DATA",
"__mod_term_func",
319 bool parseSectionDirectiveConstData(StringRef, SMLoc) {
320 return parseSectionSwitch(
"__DATA",
"__const");
323 bool parseSectionDirectiveObjCClass(StringRef, SMLoc) {
324 return parseSectionSwitch(
"__OBJC",
"__class",
328 bool parseSectionDirectiveObjCMetaClass(StringRef, SMLoc) {
329 return parseSectionSwitch(
"__OBJC",
"__meta_class",
333 bool parseSectionDirectiveObjCCatClsMeth(StringRef, SMLoc) {
334 return parseSectionSwitch(
"__OBJC",
"__cat_cls_meth",
338 bool parseSectionDirectiveObjCCatInstMeth(StringRef, SMLoc) {
339 return parseSectionSwitch(
"__OBJC",
"__cat_inst_meth",
343 bool parseSectionDirectiveObjCProtocol(StringRef, SMLoc) {
344 return parseSectionSwitch(
"__OBJC",
"__protocol",
348 bool parseSectionDirectiveObjCStringObject(StringRef, SMLoc) {
349 return parseSectionSwitch(
"__OBJC",
"__string_object",
353 bool parseSectionDirectiveObjCClsMeth(StringRef, SMLoc) {
354 return parseSectionSwitch(
"__OBJC",
"__cls_meth",
358 bool parseSectionDirectiveObjCInstMeth(StringRef, SMLoc) {
359 return parseSectionSwitch(
"__OBJC",
"__inst_meth",
363 bool parseSectionDirectiveObjCClsRefs(StringRef, SMLoc) {
364 return parseSectionSwitch(
"__OBJC",
"__cls_refs",
369 bool parseSectionDirectiveObjCMessageRefs(StringRef, SMLoc) {
370 return parseSectionSwitch(
"__OBJC",
"__message_refs",
375 bool parseSectionDirectiveObjCSymbols(StringRef, SMLoc) {
376 return parseSectionSwitch(
"__OBJC",
"__symbols",
380 bool parseSectionDirectiveObjCCategory(StringRef, SMLoc) {
381 return parseSectionSwitch(
"__OBJC",
"__category",
385 bool parseSectionDirectiveObjCClassVars(StringRef, SMLoc) {
386 return parseSectionSwitch(
"__OBJC",
"__class_vars",
390 bool parseSectionDirectiveObjCInstanceVars(StringRef, SMLoc) {
391 return parseSectionSwitch(
"__OBJC",
"__instance_vars",
395 bool parseSectionDirectiveObjCModuleInfo(StringRef, SMLoc) {
396 return parseSectionSwitch(
"__OBJC",
"__module_info",
400 bool parseSectionDirectiveObjCClassNames(StringRef, SMLoc) {
401 return parseSectionSwitch(
"__TEXT",
"__cstring",
405 bool parseSectionDirectiveObjCMethVarTypes(StringRef, SMLoc) {
406 return parseSectionSwitch(
"__TEXT",
"__cstring",
410 bool parseSectionDirectiveObjCMethVarNames(StringRef, SMLoc) {
411 return parseSectionSwitch(
"__TEXT",
"__cstring",
415 bool parseSectionDirectiveObjCSelectorStrs(StringRef, SMLoc) {
416 return parseSectionSwitch(
"__OBJC",
"__selector_strs",
420 bool parseSectionDirectiveTData(StringRef, SMLoc) {
421 return parseSectionSwitch(
"__DATA",
"__thread_data",
425 bool parseSectionDirectiveText(StringRef, SMLoc) {
426 return parseSectionSwitch(
"__TEXT",
"__text",
430 bool parseSectionDirectiveTLV(StringRef, SMLoc) {
431 return parseSectionSwitch(
"__DATA",
"__thread_vars",
435 bool parseSectionDirectiveIdent(StringRef, SMLoc) {
437 getParser().eatToEndOfStatement();
441 bool parseSectionDirectiveThreadInitFunc(StringRef, SMLoc) {
442 return parseSectionSwitch(
"__DATA",
"__thread_init",
446 bool parseWatchOSVersionMin(StringRef Directive, SMLoc Loc) {
449 bool parseTvOSVersionMin(StringRef Directive, SMLoc Loc) {
452 bool parseIOSVersionMin(StringRef Directive, SMLoc Loc) {
455 bool parseMacOSXVersionMin(StringRef Directive, SMLoc Loc) {
459 bool parseBuildVersion(StringRef Directive, SMLoc Loc);
461 bool parseMajorMinorVersionComponent(
unsigned *Major,
unsigned *Minor,
462 const char *VersionName);
463 bool parseOptionalTrailingVersionComponent(
unsigned *Component,
464 const char *ComponentName);
465 bool parseVersion(
unsigned *Major,
unsigned *Minor,
unsigned *Update);
466 bool parseSDKVersion(VersionTuple &SDKVersion);
467 void checkVersion(StringRef Directive, StringRef Arg, SMLoc Loc,
469 bool parseDirectiveCGProfile(StringRef Directive, SMLoc Loc);
475 unsigned TAA,
unsigned Alignment,
478 return TokError(
"unexpected token in section switching directive");
483 getStreamer().switchSection(
getContext().getMachOSection(
484 Segment, Section, TAA, StubSize,
496 getStreamer().emitValueToAlignment(
Align(Alignment));
503bool DarwinAsmParser::parseDirectiveAltEntry(StringRef, SMLoc) {
505 if (getParser().parseIdentifier(Name))
506 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) {
525 if (getParser().parseIdentifier(Name))
526 return TokError(
"expected identifier in directive");
532 return TokError(
"unexpected token in '.desc' directive");
536 if (getParser().parseAbsoluteExpression(DescValue))
540 return TokError(
"unexpected token in '.desc' directive");
545 getStreamer().emitSymbolDesc(Sym, DescValue);
552bool DarwinAsmParser::parseDirectiveIndirectSymbol(StringRef, SMLoc Loc) {
553 const MCSectionMachO *Current =
static_cast<const MCSectionMachO *
>(
554 getStreamer().getCurrentSectionOnly());
560 return Error(Loc,
"indirect symbol not in a symbol pointer or stub "
564 if (getParser().parseIdentifier(Name))
565 return TokError(
"expected identifier in .indirect_symbol directive");
571 return TokError(
"non-local symbol required in directive");
574 return TokError(
"unable to emit indirect symbol attribute for: " + Name);
577 return TokError(
"unexpected token in '.indirect_symbol' directive");
586bool DarwinAsmParser::parseDirectiveDumpOrLoad(StringRef Directive,
588 bool IsDump = Directive ==
".dump";
590 return TokError(
"expected string in '.dump' or '.load' directive");
595 return TokError(
"unexpected token in '.dump' or '.load' directive");
602 return Warning(IDLoc,
"ignoring directive .dump for now");
604 return Warning(IDLoc,
"ignoring directive .load for now");
609bool DarwinAsmParser::parseDirectiveLinkerOption(StringRef IDVal, SMLoc) {
610 SmallVector<std::string, 4>
Args;
613 return TokError(
"expected string in '" + Twine(IDVal) +
"' directive");
616 if (getParser().parseEscapedString(
Data))
625 return TokError(
"unexpected token in '" + Twine(IDVal) +
"' directive");
629 getStreamer().emitLinkerOptions(Args);
635bool DarwinAsmParser::parseDirectiveLsym(StringRef, SMLoc) {
637 if (getParser().parseIdentifier(Name))
638 return TokError(
"expected identifier in directive");
644 return TokError(
"unexpected token in '.lsym' directive");
648 if (getParser().parseExpression(
Value))
652 return TokError(
"unexpected token in '.lsym' directive");
660 return TokError(
"directive '.lsym' is unsupported");
665bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) {
666 SMLoc Loc = getLexer().getLoc();
669 if (getParser().parseIdentifier(SectionName))
670 return Error(Loc,
"expected identifier after '.section' directive");
674 return TokError(
"unexpected token in '.section' directive");
676 std::string SectionSpec = std::string(SectionName);
681 StringRef EOL = getLexer().LexUntilEndOfStatement();
682 SectionSpec.append(EOL.
begin(), EOL.
end());
686 return TokError(
"unexpected token in '.section' directive");
694 SectionSpec, Segment, Section, TAA, TAAParsed, StubSize))
698 Triple
TT = getParser().getContext().getTargetTriple();
702 StringRef NonCoalSection = StringSwitch<StringRef>(Section)
703 .Case(
"__textcoal_nt",
"__text")
704 .Case(
"__const_coal",
"__const")
705 .Case(
"__datacoal_nt",
"__data")
708 if (Section != NonCoalSection) {
710 size_t B = SectionVal.find(
',') + 1,
E = SectionVal.find(
',',
B);
713 getParser().Warning(Loc,
"section \"" + Section +
"\" is deprecated",
714 SMRange(BLoc, ELoc));
715 getParser().Note(Loc,
"change section name to \"" + NonCoalSection +
716 "\"", SMRange(BLoc, ELoc));
721 bool isText = Segment ==
"__TEXT";
722 getStreamer().switchSection(
getContext().getMachOSection(
723 Segment, Section, TAA, StubSize,
730bool DarwinAsmParser::parseDirectivePushSection(StringRef S, SMLoc Loc) {
731 getStreamer().pushSection();
733 if (parseDirectiveSection(S, Loc)) {
734 getStreamer().popSection();
743bool DarwinAsmParser::parseDirectivePopSection(StringRef, SMLoc) {
744 if (!getStreamer().popSection())
745 return TokError(
".popsection without corresponding .pushsection");
751bool DarwinAsmParser::parseDirectivePrevious(StringRef DirName, SMLoc) {
753 if (!PreviousSection.first)
754 return TokError(
".previous without corresponding .section");
755 getStreamer().switchSection(PreviousSection.first, PreviousSection.second);
761bool DarwinAsmParser::parseDirectiveSecureLogUnique(StringRef, SMLoc IDLoc) {
762 StringRef LogMessage = getParser().parseStringToEndOfStatement();
764 return TokError(
"unexpected token in '.secure_log_unique' directive");
767 return Error(IDLoc,
".secure_log_unique specified multiple times");
770 StringRef SecureLogFile =
getContext().getSecureLogFile();
771 if (SecureLogFile.
empty())
772 return Error(IDLoc,
".secure_log_unique used but AS_SECURE_LOG_FILE "
773 "environment variable unset.");
776 raw_fd_ostream *OS =
getContext().getSecureLog();
779 auto NewOS = std::make_unique<raw_fd_ostream>(
782 return Error(IDLoc, Twine(
"can't open secure log file: ") +
783 SecureLogFile +
" (" +
EC.message() +
")");
789 unsigned CurBuf = getSourceManager().FindBufferContainingLoc(IDLoc);
790 *OS << getSourceManager().getBufferInfo(CurBuf).Buffer->getBufferIdentifier()
791 <<
":" << getSourceManager().FindLineNumber(IDLoc, CurBuf) <<
":"
792 << LogMessage +
"\n";
801bool DarwinAsmParser::parseDirectiveSecureLogReset(StringRef, SMLoc IDLoc) {
803 return TokError(
"unexpected token in '.secure_log_reset' directive");
814bool DarwinAsmParser::parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) {
816 return TokError(
"unexpected token in '.subsections_via_symbols' directive");
820 getStreamer().emitSubsectionsViaSymbols();
827bool DarwinAsmParser::parseDirectiveTBSS(StringRef, SMLoc) {
828 SMLoc IDLoc = getLexer().getLoc();
830 if (getParser().parseIdentifier(Name))
831 return TokError(
"expected identifier in directive");
837 return TokError(
"unexpected token in directive");
841 SMLoc SizeLoc = getLexer().getLoc();
842 if (getParser().parseAbsoluteExpression(
Size))
845 int64_t Pow2Alignment = 0;
846 SMLoc Pow2AlignmentLoc;
849 Pow2AlignmentLoc = getLexer().getLoc();
850 if (getParser().parseAbsoluteExpression(Pow2Alignment))
855 return TokError(
"unexpected token in '.tbss' directive");
860 return Error(SizeLoc,
"invalid '.tbss' directive size, can't be less than"
864 if (Pow2Alignment < 0)
865 return Error(Pow2AlignmentLoc,
"invalid '.tbss' alignment, can't be less"
869 return Error(IDLoc,
"invalid symbol redefinition");
871 getStreamer().emitTBSSSymbol(
872 getContext().getMachOSection(
"__DATA",
"__thread_bss",
875 Sym,
Size,
Align(1ULL << Pow2Alignment));
883bool DarwinAsmParser::parseDirectiveZerofill(StringRef, SMLoc) {
885 if (getParser().parseIdentifier(Segment))
886 return TokError(
"expected segment name after '.zerofill' directive");
889 return TokError(
"unexpected token in directive");
893 SMLoc SectionLoc = getLexer().getLoc();
894 if (getParser().parseIdentifier(Section))
895 return TokError(
"expected section name after comma in '.zerofill' "
902 getStreamer().emitZerofill(
905 nullptr, 0,
Align(1), SectionLoc);
910 return TokError(
"unexpected token in directive");
913 SMLoc IDLoc = getLexer().getLoc();
915 if (getParser().parseIdentifier(IDStr))
916 return TokError(
"expected identifier in directive");
922 return TokError(
"unexpected token in directive");
926 SMLoc SizeLoc = getLexer().getLoc();
927 if (getParser().parseAbsoluteExpression(
Size))
930 int64_t Pow2Alignment = 0;
931 SMLoc Pow2AlignmentLoc;
934 Pow2AlignmentLoc = getLexer().getLoc();
935 if (getParser().parseAbsoluteExpression(Pow2Alignment))
940 return TokError(
"unexpected token in '.zerofill' directive");
945 return Error(SizeLoc,
"invalid '.zerofill' directive size, can't be less "
951 if (Pow2Alignment < 0)
952 return Error(Pow2AlignmentLoc,
"invalid '.zerofill' directive alignment, "
953 "can't be less than zero");
956 return Error(IDLoc,
"invalid symbol redefinition");
961 getStreamer().emitZerofill(
964 Sym,
Size,
Align(1ULL << Pow2Alignment), SectionLoc);
971bool DarwinAsmParser::parseDirectiveDataRegion(StringRef, SMLoc) {
977 StringRef RegionType;
978 SMLoc Loc = getParser().getTok().getLoc();
979 if (getParser().parseIdentifier(RegionType))
980 return TokError(
"expected region type after '.data_region' directive");
981 int Kind = StringSwitch<int>(RegionType)
987 return Error(Loc,
"unknown region type in '.data_region' directive");
996bool DarwinAsmParser::parseDirectiveDataRegionEnd(StringRef, SMLoc) {
998 return TokError(
"unexpected token in '.end_data_region' directive");
1010bool DarwinAsmParser::parseMajorMinorVersionComponent(
unsigned *Major,
1012 const char *VersionName) {
1015 return TokError(Twine(
"invalid ") + VersionName +
1016 " major version number, integer expected");
1017 int64_t MajorVal = getLexer().getTok().getIntVal();
1018 if (MajorVal > 65535 || MajorVal <= 0)
1019 return TokError(Twine(
"invalid ") + VersionName +
" major version number");
1020 *Major = (unsigned)MajorVal;
1023 return TokError(Twine(VersionName) +
1024 " minor version number required, comma expected");
1028 return TokError(Twine(
"invalid ") + VersionName +
1029 " minor version number, integer expected");
1030 int64_t MinorVal = getLexer().getTok().getIntVal();
1031 if (MinorVal > 255 || MinorVal < 0)
1032 return TokError(Twine(
"invalid ") + VersionName +
" minor version number");
1039bool DarwinAsmParser::parseOptionalTrailingVersionComponent(
1040 unsigned *Component,
const char *ComponentName) {
1044 return TokError(Twine(
"invalid ") + ComponentName +
1045 " version number, integer expected");
1046 int64_t Val = getLexer().getTok().getIntVal();
1047 if (Val > 255 || Val < 0)
1048 return TokError(Twine(
"invalid ") + ComponentName +
" version number");
1056bool DarwinAsmParser::parseVersion(
unsigned *Major,
unsigned *Minor,
1058 if (parseMajorMinorVersionComponent(Major, Minor,
"OS"))
1067 return TokError(
"invalid OS update specifier, comma expected");
1068 if (parseOptionalTrailingVersionComponent(Update,
"OS update"))
1073bool DarwinAsmParser::parseSDKVersion(VersionTuple &SDKVersion) {
1076 unsigned Major, Minor;
1077 if (parseMajorMinorVersionComponent(&Major, &Minor,
"SDK"))
1079 SDKVersion = VersionTuple(Major, Minor);
1084 if (parseOptionalTrailingVersionComponent(&Subminor,
"SDK subminor"))
1086 SDKVersion = VersionTuple(Major, Minor, Subminor);
1091void DarwinAsmParser::checkVersion(StringRef Directive, StringRef Arg,
1094 if (
Target.getOS() != ExpectedOS)
1095 Warning(Loc, Twine(Directive) +
1096 (Arg.
empty() ? Twine() : Twine(
' ') + Arg) +
1097 " used while targeting " +
Target.getOSName());
1099 if (LastVersionDirective.
isValid()) {
1100 Warning(Loc,
"overriding previous version directive");
1101 Note(LastVersionDirective,
"previous definition is here");
1103 LastVersionDirective = Loc;
1121bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc,
1129 VersionTuple SDKVersion;
1134 return addErrorSuffix(Twine(
" in '") + Directive +
"' directive");
1137 checkVersion(Directive, StringRef(), Loc, ExpectedOS);
1138 getStreamer().emitVersionMin(
Type, Major, Minor, Update, SDKVersion);
1144 case MachO::PLATFORM_UNKNOWN:
1151 case MachO::PLATFORM_BRIDGEOS:
break;
1152 case MachO::PLATFORM_DRIVERKIT:
1154 case MachO::PLATFORM_MACCATALYST:
return Triple::IOS;
1155 case MachO::PLATFORM_IOSSIMULATOR:
break;
1156 case MachO::PLATFORM_TVOSSIMULATOR:
break;
1157 case MachO::PLATFORM_WATCHOSSIMULATOR:
break;
1158 case MachO::PLATFORM_XROS_SIMULATOR:
break;
1165bool DarwinAsmParser::parseBuildVersion(StringRef Directive, SMLoc Loc) {
1166 StringRef PlatformName;
1167 SMLoc PlatformLoc = getTok().getLoc();
1168 if (getParser().parseIdentifier(PlatformName))
1169 return TokError(
"platform name expected");
1171 unsigned Platform = StringSwitch<unsigned>(PlatformName)
1172#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
1174 .Case(#build_name, MachO::PLATFORM_##platform)
1175#include "llvm/BinaryFormat/MachO.def"
1176 .Default(MachO::PLATFORM_UNKNOWN);
1178 if (Platform == MachO::PLATFORM_UNKNOWN)
1179 return Error(PlatformLoc,
"unknown platform name");
1182 return TokError(
"version number required, comma expected");
1191 VersionTuple SDKVersion;
1196 return addErrorSuffix(
" in '.build_version' directive");
1200 checkVersion(Directive, PlatformName, Loc, ExpectedOS);
1201 getStreamer().emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
1207bool DarwinAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) {
1214 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)
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).
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()
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
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.
@ 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.
Context & getContext() const
@ 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.
FunctionAddr VTableAddr Value
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
@ MCVM_WatchOSVersionMin
.watchos_version_min
@ MCVM_OSXVersionMin
.macosx_version_min
@ MCVM_TvOSVersionMin
.tvos_version_min
@ MCVM_IOSVersionMin
.ios_version_min
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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
MCAsmParserExtension * createDarwinAsmParser()
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)