<div dir="ltr">This commit contains a few trailing whitespaces. Can you remove?<div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 13, 2016 at 11:51 AM, Adhemerval Zanella via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: azanella<br>
Date: Wed Apr 13 13:51:11 2016<br>
New Revision: 266227<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=266227&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=266227&view=rev</a><br>
Log:<br>
ELF: Implement --dynamic-list<br>
<br>
This patch implements the --dynamic-list option, which adds a list of<br>
global symbol that either should not be bounded by default definition<br>
when creating shared libraries, or add in dynamic symbol table in the<br>
case of creating executables.<br>
<br>
The patch modifies the ScriptParserBase class to use a list of Token<br>
instead of StringRef, which contains information if the token is a<br>
quoted or unquoted strings. It is used to use a faster search for<br>
exact match symbol name.<br>
<br>
The input file follow a similar format of linker script with some<br>
simplifications (it does not have scope or node names). It leads<br>
to a simplified parser define in DynamicList.{cpp,h}.<br>
<br>
Different from ld/gold neither glob pattern nor mangled names<br>
(extern 'C++') are currently supported.<br>
<br>
Added:<br>
    lld/trunk/ELF/DynamicList.cpp<br>
    lld/trunk/ELF/DynamicList.h<br>
    lld/trunk/test/ELF/dynamic-list.s<br>
    lld/trunk/test/ELF/invalid-dynamic-list.test<br>
Modified:<br>
    lld/trunk/ELF/CMakeLists.txt<br>
    lld/trunk/ELF/Config.h<br>
    lld/trunk/ELF/Driver.cpp<br>
    lld/trunk/ELF/Driver.h<br>
    lld/trunk/ELF/Options.td<br>
    lld/trunk/ELF/SymbolTable.cpp<br>
    lld/trunk/ELF/SymbolTable.h<br>
