81typedef std::vector<AsmToken> MCAsmMacroArgument;
82typedef std::vector<MCAsmMacroArgument> MCAsmMacroArguments;
86struct MacroInstantiation {
88 SMLoc InstantiationLoc;
97 size_t CondStackDepth;
100struct ParseStatementInfo {
105 unsigned Opcode = ~0
U;
108 bool ParseError =
false;
112 ParseStatementInfo() =
delete;
114 : AsmRewrites(rewrites) {}
126 void *SavedDiagContext;
127 std::unique_ptr<MCAsmParserExtension> PlatformParser;
129 std::optional<SMLoc> CFIStartProcLoc;
136 std::vector<AsmCond> TheCondStack;
144 std::vector<MacroInstantiation*> ActiveMacros;
147 std::deque<MCAsmMacro> MacroLikeBodies;
150 unsigned MacrosEnabledFlag : 1;
153 unsigned NumOfMacroInstantiations;
156 struct CppHashInfoTy {
161 CppHashInfoTy() : LineNumber(0), Buf(0) {}
163 CppHashInfoTy CppHashInfo;
166 bool HadCppHashFilename =
false;
174 unsigned AssemblerDialect = ~0
U;
177 bool IsDarwin =
false;
180 bool ParsingMSInlineAsm =
false;
183 bool ReportedInconsistentMD5 =
false;
186 bool AltMacroMode =
false;
189 virtual bool parseStatement(ParseStatementInfo &Info,
195 bool parseAndMatchAndEmitTargetInstruction(ParseStatementInfo &Info,
202 bool enabledGenDwarfForAssembly();
207 AsmParser(
const AsmParser &) =
delete;
208 AsmParser &
operator=(
const AsmParser &) =
delete;
209 ~AsmParser()
override;
211 bool Run(
bool NoInitialTextSection,
bool NoFinalize =
false)
override;
214 ExtensionDirectiveHandler Handler)
override {
215 ExtensionDirectiveMap[
Directive] = Handler;
219 DirectiveKindMap[
Directive.lower()] = DirectiveKindMap[Alias.
lower()];
233 if (AssemblerDialect == ~0U)
236 return AssemblerDialect;
239 AssemblerDialect = i;
251 ParsingMSInlineAsm =
V;
276 SMLoc &EndLoc)
override;
294 bool parseCppHashLineFilenameComment(
SMLoc L,
bool SaveLocInfo =
true);
303 bool areMacrosEnabled() {
return MacrosEnabledFlag;}
306 void setMacrosEnabled(
bool Flag) {MacrosEnabledFlag =
Flag;}
309 bool isInsideMacroInstantiation() {
return !ActiveMacros.empty();}
318 void handleMacroExit();
321 bool parseMacroArgument(MCAsmMacroArgument &MA,
bool Vararg);
324 bool parseMacroArguments(
const MCAsmMacro *M, MCAsmMacroArguments &
A);
326 void printMacroInstantiations();
335 bool enterIncludeFile(
const std::string &Filename);
339 bool processIncbinFile(
const std::string &Filename, int64_t Skip = 0,
348 void jumpToLoc(
SMLoc Loc,
unsigned InBuffer = 0);
359 enum class AssignmentKind {
371 bool parseBinOpRHS(
unsigned Precedence,
const MCExpr *&Res,
SMLoc &EndLoc);
372 bool parseParenExpr(
const MCExpr *&Res,
SMLoc &EndLoc);
373 bool parseBracketExpr(
const MCExpr *&Res,
SMLoc &EndLoc);
375 bool parseRegisterOrRegisterNumber(int64_t &
Register,
SMLoc DirectiveLoc);
378 bool parseCVFileId(int64_t &FileId,
StringRef DirectiveName);
437 DK_BUNDLE_ALIGN_MODE,
451 DK_WEAK_DEF_CAN_BE_HIDDEN,
492 DK_CV_INLINE_SITE_ID,
495 DK_CV_INLINE_LINETABLE,
500 DK_CV_FILECHECKSUM_OFFSET,
506 DK_CFI_DEF_CFA_OFFSET,
507 DK_CFI_ADJUST_CFA_OFFSET,
508 DK_CFI_DEF_CFA_REGISTER,
509 DK_CFI_LLVM_DEF_ASPACE_CFA,
514 DK_CFI_REMEMBER_STATE,
515 DK_CFI_RESTORE_STATE,
519 DK_CFI_RETURN_COLUMN,
546 DK_LTO_SET_CONDITIONAL,
547 DK_CFI_MTE_TAGGED_FRAME,
557 enum CVDefRangeType {
559 CVDR_DEFRANGE_REGISTER,
560 CVDR_DEFRANGE_FRAMEPOINTER_REL,
561 CVDR_DEFRANGE_SUBFIELD_REGISTER,
562 CVDR_DEFRANGE_REGISTER_REL
570 bool parseDirectiveAscii(
StringRef IDVal,
bool ZeroTerminated);
571 bool parseDirectiveReloc(
SMLoc DirectiveLoc);
572 bool parseDirectiveValue(
StringRef IDVal,
574 bool parseDirectiveOctaValue(
StringRef IDVal);
575 bool parseDirectiveRealValue(
StringRef IDVal,
577 bool parseDirectiveFill();
578 bool parseDirectiveZero();
580 bool parseDirectiveSet(
StringRef IDVal, AssignmentKind Kind);
581 bool parseDirectiveOrg();
583 bool parseDirectiveAlign(
bool IsPow2,
unsigned ValueSize);
586 bool parseDirectiveFile(
SMLoc DirectiveLoc);
587 bool parseDirectiveLine();
588 bool parseDirectiveLoc();
589 bool parseDirectiveLocLabel(
SMLoc DirectiveLoc);
590 bool parseDirectiveStabs();
594 bool parseDirectiveCVFile();
595 bool parseDirectiveCVFuncId();
596 bool parseDirectiveCVInlineSiteId();
597 bool parseDirectiveCVLoc();
598 bool parseDirectiveCVLinetable();
599 bool parseDirectiveCVInlineLinetable();
600 bool parseDirectiveCVDefRange();
601 bool parseDirectiveCVString();
602 bool parseDirectiveCVStringTable();
603 bool parseDirectiveCVFileChecksums();
604 bool parseDirectiveCVFileChecksumOffset();
605 bool parseDirectiveCVFPOData();
608 bool parseDirectiveCFIRegister(
SMLoc DirectiveLoc);
609 bool parseDirectiveCFIWindowSave(
SMLoc DirectiveLoc);
610 bool parseDirectiveCFISections();
611 bool parseDirectiveCFIStartProc();
612 bool parseDirectiveCFIEndProc();
613 bool parseDirectiveCFIDefCfaOffset(
SMLoc DirectiveLoc);
614 bool parseDirectiveCFIDefCfa(
SMLoc DirectiveLoc);
615 bool parseDirectiveCFIAdjustCfaOffset(
SMLoc DirectiveLoc);
616 bool parseDirectiveCFIDefCfaRegister(
SMLoc DirectiveLoc);
617 bool parseDirectiveCFILLVMDefAspaceCfa(
SMLoc DirectiveLoc);
618 bool parseDirectiveCFIOffset(
SMLoc DirectiveLoc);
619 bool parseDirectiveCFIRelOffset(
SMLoc DirectiveLoc);
620 bool parseDirectiveCFIPersonalityOrLsda(
bool IsPersonality);
621 bool parseDirectiveCFIRememberState(
SMLoc DirectiveLoc);
622 bool parseDirectiveCFIRestoreState(
SMLoc DirectiveLoc);
623 bool parseDirectiveCFISameValue(
SMLoc DirectiveLoc);
624 bool parseDirectiveCFIRestore(
SMLoc DirectiveLoc);
625 bool parseDirectiveCFIEscape(
SMLoc DirectiveLoc);
626 bool parseDirectiveCFIReturnColumn(
SMLoc DirectiveLoc);
627 bool parseDirectiveCFISignalFrame(
SMLoc DirectiveLoc);
628 bool parseDirectiveCFIUndefined(
SMLoc DirectiveLoc);
629 bool parseDirectiveCFILabel(
SMLoc DirectiveLoc);
630 bool parseDirectiveCFIValOffset(
SMLoc DirectiveLoc);
633 bool parseDirectivePurgeMacro(
SMLoc DirectiveLoc);
636 bool parseDirectiveMacro(
SMLoc DirectiveLoc);
641 bool parseDirectiveBundleAlignMode();
643 bool parseDirectiveBundleLock();
645 bool parseDirectiveBundleUnlock();
648 bool parseDirectiveSpace(
StringRef IDVal);
657 bool parseDirectiveLEB128(
bool Signed);
663 bool parseDirectiveComm(
bool IsLocal);
665 bool parseDirectiveAbort(
SMLoc DirectiveLoc);
666 bool parseDirectiveInclude();
667 bool parseDirectiveIncbin();
670 bool parseDirectiveIf(
SMLoc DirectiveLoc, DirectiveKind DirKind);
672 bool parseDirectiveIfb(
SMLoc DirectiveLoc,
bool ExpectBlank);
674 bool parseDirectiveIfc(
SMLoc DirectiveLoc,
bool ExpectEqual);
676 bool parseDirectiveIfeqs(
SMLoc DirectiveLoc,
bool ExpectEqual);
678 bool parseDirectiveIfdef(
SMLoc DirectiveLoc,
bool expect_defined);
679 bool parseDirectiveElseIf(
SMLoc DirectiveLoc);
680 bool parseDirectiveElse(
SMLoc DirectiveLoc);
681 bool parseDirectiveEndIf(
SMLoc DirectiveLoc);
693 bool parseDirectiveIrp(
SMLoc DirectiveLoc);
694 bool parseDirectiveIrpc(
SMLoc DirectiveLoc);
695 bool parseDirectiveEndr(
SMLoc DirectiveLoc);
698 bool parseDirectiveMSEmit(
SMLoc DirectiveLoc, ParseStatementInfo &Info,
702 bool parseDirectiveMSAlign(
SMLoc DirectiveLoc, ParseStatementInfo &Info);
705 bool parseDirectiveEnd(
SMLoc DirectiveLoc);
708 bool parseDirectiveError(
SMLoc DirectiveLoc,
bool WithMessage);
711 bool parseDirectiveWarning(
SMLoc DirectiveLoc);
714 bool parseDirectivePrint(
SMLoc DirectiveLoc);
717 bool parseDirectivePseudoProbe();
720 bool parseDirectiveLTODiscard();
723 bool parseDirectiveAddrsig();
724 bool parseDirectiveAddrsigSym();
726 void initializeDirectiveKindMap();
727 void initializeCVDefRangeTypeMap();
730class HLASMAsmParser final :
public AsmParser {
735 void lexLeadingSpaces() {
741 bool parseAsMachineInstruction(ParseStatementInfo &Info,
747 : AsmParser(SM, Ctx, Out, MAI, CB), Lexer(getLexer()), Out(Out) {
756 bool parseStatement(ParseStatementInfo &Info,
779 : Lexer(MAI), Ctx(Ctx), Out(Out), MAI(MAI),
SrcMgr(SM),
780 CurBuffer(CB ? CB : SM.getMainFileID()), MacrosEnabledFlag(
true) {
808 "Need to implement createSPIRVAsmParser for SPIRV format.");
821 PlatformParser->Initialize(*
this);
822 initializeDirectiveKindMap();
823 initializeCVDefRangeTypeMap();
825 NumOfMacroInstantiations = 0;
828AsmParser::~AsmParser() {
829 assert((HadError || ActiveMacros.empty()) &&
830 "Unexpected active macro instantiation!");
839void AsmParser::printMacroInstantiations() {
841 for (MacroInstantiation *M :
reverse(ActiveMacros))
843 "while in macro instantiation");
847 printPendingErrors();
849 printMacroInstantiations();
853 if(getTargetParser().getTargetOptions().MCNoWarn)
855 if (getTargetParser().getTargetOptions().MCFatalWarnings)
858 printMacroInstantiations();
865 printMacroInstantiations();
869bool AsmParser::enterIncludeFile(
const std::string &Filename) {
870 std::string IncludedFile;
884bool AsmParser::processIncbinFile(
const std::string &Filename, int64_t Skip,
886 std::string IncludedFile;
897 if (!Count->evaluateAsAbsolute(Res, getStreamer().getAssemblerPtr()))
898 return Error(Loc,
"expected absolute expression");
900 return Warning(Loc,
"negative count has no effect");
903 getStreamer().emitBytes(Bytes);
907void AsmParser::jumpToLoc(
SMLoc Loc,
unsigned InBuffer) {
920 if (!getTok().getString().empty() && getTok().getString().front() !=
'\n' &&
938 if (ParentIncludeLoc !=
SMLoc()) {
939 jumpToLoc(ParentIncludeLoc);
947bool AsmParser::enabledGenDwarfForAssembly() {
949 if (!getContext().getGenDwarfForAssembly())
954 if (getContext().getGenDwarfFileNumber() == 0) {
956 getContext().getMCDwarfLineTable(0).getRootFile();
957 getContext().setGenDwarfFileNumber(getStreamer().emitDwarfFileDirective(
958 0, getContext().getCompilationDir(), RootFile.
Name,
964bool AsmParser::Run(
bool NoInitialTextSection,
bool NoFinalize) {
965 LTODiscardSymbols.
clear();
968 if (!NoInitialTextSection)
975 AsmCond StartingCondState = TheCondState;
982 if (getContext().getGenDwarfForAssembly()) {
983 MCSection *Sec = getStreamer().getCurrentSectionOnly();
985 MCSymbol *SectionStartSym = getContext().createTempSymbol();
986 getStreamer().emitLabel(SectionStartSym);
989 bool InsertResult = getContext().addGenDwarfSection(Sec);
990 assert(InsertResult &&
".text section should not have debug info yet");
994 getTargetParser().onBeginOfFile();
998 ParseStatementInfo
Info(&AsmStrRewrites);
999 bool Parsed = parseStatement(Info,
nullptr);
1009 printPendingErrors();
1012 if (Parsed && !getLexer().isAtStartOfStatement())
1013 eatToEndOfStatement();
1016 getTargetParser().onEndOfFile();
1017 printPendingErrors();
1020 assert(!hasPendingError() &&
"unexpected error from parseStatement");
1022 getTargetParser().flushPendingInstructions(getStreamer());
1026 printError(getTok().getLoc(),
"unmatched .ifs or .elses");
1028 const auto &LineTables = getContext().getMCDwarfLineTables();
1029 if (!LineTables.empty()) {
1031 for (
const auto &File : LineTables.begin()->second.getMCDwarfFiles()) {
1032 if (
File.Name.empty() && Index != 0)
1033 printError(getTok().getLoc(),
"unassigned file number: " +
1035 " for .file directives");
1051 if (
Sym &&
Sym->isTemporary() && !
Sym->isVariable() &&
1056 printError(getTok().getLoc(),
"assembler local symbol '" +
1057 Sym->getName() +
"' not defined");
1063 for (std::tuple<SMLoc, CppHashInfoTy, MCSymbol *> &LocSym : DirLabels) {
1064 if (std::get<2>(LocSym)->isUndefined()) {
1067 CppHashInfo = std::get<1>(LocSym);
1068 printError(std::get<0>(LocSym),
"directional label undefined");
1074 if (!HadError && !NoFinalize) {
1076 TS->emitConstantPools();
1081 return HadError || getContext().hadError();
1084bool AsmParser::checkForValidSection() {
1085 if (!ParsingMSInlineAsm && !getStreamer().getCurrentFragment()) {
1087 return Error(getTok().getLoc(),
1088 "expected section directive before assembly directive");
1094void AsmParser::eatToEndOfStatement() {
1103StringRef AsmParser::parseStringToEndOfStatement() {
1104 const char *Start = getTok().getLoc().getPointer();
1109 const char *
End = getTok().getLoc().getPointer();
1113StringRef AsmParser::parseStringToComma() {
1114 const char *Start = getTok().getLoc().getPointer();
1120 const char *
End = getTok().getLoc().getPointer();
1129bool AsmParser::parseParenExpr(
const MCExpr *&Res,
SMLoc &EndLoc) {
1130 if (parseExpression(Res))
1133 return parseRParen();
1141bool AsmParser::parseBracketExpr(
const MCExpr *&Res,
SMLoc &EndLoc) {
1142 if (parseExpression(Res))
1144 EndLoc = getTok().getEndLoc();
1145 if (parseToken(
AsmToken::RBrac,
"expected ']' in brackets expression"))
1156bool AsmParser::parsePrimaryExpr(
const MCExpr *&Res,
SMLoc &EndLoc,
1158 SMLoc FirstTokenLoc = getLexer().getLoc();
1160 switch (FirstTokenKind) {
1162 return TokError(
"unknown token in expression");
1168 if (parsePrimaryExpr(Res, EndLoc, TypeInfo))
1178 if (parseIdentifier(Identifier)) {
1182 bool ShouldGenerateTempSymbol =
false;
1185 ShouldGenerateTempSymbol =
true;
1187 if (!ShouldGenerateTempSymbol)
1188 return Error(FirstTokenLoc,
"invalid token in expression");
1198 EndLoc = FirstTokenLoc;
1203 std::pair<StringRef, StringRef>
Split;
1208 SMLoc AtLoc = getLexer().getLoc();
1210 if (parseIdentifier(VName))
1211 return Error(AtLoc,
"expected symbol variant after '@'");
1213 Split = std::make_pair(Identifier, VName);
1221 parseIdentifier(VName);
1224 Split = std::make_pair(Identifier, VName);
1232 return Error(getLexer().getLoc(),
"expected a symbol reference");
1237 if (!
Split.second.empty()) {
1238 Variant = getTargetParser().getVariantKindForName(
Split.second);
1245 "invalid variant '" +
Split.second +
"'");
1249 MCSymbol *
Sym = getContext().getInlineAsmLabel(SymbolName);
1251 Sym = getContext().getOrCreateSymbol(
1256 if (
Sym->isVariable()) {
1257 auto V =
Sym->getVariableValue(
false);
1258 bool DoInline = isa<MCConstantExpr>(V) && !
Variant;
1259 if (
auto TV = dyn_cast<MCTargetExpr>(V))
1260 DoInline = TV->inlineAssignedExpr();
1263 return Error(EndLoc,
"unexpected modifier on variable reference");
1264 Res =
Sym->getVariableValue(
false);
1274 return TokError(
"literal value out of range for directive");
1276 SMLoc Loc = getTok().getLoc();
1277 int64_t
IntVal = getTok().getIntVal();
1285 std::pair<StringRef, StringRef>
Split = IDVal.
split(
'@');
1287 if (
Split.first.size() != IDVal.
size()) {
1290 return TokError(
"invalid variant '" +
Split.second +
"'");
1291 IDVal =
Split.first;
1293 if (IDVal ==
"f" || IDVal ==
"b") {
1297 if (IDVal ==
"b" &&
Sym->isUndefined())
1298 return Error(Loc,
"directional label undefined");
1299 DirLabels.push_back(std::make_tuple(Loc, CppHashInfo,
Sym));
1307 APFloat RealVal(APFloat::IEEEdouble(), getTok().getString());
1316 return TokError(
"cannot use . as current PC");
1329 return parseParenExpr(Res, EndLoc);
1331 if (!PlatformParser->HasBracketExpressions())
1332 return TokError(
"brackets expression not supported on this target");
1334 return parseBracketExpr(Res, EndLoc);
1337 if (parsePrimaryExpr(Res, EndLoc, TypeInfo))
1343 if (parsePrimaryExpr(Res, EndLoc, TypeInfo))
1349 if (parsePrimaryExpr(Res, EndLoc, TypeInfo))
1381 return TokError(
"expected '(' after operator");
1383 if (parseExpression(Res, EndLoc))
1387 Res = getTargetParser().createTargetUnaryExpr(Res, FirstTokenKind, Ctx);
1392bool AsmParser::parseExpression(
const MCExpr *&Res) {
1394 return parseExpression(Res, EndLoc);
1398AsmParser::applyModifierToExpr(
const MCExpr *E,
1401 const MCExpr *NewE = getTargetParser().applyModifierToExpr(E, Variant, Ctx);
1415 TokError(
"invalid variant on expression '" + getTok().getIdentifier() +
1416 "' (already modified)");
1464 "Argument to the function cannot be a NULL value");
1466 while ((*CharPtr !=
'>') && (*CharPtr !=
'\n') && (*CharPtr !=
'\r') &&
1467 (*CharPtr !=
'\0')) {
1468 if (*CharPtr ==
'!')
1472 if (*CharPtr ==
'>') {
1482 for (
size_t Pos = 0; Pos < AltMacroStr.
size(); Pos++) {
1483 if (AltMacroStr[Pos] ==
'!')
1485 Res += AltMacroStr[Pos];
1500bool AsmParser::parseExpression(
const MCExpr *&Res,
SMLoc &EndLoc) {
1503 if (getTargetParser().parsePrimaryExpr(Res, EndLoc) ||
1504 parseBinOpRHS(1, Res, EndLoc))
1512 return TokError(
"unexpected symbol modifier following '@'");
1517 return TokError(
"invalid variant '" + getTok().getIdentifier() +
"'");
1519 const MCExpr *ModifiedRes = applyModifierToExpr(Res, Variant);
1521 return TokError(
"invalid modifier '" + getTok().getIdentifier() +
1522 "' (no symbols present)");
1532 if (Res->evaluateAsAbsolute(
Value))
1538bool AsmParser::parseParenExpression(
const MCExpr *&Res,
SMLoc &EndLoc) {
1540 return parseParenExpr(Res, EndLoc) || parseBinOpRHS(1, Res, EndLoc);
1543bool AsmParser::parseParenExprOfDepth(
unsigned ParenDepth,
const MCExpr *&Res,
1545 if (parseParenExpr(Res, EndLoc))
1548 for (; ParenDepth > 0; --ParenDepth) {
1549 if (parseBinOpRHS(1, Res, EndLoc))
1554 if (ParenDepth - 1 > 0) {
1555 EndLoc = getTok().getEndLoc();
1563bool AsmParser::parseAbsoluteExpression(int64_t &Res) {
1567 if (parseExpression(Expr))
1570 if (!Expr->evaluateAsAbsolute(Res, getStreamer().getAssemblerPtr()))
1571 return Error(StartLoc,
"expected absolute expression");
1578 bool ShouldUseLogicalShr) {
1655 bool ShouldUseLogicalShr) {
1744bool AsmParser::parseBinOpRHS(
unsigned Precedence,
const MCExpr *&Res,
1749 unsigned TokPrec = getBinOpPrecedence(Lexer.
getKind(), Kind);
1753 if (TokPrec < Precedence)
1760 if (getTargetParser().parsePrimaryExpr(RHS, EndLoc))
1766 unsigned NextTokPrec = getBinOpPrecedence(Lexer.
getKind(), Dummy);
1767 if (TokPrec < NextTokPrec && parseBinOpRHS(TokPrec + 1, RHS, EndLoc))
1779bool AsmParser::parseStatement(ParseStatementInfo &Info,
1781 assert(!hasPendingError() &&
"parseStatement started with pending error");
1787 if (getTok().getString().empty() || getTok().getString().front() ==
'\r' ||
1788 getTok().getString().front() ==
'\n')
1797 int64_t LocalLabelVal = -1;
1798 StartTokLoc =
ID.getLoc();
1800 return parseCppHashLineFilenameComment(IDLoc,
1801 !isInsideMacroInstantiation());
1805 LocalLabelVal = getTok().getIntVal();
1806 if (LocalLabelVal < 0) {
1807 if (!TheCondState.
Ignore) {
1809 return Error(IDLoc,
"unexpected token at start of statement");
1813 IDVal = getTok().getString();
1816 if (!TheCondState.
Ignore) {
1818 return Error(IDLoc,
"unexpected token at start of statement");
1836 getTargetParser().starIsStartOfStatement()) {
1840 }
else if (parseIdentifier(IDVal)) {
1841 if (!TheCondState.
Ignore) {
1843 return Error(IDLoc,
"unexpected token at start of statement");
1852 DirectiveKindMap.find(IDVal.
lower());
1853 DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end())
1855 : DirKindIt->getValue();
1866 return parseDirectiveIf(IDLoc, DirKind);
1868 return parseDirectiveIfb(IDLoc,
true);
1870 return parseDirectiveIfb(IDLoc,
false);
1872 return parseDirectiveIfc(IDLoc,
true);
1874 return parseDirectiveIfeqs(IDLoc,
true);
1876 return parseDirectiveIfc(IDLoc,
false);
1878 return parseDirectiveIfeqs(IDLoc,
false);
1880 return parseDirectiveIfdef(IDLoc,
true);
1883 return parseDirectiveIfdef(IDLoc,
false);
1885 return parseDirectiveElseIf(IDLoc);
1887 return parseDirectiveElse(IDLoc);
1889 return parseDirectiveEndIf(IDLoc);
1894 if (TheCondState.
Ignore) {
1895 eatToEndOfStatement();
1905 if (checkForValidSection())
1912 return Error(IDLoc,
"invalid use of pseudo-symbol '.' as a label");
1920 if (LocalLabelVal == -1) {
1921 if (ParsingMSInlineAsm && SI) {
1923 SI->LookupInlineAsmLabel(IDVal, getSourceManager(), IDLoc,
true);
1925 "We should have an internal name here.");
1928 IDVal = RewrittenLabel;
1930 Sym = getContext().getOrCreateSymbol(IDVal);
1938 StringRef CommentStr = parseStringToEndOfStatement();
1950 Sym->isExternal() && !cast<MCSymbolMachO>(
Sym)->isAltEntry())
1951 return Error(StartTokLoc,
"non-private labels cannot appear between "
1952 ".cfi_startproc / .cfi_endproc pairs") &&
1953 Error(*CFIStartProcLoc,
"previous .cfi_startproc was here");
1955 if (discardLTOSymbol(IDVal))
1958 getTargetParser().doBeforeLabelEmit(
Sym, IDLoc);
1961 if (!getTargetParser().isParsingMSInlineAsm())
1966 if (enabledGenDwarfForAssembly())
1970 getTargetParser().onLabelParsed(
Sym);
1979 return parseAssignment(IDVal, AssignmentKind::Equal);
1983 if (areMacrosEnabled())
1984 if (
MCAsmMacro *M = getContext().lookupMacro(IDVal))
1985 return handleMacroEntry(M, IDLoc);
2002 getTargetParser().flushPendingInstructions(getStreamer());
2004 ParseStatus TPDirectiveReturn = getTargetParser().parseDirective(
ID);
2006 "Should only return Failure iff there was an error");
2014 std::pair<MCAsmParserExtension *, DirectiveHandler> Handler =
2015 ExtensionDirectiveMap.
lookup(IDVal);
2017 return (*Handler.second)(Handler.first, IDVal, IDLoc);
2026 return parseDirectiveSet(IDVal, AssignmentKind::Set);
2028 return parseDirectiveSet(IDVal, AssignmentKind::Equiv);
2029 case DK_LTO_SET_CONDITIONAL:
2030 return parseDirectiveSet(IDVal, AssignmentKind::LTOSetConditional);
2032 return parseDirectiveAscii(IDVal,
false);
2035 return parseDirectiveAscii(IDVal,
true);
2038 return parseDirectiveValue(IDVal, 1);
2044 return parseDirectiveValue(IDVal, 2);
2049 return parseDirectiveValue(IDVal, 4);
2052 return parseDirectiveValue(IDVal, 8);
2054 return parseDirectiveValue(
2055 IDVal, getContext().getAsmInfo()->getCodePointerSize());
2057 return parseDirectiveOctaValue(IDVal);
2061 return parseDirectiveRealValue(IDVal, APFloat::IEEEsingle());
2064 return parseDirectiveRealValue(IDVal, APFloat::IEEEdouble());
2066 bool IsPow2 = !getContext().getAsmInfo()->getAlignmentIsInBytes();
2067 return parseDirectiveAlign(IsPow2, 1);
2070 bool IsPow2 = !getContext().getAsmInfo()->getAlignmentIsInBytes();
2071 return parseDirectiveAlign(IsPow2, 4);
2074 return parseDirectiveAlign(
false, 1);
2076 return parseDirectiveAlign(
false, 2);
2078 return parseDirectiveAlign(
false, 4);
2080 return parseDirectiveAlign(
true, 1);
2082 return parseDirectiveAlign(
true, 2);
2084 return parseDirectiveAlign(
true, 4);
2086 return parseDirectiveOrg();
2088 return parseDirectiveFill();
2090 return parseDirectiveZero();
2092 eatToEndOfStatement();
2096 return parseDirectiveSymbolAttribute(
MCSA_Global);
2097 case DK_LAZY_REFERENCE:
2099 case DK_NO_DEAD_STRIP:
2101 case DK_SYMBOL_RESOLVER:
2103 case DK_PRIVATE_EXTERN:
2107 case DK_WEAK_DEFINITION:
2109 case DK_WEAK_REFERENCE:
2111 case DK_WEAK_DEF_CAN_BE_HIDDEN:
2114 return parseDirectiveSymbolAttribute(
MCSA_Cold);
2117 return parseDirectiveComm(
false);
2119 return parseDirectiveComm(
true);
2121 return parseDirectiveAbort(IDLoc);
2123 return parseDirectiveInclude();
2125 return parseDirectiveIncbin();
2128 return TokError(
Twine(IDVal) +
2129 " not currently supported for this target");
2131 return parseDirectiveRept(IDLoc, IDVal);
2133 return parseDirectiveIrp(IDLoc);
2135 return parseDirectiveIrpc(IDLoc);
2137 return parseDirectiveEndr(IDLoc);
2138 case DK_BUNDLE_ALIGN_MODE:
2139 return parseDirectiveBundleAlignMode();
2140 case DK_BUNDLE_LOCK:
2141 return parseDirectiveBundleLock();
2142 case DK_BUNDLE_UNLOCK:
2143 return parseDirectiveBundleUnlock();
2145 return parseDirectiveLEB128(
true);
2147 return parseDirectiveLEB128(
false);
2150 return parseDirectiveSpace(IDVal);
2152 return parseDirectiveFile(IDLoc);
2154 return parseDirectiveLine();
2156 return parseDirectiveLoc();
2158 return parseDirectiveLocLabel(IDLoc);
2160 return parseDirectiveStabs();
2162 return parseDirectiveCVFile();
2164 return parseDirectiveCVFuncId();
2165 case DK_CV_INLINE_SITE_ID:
2166 return parseDirectiveCVInlineSiteId();
2168 return parseDirectiveCVLoc();
2169 case DK_CV_LINETABLE:
2170 return parseDirectiveCVLinetable();
2171 case DK_CV_INLINE_LINETABLE:
2172 return parseDirectiveCVInlineLinetable();
2173 case DK_CV_DEF_RANGE:
2174 return parseDirectiveCVDefRange();
2176 return parseDirectiveCVString();
2177 case DK_CV_STRINGTABLE:
2178 return parseDirectiveCVStringTable();
2179 case DK_CV_FILECHECKSUMS:
2180 return parseDirectiveCVFileChecksums();
2181 case DK_CV_FILECHECKSUM_OFFSET:
2182 return parseDirectiveCVFileChecksumOffset();
2183 case DK_CV_FPO_DATA:
2184 return parseDirectiveCVFPOData();
2185 case DK_CFI_SECTIONS:
2186 return parseDirectiveCFISections();
2187 case DK_CFI_STARTPROC:
2188 return parseDirectiveCFIStartProc();
2189 case DK_CFI_ENDPROC:
2190 return parseDirectiveCFIEndProc();
2191 case DK_CFI_DEF_CFA:
2192 return parseDirectiveCFIDefCfa(IDLoc);
2193 case DK_CFI_DEF_CFA_OFFSET:
2194 return parseDirectiveCFIDefCfaOffset(IDLoc);
2195 case DK_CFI_ADJUST_CFA_OFFSET:
2196 return parseDirectiveCFIAdjustCfaOffset(IDLoc);
2197 case DK_CFI_DEF_CFA_REGISTER:
2198 return parseDirectiveCFIDefCfaRegister(IDLoc);
2199 case DK_CFI_LLVM_DEF_ASPACE_CFA:
2200 return parseDirectiveCFILLVMDefAspaceCfa(IDLoc);
2202 return parseDirectiveCFIOffset(IDLoc);
2203 case DK_CFI_REL_OFFSET:
2204 return parseDirectiveCFIRelOffset(IDLoc);
2205 case DK_CFI_PERSONALITY:
2206 return parseDirectiveCFIPersonalityOrLsda(
true);
2208 return parseDirectiveCFIPersonalityOrLsda(
false);
2209 case DK_CFI_REMEMBER_STATE:
2210 return parseDirectiveCFIRememberState(IDLoc);
2211 case DK_CFI_RESTORE_STATE:
2212 return parseDirectiveCFIRestoreState(IDLoc);
2213 case DK_CFI_SAME_VALUE:
2214 return parseDirectiveCFISameValue(IDLoc);
2215 case DK_CFI_RESTORE:
2216 return parseDirectiveCFIRestore(IDLoc);
2218 return parseDirectiveCFIEscape(IDLoc);
2219 case DK_CFI_RETURN_COLUMN:
2220 return parseDirectiveCFIReturnColumn(IDLoc);
2221 case DK_CFI_SIGNAL_FRAME:
2222 return parseDirectiveCFISignalFrame(IDLoc);
2223 case DK_CFI_UNDEFINED:
2224 return parseDirectiveCFIUndefined(IDLoc);
2225 case DK_CFI_REGISTER:
2226 return parseDirectiveCFIRegister(IDLoc);
2227 case DK_CFI_WINDOW_SAVE:
2228 return parseDirectiveCFIWindowSave(IDLoc);
2230 return parseDirectiveCFILabel(IDLoc);
2231 case DK_CFI_VAL_OFFSET:
2232 return parseDirectiveCFIValOffset(IDLoc);
2235 return parseDirectiveMacrosOnOff(IDVal);
2237 return parseDirectiveMacro(IDLoc);
2240 return parseDirectiveAltmacro(IDVal);
2242 return parseDirectiveExitMacro(IDVal);
2245 return parseDirectiveEndMacro(IDVal);
2247 return parseDirectivePurgeMacro(IDLoc);
2249 return parseDirectiveEnd(IDLoc);
2251 return parseDirectiveError(IDLoc,
false);
2253 return parseDirectiveError(IDLoc,
true);
2255 return parseDirectiveWarning(IDLoc);
2257 return parseDirectiveReloc(IDLoc);
2260 return parseDirectiveDCB(IDVal, 2);
2262 return parseDirectiveDCB(IDVal, 1);
2264 return parseDirectiveRealDCB(IDVal, APFloat::IEEEdouble());
2266 return parseDirectiveDCB(IDVal, 4);
2268 return parseDirectiveRealDCB(IDVal, APFloat::IEEEsingle());
2271 return TokError(
Twine(IDVal) +
2272 " not currently supported for this target");
2275 return parseDirectiveDS(IDVal, 2);
2277 return parseDirectiveDS(IDVal, 1);
2279 return parseDirectiveDS(IDVal, 8);
2282 return parseDirectiveDS(IDVal, 4);
2285 return parseDirectiveDS(IDVal, 12);
2287 return parseDirectivePrint(IDLoc);
2289 return parseDirectiveAddrsig();
2290 case DK_ADDRSIG_SYM:
2291 return parseDirectiveAddrsigSym();
2292 case DK_PSEUDO_PROBE:
2293 return parseDirectivePseudoProbe();
2294 case DK_LTO_DISCARD:
2295 return parseDirectiveLTODiscard();
2297 return parseDirectiveSymbolAttribute(
MCSA_Memtag);
2300 return Error(IDLoc,
"unknown directive");
2304 if (ParsingMSInlineAsm && (IDVal ==
"_emit" || IDVal ==
"__emit" ||
2305 IDVal ==
"_EMIT" || IDVal ==
"__EMIT"))
2306 return parseDirectiveMSEmit(IDLoc, Info, IDVal.
size());
2309 if (ParsingMSInlineAsm && (IDVal ==
"align" || IDVal ==
"ALIGN"))
2310 return parseDirectiveMSAlign(IDLoc, Info);
2312 if (ParsingMSInlineAsm && (IDVal ==
"even" || IDVal ==
"EVEN"))
2314 if (checkForValidSection())
2317 return parseAndMatchAndEmitTargetInstruction(Info, IDVal,
ID, IDLoc);
2320bool AsmParser::parseAndMatchAndEmitTargetInstruction(ParseStatementInfo &Info,
2325 std::string OpcodeStr = IDVal.
lower();
2327 bool ParseHadError = getTargetParser().parseInstruction(IInfo, OpcodeStr,
ID,
2328 Info.ParsedOperands);
2329 Info.ParseError = ParseHadError;
2332 if (getShowParsedOperands()) {
2335 OS <<
"parsed instruction: [";
2336 for (
unsigned i = 0; i !=
Info.ParsedOperands.size(); ++i) {
2339 Info.ParsedOperands[i]->print(
OS);
2347 if (hasPendingError() || ParseHadError)
2352 if (!ParseHadError && enabledGenDwarfForAssembly() &&
2353 getContext().getGenDwarfSectionSyms().
count(
2354 getStreamer().getCurrentSectionOnly())) {
2356 if (ActiveMacros.empty())
2360 ActiveMacros.front()->ExitBuffer);
2365 if (!CppHashInfo.Filename.empty()) {
2366 unsigned FileNumber = getStreamer().emitDwarfFileDirective(
2368 getContext().setGenDwarfFileNumber(FileNumber);
2370 unsigned CppHashLocLineNo =
2372 Line = CppHashInfo.LineNumber - 1 + (
Line - CppHashLocLineNo);
2375 getStreamer().emitDwarfLocDirective(
2376 getContext().getGenDwarfFileNumber(), Line, 0,
2382 if (!ParseHadError) {
2384 if (getTargetParser().matchAndEmitInstruction(
2386 getTargetParser().isParsingMSInlineAsm()))
2412bool AsmParser::parseCppHashLineFilenameComment(
SMLoc L,
bool SaveLocInfo) {
2417 "Lexing Cpp line comment: Expected Integer");
2418 int64_t LineNumber = getTok().getIntVal();
2421 "Lexing Cpp line comment: Expected String");
2433 CppHashInfo.Loc =
L;
2435 CppHashInfo.LineNumber = LineNumber;
2436 CppHashInfo.Buf = CurBuffer;
2437 if (!HadCppHashFilename) {
2438 HadCppHashFilename =
true;
2442 if (getContext().getGenDwarfForAssembly() &&
2443 getContext().getGenDwarfFileNumber() == 0) {
2446 getContext().setMCLineTableRootFile(
2447 0, getContext().getCompilationDir(), Filename,
2448 std::nullopt, std::nullopt);
2456void AsmParser::DiagHandler(
const SMDiagnostic &Diag,
void *Context) {
2457 auto *Parser =
static_cast<AsmParser *
>(Context);
2463 unsigned CppHashBuf =
2464 Parser->SrcMgr.FindBufferContainingLoc(Parser->CppHashInfo.Loc);
2469 if (!Parser->SavedDiagHandler && DiagCurBuffer &&
2478 if (!Parser->CppHashInfo.LineNumber || DiagBuf != CppHashBuf) {
2479 if (Parser->SavedDiagHandler)
2480 Parser->SavedDiagHandler(Diag, Parser->SavedDiagContext);
2482 Parser->getContext().diagnose(Diag);
2489 const std::string &
Filename = std::string(Parser->CppHashInfo.Filename);
2492 int CppHashLocLineNo =
2493 Parser->SrcMgr.FindLineNumber(Parser->CppHashInfo.Loc, CppHashBuf);
2495 Parser->CppHashInfo.LineNumber - 1 + (DiagLocLineNo - CppHashLocLineNo);
2501 if (Parser->SavedDiagHandler)
2502 Parser->SavedDiagHandler(Diag, Parser->SavedDiagContext);
2504 Parser->getContext().diagnose(NewDiag);
2512 return isalnum(
static_cast<unsigned char>(c)) || c ==
'_' || c ==
'$' ||
2519 bool EnableAtPseudoVariable) {
2521 auto expandArg = [&](
unsigned Index) {
2522 bool HasVararg = NParameters ?
Parameters.back().Vararg :
false;
2523 bool VarargParameter = HasVararg &&
Index == (NParameters - 1);
2532 if (AltMacroMode && Token.getString().front() ==
'%' &&
2535 OS << Token.getIntVal();
2538 else if (AltMacroMode && Token.getString().front() ==
'<' &&
2545 OS << Token.getString();
2547 OS << Token.getStringContents();
2555 if (Body[
I] ==
'\\' &&
I + 1 !=
End) {
2557 if (EnableAtPseudoVariable && Body[
I + 1] ==
'@') {
2558 OS << NumOfMacroInstantiations;
2562 if (Body[
I + 1] ==
'+') {
2567 if (Body[
I + 1] ==
'(' && Body[
I + 2] ==
')') {
2576 if (AltMacroMode &&
I !=
End && Body[
I] ==
'&')
2582 if (Index == NParameters)
2591 if (Body[
I] ==
'$' &&
I + 1 !=
End && IsDarwin && !NParameters) {
2593 switch (Body[
I + 1]) {
2609 unsigned Index = Body[
I + 1] -
'0';
2610 if (Index <
A.size())
2612 OS << Token.getString();
2624 const size_t Start =
I;
2631 if (Parameters[Index].
Name == Token)
2633 if (Index != NParameters) {
2635 if (
I !=
End && Body[
I] ==
'&')
2679class AsmLexerSkipSpaceRAII {
2681 AsmLexerSkipSpaceRAII(
AsmLexer &Lexer,
bool SkipSpace) : Lexer(Lexer) {
2685 ~AsmLexerSkipSpaceRAII() {
2695bool AsmParser::parseMacroArgument(MCAsmMacroArgument &MA,
bool Vararg) {
2699 StringRef Str = parseStringToEndOfStatement();
2705 unsigned ParenLevel = 0;
2708 AsmLexerSkipSpaceRAII ScopedSkipSpace(Lexer, IsDarwin);
2715 return TokError(
"unexpected token in macro instantiation");
2717 if (ParenLevel == 0) {
2730 MA.push_back(getTok());
2754 MA.push_back(getTok());
2758 if (ParenLevel != 0)
2759 return TokError(
"unbalanced parentheses in macro argument");
2764bool AsmParser::parseMacroArguments(
const MCAsmMacro *M,
2765 MCAsmMacroArguments &
A) {
2766 const unsigned NParameters =
M ?
M->Parameters.size() : 0;
2767 bool NamedParametersFound =
false;
2770 A.resize(NParameters);
2771 FALocs.
resize(NParameters);
2776 bool HasVararg = NParameters ?
M->Parameters.back().Vararg :
false;
2777 for (
unsigned Parameter = 0; !NParameters || Parameter < NParameters;
2783 if (parseIdentifier(FA.
Name))
2784 return Error(IDLoc,
"invalid argument identifier for formal argument");
2787 return TokError(
"expected '=' after formal parameter identifier");
2791 NamedParametersFound =
true;
2793 bool Vararg = HasVararg && Parameter == (NParameters - 1);
2795 if (NamedParametersFound && FA.
Name.
empty())
2796 return Error(IDLoc,
"cannot mix positional and keyword arguments");
2801 const MCExpr *AbsoluteExp;
2805 if (parseExpression(AbsoluteExp, EndLoc))
2807 if (!AbsoluteExp->evaluateAsAbsolute(
Value,
2808 getStreamer().getAssemblerPtr()))
2809 return Error(StrLoc,
"expected absolute expression");
2814 FA.
Value.push_back(newToken);
2819 jumpToLoc(EndLoc, CurBuffer);
2824 FA.
Value.push_back(newToken);
2825 }
else if(parseMacroArgument(FA.
Value, Vararg))
2828 unsigned PI = Parameter;
2831 for (FAI = 0; FAI < NParameters; ++FAI)
2832 if (
M->Parameters[FAI].Name == FA.
Name)
2835 if (FAI >= NParameters) {
2836 assert(M &&
"expected macro to be defined");
2837 return Error(IDLoc,
"parameter named '" + FA.
Name +
2838 "' does not exist for macro '" +
M->Name +
"'");
2843 if (!FA.
Value.empty()) {
2848 if (FALocs.
size() <= PI)
2851 FALocs[PI] = Lexer.
getLoc();
2859 for (
unsigned FAI = 0; FAI < NParameters; ++FAI) {
2860 if (
A[FAI].empty()) {
2861 if (
M->Parameters[FAI].Required) {
2863 "missing value for required parameter "
2864 "'" +
M->Parameters[FAI].Name +
"' in macro '" +
M->Name +
"'");
2868 if (!
M->Parameters[FAI].Value.empty())
2869 A[FAI] =
M->Parameters[FAI].Value;
2878 return TokError(
"too many positional arguments");
2885 if (ActiveMacros.size() == MaxNestingDepth) {
2886 std::ostringstream MaxNestingDepthError;
2887 MaxNestingDepthError <<
"macros cannot be nested more than "
2888 << MaxNestingDepth <<
" levels deep."
2889 <<
" Use -asm-macro-max-nesting-depth to increase "
2891 return TokError(MaxNestingDepthError.str());
2894 MCAsmMacroArguments
A;
2895 if (parseMacroArguments(M,
A))
2903 if ((!IsDarwin ||
M->Parameters.size()) &&
M->Parameters.size() !=
A.size())
2904 return Error(getTok().getLoc(),
"Wrong number of arguments");
2905 if (expandMacro(
OS, *M,
M->Parameters,
A,
true))
2910 OS <<
".endmacro\n";
2912 std::unique_ptr<MemoryBuffer> Instantiation =
2917 MacroInstantiation *
MI =
new MacroInstantiation{
2918 NameLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()};
2919 ActiveMacros.push_back(
MI);
2921 ++NumOfMacroInstantiations;
2931void AsmParser::handleMacroExit() {
2933 jumpToLoc(ActiveMacros.back()->ExitLoc, ActiveMacros.back()->ExitBuffer);
2941 delete ActiveMacros.back();
2942 ActiveMacros.pop_back();
2945bool AsmParser::parseAssignment(
StringRef Name, AssignmentKind Kind) {
2948 SMLoc ExprLoc = getTok().getLoc();
2950 Kind == AssignmentKind::Set ||
Kind == AssignmentKind::Equal;
2962 if (discardLTOSymbol(
Name))
2967 case AssignmentKind::Equal:
2970 case AssignmentKind::Set:
2971 case AssignmentKind::Equiv:
2975 case AssignmentKind::LTOSetConditional:
2977 return Error(ExprLoc,
"expected identifier");
2989bool AsmParser::parseIdentifier(
StringRef &Res) {
2996 SMLoc PrefixLoc = getLexer().getLoc();
3008 if (PrefixLoc.
getPointer() + 1 != Buf[0].getLoc().getPointer())
3022 Res = getTok().getIdentifier();
3034bool AsmParser::parseDirectiveSet(
StringRef IDVal, AssignmentKind Kind) {
3036 if (check(parseIdentifier(
Name),
"expected identifier") || parseComma() ||
3037 parseAssignment(
Name, Kind))
3042bool AsmParser::parseEscapedString(std::string &Data) {
3047 StringRef Str = getTok().getStringContents();
3048 for (
unsigned i = 0, e = Str.size(); i != e; ++i) {
3049 if (Str[i] !=
'\\') {
3050 if ((Str[i] ==
'\n') || (Str[i] ==
'\r')) {
3052 if ((Str[i] ==
'\n') && (i > 0) && (Str[i - 1] ==
'\r'))
3056 if (
Warning(NewlineLoc,
"unterminated string; newline inserted"))
3067 return TokError(
"unexpected backslash at end of string");
3070 if (Str[i] ==
'x' || Str[i] ==
'X') {
3071 size_t length = Str.size();
3072 if (i + 1 >= length || !
isHexDigit(Str[i + 1]))
3073 return TokError(
"invalid hexadecimal escape sequence");
3078 while (i + 1 < length &&
isHexDigit(Str[i + 1]))
3079 Value =
Value * 16 + hexDigitValue(Str[++i]);
3086 if ((
unsigned)(Str[i] -
'0') <= 7) {
3088 unsigned Value = Str[i] -
'0';
3090 if (i + 1 != e && ((
unsigned)(Str[i + 1] -
'0')) <= 7) {
3094 if (i + 1 != e && ((
unsigned)(Str[i + 1] -
'0')) <= 7) {
3101 return TokError(
"invalid octal escape sequence (out of range)");
3111 return TokError(
"invalid escape sequence (unrecognized character)");
3113 case 'b': Data +=
'\b';
break;
3114 case 'f': Data +=
'\f';
break;
3115 case 'n': Data +=
'\n';
break;
3116 case 'r': Data +=
'\r';
break;
3117 case 't': Data +=
'\t';
break;
3118 case '"': Data +=
'"';
break;
3119 case '\\': Data +=
'\\';
break;
3127bool AsmParser::parseAngleBracketString(std::string &Data) {
3128 SMLoc EndLoc, StartLoc = getTok().getLoc();
3130 const char *StartChar = StartLoc.
getPointer() + 1;
3131 const char *EndChar = EndLoc.
getPointer() - 1;
3132 jumpToLoc(EndLoc, CurBuffer);
3145bool AsmParser::parseDirectiveAscii(
StringRef IDVal,
bool ZeroTerminated) {
3146 auto parseOp = [&]() ->
bool {
3148 if (checkForValidSection())
3153 if (parseEscapedString(Data))
3155 getStreamer().emitBytes(Data);
3158 getStreamer().emitBytes(
StringRef(
"\0", 1));
3162 return parseMany(parseOp);
3167bool AsmParser::parseDirectiveReloc(
SMLoc DirectiveLoc) {
3169 const MCExpr *Expr =
nullptr;
3172 if (parseExpression(
Offset))
3185 if (parseExpression(Expr))
3190 return Error(ExprLoc,
"expression must be relocatable");
3198 if (std::optional<std::pair<bool, std::string>> Err =
3199 getStreamer().emitRelocDirective(*
Offset,
Name, Expr, DirectiveLoc,
3201 return Error(Err->first ? NameLoc : OffsetLoc, Err->second);
3208bool AsmParser::parseDirectiveValue(
StringRef IDVal,
unsigned Size) {
3209 auto parseOp = [&]() ->
bool {
3211 SMLoc ExprLoc = getLexer().getLoc();
3212 if (checkForValidSection() || parseExpression(
Value))
3217 uint64_t IntValue = MCE->getValue();
3219 return Error(ExprLoc,
"out of range literal value");
3220 getStreamer().emitIntValue(IntValue,
Size);
3222 getStreamer().emitValue(
Value,
Size, ExprLoc);
3226 return parseMany(parseOp);
3232 return Asm.TokError(
"unknown token in expression");
3233 SMLoc ExprLoc = Asm.getTok().getLoc();
3234 APInt IntValue = Asm.getTok().getAPIntVal();
3236 if (!IntValue.
isIntN(128))
3237 return Asm.Error(ExprLoc,
"out of range literal value");
3238 if (!IntValue.
isIntN(64)) {
3251bool AsmParser::parseDirectiveOctaValue(
StringRef IDVal) {
3252 auto parseOp = [&]() ->
bool {
3253 if (checkForValidSection())
3259 getStreamer().emitInt64(lo);
3260 getStreamer().emitInt64(hi);
3262 getStreamer().emitInt64(hi);
3263 getStreamer().emitInt64(lo);
3268 return parseMany(parseOp);
3282 return TokError(Lexer.
getErr());
3285 return TokError(
"unexpected token in directive");
3297 return TokError(
"invalid floating point literal");
3299 Value.convertFromString(IDVal, APFloat::rmNearestTiesToEven)
3301 return TokError(
"invalid floating point literal");
3308 Res =
Value.bitcastToAPInt();
3315bool AsmParser::parseDirectiveRealValue(
StringRef IDVal,
3317 auto parseOp = [&]() ->
bool {
3319 if (checkForValidSection() || parseRealValue(Semantics, AsInt))
3326 return parseMany(parseOp);
3331bool AsmParser::parseDirectiveZero() {
3334 if (checkForValidSection() || parseExpression(NumBytes))
3340 if (parseAbsoluteExpression(Val))
3346 getStreamer().emitFill(*NumBytes, Val, NumBytesLoc);
3353bool AsmParser::parseDirectiveFill() {
3356 if (checkForValidSection() || parseExpression(NumValues))
3359 int64_t FillSize = 1;
3360 int64_t FillExpr = 0;
3362 SMLoc SizeLoc, ExprLoc;
3365 SizeLoc = getTok().getLoc();
3366 if (parseAbsoluteExpression(FillSize))
3369 ExprLoc = getTok().getLoc();
3370 if (parseAbsoluteExpression(FillExpr))
3378 Warning(SizeLoc,
"'.fill' directive with negative size has no effect");
3382 Warning(SizeLoc,
"'.fill' directive with size greater than 8 has been truncated to 8");
3386 if (!isUInt<32>(FillExpr) && FillSize > 4)
3387 Warning(ExprLoc,
"'.fill' directive pattern has been truncated to 32-bits");
3389 getStreamer().emitFill(*NumValues, FillSize, FillExpr, NumValuesLoc);
3396bool AsmParser::parseDirectiveOrg() {
3399 if (checkForValidSection() || parseExpression(
Offset))
3403 int64_t FillExpr = 0;
3405 if (parseAbsoluteExpression(FillExpr))
3410 getStreamer().emitValueToOffset(
Offset, FillExpr, OffsetLoc);
3416bool AsmParser::parseDirectiveAlign(
bool IsPow2,
unsigned ValueSize) {
3417 SMLoc AlignmentLoc = getLexer().getLoc();
3420 bool HasFillExpr =
false;
3421 int64_t FillExpr = 0;
3422 int64_t MaxBytesToFill = 0;
3425 auto parseAlign = [&]() ->
bool {
3426 if (parseAbsoluteExpression(Alignment))
3434 if (parseTokenLoc(FillExprLoc) || parseAbsoluteExpression(FillExpr))
3438 if (parseTokenLoc(MaxBytesLoc) ||
3439 parseAbsoluteExpression(MaxBytesToFill))
3445 if (checkForValidSection())
3449 Warning(AlignmentLoc,
"p2align directive with no operand(s) is ignored");
3456 bool ReturnVal =
false;
3461 if (Alignment >= 32) {
3462 ReturnVal |=
Error(AlignmentLoc,
"invalid alignment value");
3466 Alignment = 1ULL << Alignment;
3474 ReturnVal |=
Error(AlignmentLoc,
"alignment must be a power of 2");
3475 Alignment = llvm::bit_floor<uint64_t>(Alignment);
3477 if (!isUInt<32>(Alignment)) {
3478 ReturnVal |=
Error(AlignmentLoc,
"alignment must be smaller than 2**32");
3479 Alignment = 1u << 31;
3485 if (MaxBytesToFill < 1) {
3486 ReturnVal |=
Error(MaxBytesLoc,
3487 "alignment directive can never be satisfied in this "
3488 "many bytes, ignoring maximum bytes expression");
3492 if (MaxBytesToFill >= Alignment) {
3493 Warning(MaxBytesLoc,
"maximum bytes expression exceeds alignment and "
3500 assert(Section &&
"must have section to emit alignment");
3502 if (HasFillExpr && FillExpr != 0 &&
Section->isVirtualSection()) {
3504 Warning(FillExprLoc,
"ignoring non-zero fill value in " +
3505 Section->getVirtualSectionKind() +
3506 " section '" +
Section->getName() +
"'");
3512 if (
Section->useCodeAlign() && !HasFillExpr) {
3513 getStreamer().emitCodeAlignment(
3514 Align(Alignment), &getTargetParser().getSTI(), MaxBytesToFill);
3517 getStreamer().emitValueToAlignment(
Align(Alignment), FillExpr, ValueSize,
3527bool AsmParser::parseDirectiveFile(
SMLoc DirectiveLoc) {
3529 int64_t FileNumber = -1;
3531 FileNumber = getTok().getIntVal();
3535 return TokError(
"negative file number");
3542 if (parseEscapedString(Path))
3547 std::string FilenameData;
3549 if (check(FileNumber == -1,
3550 "explicit path specified, but no file number") ||
3551 parseEscapedString(FilenameData))
3560 bool HasMD5 =
false;
3562 std::optional<StringRef>
Source;
3563 bool HasSource =
false;
3564 std::string SourceString;
3569 "unexpected token in '.file' directive") ||
3570 parseIdentifier(Keyword))
3572 if (Keyword ==
"md5") {
3574 if (check(FileNumber == -1,
3575 "MD5 checksum specified, but no file number") ||
3578 }
else if (Keyword ==
"source") {
3580 if (check(FileNumber == -1,
3581 "source specified, but no file number") ||
3583 "unexpected token in '.file' directive") ||
3584 parseEscapedString(SourceString))
3587 return TokError(
"unexpected token in '.file' directive");
3591 if (FileNumber == -1) {
3595 if (getContext().getAsmInfo()->hasSingleParameterDotFile())
3596 getStreamer().emitFileDirective(Filename);
3606 std::optional<MD5::MD5Result> CKMem;
3609 for (
unsigned i = 0; i != 8; ++i) {
3610 Sum[i] =
uint8_t(MD5Hi >> ((7 - i) * 8));
3611 Sum[i + 8] =
uint8_t(MD5Lo >> ((7 - i) * 8));
3616 char *SourceBuf =
static_cast<char *
>(Ctx.
allocate(SourceString.size()));
3617 memcpy(SourceBuf, SourceString.data(), SourceString.size());
3620 if (FileNumber == 0) {
3624 getStreamer().emitDwarfFile0Directive(Directory, Filename, CKMem, Source);
3627 FileNumber, Directory, Filename, CKMem, Source);
3634 ReportedInconsistentMD5 =
true;
3635 return Warning(DirectiveLoc,
"inconsistent use of MD5 checksums");
3644bool AsmParser::parseDirectiveLine() {
3647 if (parseIntToken(LineNumber,
"unexpected token in '.line' directive"))
3662bool AsmParser::parseDirectiveLoc() {
3663 int64_t FileNumber = 0, LineNumber = 0;
3664 SMLoc Loc = getTok().getLoc();
3665 if (parseIntToken(FileNumber,
"unexpected token in '.loc' directive") ||
3667 "file number less than one in '.loc' directive") ||
3668 check(!getContext().isValidDwarfFileNumber(FileNumber), Loc,
3669 "unassigned file number in '.loc' directive"))
3674 LineNumber = getTok().getIntVal();
3676 return TokError(
"line number less than zero in '.loc' directive");
3680 int64_t ColumnPos = 0;
3682 ColumnPos = getTok().getIntVal();
3684 return TokError(
"column position less than zero in '.loc' directive");
3688 auto PrevFlags = getContext().getCurrentDwarfLoc().getFlags();
3693 auto parseLocOp = [&]() ->
bool {
3695 SMLoc Loc = getTok().getLoc();
3696 if (parseIdentifier(
Name))
3697 return TokError(
"unexpected token in '.loc' directive");
3699 if (
Name ==
"basic_block")
3701 else if (
Name ==
"prologue_end")
3703 else if (
Name ==
"epilogue_begin")
3705 else if (
Name ==
"is_stmt") {
3706 Loc = getTok().getLoc();
3708 if (parseExpression(
Value))
3712 int Value = MCE->getValue();
3714 Flags &= ~DWARF2_FLAG_IS_STMT;
3715 else if (
Value == 1)
3718 return Error(Loc,
"is_stmt value not 0 or 1");
3720 return Error(Loc,
"is_stmt value not the constant value of 0 or 1");
3722 }
else if (
Name ==
"isa") {
3723 Loc = getTok().getLoc();
3725 if (parseExpression(
Value))
3729 int Value = MCE->getValue();
3731 return Error(Loc,
"isa number less than zero");
3734 return Error(Loc,
"isa number not a constant value");
3736 }
else if (
Name ==
"discriminator") {
3737 if (parseAbsoluteExpression(Discriminator))
3740 return Error(Loc,
"unknown sub-directive in '.loc' directive");
3745 if (parseMany(parseLocOp,
false ))
3748 getStreamer().emitDwarfLocDirective(FileNumber, LineNumber, ColumnPos, Flags,
3756bool AsmParser::parseDirectiveLocLabel(
SMLoc DirectiveLoc) {
3758 DirectiveLoc = Lexer.
getLoc();
3759 if (parseIdentifier(
Name))
3760 return TokError(
"expected identifier");
3763 getStreamer().emitDwarfLocLabelDirective(DirectiveLoc,
Name);
3769bool AsmParser::parseDirectiveStabs() {
3770 return TokError(
"unsupported directive '.stabs'");
3775bool AsmParser::parseDirectiveCVFile() {
3776 SMLoc FileNumberLoc = getTok().getLoc();
3779 std::string Checksum;
3782 if (parseIntToken(FileNumber,
3783 "expected file number in '.cv_file' directive") ||
3784 check(FileNumber < 1, FileNumberLoc,
"file number less than one") ||
3786 "unexpected token in '.cv_file' directive") ||
3787 parseEscapedString(Filename))
3791 "unexpected token in '.cv_file' directive") ||
3792 parseEscapedString(Checksum) ||
3793 parseIntToken(ChecksumKind,
3794 "expected checksum kind in '.cv_file' directive") ||
3799 Checksum = fromHex(Checksum);
3800 void *CKMem = Ctx.
allocate(Checksum.size(), 1);
3801 memcpy(CKMem, Checksum.data(), Checksum.size());
3805 if (!getStreamer().emitCVFileDirective(FileNumber, Filename, ChecksumAsBytes,
3806 static_cast<uint8_t>(ChecksumKind)))
3807 return Error(FileNumberLoc,
"file number already allocated");
3812bool AsmParser::parseCVFunctionId(int64_t &
FunctionId,
3815 return parseTokenLoc(Loc) ||
3816 parseIntToken(
FunctionId,
"expected function id in '" + DirectiveName +
3818 check(FunctionId < 0 || FunctionId >= UINT_MAX, Loc,
3819 "expected function id within range [0, UINT_MAX)");
3822bool AsmParser::parseCVFileId(int64_t &FileNumber,
StringRef DirectiveName) {
3824 return parseTokenLoc(Loc) ||
3825 parseIntToken(FileNumber,
"expected integer in '" + DirectiveName +
3827 check(FileNumber < 1, Loc,
"file number less than one in '" +
3828 DirectiveName +
"' directive") ||
3829 check(!getCVContext().isValidFileNumber(FileNumber), Loc,
3830 "unassigned file number in '" + DirectiveName +
"' directive");
3837bool AsmParser::parseDirectiveCVFuncId() {
3838 SMLoc FunctionIdLoc = getTok().getLoc();
3841 if (parseCVFunctionId(
FunctionId,
".cv_func_id") || parseEOL())
3844 if (!getStreamer().emitCVFuncIdDirective(
FunctionId))
3845 return Error(FunctionIdLoc,
"function id already allocated");
3858bool AsmParser::parseDirectiveCVInlineSiteId() {
3859 SMLoc FunctionIdLoc = getTok().getLoc();
3867 if (parseCVFunctionId(
FunctionId,
".cv_inline_site_id"))
3872 getTok().getIdentifier() !=
"within"),
3873 "expected 'within' identifier in '.cv_inline_site_id' directive"))
3878 if (parseCVFunctionId(IAFunc,
".cv_inline_site_id"))
3883 getTok().getIdentifier() !=
"inlined_at"),
3884 "expected 'inlined_at' identifier in '.cv_inline_site_id' "
3890 if (parseCVFileId(IAFile,
".cv_inline_site_id") ||
3891 parseIntToken(IALine,
"expected line number after 'inlined_at'"))
3896 IACol = getTok().getIntVal();
3903 if (!getStreamer().emitCVInlineSiteIdDirective(
FunctionId, IAFunc, IAFile,
3904 IALine, IACol, FunctionIdLoc))
3905 return Error(FunctionIdLoc,
"function id already allocated");
3917bool AsmParser::parseDirectiveCVLoc() {
3918 SMLoc DirectiveLoc = getTok().getLoc();
3920 if (parseCVFunctionId(
FunctionId,
".cv_loc") ||
3921 parseCVFileId(FileNumber,
".cv_loc"))
3924 int64_t LineNumber = 0;
3926 LineNumber = getTok().getIntVal();
3928 return TokError(
"line number less than zero in '.cv_loc' directive");
3932 int64_t ColumnPos = 0;
3934 ColumnPos = getTok().getIntVal();
3936 return TokError(
"column position less than zero in '.cv_loc' directive");
3940 bool PrologueEnd =
false;
3943 auto parseOp = [&]() ->
bool {
3945 SMLoc Loc = getTok().getLoc();
3946 if (parseIdentifier(
Name))
3947 return TokError(
"unexpected token in '.cv_loc' directive");
3948 if (
Name ==
"prologue_end")
3950 else if (
Name ==
"is_stmt") {
3951 Loc = getTok().getLoc();
3953 if (parseExpression(
Value))
3957 if (
const auto *MCE = dyn_cast<MCConstantExpr>(
Value))
3958 IsStmt = MCE->getValue();
3961 return Error(Loc,
"is_stmt value not 0 or 1");
3963 return Error(Loc,
"unknown sub-directive in '.cv_loc' directive");
3968 if (parseMany(parseOp,
false ))
3971 getStreamer().emitCVLocDirective(
FunctionId, FileNumber, LineNumber,
3972 ColumnPos, PrologueEnd, IsStmt,
StringRef(),
3979bool AsmParser::parseDirectiveCVLinetable() {
3982 SMLoc Loc = getTok().getLoc();
3983 if (parseCVFunctionId(
FunctionId,
".cv_linetable") || parseComma() ||
3984 parseTokenLoc(Loc) ||
3985 check(parseIdentifier(FnStartName), Loc,
3986 "expected identifier in directive") ||
3987 parseComma() || parseTokenLoc(Loc) ||
3988 check(parseIdentifier(FnEndName), Loc,
3989 "expected identifier in directive"))
3992 MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
3993 MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
3995 getStreamer().emitCVLinetableDirective(
FunctionId, FnStartSym, FnEndSym);
4001bool AsmParser::parseDirectiveCVInlineLinetable() {
4002 int64_t PrimaryFunctionId, SourceFileId, SourceLineNum;
4004 SMLoc Loc = getTok().getLoc();
4005 if (parseCVFunctionId(PrimaryFunctionId,
".cv_inline_linetable") ||
4006 parseTokenLoc(Loc) ||
4009 "expected SourceField in '.cv_inline_linetable' directive") ||
4010 check(SourceFileId <= 0, Loc,
4011 "File id less than zero in '.cv_inline_linetable' directive") ||
4012 parseTokenLoc(Loc) ||
4015 "expected SourceLineNum in '.cv_inline_linetable' directive") ||
4016 check(SourceLineNum < 0, Loc,
4017 "Line number less than zero in '.cv_inline_linetable' directive") ||
4018 parseTokenLoc(Loc) || check(parseIdentifier(FnStartName), Loc,
4019 "expected identifier in directive") ||
4020 parseTokenLoc(Loc) || check(parseIdentifier(FnEndName), Loc,
4021 "expected identifier in directive"))
4027 MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
4028 MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
4029 getStreamer().emitCVInlineLinetableDirective(PrimaryFunctionId, SourceFileId,
4030 SourceLineNum, FnStartSym,
4035void AsmParser::initializeCVDefRangeTypeMap() {
4036 CVDefRangeTypeMap[
"reg"] = CVDR_DEFRANGE_REGISTER;
4037 CVDefRangeTypeMap[
"frame_ptr_rel"] = CVDR_DEFRANGE_FRAMEPOINTER_REL;
4038 CVDefRangeTypeMap[
"subfield_reg"] = CVDR_DEFRANGE_SUBFIELD_REGISTER;
4039 CVDefRangeTypeMap[
"reg_rel"] = CVDR_DEFRANGE_REGISTER_REL;
4044bool AsmParser::parseDirectiveCVDefRange() {
4046 std::vector<std::pair<const MCSymbol *, const MCSymbol *>>
Ranges;
4048 Loc = getLexer().getLoc();
4050 if (parseIdentifier(GapStartName))
4051 return Error(Loc,
"expected identifier in directive");
4052 MCSymbol *GapStartSym = getContext().getOrCreateSymbol(GapStartName);
4054 Loc = getLexer().getLoc();
4056 if (parseIdentifier(GapEndName))
4057 return Error(Loc,
"expected identifier in directive");
4058 MCSymbol *GapEndSym = getContext().getOrCreateSymbol(GapEndName);
4060 Ranges.push_back({GapStartSym, GapEndSym});
4066 "expected comma before def_range type in .cv_def_range directive") ||
4067 parseIdentifier(CVDefRangeTypeStr))
4068 return Error(Loc,
"expected def_range type in directive");
4071 CVDefRangeTypeMap.find(CVDefRangeTypeStr);
4072 CVDefRangeType CVDRType = (CVTypeIt == CVDefRangeTypeMap.end())
4074 : CVTypeIt->getValue();
4076 case CVDR_DEFRANGE_REGISTER: {
4078 if (parseToken(
AsmToken::Comma,
"expected comma before register number in "
4079 ".cv_def_range directive") ||
4080 parseAbsoluteExpression(DRRegister))
4081 return Error(Loc,
"expected register number");
4086 getStreamer().emitCVDefRangeDirective(Ranges, DRHdr);
4089 case CVDR_DEFRANGE_FRAMEPOINTER_REL: {
4092 "expected comma before offset in .cv_def_range directive") ||
4093 parseAbsoluteExpression(DROffset))
4094 return Error(Loc,
"expected offset value");
4098 getStreamer().emitCVDefRangeDirective(Ranges, DRHdr);
4101 case CVDR_DEFRANGE_SUBFIELD_REGISTER: {
4103 int64_t DROffsetInParent;
4104 if (parseToken(
AsmToken::Comma,
"expected comma before register number in "
4105 ".cv_def_range directive") ||
4106 parseAbsoluteExpression(DRRegister))
4107 return Error(Loc,
"expected register number");
4109 "expected comma before offset in .cv_def_range directive") ||
4110 parseAbsoluteExpression(DROffsetInParent))
4111 return Error(Loc,
"expected offset value");
4117 getStreamer().emitCVDefRangeDirective(Ranges, DRHdr);
4120 case CVDR_DEFRANGE_REGISTER_REL: {
4123 int64_t DRBasePointerOffset;
4124 if (parseToken(
AsmToken::Comma,
"expected comma before register number in "
4125 ".cv_def_range directive") ||
4126 parseAbsoluteExpression(DRRegister))
4127 return Error(Loc,
"expected register value");
4130 "expected comma before flag value in .cv_def_range directive") ||
4131 parseAbsoluteExpression(DRFlags))
4132 return Error(Loc,
"expected flag value");
4133 if (parseToken(
AsmToken::Comma,
"expected comma before base pointer offset "
4134 "in .cv_def_range directive") ||
4135 parseAbsoluteExpression(DRBasePointerOffset))
4136 return Error(Loc,
"expected base pointer offset value");
4140 DRHdr.
Flags = DRFlags;
4142 getStreamer().emitCVDefRangeDirective(Ranges, DRHdr);
4146 return Error(Loc,
"unexpected def_range type in .cv_def_range directive");
4153bool AsmParser::parseDirectiveCVString() {
4155 if (checkForValidSection() || parseEscapedString(Data))
4159 std::pair<StringRef, unsigned> Insertion =
4160 getCVContext().addToStringTable(Data);
4161 getStreamer().emitInt32(Insertion.second);
4167bool AsmParser::parseDirectiveCVStringTable() {
4168 getStreamer().emitCVStringTableDirective();
4174bool AsmParser::parseDirectiveCVFileChecksums() {
4175 getStreamer().emitCVFileChecksumsDirective();
4181bool AsmParser::parseDirectiveCVFileChecksumOffset() {
4183 if (parseIntToken(FileNo,
"expected identifier in directive"))
4187 getStreamer().emitCVFileChecksumOffsetDirective(FileNo);
4193bool AsmParser::parseDirectiveCVFPOData() {
4194 SMLoc DirLoc = getLexer().getLoc();
4196 if (parseIdentifier(ProcName))
4197 return TokError(
"expected symbol name");
4200 MCSymbol *ProcSym = getContext().getOrCreateSymbol(ProcName);
4201 getStreamer().emitCVFPOData(ProcSym, DirLoc);
4207bool AsmParser::parseDirectiveCFISections() {
4214 if (parseIdentifier(
Name))
4215 return TokError(
"expected .eh_frame or .debug_frame");
4216 if (
Name ==
".eh_frame")
4218 else if (
Name ==
".debug_frame")
4226 getStreamer().emitCFISections(EH,
Debug);
4232bool AsmParser::parseDirectiveCFIStartProc() {
4233 CFIStartProcLoc = StartTokLoc;
4237 if (check(parseIdentifier(
Simple) ||
Simple !=
"simple",
4238 "unexpected token") ||
4248 getStreamer().emitCFIStartProc(!
Simple.empty(), Lexer.
getLoc());
4254bool AsmParser::parseDirectiveCFIEndProc() {
4255 CFIStartProcLoc = std::nullopt;
4260 getStreamer().emitCFIEndProc();
4265bool AsmParser::parseRegisterOrRegisterNumber(int64_t &
Register,
4266 SMLoc DirectiveLoc) {
4270 if (getTargetParser().parseRegister(RegNo, DirectiveLoc, DirectiveLoc))
4272 Register = getContext().getRegisterInfo()->getDwarfRegNum(RegNo,
true);
4274 return parseAbsoluteExpression(
Register);
4281bool AsmParser::parseDirectiveCFIDefCfa(
SMLoc DirectiveLoc) {
4283 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseComma() ||
4284 parseAbsoluteExpression(
Offset) || parseEOL())
4293bool AsmParser::parseDirectiveCFIDefCfaOffset(
SMLoc DirectiveLoc) {
4295 if (parseAbsoluteExpression(
Offset) || parseEOL())
4298 getStreamer().emitCFIDefCfaOffset(
Offset, DirectiveLoc);
4304bool AsmParser::parseDirectiveCFIRegister(
SMLoc DirectiveLoc) {
4305 int64_t Register1 = 0, Register2 = 0;
4306 if (parseRegisterOrRegisterNumber(Register1, DirectiveLoc) || parseComma() ||
4307 parseRegisterOrRegisterNumber(Register2, DirectiveLoc) || parseEOL())
4310 getStreamer().emitCFIRegister(Register1, Register2, DirectiveLoc);
4316bool AsmParser::parseDirectiveCFIWindowSave(
SMLoc DirectiveLoc) {
4319 getStreamer().emitCFIWindowSave(DirectiveLoc);
4325bool AsmParser::parseDirectiveCFIAdjustCfaOffset(
SMLoc DirectiveLoc) {
4326 int64_t Adjustment = 0;
4327 if (parseAbsoluteExpression(Adjustment) || parseEOL())
4330 getStreamer().emitCFIAdjustCfaOffset(Adjustment, DirectiveLoc);
4336bool AsmParser::parseDirectiveCFIDefCfaRegister(
SMLoc DirectiveLoc) {
4338 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseEOL())
4341 getStreamer().emitCFIDefCfaRegister(
Register, DirectiveLoc);
4347bool AsmParser::parseDirectiveCFILLVMDefAspaceCfa(
SMLoc DirectiveLoc) {
4349 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseComma() ||
4350 parseAbsoluteExpression(
Offset) || parseComma() ||
4361bool AsmParser::parseDirectiveCFIOffset(
SMLoc DirectiveLoc) {
4365 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseComma() ||
4366 parseAbsoluteExpression(
Offset) || parseEOL())
4375bool AsmParser::parseDirectiveCFIRelOffset(
SMLoc DirectiveLoc) {
4378 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseComma() ||
4379 parseAbsoluteExpression(
Offset) || parseEOL())
4387 if (Encoding & ~0xff)
4393 const unsigned Format = Encoding & 0xf;
4400 const unsigned Application = Encoding & 0x70;
4412bool AsmParser::parseDirectiveCFIPersonalityOrLsda(
bool IsPersonality) {
4413 int64_t Encoding = 0;
4414 if (parseAbsoluteExpression(Encoding))
4422 check(parseIdentifier(
Name),
"expected identifier in directive") ||
4429 getStreamer().emitCFIPersonality(
Sym, Encoding);
4431 getStreamer().emitCFILsda(
Sym, Encoding);
4437bool AsmParser::parseDirectiveCFIRememberState(
SMLoc DirectiveLoc) {
4440 getStreamer().emitCFIRememberState(DirectiveLoc);
4446bool AsmParser::parseDirectiveCFIRestoreState(
SMLoc DirectiveLoc) {
4449 getStreamer().emitCFIRestoreState(DirectiveLoc);
4455bool AsmParser::parseDirectiveCFISameValue(
SMLoc DirectiveLoc) {
4458 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseEOL())
4461 getStreamer().emitCFISameValue(
Register, DirectiveLoc);
4467bool AsmParser::parseDirectiveCFIRestore(
SMLoc DirectiveLoc) {
4469 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseEOL())
4472 getStreamer().emitCFIRestore(
Register, DirectiveLoc);
4478bool AsmParser::parseDirectiveCFIEscape(
SMLoc DirectiveLoc) {
4481 if (parseAbsoluteExpression(CurrValue))
4484 Values.push_back((
uint8_t)CurrValue);
4489 if (parseAbsoluteExpression(CurrValue))
4492 Values.push_back((
uint8_t)CurrValue);
4495 getStreamer().emitCFIEscape(Values, DirectiveLoc);
4501bool AsmParser::parseDirectiveCFIReturnColumn(
SMLoc DirectiveLoc) {
4503 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseEOL())
4505 getStreamer().emitCFIReturnColumn(
Register);
4511bool AsmParser::parseDirectiveCFISignalFrame(
SMLoc DirectiveLoc) {
4515 getStreamer().emitCFISignalFrame();
4521bool AsmParser::parseDirectiveCFIUndefined(
SMLoc DirectiveLoc) {
4524 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseEOL())
4527 getStreamer().emitCFIUndefined(
Register, DirectiveLoc);
4533bool AsmParser::parseDirectiveCFILabel(
SMLoc Loc) {
4536 if (parseIdentifier(
Name))
4537 return TokError(
"expected identifier");
4540 getStreamer().emitCFILabelDirective(Loc,
Name);
4546bool AsmParser::parseDirectiveCFIValOffset(
SMLoc DirectiveLoc) {
4550 if (parseRegisterOrRegisterNumber(
Register, DirectiveLoc) || parseComma() ||
4551 parseAbsoluteExpression(
Offset) || parseEOL())
4564 AltMacroMode = (
Directive ==
".altmacro");
4574 setMacrosEnabled(
Directive ==
".macros_on");
4580bool AsmParser::parseDirectiveMacro(
SMLoc DirectiveLoc) {
4582 if (parseIdentifier(
Name))
4583 return TokError(
"expected identifier in '.macro' directive");
4592 return Error(Lexer.
getLoc(),
"vararg parameter '" +
4594 "' should be the last parameter");
4597 if (parseIdentifier(Parameter.
Name))
4598 return TokError(
"expected identifier in '.macro' directive");
4602 if (CurrParam.Name == Parameter.
Name)
4603 return TokError(
"macro '" +
Name +
"' has multiple parameters"
4604 " named '" + Parameter.
Name +
"'");
4612 QualLoc = Lexer.
getLoc();
4613 if (parseIdentifier(Qualifier))
4614 return Error(QualLoc,
"missing parameter qualifier for "
4615 "'" + Parameter.
Name +
"' in macro '" +
Name +
"'");
4617 if (Qualifier ==
"req")
4619 else if (Qualifier ==
"vararg")
4622 return Error(QualLoc, Qualifier +
" is not a valid parameter qualifier "
4623 "for '" + Parameter.
Name +
"' in macro '" +
Name +
"'");
4631 ParamLoc = Lexer.
getLoc();
4632 if (parseMacroArgument(Parameter.
Value,
false ))
4636 Warning(ParamLoc,
"pointless default value for required parameter "
4637 "'" + Parameter.
Name +
"' in macro '" +
Name +
"'");
4650 AsmToken EndToken, StartToken = getTok();
4651 unsigned MacroDepth = 0;
4661 return Error(DirectiveLoc,
"no matching '.endmacro' in definition");
4666 if (getTok().getIdentifier() ==
".endm" ||
4667 getTok().getIdentifier() ==
".endmacro") {
4668 if (MacroDepth == 0) {
4669 EndToken = getTok();
4672 return TokError(
"unexpected token in '" + EndToken.
getIdentifier() +
4679 }
else if (getTok().getIdentifier() ==
".macro") {
4685 (void)parseCppHashLineFilenameComment(getLexer().getLoc());
4689 eatToEndOfStatement();
4692 if (getContext().lookupMacro(
Name)) {
4693 return Error(DirectiveLoc,
"macro '" +
Name +
"' is already defined");
4699 checkForBadMacro(DirectiveLoc,
Name, Body, Parameters);
4703 getContext().defineMacro(
Name, std::move(
Macro));
4727 if (NParameters == 0)
4730 bool NamedParametersFound =
false;
4731 bool PositionalParametersFound =
false;
4736 while (!Body.
empty()) {
4738 std::size_t
End = Body.
size(), Pos = 0;
4739 for (; Pos !=
End; ++Pos) {
4742 if (Body[Pos] ==
'\\' && Pos + 1 !=
End)
4746 if (Body[Pos] !=
'$' || Pos + 1 ==
End)
4748 char Next = Body[Pos + 1];
4749 if (Next ==
'$' || Next ==
'n' ||
4750 isdigit(
static_cast<unsigned char>(Next)))
4758 if (Body[Pos] ==
'$') {
4759 switch (Body[Pos + 1]) {
4766 PositionalParametersFound =
true;
4771 PositionalParametersFound =
true;
4777 unsigned I = Pos + 1;
4781 const char *Begin = Body.
data() + Pos + 1;
4788 if (Index == NParameters) {
4789 if (Body[Pos + 1] ==
'(' && Body[Pos + 2] ==
')')
4795 NamedParametersFound =
true;
4803 if (!NamedParametersFound && PositionalParametersFound)
4804 Warning(DirectiveLoc,
"macro defined with named parameters which are not "
4805 "used in macro body, possible positional parameter "
4806 "found in body which will have no effect");
4815 if (!isInsideMacroInstantiation())
4816 return TokError(
"unexpected '" +
Directive +
"' in file, "
4817 "no current macro definition");
4820 while (TheCondStack.size() != ActiveMacros.back()->CondStackDepth) {
4821 TheCondState = TheCondStack.back();
4822 TheCondStack.pop_back();
4834 return TokError(
"unexpected token in '" +
Directive +
"' directive");
4838 if (isInsideMacroInstantiation()) {
4845 return TokError(
"unexpected '" +
Directive +
"' in file, "
4846 "no current macro definition");
4851bool AsmParser::parseDirectivePurgeMacro(
SMLoc DirectiveLoc) {
4854 if (parseTokenLoc(Loc) ||
4855 check(parseIdentifier(
Name), Loc,
4856 "expected identifier in '.purgem' directive") ||
4860 if (!getContext().lookupMacro(
Name))
4861 return Error(DirectiveLoc,
"macro '" +
Name +
"' is not defined");
4863 getContext().undefineMacro(
Name);
4865 <<
"Un-defining macro: " <<
Name <<
"\n");
4871bool AsmParser::parseDirectiveBundleAlignMode() {
4874 SMLoc ExprLoc = getLexer().getLoc();
4875 int64_t AlignSizePow2;
4876 if (checkForValidSection() || parseAbsoluteExpression(AlignSizePow2) ||
4878 check(AlignSizePow2 < 0 || AlignSizePow2 > 30, ExprLoc,
4879 "invalid bundle alignment size (expected between 0 and 30)"))
4882 getStreamer().emitBundleAlignMode(
Align(1ULL << AlignSizePow2));
4888bool AsmParser::parseDirectiveBundleLock() {
4889 if (checkForValidSection())
4891 bool AlignToEnd =
false;
4894 SMLoc Loc = getTok().getLoc();
4895 const char *kInvalidOptionError =
4896 "invalid option for '.bundle_lock' directive";
4899 if (check(parseIdentifier(Option), Loc, kInvalidOptionError) ||
4900 check(Option !=
"align_to_end", Loc, kInvalidOptionError) || parseEOL())
4905 getStreamer().emitBundleLock(AlignToEnd);
4911bool AsmParser::parseDirectiveBundleUnlock() {
4912 if (checkForValidSection() || parseEOL())
4915 getStreamer().emitBundleUnlock();
4921bool AsmParser::parseDirectiveSpace(
StringRef IDVal) {
4924 if (checkForValidSection() || parseExpression(NumBytes))
4927 int64_t FillExpr = 0;
4929 if (parseAbsoluteExpression(FillExpr))
4935 getStreamer().emitFill(*NumBytes, FillExpr, NumBytesLoc);
4942bool AsmParser::parseDirectiveDCB(
StringRef IDVal,
unsigned Size) {
4945 if (checkForValidSection() || parseAbsoluteExpression(NumValues))
4948 if (NumValues < 0) {
4949 Warning(NumValuesLoc,
"'" +
Twine(IDVal) +
"' directive with negative repeat count has no effect");
4957 SMLoc ExprLoc = getLexer().getLoc();
4958 if (parseExpression(
Value))
4964 uint64_t IntValue = MCE->getValue();
4966 return Error(ExprLoc,
"literal value out of range for directive");
4967 for (
uint64_t i = 0, e = NumValues; i !=
e; ++i)
4968 getStreamer().emitIntValue(IntValue,
Size);
4970 for (
uint64_t i = 0, e = NumValues; i !=
e; ++i)
4971 getStreamer().emitValue(
Value,
Size, ExprLoc);
4982 if (checkForValidSection() || parseAbsoluteExpression(NumValues))
4985 if (NumValues < 0) {
4986 Warning(NumValuesLoc,
"'" +
Twine(IDVal) +
"' directive with negative repeat count has no effect");
4994 if (parseRealValue(Semantics, AsInt) || parseEOL())
4997 for (
uint64_t i = 0, e = NumValues; i !=
e; ++i)
5006bool AsmParser::parseDirectiveDS(
StringRef IDVal,
unsigned Size) {
5009 if (checkForValidSection() || parseAbsoluteExpression(NumValues) ||
5013 if (NumValues < 0) {
5014 Warning(NumValuesLoc,
"'" +
Twine(IDVal) +
"' directive with negative repeat count has no effect");
5018 for (
uint64_t i = 0, e = NumValues; i !=
e; ++i)
5019 getStreamer().emitFill(
Size, 0);
5026bool AsmParser::parseDirectiveLEB128(
bool Signed) {
5027 if (checkForValidSection())
5030 auto parseOp = [&]() ->
bool {
5032 if (parseExpression(
Value))
5035 getStreamer().emitSLEB128Value(
Value);
5037 getStreamer().emitULEB128Value(
Value);
5041 return parseMany(parseOp);
5046bool AsmParser::parseDirectiveSymbolAttribute(
MCSymbolAttr Attr) {
5047 auto parseOp = [&]() ->
bool {
5049 SMLoc Loc = getTok().getLoc();
5050 if (parseIdentifier(
Name))
5051 return Error(Loc,
"expected identifier");
5053 if (discardLTOSymbol(
Name))
5061 return Error(Loc,
"non-local symbol required");
5063 if (!getStreamer().emitSymbolAttribute(
Sym, Attr))
5064 return Error(Loc,
"unable to emit symbol attribute");
5068 return parseMany(parseOp);
5073bool AsmParser::parseDirectiveComm(
bool IsLocal) {
5074 if (checkForValidSection())
5077 SMLoc IDLoc = getLexer().getLoc();
5079 if (parseIdentifier(
Name))
5080 return TokError(
"expected identifier in directive");
5089 SMLoc SizeLoc = getLexer().getLoc();
5090 if (parseAbsoluteExpression(
Size))
5093 int64_t Pow2Alignment = 0;
5094 SMLoc Pow2AlignmentLoc;
5097 Pow2AlignmentLoc = getLexer().getLoc();
5098 if (parseAbsoluteExpression(Pow2Alignment))
5103 return Error(Pow2AlignmentLoc,
"alignment not supported on this target");
5106 if ((!IsLocal && Lexer.getMAI().getCOMMDirectiveAlignmentIsInBytes()) ||
5109 return Error(Pow2AlignmentLoc,
"alignment must be a power of 2");
5110 Pow2Alignment =
Log2_64(Pow2Alignment);
5120 return Error(SizeLoc,
"size must be non-negative");
5122 Sym->redefineIfPossible();
5123 if (!
Sym->isUndefined())
5124 return Error(IDLoc,
"invalid symbol redefinition");
5128 getStreamer().emitLocalCommonSymbol(
Sym,
Size,
5129 Align(1ULL << Pow2Alignment));
5133 getStreamer().emitCommonSymbol(
Sym,
Size,
Align(1ULL << Pow2Alignment));
5139bool AsmParser::parseDirectiveAbort(
SMLoc DirectiveLoc) {
5140 StringRef Str = parseStringToEndOfStatement();
5145 return Error(DirectiveLoc,
".abort detected. Assembly stopping");
5148 return Error(DirectiveLoc,
5149 ".abort '" + Str +
"' detected. Assembly stopping");
5154bool AsmParser::parseDirectiveInclude() {
5157 SMLoc IncludeLoc = getTok().getLoc();
5160 "expected string in '.include' directive") ||
5161 parseEscapedString(Filename) ||
5163 "unexpected token in '.include' directive") ||
5166 check(enterIncludeFile(Filename), IncludeLoc,
5167 "Could not find include file '" + Filename +
"'"))
5175bool AsmParser::parseDirectiveIncbin() {
5178 SMLoc IncbinLoc = getTok().getLoc();
5180 "expected string in '.incbin' directive") ||
5181 parseEscapedString(Filename))
5185 const MCExpr *Count =
nullptr;
5186 SMLoc SkipLoc, CountLoc;
5191 if (parseTokenLoc(SkipLoc) || parseAbsoluteExpression(Skip))
5195 CountLoc = getTok().getLoc();
5196 if (parseExpression(Count))
5204 if (check(Skip < 0, SkipLoc,
"skip is negative"))
5208 if (processIncbinFile(Filename, Skip, Count, CountLoc))
5209 return Error(IncbinLoc,
"Could not find incbin file '" + Filename +
"'");
5215bool AsmParser::parseDirectiveIf(
SMLoc DirectiveLoc, DirectiveKind DirKind) {
5216 TheCondStack.push_back(TheCondState);
5218 if (TheCondState.
Ignore) {
5219 eatToEndOfStatement();
5222 if (parseAbsoluteExpression(ExprValue) || parseEOL())
5232 ExprValue = ExprValue == 0;
5235 ExprValue = ExprValue >= 0;
5238 ExprValue = ExprValue > 0;
5241 ExprValue = ExprValue <= 0;
5244 ExprValue = ExprValue < 0;
5248 TheCondState.
CondMet = ExprValue;
5257bool AsmParser::parseDirectiveIfb(
SMLoc DirectiveLoc,
bool ExpectBlank) {
5258 TheCondStack.push_back(TheCondState);
5261 if (TheCondState.
Ignore) {
5262 eatToEndOfStatement();
5264 StringRef Str = parseStringToEndOfStatement();
5269 TheCondState.
CondMet = ExpectBlank == Str.empty();
5279bool AsmParser::parseDirectiveIfc(
SMLoc DirectiveLoc,
bool ExpectEqual) {
5280 TheCondStack.push_back(TheCondState);
5283 if (TheCondState.
Ignore) {
5284 eatToEndOfStatement();
5291 StringRef Str2 = parseStringToEndOfStatement();
5305bool AsmParser::parseDirectiveIfeqs(
SMLoc DirectiveLoc,
bool ExpectEqual) {
5308 return TokError(
"expected string parameter for '.ifeqs' directive");
5309 return TokError(
"expected string parameter for '.ifnes' directive");
5312 StringRef String1 = getTok().getStringContents();
5318 "expected comma after first string for '.ifeqs' directive");
5319 return TokError(
"expected comma after first string for '.ifnes' directive");
5326 return TokError(
"expected string parameter for '.ifeqs' directive");
5327 return TokError(
"expected string parameter for '.ifnes' directive");
5330 StringRef String2 = getTok().getStringContents();
5333 TheCondStack.push_back(TheCondState);
5335 TheCondState.
CondMet = ExpectEqual == (String1 == String2);
5343bool AsmParser::parseDirectiveIfdef(
SMLoc DirectiveLoc,
bool expect_defined) {
5345 TheCondStack.push_back(TheCondState);
5348 if (TheCondState.
Ignore) {
5349 eatToEndOfStatement();
5351 if (check(parseIdentifier(
Name),
"expected identifier after '.ifdef'") ||
5369bool AsmParser::parseDirectiveElseIf(
SMLoc DirectiveLoc) {
5372 return Error(DirectiveLoc,
"Encountered a .elseif that doesn't follow an"
5373 " .if or an .elseif");
5376 bool LastIgnoreState =
false;
5377 if (!TheCondStack.empty())
5378 LastIgnoreState = TheCondStack.back().Ignore;
5379 if (LastIgnoreState || TheCondState.
CondMet) {
5380 TheCondState.
Ignore =
true;
5381 eatToEndOfStatement();
5384 if (parseAbsoluteExpression(ExprValue))
5390 TheCondState.
CondMet = ExprValue;
5399bool AsmParser::parseDirectiveElse(
SMLoc DirectiveLoc) {
5405 return Error(DirectiveLoc,
"Encountered a .else that doesn't follow "
5406 " an .if or an .elseif");
5408 bool LastIgnoreState =
false;
5409 if (!TheCondStack.empty())
5410 LastIgnoreState = TheCondStack.back().Ignore;
5411 if (LastIgnoreState || TheCondState.
CondMet)
5412 TheCondState.
Ignore =
true;
5414 TheCondState.
Ignore =
false;
5421bool AsmParser::parseDirectiveEnd(
SMLoc DirectiveLoc) {
5434bool AsmParser::parseDirectiveError(
SMLoc L,
bool WithMessage) {
5435 if (!TheCondStack.empty()) {
5436 if (TheCondStack.back().Ignore) {
5437 eatToEndOfStatement();
5443 return Error(L,
".err encountered");
5445 StringRef Message =
".error directive invoked in source file";
5448 return TokError(
".error argument must be a string");
5450 Message = getTok().getStringContents();
5454 return Error(L, Message);
5459bool AsmParser::parseDirectiveWarning(
SMLoc L) {
5460 if (!TheCondStack.empty()) {
5461 if (TheCondStack.back().Ignore) {
5462 eatToEndOfStatement();
5467 StringRef Message =
".warning directive invoked in source file";
5471 return TokError(
".warning argument must be a string");
5473 Message = getTok().getStringContents();
5484bool AsmParser::parseDirectiveEndIf(
SMLoc DirectiveLoc) {
5489 return Error(DirectiveLoc,
"Encountered a .endif that doesn't follow "
5491 if (!TheCondStack.empty()) {
5492 TheCondState = TheCondStack.back();
5493 TheCondStack.pop_back();
5499void AsmParser::initializeDirectiveKindMap() {
5506 DirectiveKindMap[
".set"] = DK_SET;
5507 DirectiveKindMap[
".equ"] = DK_EQU;
5508 DirectiveKindMap[
".equiv"] = DK_EQUIV;
5509 DirectiveKindMap[
".ascii"] = DK_ASCII;
5510 DirectiveKindMap[
".asciz"] = DK_ASCIZ;
5511 DirectiveKindMap[
".string"] = DK_STRING;
5512 DirectiveKindMap[
".byte"] = DK_BYTE;
5513 DirectiveKindMap[
".short"] = DK_SHORT;
5514 DirectiveKindMap[
".value"] = DK_VALUE;
5515 DirectiveKindMap[
".2byte"] = DK_2BYTE;
5516 DirectiveKindMap[
".long"] = DK_LONG;
5517 DirectiveKindMap[
".int"] = DK_INT;
5518 DirectiveKindMap[
".4byte"] = DK_4BYTE;
5519 DirectiveKindMap[
".quad"] = DK_QUAD;
5520 DirectiveKindMap[
".8byte"] = DK_8BYTE;
5521 DirectiveKindMap[
".octa"] = DK_OCTA;
5522 DirectiveKindMap[
".single"] = DK_SINGLE;
5523 DirectiveKindMap[
".float"] = DK_FLOAT;
5524 DirectiveKindMap[
".double"] = DK_DOUBLE;
5525 DirectiveKindMap[
".align"] = DK_ALIGN;
5526 DirectiveKindMap[
".align32"] = DK_ALIGN32;
5527 DirectiveKindMap[
".balign"] = DK_BALIGN;
5528 DirectiveKindMap[
".balignw"] = DK_BALIGNW;
5529 DirectiveKindMap[
".balignl"] = DK_BALIGNL;
5530 DirectiveKindMap[
".p2align"] = DK_P2ALIGN;
5531 DirectiveKindMap[
".p2alignw"] = DK_P2ALIGNW;
5532 DirectiveKindMap[
".p2alignl"] = DK_P2ALIGNL;
5533 DirectiveKindMap[
".org"] = DK_ORG;
5534 DirectiveKindMap[
".fill"] = DK_FILL;
5535 DirectiveKindMap[
".zero"] = DK_ZERO;
5536 DirectiveKindMap[
".extern"] = DK_EXTERN;
5537 DirectiveKindMap[
".globl"] = DK_GLOBL;
5538 DirectiveKindMap[
".global"] = DK_GLOBAL;
5539 DirectiveKindMap[
".lazy_reference"] = DK_LAZY_REFERENCE;
5540 DirectiveKindMap[
".no_dead_strip"] = DK_NO_DEAD_STRIP;
5541 DirectiveKindMap[
".symbol_resolver"] = DK_SYMBOL_RESOLVER;
5542 DirectiveKindMap[
".private_extern"] = DK_PRIVATE_EXTERN;
5543 DirectiveKindMap[
".reference"] = DK_REFERENCE;
5544 DirectiveKindMap[
".weak_definition"] = DK_WEAK_DEFINITION;
5545 DirectiveKindMap[
".weak_reference"] = DK_WEAK_REFERENCE;
5546 DirectiveKindMap[
".weak_def_can_be_hidden"] = DK_WEAK_DEF_CAN_BE_HIDDEN;
5547 DirectiveKindMap[
".cold"] = DK_COLD;
5548 DirectiveKindMap[
".comm"] = DK_COMM;
5549 DirectiveKindMap[
".common"] = DK_COMMON;
5550 DirectiveKindMap[
".lcomm"] = DK_LCOMM;
5551 DirectiveKindMap[
".abort"] = DK_ABORT;
5552 DirectiveKindMap[
".include"] = DK_INCLUDE;
5553 DirectiveKindMap[
".incbin"] = DK_INCBIN;
5554 DirectiveKindMap[
".code16"] = DK_CODE16;
5555 DirectiveKindMap[
".code16gcc"] = DK_CODE16GCC;
5556 DirectiveKindMap[
".rept"] = DK_REPT;
5557 DirectiveKindMap[
".rep"] = DK_REPT;
5558 DirectiveKindMap[
".irp"] = DK_IRP;
5559 DirectiveKindMap[
".irpc"] = DK_IRPC;
5560 DirectiveKindMap[
".endr"] = DK_ENDR;
5561 DirectiveKindMap[
".bundle_align_mode"] = DK_BUNDLE_ALIGN_MODE;
5562 DirectiveKindMap[
".bundle_lock"] = DK_BUNDLE_LOCK;
5563 DirectiveKindMap[
".bundle_unlock"] = DK_BUNDLE_UNLOCK;
5564 DirectiveKindMap[
".if"] = DK_IF;
5565 DirectiveKindMap[
".ifeq"] = DK_IFEQ;
5566 DirectiveKindMap[
".ifge"] = DK_IFGE;
5567 DirectiveKindMap[
".ifgt"] = DK_IFGT;
5568 DirectiveKindMap[
".ifle"] = DK_IFLE;
5569 DirectiveKindMap[
".iflt"] = DK_IFLT;
5570 DirectiveKindMap[
".ifne"] = DK_IFNE;
5571 DirectiveKindMap[
".ifb"] = DK_IFB;
5572 DirectiveKindMap[
".ifnb"] = DK_IFNB;
5573 DirectiveKindMap[
".ifc"] = DK_IFC;
5574 DirectiveKindMap[
".ifeqs"] = DK_IFEQS;
5575 DirectiveKindMap[
".ifnc"] = DK_IFNC;
5576 DirectiveKindMap[
".ifnes"] = DK_IFNES;
5577 DirectiveKindMap[
".ifdef"] = DK_IFDEF;
5578 DirectiveKindMap[
".ifndef"] = DK_IFNDEF;
5579 DirectiveKindMap[
".ifnotdef"] = DK_IFNOTDEF;
5580 DirectiveKindMap[
".elseif"] = DK_ELSEIF;
5581 DirectiveKindMap[
".else"] = DK_ELSE;
5582 DirectiveKindMap[
".end"] = DK_END;
5583 DirectiveKindMap[
".endif"] = DK_ENDIF;
5584 DirectiveKindMap[
".skip"] = DK_SKIP;
5585 DirectiveKindMap[
".space"] = DK_SPACE;
5586 DirectiveKindMap[
".file"] = DK_FILE;
5587 DirectiveKindMap[
".line"] = DK_LINE;
5588 DirectiveKindMap[
".loc"] = DK_LOC;
5589 DirectiveKindMap[
".loc_label"] = DK_LOC_LABEL;
5590 DirectiveKindMap[
".stabs"] = DK_STABS;
5591 DirectiveKindMap[
".cv_file"] = DK_CV_FILE;
5592 DirectiveKindMap[
".cv_func_id"] = DK_CV_FUNC_ID;
5593 DirectiveKindMap[
".cv_loc"] = DK_CV_LOC;
5594 DirectiveKindMap[
".cv_linetable"] = DK_CV_LINETABLE;
5595 DirectiveKindMap[
".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE;
5596 DirectiveKindMap[
".cv_inline_site_id"] = DK_CV_INLINE_SITE_ID;
5597 DirectiveKindMap[
".cv_def_range"] = DK_CV_DEF_RANGE;
5598 DirectiveKindMap[
".cv_string"] = DK_CV_STRING;
5599 DirectiveKindMap[
".cv_stringtable"] = DK_CV_STRINGTABLE;
5600 DirectiveKindMap[
".cv_filechecksums"] = DK_CV_FILECHECKSUMS;
5601 DirectiveKindMap[
".cv_filechecksumoffset"] = DK_CV_FILECHECKSUM_OFFSET;
5602 DirectiveKindMap[
".cv_fpo_data"] = DK_CV_FPO_DATA;
5603 DirectiveKindMap[
".sleb128"] = DK_SLEB128;
5604 DirectiveKindMap[
".uleb128"] = DK_ULEB128;
5605 DirectiveKindMap[
".cfi_sections"] = DK_CFI_SECTIONS;
5606 DirectiveKindMap[
".cfi_startproc"] = DK_CFI_STARTPROC;
5607 DirectiveKindMap[
".cfi_endproc"] = DK_CFI_ENDPROC;
5608 DirectiveKindMap[
".cfi_def_cfa"] = DK_CFI_DEF_CFA;
5609 DirectiveKindMap[
".cfi_def_cfa_offset"] = DK_CFI_DEF_CFA_OFFSET;
5610 DirectiveKindMap[
".cfi_adjust_cfa_offset"] = DK_CFI_ADJUST_CFA_OFFSET;
5611 DirectiveKindMap[
".cfi_def_cfa_register"] = DK_CFI_DEF_CFA_REGISTER;
5612 DirectiveKindMap[
".cfi_llvm_def_aspace_cfa"] = DK_CFI_LLVM_DEF_ASPACE_CFA;
5613 DirectiveKindMap[
".cfi_offset"] = DK_CFI_OFFSET;
5614 DirectiveKindMap[
".cfi_rel_offset"] = DK_CFI_REL_OFFSET;
5615 DirectiveKindMap[
".cfi_personality"] = DK_CFI_PERSONALITY;
5616 DirectiveKindMap[
".cfi_lsda"] = DK_CFI_LSDA;
5617 DirectiveKindMap[
".cfi_remember_state"] = DK_CFI_REMEMBER_STATE;
5618 DirectiveKindMap[
".cfi_restore_state"] = DK_CFI_RESTORE_STATE;
5619 DirectiveKindMap[
".cfi_same_value"] = DK_CFI_SAME_VALUE;
5620 DirectiveKindMap[
".cfi_restore"] = DK_CFI_RESTORE;
5621 DirectiveKindMap[
".cfi_escape"] = DK_CFI_ESCAPE;
5622 DirectiveKindMap[
".cfi_return_column"] = DK_CFI_RETURN_COLUMN;
5623 DirectiveKindMap[
".cfi_signal_frame"] = DK_CFI_SIGNAL_FRAME;
5624 DirectiveKindMap[
".cfi_undefined"] = DK_CFI_UNDEFINED;
5625 DirectiveKindMap[
".cfi_register"] = DK_CFI_REGISTER;
5626 DirectiveKindMap[
".cfi_window_save"] = DK_CFI_WINDOW_SAVE;
5627 DirectiveKindMap[
".cfi_label"] = DK_CFI_LABEL;
5628 DirectiveKindMap[
".cfi_b_key_frame"] = DK_CFI_B_KEY_FRAME;
5629 DirectiveKindMap[
".cfi_mte_tagged_frame"] = DK_CFI_MTE_TAGGED_FRAME;
5630 DirectiveKindMap[
".cfi_val_offset"] = DK_CFI_VAL_OFFSET;
5631 DirectiveKindMap[
".macros_on"] = DK_MACROS_ON;
5632 DirectiveKindMap[
".macros_off"] = DK_MACROS_OFF;
5633 DirectiveKindMap[
".macro"] = DK_MACRO;
5634 DirectiveKindMap[
".exitm"] = DK_EXITM;
5635 DirectiveKindMap[
".endm"] = DK_ENDM;
5636 DirectiveKindMap[
".endmacro"] = DK_ENDMACRO;
5637 DirectiveKindMap[
".purgem"] = DK_PURGEM;
5638 DirectiveKindMap[
".err"] = DK_ERR;
5639 DirectiveKindMap[
".error"] = DK_ERROR;
5640 DirectiveKindMap[
".warning"] = DK_WARNING;
5641 DirectiveKindMap[
".altmacro"] = DK_ALTMACRO;
5642 DirectiveKindMap[
".noaltmacro"] = DK_NOALTMACRO;
5643 DirectiveKindMap[
".reloc"] = DK_RELOC;
5644 DirectiveKindMap[
".dc"] = DK_DC;
5645 DirectiveKindMap[
".dc.a"] = DK_DC_A;
5646 DirectiveKindMap[
".dc.b"] = DK_DC_B;
5647 DirectiveKindMap[
".dc.d"] = DK_DC_D;
5648 DirectiveKindMap[
".dc.l"] = DK_DC_L;
5649 DirectiveKindMap[
".dc.s"] = DK_DC_S;
5650 DirectiveKindMap[
".dc.w"] = DK_DC_W;
5651 DirectiveKindMap[
".dc.x"] = DK_DC_X;
5652 DirectiveKindMap[
".dcb"] = DK_DCB;
5653 DirectiveKindMap[
".dcb.b"] = DK_DCB_B;
5654 DirectiveKindMap[
".dcb.d"] = DK_DCB_D;
5655 DirectiveKindMap[
".dcb.l"] = DK_DCB_L;
5656 DirectiveKindMap[
".dcb.s"] = DK_DCB_S;
5657 DirectiveKindMap[
".dcb.w"] = DK_DCB_W;
5658 DirectiveKindMap[
".dcb.x"] = DK_DCB_X;
5659 DirectiveKindMap[
".ds"] = DK_DS;
5660 DirectiveKindMap[
".ds.b"] = DK_DS_B;
5661 DirectiveKindMap[
".ds.d"] = DK_DS_D;
5662 DirectiveKindMap[
".ds.l"] = DK_DS_L;
5663 DirectiveKindMap[
".ds.p"] = DK_DS_P;
5664 DirectiveKindMap[
".ds.s"] = DK_DS_S;
5665 DirectiveKindMap[
".ds.w"] = DK_DS_W;
5666 DirectiveKindMap[
".ds.x"] = DK_DS_X;
5667 DirectiveKindMap[
".print"] = DK_PRINT;
5668 DirectiveKindMap[
".addrsig"] = DK_ADDRSIG;
5669 DirectiveKindMap[
".addrsig_sym"] = DK_ADDRSIG_SYM;
5670 DirectiveKindMap[
".pseudoprobe"] = DK_PSEUDO_PROBE;
5671 DirectiveKindMap[
".lto_discard"] = DK_LTO_DISCARD;
5672 DirectiveKindMap[
".lto_set_conditional"] = DK_LTO_SET_CONDITIONAL;
5673 DirectiveKindMap[
".memtag"] = DK_MEMTAG;
5677 AsmToken EndToken, StartToken = getTok();
5679 unsigned NestLevel = 0;
5683 printError(DirectiveLoc,
"no matching '.endr' in definition");
5688 StringRef Ident = getTok().getIdentifier();
5689 if (Ident ==
".rep" || Ident ==
".rept" || Ident ==
".irp" ||
5692 }
else if (Ident ==
".endr") {
5693 if (NestLevel == 0) {
5694 EndToken = getTok();
5698 printError(getTok().getLoc(),
"expected newline");
5706 eatToEndOfStatement();
5715 return &MacroLikeBodies.back();
5718void AsmParser::instantiateMacroLikeBody(
MCAsmMacro *M,
SMLoc DirectiveLoc,
5722 std::unique_ptr<MemoryBuffer> Instantiation =
5727 MacroInstantiation *
MI =
new MacroInstantiation{
5728 DirectiveLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()};
5729 ActiveMacros.push_back(
MI);
5739bool AsmParser::parseDirectiveRept(
SMLoc DirectiveLoc,
StringRef Dir) {
5741 SMLoc CountLoc = getTok().getLoc();
5742 if (parseExpression(CountExpr))
5746 if (!CountExpr->evaluateAsAbsolute(Count, getStreamer().getAssemblerPtr())) {
5747 return Error(CountLoc,
"unexpected token in '" + Dir +
"' directive");
5750 if (check(Count < 0, CountLoc,
"Count is negative") || parseEOL())
5764 if (expandMacro(
OS, *M, {}, {},
false))
5767 instantiateMacroLikeBody(M, DirectiveLoc,
OS);
5774bool AsmParser::parseDirectiveIrp(
SMLoc DirectiveLoc) {
5776 MCAsmMacroArguments
A;
5777 if (check(parseIdentifier(Parameter.
Name),
5778 "expected identifier in '.irp' directive") ||
5779 parseComma() || parseMacroArguments(
nullptr,
A) || parseEOL())
5792 for (
const MCAsmMacroArgument &Arg :
A) {
5795 if (expandMacro(
OS, *M, Parameter, Arg,
true))
5799 instantiateMacroLikeBody(M, DirectiveLoc,
OS);
5806bool AsmParser::parseDirectiveIrpc(
SMLoc DirectiveLoc) {
5808 MCAsmMacroArguments
A;
5810 if (check(parseIdentifier(Parameter.
Name),
5811 "expected identifier in '.irpc' directive") ||
5812 parseComma() || parseMacroArguments(
nullptr,
A))
5815 if (
A.size() != 1 ||
A.front().size() != 1)
5816 return TokError(
"unexpected token in '.irpc' directive");
5831 :
A[0][0].getString();
5832 for (std::size_t
I = 0,
End = Values.
size();
I !=
End; ++
I) {
5833 MCAsmMacroArgument Arg;
5838 if (expandMacro(
OS, *M, Parameter, Arg,
true))
5842 instantiateMacroLikeBody(M, DirectiveLoc,
OS);
5847bool AsmParser::parseDirectiveEndr(
SMLoc DirectiveLoc) {
5848 if (ActiveMacros.empty())
5849 return TokError(
"unmatched '.endr' directive");
5859bool AsmParser::parseDirectiveMSEmit(
SMLoc IDLoc, ParseStatementInfo &Info,
5862 SMLoc ExprLoc = getLexer().getLoc();
5863 if (parseExpression(
Value))
5867 return Error(ExprLoc,
"unexpected expression in _emit");
5869 if (!isUInt<8>(IntValue) && !isInt<8>(IntValue))
5870 return Error(ExprLoc,
"literal value out of range for directive");
5876bool AsmParser::parseDirectiveMSAlign(
SMLoc IDLoc, ParseStatementInfo &Info) {
5878 SMLoc ExprLoc = getLexer().getLoc();
5879 if (parseExpression(
Value))
5883 return Error(ExprLoc,
"unexpected expression in align");
5886 return Error(ExprLoc,
"literal value not a power of two greater then zero");
5892bool AsmParser::parseDirectivePrint(
SMLoc DirectiveLoc) {
5896 return Error(DirectiveLoc,
"expected double quoted string after .print");
5903bool AsmParser::parseDirectiveAddrsig() {
5906 getStreamer().emitAddrsig();
5910bool AsmParser::parseDirectiveAddrsigSym() {
5912 if (check(parseIdentifier(
Name),
"expected identifier") || parseEOL())
5915 getStreamer().emitAddrsigSym(
Sym);
5919bool AsmParser::parseDirectivePseudoProbe() {
5926 if (parseIntToken(
Guid,
"unexpected token in '.pseudoprobe' directive"))
5929 if (parseIntToken(Index,
"unexpected token in '.pseudoprobe' directive"))
5932 if (parseIntToken(
Type,
"unexpected token in '.pseudoprobe' directive"))
5935 if (parseIntToken(Attr,
"unexpected token in '.pseudoprobe' directive"))
5939 if (parseIntToken(Discriminator,
5940 "unexpected token in '.pseudoprobe' directive"))
5951 int64_t CallerGuid = 0;
5953 if (parseIntToken(CallerGuid,
5954 "unexpected token in '.pseudoprobe' directive"))
5962 int64_t CallerProbeId = 0;
5964 if (parseIntToken(CallerProbeId,
5965 "unexpected token in '.pseudoprobe' directive"))
5975 if (parseIdentifier(FnName))
5976 return Error(getLexer().getLoc(),
"unexpected token in '.pseudoprobe' directive");
5977 MCSymbol *FnSym = getContext().lookupSymbol(FnName);
5982 getStreamer().emitPseudoProbe(
Guid, Index,
Type, Attr, Discriminator,
5983 InlineStack, FnSym);
5992bool AsmParser::parseDirectiveLTODiscard() {
5993 auto ParseOp = [&]() ->
bool {
5995 SMLoc Loc = getTok().getLoc();
5996 if (parseIdentifier(
Name))
5997 return Error(Loc,
"expected identifier");
6002 LTODiscardSymbols.
clear();
6003 return parseMany(ParseOp);
6029bool AsmParser::parseMSInlineAsm(
6030 std::string &AsmString,
unsigned &NumOutputs,
unsigned &NumInputs,
6049 unsigned InputIdx = 0;
6050 unsigned OutputIdx = 0;
6053 if (parseCurlyBlockScope(AsmStrRewrites))
6056 ParseStatementInfo
Info(&AsmStrRewrites);
6057 bool StatementErr = parseStatement(Info, &SI);
6059 if (StatementErr ||
Info.ParseError) {
6061 printPendingErrors();
6066 assert(!hasPendingError() &&
"unexpected error from parseStatement");
6068 if (
Info.Opcode == ~0U)
6074 for (
unsigned i = 1, e =
Info.ParsedOperands.size(); i != e; ++i) {
6079 !getTargetParser().omitRegisterFromClobberLists(Operand.
getReg())) {
6080 unsigned NumDefs =
Desc.getNumDefs();
6089 if (SymName.
empty())
6097 if (Operand.
isImm()) {
6105 bool isOutput = (i == 1) &&
Desc.mayStore();
6112 OutputConstraints.
push_back((
"=" + Constraint).str());
6119 if (
Desc.operands()[i - 1].isBranchTarget())
6133 NumOutputs = OutputDecls.
size();
6134 NumInputs = InputDecls.
size();
6139 Clobbers.
assign(ClobberRegs.
size(), std::string());
6140 for (
unsigned I = 0, E = ClobberRegs.
size();
I != E; ++
I) {
6146 if (NumOutputs || NumInputs) {
6147 unsigned NumExprs = NumOutputs + NumInputs;
6148 OpDecls.resize(NumExprs);
6149 Constraints.
resize(NumExprs);
6150 for (
unsigned i = 0; i < NumOutputs; ++i) {
6151 OpDecls[i] = std::make_pair(OutputDecls[i], OutputDeclsAddressOf[i]);
6152 Constraints[i] = OutputConstraints[i];
6154 for (
unsigned i = 0, j = NumOutputs; i < NumInputs; ++i, ++
j) {
6155 OpDecls[
j] = std::make_pair(InputDecls[i], InputDeclsAddressOf[i]);
6156 Constraints[
j] = InputConstraints[i];
6161 std::string AsmStringIR;
6165 const char *AsmStart = ASMString.
begin();
6166 const char *AsmEnd = ASMString.
end();
6168 for (
auto I = AsmStrRewrites.
begin(), E = AsmStrRewrites.
end();
I != E; ++
I) {
6176 assert(Loc >= AsmStart &&
"Expected Loc to be at or after Start!");
6179 if (
unsigned Len = Loc - AsmStart)
6184 AsmStart = Loc + AR.
Len;
6188 unsigned AdditionalSkip = 0;
6210 size_t OffsetLen = OffsetName.
size();
6211 auto rewrite_it = std::find_if(
6213 return FusingAR.Loc == OffsetLoc && FusingAR.Len == OffsetLen &&
6214 (FusingAR.Kind == AOK_Input ||
6215 FusingAR.Kind == AOK_CallInput);
6217 if (rewrite_it == AsmStrRewrites.
end()) {
6218 OS <<
"offset " << OffsetName;
6220 OS <<
"${" << InputIdx++ <<
":P}";
6221 rewrite_it->Done =
true;
6223 OS <<
'$' << InputIdx++;
6224 rewrite_it->Done =
true;
6237 OS <<
"${" << InputIdx++ <<
":P}";
6239 OS <<
'$' << InputIdx++;
6242 OS <<
"${" << InputIdx++ <<
":P}";
6246 OS <<
"${" << OutputIdx++ <<
":P}";
6248 OS <<
'$' << OutputIdx++;
6253 case 8:
OS <<
"byte ptr ";
break;
6254 case 16:
OS <<
"word ptr ";
break;
6255 case 32:
OS <<
"dword ptr ";
break;
6256 case 64:
OS <<
"qword ptr ";
break;
6257 case 80:
OS <<
"xword ptr ";
break;
6258 case 128:
OS <<
"xmmword ptr ";
break;
6259 case 256:
OS <<
"ymmword ptr ";
break;
6269 if (getContext().getAsmInfo()->getAlignmentIsInBytes())
6274 unsigned Val = AR.
Val;
6276 assert(Val < 10 &&
"Expected alignment less then 2^10.");
6277 AdditionalSkip = (Val < 4) ? 2 : Val < 7 ? 3 : 4;
6289 AsmStart = Loc + AR.
Len + AdditionalSkip;
6293 if (AsmStart != AsmEnd)
6296 AsmString = std::move(AsmStringIR);
6300bool HLASMAsmParser::parseAsHLASMLabel(ParseStatementInfo &Info,
6306 if (parseIdentifier(LabelVal))
6307 return Error(LabelLoc,
"The HLASM Label has to be an Identifier");
6312 if (!getTargetParser().isLabel(LabelTok) || checkForValidSection())
6321 return Error(LabelLoc,
6322 "Cannot have just a label for an HLASM inline asm statement");
6325 getContext().getAsmInfo()->shouldEmitLabelsInUpperCase()
6329 getTargetParser().doBeforeLabelEmit(
Sym, LabelLoc);
6336 if (enabledGenDwarfForAssembly())
6340 getTargetParser().onLabelParsed(
Sym);
6345bool HLASMAsmParser::parseAsMachineInstruction(ParseStatementInfo &Info,
6348 SMLoc OperationEntryLoc = OperationEntryTok.
getLoc();
6352 if (parseIdentifier(OperationEntryVal))
6353 return Error(OperationEntryLoc,
"unexpected token at start of statement");
6359 return parseAndMatchAndEmitTargetInstruction(
6360 Info, OperationEntryVal, OperationEntryTok, OperationEntryLoc);
6363bool HLASMAsmParser::parseStatement(ParseStatementInfo &Info,
6365 assert(!hasPendingError() &&
"parseStatement started with pending error");
6368 bool ShouldParseAsHLASMLabel =
false;
6377 ShouldParseAsHLASMLabel =
true;
6383 if (getTok().getString().empty() || getTok().getString().front() ==
'\r' ||
6384 getTok().getString().front() ==
'\n')
6399 if (getTok().getString().front() ==
'\n' ||
6400 getTok().getString().front() ==
'\r') {
6409 if (ShouldParseAsHLASMLabel) {
6412 if (parseAsHLASMLabel(Info, SI)) {
6415 eatToEndOfStatement();
6420 return parseAsMachineInstruction(Info, SI);
6424namespace MCParserUtils {
6433 return Parser.
TokError(
"missing expression");
6450 if (
Value->isSymbolUsedInExpression(
Sym))
6451 return Parser.
Error(EqualLoc,
"Recursive use of '" +
Name +
"'");
6452 else if (
Sym->isUndefined(
false) && !
Sym->isUsed() &&
6455 else if (
Sym->isVariable() && !
Sym->isUsed() && allow_redef)
6457 else if (!
Sym->isUndefined() && (!
Sym->isVariable() || !allow_redef))
6458 return Parser.
Error(EqualLoc,
"redefinition of '" +
Name +
"'");
6459 else if (!
Sym->isVariable())
6460 return Parser.
Error(EqualLoc,
"invalid assignment to '" +
Name +
"'");
6461 else if (!isa<MCConstantExpr>(
Sym->getVariableValue()))
6462 return Parser.
Error(EqualLoc,
6463 "invalid reassignment of non-absolute variable '" +
6465 }
else if (
Name ==
".") {
6471 Sym->setRedefinable(allow_redef);
6483 if (
C.getTargetTriple().isSystemZ() &&
C.getTargetTriple().isOSzOS())
6484 return new HLASMAsmParser(SM,
C, Out, MAI, CB);
6486 return new AsmParser(SM,
C, Out, MAI, CB);
This file defines the StringMap class.
static bool isNot(const MachineRegisterInfo &MRI, const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static Expected< std::vector< unsigned > > getSymbols(SymbolicFile *Obj, uint16_t Index, raw_ostream &SymNames, SymMap *SymMap)
static bool isValidEncoding(int64_t Encoding)
static bool isAngleBracketString(SMLoc &StrLoc, SMLoc &EndLoc)
This function checks if the next token is <string> type or arithmetic.
static unsigned getDarwinBinOpPrecedence(AsmToken::TokenKind K, MCBinaryExpr::Opcode &Kind, bool ShouldUseLogicalShr)
static bool isIdentifierChar(char c)
static unsigned getGNUBinOpPrecedence(const MCAsmInfo &MAI, AsmToken::TokenKind K, MCBinaryExpr::Opcode &Kind, bool ShouldUseLogicalShr)
static std::string angleBracketString(StringRef AltMacroStr)
creating a string without the escape characters '!'.
static int rewritesSort(const AsmRewrite *AsmRewriteA, const AsmRewrite *AsmRewriteB)
static bool parseHexOcta(AsmParser &Asm, uint64_t &hi, uint64_t &lo)
static bool isOperator(AsmToken::TokenKind kind)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Analysis containing CSE Info
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
#define DEBUG_WITH_TYPE(TYPE,...)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
This file contains constants used for implementing Dwarf debug support.
#define DWARF2_FLAG_IS_STMT
#define DWARF2_FLAG_BASIC_BLOCK
#define DWARF2_LINE_DEFAULT_IS_STMT
#define DWARF2_FLAG_PROLOGUE_END
#define DWARF2_FLAG_EPILOGUE_BEGIN
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static bool isValid(const char C)
Returns true if C is a valid mangled character: <0-9a-zA-Z_>.
static bool isDigit(const char C)
static bool isHexDigit(const char C)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
static void DiagHandler(const SMDiagnostic &Diag, void *Context)
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
static APFloat getNaN(const fltSemantics &Sem, bool Negative=false, uint64_t payload=0)
Factory for NaN values.
Class for arbitrary precision integers.
APInt getLoBits(unsigned numBits) const
Compute an APInt containing numBits lowbits from this APInt.
uint64_t getZExtValue() const
Get zero extended value.
APInt getHiBits(unsigned numBits) const
Compute an APInt containing numBits highbits from this APInt.
unsigned getBitWidth() const
Return the number of bits in the APInt.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
AsmCond - Class to support conditional assembly.
ConditionalAssemblyType TheCond
AsmLexer - Lexer class for assembly files.
Target independent representation for an assembler token.
bool isNot(TokenKind K) const
StringRef getString() const
Get the string for the current token, this includes all characters (for example, the quotes on string...
StringRef getStringContents() const
Get the contents of a string token (without quotes).
bool is(TokenKind K) const
StringRef getIdentifier() const
Get the identifier string for the current token, which should be an identifier or a string.
Holds state from .cv_file and .cv_loc directives for later emission.
Base class for user error types.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
This class is intended to be used as a base class for asm properties and features specific to the tar...
bool useParensForSymbolVariant() const
bool preserveAsmComments() const
Return true if assembly (inline or otherwise) should be parsed.
bool isLittleEndian() const
True if the target is little endian.
unsigned getAssemblerDialect() const
bool doesAllowAtInName() const
StringRef getPrivateLabelPrefix() const
bool shouldEmitLabelsInUpperCase() const
bool shouldUseLogicalShr() const
StringRef getCommentString() const
bool hasSubsectionsViaSymbols() const
bool getDollarIsPC() const
Generic assembler lexer interface, for use by target specific assembly lexers.
void UnLex(AsmToken const &Token)
void setAllowHashInIdentifier(bool V)
const AsmToken peekTok(bool ShouldSkipSpace=true)
Look ahead at the next token to be lexed.
void setLexHLASMIntegers(bool V)
Set whether to lex HLASM-flavour integers. For now this is only [0-9]*.
bool isNot(AsmToken::TokenKind K) const
Check if the current token has kind K.
SMLoc getLoc() const
Get the current source location.
SMLoc getErrLoc()
Get the current error location.
void setLexMasmIntegers(bool V)
Set whether to lex masm-style binary (e.g., 0b1101) and radix-specified literals (e....
const AsmToken & getTok() const
Get the current (last) lexed token.
AsmToken::TokenKind getKind() const
Get the kind of current token.
void setLexHLASMStrings(bool V)
Set whether to "lex" HLASM-flavour character and string literals.
void setSkipSpace(bool val)
Set whether spaces should be ignored by the lexer.
const AsmToken & Lex()
Consume the next token from the input stream and return it.
bool is(AsmToken::TokenKind K) const
Check if the current token has kind K.
virtual size_t peekTokens(MutableArrayRef< AsmToken > Buf, bool ShouldSkipSpace=true)=0
Look ahead an arbitrary number of tokens.
const std::string & getErr()
Get the current error string.
Generic interface for extending the MCAsmParser, which is implemented by target and object file assem...
Generic Sema callback for assembly parser.
virtual ~MCAsmParserSemaCallback()
Generic assembler parser interface, for use by target specific assembly parsers.
virtual void eatToEndOfStatement()=0
Skip to the end of the current statement, for error recovery.
virtual bool printError(SMLoc L, const Twine &Msg, SMRange Range=std::nullopt)=0
Emit an error at the location L, with the message Msg.
virtual bool parseEscapedString(std::string &Data)=0
Parse the current token as a string which may include escaped characters and return the string conten...
virtual MCStreamer & getStreamer()=0
Return the output streamer for the assembler.
virtual StringRef parseStringToEndOfStatement()=0
Parse up to the end of statement and return the contents from the current token until the end of the ...
virtual bool parseExpression(const MCExpr *&Res, SMLoc &EndLoc)=0
Parse an arbitrary expression.
virtual SourceMgr & getSourceManager()=0
virtual bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc, AsmTypeInfo *TypeInfo)=0
Parse a primary expression.
const AsmToken & getTok() const
Get the current AsmToken from the stream.
virtual bool checkForValidSection()=0
Ensure that we have a valid section set in the streamer.
virtual bool parseIdentifier(StringRef &Res)=0
Parse an identifier or string (as a quoted identifier) and set Res to the identifier contents.
virtual bool discardLTOSymbol(StringRef) const
MCAsmParser & operator=(const MCAsmParser &)=delete
virtual bool parseParenExpression(const MCExpr *&Res, SMLoc &EndLoc)=0
Parse an arbitrary expression, assuming that an initial '(' has already been consumed.
virtual bool isParsingMSInlineAsm()=0
virtual const AsmToken & Lex()=0
Get the next AsmToken in the stream, possibly handling file inclusion first.
virtual bool parseParenExprOfDepth(unsigned ParenDepth, const MCExpr *&Res, SMLoc &EndLoc)=0
Parse an arbitrary expression of a specified parenthesis depth, assuming that the initial '(' charact...
virtual unsigned getAssemblerDialect()
virtual MCAsmLexer & getLexer()=0
virtual void addAliasForDirective(StringRef Directive, StringRef Alias)=0
virtual bool parseAngleBracketString(std::string &Data)=0
Parse an angle-bracket delimited string at the current position if one is present,...
bool TokError(const Twine &Msg, SMRange Range=std::nullopt)
Report an error at the current lexer location.
virtual bool parseAbsoluteExpression(int64_t &Res)=0
Parse an expression which must evaluate to an absolute value.
virtual void setAssemblerDialect(unsigned i)
virtual MCContext & getContext()=0
virtual void setParsingMSInlineAsm(bool V)=0
virtual bool parseMSInlineAsm(std::string &AsmString, unsigned &NumOutputs, unsigned &NumInputs, SmallVectorImpl< std::pair< void *, bool > > &OpDecls, SmallVectorImpl< std::string > &Constraints, SmallVectorImpl< std::string > &Clobbers, const MCInstrInfo *MII, MCInstPrinter *IP, MCAsmParserSemaCallback &SI)=0
Parse MS-style inline assembly.
virtual void addDirectiveHandler(StringRef Directive, ExtensionDirectiveHandler Handler)=0
bool Error(SMLoc L, const Twine &Msg, SMRange Range=std::nullopt)
Return an error at the location L, with the message Msg.
Binary assembler expressions.
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
const MCExpr * getRHS() const
Get the right-hand side expression of the binary operator.
Opcode getOpcode() const
Get the kind of this binary expression.
static const MCBinaryExpr * create(Opcode Op, const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
@ AShr
Arithmetic shift right.
@ LShr
Logical shift right.
@ GTE
Signed greater than or equal comparison (result is either 0 or some target-specific non-zero value).
@ GT
Signed greater than comparison (result is either 0 or some target-specific non-zero value)
@ Xor
Bitwise exclusive or.
@ LT
Signed less than comparison (result is either 0 or some target-specific non-zero value).
@ LTE
Signed less than or equal comparison (result is either 0 or some target-specific non-zero value).
@ NE
Inequality comparison.
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
void * allocate(unsigned Size, unsigned Align=8)
Environment getObjectFileType() const
bool isDwarfMD5UsageConsistent(unsigned CUID) const
Reports whether MD5 checksum usage is consistent (all-or-none).
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
bool getGenDwarfForAssembly()
void setGenDwarfForAssembly(bool Value)
void setDwarfVersion(uint16_t v)
MCDwarfLineTable & getMCDwarfLineTable(unsigned CUID)
MCSymbol * lookupSymbol(const Twine &Name) const
Get the symbol for Name, or null.
CodeViewContext & getCVContext()
MCSymbol * createDirectionalLocalSymbol(unsigned LocalLabelVal)
Create the definition of a directional local symbol for numbered label (used for "1:" definitions).
uint16_t getDwarfVersion() const
const MCAsmInfo * getAsmInfo() const
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
MCSymbol * getDirectionalLocalSymbol(unsigned LocalLabelVal, bool Before)
Create and return a directional local symbol for numbered label (used for "1b" or 1f" references).
Base class for the full range of assembler expressions which are needed for parsing.
@ Unary
Unary expressions.
@ Constant
Constant expressions.
@ SymbolRef
References to labels and assigned expressions.
@ Target
Target specific expression.
@ Binary
Binary expressions.
bool evaluateAsRelocatable(MCValue &Res, const MCAssembler *Asm, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
static void Make(MCSymbol *Symbol, MCStreamer *MCOS, SourceMgr &SrcMgr, SMLoc &Loc)
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
virtual void printRegName(raw_ostream &OS, MCRegister Reg)
Print the assembler register name.
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
MCParsedAsmOperand - This abstract class represents a source-level assembly instruction operand.
virtual bool isMemUseUpRegs() const
isMemUseUpRegs - Is memory operand use up regs, for example, intel MS inline asm may use ARR[baseReg ...
virtual bool isReg() const =0
isReg - Is this a register operand?
virtual bool needAddressOf() const
needAddressOf - Do we need to emit code to get the address of the variable/label? Only valid when par...
virtual MCRegister getReg() const =0
virtual bool isOffsetOfLocal() const
isOffsetOfLocal - Do we need to emit code to get the offset of the local variable,...
virtual StringRef getSymName()
virtual bool isImm() const =0
isImm - Is this an immediate operand?
unsigned getMCOperandNum()
StringRef getConstraint()
virtual void * getOpDecl()
Wrapper class representing physical registers. Should be passed by value.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
void setBeginSymbol(MCSymbol *Sym)
MCSymbol * getBeginSymbol()
Streaming machine code generation interface.
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
virtual void initSections(bool NoExecStack, const MCSubtargetInfo &STI)
Create the default sections and set the initial one.
void setStartTokLocPtr(const SMLoc *Loc)
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
virtual void addExplicitComment(const Twine &T)
Add explicit comment T.
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
MCTargetStreamer * getTargetStreamer()
virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc)
Emit some number of copies of Value until the byte offset Offset is reached.
virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol, but only if Value is also emitted.
void finish(SMLoc EndLoc=SMLoc())
Finish emission of machine code.
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
const MCSymbol & getSymbol() const
static VariantKind getVariantKindForName(StringRef Name)
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
VariantKind getKind() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MCTargetAsmParser - Generic interface to target specific assembly parsers.
const MCSubtargetInfo & getSTI() const
Unary assembler expressions.
Opcode getOpcode() const
Get the kind of this unary expression.
static const MCUnaryExpr * create(Opcode Op, const MCExpr *Expr, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCUnaryExpr * createLNot(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc=SMLoc())
const MCExpr * getSubExpr() const
Get the child of this unary expression.
static const MCUnaryExpr * createPlus(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCUnaryExpr * createNot(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCUnaryExpr * createMinus(const MCExpr *Expr, MCContext &Ctx, SMLoc Loc=SMLoc())
This represents an "assembler immediate".
static std::unique_ptr< MemoryBuffer > getMemBufferCopy(StringRef InputData, const Twine &BufferName="")
Open the specified memory range as a MemoryBuffer, copying the contents and taking ownership of it.
StringRef getBuffer() const
Ternary parse status returned by various parse* methods.
constexpr bool isFailure() const
constexpr bool isSuccess() const
Wrapper class representing virtual and physical registers.
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
SourceMgr::DiagKind getKind() const
StringRef getLineContents() const
StringRef getMessage() const
ArrayRef< std::pair< unsigned, unsigned > > getRanges() const
const SourceMgr * getSourceMgr() const
Represents a location in source code.
static SMLoc getFromPointer(const char *Ptr)
constexpr const char * getPointer() const
constexpr bool isValid() const
Represents a range in source code.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
bool contains(const T &V) const
Check if the SmallSet contains the given element.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This owns the files read by a parser, handles include stacks, and handles diagnostic wrangling.
void * getDiagContext() const
unsigned getMainFileID() const
DiagHandlerTy getDiagHandler() const
const MemoryBuffer * getMemoryBuffer(unsigned i) const
void PrintMessage(raw_ostream &OS, SMLoc Loc, DiagKind Kind, const Twine &Msg, ArrayRef< SMRange > Ranges={}, ArrayRef< SMFixIt > FixIts={}, bool ShowColors=true) const
Emit a message about the specified location with the specified string.
SMLoc getParentIncludeLoc(unsigned i) const
void PrintIncludeStack(SMLoc IncludeLoc, raw_ostream &OS) const
Prints the names of included files and the line of the file they were included from.
unsigned FindBufferContainingLoc(SMLoc Loc) const
Return the ID of the buffer containing the specified location.
void(*)(const SMDiagnostic &, void *Context) DiagHandlerTy
Clients that want to handle their own diagnostics in a custom way can register a function pointer+con...
void setDiagHandler(DiagHandlerTy DH, void *Ctx=nullptr)
Specify a diagnostic handler to be invoked every time PrintMessage is called.
unsigned AddIncludeFile(const std::string &Filename, SMLoc IncludeLoc, std::string &IncludedFile)
Search for a file with the specified name in the current directory or in one of the IncludeDirs.
unsigned FindLineNumber(SMLoc Loc, unsigned BufferID=0) const
Find the line number for the specified location in the specified file.
unsigned AddNewSourceBuffer(std::unique_ptr< MemoryBuffer > F, SMLoc IncludeLoc)
Add a new source buffer to this source manager.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
ValueTy lookup(StringRef Key) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
std::string str() const
str - Get the contents as an std::string.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
std::string upper() const
Convert the given ASCII string to uppercase.
constexpr size_t size() const
size - Get the string size.
char front() const
front - Get the first character in the string.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
StringRef take_front(size_t N=1) const
Return a StringRef equal to 'this' but with only the first N elements remaining.
StringRef trim(char Char) const
Return string with consecutive Char characters starting from the left and right removed.
std::string lower() const
int compare_insensitive(StringRef RHS) const
Compare two strings, ignoring case.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
This class represents a function that is read from a sample profile.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char SymbolName[]
Key for Kernel::Metadata::mSymbolName.
@ C
The default llvm calling convention, compatible with C.
std::variant< std::monostate, Loc::Single, Loc::Multi, Loc::MMI, Loc::EntryValue > Variant
Alias for the std::variant specialization base class of DbgVariable.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
bool parseAssignmentExpression(StringRef Name, bool allow_redef, MCAsmParser &Parser, MCSymbol *&Symbol, const MCExpr *&Value)
Parse a value expression and return whether it can be assigned to a symbol with the given name.
std::variant< std::monostate, DecisionParameters, BranchParameters > Parameters
The type of MC/DC-specific parameters.
This is an optimization pass for GlobalISel generic memory operations.
bool errorToBool(Error Err)
Helper for converting an Error to a bool.
MCAsmParserExtension * createCOFFAsmParser()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
std::tuple< uint64_t, uint32_t > InlineSite
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
std::vector< MCAsmMacroParameter > MCAsmMacroParameters
auto unique(Range &&R, Predicate P)
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
MCAsmParserExtension * createXCOFFAsmParser()
MCAsmParserExtension * createGOFFAsmParser()
auto reverse(ContainerTy &&C)
cl::opt< unsigned > AsmMacroMaxNestingDepth
const char AsmRewritePrecedence[]
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
static bool hasDiscriminator(uint32_t Flags)
MCAsmParserExtension * createWasmAsmParser()
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
MCAsmParser * createMCAsmParser(SourceMgr &, MCContext &, MCStreamer &, const MCAsmInfo &, unsigned CB=0)
Create an MCAsmParser instance for parsing assembly similar to gas syntax.
bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
const char * toString(DWARFSectionKind Kind)
void array_pod_sort(IteratorTy Start, IteratorTy End)
array_pod_sort - This sorts an array with the specified start and end extent.
MCAsmParserExtension * createELFAsmParser()
MCAsmParserExtension * createDarwinAsmParser()
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_Memtag
.memtag (ELF)
@ MCSA_PrivateExtern
.private_extern (MachO)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_LazyReference
.lazy_reference (MachO)
@ MCSA_Reference
.reference (MachO)
@ MCSA_SymbolResolver
.symbol_resolver (MachO)
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
ArrayRef< int > hi(ArrayRef< int > Vuu)
ArrayRef< int > lo(ArrayRef< int > Vuu)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Description of the encoding of one expression Op.
std::vector< AsmToken > Value
Instances of this class represent the name of the dwarf .file directive and its associated dwarf file...
std::optional< MD5::MD5Result > Checksum
The MD5 checksum, if there is one.
std::optional< StringRef > Source
The source code of the file.