[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