diff options
-rw-r--r-- | lld/include/lld/ReaderWriter/PECOFFLinkingContext.h | 8 | ||||
-rw-r--r-- | lld/lib/Driver/WinLinkDriver.cpp | 17 | ||||
-rw-r--r-- | lld/unittests/DriverTests/WinLinkDriverTest.cpp | 18 |
3 files changed, 20 insertions, 23 deletions
diff --git a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h index 39f33d471ca..0327cf0c0d6 100644 --- a/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h +++ b/lld/include/lld/ReaderWriter/PECOFFLinkingContext.h @@ -39,7 +39,7 @@ public: _swapRunFromNet(false), _baseRelocationEnabled(true), _terminalServerAware(true), _dynamicBaseEnabled(true), _createManifest(true), _embedManifest(false), _manifestId(1), - _manifestLevel("'asInvoker'"), _manifestUiAccess(false), + _manifestLevel("'asInvoker'"), _manifestUiAccess("'false'"), _imageType(ImageType::IMAGE_EXE) { setDeadStripping(true); } @@ -161,8 +161,8 @@ public: void setManifestLevel(std::string val) { _manifestLevel = std::move(val); } const std::string &getManifestLevel() const { return _manifestLevel; } - void setManifestUiAccess(bool val) { _manifestUiAccess = val; } - bool getManifestUiAccess() const { return _manifestUiAccess; } + void setManifestUiAccess(std::string val) { _manifestUiAccess = val; } + const std::string &getManifestUiAccess() const { return _manifestUiAccess; } void setImageType(ImageType type) { _imageType = type; } ImageType getImageType() const { return _imageType; } @@ -226,7 +226,7 @@ private: bool _embedManifest; int _manifestId; std::string _manifestLevel; - bool _manifestUiAccess; + std::string _manifestUiAccess; ImageType _imageType; // The set to store /nodefaultlib arguments. diff --git a/lld/lib/Driver/WinLinkDriver.cpp b/lld/lib/Driver/WinLinkDriver.cpp index 62b40fc8aa3..74f730c6739 100644 --- a/lld/lib/Driver/WinLinkDriver.cpp +++ b/lld/lib/Driver/WinLinkDriver.cpp @@ -167,7 +167,7 @@ bool parseManifest(StringRef option, bool &enable, bool &embed, int &id) { // so the values given via the command line must be valid as XML attributes. // This may sound a bit odd, but that's how link.exe works, so we will follow. bool parseManifestUac(StringRef option, llvm::Optional<std::string> &level, - llvm::Optional<bool> &uiAccess) { + llvm::Optional<std::string> &uiAccess) { for (;;) { option = option.ltrim(); if (option.empty()) @@ -179,14 +179,11 @@ bool parseManifestUac(StringRef option, llvm::Optional<std::string> &level, level = value.str(); continue; } - if (option.startswith("uiAccess=true")) { - option = option.substr(strlen("uiAccess=true")); - uiAccess = true; - continue; - } - if (option.startswith("uiAccess=false")) { - option = option.substr(strlen("uiAccess=false")); - uiAccess = false; + if (option.startswith("uiAccess=")) { + option = option.substr(strlen("uiAccess=")); + StringRef value; + llvm::tie(value, option) = option.split(" "); + uiAccess = value.str(); continue; } return false; @@ -472,7 +469,7 @@ WinLinkDriver::parse(int argc, const char *argv[], PECOFFLinkingContext &ctx, case OPT_manifestuac: { // Parse /manifestuac. llvm::Optional<std::string> privilegeLevel; - llvm::Optional<bool> uiAccess; + llvm::Optional<std::string> uiAccess; if (!parseManifestUac(inputArg->getValue(), privilegeLevel, uiAccess)) { diagnostics << "Unknown argument for /manifestuac: " << inputArg->getValue() << "\n"; diff --git a/lld/unittests/DriverTests/WinLinkDriverTest.cpp b/lld/unittests/DriverTests/WinLinkDriverTest.cpp index 33f9b15f561..2fde737d8e8 100644 --- a/lld/unittests/DriverTests/WinLinkDriverTest.cpp +++ b/lld/unittests/DriverTests/WinLinkDriverTest.cpp @@ -64,7 +64,7 @@ TEST_F(WinLinkParserTest, Basic) { EXPECT_FALSE(_context.getEmbedManifest()); EXPECT_EQ(1, _context.getManifestId()); EXPECT_EQ("'asInvoker'", _context.getManifestLevel()); - EXPECT_EQ(false, _context.getManifestUiAccess()); + EXPECT_EQ("'false'", _context.getManifestUiAccess()); EXPECT_TRUE(_context.deadStrip()); EXPECT_FALSE(_context.logInputFiles()); } @@ -380,7 +380,7 @@ TEST_F(WinLinkParserTest, Manifest_Default) { EXPECT_FALSE(_context.getEmbedManifest()); EXPECT_EQ(1, _context.getManifestId()); EXPECT_EQ("'asInvoker'", _context.getManifestLevel()); - EXPECT_EQ(false, _context.getManifestUiAccess()); + EXPECT_EQ("'false'", _context.getManifestUiAccess()); } TEST_F(WinLinkParserTest, Manifest_No) { @@ -394,7 +394,7 @@ TEST_F(WinLinkParserTest, Manifest_Embed) { EXPECT_TRUE(_context.getEmbedManifest()); EXPECT_EQ(1, _context.getManifestId()); EXPECT_EQ("'asInvoker'", _context.getManifestLevel()); - EXPECT_EQ(false, _context.getManifestUiAccess()); + EXPECT_EQ("'false'", _context.getManifestUiAccess()); } TEST_F(WinLinkParserTest, Manifest_Embed_ID42) { @@ -403,28 +403,28 @@ TEST_F(WinLinkParserTest, Manifest_Embed_ID42) { EXPECT_TRUE(_context.getEmbedManifest()); EXPECT_EQ(42, _context.getManifestId()); EXPECT_EQ("'asInvoker'", _context.getManifestLevel()); - EXPECT_EQ(false, _context.getManifestUiAccess()); + EXPECT_EQ("'false'", _context.getManifestUiAccess()); } TEST_F(WinLinkParserTest, Manifestuac_Level) { EXPECT_TRUE(parse("link.exe", "/manifestuac:level='requireAdministrator'", "a.out", nullptr)); EXPECT_EQ("'requireAdministrator'", _context.getManifestLevel()); - EXPECT_EQ(false, _context.getManifestUiAccess()); + EXPECT_EQ("'false'", _context.getManifestUiAccess()); } TEST_F(WinLinkParserTest, Manifestuac_UiAccess) { - EXPECT_TRUE(parse("link.exe", "/manifestuac:uiAccess=true", "a.out", nullptr)); + EXPECT_TRUE(parse("link.exe", "/manifestuac:uiAccess='true'", "a.out", nullptr)); EXPECT_EQ("'asInvoker'", _context.getManifestLevel()); - EXPECT_EQ(true, _context.getManifestUiAccess()); + EXPECT_EQ("'true'", _context.getManifestUiAccess()); } TEST_F(WinLinkParserTest, Manifestuac_LevelAndUiAccess) { EXPECT_TRUE(parse("link.exe", - "/manifestuac:level='requireAdministrator' uiAccess=true", + "/manifestuac:level='requireAdministrator' uiAccess='true'", "a.out", nullptr)); EXPECT_EQ("'requireAdministrator'", _context.getManifestLevel()); - EXPECT_EQ(true, _context.getManifestUiAccess()); + EXPECT_EQ("'true'", _context.getManifestUiAccess()); } // |