Index: lld/ELF/InputFiles.cpp --- lld/ELF/InputFiles.cpp.orig +++ lld/ELF/InputFiles.cpp @@ -45,6 +45,8 @@ uint32_t InputFile::nextGroupId; std::unique_ptr elf::tar; +DenseMap elf::gnuWarnings; + // Returns "", "foo.a(bar.o)" or "baz.o". std::string lld::toString(const InputFile *f) { static std::mutex mu; @@ -63,6 +65,19 @@ std::string lld::toString(const InputFile *f) { return std::string(f->toStringCache); } +// .gnu.warning.SYMBOL are treated as warning symbols for the given symbol +void lld::parseGNUWarning(StringRef name, ArrayRef data, size_t size) { + static std::mutex mu; + if (!name.empty() && name.startswith(".gnu.warning.")) { + std::lock_guard lock(mu); + StringRef wsym = name.substr(13); + StringRef s(data.begin()); + StringRef wng(s.substr(0, size)); + symtab.insert(wsym)->gwarn = true; + gnuWarnings.insert({wsym, wng}); + } +} + static ELFKind getELFKind(MemoryBufferRef mb, StringRef archiveName) { unsigned char size; unsigned char endian; @@ -787,6 +802,14 @@ void ObjFile::initializeSections(bool ignoreComd case SHT_RELA: case SHT_NULL: break; + case SHT_PROGBITS: { + this->sections[i] = createInputSection(i, sec, check(obj.getSectionName(sec, shstrtab))); + StringRef name = check(obj.getSectionName(sec, shstrtab)); + ArrayRef data = + CHECK(obj.template getSectionContentsAsArray(sec), this); + parseGNUWarning(name, data, sec.sh_size); + } + break; case SHT_LLVM_SYMPART: ctx.hasSympart.store(true, std::memory_order_relaxed); [[fallthrough]]; @@ -1390,6 +1413,9 @@ template void SharedFile::parse() { const ELFFile obj = this->getObj(); ArrayRef sections = getELFShdrs(); + StringRef sectionStringTable = + CHECK(obj.getSectionStringTable(sections), this); + const Elf_Shdr *versymSec = nullptr; const Elf_Shdr *verdefSec = nullptr; const Elf_Shdr *verneedSec = nullptr; @@ -1412,6 +1438,13 @@ template void SharedFile::parse() { case SHT_GNU_verneed: verneedSec = &sec; break; + case SHT_PROGBITS: { + StringRef name = CHECK(obj.getSectionName(sec, sectionStringTable), this); + ArrayRef data = + CHECK(obj.template getSectionContentsAsArray(sec), this); + parseGNUWarning(name, data, sec.sh_size); + break; + } } }