svn commit: r319531 - in vendor/lld/dist: COFF ELF test/COFF test/ELF

Dimitry Andric dim at FreeBSD.org
Sat Jun 3 15:21:21 UTC 2017


Author: dim
Date: Sat Jun  3 15:21:18 2017
New Revision: 319531
URL: https://svnweb.freebsd.org/changeset/base/319531

Log:
  Vendor import of lld trunk r304659:
  https://llvm.org/svn/llvm-project/lld/trunk@304659

Added:
  vendor/lld/dist/test/COFF/def-export-stdcall.s   (contents, props changed)
Modified:
  vendor/lld/dist/COFF/DLL.cpp
  vendor/lld/dist/COFF/DLL.h
  vendor/lld/dist/COFF/Driver.cpp
  vendor/lld/dist/COFF/PDB.cpp
  vendor/lld/dist/ELF/LinkerScript.cpp
  vendor/lld/dist/ELF/OutputSections.cpp
  vendor/lld/dist/ELF/OutputSections.h
  vendor/lld/dist/ELF/Writer.cpp
  vendor/lld/dist/test/COFF/armnt-imports.test
  vendor/lld/dist/test/COFF/hello32.test
  vendor/lld/dist/test/COFF/imports.test
  vendor/lld/dist/test/ELF/emit-relocs.s

Modified: vendor/lld/dist/COFF/DLL.cpp
==============================================================================
--- vendor/lld/dist/COFF/DLL.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/COFF/DLL.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -100,17 +100,13 @@ class ImportDirectoryChunk : public Chunk { (public)
 
   void writeTo(uint8_t *Buf) const override {
     auto *E = (coff_import_directory_table_entry *)(Buf + OutputSectionOff);
+    E->ImportLookupTableRVA = LookupTab->getRVA();
     E->NameRVA = DLLName->getRVA();
-
-    // The import descriptor table contains two pointers to
-    // the tables describing dllimported symbols. But the
-    // Windows loader actually uses only one. So we create
-    // only one table and set both fields to its address.
-    E->ImportLookupTableRVA = AddressTab->getRVA();
     E->ImportAddressTableRVA = AddressTab->getRVA();
   }
 
   Chunk *DLLName;
+  Chunk *LookupTab;
   Chunk *AddressTab;
 };
 
