Improve handling of .file, .include and .incbin directives to

allow escaped octal character sequences.

The patch was discussed in Phabricator. See:
http://llvm-reviews.chandlerc.com/D1289



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190089 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yunzhong Gao 2013-09-05 19:14:26 +00:00
parent bc66071baa
commit ed119820f2
4 changed files with 19 additions and 15 deletions

View File

@ -2550,17 +2550,21 @@ bool AsmParser::ParseDirectiveFile(SMLoc DirectiveLoc) {
return TokError("unexpected token in '.file' directive");
// Usually the directory and filename together, otherwise just the directory.
StringRef Path = getTok().getString();
Path = Path.substr(1, Path.size()-2);
// Allow the strings to have escaped octal character sequence.
std::string Path = getTok().getString();
if (parseEscapedString(Path))
return true;
Lex();
StringRef Directory;
StringRef Filename;
std::string FilenameData;
if (getLexer().is(AsmToken::String)) {
if (FileNumber == -1)
return TokError("explicit path specified, but no file number");
Filename = getTok().getString();
Filename = Filename.substr(1, Filename.size()-2);
if (parseEscapedString(FilenameData))
return true;
Filename = FilenameData;
Directory = Path;
Lex();
} else {
@ -3496,16 +3500,16 @@ bool AsmParser::ParseDirectiveInclude() {
if (getLexer().isNot(AsmToken::String))
return TokError("expected string in '.include' directive");
std::string Filename = getTok().getString();
// Allow the strings to have escaped octal character sequence.
std::string Filename;
if (parseEscapedString(Filename))
return true;
SMLoc IncludeLoc = getLexer().getLoc();
Lex();
if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in '.include' directive");
// Strip the quotes.
Filename = Filename.substr(1, Filename.size()-2);
// Attempt to switch the lexer to the included file before consuming the end
// of statement to avoid losing it when we switch.
if (EnterIncludeFile(Filename)) {
@ -3522,16 +3526,16 @@ bool AsmParser::ParseDirectiveIncbin() {
if (getLexer().isNot(AsmToken::String))
return TokError("expected string in '.incbin' directive");
std::string Filename = getTok().getString();
// Allow the strings to have escaped octal character sequence.
std::string Filename;
if (parseEscapedString(Filename))
return true;
SMLoc IncbinLoc = getLexer().getLoc();
Lex();
if (getLexer().isNot(AsmToken::EndOfStatement))
return TokError("unexpected token in '.incbin' directive");
// Strip the quotes.
Filename = Filename.substr(1, Filename.size()-2);
// Attempt to process the included file.
if (ProcessIncbinFile(Filename)) {
Error(IncbinLoc, "Could not find incbin file '" + Filename + "'");

View File

@ -1,7 +1,7 @@
# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
.file "hello"
.file 1 "world"
.file 1 "worl\144" # "\144" is "d"
.file 2 "directory" "file"
# CHECK: .file "hello"

View File

@ -1,6 +1,6 @@
# RUN: llvm-mc -triple i386-unknown-unknown %s -I %p | FileCheck %s
.data
.incbin "incbin_abcd"
.incbin "incbin\137abcd" # "\137" is underscore "_"
# CHECK: .ascii "abcd\n"

View File

@ -5,5 +5,5 @@
# CHECK: a = 0
# CHECK: TESTB:
TESTA:
.include "directive_set.s"
.include "directive\137set.s" # "\137" is underscore "_"
TESTB: