Index: lld/trunk/COFF/Config.h =================================================================== --- lld/trunk/COFF/Config.h +++ lld/trunk/COFF/Config.h @@ -28,6 +28,7 @@ class DefinedRelative; class StringChunk; class Symbol; +class InputFile; // Short aliases. static const auto AMD64 = llvm::COFF::IMAGE_FILE_MACHINE_AMD64; @@ -166,7 +167,7 @@ std::map AlignComm; // Used for /failifmismatch. - std::map> MustMatch; + std::map> MustMatch; // Used for /alternatename. std::map AlternateNames; Index: lld/trunk/COFF/Driver.h =================================================================== --- lld/trunk/COFF/Driver.h +++ lld/trunk/COFF/Driver.h @@ -180,7 +180,7 @@ // if value matches previous values for the key. // This feature used in the directive section to reject // incompatible objects. -void checkFailIfMismatch(StringRef Arg, StringRef Source); +void checkFailIfMismatch(StringRef Arg, InputFile *Source); // Convert Windows resource files (.res files) to a .obj file. MemoryBufferRef convertResToCOFF(ArrayRef MBs); Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/COFF/Driver.cpp @@ -314,7 +314,7 @@ Config->Entry = addUndefined(mangle(Arg->getValue())); break; case OPT_failifmismatch: - checkFailIfMismatch(Arg->getValue(), toString(File)); + checkFailIfMismatch(Arg->getValue(), File); break; case OPT_incl: addUndefined(Arg->getValue()); @@ -1283,7 +1283,7 @@ // Handle /failifmismatch for (auto *Arg : Args.filtered(OPT_failifmismatch)) - checkFailIfMismatch(Arg->getValue(), "cmd-line"); + checkFailIfMismatch(Arg->getValue(), nullptr); // Handle /merge for (auto *Arg : Args.filtered(OPT_merge)) Index: lld/trunk/COFF/DriverUtils.cpp =================================================================== --- lld/trunk/COFF/DriverUtils.cpp +++ lld/trunk/COFF/DriverUtils.cpp @@ -698,16 +698,19 @@ // Parses a string in the form of "key=value" and check // if value matches previous values for the same key. -void checkFailIfMismatch(StringRef Arg, StringRef Source) { +void checkFailIfMismatch(StringRef Arg, InputFile *Source) { StringRef K, V; std::tie(K, V) = Arg.split('='); if (K.empty() || V.empty()) fatal("/failifmismatch: invalid argument: " + Arg); - std::pair Existing = Config->MustMatch[K]; + std::pair Existing = Config->MustMatch[K]; if (!Existing.first.empty() && V != Existing.first) { + std::string SourceStr = Source ? toString(Source) : "cmd-line"; + std::string ExistingStr = + Existing.second ? toString(Existing.second) : "cmd-line"; fatal("/failifmismatch: mismatch detected for '" + K + "':\n>>> " + - Existing.second + " has value " + Existing.first + "\n>>> " + - Source + " has value " + V); + ExistingStr + " has value " + Existing.first + "\n>>> " + SourceStr + + " has value " + V); } Config->MustMatch[K] = {V, Source}; }