[PATCH] D52014: [LLD] [COFF] Allow embedded directives to be separated by null bytes
Martin Storsjö via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 13 00:10:46 PDT 2018
mstorsjo created this revision.
mstorsjo added reviewers: ruiu, rnk, zturner, pcc.
Herald added a subscriber: hiraditya.
The PE spec says that they will be separated by spaces, but link.exe handles it just fine if they are separated by null bytes as well.
Since these directives are parsed and split by TokenizeWindowsCommandLine, this function needs to learn to treat null bytes as separators - this patch makes that unconditional, but at worst we might need to make it an optional feature, only used when parsing .drectve.
Repository:
rL LLVM
https://reviews.llvm.org/D52014
Files:
lld/test/COFF/directives.s
llvm/lib/Support/CommandLine.cpp
Index: llvm/lib/Support/CommandLine.cpp
===================================================================
--- llvm/lib/Support/CommandLine.cpp
+++ llvm/lib/Support/CommandLine.cpp
@@ -693,6 +693,10 @@
return C == ' ' || C == '\t' || C == '\r' || C == '\n';
}
+static bool isWhitespaceOrNull(char C) {
+ return isWhitespace(C) || C == '\0';
+}
+
static bool isQuote(char C) { return C == '\"' || C == '\''; }
void cl::TokenizeGNUCommandLine(StringRef Src, StringSaver &Saver,
@@ -808,7 +812,7 @@
// INIT state indicates that the current input index is at the start of
// the string or between tokens.
if (State == INIT) {
- if (isWhitespace(C)) {
+ if (isWhitespaceOrNull(C)) {
// Mark the end of lines in response files
if (MarkEOLs && C == '\n')
NewArgv.push_back(nullptr);
@@ -832,7 +836,7 @@
// quotes.
if (State == UNQUOTED) {
// Whitespace means the end of the token.
- if (isWhitespace(C)) {
+ if (isWhitespaceOrNull(C)) {
NewArgv.push_back(Saver.save(StringRef(Token)).data());
Token.clear();
State = INIT;
Index: lld/test/COFF/directives.s
===================================================================
--- /dev/null
+++ lld/test/COFF/directives.s
@@ -0,0 +1,46 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -triple=x86_64-windows %s -filetype=obj -o %t.obj
+
+# RUN: lld-link -dll -out:%t.dll -entry:entry %t.obj -subsystem:console
+# RUN: llvm-objdump -p %t.dll | FileCheck %s
+
+# CHECK: Export Table:
+# CHECK: DLL name: directives.s.tmp.dll
+# CHECK: Ordinal RVA Name
+# CHECK-NEXT: 0 0
+# CHECK-NEXT: 1 0x1000 exportfn1
+# CHECK-NEXT: 2 0x1000 exportfn2
+# CHECK-NEXT: 3 0x1000 exportfn3
+# CHECK-NEXT: 4 0x1000 exportfn4
+# CHECK-NEXT: 5 0x1000 exportfn5
+# CHECK-NEXT: 6 0x1000 exportfn6
+
+ .global entry
+ .global exportfn1
+ .global exportfn2
+ .global exportfn3
+ .global exportfn4
+ .global exportfn5
+ .global exportfn6
+ .text
+entry:
+exportfn1:
+exportfn2:
+exportfn3:
+exportfn4:
+exportfn5:
+exportfn6:
+ ret
+ .section .drectve
+# Test that directive strings can be separated by any combination of
+# spaces and null bytes.
+ .ascii "-export:exportfn1 "
+ .asciz "-export:exportfn2"
+ .asciz "-export:exportfn3"
+ .asciz "-export:exportfn4 "
+ .byte 0
+ .ascii " "
+ .byte 0
+ .asciz "-export:exportfn5"
+ .asciz " -export:exportfn6"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52014.165206.patch
Type: text/x-patch
Size: 2487 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180913/70e271c3/attachment.bin>
More information about the llvm-commits
mailing list