diff options
author | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-09-05 19:14:26 +0000 |
---|---|---|
committer | Yunzhong Gao <Yunzhong_Gao@playstation.sony.com> | 2013-09-05 19:14:26 +0000 |
commit | ed119820f223401b0c64769759eafc46de30a9da (patch) | |
tree | 19e93cde057e3180059e8e7b9ca786487908f853 | |
parent | bc66071baa3153ba95d673b8084383835221eef6 (diff) | |
download | external_llvm-ed119820f223401b0c64769759eafc46de30a9da.zip external_llvm-ed119820f223401b0c64769759eafc46de30a9da.tar.gz external_llvm-ed119820f223401b0c64769759eafc46de30a9da.tar.bz2 |
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
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 28 | ||||
-rw-r--r-- | test/MC/AsmParser/directive_file.s | 2 | ||||
-rw-r--r-- | test/MC/AsmParser/directive_incbin.s | 2 | ||||
-rw-r--r-- | test/MC/AsmParser/directive_include.s | 2 |
4 files changed, 19 insertions, 15 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 31a09a9..ae88a3e 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -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 + "'"); diff --git a/test/MC/AsmParser/directive_file.s b/test/MC/AsmParser/directive_file.s index 121890e..9b99e0f 100644 --- a/test/MC/AsmParser/directive_file.s +++ b/test/MC/AsmParser/directive_file.s @@ -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" diff --git a/test/MC/AsmParser/directive_incbin.s b/test/MC/AsmParser/directive_incbin.s index 55f9c79..ed4e27a 100644 --- a/test/MC/AsmParser/directive_incbin.s +++ b/test/MC/AsmParser/directive_incbin.s @@ -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" diff --git a/test/MC/AsmParser/directive_include.s b/test/MC/AsmParser/directive_include.s index fabd941..f53bc67 100644 --- a/test/MC/AsmParser/directive_include.s +++ b/test/MC/AsmParser/directive_include.s @@ -5,5 +5,5 @@ # CHECK: a = 0 # CHECK: TESTB: TESTA: - .include "directive_set.s" + .include "directive\137set.s" # "\137" is underscore "_" TESTB: |