mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
bc66071baa
commit
ed119820f2
@ -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 + "'");
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -5,5 +5,5 @@
|
||||
# CHECK: a = 0
|
||||
# CHECK: TESTB:
|
||||
TESTA:
|
||||
.include "directive_set.s"
|
||||
.include "directive\137set.s" # "\137" is underscore "_"
|
||||
TESTB:
|
||||
|
Loading…
Reference in New Issue
Block a user