summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/Config.h3
-rw-r--r--lld/COFF/Driver.cpp4
-rw-r--r--lld/COFF/Driver.h2
-rw-r--r--lld/COFF/DriverUtils.cpp11
4 files changed, 12 insertions, 8 deletions
diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index 99b3b9eae71..b13ef3a7ece 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -28,6 +28,7 @@ class DefinedAbsolute;
class DefinedRelative;
class StringChunk;
class Symbol;
+class InputFile;
// Short aliases.
static const auto AMD64 = llvm::COFF::IMAGE_FILE_MACHINE_AMD64;
@@ -166,7 +167,7 @@ struct Configuration {
std::map<std::string, int> AlignComm;
// Used for /failifmismatch.
- std::map<StringRef, std::pair<StringRef, std::string>> MustMatch;
+ std::map<StringRef, std::pair<StringRef, InputFile *>> MustMatch;
// Used for /alternatename.
std::map<StringRef, StringRef> AlternateNames;
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index f01cf998370..bbebe5d9fe3 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -314,7 +314,7 @@ void LinkerDriver::parseDirectives(InputFile *File) {
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 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
// 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))
diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
index 1b3ca485d95..4ad473b9bee 100644
--- a/lld/COFF/Driver.h
+++ b/lld/COFF/Driver.h
@@ -180,7 +180,7 @@ void assignExportOrdinals();
// 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<MemoryBufferRef> MBs);
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp
index 6f3cf85de5d..a2f10085e4d 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -698,16 +698,19 @@ void assignExportOrdinals() {
// 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<StringRef, StringRef> Existing = Config->MustMatch[K];
+ std::pair<StringRef, InputFile *> 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};
}
OpenPOWER on IntegriCloud