summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Support/CommandLine.cpp12
-rw-r--r--llvm/test/Other/Inputs/utf8-bom-response1
-rw-r--r--llvm/test/Other/Inputs/utf8-response1
-rw-r--r--llvm/test/Other/ResponseFile.ll5
4 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp
index a774421b26c..b4e32257a01 100644
--- a/llvm/lib/Support/CommandLine.cpp
+++ b/llvm/lib/Support/CommandLine.cpp
@@ -655,6 +655,13 @@ void cl::TokenizeWindowsCommandLine(StringRef Src, StringSaver &Saver,
NewArgv.push_back(nullptr);
}
+// It is called byte order marker but the UTF-8 BOM is actually not affected
+// by the host system's endianness.
+static bool hasUTF8ByteOrderMark(ArrayRef<char> S) {
+ return (S.size() >= 3 &&
+ S[0] == '\xef' && S[1] == '\xbb' && S[2] == '\xbf');
+}
+
static bool ExpandResponseFile(const char *FName, StringSaver &Saver,
TokenizerCallback Tokenizer,
SmallVectorImpl<const char *> &NewArgv,
@@ -674,6 +681,11 @@ static bool ExpandResponseFile(const char *FName, StringSaver &Saver,
return false;
Str = StringRef(UTF8Buf);
}
+ // If we see UTF-8 BOM sequence at the beginning of a file, we shall remove
+ // these bytes before parsing.
+ // Reference: http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark
+ else if (hasUTF8ByteOrderMark(BufRef))
+ Str = StringRef(BufRef.data() + 3, BufRef.size() - 3);
// Tokenize the contents into NewArgv.
Tokenizer(Str, Saver, NewArgv, MarkEOLs);
diff --git a/llvm/test/Other/Inputs/utf8-bom-response b/llvm/test/Other/Inputs/utf8-bom-response
new file mode 100644
index 00000000000..9dae3158ecd
--- /dev/null
+++ b/llvm/test/Other/Inputs/utf8-bom-response
@@ -0,0 +1 @@
+-help
diff --git a/llvm/test/Other/Inputs/utf8-response b/llvm/test/Other/Inputs/utf8-response
new file mode 100644
index 00000000000..97f455ac44e
--- /dev/null
+++ b/llvm/test/Other/Inputs/utf8-response
@@ -0,0 +1 @@
+-help
diff --git a/llvm/test/Other/ResponseFile.ll b/llvm/test/Other/ResponseFile.ll
index 914e5480f20..92648b86f5f 100644
--- a/llvm/test/Other/ResponseFile.ll
+++ b/llvm/test/Other/ResponseFile.ll
@@ -6,6 +6,11 @@
; RUN: llvm-as @%t.list2 -o %t.bc
; RUN: llvm-nm %t.bc 2>&1 | FileCheck %s
+; When the response file begins with UTF8 BOM sequence, we shall remove them.
+; Neither command below should return a "Could not open input file" error.
+; RUN: llvm-as @%S/Inputs/utf8-response > /dev/null
+; RUN: llvm-as @%S/Inputs/utf8-bom-response > /dev/null
+
; CHECK: T foobar
define void @foobar() {
OpenPOWER on IntegriCloud