<br>
Modified: lld/trunk/ELF/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/CMakeLists.txt?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/CMakeLists.txt?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/CMakeLists.txt (original)<br>
+++ lld/trunk/ELF/CMakeLists.txt Wed Apr 13 13:51:11 2016<br>
@@ -5,6 +5,7 @@ add_public_tablegen_target(ELFOptionsTab<br>
 add_lld_library(lldELF<br>
   Driver.cpp<br>
   DriverUtils.cpp<br>
+  DynamicList.cpp<br>
   Error.cpp<br>
   ICF.cpp<br>
   InputFiles.cpp<br>
<br>
Modified: lld/trunk/ELF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Config.h (original)<br>
+++ lld/trunk/ELF/Config.h Wed Apr 13 13:51:11 2016<br>
@@ -48,6 +48,7 @@ struct Configuration {<br>
   llvm::StringRef SoName;<br>
   llvm::StringRef Sysroot;<br>
   std::string RPath;<br>
+  std::vector<llvm::StringRef> DynamicList;<br>
   std::vector<llvm::StringRef> SearchPaths;<br>
   std::vector<llvm::StringRef> Undefined;<br>
   bool AllowMultipleDefinition;<br>
<br>
Modified: lld/trunk/ELF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.cpp (original)<br>
+++ lld/trunk/ELF/Driver.cpp Wed Apr 13 13:51:11 2016<br>
@@ -8,6 +8,7 @@<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 #include "Driver.h"<br>
+#include "DynamicList.h"<br>
 #include "Config.h"<br>
 #include "Error.h"<br>
 #include "ICF.h"<br>
@@ -100,14 +101,10 @@ void LinkerDriver::addFile(StringRef Pat<br>
   using namespace llvm::sys::fs;<br>
   if (Config->Verbose)<br>
     llvm::outs() << Path << "\n";<br>
-  auto MBOrErr = MemoryBuffer::getFile(Path);<br>
-  if (!MBOrErr) {<br>
-    error(MBOrErr, "cannot open " + Path);<br>
+  Optional<MemoryBufferRef> Buffer = readFile(Path);<br>
+  if (!Buffer.hasValue())<br>
     return;<br>
-  }<br>
-  std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;<br>
-  MemoryBufferRef MBRef = MB->getMemBufferRef();<br>
-  OwningMBs.push_back(std::move(MB)); // take MB ownership<br>
+  MemoryBufferRef MBRef = *Buffer;<br>
<br>
   switch (identify_magic(MBRef.getBuffer())) {<br>
   case file_magic::unknown:<br>
@@ -136,6 +133,23 @@ void LinkerDriver::addFile(StringRef Pat<br>
   }<br>
 }<br>
<br>
+Optional<MemoryBufferRef> LinkerDriver::readFile(StringRef Path) {<br>
+  auto MBOrErr = MemoryBuffer::getFile(Path);<br>
+  if (std::error_code EC = MBOrErr.getError()) {<br>
+    error(MBOrErr, "cannot open " + Path);<br>
+    return None;<br>
+  }<br>
+  std::unique_ptr<MemoryBuffer> &MB = *MBOrErr;<br>
+  MemoryBufferRef MBRef = MB->getMemBufferRef();<br>
+  OwningMBs.push_back(std::move(MB)); // take MB ownership<br>
+  return MBRef;<br>
+}<br>
+<br>
+void LinkerDriver::readDynamicList(StringRef Path) {<br>
+  if (Optional<MemoryBufferRef> Buffer = readFile(Path))<br>
+    parseDynamicList(*Buffer);<br>
+}<br>
+<br>
 // Add a given library by searching it from input search paths.<br>
 void LinkerDriver::addLibrary(StringRef Name) {<br>
   std::string Path = searchLibrary(Name);<br>
@@ -351,6 +365,9 @@ void LinkerDriver::readConfigs(opt::Inpu<br>
<br>
   for (auto *Arg : Args.filtered(OPT_undefined))<br>
     Config->Undefined.push_back(Arg->getValue());<br>
+<br>
+  if (Args.hasArg(OPT_dynamic_list))<br>
+    readDynamicList(getString(Args, OPT_dynamic_list));<br>
 }<br>
<br>
 void LinkerDriver::createFiles(opt::InputArgList &Args) {<br>
@@ -437,6 +454,7 @@ template <class ELFT> void LinkerDriver:<br>
<br>
   // Write the result to the file.<br>
   Symtab.scanShlibUndefined();<br>
+  Symtab.scanDynamicList();<br>
   if (Config->GcSections)<br>
     markLive<ELFT>(&Symtab);<br>
   if (Config->ICF)<br>
<br>
Modified: lld/trunk/ELF/Driver.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.h?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.h?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Driver.h (original)<br>
+++ lld/trunk/ELF/Driver.h Wed Apr 13 13:51:11 2016<br>
@@ -12,6 +12,7 @@<br>
<br>
 #include "SymbolTable.h"<br>
 #include "lld/Core/LLVM.h"<br>
+#include "llvm/ADT/Optional.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Option/ArgList.h"<br>
 #include "llvm/Support/raw_ostream.h"<br>
@@ -29,7 +30,9 @@ public:<br>
<br>
 private:<br>
   std::vector<MemoryBufferRef> getArchiveMembers(MemoryBufferRef MB);<br>
+  llvm::Optional<MemoryBufferRef> readFile(StringRef Path);<br>
   void readConfigs(llvm::opt::InputArgList &Args);<br>
+  void readDynamicList(StringRef Path);<br>
   void createFiles(llvm::opt::InputArgList &Args);<br>
   template <class ELFT> void link(llvm::opt::InputArgList &Args);<br>
<br>
<br>
Added: lld/trunk/ELF/DynamicList.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/DynamicList.cpp?rev=266227&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/DynamicList.cpp?rev=266227&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/ELF/DynamicList.cpp (added)<br>
+++ lld/trunk/ELF/DynamicList.cpp Wed Apr 13 13:51:11 2016<br>
@@ -0,0 +1,64 @@<br>
+//===- LinkerScript.cpp ---------------------------------------------------===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file contains the parser/evaluator of the linker script.<br>
+// It does not construct an AST but consume linker script directives directly.<br>
+// Results are written to Driver or Config object.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "DynamicList.h"<br>
+#include "Config.h"<br>
+#include "ScriptParser.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+#include "llvm/Support/Path.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace lld;<br>
+using namespace lld::elf;<br>
+<br>
+// Parse the --dynamic-list argument.  A dynamic list is in the form<br>
+//<br>
+//  { symbol1; symbol2; [...]; symbolN };<br>
+//<br>
+// Multiple groups can be defined in the same file and they are merged<br>
+// in only one definition.<br>
+<br>
+class DynamicListParser final : public ScriptParserBase {<br>
+public:<br>
+  DynamicListParser(StringRef S) : ScriptParserBase(S) {}<br>
+<br>
+  void run() override;<br>
+<br>
+private:<br>
+  void readGroup();<br>
+};<br>
+<br>
+// Parse the default group definition using C language symbol name.<br>
+void DynamicListParser::readGroup() {<br>
+  expect("{");<br>
+  while (!Error) {<br>
+    Config->DynamicList.push_back(next());<br>
+    expect(";");<br>
+    if (peek() == "}") {<br>
+      next();<br>
+      break;<br>
+    }<br>
+  }<br>
+  expect(";");<br>
+}<br>
+<br>
+void DynamicListParser::run() {<br>
+  while (!atEOF())<br>
+    readGroup();<br>
+}<br>
+<br>
+void elf::parseDynamicList(MemoryBufferRef MB) {<br>
+  DynamicListParser(MB.getBuffer()).run();<br>
+}<br>
<br>
Added: lld/trunk/ELF/DynamicList.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/DynamicList.h?rev=266227&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/DynamicList.h?rev=266227&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/ELF/DynamicList.h (added)<br>
+++ lld/trunk/ELF/DynamicList.h Wed Apr 13 13:51:11 2016<br>
@@ -0,0 +1,24 @@<br>
+//===- DynamicList.h --------------------------------------------*- C++ -*-===//<br>
+//<br>
+//                             The LLVM Linker<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLD_ELF_DYNAMIC_LIST_H<br>
+#define LLD_ELF_DYNAMIC_LIST_H<br>
+<br>
+#include "lld/Core/LLVM.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+<br>
+namespace lld {<br>
+namespace elf {<br>
+<br>
+void parseDynamicList(MemoryBufferRef MB);<br>
+<br>
+} // namespace elf<br>
+} // namespace lld<br>
+<br>
+#endif<br>
<br>
Modified: lld/trunk/ELF/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Options.td?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Options.td (original)<br>
+++ lld/trunk/ELF/Options.td Wed Apr 13 13:51:11 2016<br>
@@ -44,6 +44,9 @@ def discard_none : Flag<["-"], "discard-<br>
 def dynamic_linker : Separate<["--", "-"], "dynamic-linker">,<br>
   HelpText<"Which dynamic linker to use">;<br>
<br>
+def dynamic_list : Separate<["--", "-"], "dynamic-list">,<br>
+  HelpText<"Read a list of dynamic symbols">;<br>
+<br>
 def eh_frame_hdr : Flag<["--"], "eh-frame-hdr">,<br>
   HelpText<"Request creation of .eh_frame_hdr section and PT_GNU_EH_FRAME segment header">;<br>
<br>
@@ -175,6 +178,7 @@ def alias_Bstatic_static: Flag<["-"], "s<br>
 def alias_L__library_path : Joined<["--"], "library-path=">, Alias<L>;<br>
 def alias_discard_all_x: Flag<["-"], "x">, Alias<discard_all>;<br>
 def alias_discard_locals_X: Flag<["-"], "X">, Alias<discard_locals>;<br>
+def alias_dynamic_list: Joined<["--", "-"], "dynamic-list=">, Alias<dynamic_list>;<br>
 def alias_entry_e : JoinedOrSeparate<["-"], "e">, Alias<entry>;<br>
 def alias_export_dynamic_E: Flag<["-"], "E">, Alias<export_dynamic>;<br>
 def alias_fini_fini : Joined<["-"], "fini=">, Alias<fini>;<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/SymbolTable.cpp (original)<br>
+++ lld/trunk/ELF/SymbolTable.cpp Wed Apr 13 13:51:11 2016<br>
@@ -339,6 +339,14 @@ template <class ELFT> void SymbolTable<E<br>
           Sym->MustBeInDynSym = true;<br>
 }<br>
<br>
+// This function process the dynamic list option by marking all the symbols<br>
+// to be exported in the dynamic table.<br>
+template <class ELFT> void SymbolTable<ELFT>::scanDynamicList() {<br>
+  for (StringRef S : Config->DynamicList)<br>
+    if (SymbolBody *B = find(S))<br>
+      B->MustBeInDynSym = true;<br>
+}<br>
+<br>
 template class elf::SymbolTable<ELF32LE>;<br>
 template class elf::SymbolTable<ELF32BE>;<br>
 template class elf::SymbolTable<ELF64LE>;<br>
<br>
Modified: lld/trunk/ELF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=266227&r1=266226&r2=266227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=266227&r1=266226&r2=266227&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/SymbolTable.h (original)<br>
+++ lld/trunk/ELF/SymbolTable.h Wed Apr 13 13:51:11 2016<br>
@@ -60,6 +60,7 @@ public:<br>
                                    uint8_t Visibility = llvm::ELF::STV_HIDDEN);<br>
<br>
   void scanShlibUndefined();<br>
+  void scanDynamicList();<br>
   SymbolBody *find(StringRef Name);<br>
   void wrap(StringRef Name);<br>
   InputFile *findFile(SymbolBody *B);<br>
<br>
Added: lld/trunk/test/ELF/dynamic-list.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/dynamic-list.s?rev=266227&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/dynamic-list.s?rev=266227&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/dynamic-list.s (added)<br>
+++ lld/trunk/test/ELF/dynamic-list.s Wed Apr 13 13:51:11 2016<br>
@@ -0,0 +1,104 @@<br>
+## There is some bad quoting interaction between lit's internal shell, which is<br>
+## implemented in Python, and the Cygwin implementations of the Unix utilities.<br>
+## Avoid running these tests on Windows for now by requiring a real shell.<br>
+<br>
+# REQUIRES: shell<br>
+<br>
+# REQUIRES: x86<br>
+<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/shared.s -o %t2.o<br>
+# RUN: ld.lld -shared %t2.o -soname shared -o %t2.so<br>
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t<br>
+<br>
+## Check exporting only one symbol.<br>
+# RUN: echo "{ foo1; };" > %t.list<br>
+# RUN: ld.lld --dynamic-list %t.list %t %t2.so -o %t.exe<br>
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck %s<br>
+<br>
+## And now using quoted strings (the output is the same since it does<br>
+## use any wildcard character).<br>
+# RUN: echo "{ \"foo1\"; };" > %t.list<br>
+# RUN: ld.lld --dynamic-list %t.list %t %t2.so -o %t.exe<br>
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck %s<br>
+<br>
+# CHECK:      DynamicSymbols [<br>
+# CHECK-NEXT:   Symbol {<br>
+# CHECK-NEXT:     Name: @ (0)<br>
+# CHECK-NEXT:     Value: 0x0<br>
+# CHECK-NEXT:     Size: 0<br>
+# CHECK-NEXT:     Binding: Local<br>
+# CHECK-NEXT:     Type: None<br>
+# CHECK-NEXT:     Other: 0<br>
+# CHECK-NEXT:     Section: Undefined<br>
+# CHECK-NEXT:   }<br>
+# CHECK-NEXT:   Symbol {<br>
+# CHECK-NEXT:     Name: foo1@ (1)<br>
+# CHECK-NEXT:     Value: 0x11000<br>
+# CHECK-NEXT:     Size: 0<br>
+# CHECK-NEXT:     Binding: Global (0x1)<br>
+# CHECK-NEXT:     Type: None (0x0)<br>
+# CHECK-NEXT:     Other: 0<br>
+# CHECK-NEXT:     Section: .text (0x4)<br>
+# CHECK-NEXT:   }<br>
+# CHECK-NEXT: ]<br>
+<br>
+<br>
+## Now export all the foo1, foo2, and foo31 symbols<br>
+# RUN: echo "{ foo1; foo2; foo31; };" > %t.list<br>
+# RUN: ld.lld --dynamic-list %t.list %t %t2.so -o %t.exe<br>
+# RUN: llvm-readobj -dyn-symbols %t.exe | FileCheck -check-prefix=CHECK2 %s<br>
+<br>
+# CHECK2:      DynamicSymbols [<br>
+# CHECK2-NEXT:   Symbol {<br>
+# CHECK2-NEXT:     Name: @ (0)<br>
+# CHECK2-NEXT:     Value: 0x0<br>
+# CHECK2-NEXT:     Size: 0<br>
+# CHECK2-NEXT:     Binding: Local<br>
+# CHECK2-NEXT:     Type: None<br>
+# CHECK2-NEXT:     Other: 0<br>
+# CHECK2-NEXT:     Section: Undefined<br>
+# CHECK2-NEXT:   }<br>
+# CHECK2-NEXT:   Symbol {<br>
+# CHECK2-NEXT:     Name: foo1@ (1)<br>
+# CHECK2-NEXT:     Value: 0x11000<br>
+# CHECK2-NEXT:     Size: 0<br>
+# CHECK2-NEXT:     Binding: Global (0x1)<br>
+# CHECK2-NEXT:     Type: None (0x0)<br>
+# CHECK2-NEXT:     Other: 0<br>
+# CHECK2-NEXT:     Section: .text (0x4)<br>
+# CHECK2-NEXT:   }<br>
+# CHECK2-NEXT:   Symbol {<br>
+# CHECK2-NEXT:     Name: foo2@ (6)<br>
+# CHECK2-NEXT:     Value: 0x11001<br>
+# CHECK2-NEXT:     Size: 0<br>
+# CHECK2-NEXT:     Binding: Global (0x1)<br>
+# CHECK2-NEXT:     Type: None (0x0)<br>
+# CHECK2-NEXT:     Other: 0<br>
+# CHECK2-NEXT:     Section: .text (0x4)<br>
+# CHECK2-NEXT:   }<br>
+# CHECK2-NEXT:   Symbol {<br>
+# CHECK2-NEXT:     Name: foo31@ (11)<br>
+# CHECK2-NEXT:     Value: 0x11002<br>
+# CHECK2-NEXT:     Size: 0<br>
+# CHECK2-NEXT:     Binding: Global (0x1)<br>
+# CHECK2-NEXT:     Type: None (0x0)<br>
+# CHECK2-NEXT:     Other: 0<br>
+# CHECK2-NEXT:     Section: .text (0x4)<br>
+# CHECK2-NEXT:   }<br>
+# CHECK2-NEXT: ]<br>
+<br>
+.globl foo1<br>
+foo1:<br>
+  ret<br>
+<br>
+.globl foo2<br>
+foo2:<br>
+  ret<br>
+<br>
+.globl foo31<br>
+foo31:<br>
+  ret<br>
+<br>
+.globl _start<br>
+_start:<br>
+  retq<br>
<br>
Added: lld/trunk/test/ELF/invalid-dynamic-list.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid-dynamic-list.test?rev=266227&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/invalid-dynamic-list.test?rev=266227&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/ELF/invalid-dynamic-list.test (added)<br>
+++ lld/trunk/test/ELF/invalid-dynamic-list.test Wed Apr 13 13:51:11 2016<br>
@@ -0,0 +1,37 @@<br>
+## Different "echo" commands on Windows interpret quoted strings and<br>
+## wildcards in similar but different way (On Windows, ARGV tokenization<br>
+## and wildcard expansion are not done by the shell but by each command.)<br>
+## Because of that reason, this test fails on some Windows environment.<br>
+## We can't write quoted strings that are interpreted the same way<br>
+## by all echo commands. So, we don't want to run this on Windows.<br>
+<br>
+# REQUIRES: shell<br>
+<br>
+# RUN: mkdir -p %t.dir<br>
+<br>
+# RUN: echo foobar > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR1 %s<br>
+# ERR1: line 1: { expected, but got foobar<br>
+<br>
+# RUN: echo "{ foobar;" > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR2 %s<br>
+# ERR2: line 1: unexpected EOF<br>
+<br>
+## Missing ';' before '}'<br>
+# RUN: echo "{ foobar }" > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR3 %s<br>
+# ERR3: line 1: ; expected, but got }<br>
+<br>
+## Missing final ';'<br>
+# RUN: echo "{ foobar; }" > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR4 %s<br>
+# ERR4: line 1: unexpected EOF<br>
+<br>
+## Missing \" in foobar definition<br>
+# RUN echo "{ \"foobar; };" > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR5 %s<br>
+# ERR5: line 1: unexpected EOF<br>
+<br>
+# RUN: echo "{ extern \"BOGUS\" { test }; };" > %t1<br>
+# RUN: not ld.lld --dynamic-list %t1 2>&1 | FileCheck -check-prefix=ERR6 %s<br>
+# ERR6: line 1: ; expected, but got BOGUS<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>