aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-08-11 04:24:50 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-08-11 04:24:50 +0000
commitd0c14d69134473f38b84205e9d556234b2d0c0ad (patch)
treef819c7fcccfa9c519b26c7bdedbccd3833d08210 /tools
parentace63127bc7501d4d7707f744cdae09894342aa9 (diff)
downloadexternal_llvm-d0c14d69134473f38b84205e9d556234b2d0c0ad.zip
external_llvm-d0c14d69134473f38b84205e9d556234b2d0c0ad.tar.gz
external_llvm-d0c14d69134473f38b84205e9d556234b2d0c0ad.tar.bz2
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
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-mc/AsmParser.cpp97
-rw-r--r--tools/llvm-mc/AsmParser.h3
2 files changed, 100 insertions, 0 deletions
diff --git a/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp
index b4fdd83..b766830 100644
--- a/tools/llvm-mc/AsmParser.cpp
+++ b/tools/llvm-mc/AsmParser.cpp
@@ -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;
+}
+
diff --git a/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h
index 646001c..55efa84 100644
--- a/tools/llvm-mc/AsmParser.h
+++ b/tools/llvm-mc/AsmParser.h
@@ -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