[PECOFF] Fix /nodefaultlib option.
authorRui Ueyama <ruiu@google.com>
Thu, 23 Oct 2014 20:42:07 +0000 (20:42 +0000)
committerRui Ueyama <ruiu@google.com>
Thu, 23 Oct 2014 20:42:07 +0000 (20:42 +0000)
/nodefaultlib argument is a path name, so that needs to be compared
case-insensitive way. Also the ".lib" extension should be ignored.

llvm-svn: 220508

lld/include/lld/ReaderWriter/PECOFFLinkingContext.h
lld/unittests/DriverTests/WinLinkDriverTest.cpp

index 70c6887..f521161 100644 (file)
@@ -248,9 +248,17 @@ public:
   }
   void setAlternateName(StringRef def, StringRef weak);
 
-  void addNoDefaultLib(StringRef path) { _noDefaultLibs.insert(path); }
+  void addNoDefaultLib(StringRef path) {
+    if (path.endswith_lower(".lib"))
+      _noDefaultLibs.insert(path.drop_back(4).lower());
+    else
+      _noDefaultLibs.insert(path.lower());
+  }
+
   bool hasNoDefaultLib(StringRef path) const {
-    return _noDefaultLibs.count(path) == 1;
+    if (path.endswith_lower(".lib"))
+      return _noDefaultLibs.count(path.drop_back(4).lower()) > 0;
+    return _noDefaultLibs.count(path.lower()) > 0;
   }
 
   void setNoDefaultLibAll(bool val) { _noDefaultLibAll = val; }
index c83f568..b69194e 100644 (file)
@@ -416,6 +416,15 @@ TEST_F(WinLinkParserTest, NoDefaultLib) {
   EXPECT_EQ("kernel32.lib", inputFile(2, 0));
 }
 
+TEST_F(WinLinkParserTest, NoDefaultLibCase) {
+  EXPECT_TRUE(parse("link.exe", "/defaultlib:user32",
+                    "/defaultlib:kernel32", "/nodefaultlib:USER32.LIB", "a.obj",
+                    nullptr));
+  EXPECT_EQ(3, inputFileCount());
+  EXPECT_EQ("a.obj", inputFile(0));
+  EXPECT_EQ("kernel32.lib", inputFile(2, 0));
+}
+
 TEST_F(WinLinkParserTest, NoDefaultLibAll) {
   EXPECT_TRUE(parse("link.exe", "/defaultlib:user32.lib",
                     "/defaultlib:kernel32", "/nodefaultlib", "a.obj", nullptr));