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" 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;