mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 22:20:43 +00:00
llvm-mc: Sketch parsing for .file, .line, and .loc. No streamer hooks for these
yet (I'm not even sure what they do). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78639 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ace63127bc
commit
d0c14d6913
5
test/MC/AsmParser/directive_file.s
Normal file
5
test/MC/AsmParser/directive_file.s
Normal file
@ -0,0 +1,5 @@
|
||||
# RUN: llvm-mc -triple i386-unknown-unknown %s
|
||||
# FIXME: Actually test the output.
|
||||
|
||||
.file "hello"
|
||||
.file 1 "world"
|
5
test/MC/AsmParser/directive_line.s
Normal file
5
test/MC/AsmParser/directive_line.s
Normal file
@ -0,0 +1,5 @@
|
||||
# RUN: llvm-mc -triple i386-unknown-unknown %s
|
||||
# FIXME: Actually test the output.
|
||||
|
||||
.line
|
||||
.line 1
|
8
test/MC/AsmParser/directive_loc.s
Normal file
8
test/MC/AsmParser/directive_loc.s
Normal file
@ -0,0 +1,8 @@
|
||||
# RUN: llvm-mc -triple i386-unknown-unknown %s
|
||||
# FIXME: Actually test the output.
|
||||
|
||||
.file 1 "hello"
|
||||
.loc 1
|
||||
.loc 1 2
|
||||
.loc 1 2 3
|
||||
|
@ -551,6 +551,7 @@ bool AsmParser::ParseStatement() {
|
||||
return ParseDirectiveSpace();
|
||||
|
||||
// Symbol attribute directives
|
||||
|
||||
if (IDVal == ".globl" || IDVal == ".global")
|
||||
return ParseDirectiveSymbolAttribute(MCStreamer::Global);
|
||||
if (IDVal == ".hidden")
|
||||
@ -598,6 +599,15 @@ bool AsmParser::ParseStatement() {
|
||||
if (IDVal == ".load")
|
||||
return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsLoad=*/false);
|
||||
|
||||
// Debugging directives
|
||||
|
||||
if (IDVal == ".file")
|
||||
return ParseDirectiveFile(IDLoc);
|
||||
if (IDVal == ".line")
|
||||
return ParseDirectiveLine(IDLoc);
|
||||
if (IDVal == ".loc")
|
||||
return ParseDirectiveLoc(IDLoc);
|
||||
|
||||
Warning(IDLoc, "ignoring directive for now");
|
||||
EatToEndOfStatement();
|
||||
return false;
|
||||
@ -1439,3 +1449,90 @@ bool AsmParser::ParseDirectiveEndIf(SMLoc DirectiveLoc) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// ParseDirectiveFile
|
||||
/// ::= .file [number] string
|
||||
bool AsmParser::ParseDirectiveFile(SMLoc DirectiveLoc) {
|
||||
// FIXME: I'm not sure what this is.
|
||||
int64_t FileNumber = -1;
|
||||
if (Lexer.is(AsmToken::Integer)) {
|
||||
FileNumber = Lexer.getTok().getIntVal();
|
||||
Lexer.Lex();
|
||||
|
||||
if (FileNumber < 1)
|
||||
return TokError("file number less than one");
|
||||
}
|
||||
|
||||
if (Lexer.isNot(AsmToken::String))
|
||||
return TokError("unexpected token in '.file' directive");
|
||||
|
||||
StringRef FileName = Lexer.getTok().getString();
|
||||
Lexer.Lex();
|
||||
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement))
|
||||
return TokError("unexpected token in '.file' directive");
|
||||
|
||||
// FIXME: Do something with the .file.
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// ParseDirectiveLine
|
||||
/// ::= .line [number]
|
||||
bool AsmParser::ParseDirectiveLine(SMLoc DirectiveLoc) {
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement)) {
|
||||
if (Lexer.isNot(AsmToken::Integer))
|
||||
return TokError("unexpected token in '.line' directive");
|
||||
|
||||
int64_t LineNumber = Lexer.getTok().getIntVal();
|
||||
(void) LineNumber;
|
||||
Lexer.Lex();
|
||||
|
||||
// FIXME: Do something with the .line.
|
||||
}
|
||||
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement))
|
||||
return TokError("unexpected token in '.file' directive");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// ParseDirectiveLoc
|
||||
/// ::= .loc number [number [number]]
|
||||
bool AsmParser::ParseDirectiveLoc(SMLoc DirectiveLoc) {
|
||||
if (Lexer.isNot(AsmToken::Integer))
|
||||
return TokError("unexpected token in '.loc' directive");
|
||||
|
||||
// FIXME: What are these fields?
|
||||
int64_t FileNumber = Lexer.getTok().getIntVal();
|
||||
(void) FileNumber;
|
||||
// FIXME: Validate file.
|
||||
|
||||
Lexer.Lex();
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement)) {
|
||||
if (Lexer.isNot(AsmToken::Integer))
|
||||
return TokError("unexpected token in '.loc' directive");
|
||||
|
||||
int64_t Param2 = Lexer.getTok().getIntVal();
|
||||
(void) Param2;
|
||||
Lexer.Lex();
|
||||
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement)) {
|
||||
if (Lexer.isNot(AsmToken::Integer))
|
||||
return TokError("unexpected token in '.loc' directive");
|
||||
|
||||
int64_t Param3 = Lexer.getTok().getIntVal();
|
||||
(void) Param3;
|
||||
Lexer.Lex();
|
||||
|
||||
// FIXME: Do something with the .loc.
|
||||
}
|
||||
}
|
||||
|
||||
if (Lexer.isNot(AsmToken::EndOfStatement))
|
||||
return TokError("unexpected token in '.file' directive");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -132,6 +132,9 @@ private:
|
||||
bool ParseDirectiveElse(SMLoc DirectiveLoc); // ".else"
|
||||
bool ParseDirectiveEndIf(SMLoc DirectiveLoc); // .endif
|
||||
|
||||
bool ParseDirectiveFile(SMLoc DirectiveLoc); // ".file"
|
||||
bool ParseDirectiveLine(SMLoc DirectiveLoc); // ".line"
|
||||
bool ParseDirectiveLoc(SMLoc DirectiveLoc); // ".loc"
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user