diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2016-01-29 19:24:12 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2016-01-29 19:24:12 +0000 |
| commit | 6fcbd7e909b9e8bc35d51b58faed52b10e39eb75 (patch) | |
| tree | 7b07a7d1a345d0d97976c53d3fe2f46cc0af3dfb /llvm/lib/MC/MCParser | |
| parent | ad0e791e0b9e8ec77d8cbd0383b8ebf4caa17ef5 (diff) | |
| download | bcm5719-llvm-6fcbd7e909b9e8bc35d51b58faed52b10e39eb75.tar.gz bcm5719-llvm-6fcbd7e909b9e8bc35d51b58faed52b10e39eb75.zip | |
[CodeView] Implement .cv_inline_linetable
This support is _very_ rudimentary, just enough to get some basic data
into the CodeView debug section.
Left to do is:
- Use the combined opcodes to save space.
- Do something about code offsets.
llvm-svn: 259230
Diffstat (limited to 'llvm/lib/MC/MCParser')
| -rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 360de5db883..621618a5666 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -357,8 +357,8 @@ private: DK_IFNB, DK_IFC, DK_IFEQS, DK_IFNC, DK_IFNES, DK_IFDEF, DK_IFNDEF, DK_IFNOTDEF, DK_ELSEIF, DK_ELSE, DK_ENDIF, DK_SPACE, DK_SKIP, DK_FILE, DK_LINE, DK_LOC, DK_STABS, - DK_CV_FILE, DK_CV_LOC, DK_CV_LINETABLE, DK_CV_STRINGTABLE, - DK_CV_FILECHECKSUMS, + DK_CV_FILE, DK_CV_LOC, DK_CV_LINETABLE, DK_CV_INLINE_LINETABLE, + DK_CV_STRINGTABLE, DK_CV_FILECHECKSUMS, DK_CFI_SECTIONS, DK_CFI_STARTPROC, DK_CFI_ENDPROC, DK_CFI_DEF_CFA, DK_CFI_DEF_CFA_OFFSET, DK_CFI_ADJUST_CFA_OFFSET, DK_CFI_DEF_CFA_REGISTER, DK_CFI_OFFSET, DK_CFI_REL_OFFSET, DK_CFI_PERSONALITY, DK_CFI_LSDA, @@ -396,10 +396,11 @@ private: bool parseDirectiveLoc(); bool parseDirectiveStabs(); - // ".cv_file", ".cv_loc", ".cv_linetable" + // ".cv_file", ".cv_loc", ".cv_linetable", "cv_inline_linetable" bool parseDirectiveCVFile(); bool parseDirectiveCVLoc(); bool parseDirectiveCVLinetable(); + bool parseDirectiveCVInlineLinetable(); bool parseDirectiveCVStringTable(); bool parseDirectiveCVFileChecksums(); @@ -1653,6 +1654,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, return parseDirectiveCVLoc(); case DK_CV_LINETABLE: return parseDirectiveCVLinetable(); + case DK_CV_INLINE_LINETABLE: + return parseDirectiveCVInlineLinetable(); case DK_CV_STRINGTABLE: return parseDirectiveCVStringTable(); case DK_CV_FILECHECKSUMS: @@ -3225,6 +3228,51 @@ bool AsmParser::parseDirectiveCVLinetable() { return false; } +/// parseDirectiveCVInlineLinetable +/// ::= .cv_inline_linetable PrimaryFunctionId FileId LineNum +/// ("contains" SecondaryFunctionId+)? +bool AsmParser::parseDirectiveCVInlineLinetable() { + int64_t PrimaryFunctionId = getTok().getIntVal(); + if (PrimaryFunctionId < 0) + return TokError( + "function id less than zero in '.cv_inline_linetable' directive"); + Lex(); + + int64_t SourceFileId = getTok().getIntVal(); + if (SourceFileId <= 0) + return TokError( + "File id less than zero in '.cv_inline_linetable' directive"); + Lex(); + + int64_t SourceLineNum = getTok().getIntVal(); + if (SourceLineNum < 0) + return TokError( + "Line number less than zero in '.cv_inline_linetable' directive"); + Lex(); + + SmallVector<unsigned, 8> SecondaryFunctionIds; + if (getLexer().is(AsmToken::Identifier)) { + if (getTok().getIdentifier() != "contains") + return TokError( + "unexpected identifier in '.cv_inline_linetable' directive"); + Lex(); + + while (getLexer().isNot(AsmToken::EndOfStatement)) { + int64_t SecondaryFunctionId = getTok().getIntVal(); + if (SecondaryFunctionId < 0) + return TokError( + "function id less than zero in '.cv_inline_linetable' directive"); + Lex(); + + SecondaryFunctionIds.push_back(SecondaryFunctionId); + } + } + + getStreamer().EmitCVInlineLinetableDirective( + PrimaryFunctionId, SourceFileId, SourceLineNum, SecondaryFunctionIds); + return false; +} + /// parseDirectiveCVStringTable /// ::= .cv_stringtable bool AsmParser::parseDirectiveCVStringTable() { @@ -4553,6 +4601,7 @@ void AsmParser::initializeDirectiveKindMap() { DirectiveKindMap[".cv_file"] = DK_CV_FILE; DirectiveKindMap[".cv_loc"] = DK_CV_LOC; DirectiveKindMap[".cv_linetable"] = DK_CV_LINETABLE; + DirectiveKindMap[".cv_inline_linetable"] = DK_CV_INLINE_LINETABLE; DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE; DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS; DirectiveKindMap[".sleb128"] = DK_SLEB128; |

