- add .gnu.warning.SYMBOL support to ld.lld(1) - fix https://reviews.llvm.org/D114982 Index: lld/ELF/Relocations.cpp --- lld/ELF/Relocations.cpp.orig +++ lld/ELF/Relocations.cpp @@ -954,6 +954,18 @@ template void elf::reportUndefinedSymbols undefs.clear(); } +static void reportGNUWarning(Symbol &sym, InputSectionBase &sec, + uint64_t offset) { + if (sym.gwarn) { + StringRef gnuWarning = gnuWarnings.lookup(sym.getName()); + // report first occurance only + sym.gwarn = false; + if (!gnuWarning.empty()) + message(sec.getSrcMsg(sym, offset) + "(" + sec.getObjMsg(offset) + + "): warning: " + gnuWarning); + } +} + // Report an undefined symbol if necessary. // Returns true if the undefined symbol will produce an error message. static bool maybeReportUndefined(Symbol &sym, InputSectionBase &sec, @@ -1327,6 +1339,8 @@ static void scanReloc(InputSectionBase &sec, OffsetGet if (symIndex != 0 && maybeReportUndefined(sym, sec, rel.r_offset)) return; + reportGNUWarning(sym, sec, rel.r_offset); + const uint8_t *relocatedAddr = sec.data().begin() + rel.r_offset; RelExpr expr = target->getRelExpr(type, sym, relocatedAddr); @@ -1403,8 +1417,8 @@ static void scanReloc(InputSectionBase &sec, OffsetGet // The 4 types that relative GOTPLT are all x86 and x86-64 specific. if (oneof(expr)) { in.gotPlt->hasGotPltOffRel = true; - } else if (oneof( - expr)) { + } else if (oneof(expr)) { in.got->hasGotOffRel = true; }