[lld] 1534f45 - [lld-link] Replace warn(...) with Warn(ctx)
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 3 22:19:36 PST 2024
Author: Fangrui Song
Date: 2024-12-03T22:19:30-08:00
New Revision: 1534f456945060e27861000f5f2b16bc1b9e0c1e
URL: https://github.com/llvm/llvm-project/commit/1534f456945060e27861000f5f2b16bc1b9e0c1e
DIFF: https://github.com/llvm/llvm-project/commit/1534f456945060e27861000f5f2b16bc1b9e0c1e.diff
LOG: [lld-link] Replace warn(...) with Warn(ctx)
Added:
Modified:
lld/COFF/DebugTypes.cpp
lld/COFF/Driver.cpp
lld/COFF/DriverUtils.cpp
lld/COFF/InputFiles.cpp
lld/COFF/SymbolTable.cpp
lld/COFF/Writer.cpp
Removed:
################################################################################
diff --git a/lld/COFF/DebugTypes.cpp b/lld/COFF/DebugTypes.cpp
index 7689ad163a6576..08f61e0d446214 100644
--- a/lld/COFF/DebugTypes.cpp
+++ b/lld/COFF/DebugTypes.cpp
@@ -674,8 +674,8 @@ void TpiSource::mergeTypeRecord(TypeIndex curIndex, CVType ty) {
funcIdToType.push_back({funcId, funcType});
} else {
StringRef fname = file ? file->getName() : "<unknown PDB>";
- warn("corrupt LF_[M]FUNC_ID record 0x" + utohexstr(curIndex.getIndex()) +
- " in " + fname);
+ Warn(ctx) << "corrupt LF_[M]FUNC_ID record 0x"
+ << utohexstr(curIndex.getIndex()) << " in " << fname;
}
}
}
@@ -836,7 +836,7 @@ void UseTypeServerSource::remapTpiWithGHashes(GHashState *g) {
void PrecompSource::loadGHashes() {
if (getDebugH(file)) {
- warn("ignoring .debug$H section; pch with ghash is not implemented");
+ Warn(ctx) << "ignoring .debug$H section; pch with ghash is not implemented";
}
uint32_t ghashIdx = 0;
@@ -864,7 +864,7 @@ void PrecompSource::loadGHashes() {
void UsePrecompSource::loadGHashes() {
auto e = findPrecompMap(file, precompDependency);
if (!e) {
- warn(toString(e.takeError()));
+ Warn(ctx) << e.takeError();
return;
}
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index a4f7e6c76af493..11e13f20c80428 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -809,7 +809,7 @@ StringRef LinkerDriver::findDefaultEntry() {
if (findUnderscoreMangle("wmain")) {
if (!findUnderscoreMangle("main"))
return mangle("wmainCRTStartup");
- warn("found both wmain and main; using latter");
+ Warn(ctx) << "found both wmain and main; using latter";
}
return mangle("mainCRTStartup");
}
@@ -828,9 +828,9 @@ WindowsSubsystem LinkerDriver::inferSubsystem() {
bool haveWWinMain = findUnderscoreMangle("wWinMain");
if (haveMain || haveWMain) {
if (haveWinMain || haveWWinMain) {
- warn(std::string("found ") + (haveMain ? "main" : "wmain") + " and " +
- (haveWinMain ? "WinMain" : "wWinMain") +
- "; defaulting to /subsystem:console");
+ Warn(ctx) << "found " << (haveMain ? "main" : "wmain") << " and "
+ << (haveWinMain ? "WinMain" : "wWinMain")
+ << "; defaulting to /subsystem:console";
}
return IMAGE_SUBSYSTEM_WINDOWS_CUI;
}
@@ -910,7 +910,8 @@ static std::string createResponseFile(const opt::InputArgList &args,
return std::string(data);
}
-static unsigned parseDebugTypes(const opt::InputArgList &args) {
+static unsigned parseDebugTypes(COFFLinkerContext &ctx,
+ const opt::InputArgList &args) {
unsigned debugTypes = static_cast<unsigned>(DebugType::None);
if (auto *a = args.getLastArg(OPT_debugtype)) {
@@ -925,7 +926,7 @@ static unsigned parseDebugTypes(const opt::InputArgList &args) {
.Case("fixup", static_cast<unsigned>(DebugType::Fixup))
.Default(0);
if (v == 0) {
- warn("/debugtype: unknown option '" + type + "'");
+ Warn(ctx) << "/debugtype: unknown option '" << type << "'";
continue;
}
debugTypes |= v;
@@ -1162,7 +1163,8 @@ void LinkerDriver::parseOrderFile(StringRef arg) {
if (set.count(s) == 0) {
if (ctx.config.warnMissingOrderSymbol)
- warn("/order:" + arg + ": missing symbol: " + s + " [LNK4037]");
+ Warn(ctx) << "/order:" << arg << ": missing symbol: " << s
+ << " [LNK4037]";
} else
ctx.config.order[s] = INT_MIN + ctx.config.order.size();
}
@@ -1189,7 +1191,7 @@ void LinkerDriver::parseCallGraphFile(StringRef path) {
Symbol *sym = map.lookup(name);
if (!sym) {
if (ctx.config.warnMissingOrderSymbol)
- warn(path + ": no such symbol: " + name);
+ Warn(ctx) << path << ": no such symbol: " << name;
return nullptr;
}
@@ -1332,8 +1334,8 @@ void LinkerDriver::parsePDBAltPath() {
else if (var.equals_insensitive("%_ext%"))
buf.append(binaryExtension);
else {
- warn("only %_PDB% and %_EXT% supported in /pdbaltpath:, keeping " + var +
- " as literal");
+ Warn(ctx) << "only %_PDB% and %_EXT% supported in /pdbaltpath:, keeping "
+ << var << " as literal";
buf.append(var);
}
@@ -1691,7 +1693,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
addLibSearchPaths();
} else {
if (args.hasArg(OPT_vctoolsdir, OPT_winsysroot))
- warn("ignoring /vctoolsdir or /winsysroot flags in MinGW mode");
+ Warn(ctx) << "ignoring /vctoolsdir or /winsysroot flags in MinGW mode";
}
}
@@ -1752,7 +1754,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
StringRef(str).split(vec, ',');
for (StringRef s : vec) {
if (s == "fastlink") {
- warn("/debug:fastlink unsupported; using /debug:full");
+ Warn(ctx) << "/debug:fastlink unsupported; using /debug:full";
s = "full";
}
if (s == "none") {
@@ -1795,7 +1797,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
config->demangle = args.hasFlag(OPT_demangle, OPT_demangle_no, true);
// Handle /debugtype
- config->debugTypes = parseDebugTypes(args);
+ config->debugTypes = parseDebugTypes(ctx, args);
// Handle /driver[:uponly|:wdm].
config->driverUponly = args.hasArg(OPT_driver_uponly) ||
@@ -1832,7 +1834,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
// Handle /pdbstripped
if (args.hasArg(OPT_pdbstripped))
- warn("ignoring /pdbstripped flag, it is not yet supported");
+ Warn(ctx) << "ignoring /pdbstripped flag, it is not yet supported";
// Handle /noentry
if (args.hasArg(OPT_noentry)) {
@@ -2114,7 +2116,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
if (!isPowerOf2_64(config->align))
error("/align: not a power of two: " + StringRef(arg->getValue()));
if (!args.hasArg(OPT_driver))
- warn("/align specified without /driver; image may not run");
+ Warn(ctx) << "/align specified without /driver; image may not run";
}
// Handle /aligncomm
@@ -2199,27 +2201,29 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
OPT_lld_allow_duplicate_weak_no, config->mingw);
if (args.hasFlag(OPT_inferasanlibs, OPT_inferasanlibs_no, false))
- warn("ignoring '/inferasanlibs', this flag is not supported");
+ Warn(ctx) << "ignoring '/inferasanlibs', this flag is not supported";
if (config->incremental && args.hasArg(OPT_profile)) {
- warn("ignoring '/incremental' due to '/profile' specification");
+ Warn(ctx) << "ignoring '/incremental' due to '/profile' specification";
config->incremental = false;
}
if (config->incremental && args.hasArg(OPT_order)) {
- warn("ignoring '/incremental' due to '/order' specification");
+ Warn(ctx) << "ignoring '/incremental' due to '/order' specification";
config->incremental = false;
}
if (config->incremental && config->doGC) {
- warn("ignoring '/incremental' because REF is enabled; use '/opt:noref' to "
- "disable");
+ Warn(ctx) << "ignoring '/incremental' because REF is enabled; use "
+ "'/opt:noref' to "
+ "disable";
config->incremental = false;
}
if (config->incremental && config->doICF != ICFLevel::None) {
- warn("ignoring '/incremental' because ICF is enabled; use '/opt:noicf' to "
- "disable");
+ Warn(ctx) << "ignoring '/incremental' because ICF is enabled; use "
+ "'/opt:noicf' to "
+ "disable";
config->incremental = false;
}
@@ -2285,7 +2289,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
// We should have inferred a machine type by now from the input files, but if
// not we assume x64.
if (config->machine == IMAGE_FILE_MACHINE_UNKNOWN) {
- warn("/machine is not specified. x64 is assumed");
+ Warn(ctx) << "/machine is not specified. x64 is assumed";
config->machine = AMD64;
addWinSysRootLibSearchPaths();
}
@@ -2460,8 +2464,8 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
}
if (config->lldmapFile != "" && config->lldmapFile == config->mapFile) {
- warn("/lldmap and /map have the same output file '" + config->mapFile +
- "'.\n>>> ignoring /lldmap");
+ Warn(ctx) << "/lldmap and /map have the same output file '"
+ << config->mapFile << "'.\n>>> ignoring /lldmap";
config->lldmapFile.clear();
}
@@ -2741,7 +2745,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
Symbol *sym = ctx.symtab.find(name);
if (!sym) {
- warn("/aligncomm symbol " + name + " not found");
+ Warn(ctx) << "/aligncomm symbol " << name << " not found";
continue;
}
diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp
index f5862977857dfe..bb6394aca49841 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -172,7 +172,7 @@ void LinkerDriver::parseMerge(StringRef s) {
if (!inserted) {
StringRef existing = pair.first->second;
if (existing != to)
- warn(s + ": already merged into " + existing);
+ Warn(ctx) << s << ": already merged into " << existing;
}
}
@@ -741,12 +741,12 @@ void LinkerDriver::fixupExports() {
continue;
}
if (existing->source == e.source) {
- warn(Twine("duplicate ") + exportSourceName(existing->source) +
- " option: " + e.name);
+ Warn(ctx) << "duplicate " << exportSourceName(existing->source)
+ << " option: " << e.name;
} else {
- warn("duplicate export: " + e.name +
- Twine(" first seen in " + exportSourceName(existing->source) +
- Twine(", now in " + exportSourceName(e.source))));
+ Warn(ctx) << "duplicate export: " << e.name << " first seen in "
+ << exportSourceName(existing->source) << ", now in "
+ << exportSourceName(e.source);
}
}
ctx.config.exports = std::move(v);
@@ -822,7 +822,7 @@ MemoryBufferRef LinkerDriver::convertResToCOFF(ArrayRef<MemoryBufferRef> mbs,
for (const auto &dupeDiag : duplicates)
if (ctx.config.forceMultipleRes)
- warn(dupeDiag);
+ Warn(ctx) << dupeDiag;
else
error(dupeDiag);
@@ -945,14 +945,15 @@ opt::InputArgList ArgParser::parse(ArrayRef<const char *> argv) {
for (opt::Arg *arg : args.filtered(OPT_UNKNOWN)) {
std::string nearest;
if (ctx.optTable.findNearest(arg->getAsString(args), nearest) > 1)
- warn("ignoring unknown argument '" + arg->getAsString(args) + "'");
+ Warn(ctx) << "ignoring unknown argument '" << arg->getAsString(args)
+ << "'";
else
- warn("ignoring unknown argument '" + arg->getAsString(args) +
- "', did you mean '" + nearest + "'");
+ Warn(ctx) << "ignoring unknown argument '" << arg->getAsString(args)
+ << "', did you mean '" << nearest << "'";
}
if (args.hasArg(OPT_lib))
- warn("ignoring /lib since it's not the first argument");
+ Warn(ctx) << "ignoring /lib since it's not the first argument";
return args;
}
@@ -994,7 +995,7 @@ ParsedDirectives ArgParser::parseDirectives(StringRef s) {
if (missingCount)
fatal(Twine(result.args.getArgString(missingIndex)) + ": missing argument");
for (auto *arg : result.args.filtered(OPT_UNKNOWN))
- warn("ignoring unknown argument: " + arg->getAsString(result.args));
+ Warn(ctx) << "ignoring unknown argument: " << arg->getAsString(result.args);
return result;
}
diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp
index 9e33774d695fab..65def1f509a4d9 100644
--- a/lld/COFF/InputFiles.cpp
+++ b/lld/COFF/InputFiles.cpp
@@ -206,7 +206,7 @@ void ObjFile::initializeECThunks() {
case Arm64ECThunkType::GuestExit:
break;
default:
- warn("Ignoring unknown EC thunk type " + Twine(entry->type));
+ Warn(ctx) << "Ignoring unknown EC thunk type " << entry->type;
}
}
}
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 0c6df701284b7d..9f41421722286c 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -327,7 +327,8 @@ void SymbolTable::loadMinGWSymbols() {
// If it's lazy or already defined, hook it up as weak alias.
if (l->isLazy() || isa<Defined>(l)) {
if (ctx.config.warnStdcallFixup)
- warn("Resolving " + origName + " by linking to " + newName);
+ Warn(ctx) << "Resolving " << origName << " by linking to "
+ << newName;
else
log("Resolving " + origName + " by linking to " + newName);
undef->setWeakAlias(l);
@@ -379,9 +380,9 @@ bool SymbolTable::handleMinGWAutomaticImport(Symbol *sym, StringRef name) {
toString(cast<DefinedRegular>(imp)->file));
impSize = sizeof(DefinedRegular);
} else {
- warn("unable to automatically import " + name + " from " + imp->getName() +
- " from " + toString(cast<DefinedRegular>(imp)->file) +
- "; unexpected symbol type");
+ Warn(ctx) << "unable to automatically import " << name << " from "
+ << imp->getName() << " from " << cast<DefinedRegular>(imp)->file
+ << "; unexpected symbol type";
return false;
}
sym->replaceKeepingName(imp, impSize);
@@ -412,7 +413,7 @@ bool SymbolTable::handleMinGWAutomaticImport(Symbol *sym, StringRef name) {
/// objFiles and bitcodeFiles (if not nullptr) are used to report where
/// undefined symbols are referenced.
static void reportProblemSymbols(
- const COFFLinkerContext &ctx, const SmallPtrSetImpl<Symbol *> &undefs,
+ COFFLinkerContext &ctx, const SmallPtrSetImpl<Symbol *> &undefs,
const DenseMap<Symbol *, Symbol *> *localImports, bool needBitcodeFiles) {
// Return early if there is nothing to report (which should be
// the common case).
@@ -425,8 +426,9 @@ static void reportProblemSymbols(
ctx.config.forceUnresolved);
if (localImports)
if (Symbol *imp = localImports->lookup(b))
- warn("<root>: locally defined symbol imported: " + toString(ctx, *imp) +
- " (defined in " + toString(imp->getFile()) + ") [LNK4217]");
+ Warn(ctx) << "<root>: locally defined symbol imported: "
+ << toString(ctx, *imp) << " (defined in "
+ << toString(imp->getFile()) << ") [LNK4217]";
}
std::vector<UndefinedDiag> undefDiags;
@@ -447,9 +449,9 @@ static void reportProblemSymbols(
}
if (localImports)
if (Symbol *imp = localImports->lookup(sym))
- warn(toString(file) +
- ": locally defined symbol imported: " + toString(ctx, *imp) +
- " (defined in " + toString(imp->getFile()) + ") [LNK4217]");
+ Warn(ctx) << file << ": locally defined symbol imported: "
+ << toString(ctx, *imp) << " (defined in " << imp->getFile()
+ << ") [LNK4217]";
}
};
@@ -814,7 +816,7 @@ void SymbolTable::reportDuplicate(Symbol *existing, InputFile *newFile,
existing->getName());
if (ctx.config.forceMultiple)
- warn(msg);
+ Warn(ctx) << msg;
else
error(msg);
}
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index d3e326378ed2d4..3ec8e42f97c8e9 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -1313,7 +1313,7 @@ void Writer::createExportTable() {
// Allow using a custom built export table from input object files, instead
// of having the linker synthesize the tables.
if (ctx.config.hadExplicitExports)
- warn("literal .edata sections override exports");
+ Warn(ctx) << "literal .edata sections override exports";
} else if (!ctx.config.exports.empty()) {
for (Chunk *c : edata.chunks)
edataSec->addChunk(c);
@@ -1325,7 +1325,7 @@ void Writer::createExportTable() {
// Warn on exported deleting destructor.
for (auto e : ctx.config.exports)
if (e.sym && e.sym->getName().starts_with("??_G"))
- warn("export of deleting dtor: " + toString(ctx, *e.sym));
+ Warn(ctx) << "export of deleting dtor: " << toString(ctx, *e.sym);
}
void Writer::removeUnusedSections() {
@@ -1457,9 +1457,10 @@ void Writer::createSymbolAndStringTable() {
if ((sec->header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0)
continue;
if (ctx.config.warnLongSectionNames) {
- warn("section name " + sec->name +
- " is longer than 8 characters and will use a non-standard string "
- "table");
+ Warn(ctx)
+ << "section name " << sec->name
+ << " is longer than 8 characters and will use a non-standard string "
+ "table";
}
sec->setStringTableOff(addEntryToStringTable(sec->name));
}
@@ -2086,8 +2087,8 @@ void Writer::getSymbolsFromSections(ObjFile *file,
// Validate that the contents look like symbol table indices.
ArrayRef<uint8_t> data = c->getContents();
if (data.size() % 4 != 0) {
- warn("ignoring " + c->getSectionName() +
- " symbol table index section in object " + toString(file));
+ Warn(ctx) << "ignoring " << c->getSectionName()
+ << " symbol table index section in object " << file;
continue;
}
@@ -2098,8 +2099,8 @@ void Writer::getSymbolsFromSections(ObjFile *file,
ArrayRef<Symbol *> objSymbols = file->getSymbols();
for (uint32_t symIndex : symIndices) {
if (symIndex >= objSymbols.size()) {
- warn("ignoring invalid symbol table index in section " +
- c->getSectionName() + " in object " + toString(file));
+ Warn(ctx) << "ignoring invalid symbol table index in section "
+ << c->getSectionName() << " in object " << file;
continue;
}
if (Symbol *s = objSymbols[symIndex]) {
@@ -2606,7 +2607,8 @@ void Writer::prepareLoadConfig() {
auto *b = cast_if_present<DefinedRegular>(sym);
if (!b) {
if (ctx.config.guardCF != GuardCFLevel::Off)
- warn("Control Flow Guard is enabled but '_load_config_used' is missing");
+ Warn(ctx)
+ << "Control Flow Guard is enabled but '_load_config_used' is missing";
return;
}
@@ -2616,13 +2618,13 @@ void Writer::prepareLoadConfig() {
uint8_t *symBuf = secBuf + (b->getRVA() - sec->getRVA());
uint32_t expectedAlign = ctx.config.is64() ? 8 : 4;
if (b->getChunk()->getAlignment() < expectedAlign)
- warn("'_load_config_used' is misaligned (expected alignment to be " +
- Twine(expectedAlign) + " bytes, got " +
- Twine(b->getChunk()->getAlignment()) + " instead)");
+ Warn(ctx) << "'_load_config_used' is misaligned (expected alignment to be "
+ << expectedAlign << " bytes, got "
+ << b->getChunk()->getAlignment() << " instead)";
else if (!isAligned(Align(expectedAlign), b->getRVA()))
- warn("'_load_config_used' is misaligned (RVA is 0x" +
- Twine::utohexstr(b->getRVA()) + " not aligned to " +
- Twine(expectedAlign) + " bytes)");
+ Warn(ctx) << "'_load_config_used' is misaligned (RVA is 0x"
+ << Twine::utohexstr(b->getRVA()) << " not aligned to "
+ << expectedAlign << " bytes)";
if (ctx.config.is64())
prepareLoadConfig(reinterpret_cast<coff_load_configuration64 *>(symBuf));
More information about the llvm-commits
mailing list