@@ -392,6 +388,7 @@ std::vector<Chunk *> IdataContents::getChunks() {
   // Add each type in the correct order.
   std::vector<Chunk *> V;
   V.insert(V.end(), Dirs.begin(), Dirs.end());
+  V.insert(V.end(), Lookups.begin(), Lookups.end());
   V.insert(V.end(), Addresses.begin(), Addresses.end());
   V.insert(V.end(), Hints.begin(), Hints.end());
   V.insert(V.end(), DLLNames.begin(), DLLNames.end());
@@ -407,18 +404,21 @@ void IdataContents::create() {
     // we need to create HintName chunks to store the names.
     // If they don't (if they are import-by-ordinals), we store only
     // ordinal values to the table.
-    size_t Base = Addresses.size();
+    size_t Base = Lookups.size();
     for (DefinedImportData *S : Syms) {
       uint16_t Ord = S->getOrdinal();
       if (S->getExternalName().empty()) {
+        Lookups.push_back(make<OrdinalOnlyChunk>(Ord));
         Addresses.push_back(make<OrdinalOnlyChunk>(Ord));
         continue;
       }
       auto *C = make<HintNameChunk>(S->getExternalName(), Ord);
+      Lookups.push_back(make<LookupChunk>(C));
       Addresses.push_back(make<LookupChunk>(C));
       Hints.push_back(C);
     }
     // Terminate with null values.
+    Lookups.push_back(make<NullChunk>(ptrSize()));
     Addresses.push_back(make<NullChunk>(ptrSize()));
 
     for (int I = 0, E = Syms.size(); I < E; ++I)
@@ -427,6 +427,7 @@ void IdataContents::create() {
     // Create the import table header.
     DLLNames.push_back(make<StringChunk>(Syms[0]->getDLLName()));
     auto *Dir = make<ImportDirectoryChunk>(DLLNames.back());
+    Dir->LookupTab = Lookups[Base];
     Dir->AddressTab = Addresses[Base];
     Dirs.push_back(Dir);
   }

Modified: vendor/lld/dist/COFF/DLL.h
==============================================================================
--- vendor/lld/dist/COFF/DLL.h	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/COFF/DLL.h	Sat Jun  3 15:21:18 2017	(r319531)
@@ -36,6 +36,7 @@ class IdataContents { (private)
 
   std::vector<DefinedImportData *> Imports;
   std::vector<Chunk *> Dirs;
+  std::vector<Chunk *> Lookups;
   std::vector<Chunk *> Addresses;
   std::vector<Chunk *> Hints;
   std::vector<Chunk *> DLLNames;

Modified: vendor/lld/dist/COFF/Driver.cpp
==============================================================================
--- vendor/lld/dist/COFF/Driver.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/COFF/Driver.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -434,7 +434,8 @@ std::vector<COFFShortExport> createCOFFShortExportFrom
   std::vector<COFFShortExport> Exports;
   for (Export &E1 : Config->Exports) {
     COFFShortExport E2;
-    E2.Name = E1.Name;
+    // Use SymbolName, which will have any stdcall or fastcall qualifiers.
+    E2.Name = E1.SymbolName;
     E2.ExtName = E1.ExtName;
     E2.Ordinal = E1.Ordinal;
     E2.Noname = E1.Noname;

Modified: vendor/lld/dist/COFF/PDB.cpp
==============================================================================
--- vendor/lld/dist/COFF/PDB.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/COFF/PDB.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -157,7 +157,8 @@ static void dumpDebugS(ScopedPrinter &W, ObjectFile *F
     fatal(EC, "StreamReader.readArray<CVSymbolArray> failed");
 
   TypeDatabase TDB(0);
-  CVSymbolDumper SymbolDumper(W, TDB, nullptr, false);
+  CVSymbolDumper SymbolDumper(W, TDB, CodeViewContainer::ObjectFile, nullptr,
+                              false);
   if (auto EC = SymbolDumper.dump(Symbols))
     fatal(EC, "CVSymbolDumper::dump failed");
 }

Modified: vendor/lld/dist/ELF/LinkerScript.cpp
==============================================================================
--- vendor/lld/dist/ELF/LinkerScript.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/ELF/LinkerScript.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -463,12 +463,7 @@ void LinkerScript::fabricateDefaultCommands() {
     // Prefer user supplied address over additional alignment constraint
     auto I = Config->SectionStartMap.find(Sec->Name);
     if (I != Config->SectionStartMap.end())
-      Commands.push_back(
-          make<SymbolAssignment>(".", [=] { return I->second; }, ""));
-    else if (Sec->PageAlign)
-      OSCmd->AddrExpr = [=] {
-        return alignTo(Script->getDot(), Config->MaxPageSize);
-      };
+      OSCmd->AddrExpr = [=] { return I->second; };
 
     Commands.push_back(OSCmd);
     if (Sec->Sections.size()) {

Modified: vendor/lld/dist/ELF/OutputSections.cpp
==============================================================================
--- vendor/lld/dist/ELF/OutputSections.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/ELF/OutputSections.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -128,6 +128,7 @@ template <class ELFT> void OutputSection::finalize() {
   // the section to which the relocation applies.
   InputSectionBase *S = First->getRelocatedSection();
   Info = S->getOutputSection()->SectionIndex;
+  Flags |= SHF_INFO_LINK;
 }
 
 static uint64_t updateOffset(uint64_t Off, InputSection *S) {

Modified: vendor/lld/dist/ELF/OutputSections.h
==============================================================================
--- vendor/lld/dist/ELF/OutputSections.h	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/ELF/OutputSections.h	Sat Jun  3 15:21:18 2017	(r319531)
@@ -59,10 +59,6 @@ class OutputSection final : public SectionBase { (publ
       Alignment = Val;
   }
 
-  // If true, this section will be page aligned on disk.
-  // Typically the first section of each PT_LOAD segment has this flag.
-  bool PageAlign = false;
-
   // Pointer to the first section in PT_LOAD segment, which this section
   // also resides in. This field is used to correctly compute file offset
   // of a section. When two sections share the same load segment, difference

Modified: vendor/lld/dist/ELF/Writer.cpp
==============================================================================
--- vendor/lld/dist/ELF/Writer.cpp	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/ELF/Writer.cpp	Sat Jun  3 15:21:18 2017	(r319531)
@@ -257,19 +257,20 @@ template <class ELFT> void Writer<ELFT>::run() {
   if (ErrorCount)
     return;
 
-  if (!Script->Opt.HasSections) {
-    if (!Config->Relocatable)
-      fixSectionAlignments();
+  if (!Script->Opt.HasSections)
     Script->fabricateDefaultCommands();
-  } else {
+  else
     Script->synchronize();
-  }
 
   for (BaseCommand *Base : Script->Opt.Commands)
     if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base))
       OutputSectionCommands.push_back(Cmd);
 
   clearOutputSections();
+
+  if (!Script->Opt.HasSections &&!Config->Relocatable)
+    fixSectionAlignments();
+
   // If -compressed-debug-sections is specified, we need to compress
   // .debug_* sections. Do it right now because it changes the size of
   // output sections.
@@ -1504,24 +1505,33 @@ void Writer<ELFT>::addPtArmExid(std::vector<PhdrEntry>
 // first section after PT_GNU_RELRO have to be page aligned so that the dynamic
 // linker can set the permissions.
 template <class ELFT> void Writer<ELFT>::fixSectionAlignments() {
+  auto PageAlign = [](OutputSection *Sec) {
+    OutputSectionCommand *Cmd = Script->getCmd(Sec);
+    if (Cmd && !Cmd->AddrExpr)
+      Cmd->AddrExpr = [=] {
+        return alignTo(Script->getDot(), Config->MaxPageSize);
+      };
+  };
+
   for (const PhdrEntry &P : Phdrs)
     if (P.p_type == PT_LOAD && P.First)
-      P.First->PageAlign = true;
+      PageAlign(P.First);
 
   for (const PhdrEntry &P : Phdrs) {
     if (P.p_type != PT_GNU_RELRO)
       continue;
     if (P.First)
-      P.First->PageAlign = true;
+      PageAlign(P.First);
     // Find the first section after PT_GNU_RELRO. If it is in a PT_LOAD we
     // have to align it to a page.
-    auto End = OutputSections.end();
-    auto I = std::find(OutputSections.begin(), End, P.Last);
+    auto End = OutputSectionCommands.end();
+    auto I =
+        std::find(OutputSectionCommands.begin(), End, Script->getCmd(P.Last));
     if (I == End || (I + 1) == End)
       continue;
-    OutputSection *Sec = *(I + 1);
+    OutputSection *Sec = (*(I + 1))->Sec;
     if (needsPtLoad(Sec))
-      Sec->PageAlign = true;
+      PageAlign(Sec);
   }
 }
 

Modified: vendor/lld/dist/test/COFF/armnt-imports.test
==============================================================================
--- vendor/lld/dist/test/COFF/armnt-imports.test	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/test/COFF/armnt-imports.test	Sat Jun  3 15:21:18 2017	(r319531)
@@ -6,7 +6,7 @@
 # CHECK: Import {
 # CHECK:   Name: library.dll
 # CHECK:   ImportLookupTableRVA: 0x2028
-# CHECK:   ImportAddressTableRVA: 0x2028
+# CHECK:   ImportAddressTableRVA: 0x2030
 # CHECK:   Symbol: function (0)
 # CHECK: }
 

Added: vendor/lld/dist/test/COFF/def-export-stdcall.s
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ vendor/lld/dist/test/COFF/def-export-stdcall.s	Sat Jun  3 15:21:18 2017	(r319531)
@@ -0,0 +1,25 @@
+# RUN: llvm-mc -filetype=obj -triple=i686-windows-msvc %s -o %t.obj
+# RUN: echo -e "LIBRARY foo\nEXPORTS\n  stdcall" > %t.def
+# RUN: lld-link -entry:dllmain -dll -def:%t.def %t.obj -out:%t.dll -implib:%t.lib
+# RUN: llvm-nm %t.lib | FileCheck %s
+# CHECK: __imp__stdcall at 8
+# CHECK: _stdcall at 8
+
+        .def     _stdcall at 8;
+        .scl    2;
+        .type   32;
+        .endef
+        .globl  _stdcall at 8
+_stdcall at 8:
+        movl    8(%esp), %eax
+        addl    4(%esp), %eax
+        retl    $8
+
+        .def     _dllmain;
+        .scl    2;
+        .type   32;
+        .endef
+        .globl  _dllmain
+_dllmain:
+        retl
+

Modified: vendor/lld/dist/test/COFF/hello32.test
==============================================================================
--- vendor/lld/dist/test/COFF/hello32.test	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/test/COFF/hello32.test	Sat Jun  3 15:21:18 2017	(r319531)
@@ -78,7 +78,7 @@ HEADER-NEXT:     LoadConfigTableRVA: 0x0
 HEADER-NEXT:     LoadConfigTableSize: 0x0
 HEADER-NEXT:     BoundImportRVA: 0x0
 HEADER-NEXT:     BoundImportSize: 0x0
-HEADER-NEXT:     IATRVA: 0x3028
+HEADER-NEXT:     IATRVA: 0x3034
 HEADER-NEXT:     IATSize: 0xC
 HEADER-NEXT:     DelayImportDescriptorRVA: 0x0
 HEADER-NEXT:     DelayImportDescriptorSize: 0x0
@@ -114,7 +114,7 @@ IMPORTS: AddressSize: 32bit
 IMPORTS: Import {
 IMPORTS:   Name: std32.dll
 IMPORTS:   ImportLookupTableRVA: 0x3028
-IMPORTS:   ImportAddressTableRVA: 0x3028
+IMPORTS:   ImportAddressTableRVA: 0x3034
 IMPORTS:   Symbol: ExitProcess (0)
 IMPORTS:   Symbol: MessageBoxA (1)
 IMPORTS: }

Modified: vendor/lld/dist/test/COFF/imports.test
==============================================================================
--- vendor/lld/dist/test/COFF/imports.test	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/test/COFF/imports.test	Sat Jun  3 15:21:18 2017	(r319531)
@@ -21,14 +21,14 @@ TEXT-NEXT: callq   60
 TEXT-NEXT: movl    $0, %ecx
 TEXT-NEXT: callq   18
 TEXT-NEXT: callq   29
-TEXT:      jmpq    *4066(%rip)
-TEXT:      jmpq    *4058(%rip)
-TEXT:      jmpq    *4050(%rip)
+TEXT:      jmpq    *4098(%rip)
+TEXT:      jmpq    *4090(%rip)
+TEXT:      jmpq    *4082(%rip)
 
 IMPORT:      Import {
 IMPORT-NEXT:   Name: std64.dll
 IMPORT-NEXT:   ImportLookupTableRVA: 0x3028
-IMPORT-NEXT:   ImportAddressTableRVA: 0x3028
+IMPORT-NEXT:   ImportAddressTableRVA: 0x3048
 IMPORT-NEXT:   Symbol: ExitProcess (0)
 IMPORT-NEXT:   Symbol:  (50)
 IMPORT-NEXT:   Symbol: MessageBoxA (1)

Modified: vendor/lld/dist/test/ELF/emit-relocs.s
==============================================================================
--- vendor/lld/dist/test/ELF/emit-relocs.s	Sat Jun  3 15:21:15 2017	(r319530)
+++ vendor/lld/dist/test/ELF/emit-relocs.s	Sat Jun  3 15:21:18 2017	(r319531)
@@ -1,16 +1,23 @@
 # REQUIRES: x86
 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o
 # RUN: ld.lld --emit-relocs %t1.o -o %t
-# RUN: llvm-readobj -t -r %t | FileCheck %s
+# RUN: llvm-readobj -t -r -s %t | FileCheck %s
 
 ## Check single dash form.
 # RUN: ld.lld -emit-relocs %t1.o -o %t1
-# RUN: llvm-readobj -t -r %t1 | FileCheck %s
+# RUN: llvm-readobj -t -r -s %t1 | FileCheck %s
 
 ## Check alias.
 # RUN: ld.lld -q %t1.o -o %t2
-# RUN: llvm-readobj -t -r %t2 | FileCheck %s
+# RUN: llvm-readobj -t -r -s %t2 | FileCheck %s
 
+# CHECK:      Section {
+# CHECK:        Index: 2
+# CHECK-NEXT:   Name: .rela.text
+# CHECK-NEXT:   Type: SHT_RELA
+# CHECK-NEXT:   Flags [
+# CHECK-NEXT:     SHF_INFO_LINK
+# CHECK-NEXT:   ]
 # CHECK:      Relocations [
 # CHECK-NEXT:   Section ({{.*}}) .rela.text {
 # CHECK-NEXT:     0x201002 R_X86_64_32 .text 0x1


More information about the svn-src-all mailing list