[lld] r308998 - lld: only write .manifest files if /manifest is passed, PR33925

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 25 11:08:03 PDT 2017


Author: nico
Date: Tue Jul 25 11:08:03 2017
New Revision: 308998

URL: http://llvm.org/viewvc/llvm-project?rev=308998&view=rev
Log:
lld: only write .manifest files if /manifest is passed, PR33925

Also emit an error if /manifestinput: is used without /manifest:embed.
Increases compatibility with link.exe

https://reviews.llvm.org/D35842

Modified:
    lld/trunk/COFF/Config.h
    lld/trunk/COFF/Driver.cpp
    lld/trunk/test/COFF/manifest.test
    lld/trunk/test/COFF/manifestinput.test

Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=308998&r1=308997&r2=308998&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Tue Jul 25 11:08:03 2017
@@ -130,7 +130,7 @@ struct Configuration {
   std::map<StringRef, uint32_t> Section;
 
   // Options for manifest files.
-  ManifestKind Manifest = SideBySide;
+  ManifestKind Manifest = No;
   int ManifestID = 1;
   StringRef ManifestDependency;
   bool ManifestUAC = true;

Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=308998&r1=308997&r2=308998&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Tue Jul 25 11:08:03 2017
@@ -899,18 +899,25 @@ void LinkerDriver::link(ArrayRef<const c
   for (auto *Arg : Args.filtered(OPT_section))
     parseSection(Arg->getValue());
 
-  // Handle /manifest
-  if (auto *Arg = Args.getLastArg(OPT_manifest_colon))
-    parseManifest(Arg->getValue());
+  // Handle /manifestdependency. This enables /manifest unless /manifest:no is
+  // also passed.
+  if (auto *Arg = Args.getLastArg(OPT_manifestdependency)) {
+    Config->ManifestDependency = Arg->getValue();
+    Config->Manifest = Configuration::SideBySide;
+  }
+
+  // Handle /manifest and /manifest:
+  if (auto *Arg = Args.getLastArg(OPT_manifest, OPT_manifest_colon)) {
+    if (Arg->getOption().getID() == OPT_manifest)
+      Config->Manifest = Configuration::SideBySide;
+    else
+      parseManifest(Arg->getValue());
+  }
 
   // Handle /manifestuac
   if (auto *Arg = Args.getLastArg(OPT_manifestuac))
     parseManifestUAC(Arg->getValue());
 
-  // Handle /manifestdependency
-  if (auto *Arg = Args.getLastArg(OPT_manifestdependency))
-    Config->ManifestDependency = Arg->getValue();
-
   // Handle /manifestfile
   if (auto *Arg = Args.getLastArg(OPT_manifestfile))
     Config->ManifestFile = Arg->getValue();
@@ -919,6 +926,11 @@ void LinkerDriver::link(ArrayRef<const c
   for (auto *Arg : Args.filtered(OPT_manifestinput))
     Config->ManifestInput.push_back(Arg->getValue());
 
+  if (!Config->ManifestInput.empty() &&
+      Config->Manifest != Configuration::Embed) {
+    fatal("/MANIFESTINPUT: requires /MANIFEST:EMBED");
+  }
+
   // Handle miscellaneous boolean flags.
   if (Args.hasArg(OPT_allowisolation_no))
     Config->AllowIsolation = false;

Modified: lld/trunk/test/COFF/manifest.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/manifest.test?rev=308998&r1=308997&r2=308998&view=diff
==============================================================================
--- lld/trunk/test/COFF/manifest.test (original)
+++ lld/trunk/test/COFF/manifest.test Tue Jul 25 11:08:03 2017
@@ -1,6 +1,10 @@
 # RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj
 
+# RUN: rm -f %t.exe.manifest
 # RUN: lld-link /out:%t.exe /entry:main %t.obj
+# RUN: test ! -e %t.exe.manifest
+
+# RUN: lld-link /manifest /out:%t.exe /entry:main %t.obj
 # RUN: FileCheck -check-prefix=MANIFEST %s < %t.exe.manifest
 
 MANIFEST: <?xml version="1.0" standalone="yes"?>
@@ -15,7 +19,7 @@ MANIFEST:     </security>
 MANIFEST:   </trustInfo>
 MANIFEST: </assembly>
 
-# RUN: lld-link /out:%t.exe /entry:main \
+# RUN: lld-link /out:%t.exe /entry:main /manifest \
 # RUN:   /manifestuac:"level='requireAdministrator' uiAccess='true'" %t.obj
 # RUN: FileCheck -check-prefix=UAC %s < %t.exe.manifest
 
@@ -31,6 +35,7 @@ UAC:     </security>
 UAC:   </trustInfo>
 UAC: </assembly>
 
+# /manifestdependency implies /manifest. (/manifestuac doesn't.)
 # RUN: lld-link /out:%t.exe /entry:main \
 # RUN:   /manifestdependency:"foo='bar'" %t.obj
 # RUN: FileCheck -check-prefix=DEPENDENCY %s < %t.exe.manifest
@@ -52,7 +57,7 @@ DEPENDENCY:     </dependentAssembly>
 DEPENDENCY:   </dependency>
 DEPENDENCY: </assembly>
 
-# RUN: lld-link /out:%t.exe /entry:main /manifestuac:no %t.obj
+# RUN: lld-link /manifest /out:%t.exe /entry:main /manifestuac:no %t.obj
 # RUN: FileCheck -check-prefix=NOUAC %s < %t.exe.manifest
 
 NOUAC: <?xml version="1.0" standalone="yes"?>

Modified: lld/trunk/test/COFF/manifestinput.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/manifestinput.test?rev=308998&r1=308997&r2=308998&view=diff
==============================================================================
--- lld/trunk/test/COFF/manifestinput.test (original)
+++ lld/trunk/test/COFF/manifestinput.test Tue Jul 25 11:08:03 2017
@@ -1,7 +1,7 @@
 # REQUIRES: win_mt
 
 # RUN: yaml2obj %p/Inputs/ret42.yaml > %t.obj
-# RUN: lld-link /out:%t.exe /entry:main \
+# RUN: lld-link /out:%t.exe /entry:main /manifest \
 # RUN:   /manifestuac:"level='requireAdministrator'" \
 # RUN:   /manifestinput:%p/Inputs/manifestinput.test %t.obj
 # RUN: FileCheck %s < %t.exe.manifest




More information about the llvm-commits mailing list