[lld] r357305 - [LLD][COFF] Improve checkFailIfMismatch()
Alexandre Ganea via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 29 12:58:59 PDT 2019
Author: aganea
Date: Fri Mar 29 12:58:58 2019
New Revision: 357305
URL: http://llvm.org/viewvc/llvm-project?rev=357305&view=rev
Log:
[LLD][COFF] Improve checkFailIfMismatch()
As suggested by ruiu here (https://reviews.llvm.org/D58910#1425484), defer a call to toString(File) until it's really needed (if there's an error)
Differential Revision: https://reviews.llvm.org/D59411
Modified:
lld/trunk/COFF/Config.h
lld/trunk/COFF/Driver.cpp
lld/trunk/COFF/Driver.h
lld/trunk/COFF/DriverUtils.cpp
Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=357305&r1=357304&r2=357305&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Fri Mar 29 12:58:58 2019
@@ -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;
Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=357305&r1=357304&r2=357305&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Fri Mar 29 12:58:58 2019
@@ -314,7 +314,7 @@ void LinkerDriver::parseDirectives(Input
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 c
// 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))
Modified: lld/trunk/COFF/Driver.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.h?rev=357305&r1=357304&r2=357305&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.h (original)
+++ lld/trunk/COFF/Driver.h Fri Mar 29 12:58:58 2019
@@ -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);
Modified: lld/trunk/COFF/DriverUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/DriverUtils.cpp?rev=357305&r1=357304&r2=357305&view=diff
==============================================================================
--- lld/trunk/COFF/DriverUtils.cpp (original)
+++ lld/trunk/COFF/DriverUtils.cpp Fri Mar 29 12:58:58 2019
@@ -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};
}
More information about the llvm-commits
mailing list