Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions llvm/include/llvm/MC/MCParser/MCAsmParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,9 @@ class LLVM_ABI MCAsmParser {
/// Res to the identifier contents.
virtual bool parseIdentifier(StringRef &Res) = 0;

/// Parse identifier and get or create symbol for it.
bool parseSymbol(MCSymbol *&Res);

/// Parse up to the end of statement and return the contents from the
/// current token until the end of the statement; the current token on exit
/// will be either the EndOfStatement or EOF.
Expand Down
53 changes: 18 additions & 35 deletions llvm/lib/MC/MCParser/AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3876,20 +3876,15 @@ bool AsmParser::parseDirectiveCVLoc() {
/// ::= .cv_linetable FunctionId, FnStart, FnEnd
bool AsmParser::parseDirectiveCVLinetable() {
int64_t FunctionId;
StringRef FnStartName, FnEndName;
MCSymbol *FnStartSym, *FnEndSym;
SMLoc Loc = getTok().getLoc();
if (parseCVFunctionId(FunctionId, ".cv_linetable") || parseComma() ||
parseTokenLoc(Loc) ||
check(parseIdentifier(FnStartName), Loc,
"expected identifier in directive") ||
check(parseSymbol(FnStartSym), Loc, "expected identifier in directive") ||
parseComma() || parseTokenLoc(Loc) ||
check(parseIdentifier(FnEndName), Loc,
"expected identifier in directive"))
check(parseSymbol(FnEndSym), Loc, "expected identifier in directive"))
return true;

MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);

getStreamer().emitCVLinetableDirective(FunctionId, FnStartSym, FnEndSym);
return false;
}
Expand All @@ -3898,7 +3893,7 @@ bool AsmParser::parseDirectiveCVLinetable() {
/// ::= .cv_inline_linetable PrimaryFunctionId FileId LineNum FnStart FnEnd
bool AsmParser::parseDirectiveCVInlineLinetable() {
int64_t PrimaryFunctionId, SourceFileId, SourceLineNum;
StringRef FnStartName, FnEndName;
MCSymbol *FnStartSym, *FnEndSym;
SMLoc Loc = getTok().getLoc();
if (parseCVFunctionId(PrimaryFunctionId, ".cv_inline_linetable") ||
parseTokenLoc(Loc) ||
Expand All @@ -3908,16 +3903,14 @@ bool AsmParser::parseDirectiveCVInlineLinetable() {
parseIntToken(SourceLineNum, "expected SourceLineNum") ||
check(SourceLineNum < 0, Loc, "Line number less than zero") ||
parseTokenLoc(Loc) ||
check(parseIdentifier(FnStartName), Loc, "expected identifier") ||
check(parseSymbol(FnStartSym), Loc, "expected identifier") ||
parseTokenLoc(Loc) ||
check(parseIdentifier(FnEndName), Loc, "expected identifier"))
check(parseSymbol(FnEndSym), Loc, "expected identifier"))
return true;

if (parseEOL())
return true;

MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName);
MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName);
getStreamer().emitCVInlineLinetableDirective(PrimaryFunctionId, SourceFileId,
SourceLineNum, FnStartSym,
FnEndSym);
Expand All @@ -3938,16 +3931,14 @@ bool AsmParser::parseDirectiveCVDefRange() {
std::vector<std::pair<const MCSymbol *, const MCSymbol *>> Ranges;
while (getLexer().is(AsmToken::Identifier)) {
Loc = getLexer().getLoc();
StringRef GapStartName;
if (parseIdentifier(GapStartName))
MCSymbol *GapStartSym;
if (parseSymbol(GapStartSym))
return Error(Loc, "expected identifier in directive");
MCSymbol *GapStartSym = getContext().getOrCreateSymbol(GapStartName);

Loc = getLexer().getLoc();
StringRef GapEndName;
if (parseIdentifier(GapEndName))
MCSymbol *GapEndSym;
if (parseSymbol(GapEndSym))
return Error(Loc, "expected identifier in directive");
MCSymbol *GapEndSym = getContext().getOrCreateSymbol(GapEndName);

Ranges.push_back({GapStartSym, GapEndSym});
}
Expand Down Expand Up @@ -4084,12 +4075,11 @@ bool AsmParser::parseDirectiveCVFileChecksumOffset() {
/// ::= .cv_fpo_data procsym
bool AsmParser::parseDirectiveCVFPOData() {
SMLoc DirLoc = getLexer().getLoc();
StringRef ProcName;
if (parseIdentifier(ProcName))
MCSymbol *ProcSym;
if (parseSymbol(ProcSym))
return TokError("expected symbol name");
if (parseEOL())
return true;
MCSymbol *ProcSym = getContext().getOrCreateSymbol(ProcName);
getStreamer().emitCVFPOData(ProcSym, DirLoc);
return false;
}
Expand Down Expand Up @@ -4311,15 +4301,12 @@ bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) {
if (Encoding == dwarf::DW_EH_PE_omit)
return false;

StringRef Name;
MCSymbol *Sym;
if (check(!isValidEncoding(Encoding), "unsupported encoding.") ||
parseComma() ||
check(parseIdentifier(Name), "expected identifier in directive") ||
parseEOL())
check(parseSymbol(Sym), "expected identifier in directive") || parseEOL())
return true;

MCSymbol *Sym = getContext().getOrCreateSymbol(Name);

if (IsPersonality)
getStreamer().emitCFIPersonality(Sym, Encoding);
else
Expand Down Expand Up @@ -4920,13 +4907,10 @@ bool AsmParser::parseDirectiveComm(bool IsLocal) {
return true;

SMLoc IDLoc = getLexer().getLoc();
StringRef Name;
if (parseIdentifier(Name))
MCSymbol *Sym;
if (parseSymbol(Sym))
return TokError("expected identifier in directive");

// Handle the identifier as the key symbol.
MCSymbol *Sym = getContext().getOrCreateSymbol(Name);

if (parseComma())
return true;

Expand Down Expand Up @@ -5756,10 +5740,9 @@ bool AsmParser::parseDirectiveAddrsig() {
}

bool AsmParser::parseDirectiveAddrsigSym() {
StringRef Name;
if (check(parseIdentifier(Name), "expected identifier") || parseEOL())
MCSymbol *Sym;
if (check(parseSymbol(Sym), "expected identifier") || parseEOL())
return true;
MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
getStreamer().emitAddrsigSym(Sym);
return false;
}
Expand Down
66 changes: 22 additions & 44 deletions llvm/lib/MC/MCParser/COFFAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,13 +293,11 @@ bool COFFAsmParser::parseDirectiveSymbolAttribute(StringRef Directive, SMLoc) {
assert(Attr != MCSA_Invalid && "unexpected symbol attribute directive!");
if (getLexer().isNot(AsmToken::EndOfStatement)) {
while (true) {
StringRef Name;
MCSymbol *Sym;

if (getParser().parseIdentifier(Name))
if (getParser().parseSymbol(Sym))
return TokError("expected identifier in directive");

MCSymbol *Sym = getContext().getOrCreateSymbol(Name);

getStreamer().emitSymbolAttribute(Sym, Attr);

if (getLexer().is(AsmToken::EndOfStatement))
Expand Down Expand Up @@ -450,13 +448,11 @@ bool COFFAsmParser::parseDirectivePopSection(StringRef, SMLoc) {
}

bool COFFAsmParser::parseDirectiveDef(StringRef, SMLoc) {
StringRef SymbolName;
MCSymbol *Sym;

if (getParser().parseIdentifier(SymbolName))
if (getParser().parseSymbol(Sym))
return TokError("expected identifier in directive");

MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName);

getStreamer().beginCOFFSymbolDef(Sym);

Lex();
Expand Down Expand Up @@ -496,8 +492,8 @@ bool COFFAsmParser::parseDirectiveEndef(StringRef, SMLoc) {
}

bool COFFAsmParser::parseDirectiveSecRel32(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

int64_t Offset = 0;
Expand All @@ -517,17 +513,15 @@ bool COFFAsmParser::parseDirectiveSecRel32(StringRef, SMLoc) {
"invalid '.secrel32' directive offset, can't be less "
"than zero or greater than std::numeric_limits<uint32_t>::max()");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSecRel32(Symbol, Offset);
return false;
}

bool COFFAsmParser::parseDirectiveRVA(StringRef, SMLoc) {
auto parseOp = [&]() -> bool {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

int64_t Offset = 0;
Expand All @@ -544,8 +538,6 @@ bool COFFAsmParser::parseDirectiveRVA(StringRef, SMLoc) {
"than -2147483648 or greater than "
"2147483647");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

getStreamer().emitCOFFImgRel32(Symbol, Offset);
return false;
};
Expand All @@ -556,75 +548,65 @@ bool COFFAsmParser::parseDirectiveRVA(StringRef, SMLoc) {
}

bool COFFAsmParser::parseDirectiveSafeSEH(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSafeSEH(Symbol);
return false;
}

bool COFFAsmParser::parseDirectiveSecIdx(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSectionIndex(Symbol);
return false;
}

bool COFFAsmParser::parseDirectiveSymIdx(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSymbolIndex(Symbol);
return false;
}

bool COFFAsmParser::parseDirectiveSecNum(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSecNumber(Symbol);
return false;
}

bool COFFAsmParser::parseDirectiveSecOffset(StringRef, SMLoc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return TokError("expected identifier in directive");

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitCOFFSecOffset(Symbol);
return false;
Expand Down Expand Up @@ -679,15 +661,13 @@ bool COFFAsmParser::parseDirectiveLinkOnce(StringRef, SMLoc Loc) {
}

bool COFFAsmParser::parseSEHDirectiveStartProc(StringRef, SMLoc Loc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *Symbol;
if (getParser().parseSymbol(Symbol))
return true;

if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitWinCFIStartProc(Symbol, Loc);
return false;
Expand Down Expand Up @@ -718,8 +698,8 @@ bool COFFAsmParser::parseSEHDirectiveEndChained(StringRef, SMLoc Loc) {
}

bool COFFAsmParser::parseSEHDirectiveHandler(StringRef, SMLoc Loc) {
StringRef SymbolID;
if (getParser().parseIdentifier(SymbolID))
MCSymbol *handler;
if (getParser().parseSymbol(handler))
return true;

if (getLexer().isNot(AsmToken::Comma))
Expand All @@ -736,8 +716,6 @@ bool COFFAsmParser::parseSEHDirectiveHandler(StringRef, SMLoc Loc) {
if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in directive");

MCSymbol *handler = getContext().getOrCreateSymbol(SymbolID);

Lex();
getStreamer().emitWinEHHandler(handler, unwind, except, Loc);
return false;
Expand Down
14 changes: 7 additions & 7 deletions llvm/lib/MC/MCParser/COFFMasmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,8 @@ bool COFFMasmParser::parseDirectiveProc(StringRef Directive, SMLoc Loc) {
if (!getStreamer().getCurrentFragment())
return Error(getTok().getLoc(), "expected section directive");

StringRef Label;
if (getParser().parseIdentifier(Label))
MCSymbol *Sym;
if (getParser().parseSymbol(Sym))
return Error(Loc, "expected identifier for procedure");
if (getLexer().is(AsmToken::Identifier)) {
StringRef nextVal = getTok().getString();
Expand All @@ -459,12 +459,12 @@ bool COFFMasmParser::parseDirectiveProc(StringRef Directive, SMLoc Loc) {
nextLoc = getTok().getLoc();
}
}
auto *Sym =
static_cast<MCSymbolCOFF *>(getContext().getOrCreateSymbol(Label));

// Define symbol as simple external function
Sym->setExternal(true);
Sym->setType(COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT);
auto *COFFSym = static_cast<MCSymbolCOFF *>(Sym);
COFFSym->setExternal(true);
COFFSym->setType(COFF::IMAGE_SYM_DTYPE_FUNCTION
<< COFF::SCT_COMPLEX_TYPE_SHIFT);

bool Framed = false;
if (getLexer().is(AsmToken::Identifier) &&
Expand All @@ -475,7 +475,7 @@ bool COFFMasmParser::parseDirectiveProc(StringRef Directive, SMLoc Loc) {
}
getStreamer().emitLabel(Sym, Loc);

CurrentProcedures.push_back(Label);
CurrentProcedures.push_back(Sym->getName());
CurrentProceduresFramed.push_back(Framed);
return false;
}
Expand Down
Loading
Loading