[lld] r370974 - [LLD] [COFF] Implement MinGW default manifest handling

Martin Storsjo via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 4 13:34:00 PDT 2019


Author: mstorsjo
Date: Wed Sep  4 13:34:00 2019
New Revision: 370974

URL: http://llvm.org/viewvc/llvm-project?rev=370974&view=rev
Log:
[LLD] [COFF] Implement MinGW default manifest handling

In mingw environments, resources are normally compiled to resource
object files directly, instead of letting the linker convert them to
COFF format.

Since some time, GCC supports the notion of a default manifest object.
When invoking the linker, GCC looks for the default manifest object
file, and if found in the expected path, it is added to linker commands.

The default manifest is one that indicates support for the latest known
versions of windows, to implicitly unlock the modern behaviours of certain
APIs.

Not all mingw/gcc distributions include this file, but e.g. in msys2,
the default manifest object is distributed in a separate package (which
can be but might not always be installed).

This means that even if user projects only use one single resource
object file, the linker can end up with two resource object files,
and thus needs to support merging them.

The default manifest has a language id of zero, and GNU ld has got
logic for dropping a manifest with a zero language id, if there's
another manifest present with a nonzero language id. If there are
multiple manifests with a nonzero language id, the merging process
errors out.

Differential Revision: https://reviews.llvm.org/D66825

Added:
    lld/trunk/test/COFF/Inputs/manifest-lang0.res   (with props)
    lld/trunk/test/COFF/Inputs/manifest-lang0.yaml
    lld/trunk/test/COFF/Inputs/manifest-lang1.res   (with props)
    lld/trunk/test/COFF/Inputs/manifest-lang1.yaml
    lld/trunk/test/COFF/Inputs/manifest-lang2.res   (with props)
    lld/trunk/test/COFF/Inputs/manifest-lang2.yaml
    lld/trunk/test/COFF/merge-resource-manifest.test
Modified:
    lld/trunk/COFF/DriverUtils.cpp

Modified: lld/trunk/COFF/DriverUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=370974&r1=370973&r2=370974&view=diff
==============================================================================
--- lld/trunk/COFF/DriverUtils.cpp (original)
+++ lld/trunk/COFF/DriverUtils.cpp Wed Sep  4 13:34:00 2019
@@ -702,7 +702,7 @@ void checkFailIfMismatch(StringRef arg,
 // Does what cvtres.exe does, but in-process and cross-platform.
 MemoryBufferRef convertResToCOFF(ArrayRef<MemoryBufferRef> mbs,
                                  ArrayRef<ObjFile *> objs) {
-  object::WindowsResourceParser parser;
+  object::WindowsResourceParser parser(/* MinGW */ config->mingw);
 
   std::vector<std::string> duplicates;
   for (MemoryBufferRef mb : mbs) {
@@ -727,6 +727,8 @@ MemoryBufferRef convertResToCOFF(ArrayRe
       fatal(toString(std::move(ec)));
   }
 
+  if (config->mingw)
+    parser.cleanUpManifests(duplicates);
 
   for (const auto &dupeDiag : duplicates)
     if (config->forceMultipleRes)

Added: lld/trunk/test/COFF/Inputs/manifest-lang0.res
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang0.res?rev=370974&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/manifest-lang0.res
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/Inputs/manifest-lang0.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang0.yaml?rev=370974&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/manifest-lang0.yaml (added)
+++ lld/trunk/test/COFF/Inputs/manifest-lang0.yaml Wed Sep  4 13:34:00 2019
@@ -0,0 +1,21 @@
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_LINE_NUMS_STRIPPED ]
+sections:
+  - Name:            .rsrc
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+    Alignment:       4
+    SectionData:     000000000000000000000000000001001800000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000000000048000000580000000E00000000000000000000006D616E69666573742D6C616E67300000
+    Relocations:
+      - VirtualAddress:  72
+        SymbolName:      .rsrc
+        Type:            IMAGE_REL_AMD64_ADDR32NB
+symbols:
+  - Name:            .rsrc
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+...

Added: lld/trunk/test/COFF/Inputs/manifest-lang1.res
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang1.res?rev=370974&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/manifest-lang1.res
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/Inputs/manifest-lang1.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang1.yaml?rev=370974&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/manifest-lang1.yaml (added)
+++ lld/trunk/test/COFF/Inputs/manifest-lang1.yaml Wed Sep  4 13:34:00 2019
@@ -0,0 +1,21 @@
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_LINE_NUMS_STRIPPED ]
+sections:
+  - Name:            .rsrc
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+    Alignment:       4
+    SectionData:     000000000000000000000000000001001800000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000100000048000000580000000E00000000000000000000006D616E69666573742D6C616E67310000
+    Relocations:
+      - VirtualAddress:  72
+        SymbolName:      .rsrc
+        Type:            IMAGE_REL_AMD64_ADDR32NB
+symbols:
+  - Name:            .rsrc
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+...

Added: lld/trunk/test/COFF/Inputs/manifest-lang2.res
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang2.res?rev=370974&view=auto
==============================================================================
Binary file - no diff available.

Propchange: lld/trunk/test/COFF/Inputs/manifest-lang2.res
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: lld/trunk/test/COFF/Inputs/manifest-lang2.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/Inputs/manifest-lang2.yaml?rev=370974&view=auto
==============================================================================
--- lld/trunk/test/COFF/Inputs/manifest-lang2.yaml (added)
+++ lld/trunk/test/COFF/Inputs/manifest-lang2.yaml Wed Sep  4 13:34:00 2019
@@ -0,0 +1,21 @@
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [ IMAGE_FILE_LINE_NUMS_STRIPPED ]
+sections:
+  - Name:            .rsrc
+    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+    Alignment:       4
+    SectionData:     000000000000000000000000000001001800000018000080000000000000000000000000000001000100000030000080000000000000000000000000000001000200000048000000580000000E00000000000000000000006D616E69666573742D6C616E67320000
+    Relocations:
+      - VirtualAddress:  72
+        SymbolName:      .rsrc
+        Type:            IMAGE_REL_AMD64_ADDR32NB
+symbols:
+  - Name:            .rsrc
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+...

Added: lld/trunk/test/COFF/merge-resource-manifest.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/merge-resource-manifest.test?rev=370974&view=auto
==============================================================================
--- lld/trunk/test/COFF/merge-resource-manifest.test (added)
+++ lld/trunk/test/COFF/merge-resource-manifest.test Wed Sep  4 13:34:00 2019
@@ -0,0 +1,61 @@
+# RUN: yaml2obj < %p/Inputs/ret42.yaml > %t.o
+
+# RUN: yaml2obj < %p/Inputs/manifest-lang0.yaml > %t-manifest-lang0.o
+# RUN: yaml2obj < %p/Inputs/manifest-lang1.yaml > %t-manifest-lang1.o
+# RUN: yaml2obj < %p/Inputs/manifest-lang2.yaml > %t-manifest-lang2.o
+
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main %t.o %p/Inputs/manifest-lang0.res %p/Inputs/manifest-lang1.res
+# RUN: llvm-readobj --coff-resources %t.exe | FileCheck %s
+
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main %t.o %t-manifest-lang0.o %t-manifest-lang1.o
+# RUN: llvm-readobj --coff-resources %t.exe | FileCheck %s
+
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main %t.o %p/Inputs/manifest-lang1.res %p/Inputs/manifest-lang0.res
+# RUN: llvm-readobj --coff-resources %t.exe | FileCheck %s
+
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main %t.o %t-manifest-lang1.o %t-manifest-lang0.o
+# RUN: llvm-readobj --coff-resources %t.exe | FileCheck %s
+
+# RUN: cp %t-manifest-lang0.o %t-manifest-lang0-copy.o
+# RUN: lld-link /lldmingw /out:%t.exe /entry:main %t.o %t-manifest-lang0.o %t-manifest-lang0-copy.o %t-manifest-lang1.o
+# RUN: llvm-readobj --coff-resources %t.exe | FileCheck %s
+
+# RUN: not lld-link /lldmingw /out:%t.exe /entry:main %t.o %p/Inputs/manifest-lang1.res %p/Inputs/manifest-lang2.res 2>&1 | FileCheck --check-prefix=ERROR %s
+
+# RUN: not lld-link /lldmingw /out:%t.exe /entry:main %t.o %t-manifest-lang1.o %t-manifest-lang2.o 2>&1 | FileCheck --check-prefix=ERROR %s
+
+# CHECK:      Resources [
+# CHECK-NEXT:  Total Number of Resources: 1
+# CHECK-NEXT:  Base Table Address: 0x
+# CHECK-NEXT:  {{ }}
+# CHECK-NEXT:   Number of String Entries: 0
+# CHECK-NEXT:   Number of ID Entries: 1
+# CHECK-NEXT:   Type: MANIFEST (ID 24) [
+# CHECK-NEXT:     Table Offset: 0x18
+# CHECK-NEXT:     Number of String Entries: 0
+# CHECK-NEXT:     Number of ID Entries: 1
+# CHECK-NEXT:     Name: (ID 1) [
+# CHECK-NEXT:       Table Offset: 0x30
+# CHECK-NEXT:       Number of String Entries: 0
+# CHECK-NEXT:       Number of ID Entries: 1
+# CHECK-NEXT:       Language: (ID 1) [
+# CHECK-NEXT:         Entry Offset: 0x48
+# CHECK-NEXT:         Time/Date Stamp: 1970-01-01 00:00:00 (0x0)
+# CHECK-NEXT:         Major Version: 0
+# CHECK-NEXT:         Minor Version: 0
+# CHECK-NEXT:         Characteristics: 0
+# CHECK-NEXT:         Data [
+# CHECK-NEXT:           DataRVA:
+# CHECK-NEXT:           DataSize: 14
+# CHECK-NEXT:           Codepage: 0
+# CHECK-NEXT:           Reserved: 0
+# CHECK-NEXT:           Data (
+# CHECK-NEXT:             0000: 6D616E69 66657374 2D6C616E 6731      |manifest-lang1|
+# CHECK-NEXT:           )
+# CHECK-NEXT:         ]
+# CHECK-NEXT:       ]
+# CHECK-NEXT:     ]
+# CHECK-NEXT:   ]
+# CHECK-NEXT: ]
+
+# ERROR: error: duplicate non-default manifests with languages 1 in {{.*}}manifest-lang1.{{res|o}} and 2 in {{.*}}manifest-lang2.{{res|o}}




More information about the llvm-commits mailing list